117 lines
4.2 KiB
Python
117 lines
4.2 KiB
Python
|
|
""" Panels for a straight upper garment (T-shirt)
|
||
|
|
Note that the code is very similar to Bodice.
|
||
|
|
"""
|
||
|
|
import numpy as np
|
||
|
|
import pygarment as pyg
|
||
|
|
|
||
|
|
from assets.garment_programs.base_classes import BaseBodicePanel
|
||
|
|
|
||
|
|
|
||
|
|
class TorsoFrontHalfPanel(BaseBodicePanel):
|
||
|
|
"""Half of a simple non-fitted upper garment (e.g. T-Shirt)
|
||
|
|
|
||
|
|
Fits to the bust size
|
||
|
|
"""
|
||
|
|
def __init__(self, name, body, design) -> None:
|
||
|
|
""" Front = True, provides the adjustments necessary for the front panel
|
||
|
|
"""
|
||
|
|
super().__init__(name, body, design)
|
||
|
|
|
||
|
|
design = design['shirt']
|
||
|
|
|
||
|
|
# width
|
||
|
|
m_width = design['width']['v'] * body['bust']
|
||
|
|
b_width = design['flare']['v'] * m_width
|
||
|
|
|
||
|
|
# sizes
|
||
|
|
body_width = (body['bust'] - body['back_width']) / 2
|
||
|
|
frac = body_width / body['bust']
|
||
|
|
self.width = frac * m_width
|
||
|
|
b_width = frac * b_width
|
||
|
|
|
||
|
|
sh_tan = np.tan(np.deg2rad(body['_shoulder_incl']))
|
||
|
|
shoulder_incl = sh_tan * self.width
|
||
|
|
length = design['length']['v'] * body['waist_line']
|
||
|
|
|
||
|
|
# length in the front panel is adjusted due to shoulder inclination
|
||
|
|
# for the correct sleeve fitting
|
||
|
|
fb_diff = (frac - (0.5 - frac)) * body['bust']
|
||
|
|
length = length - sh_tan * fb_diff
|
||
|
|
|
||
|
|
self.edges = pyg.EdgeSeqFactory.from_verts(
|
||
|
|
[0, 0],
|
||
|
|
[-b_width, 0],
|
||
|
|
[-self.width, length],
|
||
|
|
[0, length + shoulder_incl],
|
||
|
|
loop=True
|
||
|
|
)
|
||
|
|
|
||
|
|
# Interfaces
|
||
|
|
self.interfaces = {
|
||
|
|
'outside': pyg.Interface(self, self.edges[1]),
|
||
|
|
'inside': pyg.Interface(self, self.edges[-1]),
|
||
|
|
'shoulder': pyg.Interface(self, self.edges[-2]),
|
||
|
|
'bottom': pyg.Interface(self, self.edges[0], ruffle=self.width / ((body['waist'] - body['waist_back_width']) / 2)),
|
||
|
|
|
||
|
|
# Reference to the corner for sleeve and collar projections
|
||
|
|
'shoulder_corner': pyg.Interface(self, [self.edges[-3], self.edges[-2]]),
|
||
|
|
'collar_corner': pyg.Interface(self, [self.edges[-2], self.edges[-1]])
|
||
|
|
}
|
||
|
|
|
||
|
|
# default placement
|
||
|
|
self.translate_by([0, body['height'] - body['head_l'] - length - shoulder_incl, 0])
|
||
|
|
|
||
|
|
def get_width(self, level):
|
||
|
|
return super().get_width(level) + self.width - self.body['shoulder_w'] / 2
|
||
|
|
|
||
|
|
|
||
|
|
class TorsoBackHalfPanel(BaseBodicePanel):
|
||
|
|
"""Half of a simple non-fitted upper garment (e.g. T-Shirt)
|
||
|
|
|
||
|
|
Fits to the bust size
|
||
|
|
"""
|
||
|
|
def __init__(self, name, body, design) -> None:
|
||
|
|
""" Front = True, provides the adjustments necessary for the front panel
|
||
|
|
"""
|
||
|
|
super().__init__(name, body, design)
|
||
|
|
|
||
|
|
design = design['shirt']
|
||
|
|
# account for ease in basic measurements
|
||
|
|
m_width = design['width']['v'] * body['bust']
|
||
|
|
b_width = design['flare']['v'] * m_width
|
||
|
|
|
||
|
|
# sizes
|
||
|
|
body_width = body['back_width'] / 2
|
||
|
|
frac = body_width / body['bust']
|
||
|
|
self.width = frac * m_width
|
||
|
|
b_width = frac * b_width
|
||
|
|
|
||
|
|
shoulder_incl = (np.tan(np.deg2rad(body['_shoulder_incl']))) * self.width
|
||
|
|
length = design['length']['v'] * body['waist_line']
|
||
|
|
|
||
|
|
self.edges = pyg.EdgeSeqFactory.from_verts(
|
||
|
|
[0, 0],
|
||
|
|
[-b_width, 0],
|
||
|
|
[-self.width, length],
|
||
|
|
[0, length + shoulder_incl],
|
||
|
|
loop=True
|
||
|
|
)
|
||
|
|
|
||
|
|
# Interfaces
|
||
|
|
self.interfaces = {
|
||
|
|
'outside': pyg.Interface(self, self.edges[1]),
|
||
|
|
'inside': pyg.Interface(self, self.edges[-1]),
|
||
|
|
'shoulder': pyg.Interface(self, self.edges[-2]),
|
||
|
|
'bottom': pyg.Interface(self, self.edges[0], ruffle=self.width / (body['waist_back_width'] / 2)),
|
||
|
|
|
||
|
|
# Reference to the corner for sleeve and collar projections
|
||
|
|
'shoulder_corner': pyg.Interface(self, [self.edges[-3], self.edges[-2]]),
|
||
|
|
'collar_corner': pyg.Interface(self, [self.edges[-2], self.edges[-1]])
|
||
|
|
}
|
||
|
|
|
||
|
|
# default placement
|
||
|
|
self.translate_by([0, body['height'] - body['head_l'] - length - shoulder_incl, 0])
|
||
|
|
|
||
|
|
def get_width(self, level):
|
||
|
|
return super().get_width(level) + self.width - self.body['shoulder_w'] / 2
|