# !/usr/bin/python # # shirt_waist_allington.py # Inkscape extension-Effects-Sewing Patterns-Shirt Waist Allington # Copyright (C) 2010, 2011, 2012 Susan Spencer, Steve Conklin ''' Licensing paragraph: 1. CODE LICENSE: GPL 2.0+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 2. PATTERN LICENSE: CC BY-NC 3.0 The output of this code is a pattern and is considered a visual artwork. The pattern is licensed under Attribution-NonCommercial 3.0 (CC BY-NC 3.0) Items made from the pattern may be sold; the pattern may not be sold. End of Licensing paragraph. ''' import sys, subprocess, math, inkex, gettext sys.path.append('/usr/share/inkscape/extensions') from simplestyle import * from fablabchemnitz_sewing_patterns import * class ShirtWaistAllington(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) self.OptionParser.add_option('--m_unit', action = 'store', type = 'string', dest = 'unit', default = 'Inches', help = 'Centimeters or Inches?') self.OptionParser.add_option('--m_front_waist_length', action = 'store', \ type = 'float', dest = 'm_front_waist_length', default = '15.0', help = 'Front Waist Length') self.OptionParser.add_option('--m_back_waist_length', action = 'store', \ type = 'float', dest = 'm_back_waist_length', default = '15.5', help = 'Back Waist Length') self.OptionParser.add_option('--m_neck_circumference', action = 'store', \ type = 'float', dest = 'm_neck_circumference', default = '13.5', help = 'Neck Circumference') self.OptionParser.add_option('--m_bust_circumference', action = 'store', \ type = 'float', dest = 'm_bust_circumference', default = '39.0', help = 'Bust Circumference') self.OptionParser.add_option('--m_waist_circumference', action = 'store', \ type = 'float', dest = 'm_waist_circumference', default = '25.0', help = 'Waist Circumference') self.OptionParser.add_option('--m_armscye_circumference', action = 'store', \ type = 'float', dest = 'm_armscye_circumference', default = '15.0', help = 'Armscye circumference') self.OptionParser.add_option('--m_across_back', action = 'store', \ type = 'float', dest = 'm_across_back', default = '13.5', help = 'Across Back') self.OptionParser.add_option('--m_shoulder', action = 'store', \ type = 'float', dest = 'm_shoulder', default = '6.5', help = 'Shoulder') self.OptionParser.add_option('--m_side', action = 'store', \ type = 'float', dest = 'm_side', default = '7.75', help = 'Side') self.OptionParser.add_option('--m_upper_front_height', action = 'store', \ type = 'float', dest = 'm_upper_front_height', default = '10.75', help = 'Upper Front Height') self.OptionParser.add_option('--m_overarm_length', action = 'store', \ type = 'float', dest = 'm_overarm_length', default = '20.00', help = 'Overarm Length') self.OptionParser.add_option('--m_elbow_height', action = 'store', \ type = 'float', dest = 'm_elbow_height', default = '9.50', help = 'Elbow Height - from wrist to elbow') self.OptionParser.add_option('--m_elbow_circumference', action = 'store', \ type = 'float', dest = 'm_elbow_circumference', default = '12.50', help = 'Elbow Circumference - arm bent') self.OptionParser.add_option('--m_hand_circumference', action = 'store', \ type = 'float', dest = 'm_hand_circumference', default = '8.00', help = 'Hand Circumference') def effect(self): def printPoint(pnt): debug(' %s = %f, %f')%pnt.id, pnt.x, pnt.y INCH_to_PX = 90.0 #inkscape uses 90 pixels per 1 inch CM_to_INCH = 1/2.54 CM_to_PX = CM_to_INCH*INCH_to_PX CM = CM_to_PX # CM - shorthand when using centimeters IN = INCH_to_PX # IN - shorthand when using inches #all measurements must be converted to px munit = self.options.unit if munit == 'Centimeters': MEASUREMENT_CONVERSION = CM else: MEASUREMENT_CONVERSION = IN #convert measurements front_waist_length = self.options.m_front_waist_length * MEASUREMENT_CONVERSION neck_circumference = self.options.m_neck_circumference * MEASUREMENT_CONVERSION bust_circumference = self.options.m_bust_circumference * MEASUREMENT_CONVERSION waist_circumference = self.options.m_waist_circumference * MEASUREMENT_CONVERSION armscye_circumference = self.options.m_armscye_circumference * MEASUREMENT_CONVERSION across_back = self.options.m_across_back * MEASUREMENT_CONVERSION shoulder = self.options.m_shoulder * MEASUREMENT_CONVERSION side = self.options.m_side * MEASUREMENT_CONVERSION upper_front_height = self.options.m_upper_front_height * MEASUREMENT_CONVERSION overarm_length = self.options.m_overarm_length * MEASUREMENT_CONVERSION elbow_height = self.options.m_elbow_height * MEASUREMENT_CONVERSION elbow_circumference = self.options.m_elbow_circumference * MEASUREMENT_CONVERSION hand_circumference = self.options.m_hand_circumference * MEASUREMENT_CONVERSION #constants ANGLE90 = angleOfDegree(90) ANGLE180 = angleOfDegree(180) SEAM_ALLOWANCE = (5/8.0)*IN BORDER = 1*IN NOTE_HEIGHT = 1*IN #get the document, set initial width & height doc = self.document.getroot() # self.document is the canvas seen in Inkscape #add defs group with markers to document addDefs(doc) #width_orig = inkex.unittouu(doc.get('width')) #height_orig = inkex.unittouu(doc.get('height')) #doc_width = 4*BORDER+4*SEAM_ALLOWANCE + bust_circumference/2.0 #doc_height = 2*BORDER+3*SEAM_ALLOWANCE+(upper_front_height+side) #doc.set('width', str(doc_width)) #temporary document width, doc is resized near end of pattern file #doc.set('height', str(doc_height)) #temporary document height, doc is resized near end of pattern file #create a base group in the document to hold all patterns pattern_base = base(doc, 'pattern_base') #create a pattern group for each pattern, put pattern group in base group - there can be multiple patterns bodice = pattern(pattern_base, 'bodice') # create a group for each pattern piece, put pattern piece group in pattern group A = patternPiece(bodice, 'A', 'bodice_front', fabric = 2, interfacing = 0, lining = 0) B = patternPiece(bodice, 'B', 'bodice_back', fabric = 2, interfacing = 0, lining = 0) C = patternPiece(bodice, 'C', 'bodice_sleeve', fabric = 2, interfacing = 0, lining = 0) D = patternPiece(bodice, 'D', 'bodice_cuff', fabric = 2, interfacing = 0, lining = 0) #pattern notes notes = [] notes.append('Define Seam Allowances: Select File/Inkscape Preferences/Steps and set Outset to 56.25px (5/8" seam allowance)') notes.append('Create Seam Allowances: Press CTRL-F, type "cuttingline" in the ID field, click the Find button, press CTRL-)') notes.append('Remove Points & Gridlines: Press CTRL-F, type "reference" in the Attribute field, click Find button, press DELETE') notes.append('Print: Save as a PDF file, open PDF with PDF viewer (Adobe, Evince, Okular, xPDF), print from Print Preview option') #pattern points b1 = patternPointXY(B, 'b1', 0, 0) #B b2 = patternPoint(B, 'b2', down(b1, front_waist_length)) #A b3 = patternPoint(B, 'b3', up(b2, side)) #C a1 = patternPoint(A, 'a1', left(b3, bust_circumference/2.0)) #D b4 = patternPoint(B, 'b4', left(b3, across_back/2.0)) #E b5 = patternPoint(B, 'b5', up(b4, armscye_circumference/3.0)) #F b6 = patternPoint(B, 'b6', up(b1, 0.5*IN)) #G b7 = patternPoint(B, 'b7', left(b6, 1.5*IN)) #H b8 = patternPoint(B, 'b8', onLineAtLength(b5, b7, -0.5*IN)) #I a2 = patternPoint(A, 'a2', left(b4, armscye_circumference/4.0)) #J a3 = patternPoint(A, 'a3', midPoint(a2, b4)) #K a4 = patternPoint(A, 'a4', up(a2, 2.5*IN)) #L a5 = patternPoint(A, 'a5', up(b5, 1.5*IN)) #M a6 = patternPoint(A, 'a6', left(a5, 2*IN)) #N a7 = patternPoint(A, 'a7', left(a6, distance(b7, b8))) #O a8 = patternPointXY(A, 'a8', a7.x, b3.y - (upper_front_height - distance(b1, b7))) #P a9 = patternPoint(A, 'a9', down(a8, neck_circumference/4.0)) #Q a10 = patternPoint(A, 'a10', up(a9, 0.5*IN)) #R a11 = patternPoint(A, 'a11', left(a10, (neck_circumference/6.0)+0.25*IN )) #S b9 = patternPoint(B, 'b9', midPoint(a3, b4)) #T on back bodice B a12 = patternPoint(A, 'a12', b9) #T on front bodice A b10 = patternPoint(B, 'b10', down(b9, side)) #U b11 = patternPoint(B , 'b11', right(b10, 1*IN)) #V a13 = patternPoint(A, 'a13', left(b10, 1*IN)) #W a14 = patternPoint(A, 'a14', onLineAtLength(a11, a1, front_waist_length)) #X a15 = patternPoint(A, 'a15', down(a8, distance(a8, a14))) #Y - new point at front waist b12 = patternPoint(B, 'b12', up(b4, distance(b5, b4)/3.0)) #Z - new point at back armscye #temporary armscye curve from a3 to b12 to find top point of side seam length = distance(a3, b12)/3.0 temp_b12_c1 = right(a3, length) #don't create an svg controlpoint circle for this point temp_b12_c2 = down(b12, length) #or for this point #find top point of side seam with intersection of side and armscye curve, save to two points a16 and b13 curve1 = pointList(a3, temp_b12_c1, temp_b12_c2, b12) intersections = intersectLineCurve(b10, b9, curve1) #this line is directional from b10 to b9 b13 = patternPoint(B, 'b13', intersections[0]) # AA on bodice back B -use 1st intersection found, in this case there's only one intersection a16 = patternPoint(A, 'a16', b13) #AA on bodice back A #front control points - path runs counterclockwise from front neck center a11 #front neck control points from a8 to a11 length = distance(a8, a11)/3.0 a11.c2 = controlPoint(A, 'a11.c2', right(a11, 1.5*length)) a11.c1 = controlPoint(A, 'a11.c1', polar(a8, length, angleOfLine(a8, a11.c2))) #front waist control points from a14 to a15 length = distance(a14, a15)/3.0 a15.c1 = controlPoint(A, 'a15.c1', polar(a14, length, angleOfLine(a14, a11)+ANGLE90)) #control handle line is perpendicular to line a14-a11 a15.c2 = controlPoint(A, 'a15.c2', left(a15, length)) #front waist control points from a15 to a13 length = distance(a15, a13)/3.0 a13.c1 = controlPoint(A, 'a13.c1', right(a15, 1.5*length)) a13.c2 = controlPoint(A, 'a13.c2', polar(a13, length, angleOfLine(a13, a13.c1))) #second control aimed at first control point #front side control points from a13 to a12 length = distance(a13, a12)/3.0 a12.c1 = controlPoint(A, 'a12.c1', up(a13, length)) a12.c2 = controlPoint(A, 'a12.c2', down(a12, length)) #front armscye control points from a16 to a3 to a4 to 16 length1 = distance(a16, a3)/3.0 length2 = distance(a3, a4)/3.0 length3 = distance(a4, a6)/3.0 angle1 = angleOfLine(a16, a3) angle2 = ANGLE180 angle3 = (angle1+angle2)/2.0 a3.c1 = controlPoint(A, 'a3.c1', polar(a16, length1, angle1)) a3.c2 = controlPoint(A, 'a3.c2', polar(a3, length1, angle3-ANGLE180)) a4.c1 = controlPoint(A, 'a4.c1', polar(a3, length2, angle3)) angle4 = angleOfLine(a3, a6) angle5 = angleOfLine(a4, a6) angle6 = (angle4+angle5)/2.0 a4.c2 = controlPoint(A, 'a4.c2', polar(a4, 1.5*length2, angle6-ANGLE180)) a6.c1 = controlPoint(A, 'a6.c1', polar(a4, length3, angle6)) a6.c2 = controlPoint(A, 'a6.c2', polar(a6, length3/2.0, angleOfLine(a8, a6)+ANGLE90)) #back control points - path runs clockwise from back nape b1 #back neck control points from b7 to b1 length = distance(b7, b1)/3.0 b1.c1 = controlPoint(B, 'b1.c1', down(b7, length/2.0)) #short control point handle b1.c2 = controlPoint(B, 'b1.c2', left(b1, length*2)) #long control point handle #back side control points from b11 to b9 length = distance(b11, b9)/3.0 b9.c1 = controlPoint(B, 'b9.c1', up(b11, length)) b9.c2 = controlPoint(B, 'b9.c2', down(b9, length)) #back armscye points from b13 to b12 to b8 length1 = distance(b13, b12)/3.0 length2 = distance(b12, b8)/3.0 angle1 = angleOfLine(b13, b8) b12.c1 = controlPoint(B, 'b12.c1', polar(b13, length1, angleOfLine(a3.c1, a16))) b12.c2 = controlPoint(B, 'b12.c2', polar(b12, length1, angle1-ANGLE180)) b8.c1 = controlPoint(B, 'b8.c1', polar(b12, length2, angle1)) b8.c2 = controlPoint(B, 'b8.c2', polar(b8, length2/2.0, angleOfLine(b7, b8)-ANGLE90)) #sleeve C c1 = patternPointXY(C, 'c1', 0.0, 0.0) #A c2 = patternPoint(C, 'c2', down(c1, overarm_length)) #B c3 = patternPoint(C, 'c3', up(c2, elbow_height)) #C c4 = patternPoint(C, 'c4', right(c2, 1*IN)) #D c5 = patternPoint(C, 'c5', right(c3, 0.5*IN)) #E c6 = patternPoint(C, 'c6', left(c1, 1*IN)) #F c7 = patternPoint(C, 'c7', right(c4, 1*IN)) #G c8 = patternPoint(C, 'c8', right(c7, hand_circumference+2*IN)) #H c9 = patternPoint(C, 'c9', right(c8, 1*IN)) #I c10 = patternPoint(C, 'c10', right(c5, 1*IN) )#J c11 = patternPoint(C, 'c11', right(c10, elbow_circumference)) #K c12 = patternPoint(C, 'c12', right(c11, 0.5*IN)) #L c13 = patternPoint(C, 'c13', right(c1, armscye_circumference)) #M c14 = patternPoint(C, 'c14', right(c13, 2*IN)) #N c15 = patternPoint(C, 'c15', up(c1, 2.5*IN)) #O c16 = patternPoint(C, 'c16', right(c1, 1.5*IN)) #P c17 = patternPoint(C, 'c17', left(c13, 3*IN)) #Q c18 = patternPointXY(C, 'c18', c16.x, c15.y) #R c19 = patternPointXY(C, 'c19', c17.x, c15.y) #S c20 = patternPoint(C, 'c20', midPoint(c16, c17)) #T c21 = patternPoint(C, 'c21', up(c20, distance(c20, c18))) #U - above T c22 = patternPoint(C, 'c22', down(midPoint(c7, c8), 0.75*IN)) #V - was U c23 = patternPoint(C, 'c23', right(c4, distance(c4, c8)*3/5.0)) #W c24 = patternPoint(C, 'c24', up(c23, distance(c4, c3)/3.0)) #X - was V c25 = patternPoint(C, 'c25', down(c23, 0.75*IN)) #Y - new point # sleeve C control points # sleevecap c6 to c18 to c21 to c19 to c13 to c14 length1 = distance(c6, c18)/3.0 length2 = distance(c18, c21)/3.0 c21.c2 = controlPoint(C, 'c21.c2', left(c21, length2)) c21.c1 = controlPoint(C, 'c21.c1', polar(c18, length2, angleOfLine(c18, c21.c2))) angle = angleOfLine(c6, c18)+angleOfVector(c18, c6, c1)/2.0 c18.c1 = controlPoint(C, 'c18.c1', polar(c6, length1, angle)) c18.c2 = controlPoint(C, 'c18.c2', polar(c18, length1, angleOfLine(c21.c1, c18))) length1 = distance(c21, c19)/3.0 length2 = distance(c19, c13)/3.0 length3 = distance(c13, c14)/3.0 c19.c1 = controlPoint(C, 'c19.c1', right(c21, length1)) c19.c2 = controlPoint(C, 'c19.c2', polar(c19, length1, angleOfLine(c19, c19.c1))) c13.c1 = controlPoint(C, 'c13.c1', polar(c19, length2, angleOfLine(c19.c2, c19))) angle1 = angleOfLine(c13.c1, c13)/2.0 c13.c2 = controlPoint(C, 'c13.c2', polar(c13, length2, angle1+ANGLE180)) c14.c1 = controlPoint(C, 'c14.c1', polar(c13, length3, angle1)) c14.c2 = controlPoint(C, 'c14.c2', polar(c14, length3, angleOfLine(c18.c1, c6))) # c14 to c12 length = distance(c14, c12)/3.0 c12.c2 = controlPoint(C, 'c12.c2', polar(c12, length, angleOfLine(c9, c12))) c12.c1 = controlPoint(C, 'c12.c1', polar(c14, length, angleOfLine(c14, c12.c2))) # c9 to c25 length = distance(c9, c25)/3.0 c25.c2 = controlPoint(C, 'c25.c2', right(c25, length)) c25.c1 = controlPoint(C, 'c25.c1', polar(c9, length, angleOfLine(c9, c25.c2))) #c22 to c4 length = distance(c22, c4)/3.0 c4.c1 = controlPoint(C, 'c4.c1', left(c22, length)) c4.c2 = controlPoint(C, 'c4.c2', polar(c4, length, angleOfLine(c4, c4.c1))) #c5 to c6 length = distance(c5, c6)/3.0 c6.c1 = controlPoint(C, 'c6.c1', polar(c5, length, angleOfLine(c4, c5))) c6.c2 = controlPoint(C, 'c6.c2', polar(c6, length, angleOfLine(c6, c6.c1))) #cuff D d1 = patternPointXY(D, 'd1', 0, 0) d2 = patternPoint(D, 'd2', right(d1, hand_circumference+2*IN)) d3 = patternPoint(D, 'd3', down(d2, 3*IN)) d4 = patternPoint(D, 'd4', up(d3, 0.75*IN)) d5 = patternPoint(D, 'd5', left(d3, 1*IN)) d6 = patternPoint(D, 'd6', down(d1, 3*IN)) d7 = patternPoint(D, 'd7', right(d6, 1*IN)) d8 = patternPoint(D, 'd8', up(d6, 0.75*IN)) length1 = 0.7*distance(d1, d6) length2 = 0.75*IN d9 = patternPointXY(D, 'd9', d1.x+0.5*IN, d1.y+length1) d10 = patternPoint(D, 'd10', right(d9, length2)) d11 = patternPointXY(D, 'd11', d2.x-0.5*IN, d2.y+length1) d12 = patternPoint(D, 'd12', left(d11, length2)) #cuff D control points length = distance(d4, d5)/3.0 d5.c1 = controlPoint(D, 'd5.c1', down(d4, length)) d5.c2 = controlPoint(D, 'd5.c2', right(d5, length)) d8.c1 = controlPoint(D, 'd8.c1', left(d7, length)) d8.c2 = controlPoint(D, 'd8.c2', down(d8, length)) # all points are defined, now create paths with them... # pattern marks, labels, grainlines, seamlines, cuttinglines, darts, etc. #bodice front A #letter pnt1 = Point('', a8.x, a6.c1.y) addText(A, 'A_letter', pnt1.x, pnt1.y, 'A', fontsize = '72') #label pnt2 = down(pnt1, 0.5*IN) addText(A, 'A_label', pnt2.x, pnt2.y, 'Bodice Front', fontsize = '48') #label pnt3 = down(pnt2, 0.5*IN) addText(A, 'A_fabric', pnt3.x, pnt3.y, 'Cut 2 of fabric', fontsize = '38') #grainline points aG1 = down(a11, front_waist_length/3.0) aG2 = polar(aG1, front_waist_length/2.0, angleOfLine(a11, a14)) path_str = formatPath('M', aG1, 'L', aG2) A_grainline = addPath(A, 'A_grainline', path_str, 'grainline') # gridline - helpful for troubleshooting during design phase path_str = formatPath('M', a1, 'L', a3, 'M', a4, 'L', a2, 'M', a8, 'L', a15, 'M', a11, 'L', a10, 'M', a7, 'L', a5) A_gridline = addPath(A, 'A_gridline', path_str, 'gridline') #seamline & cuttingline path_str = formatPath('M', a11, 'L', a14, 'C', a15.c1, a15.c2, a15, 'C', a13.c1, a13.c2, a13, 'C', a12.c1, a12.c2, a12) path_str = path_str+formatPath('L', a16, 'C', a3.c1, a3.c2, a3, 'C', a4.c1, a4.c2, a4, 'C', a6.c1, a6.c2, a6, 'L', a8, 'C', a11.c1, a11.c2, a11) A_seamline = addPath(A, 'A_seamline', path_str, 'seamline') A_cuttingline = addPath(A, 'A_cuttingline', path_str, 'cuttingline') #bodice back B #letter pnt1 = Point('', b8.x*2/3.0, b8.c2.y) addText(B, 'B_letter', pnt1.x, pnt1.y, 'B', fontsize = '72') # #label pnt2 = down(pnt1, 0.5*IN) addText(B, 'B_name', pnt2.x, pnt2.y, 'Bodice Back', fontsize = '48') #label pnt3 = down(pnt2, 0.5*IN) addText(B, 'B_fabric', pnt3.x, pnt3.y, 'Cut 2 of fabric', fontsize = '38') #grainline points bG1 = down(b7, front_waist_length/3.0) bG2 = down(bG1, front_waist_length/2.0) path_str = formatPath('M', bG1, 'L', bG2) B_grainline = addPath(B, 'B_grainline', path_str, 'grainline') # gridline path_str = formatPath('M', b1, 'L', b2, 'M', b11, 'L', b9, 'M', b9, 'L', b10, 'M', b7, 'L', b6, 'L', b1, 'M', b11, 'L', b10) B_gridline = addPath(B, 'B_gridline', path_str, 'gridline') #seamline & cuttingline path_str = formatPath('M', b1, 'L', b2, 'L', b11, 'C', b9.c1, b9.c2, b9, 'L', b13, 'C', b12.c1, b12.c2, b12, 'C', b8.c1, b8.c2, b8, 'L', b7, 'C', b1.c1, b1.c2, b1) B_seamline = addPath(B, 'B_seamline', path_str, 'seamline') B_cuttingline = addPath(B, 'B_cuttingline', path_str, 'cuttingline') #bodice sleeve C #letter pnt1 = Point('', c19.c1.x, c12.c1.y) addText(C, 'C_letter', pnt1.x, pnt1.y, 'C', fontsize = '72') # #label pnt2 = down(pnt1, 0.5*IN) addText(C, 'C_name', pnt2.x, pnt2.y, 'Bodice Sleeve', fontsize = '48') #label pnt3 = down(pnt2, 0.5*IN) addText(C, 'C_fabric', pnt3.x, pnt3.y, 'Cut 2 of fabric', fontsize = '38') #grainline points cG1 = c20 cG2 = down(cG1, overarm_length/2.0) path_str = formatPath('M', cG1, 'L', cG2) C_grainline = addPath(C, 'C_grainline', path_str, 'grainline') # gridline path_str = formatPath('M', c15, 'L', c2, 'M', c15, 'L', c19, 'M', c2, 'L', c9, 'M', c3, 'L', c12, 'M', c6, 'L', c14, 'M', c18, 'L', c16, 'M', c19, 'L', c17) C_gridline = addPath(C, 'C_gridline', path_str, 'gridline') # slashline path_str = formatPath('M', c24, 'L', c25) C_slashline = addPath(C, 'C_slashline', path_str, 'slashline') #seamline & cuttingline path_str = formatPath('M', c6, 'C', c18.c1, c18.c2, c18, 'C', c21.c1, c21.c2, c21, 'C', c19.c1, c19.c2, c19, 'C', c13.c1, c13.c2, c13, 'C', c14.c1, c14.c2, c14) path_str += formatPath('C', c12.c1, c12.c2, c12, 'L', c9, 'C', c25.c1, c25.c2, c25, 'L', c22, 'C', c4.c1, c4.c2, c4, 'L', c5, 'C', c6.c1, c6.c2, c6) C_seamline = addPath(C, 'C_seamline', path_str, 'seamline') C_cuttingline = addPath(C, 'C_cuttingline', path_str, 'cuttingline') #bodice cuff D #letter pnt1 = Point('', d7.x, d6.y/4.0) addText(D, 'D_letter', pnt1.x, pnt1.y, 'D', fontsize = '38') # #label pnt2 = right(pnt1, 1*IN) addText(D, 'C_name', pnt2.x, pnt2.y, 'Bodice Sleeve Cuff', fontsize = '30') #label pnt3 = right(pnt2, 4*IN) addText(D, 'C_fabric', pnt3.x, pnt3.y, 'Cut 2 of fabric', fontsize = '24') pnt3 = down(pnt3, 0.3*IN) addText(D, 'C_finterfacing', pnt3.x, pnt3.y, 'Cut 2 of interfacing', fontsize = '24') #grainline points pnt1 = midPoint(d1, d6) dG1 = right(pnt1, distance(d1, d2)/4.0) dG2 = right(dG1, distance(d1, d2)/2.0) path_str = formatPath('M', dG1, 'L', dG2) D_grainline = addPath(D, 'D_grainline', path_str, 'grainline') # gridline path_str = formatPath('M', d1, 'L', d2, 'L', d4, 'L', d5, 'L', d7, 'L', d8, 'L', d1) D_gridline = addPath(D, 'D_gridline', path_str, 'gridline') # slashline path_str = formatPath('M', d9, 'L', d10, 'M', d11, 'L', d12) D_slashline = addPath(D, 'D_slashline', path_str, 'slashline') #seamline & cuttingline path_str = formatPath('M', d1, 'L', d2, 'L', d4, 'C', d5.c1, d5.c2, d5, 'L', d7, 'C', d8.c1, d8.c2, d8, 'L', d1) D_seamline = addPath(D, 'D_seamline', path_str, 'seamline') D_cuttingline = addPath(D, 'D_cuttingline', path_str, 'cuttingline') #layout patterns on document in rows dx = BORDER+SEAM_ALLOWANCE #left border, allow width for seam allowance dy = BORDER+NOTE_HEIGHT+2*SEAM_ALLOWANCE # print pattern under the note header, allow height for seam allowance plus extra space pattern_buffer = 3*SEAM_ALLOWANCE #between any two patterns need 2 seam allowances plus additional space # first row pattern_offset = dx row_offset = dy #layout bodice front A adx = pattern_offset-a14.x #left border offset dx, translate leftmost A point a14 to this offset ady = row_offset-a8.y #upper height offset dy, translate highest A point a8 A.set('transform', 'translate('+str(adx)+' '+str(ady)+')') pattern_offset = adx+a12.x+pattern_buffer #layout bodice front B bdx = pattern_offset-b9.x #translate leftmost B point bdy = row_offset-b6.y #translate highest B point B.set('transform', 'translate('+str(bdx)+' '+str(bdy)+')') #2nd row pattern_offset = dx row_offset = ady+a15.y+pattern_offset # row_offset + lowest point from previous row, plus pattern_offset #layout sleeve C cdx = pattern_offset-c6.x cdy = row_offset-c21.y C.set('transform', 'translate('+str(cdx)+' '+str(cdy)+')') pattern_offset = cdx+c14.x+pattern_buffer #layout cuff D ddx = pattern_offset-d1.x ddy = row_offset-d1.y D.set('transform', 'translate('+str(ddx)+' '+str(ddy)+')') #3rd row, use this to calculate document height row_offset = cdy+c25.y #resize document to fit pattern piece layout width = ddx+d2.x # use pattern piece that appears farthest to the right in Inkscape canvas doc_width = width+2*SEAM_ALLOWANCE+2*BORDER doc.set('width', str(doc_width)) doc_height = row_offset+SEAM_ALLOWANCE+BORDER doc.set('height', str(doc_height)) #Place notes on document after pattern pieces are transformed so that notes are centered on correct width x = doc_width/2.0 y = BORDER i = 0 for item in notes: addText(bodice, 'note'+str(i), x, y, item, fontsize = '28', textalign = 'center', textanchor = 'middle', reference = 'false') y = y+0.33*IN effect = ShirtWaistAllington() effect.affect()