Weekly review: Week ending October 30, 2015

This was a good week for making things. I coded a bunch of patterns and capabilities in the Python-based sewing pattern generator I’ve been tinkering around with. Now that I can easily rescale patterns and set measurements from the command-line, I can create paper models to test ideas. It was fun doing the math for rotating points and doing simple dart manipulation, too. In addition to programming, I also finished the mass production phase of one of my sewing projects. Yay!

Good cooking this week, too. We tried this General Tsao Chicken recipe – our first time to double-fry – and it was yummmmmy. I made a pan of lasagna, too.

The Latin 101 video course I’d checked out from the library turned out to have a few errors in the guidebook, so I’ve been using a combination of that and Wheelock’s Latin for practice. It’s fun feeling things start to make sense.

W- and I started a new playthrough of Borderlands 2, the shooter/RPG we’ve been playing for a few months now. We picked different characters, so we’ve been adapting to the new playstyles required.

Some fuzziness and tiredness, but such is life. Taking it easy. =)

2015-11-01b Week ending 2015-10-30 -- index card #journal #weekly output

Blog posts


Link round-up

  • Business (29.7h – 17%)
    • Earn (10.0h – 33% of Business)
      • Attend scraper meeting
      • Prepare invoice
    • Build (13.3h – 44% of Business)
      • Drawing (1.0h)
      • Paperwork (0.4h)
        • Include September bank statements
        • Finalize return
    • Connect (6.3h – 21% of Business)
  • Relationships (3.1h – 1%)
  • Discretionary – Productive (16.4h – 9%)
    • Emacs (2.6h – 1% of all)
      • Do another Emacs review
      • Do another Emacs review
    • Sewing (5.0h)
      • Add scale to tmtp
      • Try papercraft tmtp with my measurements
      • Programmatically rescaling and manipulating the darts in sewing patterns
      • Add SVG splitter to tmtp
      • Add seam allowances to tmtp
      • Sanity-check with someone else’s basic bodice block instructions
      • Python + sewing: Making basic shapes and splitting up larger patterns
      • Circle skirt pattern
      • Box tote pattern
      • Sew box tote prototype
    • Writing (2.0h)
    • Do a chapter of Wheelock’s Latin
    • Send in form
  • Discretionary – Play (17.1h – 10%)
  • Personal routines (30.7h – 18%)
  • Unpaid work (9.9h – 5%)
  • Sleep (61.1h – 36% – average of 8.7 per day)

Python + sewing: Making basic shapes and splitting up larger patterns

More Python and sewing. =) The first step was to make parameterization even easier by allowing command-line specification of measurements. I refactored some code from client.py and modified mkpattern to accept the new arguments, splitting up the name and value based on regular expressions (commit). That way, I could quickly generate patterns based on different dimensions, like so:

python ../mkpattern --client=../customer/Sacha/sacha-cm.json \
   --pattern=../patterns/box_tote.py \
   --styles=../tests/test_styles.json \
   -m height=4in -m width=7.5in -m seam_allowance=0.5in \
   -m depth=7.5in -m strap_width=1in -m strap_length=10in -m hem_allowance=1in \

I sketched basic patterns for cylindrical and box-type containers the other day, so I wanted to try them out. It turned out that the Python framework I used for sewing patterns didn’t yet support arcs. Adding the arc element to the SVG was straightforward. I initially faked the bounding box for the arc, but since that made the code misbehave a little, I looked around for a better implementation. I translated the code from this post from 2011 to Python and added it to the code (git commit). That allowed me to make a simple cylinder pattern generator. I haven’t tested it yet, but it looks reasonable.

2015-10-27 20_30_11-foo.svgThe box tote was interesting to work on. When I did the math, I couldn’t believe that the calculations were that simple. I was waiting for a sqrt or a cos to show up, I think. Still, the small-scale paper version I taped up looks like it makes sense, and I’ll sew a full-size version soon. J- asked for a light blue lunch bag that would fit our standard containers, and I’ve been meaning to make a casserole carrier for a while now. It would be handy to be able to make bags that are the right size. Too small and things don’t lie flat, too big and they move around too much.

2015-10-27 20_31_54-foo.svg - Inkscape

I spent most of my time making a flexible circle skirt pattern, pretzeling my brain around circumferences, angles, multiple pieces, and fullness multipliers. I’m happy with the way it turned out. It can generate patterns for quarter-circle skirts, half-circle skirts, full-circle skirts – even an arbitrary fraction of skirt fullness split into an arbitrary number of pieces, with optional seam allowance, waist seam allowance, and hem allowance. If you give it the fabric width, it will split the pattern into however many pieces are needed. If you specify a seam allowance and you want a full-circle skirt in a single piece (maybe for dolls), it’ll leave room for the seam allowances by adjusting the inner radius. We’re heading into snow pants season, so I probably won’t get around to testing it in fabric for a while. Caveat netrix, I guess.

I also got around to writing a tool for splitting up large patterns so that I could print them on a regular printer. I had tried Posterazor and a few other tools for splitting up large images into smaller pages, but I wanted something that would add cutting lines and page numbers. It turns out that all you need to do is change the SVG’s height, width, and viewPort. I added a rectangle for the cutting line and some text for the page numbers. I haven’t figured out how to use pysvg to replace the contents of an existing text element, but since the tool prints out non-overlapping regions, I just keep adding more text elements. My script creates a numbered sequence of SVGs. I haven’t found a convenient way to print multiple SVGs in one go, but I can select multiple PNGs and print those, and I can use Inkscape’s command line to convert SVGs to PNGs like so:

inkscape -z -e output-01.png -d 300 output-01.svg

There’s supposed to be a -p command to output Postscript ready for printing, but command-line printing on Windows doesn’t seem to be as much of a thing as it is on Linux. Something to figure out another time, maybe. Anyway, now that I have a conversion pipeline, I can write a Bash script or Emacs Lisp to process things automatically.

I’ll probably move from all this theoretical script-writing to more hands-on sewing during the rest of the week. My fabric order has arrived, so I’ve got a bit of cutting and sewing ahead of me.

Hmm. With the command-line measurement and scaling overrides, it might be interesting to use this framework for papercraft and laser-cutting too. Someday!

Programmatically rescaling and manipulating the darts in sewing patterns

I’ve been playing with the tmtp project for programmatically generating SVGs based on body measurements in order to create basic blocks and sewing patterns (see my previous blog post). I’m not yet at the point of being able to look at an image and see if it will sew correctly. However, printing and taping up large patterns is frustrating and a waste of paper. Scaling the patterns down so that they fit on a single page of paper makes perfect sense. With the measurements I’m working with, a scale of 0.2 (1″ : 5″) makes things fit neatly on 8.5″x11″ paper. It’s easy enough to cut them out and tape them up into something that resembles the form.

Here’s the commit that adds the scaling factor, and the commit that adds a very useful --scale command-line option. This lets me do something like this:

python mkpattern --verbose \
  --client=customer/Sacha/sacha-cm.json \
  --pattern=patterns/dart_manipulation_example.py \
  --styles=tests/test_styles.json --scale=0.2 output.svg

I generated a bunch of SVGs using my measurements, printed and cut them, and taped them up. Tada! They look like they make sense. The easy-fitting bodice block from Metric Pattern Cutting is, as expected, looser than the close-fitting bodice block, and both are a little bit bigger than the basic bodice block from BurdaStyle.

2015-10-26 16.17.312015-10-26 16.20.17

The basic shirt pattern from Cal Patch’s Design-it-Yourself Clothes fits over the basic blocks, as expected. It looks a little boxy compared to the blocks, but it will probably be fine in cotton, since cotton won’t be as stiff as paper.

2015-10-26 16.18.49

If I end up doing this a lot, I’ll probably look into modifying the patterns to draw an outline on a separate layer. Then I can convert the SVG for use with Hacklab’s laser cutter (see my previous experiments and fun results), so I can easily test with paper or fabric.

I was thinking about the viability of printing a small, to-scale 3D model based on measurements. Doesn’t have to be a photorealistic 3D scan of me – apparently you can get photorealistic 3D prints for about ~$120 these days, but that’s still a bit much. If it’s not from a scan, though, there’s the challenge of generating a good model based on entered measurements, or creating/adjusting an existing model of a dress maker’s mannequin. Anyway, papercraft with basic blocks seems to be a decent starting point. =)

With the scaling factor in place, I did the math for dart manipulation. Darts help add shape to fabric, turning flat pieces into slightly conical structures. If you wanted to move a dart on paper, you could tape the dart closed, then cut a new line to the apex of the dart and spread the pattern until it’s flat again. (Wikipedia describes this as slash-and-spread.)

There’s an SVG rotate transformation that would probably make it easier to handle the rotation of complex shapes. I haven’t figured out how to add an SVG group in tmtp yet, though. Instead, I:

  1. Added a pair of points where my “cut” was going to be
  2. Calculated the existing dart angle
  3. Rotated one of the dart points, one of the new cut points, and the points in between – to make things easier, I specified which points to rotate
  4. Redrew the front bodice

I added a few library functions, so now the code to rotate a dart is pretty short. It takes an array defining the dart points (start, apex, end), and another array of the points to rotate around the apex by the calculated angle.

def rotateDart(self, dart_points, points_to_rotate):
    # Determine the angle of rotation
    angle = angleOfVectorP(dart_points[0], dart_points[1], dart_points[2])
    # Rotate the dart closed
    (dart_points[0].x, dart_points[0].y) = rotateP(dart_points[0], dart_points[1], angle)
    # Rotate the rest of the points
    for i in range(len(points_to_rotate)):
        (points_to_rotate[i].x, points_to_rotate[i].y) = rotateP(points_to_rotate[i], dart_points[1], angle)

When I printed out my test pattern and cut it, the new pattern matched the result of slashing and spreading the dart on the previous bodice. Hooray for paper testing!

2015-10-26 18.27.54

The next step would probably be to make an SVG slicer that converts large patterns into segments that can be printed on a home printer. It would probably move/clip the image, add cutting lines and labels for convenience, and export a series of SVGs. If I’m lucky, I might be able to find a Python library that will let me easily create a multi-page PDF.

More thoughts on sewing and programming: it would be nifty to be able to easily program variable seam allowances, so that I could say that one seam has a 1/2″ allowance and the other has a 2″ hem allowance. Lines should be pretty straightforward – just offset a parallel line by the specified distance. Bezier curves might be a challenge. In “An offset algorithm for polyline curves” (Liu, Yong, Zheng, and Sun, 2006), the authors describe a algorithm involving trimming the offset curves of a polyline curve. I should check out the approximation algorithms mentioned in their literature review – might be an easier thing to start with, especially if I can wrap my head around the way the existing code’s curveLength function interpolates curves. Or I can leave the addition of variable allowances as a human step. It’s not that hard with a seam allowance ruler. Still, it would be neat to have laser-ready SVGs… =)

Anyway, now that I’ve got a simple way to test things on a small scale and a bit more of a handle on the math, I’m looking forward to playing around with generating actual patterns instead of just basic blocks. Whee!

2015-10-26 Emacs News

Links were from reddit.com/r/emacs, planet.emacsen.org, and Youtube. Here’s last week’s round-up, too. Enjoy!

Weekly review: Week ending October 23, 2015

This was an excellent week for learning. W- bought a small riveter in order to fix the rake, and he showed me how to use it. Whee!

In terms of sewing, I learned a different way of attaching collar stands and stitching hems. I experimented with making a long-sleeved peasant blouse, too. I like short sleeves more (long sleeves get in the way of washing dishes and things like that) but it was a good thing to try.

I’ve been going through the Latin 101 course by Prof. Hans-Friedrich Mueller. The first three noun conjugations are starting to make sense to me now, hooray! Unfortunately, the guidebook turns out to have quite a few errors. I ran into a couple of mislabeled exercises in Chapter 12, and there doesn’t seem to be an errata page. I was thinking of flagging the ones listed in this Amazon.com review with sticky notes so that I don’t get confused by them when I come across them in the book, but maybe it’s better for me to just switch to Wheelock’s Latin.

I had fun getting together with former coworkers, chatting about business and social trends over breakfast at Sunset Grill.

There was hail last Saturday, and the weather’s been cooling down. Fall colours everywhere, too. I bought a new pair of winter boots, since my old ones were leaking. The online reviews are mixed, but we’ll see what my experience with them is.

Next week, I’m looking forward to more Emacs, more sewing, more code, and more learning. Yay!

2015-10-25a Week ending 2015-10-23 -- index card #journal #weekly


Blog posts


Focus areas and time review

  • Business (25.3h – 15%)
    • Earn (20.7h – 82% of Business)
      • Continue scraper work
    • Build (2.7h – 10% of Business)
      • Drawing (2.7h)
      • Paperwork (0.0h)
        • Finalize return
    • Connect (1.9h – 7% of Business)
  • Relationships (5.5h – 3%)
  • Discretionary – Productive (24.7h – 14%)
    • Emacs (1.3h – 0% of all)
      • 2015-10-18 Emacs link round-up
      • Fix How to Read Emacs Lisp
      • Do another Emacs review
    • Sewing (11.0h)
    • Writing (2.7h)
  • Discretionary – Play (3.1h – 1%)
  • Personal routines (31.8h – 18%)
  • Unpaid work (13.9h – 8%)
  • Sleep (63.7h – 37% – average of 9.1 per day)

Fabric from the thrift store

I’ve been raiding the thrift store for 100% cotton sheets with patterns or textures that appeal to me. After a trip through the washing machine and dryer, they’re ready to be turned into other things. It’s easier to imagine what they’ll wear like with the softness of well-washed cotton instead of the stiffness of fabric on the bolt. There’s so much fabric that it’s easy to take risks on sewing experiments without feeling like I need to worry too much about maximizing yardage or avoiding mistakes. At the moment, I’d rather buy fabric than finished clothes, if I think I can sew what I want. Every piece is an opportunity to learn something.

Value Village is a bit higher-priced than the other thrift stores, but it has the advantage of being the largest one within walking distance. The price differences aren’t large enough to justify going on the subway. My limiting factor for sewing certainly isn’t a lack of fabric in my stash!

It took me a while to realize that I could get lots of material from the thrift store instead of from the fabric store. When I started getting back into sewing last year, I sewed the same pattern in different solid-coloured fabrics, and then moved on to some of the patterns that I liked: gingham, floral, and even a Marvel Comics print. (Mwahaha!) The more I browsed through the selection at fabric stores, though, the more I felt that I didn’t need to find a specific print or colour in order to make something I would like. If I happened across something I liked at the thrift store, I could add it to my stash. If not, it was a good walk anyway, and there’s still more to sew beyond that.

I suppose it’s a little like how we plan our groceries around the weekly flyers. If diced tomatoes are on sale, then it’s a good time to stock up. If not, we can cook from storage. If we’re out, there are plenty of other things we can cook.

I’m now reasonably confident that I can turn fabric into something simple that I can comfortably wear, and that I might prefer wearing more that something I could buy either used or new. I’m also happy with the kind of fabric that I can easily get, with the occasional splurge or special order here and there. I could spend more – there’s room in my budget, considering it’s part utility, part entertainment, and part education – but I don’t need to, and I like not needing more.