150 lines
5.0 KiB
Python
150 lines
5.0 KiB
Python
|
|
"""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
|
||
|
|
|