Changes
7 changed files (+516/-326)
-
-
@@ -113,6 +113,7 @@ This does not have to be shorter than `LongPiece`.type alias ShortPiece = { length : Length , loops : Loops , buckleSideFlap : Length }
-
@@ -191,6 +192,7 @@ type alias Parameters ={ shoulderWidth : Length , longPiece : LongPiece , shortPiece : ShortPiece , caseSideFlap : Length , paddingOffset : Length , profile : Profile , rendering : Rendering
-
@@ -237,7 +239,9 @@ default =, free = Just defaultFreeLoop , style = Simple } , buckleSideFlap = mm 30 } , caseSideFlap = mm 20 , paddingOffset = mm 5 , profile = Straight , rendering =
-
@@ -310,6 +314,20 @@ toDict mode params =profileToCompactString params.profile ) ] |> (++) (if toMM params.caseSideFlap > 0 then [ ( toString CaseSideFlap, String.fromFloat (toMM params.caseSideFlap) ) ] else [] ) |> (++) (if toMM params.shortPiece.buckleSideFlap > 0 then [ ( toString BuckleSideFlap, String.fromFloat (toMM params.shortPiece.buckleSideFlap) ) ] else [] ) |> (++) (case params.longPiece.tip of Round ->
-
@@ -359,8 +377,8 @@ toDict mode params =|> Dict.fromList {-| Fields under `Maybe` record may be empty when the parsed parent is `Nothing`. These values sets default values for those fields. {-| Optional fields that can be omitted from URL search parameters need default values. Otherwise the corresponding form field shows an empty input. -} fallbackValues : DictKeyMode -> ParametersDict fallbackValues mode =
-
@@ -380,6 +398,8 @@ fallbackValues mode =, ( toString FreeLoopWidth, String.fromFloat (toMM defaultFreeLoop.width) ) , ( toString FreeLoopLength, String.fromFloat (toMM defaultFreeLoop.length) ) , ( toString FreeLoopOverlap, String.fromFloat (toMM defaultFreeLoop.overlap) ) , ( toString CaseSideFlap, "0" ) , ( toString BuckleSideFlap, "0" ) ] |> Dict.fromList
-
-
-
@@ -626,6 +626,22 @@ view model =, disabled = False , attrs = step "1" :: lengthFieldAttrs constraints.shortPiece.length } , numberField model { key = CaseSideFlap , description = [ text "Length of flaps (excess) of tail piece and head piece at case-side end. " ] , unit = Just "mm" , disabled = False , attrs = step "1" :: lengthFieldAttrs constraints.caseSideFlap } , numberField model { key = BuckleSideFlap , description = [ text "Length of flaps (excess) of head piece at buckle-side end. " ] , unit = Just "mm" , disabled = False , attrs = step "1" :: lengthFieldAttrs constraints.caseSideFlap } ] , hr [] [] , group
-
-
-
@@ -40,6 +40,7 @@ type alias Loops =type alias ShortPiece = { loops : Loops , length : NumberConstraints Length , buckleSideFlap : NumberConstraints Length }
-
@@ -68,6 +69,7 @@ type alias Parameters ={ shoulderWidth : NumberConstraints Length , longPiece : LongPiece , shortPiece : ShortPiece , caseSideFlap : NumberConstraints Length , paddingOffset : NumberConstraints Length , taperTo : NumberConstraints Length , rendering : Rendering
-
@@ -100,7 +102,9 @@ constraints =} } , length = { min = Just (mm 5), max = Just (mm 150) } , buckleSideFlap = { min = Just (mm 0), max = Just (mm 80) } } , caseSideFlap = { min = Just (mm 0), max = Just (mm 50) } , paddingOffset = { min = Just (mm 0), max = Just (mm 14) } , taperTo = { min = Just (mm 5), max = Just (mm 28) } , rendering =
-
-
-
@@ -12,6 +12,8 @@ module Models.PWS01.Parameters.Key exposing (Key(..), toCompactID, toLabel, toSttype Key = ShoulderWidth | CaseSideFlap | BuckleSideFlap | PaddingOffset | TipStyle | TipSharpness
-
@@ -59,6 +61,12 @@ toString key =ShoulderWidth -> "shoulder-width" CaseSideFlap -> "case-side-flap" BuckleSideFlap -> "buckle-side-flap" PaddingOffset -> "padding-offset"
-
@@ -138,6 +146,12 @@ toLabel key =ShoulderWidth -> "Shoulder width" CaseSideFlap -> "Case side flap" BuckleSideFlap -> "Buckle side flap" PaddingOffset -> "Padding offset"
-
@@ -273,3 +287,9 @@ toCompactID key =QRCode -> "n" CaseSideFlap -> "o" BuckleSideFlap -> "p"
-
-
-
@@ -281,18 +281,19 @@ parseShortPiece fields =case ( parseLoops fields , parseField ShortPieceLength (parseLength constraints.shortPiece.length) fields , parseOptionalField BuckleSideFlap (parseLength constraints.shortPiece.buckleSideFlap) fields |> Result.map (Maybe.withDefault (mm 0)) ) of ( Ok loops, Ok length ) -> let base = default.shortPiece in Ok { base | loops = loops, length = length } ( Ok loops, Ok length, Ok buckleSideFlap ) -> Ok { loops = loops, length = length, buckleSideFlap = buckleSideFlap } ( loops, length ) -> ( loops, length, buckleSideFlap ) -> [ unwrapErrors loops , mkErrors [ ( ShortPieceLength, getError length ) ] , mkErrors [ ( ShortPieceLength, getError length ) , ( BuckleSideFlap, getError buckleSideFlap ) ] ] |> List.map Dict.Any.toList |> List.concat
-
@@ -441,23 +442,28 @@ parse fields =, parseShortPiece fields , parseProfile fields ) , parseRendering fields , ( parseRendering fields , parseOptionalField CaseSideFlap (parseLength constraints.caseSideFlap) fields |> Result.map (Maybe.withDefault (mm 0)) ) ) of ( ( Ok shoulderWidth, Ok paddingOffset ), ( Ok longPiece, Ok shortPiece, Ok profile ), Ok rendering ) -> ( ( Ok shoulderWidth, Ok paddingOffset ), ( Ok longPiece, Ok shortPiece, Ok profile ), ( Ok rendering, Ok caseSideFlap ) ) -> Ok { shoulderWidth = shoulderWidth , longPiece = longPiece , shortPiece = shortPiece , caseSideFlap = caseSideFlap , paddingOffset = paddingOffset , rendering = rendering , profile = profile } ( ( shoulderWidth, paddingOffset ), ( longPiece, shortPiece, profile ), rendering ) -> ( ( shoulderWidth, paddingOffset ), ( longPiece, shortPiece, profile ), ( rendering, caseSideFlap ) ) -> [ mkErrors [ ( ShoulderWidth, getError shoulderWidth ) , ( PaddingOffset, getError paddingOffset ) , ( CaseSideFlap, getError caseSideFlap ) ] , unwrapErrors longPiece , unwrapErrors shortPiece
-
-
-
@@ -39,9 +39,10 @@ cuts params highlighting =|> gapped (toMM params.rendering.gap) |> Container.build ([ columns |> gapped (toMM params.rendering.gap * 2) |> gapped (toMM params.rendering.gap) |> Container.build [ surfacePieces params highlighting |> noGrow , liningPieces params highlighting |> noGrow , paddings params highlighting |> noGrow ] |> Just
-
@@ -70,12 +71,65 @@ surfacePieces params highlighting =, dominantBaseline "hanging" , fill "currentColor" ] [ text "Main pieces" ] [ text "Top pieces" ] ) , columns |> gapped (toMM params.rendering.gap) |> Container.build [ tailPiece { offset = 0 , highlighting = highlighting , parameters = params , renderFlap = True , renderHoles = True } , headPiece { offset = 0 , parameters = params , highlighting = highlighting , renderFlaps = True } ] ] liningPieces : Parameters -> Maybe Key -> Item msg liningPieces params highlighting = rows |> aligned Container.Center |> gapped (toMM params.rendering.gap / 2) |> Container.build [ Item { width = Exactly 40, height = Exactly 5 } (\p size -> text_ [ x (String.fromFloat (p.x + size.width / 2)) , y (String.fromFloat p.y) , fontSize "5" , fontWeight "100" , textAnchor "middle" , dominantBaseline "hanging" , fill "currentColor" ] [ text "Linings" ] ) , columns |> gapped (toMM params.rendering.gap) |> Container.build [ longPiece params highlighting, shortPiece params highlighting ] [ tailPiece { offset = 0 , highlighting = highlighting , parameters = params , renderFlap = False , renderHoles = True } , headPiece { offset = 0 , parameters = params , highlighting = highlighting , renderFlaps = False } ] ]
-
@@ -88,18 +142,39 @@ guideStroke =] type alias LongPieceShapeProps = { x : Float , y : Float , offset : Float type alias TailPieceProps = { offset : Float , highlighting : Maybe Key , parameters : Parameters , renderFlap : Bool , renderHoles : Bool } longPieceShape : LongPieceShapeProps -> Svg msg longPieceShape { x, y, offset, highlighting, parameters } = tailPieceGraphicId : TailPieceProps -> String tailPieceGraphicId { offset, renderFlap, renderHoles } = [ "tail" , offset * 100 |> ceiling |> String.fromInt , if renderFlap then "flap" else "noflap" , if renderHoles then "holes" else "noholes" ] |> String.join "__" tailPiece : TailPieceProps -> Item msg tailPiece props = let { offset, highlighting, parameters, renderFlap, renderHoles } = props shoulderWidth = toMM parameters.shoulderWidth
-
@@ -132,196 +207,202 @@ longPieceShape { x, y, offset, highlighting, parameters } =Pointed _ -> buckleWidth flap = if renderFlap then toMM parameters.caseSideFlap else 0.0 localId : String -> String localId body = "long_piece__" ++ String.fromInt (ceiling (offset * 100)) ++ "__" ++ body tailPieceGraphicId props ++ "__" ++ body in Svg.g [] [ defs [] [ Svg.path [ id (localId "body") , Path.d (MoveTo Absolute ( x - offset, y - offset ) :: VerticalLineTo Relative offset :: LineTo Relative ( taper / 2, taperUntil ) :: VerticalLineTo Relative (length - curvedSectionLength - taperUntil) :: (case parameters.longPiece.tip of Round -> [ EllipticalArcCurve Relative { rx = buckleWidth / 2 , ry = buckleWidth / 2 , angle = 0.0 , largeArcFlag = LargeArc , sweepFlag = Counterclockwise , x = buckleWidth , y = 0 } [] ] Pointed sharpness -> let sy = buckleWidth * (toFloat (100 - sharpness) / 100) in [ CubicBezierCurve Relative ( ( 0, sy ) , ( buckleWidth / 2, buckleWidth ) , ( buckleWidth / 2, buckleWidth ) ) [] , CubicBezierCurve Relative ( ( 0, 0 ) , ( buckleWidth / 2, -(buckleWidth - sy) ) , ( buckleWidth / 2, -buckleWidth ) ) [] ] ) ++ [ VerticalLineTo Relative -(length - curvedSectionLength - taperUntil) , LineTo Relative ( taper / 2, -taperUntil ) , VerticalLineTo Relative -offset , ClosePath ] ) ] [] ] , if offset > 0 then g { size = { width = Exactly (shoulderWidth - offset * 2) , height = Exactly (length - offset + flap) } , element = \{ x, y } _ -> Svg.g [] [ Svg.mask [ id (localId "mask"), attribute "mask-type" "luminance" ] [ use [ attribute "href" ("#" ++ localId "body") , stroke "black" , strokeWidth (offset * 2 |> String.fromFloat) , fill "white" [ defs [] [ Svg.path [ id (localId "body") , Path.d (MoveTo Absolute ( x - offset, y - offset ) :: VerticalLineTo Relative flap :: VerticalLineTo Relative offset :: LineTo Relative ( taper / 2, taperUntil ) :: VerticalLineTo Relative (length - curvedSectionLength - taperUntil) :: (case parameters.longPiece.tip of Round -> [ EllipticalArcCurve Relative { rx = buckleWidth / 2 , ry = buckleWidth / 2 , angle = 0.0 , largeArcFlag = LargeArc , sweepFlag = Counterclockwise , x = buckleWidth , y = 0 } [] ] Pointed sharpness -> let sy = buckleWidth * (toFloat (100 - sharpness) / 100) in [ CubicBezierCurve Relative ( ( 0, sy ) , ( buckleWidth / 2, buckleWidth ) , ( buckleWidth / 2, buckleWidth ) ) [] , CubicBezierCurve Relative ( ( 0, 0 ) , ( buckleWidth / 2, -(buckleWidth - sy) ) , ( buckleWidth / 2, -buckleWidth ) ) [] ] ) ++ [ VerticalLineTo Relative -(length - curvedSectionLength - taperUntil) , LineTo Relative ( taper / 2, -taperUntil ) , VerticalLineTo Relative -offset , VerticalLineTo Relative -flap , ClosePath ] ) ] [] ] , use [ attribute "href" ("#" ++ localId "body") , Svg.Attributes.mask ("url(#" ++ localId "mask" ++ ")") , fill "none" , stroke "currentColor" , strokeWidth (offset * 2 + toMM parameters.rendering.lineWidth * 2 |> String.fromFloat) ] [] ] else use [ attribute "href" ("#" ++ localId "body") , fill "none" , stroke "currentColor" , strokeWidth (toMM parameters.rendering.lineWidth |> String.fromFloat) , highlightStroke (highlighting == Just LongPieceLength || highlighting == Just ShoulderWidth || highlighting == Just Profile || highlighting == Just TaperTo || (case parameters.profile of Straight -> False Tapered _ -> highlighting == Just BuckleHoleDistance || highlighting == Just BuckleHoleInterval ) ) ] [] , Svg.path (Path.d [ MoveTo Absolute ( x + shoulderWidth / 2 - offset, y ) , VerticalLineTo Relative (length - offset) ] :: highlightStroke (highlighting == Just LongPieceLength) :: guideStroke ) [] , case parameters.longPiece.tip of Round -> g [] [] Pointed _ -> Svg.path (Path.d [ MoveTo Absolute ( x + taper / 2, y + (length - curvedSectionLength) ) , HorizontalLineTo Relative (buckleWidth - offset * 2) , if offset > 0 then g [] [ Svg.mask [ id (localId "mask"), attribute "mask-type" "luminance" ] [ use [ attribute "href" ("#" ++ localId "body") , stroke "black" , strokeWidth (offset * 2 |> String.fromFloat) , fill "white" ] [] ] , use [ attribute "href" ("#" ++ localId "body") , Svg.Attributes.mask ("url(#" ++ localId "mask" ++ ")") , fill "none" , stroke "currentColor" , strokeWidth (offset * 2 + toMM parameters.rendering.lineWidth * 2 |> String.fromFloat) ] [] ] :: guideStroke ) [] , case parameters.profile of Straight -> g [] [] Tapered _ -> Svg.path (Path.d [ MoveTo Absolute ( x + taper / 2, y + taperUntil ) , HorizontalLineTo Relative (buckleWidth - offset * 2) ] :: highlightStroke else use [ attribute "href" ("#" ++ localId "body") , fill "none" , stroke "currentColor" , strokeWidth (toMM parameters.rendering.lineWidth |> String.fromFloat) , highlightStroke (highlighting == Just ShoulderWidth || highlighting == Just TaperTo || highlighting == Just BuckleHoleDistance == Just LongPieceLength || highlighting == Just BuckleHoleAdjustments == Just ShoulderWidth || highlighting == Just BuckleHoleInterval == Just Profile || highlighting == Just BuckleHoleDiameter == Just TaperTo || (case parameters.profile of Straight -> False Tapered _ -> highlighting == Just BuckleHoleDistance || highlighting == Just BuckleHoleInterval ) ) ] [] , Svg.path (Path.d [ MoveTo Absolute ( x + shoulderWidth / 2 - offset, y ) , VerticalLineTo Relative (length - offset + flap) ] :: highlightStroke (highlighting == Just LongPieceLength) :: guideStroke ) [] ] , if renderFlap then Svg.path (Path.d [ MoveTo Absolute ( x + offset, y + flap ) , HorizontalLineTo Relative shoulderWidth ] :: guideStroke ) [] longPiece : Parameters -> Maybe Key -> Item msg longPiece params highlighting = let shoulderWidth = toMM params.shoulderWidth else g [] [] , case parameters.longPiece.tip of Round -> g [] [] length = toMM params.longPiece.length in { size = { width = Exactly shoulderWidth, height = Exactly length } , element = \p _ -> g [] (longPieceShape { x = p.x , y = p.y , offset = 0 , highlighting = highlighting , parameters = params } :: (List.range 0 (params.longPiece.buckleHole.adjustments * 2) Pointed _ -> Svg.path (Path.d [ MoveTo Absolute ( x + taper / 2, y + (length - curvedSectionLength) + flap ) , HorizontalLineTo Relative (buckleWidth - offset * 2) ] :: guideStroke ) [] , case parameters.profile of Straight -> g [] [] Tapered _ -> Svg.path (Path.d [ MoveTo Absolute ( x + taper / 2, y + taperUntil + flap ) , HorizontalLineTo Relative (buckleWidth - offset * 2) ] :: highlightStroke (highlighting == Just ShoulderWidth || highlighting == Just TaperTo || highlighting == Just BuckleHoleDistance || highlighting == Just BuckleHoleAdjustments || highlighting == Just BuckleHoleInterval || highlighting == Just BuckleHoleDiameter ) :: guideStroke ) [] , if renderHoles then g [] (List.range 0 (parameters.longPiece.buckleHole.adjustments * 2) |> List.map (\index -> let { buckleHole } = params.longPiece parameters.longPiece distance = toMM buckleHole.distance
-
@@ -330,10 +411,10 @@ longPiece params highlighting =toMM buckleHole.interval in hole params parameters buckleHole.diameter ( p.x + shoulderWidth / 2 , p.y + distance + interval * toFloat (index - params.longPiece.buckleHole.adjustments) ( x + shoulderWidth / 2 , y + flap + distance + interval * toFloat (index - parameters.longPiece.buckleHole.adjustments) ) [ highlightStroke (highlighting
-
@@ -347,8 +428,11 @@ longPiece params highlighting =) ] ) ) ) ) else g [] [] ] }
-
@@ -393,13 +477,33 @@ hole params diameter ( cx, cy ) attrs =] type alias ShortPieceShapeProps = LongPieceShapeProps type alias HeadPieceProps = { offset : Float , highlighting : Maybe Key , parameters : Parameters , renderFlaps : Bool } headPieceGraphicId : HeadPieceProps -> String headPieceGraphicId { offset, renderFlaps } = [ "head" , offset * 100 |> ceiling |> String.fromInt , if renderFlaps then "flap" shortPieceShape : ShortPieceShapeProps -> Svg msg shortPieceShape { x, y, offset, parameters, highlighting } = else "noflap" ] |> String.join "__" headPiece : HeadPieceProps -> Item msg headPiece props = let { offset, highlighting, parameters, renderFlaps } = props shoulderWidth = toMM parameters.shoulderWidth
-
@@ -421,126 +525,151 @@ shortPieceShape { x, y, offset, parameters, highlighting } =Tapered to -> shoulderWidth - toMM to caseFlap = if renderFlaps then toMM parameters.caseSideFlap else 0.0 buckleFlap = if renderFlaps then toMM parameters.shortPiece.buckleSideFlap else 0.0 localId : String -> String localId body = "short_piece__" ++ String.fromInt (ceiling (offset * 100)) ++ "__" ++ body headPieceGraphicId props ++ "__" ++ body in g [] [ defs [] [ Svg.path [ id (localId "body") , Path.d [ MoveTo Absolute ( x - offset, y - offset ) , VerticalLineTo Relative offset , LineTo Relative ( taper / 2, taperUntil ) , VerticalLineTo Relative (length - taperUntil) , VerticalLineTo Relative offset , HorizontalLineTo Relative (shoulderWidth - taper) , VerticalLineTo Relative -offset , VerticalLineTo Relative -(length - taperUntil) , LineTo Relative ( taper / 2, -taperUntil ) , VerticalLineTo Relative -offset , ClosePath ] ] [] ] , if offset > 0 then { size = { width = Exactly (shoulderWidth - offset * 2) , height = Exactly (length - offset + caseFlap + buckleFlap) } , element = \{ x, y } _ -> g [] [ Svg.mask [ id (localId "mask"), attribute "mask-type" "luminance" ] [ use [ attribute "href" ("#" ++ localId "body") , stroke "black" , strokeWidth (offset * 2 |> String.fromFloat) , fill "white" [ defs [] [ Svg.path [ id (localId "body") , Path.d [ MoveTo Absolute ( x - offset, y - offset ) , VerticalLineTo Relative caseFlap , VerticalLineTo Relative offset , LineTo Relative ( taper / 2, taperUntil ) , VerticalLineTo Relative (length - taperUntil) , VerticalLineTo Relative offset , VerticalLineTo Relative buckleFlap , HorizontalLineTo Relative (shoulderWidth - taper) , VerticalLineTo Relative -buckleFlap , VerticalLineTo Relative -offset , VerticalLineTo Relative -(length - taperUntil) , LineTo Relative ( taper / 2, -taperUntil ) , VerticalLineTo Relative -offset , VerticalLineTo Relative -caseFlap , ClosePath ] ] [] ] , use [ attribute "href" ("#" ++ localId "body") , Svg.Attributes.mask ("url(#" ++ localId "mask" ++ ")") , fill "none" , stroke "currentColor" , strokeWidth (offset * 2 + toMM parameters.rendering.lineWidth * 2 |> String.fromFloat) ] [] ] , if offset > 0 then g [] [ Svg.mask [ id (localId "mask"), attribute "mask-type" "luminance" ] [ use [ attribute "href" ("#" ++ localId "body") , stroke "black" , strokeWidth (offset * 2 |> String.fromFloat) , fill "white" ] [] ] , use [ attribute "href" ("#" ++ localId "body") , Svg.Attributes.mask ("url(#" ++ localId "mask" ++ ")") , fill "none" , stroke "currentColor" , strokeWidth (offset * 2 + toMM parameters.rendering.lineWidth * 2 |> String.fromFloat) ] [] ] else use [ attribute "href" ("#" ++ localId "body") , fill "none" , stroke "currentColor" , strokeWidth (toMM parameters.rendering.lineWidth |> String.fromFloat) , highlightStroke (highlighting == Just ShortPieceLength || highlighting == Just ShoulderWidth || highlighting == Just Profile || highlighting == Just TaperTo || (case parameters.profile of Straight -> False Tapered _ -> highlighting == Just BuckleHoleDistance || highlighting == Just BuckleHoleInterval ) ) ] [] , Svg.path (Path.d [ MoveTo Absolute ( x + shoulderWidth / 2 - offset, y ) , VerticalLineTo Relative length ] :: highlightStroke (highlighting == Just ShortPieceLength) :: guideStroke ) [] , case parameters.profile of Straight -> g [] [] else use [ attribute "href" ("#" ++ localId "body") , fill "none" , stroke "currentColor" , strokeWidth (toMM parameters.rendering.lineWidth |> String.fromFloat) , highlightStroke (highlighting == Just ShortPieceLength || highlighting == Just ShoulderWidth || highlighting == Just Profile || highlighting == Just TaperTo || (case parameters.profile of Straight -> False Tapered _ -> Svg.path Tapered _ -> highlighting == Just BuckleHoleDistance || highlighting == Just BuckleHoleInterval ) ) ] [] , Svg.path (Path.d [ MoveTo Absolute ( x + taper / 2, y + taperUntil ) , HorizontalLineTo Relative (shoulderWidth - taper - offset * 2) [ MoveTo Absolute ( x + shoulderWidth / 2 - offset, y ) , VerticalLineTo Relative (length + caseFlap + buckleFlap) ] :: highlightStroke (highlighting == Just ShortPieceLength) :: guideStroke ) [] ] shortPiece : Parameters -> Maybe Key -> Item msg shortPiece params highlighting = let shoulderWidth = toMM params.shoulderWidth , if renderFlaps then g [] [ Svg.path (Path.d [ MoveTo Absolute ( x, y + caseFlap ) , HorizontalLineTo Relative shoulderWidth ] :: guideStroke ) [] , Svg.path (Path.d [ MoveTo Absolute ( x + taper / 2, y + length + caseFlap ) , HorizontalLineTo Relative (shoulderWidth - taper - offset * 2) ] :: guideStroke ) [] ] length = toMM params.shortPiece.length in { size = { width = Exactly shoulderWidth, height = Exactly length } , element = \p _ -> shortPieceShape { x = p.x , y = p.y , offset = 0 , parameters = params , highlighting = highlighting } else g [] [] , case parameters.profile of Straight -> g [] [] Tapered _ -> Svg.path (Path.d [ MoveTo Absolute ( x + taper / 2, y + caseFlap + taperUntil ) , HorizontalLineTo Relative (shoulderWidth - taper - offset * 2) ] :: guideStroke ) [] ] }
-
@@ -785,31 +914,18 @@ paddings params highlighting =, columns |> gapped (toMM params.rendering.gap) |> Container.build [ Item { width = Exactly (toMM params.shoulderWidth - offset * 2) , height = Exactly (toMM params.longPiece.length - offset) [ tailPiece { offset = offset , parameters = params , highlighting = highlighting , renderFlap = False , renderHoles = False } (\p _ -> longPieceShape { x = p.x , y = p.y , offset = offset , parameters = params , highlighting = highlighting } ) , Item { width = Exactly (toMM params.shoulderWidth - offset * 2) , height = Exactly (toMM params.shortPiece.length - offset) , headPiece { offset = offset , parameters = params , highlighting = highlighting , renderFlaps = False } (\p _ -> shortPieceShape { x = p.x , y = p.y , offset = offset , parameters = params , highlighting = highlighting } ) ] ]
-
-
-
@@ -218,10 +218,18 @@ parameters params ={ key = LongPieceLength , value = lengthValue params.longPiece.length } , parameter { key = CaseSideFlap , value = lengthValue params.caseSideFlap } , parameter { key = ShortPieceLength , value = lengthValue params.shortPiece.length } , parameter { key = BuckleSideFlap , value = lengthValue params.shortPiece.buckleSideFlap } ] , case params.profile of Straight ->
-