Cleanup: pep8 (indentation, spacing, long lines)

This commit is contained in:
2020-10-02 10:15:51 +10:00
parent bab9de2a52
commit 41d2d6da0c
104 changed files with 683 additions and 493 deletions

View File

@@ -66,6 +66,7 @@ class Builder:
# Always 64 bit now
self.bits = 64
def create_builder_from_arguments():
parser = argparse.ArgumentParser()
parser.add_argument('builder_name')
@@ -106,7 +107,7 @@ class VersionInfo:
def _parse_header_file(self, filename, define):
import re
regex = re.compile("^#\s*define\s+%s\s+(.*)" % define)
regex = re.compile(r"^#\s*define\s+%s\s+(.*)" % define)
with open(filename, "r") as file:
for l in file:
match = regex.match(l)

View File

@@ -175,7 +175,11 @@ def pack_linux(builder):
print("Stripping python...")
py_target = os.path.join(builder.install_dir, info.short_version)
buildbot_utils.call(builder.command_prefix + ['find', py_target, '-iname', '*.so', '-exec', 'strip', '-s', '{}', ';'])
buildbot_utils.call(
builder.command_prefix + [
'find', py_target, '-iname', '*.so', '-exec', 'strip', '-s', '{}', ';',
],
)
# Construct package name
platform_name = 'linux64'

View File

@@ -182,7 +182,7 @@ def create_nb_project_main():
f.write(' </logicalFolder>\n')
# default, but this dir is infact not in blender dir so we can ignore it
# f.write(' <sourceFolderFilter>^(nbproject)$</sourceFolderFilter>\n')
f.write(' <sourceFolderFilter>^(nbproject|__pycache__|.*\.py|.*\.html|.*\.blend)$</sourceFolderFilter>\n')
f.write(r' <sourceFolderFilter>^(nbproject|__pycache__|.*\.py|.*\.html|.*\.blend)$</sourceFolderFilter>\n')
f.write(' <sourceRootList>\n')
f.write(' <Elem>%s</Elem>\n' % SOURCE_DIR) # base_root_rel

View File

@@ -104,8 +104,10 @@ def svn_update(args, release_version):
svn_dirpath = os.path.join(dirpath, ".svn")
svn_root_dirpath = os.path.join(lib_dirpath, ".svn")
if os.path.isdir(dirpath) and \
(os.path.exists(svn_dirpath) or os.path.exists(svn_root_dirpath)):
if (
os.path.isdir(dirpath) and
(os.path.exists(svn_dirpath) or os.path.exists(svn_root_dirpath))
):
if make_utils.command_missing(args.svn_command):
sys.stderr.write("svn not found, can't update libraries\n")
sys.exit(1)
@@ -127,9 +129,11 @@ def git_update_skip(args, check_remote_exists=True):
rebase_merge = check_output([args.git_command, 'rev-parse', '--git-path', 'rebase-merge'], exit_on_error=False)
rebase_apply = check_output([args.git_command, 'rev-parse', '--git-path', 'rebase-apply'], exit_on_error=False)
merge_head = check_output([args.git_command, 'rev-parse', '--git-path', 'MERGE_HEAD'], exit_on_error=False)
if os.path.exists(rebase_merge) or \
os.path.exists(rebase_apply) or \
os.path.exists(merge_head):
if (
os.path.exists(rebase_merge) or
os.path.exists(rebase_apply) or
os.path.exists(merge_head)
):
return "rebase or merge in progress, complete it first"
# Abort if uncommitted changes.
@@ -146,6 +150,7 @@ def git_update_skip(args, check_remote_exists=True):
return ""
# Update blender repository.
def blender_update(args):
print_stage("Updating Blender Git Repository")

View File

@@ -64,7 +64,7 @@ def git_branch_release_version(branch, tag):
if release_version:
release_version = release_version.group(1)
elif tag:
release_version = re.search("^v([0-9]*\.[0-9]*).*", tag)
release_version = re.search(r"^v([0-9]*\.[0-9]*).*", tag)
if release_version:
release_version = release_version.group(1)
return release_version

View File

@@ -150,8 +150,7 @@ def create(engine, data, region=None, v3d=None, rv3d=None, preview_osl=False):
screen = screen or rv3d.id_data.as_pointer()
rv3d = rv3d.as_pointer()
engine.session = _cycles.create(
engine.as_pointer(), prefs, data, screen, region, v3d, rv3d, preview_osl)
engine.session = _cycles.create(engine.as_pointer(), prefs, data, screen, region, v3d, rv3d, preview_osl)
def free(engine):

View File

@@ -843,8 +843,6 @@ class CYCLES_RENDER_PT_passes_data(CyclesButtonsPanel, Panel):
col.prop(cycles_view_layer, "pass_debug_render_time", text="Render Time")
col.prop(cycles_view_layer, "pass_debug_sample_count", text="Sample Count")
layout.prop(view_layer, "pass_alpha_threshold")
@@ -959,7 +957,15 @@ class CYCLES_RENDER_PT_passes_aov(CyclesButtonsPanel, Panel):
row = layout.row()
col = row.column()
col.template_list("CYCLES_RENDER_UL_aov", "aovs", cycles_view_layer, "aovs", cycles_view_layer, "active_aov", rows=2)
col.template_list(
"CYCLES_RENDER_UL_aov",
"aovs",
cycles_view_layer,
"aovs",
cycles_view_layer,
"active_aov",
rows=2,
)
col = row.column()
sub = col.column(align=True)
@@ -1865,6 +1871,7 @@ class CYCLES_RENDER_PT_bake_influence(CyclesButtonsPanel, Panel):
bl_context = "render"
bl_parent_id = "CYCLES_RENDER_PT_bake"
COMPAT_ENGINES = {'CYCLES'}
@classmethod
def poll(cls, context):
scene = context.scene
@@ -2150,8 +2157,10 @@ class CYCLES_VIEW3D_PT_shading_render_pass(Panel):
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES
and context.space_data.shading.type == 'RENDERED')
return (
context.engine in cls.COMPAT_ENGINES and
context.space_data.shading.type == 'RENDERED'
)
def draw(self, context):
shading = context.space_data.shading
@@ -2169,8 +2178,10 @@ class CYCLES_VIEW3D_PT_shading_lighting(Panel):
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES
and context.space_data.shading.type == 'RENDERED')
return (
context.engine in cls.COMPAT_ENGINES and
context.space_data.shading.type == 'RENDERED'
)
def draw(self, context):
layout = self.layout
@@ -2199,12 +2210,14 @@ class CYCLES_VIEW3D_PT_shading_lighting(Panel):
col.prop(shading, "studiolight_intensity")
col.prop(shading, "studiolight_background_alpha")
class CYCLES_VIEW3D_PT_simplify_greasepencil(CyclesButtonsPanel, Panel, GreasePencilSimplifyPanel):
bl_label = "Grease Pencil"
bl_parent_id = "CYCLES_RENDER_PT_simplify"
COMPAT_ENGINES = {'CYCLES'}
bl_options = {'DEFAULT_CLOSED'}
def draw_device(self, context):
scene = context.scene
layout = self.layout

View File

@@ -137,9 +137,11 @@ def do_versions(self):
# Caustics Reflective/Refractive separation in 272
if version <= (2, 72, 0):
cscene = scene.cycles
if (cscene.get("no_caustics", False) and
if (
cscene.get("no_caustics", False) and
not cscene.is_property_set("caustics_reflective") and
not cscene.is_property_set("caustics_refractive")):
not cscene.is_property_set("caustics_refractive")
):
cscene.caustics_reflective = False
cscene.caustics_refractive = False

View File

@@ -97,12 +97,12 @@ class pyChainSilhouetteIterator(ChainingIterator):
def traverse(self, iter):
it = AdjacencyIterator(iter)
## case of TVertex
# case of TVertex
vertex = self.next_vertex
if type(vertex) is TVertex:
mate = vertex.get_mate(self.current_edge)
return find_matching_vertex(mate.id, it)
## case of NonTVertex
# case of NonTVertex
winner = None
for i, nat in enumerate(NATURES):
if (nat & self.current_edge.nature):
@@ -145,12 +145,12 @@ class pyChainSilhouetteGenericIterator(ChainingIterator):
def traverse(self, iter):
it = AdjacencyIterator(iter)
## case of TVertex
# case of TVertex
vertex = self.next_vertex
if type(vertex) is TVertex:
mate = vertex.get_mate(self.current_edge)
return find_matching_vertex(mate.id, it)
## case of NonTVertex
# case of NonTVertex
winner = None
for i, nat in enumerate(NATURES):
if (nat & self.current_edge.nature):
@@ -249,12 +249,12 @@ class pySketchyChainSilhouetteIterator(ChainingIterator):
def traverse(self, iter):
it = AdjacencyIterator(iter)
## case of TVertex
# case of TVertex
vertex = self.next_vertex
if type(vertex) is TVertex:
mate = vertex.get_mate(self.current_edge)
return self.make_sketchy(find_matching_vertex(mate.id, it))
## case of NonTVertex
# case of NonTVertex
winner = None
for i, nat in enumerate(NATURES):
if (nat & self.current_edge.nature):
@@ -342,13 +342,13 @@ class pyFillOcclusionsRelativeChainingIterator(ChainingIterator):
winner = None
winnerOrientation = False
it = AdjacencyIterator(iter)
## case of TVertex
# case of TVertex
vertex = self.next_vertex
if type(vertex) is TVertex:
mate = vertex.get_mate(self.current_edge)
winner = find_matching_vertex(mate.id, it)
winnerOrientation = not it.is_incoming if not it.is_end else False
## case of NonTVertex
# case of NonTVertex
else:
for nat in NATURES:
if (self.current_edge.nature & nat):
@@ -379,7 +379,8 @@ class pyFillOcclusionsRelativeChainingIterator(ChainingIterator):
while (not _cit.is_end) and _cit.object.time_stamp != self.timestamp:
connexl += _cit.object.length_2d
_cit.increment()
if _cit.is_begin: break
if _cit.is_begin:
break
if connexl > self._percent * self._length:
return None
@@ -411,13 +412,13 @@ class pyFillOcclusionsAbsoluteChainingIterator(ChainingIterator):
winner = None
winnerOrientation = False
it = AdjacencyIterator(iter)
## case of TVertex
# case of TVertex
vertex = self.next_vertex
if type(vertex) is TVertex:
mate = vertex.get_mate(self.current_edge)
winner = find_matching_vertex(mate.id, it)
winnerOrientation = not it.is_incoming if not it.is_end else False
## case of NonTVertex
# case of NonTVertex
else:
for nat in NATURES:
if (self.current_edge.nature & nat):
@@ -440,7 +441,8 @@ class pyFillOcclusionsAbsoluteChainingIterator(ChainingIterator):
while (not _cit.is_end) and _cit.object.time_stamp != self.timestamp:
connexl += _cit.object.length_2d
_cit.increment()
if _cit.is_begin: break
if _cit.is_begin:
break
if connexl > self._length:
return None
@@ -463,6 +465,7 @@ class pyFillOcclusionsAbsoluteAndRelativeChainingIterator(ChainingIterator):
:arg l: Absolute length.
:type l: float
"""
def __init__(self, percent, l):
ChainingIterator.__init__(self, False, True, None, True)
self._length = 0.0
@@ -479,13 +482,13 @@ class pyFillOcclusionsAbsoluteAndRelativeChainingIterator(ChainingIterator):
winner = None
winnerOrientation = False
it = AdjacencyIterator(iter)
## case of TVertex
# case of TVertex
vertex = self.next_vertex
if type(vertex) is TVertex:
mate = vertex.get_mate(self.current_edge)
winner = find_matching_vertex(mate.id, it)
winnerOrientation = not it.is_incoming if not it.is_end else False
## case of NonTVertex
# case of NonTVertex
else:
for nat in NATURES:
if (self.current_edge.nature & nat):
@@ -511,7 +514,8 @@ class pyFillOcclusionsAbsoluteAndRelativeChainingIterator(ChainingIterator):
while (not _cit.is_end) and _cit.object.time_stamp != CF.get_time_stamp():
connexl += _cit.object.length_2d
_cit.increment()
if _cit.is_begin: break
if _cit.is_begin:
break
if (connexl > self._percent * self._length) or (connexl > self._absLength):
return None
@@ -549,13 +553,13 @@ class pyFillQi0AbsoluteAndRelativeChainingIterator(ChainingIterator):
winner = None
winnerOrientation = False
it = AdjacencyIterator(iter)
## case of TVertex
# case of TVertex
vertex = self.next_vertex
if type(vertex) is TVertex:
mate = vertex.get_mate(self.current_edge)
winner = find_matching_vertex(mate.id, it)
winnerOrientation = not it.is_incoming if not it.is_end else False
## case of NonTVertex
# case of NonTVertex
else:
for nat in NATURES:
if (self.current_edge.nature & nat):
@@ -569,7 +573,6 @@ class pyFillQi0AbsoluteAndRelativeChainingIterator(ChainingIterator):
if winner is not None and winner.qi:
if self._length == 0.0:
self._length = get_chain_length(winner, winnerOrientation)
@@ -582,7 +585,8 @@ class pyFillQi0AbsoluteAndRelativeChainingIterator(ChainingIterator):
while (not _cit.is_end) and _cit.object.qi != 0:
connexl += _cit.object.length_2d
_cit.increment()
if _cit.is_begin: break
if _cit.is_begin:
break
if (connexl > self._percent * self._length) or (connexl > self._absLength):
return None
return winner
@@ -637,7 +641,7 @@ class pyNoIdChainSilhouetteIterator(ChainingIterator):
if vA.id.first == vB.id.first:
return ve
return None
## case of NonTVertex
# case of NonTVertex
else:
for i, nat in enumerate(NATURES):
if (nat & self.current_edge.nature):

View File

@@ -194,6 +194,7 @@ class pyBackTVertexUP0D(UnaryPredicate0D):
Check whether an Interface0DIterator references a TVertex and is
the one that is hidden (inferred from the context).
"""
def __init__(self):
UnaryPredicate0D.__init__(self)
self._getQI = QuantitativeInvisibilityF0D()
@@ -533,7 +534,8 @@ class pyHighViewMapGradientNormUP1D(UnaryPredicate1D):
class pyDensityVariableSigmaUP1D(UnaryPredicate1D):
def __init__(self, functor, sigmaMin, sigmaMax, lmin, lmax, tmin, tmax, integration=IntegrationType.MEAN, sampling=2.0):
def __init__(self, functor, sigmaMin, sigmaMax, lmin, lmax, tmin,
tmax, integration=IntegrationType.MEAN, sampling=2.0):
UnaryPredicate1D.__init__(self)
self._functor = functor
self._sigmaMin = float(sigmaMin)
@@ -672,8 +674,10 @@ class pyShuffleBP1D(BinaryPredicate1D):
def __call__(self, inter1, inter2):
return (random.uniform(0, 1) < random.uniform(0, 1))
class MaterialBP1D(BinaryPredicate1D):
"""Checks whether the two supplied ViewEdges have the same material."""
def __call__(self, i1, i2):
fedges = (fe for ve in (i1, i2) for fe in (ve.first_fedge, ve.last_fedge))
materials = {material_from_fedge(fe) for fe in fedges}

View File

@@ -319,6 +319,7 @@ class BoundingBox:
class StrokeCollector(StrokeShader):
"""Collects and Stores stroke objects"""
def __init__(self):
StrokeShader.__init__(self)
self.strokes = []

View File

@@ -608,7 +608,9 @@ class NoiseShader:
class ThicknessNoiseShader(ThicknessBlenderMixIn, ScalarBlendModifier, NoiseShader):
"""Thickness based on pseudo-noise"""
def __init__(self, thickness_position, thickness_ratio, blend_type, influence, amplitude, period, seed=512, asymmetric=True):
def __init__(self, thickness_position, thickness_ratio, blend_type,
influence, amplitude, period, seed=512, asymmetric=True):
ScalarBlendModifier.__init__(self, blend_type, influence)
ThicknessBlenderMixIn.__init__(self, thickness_position, thickness_ratio)
NoiseShader.__init__(self, amplitude, period, seed)

View File

@@ -46,14 +46,14 @@ from freestyle.types import IntegrationType, Operators
Operators.select(QuantitativeInvisibilityUP1D(0))
Operators.bidirectional_chain(ChainSilhouetteIterator(), NotUP1D(QuantitativeInvisibilityUP1D(0)))
## Splits strokes at points of highest 2D curvature
## when there are too many abrupt turns in it
# Splits strokes at points of highest 2D curvature
# when there are too many abrupt turns in it
func = pyInverseCurvature2DAngleF0D()
Operators.recursive_split(func, pyParameterUP0D(0.2, 0.8), NotUP1D(pyHigherNumberOfTurnsUP1D(3, 0.5)), 2)
## Keeps only long enough strokes
# Keeps only long enough strokes
Operators.select(pyHigherLengthUP1D(100))
## Sorts so as to draw the longest strokes first
## (this will be done using the causal density)
# Sorts so as to draw the longest strokes first
# (this will be done using the causal density)
Operators.sort(pyLengthBP1D())
shaders_list = [
pySamplingShader(10),
@@ -64,5 +64,5 @@ shaders_list = [
ConstantColorShader(0.2, 0.2, 0.2, 1.0),
TipRemoverShader(10),
]
## Use the causal density to avoid cluttering
# Use the causal density to avoid cluttering
Operators.create(pyDensityUP1D(8, 0.4, IntegrationType.MEAN), shaders_list)

View File

@@ -46,7 +46,7 @@ from freestyle.shaders import (
from freestyle.types import IntegrationType, Operators
## custom density predicate
# custom density predicate
class pyDensityUP1D(UnaryPredicate1D):
def __init__(self, wsize, threshold, integration=IntegrationType.MEAN, sampling=2.0):
UnaryPredicate1D.__init__(self)
@@ -66,10 +66,11 @@ class pyDensityUP1D(UnaryPredicate1D):
return 1
return 0
Operators.select(QuantitativeInvisibilityUP1D(0))
Operators.bidirectional_chain(ChainSilhouetteIterator(), NotUP1D(QuantitativeInvisibilityUP1D(0)))
Operators.select(pyHigherLengthUP1D(40))
## selects lines having a high anisotropic a priori density
# selects lines having a high anisotropic a priori density
Operators.select(pyHighDensityAnisotropyUP1D(0.3, 4))
Operators.sort(pyLengthBP1D())
shaders_list = [
@@ -77,5 +78,5 @@ shaders_list = [
ConstantThicknessShader(2),
ConstantColorShader(0.2, 0.2, 0.25, 1),
]
## uniform culling
# uniform culling
Operators.create(pyDensityUP1D(3.0, 2.0e-2, IntegrationType.MEAN, 0.1), shaders_list)

View File

@@ -43,14 +43,14 @@ from freestyle.types import Operators
Operators.select(QuantitativeInvisibilityUP1D(0))
## Chain following the same nature, but without the restriction
## of staying inside the selection (False).
# Chain following the same nature, but without the restriction
# of staying inside the selection (False).
Operators.bidirectional_chain(ChainSilhouetteIterator(False))
shaders_list = [
SamplingShader(20),
IncreasingThicknessShader(1.5, 30),
ConstantColorShader(0.0, 0.0, 0.0),
IncreasingColorShader(1, 0, 0, 1, 0, 1, 0, 1),
pyHLRShader(), ## this shader draws only visible portions
pyHLRShader(), # this shader draws only visible portions
]
Operators.create(TrueUP1D(), shaders_list)

View File

@@ -37,8 +37,8 @@ from freestyle.shaders import (
from freestyle.types import Id, Operators
## the id of the occluder (use SHIFT+click on the ViewMap to
## retrieve ids)
# the id of the occluder (use SHIFT+click on the ViewMap to
# retrieve ids)
id = Id(3, 0)
upred = AndUP1D(NotUP1D(QuantitativeInvisibilityUP1D(0)), pyIsInOccludersListUP1D(id))
Operators.select(upred)

View File

@@ -42,7 +42,7 @@ from freestyle.types import Nature, Operators
upred = QuantitativeInvisibilityUP1D(0)
Operators.select(upred)
Operators.bidirectional_chain(ChainSilhouetteIterator(), NotUP1D(upred))
## starting and stopping predicates:
# starting and stopping predicates:
start = pyVertexNatureUP0D(Nature.NON_T_VERTEX)
stop = pyBackTVertexUP0D()
Operators.sequential_split(start, stop, 10)

View File

@@ -40,8 +40,8 @@ from freestyle.types import Operators
Operators.select(QuantitativeInvisibilityUP1D(0))
## Chain 3 times each ViewEdge independently from the
## initial objects topology
# Chain 3 times each ViewEdge independently from the
# initial objects topology
Operators.bidirectional_chain(pySketchyChainingIterator(3))
shaders_list = [
SamplingShader(4),

View File

@@ -38,8 +38,8 @@ from freestyle.types import Nature, Operators
Operators.select(QuantitativeInvisibilityUP1D(0))
Operators.bidirectional_chain(ChainSilhouetteIterator(), NotUP1D(QuantitativeInvisibilityUP1D(0)))
start = pyVertexNatureUP0D(Nature.T_VERTEX)
## use the same predicate to decide where to start and where to stop
## the strokes:
# use the same predicate to decide where to start and where to stop
# the strokes:
Operators.sequential_split(start, start, 10)
shaders_list = [
ConstantThicknessShader(5),

View File

@@ -80,7 +80,10 @@ class DataPathBuilder:
base_new = Ellipsis
# find the new name
if item.startswith("."):
for class_name, item_new, options in rna_update_from_map.get(item[1:], []) + [(None, item[1:], None)]:
for class_name, item_new, options in (
rna_update_from_map.get(item[1:], []) +
[(None, item[1:], None)]
):
if callable(item_new):
# No type check here, callback is assumed to know what it's doing.
base_new, item_new = item_new(base, class_name, item[1:], fcurve, options)

View File

@@ -211,7 +211,8 @@ def do_previews(do_objects, do_collections, do_scenes, do_data_intern):
bpy.data.lights.remove(bpy.data.lights[render_context.light_data, None])
else:
rna_backup_restore(light, render_context.backup_light)
rna_backup_restore(bpy.data.lights[render_context.light_data, None], render_context.backup_light_data)
rna_backup_restore(bpy.data.lights[render_context.light_data,
None], render_context.backup_light_data)
except Exception as e:
print("ERROR:", e)
success = False
@@ -229,7 +230,8 @@ def do_previews(do_objects, do_collections, do_scenes, do_data_intern):
def object_bbox_merge(bbox, ob, ob_space, offset_matrix):
# Take collections instances into account (including linked one in this case).
if ob.type == 'EMPTY' and ob.instance_type == 'COLLECTION':
grp_objects = tuple((ob.name, ob.library.filepath if ob.library else None) for ob in ob.instance_collection.all_objects)
grp_objects = tuple((ob.name, ob.library.filepath if ob.library else None)
for ob in ob.instance_collection.all_objects)
if (len(grp_objects) == 0):
ob_bbox = ob.bound_box
else:
@@ -390,7 +392,10 @@ def do_previews(do_objects, do_collections, do_scenes, do_data_intern):
bpy.context.window.scene = scene
bpy.ops.object.collection_instance_add(collection=grp.name)
grp_ob = next((ob for ob in scene.objects if ob.instance_collection and ob.instance_collection.name == grp.name))
grp_ob = next((
ob for ob in scene.objects
if ob.instance_collection and ob.instance_collection.name == grp.name
))
grp_obname = grp_ob.name
bpy.context.view_layer.update()
@@ -470,7 +475,8 @@ def main():
# Get rid of Blender args!
argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []
parser = argparse.ArgumentParser(description="Use Blender to generate previews for currently open Blender file's items.")
parser = argparse.ArgumentParser(
description="Use Blender to generate previews for currently open Blender file's items.")
parser.add_argument('--clear', default=False, action="store_true",
help="Clear previews instead of generating them.")
parser.add_argument('--no_backups', default=False, action="store_true",

View File

@@ -78,9 +78,10 @@ def draw_texture_2d(texture_id, position, width, height):
coords = ((0, 0), (1, 0), (1, 1), (0, 1))
shader = gpu.shader.from_builtin('2D_IMAGE')
batch = batch_for_shader(shader, 'TRI_FAN',
{"pos" : coords,
"texCoord" : coords})
batch = batch_for_shader(
shader, 'TRI_FAN',
{"pos": coords, "texCoord": coords},
)
bgl.glActiveTexture(bgl.GL_TEXTURE0)
bgl.glBindTexture(bgl.GL_TEXTURE_2D, texture_id)

View File

@@ -80,7 +80,13 @@ def graph_armature(obj, filepath, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=Tr
label.append("%s = %s" % (key, value))
opts = ["shape=box", "regular=1", "style=filled", "fixedsize=false", 'label="%s"' % compat_str('\n'.join(label))]
opts = [
"shape=box",
"regular=1",
"style=filled",
"fixedsize=false",
'label="%s"' % compat_str('\n'.join(label)),
]
if bone.name.startswith('ORG'):
opts.append("fillcolor=yellow")
@@ -125,7 +131,15 @@ def graph_armature(obj, filepath, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=Tr
subtarget = getattr(constraint, "subtarget", "")
if subtarget:
# TODO, not internal links
opts = ['dir=forward', "weight=1", "arrowhead=normal", "arrowtail=none", "constraint=false", 'color="red"', 'labelfontsize=4']
opts = [
'dir=forward',
"weight=1",
"arrowhead=normal",
"arrowtail=none",
"constraint=false",
'color="red"',
'labelfontsize=4',
]
if XTRA_INFO:
label = "%s\n%s" % (constraint.type, constraint.name)
opts.append('label="%s"' % compat_str(label))
@@ -160,7 +174,15 @@ def graph_armature(obj, filepath, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=Tr
pbone_target = rna_path_as_pbone(target.data_path)
rna_path_target = target.data_path
if pbone_target:
opts = ['dir=forward', "weight=1", "arrowhead=normal", "arrowtail=none", "constraint=false", 'color="blue"', "labelfontsize=4"]
opts = [
'dir=forward',
"weight=1",
"arrowhead=normal",
"arrowtail=none",
"constraint=false",
'color="blue"',
"labelfontsize=4",
]
display_source = rna_path.replace("pose.bones", "")
display_target = rna_path_target.replace("pose.bones", "")
if XTRA_INFO:

View File

@@ -625,6 +625,7 @@ class QuickParticles(Operator):
pointcloud_object.show_bounds = True
return {'FINISHED'}
classes = (
QuickExplode,
QuickFur,

View File

@@ -56,7 +56,7 @@ class HAIR_MT_add_attribute(Menu):
@staticmethod
def add_standard_attribute(layout, hair, name, data_type, domain):
exists = hair.attributes.get(name) != None
exists = hair.attributes.get(name) is not None
col = layout.column()
col.enabled = not exists
@@ -106,14 +106,21 @@ class DATA_PT_hair_attributes(DataButtonsPanel, Panel):
row = layout.row()
col = row.column()
col.template_list("HAIR_UL_attributes", "attributes", hair, "attributes", hair.attributes, "active_index", rows=3)
col.template_list(
"HAIR_UL_attributes",
"attributes",
hair,
"attributes",
hair.attributes,
"active_index",
rows=3,
)
col = row.column(align=True)
col.menu("HAIR_MT_add_attribute", icon='ADD', text="")
col.operator("geometry.attribute_remove", icon='REMOVE', text="")
class DATA_PT_custom_props_hair(DataButtonsPanel, PropertyPanel, Panel):
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
_context_path = "object.data"

View File

@@ -478,7 +478,15 @@ class DATA_PT_sculpt_vertex_colors(MeshButtonsPanel, Panel):
row = layout.row()
col = row.column()
col.template_list("MESH_UL_vcols", "svcols", me, "sculpt_vertex_colors", me.sculpt_vertex_colors, "active_index", rows=2)
col.template_list(
"MESH_UL_vcols",
"svcols",
me,
"sculpt_vertex_colors",
me.sculpt_vertex_colors,
"active_index",
rows=2,
)
col = row.column(align=True)
col.operator("mesh.sculpt_vertex_color_add", icon='ADD', text="")

View File

@@ -56,7 +56,7 @@ class POINTCLOUD_MT_add_attribute(Menu):
@staticmethod
def add_standard_attribute(layout, pointcloud, name, data_type, domain):
exists = pointcloud.attributes.get(name) != None
exists = pointcloud.attributes.get(name) is not None
col = layout.column()
col.enabled = not exists
@@ -105,14 +105,21 @@ class DATA_PT_pointcloud_attributes(DataButtonsPanel, Panel):
row = layout.row()
col = row.column()
col.template_list("POINTCLOUD_UL_attributes", "attributes", pointcloud, "attributes", pointcloud.attributes, "active_index", rows=3)
col.template_list(
"POINTCLOUD_UL_attributes",
"attributes",
pointcloud,
"attributes",
pointcloud.attributes,
"active_index",
rows=3,
)
col = row.column(align=True)
col.menu("POINTCLOUD_MT_add_attribute", icon='ADD', text="")
col.operator("geometry.attribute_remove", icon='REMOVE', text="")
class DATA_PT_custom_props_pointcloud(DataButtonsPanel, PropertyPanel, Panel):
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
_context_path = "object.data"

View File

@@ -1232,7 +1232,10 @@ class PHYSICS_PT_export(PhysicButtonsPanel, Panel):
@classmethod
def poll(cls, context):
domain = context.fluid.domain_settings
if not PhysicButtonsPanel.poll_fluid_domain(context) or (domain.cache_data_format != 'OPENVDB' and bpy.app.debug_value != 3001):
if (
not PhysicButtonsPanel.poll_fluid_domain(context) or
(domain.cache_data_format != 'OPENVDB' and bpy.app.debug_value != 3001)
):
return False
return (context.engine in cls.COMPAT_ENGINES)

View File

@@ -787,7 +787,6 @@ class _defs_edit_mesh:
col.prop(props, "mark_seam", text="Seam")
col.prop(props, "mark_sharp", text="Sharp")
col = layout.column()
col.active = edge_bevel
col.prop(props, "miter_outer", text="Miter Outer")
@@ -2094,6 +2093,7 @@ class _defs_gpencil_edit:
draw_settings=draw_settings,
)
class _defs_gpencil_sculpt:
@staticmethod
@@ -2291,6 +2291,7 @@ class _defs_sequencer_select:
widget=None,
keymap="Sequencer Tool: Select",
)
@ToolDef.from_fn
def box():
def draw_settings(_context, layout, tool):
@@ -2858,6 +2859,8 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
),
],
}
class SEQUENCER_PT_tools_active(ToolSelectPanelHelper, Panel):
bl_space_type = 'SEQUENCE_EDITOR'
bl_region_type = 'TOOLS'

View File

@@ -279,7 +279,6 @@ class _draw_tool_settings_context_mode:
UnifiedPaintPanel.prop_unified_color(layout, context, brush, "color", text="")
layout.prop(brush, "blend", text="", expand=False)
return True
@staticmethod
@@ -3132,6 +3131,7 @@ class VIEW3D_MT_sculpt_set_pivot(Menu):
props = layout.operator("sculpt.set_pivot_position", text="Pivot to Surface Under Cursor")
props.mode = 'SURFACE'
class VIEW3D_MT_face_sets_init(Menu):
bl_label = "Face Sets Init"
@@ -5383,7 +5383,6 @@ class VIEW3D_PT_view3d_properties(Panel):
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
col = layout.column()
subcol = col.column()
@@ -7396,6 +7395,7 @@ class TOPBAR_PT_gpencil_vertexcolor(GreasePencilVertexcolorPanel, Panel):
ob = context.object
return ob and ob.type == 'GPENCIL'
classes = (
VIEW3D_HT_header,
VIEW3D_HT_tool_header,

View File

@@ -9,17 +9,63 @@ import subprocess
import zipfile
parser = argparse.ArgumentParser()
parser.add_argument("--version", required=True, help="Version string in the form of 2.83.3.0")
parser.add_argument("--url", required=True, help="Location of the release ZIP archive to download")
parser.add_argument("--publisher", required=True, help="A string in the form of 'CN=PUBLISHER'")
parser.add_argument("--pfx", required=False, help="Absolute path to the PFX file used for signing the resulting MSIX package")
parser.add_argument("--password", required=False, default="blender", help="Password for the PFX file")
parser.add_argument("--lts", required=False, help="If set this MSIX is for an LTS release", action='store_const', const=1)
parser.add_argument("--skipdl", required=False, help="If set skip downloading of the specified URL as blender.zip. The tool assumes blender.zip exists", action='store_const', const=1)
parser.add_argument("--leavezip", required=False, help="If set don't clean up the downloaded blender.zip", action='store_const', const=1)
parser.add_argument("--overwrite", required=False, help="If set remove Content folder if it already exists", action='store_const', const=1)
parser.add_argument(
"--version",
required=True,
help="Version string in the form of 2.83.3.0",
)
parser.add_argument(
"--url",
required=True,
help="Location of the release ZIP archive to download",
)
parser.add_argument(
"--publisher",
required=True,
help="A string in the form of 'CN=PUBLISHER'",
)
parser.add_argument(
"--pfx",
required=False,
help="Absolute path to the PFX file used for signing the resulting MSIX package",
)
parser.add_argument(
"--password",
required=False,
default="blender",
help="Password for the PFX file",
)
parser.add_argument(
"--lts",
required=False,
help="If set this MSIX is for an LTS release",
action='store_const',
const=1,
)
parser.add_argument(
"--skipdl",
required=False,
help="If set skip downloading of the specified URL as blender.zip. The tool assumes blender.zip exists",
action='store_const',
const=1,
)
parser.add_argument(
"--leavezip",
required=False,
help="If set don't clean up the downloaded blender.zip",
action='store_const',
const=1,
)
parser.add_argument(
"--overwrite",
required=False,
help="If set remove Content folder if it already exists",
action='store_const',
const=1,
)
args = parser.parse_args()
def execute_command(cmd: list, name: str, errcode: int):
"""
Execute given command in cmd. Output is captured. If an error
@@ -29,8 +75,10 @@ def execute_command(cmd : list, name : str, errcode : int):
cmd_process = subprocess.run(cmd, capture_output=True, encoding="UTF-8")
if cmd_process.returncode != 0:
print(f"ERROR: {name} failed.")
if cmd_process.stdout: print(cmd_process.stdout)
if cmd_process.stderr: print(cmd_process.stderr)
if cmd_process.stdout:
print(cmd_process.stdout)
if cmd_process.stderr:
print(cmd_process.stderr)
exit(errcode)
@@ -106,7 +154,8 @@ print(f"Extracting files from ZIP to {content_blender_folder}...")
# ./Content/Blender/blender-2.83.3-windows64/blender.exe
with zipfile.ZipFile(local_blender_zip, "r") as blender_zip:
for entry in blender_zip.infolist():
if entry.is_dir(): continue
if entry.is_dir():
continue
entry_location = pathlib.Path(entry.filename)
target_location = content_blender_folder.joinpath(*entry_location.parts[1:])
pathlib.Path(target_location.parent).mkdir(parents=True, exist_ok=True)

View File

@@ -26,7 +26,10 @@ def write_png(buf, width, height):
import struct
# reverse the vertical line order and add null bytes at the start
width_byte_4 = width * 4
raw_data = b"".join(b'\x00' + buf[span:span + width_byte_4] for span in range((height - 1) * width * 4, -1, - width_byte_4))
raw_data = b"".join(
b'\x00' + buf[span:span + width_byte_4]
for span in range((height - 1) * width * 4, -1, - width_byte_4)
)
def png_pack(png_tag, data):
chunk_head = png_tag + data

View File

@@ -26,7 +26,10 @@ def write_png(buf, width, height):
import struct
# reverse the vertical line order and add null bytes at the start
width_byte_4 = width * 4
raw_data = b"".join(b'\x00' + buf[span:span + width_byte_4] for span in range((height - 1) * width * 4, -1, - width_byte_4))
raw_data = b"".join(
b'\x00' + buf[span:span + width_byte_4]
for span in range((height - 1) * width * 4, -1, - width_byte_4)
)
def png_pack(png_tag, data):
chunk_head = png_tag + data

View File

@@ -277,7 +277,8 @@ def write_files(basename, props_list, props_length_max):
indent = '# '
else:
indent = ' '
rna += indent + '("%s", "%s", "%s", "%s", "%s"),\n' % tuple(props[2:5] + props[6:]) # description is already string formatted
# Description is already string formatted.
rna += indent + '("%s", "%s", "%s", "%s", "%s"),\n' % tuple(props[2:5] + props[6:])
# py
blanks = [' ' * (x[0] - x[1]) for x in zip(props_length_max, list(map(len, props)))]
props = [('"%s"%s' if props[-1] != x[0] else "%s%s") % (x[0], x[1]) for x in zip(props, blanks)]

View File

@@ -56,7 +56,10 @@ def main():
if mod_from_dict:
file_path = sys.argv[-2][:-3] + "_lost.py"
write_work_file(file_path, list(mod_from_dict.values()))
print("Warning '%s' contains lost %d items from module %s.py" % (file_path, len(mod_from_dict), mod_from.__name__))
print(
"Warning '%s' contains lost %d items from module %s.py" %
(file_path, len(mod_from_dict), mod_from.__name__)
)
if __name__ == "__main__":

View File

@@ -592,7 +592,10 @@ class CustomPropertiesExportTest(AbstractAlembicTest):
def _run_export(self, tempdir: pathlib.Path) -> pathlib.Path:
abc = tempdir / 'custom-properties.abc'
script = "import bpy; bpy.context.scene.frame_set(1); bpy.ops.wm.alembic_export(filepath='%s', start=1, end=1)" % abc.as_posix()
script = (
"import bpy; bpy.context.scene.frame_set(1); "
"bpy.ops.wm.alembic_export(filepath='%s', start=1, end=1)" % abc.as_posix()
)
self.run_blender('custom-properties.blend', script)
return abc

View File

@@ -150,10 +150,20 @@ def main():
# Example background utility, add some text and renders or saves it (with options)
# Possible types are: string, int, long, choice, float and complex.
parser.add_option("-o", "--operator", dest="operator", help="This text will be used to render an image", type="string")
parser.add_option(
"-o",
"--operator",
dest="operator",
help="This text will be used to render an image",
type="string")
parser.add_option("-p", "--path", dest="path", help="Path to use for searching for files", type='string')
parser.add_option("-m", "--match", dest="match", help="Wildcard to match filename", type="string")
parser.add_option("-s", "--save_path", dest="save_path", help="Save the input file to a blend file in a new location", metavar='string')
parser.add_option(
"-s",
"--save_path",
dest="save_path",
help="Save the input file to a blend file in a new location",
metavar='string')
parser.add_option("-S", "--start", dest="start", help="From collected files, start with this index", metavar='int')
parser.add_option("-E", "--end", dest="end", help="From collected files, end with this index", metavar='int')

View File

@@ -503,7 +503,7 @@ def main():
if __name__ == "__main__":
# ~ for i in range(200):
# ~ RANDOM_SEED[0] += 1
#~ main()
# for i in range(200):
# RANDOM_SEED[0] += 1
# main()
main()

View File

@@ -22,7 +22,7 @@ def _write_html(output_dir):
filepath = os.path.join(output_dir, filename)
combined_reports += pathlib.Path(filepath).read_text()
combined_reports += "<br/>\n";
combined_reports += "<br/>\n"
html = """
<html>
@@ -67,7 +67,7 @@ def add(output_dir, category, name, filepath, failed=None):
name=name,
filepath=filepath)
dirpath = os.path.join(output_dir, "report", category);
dirpath = os.path.join(output_dir, "report", category)
os.makedirs(dirpath, exist_ok=True)
filepath = os.path.join(dirpath, name + ".data")
pathlib.Path(filepath).write_text(html)

View File

@@ -128,7 +128,14 @@ class MeshTest:
the public method run_test().
"""
def __init__(self, test_object_name: str, expected_object_name: str, operations_stack=None, apply_modifiers=False, threshold=None):
def __init__(
self,
test_object_name: str,
expected_object_name: str,
operations_stack=None,
apply_modifiers=False,
threshold=None,
):
"""
Constructs a MeshTest object. Raises a KeyError if objects with names expected_object_name
or test_object_name don't exist.
@@ -259,7 +266,6 @@ class MeshTest:
if self.apply_modifier:
bpy.ops.object.modifier_apply(modifier=modifier_spec.modifier_name)
def _bake_current_simulation(self, obj, test_mod_type, test_mod_name, frame_end):
for scene in bpy.data.scenes:
for modifier in obj.modifiers:
@@ -296,11 +302,15 @@ class MeshTest:
scene.frame_set(physics_spec.frame_end + 1)
self._bake_current_simulation(test_object, physics_spec.modifier_type, physics_spec.modifier_name, physics_spec.frame_end)
self._bake_current_simulation(
test_object,
physics_spec.modifier_type,
physics_spec.modifier_name,
physics_spec.frame_end,
)
if self.apply_modifier:
bpy.ops.object.modifier_apply(modifier=physics_spec.modifier_name)
def _apply_operator(self, test_object, operator: OperatorSpec):
"""
Apply operator on test object.

View File

@@ -164,7 +164,8 @@ class TestMArray(unittest.TestCase):
def test_assign_item(self):
# arr[i] = x
for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool) * 2):
for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"),
(rand_float, rand_int, rand_bool) * 2):
rval = make_random_2d_array((4, 5), func)
for i in range(3):
@@ -172,7 +173,8 @@ class TestMArray(unittest.TestCase):
self.assertEqual(prop_to_list(getattr(test, arr)[i]), rval)
# arr[i][j] = x
for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool) * 2):
for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"),
(rand_float, rand_int, rand_bool) * 2):
arr = getattr(test, arr)
rval = make_random_array(5, func)
@@ -283,7 +285,10 @@ def prop_to_list(prop):
def suite():
return unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(TestArray), unittest.TestLoader().loadTestsFromTestCase(TestMArray)])
return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestArray),
unittest.TestLoader().loadTestsFromTestCase(TestMArray),
])
if __name__ == "__main__":

View File

@@ -81,7 +81,10 @@ def api_dump(use_properties=True, use_functions=True):
for prop in v.properties:
if prop.collection_type:
funcs = [(prop.identifier + "." + func.identifier, func) for func in prop.collection_type.functions]
funcs = [
(prop.identifier + "." + func.identifier, func)
for func in prop.collection_type.functions
]
for func_id, func in funcs:
data.append(func_to_str(struct_id_str, func_id, func))
data.sort()
@@ -100,7 +103,10 @@ def api_dump(use_properties=True, use_functions=True):
for prop in v.properties:
if prop.collection_type:
props = [(prop.identifier + "." + prop_sub.identifier, prop_sub) for prop_sub in prop.collection_type.properties]
props = [
(prop.identifier + "." + prop_sub.identifier, prop_sub)
for prop_sub in prop.collection_type.properties
]
for prop_sub_id, prop_sub in props:
data.append(prop_to_str(struct_id_str, prop_sub_id, prop_sub))
data.sort()