init_code
This commit is contained in:
150
assets/garment_programs/stats_utils.py
Normal file
150
assets/garment_programs/stats_utils.py
Normal file
@@ -0,0 +1,150 @@
|
||||
"""Design analysis routines to supply intresting stats"""
|
||||
|
||||
import pygarment.pattern.core as pattern
|
||||
import yaml
|
||||
|
||||
# panels
|
||||
def count_panels(pattern:pattern.BasicPattern, props, verbose=False):
|
||||
|
||||
n_panels = len(pattern.pattern['panels'].keys())
|
||||
if verbose:
|
||||
print(pattern.name, ' Panel count ', n_panels)
|
||||
|
||||
props['generator']['stats']['panel_count'][pattern.name] = n_panels
|
||||
|
||||
|
||||
# Type determination
|
||||
|
||||
def bottom_length(design):
|
||||
meta = design['meta']
|
||||
if meta['bottom']['v']:
|
||||
bottom_section = None
|
||||
if meta['bottom']['v'] in ['SkirtCircle', 'AsymmSkirtCircle', 'SkirtManyPanels']:
|
||||
bottom_section = 'flare-skirt'
|
||||
elif meta['bottom']['v'] == 'Pants':
|
||||
bottom_section = 'pants'
|
||||
elif meta['bottom']['v'] == 'Skirt2':
|
||||
bottom_section = 'skirt'
|
||||
elif meta['bottom']['v'] == 'PencilSkirt':
|
||||
bottom_section = 'pencil-skirt'
|
||||
elif meta['bottom']['v'] == 'SkirtLevels':
|
||||
bottom_section = 'levels-skirt'
|
||||
elif meta['bottom']['v'] == 'GodetSkirt':
|
||||
base = design['godet-skirt']['base']['v']
|
||||
if base == 'Skirt2':
|
||||
bottom_section = 'skirt'
|
||||
else: # One other option
|
||||
bottom_section = 'pencil-skirt'
|
||||
else:
|
||||
raise(ValueError(f'Unknown bottoms type {meta["bottom"]["v"]}'))
|
||||
|
||||
return design[bottom_section]['length']['v']
|
||||
else:
|
||||
return 0
|
||||
|
||||
def sleeve_length(design):
|
||||
# Sleeve length
|
||||
sleeve_len_r = design['sleeve']['length']['v'] if not design['sleeve']['sleeveless']['v'] else 0
|
||||
sleeve_len_l = design['left']['sleeve']['length']['v'] if design['left']['enable_asym']['v'] and not design['left']['sleeve']['sleeveless']['v'] else 0
|
||||
return max(sleeve_len_r, sleeve_len_l)
|
||||
|
||||
def top_length(design):
|
||||
if design['meta']['upper']['v'] == 'FittedShirt':
|
||||
return 1.
|
||||
elif design['meta']['upper']['v'] == 'Shirt':
|
||||
return design['shirt']['length']['v']
|
||||
else:
|
||||
return 0.
|
||||
|
||||
def vertical_len(design):
|
||||
# NOTE: this will give very approximate result since
|
||||
# the units of mesurement are slightly different
|
||||
wb_len = design['waistband']['width']['v'] if design['meta']['wb']['v'] else 0
|
||||
return top_length(design) + wb_len + bottom_length(design)
|
||||
|
||||
def garment_type(el_name, design, props, verbose=False):
|
||||
main_type = None
|
||||
add_types = []
|
||||
# Main:
|
||||
# + upper garment (short skirt - top or dress?)
|
||||
# + skirt
|
||||
# + pants
|
||||
# + dress
|
||||
# + jumpsuit
|
||||
# Additional labels:
|
||||
# + asymmetrical top
|
||||
# + Hoody?
|
||||
# + maxi/midi/mini
|
||||
# + sleeve/less
|
||||
# + long sleeve / short sleeve?
|
||||
meta = design['meta']
|
||||
if meta['upper']['v']:
|
||||
if meta['bottom']['v'] and 'Pants' in meta['bottom']['v']:
|
||||
main_type = 'jumpsuit'
|
||||
elif vertical_len(design) < 1.4: # NOTE: very approximate division
|
||||
main_type = 'upper_garment'
|
||||
else:
|
||||
main_type = 'dress'
|
||||
else:
|
||||
if 'Pants' in meta['bottom']['v']:
|
||||
main_type = 'pants'
|
||||
else:
|
||||
main_type = 'skirt'
|
||||
|
||||
# Additional types
|
||||
if meta['upper']['v']:
|
||||
if design['left']['enable_asym']['v']:
|
||||
add_types.append('asymmetric_top')
|
||||
if (not design['left']['enable_asym']['v']
|
||||
and design['collar']['component']['style']['v']
|
||||
and 'Hood' in design['collar']['component']['style']['v']):
|
||||
add_types.append('hoodie')
|
||||
|
||||
if (design['sleeve']['sleeveless']['v']
|
||||
and (design['left']['sleeve']['sleeveless']['v'] if design['left']['enable_asym']['v'] else True)):
|
||||
add_types.append('sleeveless')
|
||||
else:
|
||||
add_types.append('with_sleeves')
|
||||
|
||||
sleeve_len = sleeve_length(design)
|
||||
if sleeve_len < 0.5:
|
||||
add_types.append('short_sleeve')
|
||||
else:
|
||||
add_types.append('long_sleeve')
|
||||
|
||||
# Mini/Midi/Maxi
|
||||
if meta['bottom']['v']:
|
||||
length = bottom_length(design)
|
||||
if length < 0.3:
|
||||
add_types.append('mini')
|
||||
elif length < 0.5:
|
||||
add_types.append('knee_len')
|
||||
elif length < 0.65:
|
||||
add_types.append('midi')
|
||||
else:
|
||||
add_types.append('maxi')
|
||||
|
||||
|
||||
if verbose:
|
||||
print(el_name, ' types ', main_type, add_types)
|
||||
|
||||
props['generator']['stats']['garment_types'][el_name] = {
|
||||
'main': main_type,
|
||||
'styles': add_types
|
||||
}
|
||||
|
||||
# Summary
|
||||
summary = props['generator']['stats']['garment_types_summary']
|
||||
if main_type not in summary['main']:
|
||||
summary['main'][main_type] = 1
|
||||
else:
|
||||
summary['main'][main_type] += 1
|
||||
for style_t in add_types:
|
||||
if style_t not in summary['style']:
|
||||
summary['style'][style_t] = {'total': 0}
|
||||
summary['style'][style_t]['total'] += 1
|
||||
if main_type not in summary['style'][style_t]:
|
||||
summary['style'][style_t][main_type] = 1
|
||||
else:
|
||||
summary['style'][style_t][main_type] += 1
|
||||
|
||||
Reference in New Issue
Block a user