├── GenFixture.py ├── README.md ├── genfixture.sh ├── glaser-stencil-d.ttf ├── ohw_logo.svg ├── openfixture.scad ├── osh_logo.dxf └── rfid_fob-outline.dxf /GenFixture.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # 3 | # Kicad OpenFixture Generator 4 | # 5 | # TinyLabs Inc 6 | # 2016 7 | # CC-BY-SA 4.0 8 | # 9 | # Takes two arguments: 10 | # 1. pcb_th (mm) - PCB thickness 11 | # 2. mat_th (mm) - Laser cut material thickness 12 | # 13 | # Args - Path to store 14 | # --layer 15 | # 16 | # Default is all pads with no paste mask are test points. 17 | # Add args for: 18 | # MANDATORY: pcb_th and mat_th and output directory 19 | # OPTIONAL: pivot_d, screw_len 20 | import os 21 | import sys 22 | import argparse 23 | from pcbnew import * 24 | 25 | # Defaults 26 | DEFAULT_PCB_TH = 1.6 27 | DEFAULT_SCREW_D = 3.0 28 | DEFAULT_SCREW_LEN = 14 29 | 30 | # Generate fixture class 31 | class GenFixture: 32 | 33 | # Layers 34 | layer = F_Cu 35 | paste = F_Paste 36 | ignore_layer = Eco1_User 37 | force_layer = Eco2_User 38 | 39 | # Will be true if we're working on back points 40 | mirror = False 41 | 42 | # Fixture parameters 43 | mat_th = 0 44 | pcb_th = DEFAULT_PCB_TH 45 | screw_len = DEFAULT_SCREW_LEN 46 | screw_d = DEFAULT_SCREW_D 47 | 48 | # Global pointer to brd object 49 | brd = None 50 | 51 | # Path to generated dxf 52 | dxf_path = None 53 | prj_name = None 54 | 55 | # Optional arguments 56 | rev = None 57 | washer_th=None 58 | nut_f2f=None 59 | nut_c2c=None 60 | nut_th=None 61 | pivot_d=None 62 | border=None 63 | 64 | # Board dimensions 65 | min_y = float ("inf") 66 | origin = [ float ("inf"), float ("inf") ] 67 | dims = [0, 0] 68 | test_points = [] 69 | 70 | def __init__(self, prj_name, brd, mat_th): 71 | self.prj_name = prj_name 72 | self.brd = brd 73 | self.mat_th = float (mat_th) 74 | 75 | def __exit__(self, type, value, traceback): 76 | pass 77 | 78 | def __str__(self): 79 | return "Fixture: origin=(%.02f,%.02f) dims=(%.02f,%.02f) min_y=%.02f" % (self.origin[0], 80 | self.origin[1], 81 | self.dims[0], 82 | self.dims[1], 83 | self.min_y) 84 | 85 | def SetOptional(self, rev=None, washer_th=None, nut_f2f=None, nut_c2c=None, nut_th=None, 86 | pivot_d=None, border=None): 87 | self.rev = rev 88 | self.washer_th = washer_th 89 | self.nut_f2f = nut_f2f 90 | self.nut_c2c = nut_c2c 91 | self.nut_th = nut_th 92 | self.pivot_d = pivot_d 93 | self.border = border 94 | 95 | def SetParams(self, pcb_th, screw_len, screw_d): 96 | if pcb_th is not None: 97 | self.pcb_th = float (pcb_th) 98 | if screw_len is not None: 99 | self.screw_len = float (screw_len) 100 | if screw_d is not None: 101 | self.screw_d = float (screw_d) 102 | 103 | def SetLayers(self, layer=-1, ilayer=-1, flayer=-1): 104 | if layer != -1: 105 | self.layer = layer 106 | if ilayer != -1: 107 | self.ignore_layer = ilayer 108 | if flayer != -1: 109 | self.force_layer = flayer 110 | 111 | # Setup paste layer 112 | if (self.layer == F_Cu): 113 | self.paste = F_Paste 114 | else: 115 | self.paste = B_Paste 116 | self.mirror = True 117 | 118 | def Round(self, x, base=0.01): 119 | return round(base*round(x/base), 2) 120 | 121 | def PlotDXF(self, path): 122 | 123 | # Save auxillary origin 124 | aux_origin_save = self.brd.GetAuxOrigin () 125 | 126 | # Set new aux origin to upper left side of board 127 | self.brd.SetAuxOrigin (wxPoint (FromMM(self.origin[0]), FromMM(self.origin[1]))) 128 | 129 | # Get pointers to controllers 130 | pctl = PLOT_CONTROLLER(self.brd) 131 | popt = pctl.GetPlotOptions() 132 | 133 | # Setup output directory 134 | popt.SetOutputDirectory(path) 135 | 136 | # Set some important plot options: 137 | popt.SetPlotFrameRef(False) 138 | popt.SetLineWidth(FromMM(0.1)) 139 | popt.SetAutoScale(False) 140 | popt.SetScale(1) 141 | popt.SetMirror(self.mirror) 142 | popt.SetUseGerberAttributes(False) 143 | popt.SetExcludeEdgeLayer(False); 144 | 145 | # Use auxillary origin 146 | popt.SetUseAuxOrigin(True) 147 | 148 | # This by gerbers only (also the name is truly horrid!) 149 | popt.SetSubtractMaskFromSilk(False) 150 | 151 | # Do the BRD edges in black 152 | popt.SetColor(BLACK) 153 | 154 | # Open file 155 | pctl.SetLayer(Edge_Cuts) 156 | pctl.OpenPlotfile("outline", PLOT_FORMAT_DXF, "Edges") 157 | 158 | # Plot layer 159 | pctl.PlotLayer() 160 | 161 | # CLose plot 162 | pctl.ClosePlot() 163 | 164 | # Restore origin 165 | self.brd.SetAuxOrigin (aux_origin_save) 166 | 167 | def Generate(self, path): 168 | 169 | # Get origin and board dimensions 170 | self.GetOriginDimensions () 171 | 172 | # Get test points 173 | self.GetTestPoints () 174 | 175 | # Plot DXF 176 | self.PlotDXF (path) 177 | 178 | # Get revision 179 | if self.rev is None: 180 | self.rev = "rev.%s" % self.brd.GetTitleBlock().GetRevision () 181 | if self.rev == "": 182 | self.rev = "rev.0" 183 | 184 | # Call openscad to generate fixture 185 | args = "-D\'test_points=%s\'" % self.GetTestPointStr () 186 | args += " -D\'tp_min_y=%.02f\'" % self.min_y 187 | args += " -D\'mat_th=%.02f\'" % self.mat_th 188 | args += " -D\'pcb_th=%.02f\'" % self.pcb_th 189 | args += " -D\'pcb_x=%.02f\'" % self.dims[0] 190 | args += " -D\'pcb_y=%.02f\'" % self.dims[1] 191 | args += " -D\'pcb_outline=\"%s\"\'" % (path + "/" + self.prj_name + "-outline.dxf") 192 | args += " -D\'screw_thr_len=%.02f\'" % self.screw_len 193 | args += " -D\'screw_d=%.02f\'" % self.screw_d 194 | 195 | # Set optional args 196 | if self.rev != None: 197 | args += " -D\'rev=\"%s\"\'" % self.rev 198 | if self.washer_th != None: 199 | args += " -D\'washer_th=%.02f\'" % float (self.washer_th) 200 | if self.nut_f2f != None: 201 | args += " -D\'nut_od_f2f=%.02f\'" % float (self.nut_f2f) 202 | if self.nut_c2c != None: 203 | args += " -D\'nut_od_c2c=%.02f\'" % float (self.nut_c2c) 204 | if self.nut_th != None: 205 | args += " -D\'nut_th=%.02f\'" % float (self.nut_th) 206 | if self.pivot_d != None: 207 | args += " -D\'pivot_d=%.02f\'" % float (self.pivot_d) 208 | if self.border != None: 209 | args += " -D\'border=%.02f\'" % float (self.border) 210 | 211 | # Create output file name 212 | dxfout = path + "/" + self.prj_name + "-fixture.dxf" 213 | pngout = path + "/" + self.prj_name + "-fixture.png" 214 | testout= path + "/" + self.prj_name + "-test.dxf" 215 | 216 | # This will take a while, print something 217 | print "Generating Fixture..." 218 | 219 | # Create test part 220 | os.system ("openscad %s -D\'mode=\"testcut\"\' -o %s openfixture.scad" % (args, testout)) 221 | 222 | # Create rendering 223 | os.system ("openscad %s -D\'mode=\"3dmodel\"\' --render -o %s openfixture.scad" % (args, pngout)) 224 | 225 | # Create laser cuttable fixture 226 | os.system ("openscad %s -D\'mode=\"lasercut\"\' -o %s openfixture.scad" % (args, dxfout)) 227 | 228 | # Print output 229 | print "Fixture generated: %s" % dxfout 230 | 231 | def GetTestPointStr (self): 232 | tps = "[" 233 | for tp in self.test_points: 234 | tps += "[%.02f,%.02f]," % (tp[0], tp[1]) 235 | return (tps + "]") 236 | 237 | def GetTestPoints (self): 238 | 239 | # Iterate over all pads 240 | for m in self.brd.GetModules (): 241 | 242 | # Iterate over all pads 243 | for p in m.Pads (): 244 | 245 | # Check that there is no paste and it's on front copper layer 246 | if (p.IsOnLayer (self.layer) == True): 247 | 248 | # Are we forcing this pad? 249 | if (p.IsOnLayer (self.force_layer) == True): 250 | pass 251 | 252 | #else check ignore cases 253 | elif ((p.IsOnLayer (self.ignore_layer) == True) or 254 | (p.IsOnLayer (self.paste) == True) or 255 | (p.GetAttribute () != PAD_SMD)): 256 | continue 257 | 258 | # Print position 259 | tp = ToMM (p.GetPosition ()) 260 | 261 | # Round x and y, invert x if mirrored 262 | if self.mirror is False: 263 | x = self.Round(tp[0] - self.origin[0]) 264 | else: 265 | x = self.dims[0] - (self.Round(tp[0] - self.origin[0])) 266 | y = self.Round(tp[1] - self.origin[1]) 267 | #print "tp = (%f, %f)" % (x,y) 268 | 269 | # Check if less than min 270 | if y < self.min_y: 271 | self.min_y = y 272 | 273 | # Save coordinates of pad 274 | self.test_points.append ([x, y]) 275 | 276 | def GetOriginDimensions(self): 277 | if (self.brd is None): 278 | return None 279 | 280 | # Init max variables 281 | max_x = 0 282 | max_y = 0 283 | 284 | # Get all drawings 285 | for line in self.brd.GetDrawings (): 286 | 287 | # Check that it's in the outline layer 288 | if line.GetLayerName () == 'Edge.Cuts': 289 | 290 | # Get bounding box 291 | bb = line.GetBoundingBox () 292 | x = ToMM (bb.GetX ()) 293 | y = ToMM (bb.GetY ()) 294 | 295 | # Debug 296 | #print "(%f, %f)" % (x, y) 297 | 298 | # Min x/y will be origin 299 | if x < self.origin[0]: 300 | self.origin[0] = self.Round (x) 301 | if y < self.origin[1]: 302 | self.origin[1] = self.Round (y) 303 | 304 | # Max x.y will be dimensions 305 | if x > max_x: 306 | max_x = x 307 | if y > max_y: 308 | max_y = y 309 | 310 | # Calculate dimensions 311 | self.dims[0] = self.Round (max_x - self.origin[0]) 312 | self.dims[1] = self.Round (max_y - self.origin[1]) 313 | 314 | if __name__ == '__main__': 315 | 316 | # Create parser 317 | parser = argparse.ArgumentParser () 318 | 319 | # Add required arguments 320 | parser.add_argument ('--board', help='', required=True) 321 | parser.add_argument ('--mat_th', help='material thickness (mm)', required=True) 322 | parser.add_argument ('--out', help='output directory', required=True) 323 | 324 | # Add optional arguments 325 | parser.add_argument ('--pcb_th', help='pcb thickness (mm)') 326 | parser.add_argument ('--screw_len', help='Assembly screw thread length (default = 16mm)') 327 | parser.add_argument ('--screw_d', help='Assembly screw diameter (default=3mm)') 328 | parser.add_argument ('--layer', help='F.Cu | B.Cu') 329 | parser.add_argument ('--flayer', help='Eco1.User | Eco2.User') 330 | parser.add_argument ('--ilayer', help='Eco1.User | Eco2.User') 331 | parser.add_argument ('--rev', help='Override revisiosn') 332 | parser.add_argument ('--washer_th', help='Washer thickness for hinge') 333 | parser.add_argument ('--nut_f2f', help='hex nut flat to flat (mm)') 334 | parser.add_argument ('--nut_c2c', help='hex nut corner to corner (mm)') 335 | parser.add_argument ('--nut_th', help='hex nut thickness (mm)') 336 | parser.add_argument ('--pivot_d', help='Pivot diameter (mm)') 337 | parser.add_argument ('--border', help='Board (ledge) under pcb (mm)') 338 | 339 | # Get args 340 | args = parser.parse_args () 341 | 342 | # Convert path to absolute 343 | out_dir = os.path.abspath (args.out) 344 | 345 | # If output directory doesn't exist create it 346 | if not os.path.exists (out_dir): 347 | os.makedirs (out_dir) 348 | 349 | # Load up the board file 350 | brd = LoadBoard (args.board) 351 | 352 | # Extract project name 353 | prj_name = os.path.splitext (os.path.basename (args.board))[0] 354 | 355 | # Save internal parameters 356 | layer = brd.GetLayerID (args.layer) 357 | flayer = brd.GetLayerID (args.flayer) 358 | ilayer = brd.GetLayerID (args.ilayer) 359 | 360 | # Check for pcb thickness 361 | if args.pcb_th is None: 362 | args.pcb_th = "1.6" 363 | 364 | # Create a fixture generator 365 | fixture = GenFixture (prj_name, brd, args.mat_th) 366 | 367 | # Set parameters 368 | fixture.SetParams (args.pcb_th, args.screw_len, args.screw_d); 369 | 370 | # Setup layers 371 | fixture.SetLayers (layer=layer, flayer=flayer, ilayer=ilayer) 372 | 373 | # Set optional arguments 374 | fixture.SetOptional (rev=args.rev, 375 | washer_th=args.washer_th, 376 | nut_f2f=args.nut_f2f, 377 | nut_c2c=args.nut_c2c, 378 | nut_th=args.nut_th, 379 | pivot_d=args.pivot_d, 380 | border=args.border) 381 | 382 | # Generate fixture 383 | fixture.Generate (out_dir) 384 | # print fixture 385 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenFixture 2 | 3 | ![Alt text](/../images/screencap.png?raw=true "") 4 | ![Alt text](/../images/laser_dxf.png?raw=true "") 5 | ![Alt text](/../images/sample.jpg?raw=true "") 6 | 7 | ## Goal 8 | The motivation of OpenFixture was to make a parametric fixturing system that could take fully generated inputs from kicad and produce a test fixture with minimal effort. The easiest way to use it is through the kicad python scripting interface. 9 | 10 | ## Parameters 11 | For most projects (if using the standard BOM) the only parameters you'll need to set are mat_th and pcb_th. Something like the following should be sufficient: 12 | ``` 13 | ./GenFixture.py --board [path to board.kicad_pcb] --mat_th [thickness in mm] --pcb_th [thickness in mm] --out board-fixture 14 | 15 | usage: GenFixture.py [-h] --board BOARD --mat_th MAT_TH --out OUT 16 | [--pcb_th PCB_TH] [--screw_len SCREW_LEN] 17 | [--screw_d SCREW_D] [--layer LAYER] [--flayer FLAYER] 18 | [--ilayer ILAYER] 19 | 20 | optional arguments: 21 | -h, --help show this help message and exit 22 | --board BOARD 23 | --mat_th MAT_TH material thickness (mm) 24 | --out OUT output directory 25 | --pcb_th PCB_TH pcb thickness (mm) 26 | --screw_len SCREW_LEN Assembly screw thread length (default = 14mm) 27 | --screw_d SCREW_D Assembly screw diameter (default=M3) 28 | --layer LAYER F.Cu | B.Cu 29 | --flayer FLAYER Eco1.User | Eco2.User 30 | --ilayer ILAYER Eco1.User | Eco2.User 31 | ``` 32 | The resulting output is: 33 | * A 3D model of the test fixture for visualization 34 | * A 2D DXF that can be directly lasercut for assembly 35 | 36 | ## Recommended workflow for kicad 37 | 1. Clone this repo if you haven't already 38 | 2. Setup a project specific bash script (use genfixture.sh as an example) 39 | 3. Enter board specific info, fixture hardware, material thickness, etc. 40 | 4. Whenever the layout changes call ./genfixture.sh (from repo) and pass path to .kicad_pcb file. 41 | 5. Fixture will be generated in $OUTPUT folder. 42 | 6. If anyone is interested in integrating this into kicad directly I'd be happy to support it and clean it up... 43 | 44 | ## Hardware 45 | * All that is needed is M3 (14mm+) screws, M3 hex nuts, and lasercut parts 46 | * I use nylon bushings in the main pivot with m3 screws for a smoother joint but this is optional 47 | 48 | ## Documentation 49 | http://tinylabs.io/openfixture 50 | 51 | ## BOM 52 | http://tinylabs.io/openfixture-bom 53 | 54 | ## Kicad export 55 | http://tinylabs.io/openfixture-kicad-export 56 | 57 | ## Assembly 58 | More info including detailed assembly instructions at http://tinylabs.io/openfixture-assembly 59 | 60 | ## Dependencies 61 | * Newer version of openscad >= 2015.03-1 62 | * kicad or other EDA software. Please email me if you have instructions for other packages so I can add them. 63 | 64 | ## Known Issues 65 | * When loading the fonts file a new small window opens in Ubuntu. Seems innocuous but still annoying [Only seen on ubuntu 14.04] 66 | 67 | ## License 68 | Creative Commons (CC BY-SA 4.0) 69 | 70 | ## Contributors 71 | * Elliot Buller - Tiny Labs Inc 72 | 73 | Please email with any pull requests or new feature requests 74 | elliot@tinylabs.io 75 | -------------------------------------------------------------------------------- /genfixture.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Wrapper around python wrapper to generate fixture with my geometry 4 | # Only argument is .kicad_board file 5 | # 6 | 7 | BOARD=$1 8 | OUTPUT="fixture-v10" 9 | 10 | # PCB thickness 11 | PCB=0.8 12 | LAYER='B.Cu' 13 | REV='rev.10' 14 | 15 | # Nearest opposite side component to border 16 | BORDER=0.8 17 | 18 | # Material dimensions 19 | MAT=2.45 20 | SCREW_LEN=16.0 21 | SCREW_D=3.0 22 | WASHER_TH=1.0 23 | NUT_TH=2.4 24 | NUT_F2F=5.45 25 | NUT_C2C=6.10 26 | 27 | # Call python wrapper 28 | python GenFixture.py --board $BOARD --layer $LAYER --rev $REV --mat_th $MAT --pcb_th $PCB --out $OUTPUT --screw_len $SCREW_LEN --screw_d $SCREW_D --washer_th $WASHER_TH --nut_th $NUT_TH --nut_f2f $NUT_F2F --nut_c2c $NUT_C2C --border $BORDER 29 | 30 | -------------------------------------------------------------------------------- /glaser-stencil-d.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tinylabs/openfixture/5badbe9d5e082818798365bd973fb85e363fe6fa/glaser-stencil-d.ttf -------------------------------------------------------------------------------- /ohw_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | image/svg+xml -------------------------------------------------------------------------------- /openfixture.scad: -------------------------------------------------------------------------------- 1 | /** 2 | * OpenFixture - The goal is to have a turnkey pcb fixturing solution 3 | * as long as you have access to a laser cutter or laser cutting service. 4 | * 5 | * The input is: 6 | * 1. (x, y) work area that is >= pcb size 7 | * 2. (x, y) cooridates of test point centers 8 | * 3. dxf of pcb outline aligned with (0,0) on the top left. 9 | * 4. Material parameters: acrylic thickness, kerf, etc 10 | * 11 | * The output is a dxf containing all the parts (minus M3 hardware) 12 | * to assemble the fixture. 13 | * 14 | * Creative Commons Licensed (CC BY-SA 4.0) 15 | * Tiny Labs 16 | * 2016 17 | */ 18 | use 19 | FONTNAME = "Glaser Stencil D"; 20 | 21 | // 22 | // PCB input 23 | // 24 | // Test points 25 | test_points = [[23.22,25.85],[19.72,22.28],[3.95,25.77],[7.52,22.27],[13.60,13.70],[13.55,18.70],[13.55,34.90],[13.60,29.90],]; 26 | 27 | // Used below to calculate distance from hinge to nearest point based on min 28 | // contact angle... Ideally we want it as close to 90 degrees as possible 29 | // All you have to know is look through 'y' column above and set to lowest val 30 | tp_min_y = 13.7; 31 | 32 | // DXF outline of pcb 33 | pcb_outline = "./rfid_fob-outline.dxf"; 34 | osh_logo = "./osh_logo.dxf"; 35 | 36 | // PCB revision 37 | rev = "rev.0"; 38 | 39 | // Should be close to actual pcb dimensions... Used for support structure only so not critical 40 | pcb_x = 27.14; 41 | pcb_y = 45; 42 | pcb_support_border = 2; 43 | 44 | // Work area of PCB 45 | // Must be >= PCB size 46 | // If you make this as big as any of the PCBs you work 47 | // with you could then reuse the base and just swap the 48 | // head and carriers based on the pcb you're using. 49 | work_area_x = pcb_x; 50 | work_area_y = pcb_y; 51 | 52 | // Thickness of pcb 53 | pcb_th = 1.6; // Standard PCB size 54 | 55 | // 56 | // End PCB input 57 | // 58 | 59 | // Correction offset 60 | // These are final adjustments relative to the board carrier. 61 | // Usually these aren't needed but can be used to tweak alignment 62 | tp_correction_offset_x = 0.0; 63 | tp_correction_offset_y = 0.0; 64 | 65 | // Uncomment for alignment check, can be a quick sanity check to 66 | // make sure everything lines up. 67 | //projection (cut = false) alignment_check (); 68 | mode = "3dmodel"; 69 | //mode = "lasercut"; 70 | //mode = "validate"; 71 | //mode = "testcut"; 72 | //mode = "none"; 73 | 74 | // Uncomment for laser cuttable dxf 75 | if (mode == "lasercut") projection (cut = false) lasercut (); 76 | if (mode == "3dmodel") 3d_model (); 77 | if (mode == "validate") validate_testpoints (pcb_outline); 78 | if (mode == "testcut") projection (cut = false) testcut (); 79 | 80 | // Smothness function for circles 81 | $fn = 15; 82 | 83 | // All measurements in mm 84 | // Material parameters 85 | mat_th = 3.0; 86 | 87 | // Kerf adjustment 88 | kerf = 0.125; 89 | 90 | // Space between laser parts 91 | laser_pad = 2; 92 | 93 | // Screw radius (we want this tight to avoid play) 94 | // This should work for M3 hardware 95 | // Just the threads, not including head 96 | // Should be no less than 12 97 | screw_thr_len = 16; 98 | screw_d = 3.0; 99 | screw_r = screw_d / 2; 100 | 101 | // Uncomment to use normal M3 screw for pivot 102 | // We need pivot_d tight for precise alignment 103 | pivot_d = screw_d - 0.1; 104 | // Uncomment to use bushing in pivot 105 | //pivot_d = 5.12; 106 | pivot_r = pivot_d / 2; 107 | 108 | // Pivot support, 3mm on either side 109 | pivot_support_d = pivot_d + 6; 110 | pivot_support_r = pivot_support_d / 2; 111 | 112 | // Metric M3 hex nut dimensions 113 | // f2f = flat to flat 114 | nut_od_f2f = 5.45; 115 | nut_od_c2c = 6; 116 | nut_th = 2.25; 117 | 118 | // Option to add nylon washer on latching mechanism for smoother 119 | // operation - disabled by default 120 | washer_th = 0; 121 | //washer_th = 1; 122 | 123 | // Pogo pin receptable dimensions 124 | // I use the 2 part pogos with replaceable pins. Its a lifer save when a 125 | // pin breaks. Undersized so they can be carefully drilled out using #50 126 | // drill bit for better precision. If you have access to a nicer laser you 127 | // can size these exactly 128 | pogo_r = 1.5 / 2; 129 | 130 | // Uncompressed length from receptacle 131 | pogo_uncompressed_length = 8; 132 | pogo_compression = 1; 133 | 134 | // Locking tab parameters 135 | tab_width = 3 * mat_th; 136 | tab_length = 4 * mat_th + washer_th; 137 | 138 | // Stop tab 139 | stop_tab_y = 2 * mat_th; 140 | 141 | // 142 | // DO NOT EDIT BELOW... unless you feel like it ;-) 143 | // 144 | // Calculate min distance to hinge with a constraint on 145 | // the angle of the pogo pin when it meets compression with the board. 146 | // a = compression 147 | // c = active_y_offset + pivot_support_r 148 | // cos (min_angle) = a^2 / (2ca) 149 | min_angle = 89.5; 150 | 151 | // Calculate active_y_back_offset 152 | active_y_back_offset = (pow (pogo_compression, 2) / (cos (min_angle) * 2 * pogo_compression)) - pivot_support_r - tp_min_y; 153 | 154 | // Active area parameters 155 | active_x_offset = 2 * mat_th + nut_od_f2f + 2; 156 | active_y_offset = 2 * mat_th + nut_od_f2f + 2; 157 | 158 | // Head dimensions 159 | head_x = work_area_x + 2 * active_x_offset; 160 | head_y = work_area_y + active_y_offset + active_y_back_offset; 161 | head_z = screw_thr_len - nut_th; 162 | 163 | // Base dimensions 164 | base_x = head_x + 2 * mat_th; 165 | base_y = head_y + pivot_support_d; 166 | base_z = screw_thr_len + 3 * mat_th; 167 | base_pivot_offset = pivot_support_r + 168 | (pogo_uncompressed_length - pogo_compression) - 169 | (mat_th - pcb_th); 170 | 171 | // To account for capture nut overhang 172 | nut_pad = (nut_od_c2c - mat_th) / 2; 173 | 174 | // Derived latch dimensions 175 | latch_z_offset = (base_z * (2 / 3) + base_pivot_offset - pivot_r) / 2; 176 | support_x = base_x / 12 + 2 * mat_th; 177 | latch_support_y = base_z * (2 / 3) + base_pivot_offset - pivot_support_r - 2 * mat_th; 178 | // 179 | // MODULES 180 | // 181 | module tnut_female (n, length = screw_thr_len) 182 | { 183 | // How much grip material 184 | tnut_grip = 4; 185 | 186 | // Pad for screw 187 | pad = 0.4; 188 | screw_len_pad = 1; 189 | 190 | // Screw hole 191 | translate ([0, -screw_r - pad/2, 0]) 192 | cube ([length + screw_len_pad, screw_d + pad, mat_th]); 193 | 194 | // Make space for nut 195 | translate ([mat_th * n + tnut_grip, -nut_od_f2f/2, 0]) 196 | cube ([nut_th, nut_od_f2f, mat_th]); 197 | } 198 | 199 | module tnut_hole () 200 | { 201 | pad = 0.1; 202 | cylinder (r = screw_r + pad, h = mat_th, $fn = 20); 203 | } 204 | 205 | module tng_n (length, cnt) 206 | { 207 | tng_y = (length / cnt); 208 | 209 | translate ([0, -length / 2, 0]) 210 | union () { 211 | for (i = [0 : 2 : cnt - 1]) { 212 | translate ([0, i * tng_y, 0]) 213 | cube ([mat_th, tng_y, mat_th]); 214 | } 215 | } 216 | } 217 | 218 | module tng_p (length, cnt) 219 | { 220 | tng_y = length / cnt; 221 | 222 | translate ([0, -length / 2, 0]) 223 | union () { 224 | for (i = [1 : 2 : cnt - 1]) { 225 | translate ([0, i * tng_y, 0]) 226 | cube ([mat_th, tng_y, mat_th]); 227 | } 228 | } 229 | } 230 | 231 | module nut_hole () 232 | { 233 | pad = 0.05; 234 | cylinder (r = nut_od_c2c/2 + pad, h = mat_th, $fn = 6); 235 | } 236 | 237 | module testcut () 238 | { 239 | y = 30; 240 | off = 3 * mat_th + laser_pad; 241 | 242 | difference () { 243 | union () { 244 | cube ([3 * mat_th, y, mat_th]); 245 | 246 | translate ([off, 0, 0]) 247 | cube ([screw_thr_len + 2 * mat_th, y - 2 * mat_th, mat_th]); 248 | } 249 | // Remove tng slot 250 | translate ([mat_th, y/2, 0]) 251 | tng_n (y - 2 * mat_th, 3); 252 | 253 | // Remove tnut hole 254 | translate ([mat_th * 3/2, y/2, 0]) 255 | tnut_hole (); 256 | 257 | // Remove tng from male side 258 | translate ([off, y/2 - mat_th, 0]) 259 | tng_p (y - 2 * mat_th, 3); 260 | 261 | // Remove tnut 262 | translate ([off, y/2 - mat_th, 0]) 263 | tnut_female (1); 264 | 265 | // Remove nut hole 266 | translate ([off + nut_od_c2c / 2 + screw_thr_len - mat_th, nut_od_f2f / 2 + 2, 0]) 267 | nut_hole (); 268 | } 269 | } 270 | 271 | module head_side () 272 | { 273 | x = head_z; 274 | y = head_y; 275 | r = pivot_support_r; 276 | 277 | difference () { 278 | union () { 279 | hull () { 280 | translate ([0, y, 0]) 281 | cube ([x, 0.01, mat_th]); 282 | 283 | // Add pivot point 284 | translate ([r, y + pivot_support_r, 0]) 285 | cylinder (r = pivot_support_r, h = mat_th, $fn = 20); 286 | } 287 | cube ([x, y, mat_th]); 288 | } 289 | 290 | // Remove pivot 291 | translate ([r, y + r, 0]) 292 | cylinder (r = pivot_r, h = mat_th, $fn = 20); 293 | 294 | // Remove slots 295 | translate ([0, y / 2, 0]) 296 | tng_n (y, 3); 297 | translate ([x - mat_th, y / 2, 0]) 298 | tng_n (y, 3); 299 | 300 | // Remove lincoln log slots 301 | translate ([0, mat_th, 0]) 302 | cube ([x / 2, mat_th, mat_th]); 303 | translate ([0, y - 3 * mat_th, 0]) 304 | cube ([x / 2, mat_th, mat_th]); 305 | } 306 | } 307 | 308 | module head_front_back () 309 | { 310 | x = head_x; 311 | y = head_z; 312 | 313 | difference () { 314 | cube ([x, y, mat_th]); 315 | 316 | // Remove grooves 317 | translate ([x / 2, 0, 0]) 318 | rotate ([0, 0, 90]) 319 | tng_n (x, 3); 320 | translate ([x / 2, y - mat_th, 0]) 321 | rotate ([0, 0, 90]) 322 | tng_n (x, 3); 323 | 324 | // Remove assembly slots 325 | translate ([mat_th, y / 2, 0]) 326 | cube ([mat_th, y / 2, mat_th]); 327 | translate ([x - 2 * mat_th, y / 2, 0]) 328 | cube ([mat_th, y / 2, mat_th]); 329 | } 330 | } 331 | 332 | module lock_tab () 333 | { 334 | translate ([-tab_length/2, 0, 0]) 335 | cube ([tab_length, tab_width, mat_th]); 336 | translate ([-tab_length/2, tab_width/2, 0]) 337 | cylinder (r = tab_width / 2, h = mat_th, $fn = 20); 338 | } 339 | 340 | module head_base () 341 | { 342 | nut_offset = 2 * mat_th + screw_r; 343 | 344 | difference () { 345 | 346 | union () { 347 | // Common base 348 | head_base_common (); 349 | 350 | // Add lock tabs 351 | translate ([0, head_y / 12 - tab_width / 2, 0]) 352 | lock_tab (); 353 | translate ([head_x, head_y / 12 - tab_width / 2, 0]) 354 | mirror ([1, 0, 0]) 355 | lock_tab (); 356 | } 357 | 358 | // Remove back cutout 359 | translate ([2 * mat_th, head_y - mat_th, 0]) 360 | cube ([head_x - 4 * mat_th, mat_th, mat_th]); 361 | 362 | // Remove holes for hex nuts 363 | translate ([nut_offset, nut_offset, 0]) 364 | tnut_hole (); 365 | translate ([head_x - nut_offset, nut_offset, 0]) 366 | tnut_hole (); 367 | // Offset these +1 mat_th to allow cutout for swivel 368 | translate ([nut_offset, head_y - nut_offset - mat_th, 0]) 369 | tnut_hole (); 370 | translate ([head_x - nut_offset, head_y - nut_offset - mat_th, 0]) 371 | tnut_hole (); 372 | 373 | // Take 1/3 mouse bit out of front of tabs 374 | translate ([-2 * mat_th - washer_th, head_y / 12 - tab_width / 2, 0]) 375 | cube ([mat_th, tab_width / 3, mat_th]); 376 | translate ([head_x + mat_th + washer_th, head_y / 12 - tab_width / 2, 0]) 377 | cube ([mat_th, tab_width / 3, mat_th]); 378 | 379 | // Add revision backwards and upside down 380 | translate ([head_x / 2, head_y - 25, 0]) 381 | linear_extrude (height = mat_th) 382 | rotate ([0, 0, 180]) 383 | mirror ([1, 0, 0]) 384 | text (rev, font = FONTNAME, halign = "center", valign = "center", size = 6); 385 | } 386 | } 387 | 388 | module osh_logo () { 389 | linear_extrude (height = mat_th) 390 | scale ([0.15, 0.15, 1]) 391 | translate ([-72, -66, 0]) 392 | import (osh_logo); 393 | } 394 | 395 | module head_top () 396 | { 397 | hole_offset = 2 * mat_th + screw_r; 398 | pad = 0.1; 399 | 400 | difference () { 401 | 402 | // Common base 403 | head_base_common (); 404 | 405 | // Remove holes for hex nuts 406 | translate ([hole_offset, hole_offset, 0]) 407 | cylinder (r = screw_r + pad, h = mat_th); 408 | translate ([hole_offset, head_y - hole_offset - mat_th, 0]) 409 | cylinder (r = screw_r + pad, h = mat_th); 410 | translate ([head_x - hole_offset, head_y - hole_offset - mat_th, 0]) 411 | cylinder (r = screw_r + pad, h = mat_th); 412 | translate ([head_x - hole_offset, hole_offset, 0]) 413 | cylinder (r = screw_r + pad, h = mat_th); 414 | 415 | // Add osh logo 416 | translate ([head_x / 2, head_y - 30, 0]) 417 | osh_logo (); 418 | 419 | // Remove cable relief holes 420 | translate ([mat_th * 3 + screw_d, head_y - (5 * mat_th) - screw_r, 0]) 421 | tnut_hole (); 422 | translate ([head_x - (mat_th * 3 + screw_d), head_y - (5 * mat_th) - screw_r, 0]) 423 | tnut_hole (); 424 | } 425 | } 426 | 427 | module cable_retention () 428 | { 429 | x = head_x - 2 * (mat_th * 3 + screw_d); 430 | difference () { 431 | 432 | hull () { 433 | cylinder (r=screw_d, h=mat_th); 434 | translate ([x, 0, 0]) 435 | cylinder (r=screw_d, h=mat_th); 436 | } 437 | 438 | // Remove holes 439 | tnut_hole (); 440 | translate ([x, 0, 0]) 441 | tnut_hole (); 442 | } 443 | } 444 | 445 | module head_base_common () 446 | { 447 | difference () { 448 | 449 | // Base cube 450 | cube ([head_x, head_y, mat_th]); 451 | 452 | // Remove slots 453 | translate ([mat_th, head_y / 2, 0]) 454 | tng_p (head_y, 3); 455 | translate ([head_x - 2 * mat_th, head_y / 2, 0]) 456 | tng_p (head_y, 3); 457 | translate ([head_x / 2, head_y - 3 * mat_th, 0]) 458 | rotate ([0, 0, 90]) 459 | tng_p (head_x + mat_th, 3); 460 | translate ([head_x / 2, mat_th, 0]) 461 | rotate ([0, 0, 90]) 462 | tng_p (head_x + mat_th, 3); 463 | 464 | // Calc (x,y) origin = (0, 0) 465 | origin_x = active_x_offset; 466 | origin_y = active_x_offset + work_area_y; 467 | 468 | // Loop over test points 469 | for ( i = [0 : len (test_points) - 1] ) { 470 | 471 | // Drop pins for test points 472 | translate ([origin_x + test_points[i][0], origin_y - test_points[i][1], 0]) 473 | cylinder (r = pogo_r, h = mat_th); 474 | } 475 | } 476 | } 477 | module latch_support () 478 | { 479 | x = base_x + 2 * mat_th + 2 * washer_th; 480 | y = latch_support_y; 481 | 482 | difference () { 483 | cube ([x, y, mat_th]); 484 | 485 | // Remove tng 486 | translate ([0, y / 2, 0]) 487 | tng_p (y, 3); 488 | translate ([x - mat_th, y / 2, 0]) 489 | tng_p (y, 3); 490 | 491 | // Remove tnut captures 492 | translate ([0, y/2, 0]) 493 | tnut_female (1); 494 | translate ([x, y/2, 0]) 495 | rotate ([0, 0, 180]) 496 | tnut_female (1); 497 | } 498 | } 499 | 500 | module latch () 501 | { 502 | pad = tab_width / 12; 503 | y = base_z * (2 / 3) + base_pivot_offset - pivot_support_r; 504 | difference () { 505 | 506 | hull () { 507 | cylinder (r = tab_width / 2, h = mat_th, $fn = 20); 508 | translate ([0, y + screw_d, 0]) 509 | cylinder (r = tab_width / 2, h = mat_th, $fn = 20); 510 | 511 | // Cross support 512 | translate ([-screw_d - support_x, 0, 0]) 513 | cube ([support_x, y, mat_th]); 514 | } 515 | 516 | // Remove screw hole 517 | cylinder (r = screw_r, h = mat_th, $fn = 20); 518 | 519 | // Remove slot 520 | translate ([-screw_r, y, 0]) 521 | cube ([(3 * tab_width) / 4, mat_th + pad, mat_th]); 522 | 523 | // Remove tng 524 | translate ([-support_x - nut_pad, y / 2, 0]) 525 | tng_n (y - 2 * mat_th, 3); 526 | 527 | // Remove support hole 528 | translate ([-support_x + mat_th / 2 - nut_pad, y / 2, 0]) 529 | tnut_hole (); 530 | } 531 | } 532 | module base_side () 533 | { 534 | x = base_z; 535 | y = base_y; 536 | 537 | difference () { 538 | union () { 539 | cube ([x, y, mat_th]); 540 | 541 | // Add pivot structure 542 | hull () { 543 | translate ([x + base_pivot_offset, y - pivot_support_d / 2, 0]) 544 | cylinder (r = pivot_support_d / 2, h = mat_th, $fn = 20); 545 | translate ([0, y - pivot_support_d, 0]) 546 | cube ([1, pivot_support_d, mat_th]); 547 | } 548 | } 549 | 550 | // Remove pivot hole 551 | translate ([x + base_pivot_offset, y - pivot_support_d / 2, 0]) 552 | cylinder (r = pivot_r, h = mat_th, $fn = 20); 553 | 554 | // Remove carrier slots 555 | translate ([x - mat_th, head_y / 2, 0]) 556 | tng_p (head_y, 7); 557 | translate ([x - 2 * mat_th, head_y / 2, 0]) 558 | tng_p (head_y, 7); 559 | 560 | // Remove tnut slot 561 | translate ([x, head_y / 2, 0]) 562 | rotate ([0, 0, 180]) 563 | tnut_female (2); 564 | 565 | // Offset from bottom 566 | support_offset = 2 * mat_th; 567 | 568 | // Cross bar support 569 | translate ([support_offset, head_y / 6, 0]) 570 | mirror ([0, 1, 0]) 571 | tng_n (head_y / 3, 2); 572 | translate ([support_offset + mat_th / 2, head_y / 12, 0]) 573 | tnut_hole (); 574 | 575 | // Second cross bar support 576 | translate ([support_offset, head_y - (head_y / 6 + mat_th), 0]) 577 | tng_n (head_y / 3, 3); 578 | translate ([support_offset + mat_th / 2, head_y - (head_y / 6 + mat_th), 0]) 579 | tnut_hole (); 580 | 581 | // Back support 582 | translate ([x / 2 + mat_th, y - pivot_support_d / 2 - (mat_th / 2), 0]) 583 | rotate ([0, 0, 90]) 584 | tng_n (x, 3); 585 | translate ([x / 2 + mat_th, y - pivot_support_d / 2, 0]) 586 | tnut_hole (); 587 | } 588 | } 589 | 590 | module base_front_support () 591 | { 592 | x = base_x; 593 | y = head_y/3; 594 | 595 | difference () { 596 | // Base cube 597 | cube ([x, y, mat_th]); 598 | 599 | // Remove slots 600 | translate ([0, y / 2, 0]) 601 | mirror ([0, 1, 0]) 602 | tng_p (y, 2); 603 | translate ([x - mat_th, y / 2, 0]) 604 | mirror ([0, 1, 0]) 605 | tng_p (y, 2); 606 | 607 | // Remove female tnuts 608 | translate ([0, y / 4, 0]) 609 | tnut_female (1, length = screw_thr_len - mat_th); 610 | translate ([x, y / 4, 0]) 611 | rotate ([0, 0, 180]) 612 | tnut_female (1, length = screw_thr_len - mat_th); 613 | } 614 | } 615 | 616 | module base_support (length) 617 | { 618 | x = base_x; 619 | y = length; 620 | 621 | difference () { 622 | // Base cube 623 | cube ([x, y, mat_th]); 624 | 625 | // Remove slots 626 | translate ([0, y / 2, 0]) 627 | tng_p (y, 3); 628 | translate ([x - mat_th, y / 2, 0]) 629 | tng_p (y, 3); 630 | 631 | // Remove female tnuts 632 | translate ([0, y / 2, 0]) 633 | tnut_female (1); 634 | translate ([x, y / 2, 0]) 635 | rotate ([0, 0, 180]) 636 | tnut_female (1); 637 | } 638 | } 639 | 640 | module base_back_support () 641 | { 642 | difference () { 643 | union () { 644 | base_support (base_z); 645 | 646 | // Add additional support to receive pivot screw and nut 647 | translate ([3 * mat_th, base_z, 0]) 648 | cube ([base_x - 6 * mat_th, base_pivot_offset + mat_th + 1.5, mat_th]); 649 | } 650 | 651 | // Remove tnut supports 652 | translate ([0, base_z + base_pivot_offset - mat_th, 0]) 653 | tnut_female (3); 654 | 655 | // Remove tnut supports 656 | translate ([base_x, base_z + base_pivot_offset - mat_th, 0]) 657 | rotate ([0, 0, 180]) 658 | tnut_female (3); 659 | } 660 | } 661 | 662 | module spacer () 663 | { 664 | difference () { 665 | cylinder (r = pivot_support_r, h = mat_th, $fn = 20); 666 | cylinder (r = pivot_r, h = mat_th, $fn = 20); 667 | } 668 | } 669 | 670 | module carrier (dxf_filename, pcb_x, pcb_y, border) 671 | { 672 | x = base_x; 673 | y = head_y; 674 | 675 | // Calculate scale factors 676 | scale_x = 1 - ((2 * border) / pcb_x); 677 | scale_y = 1 - ((2 * border) / pcb_y); 678 | 679 | difference () { 680 | cube ([x, y, mat_th]); 681 | 682 | // Get scale_offset 683 | sx_offset = (pcb_x - (pcb_x * scale_x)) / 2; 684 | sy_offset = (pcb_y - (pcb_y * scale_y)) / 2; 685 | 686 | // Import dxf, extrude and translate 687 | translate ([mat_th + active_x_offset + tp_correction_offset_x, 688 | work_area_y + active_y_offset + tp_correction_offset_y, 0]) 689 | translate ([sx_offset, -sy_offset, 0]) 690 | hull () { 691 | linear_extrude (height = mat_th) 692 | scale ([scale_x, scale_y, 1]) 693 | import (dxf_filename); 694 | } 695 | 696 | // Remove slots 697 | translate ([0, y/2, 0]) 698 | tng_n (y, 7); 699 | translate ([x - mat_th, y/2, 0]) 700 | tng_n (y, 7); 701 | 702 | // Remove holes 703 | translate ([mat_th / 2, y / 2, 0]) 704 | tnut_hole (); 705 | translate ([x - mat_th / 2, y / 2, 0]) 706 | tnut_hole (); 707 | 708 | // Add revision ID, also allows to determine which side is top 709 | translate ([x / 2, y - 25, 0]) 710 | linear_extrude (height = mat_th) 711 | text (rev, font = FONTNAME, halign = "center", valign = "center", size = 6); 712 | } 713 | } 714 | 715 | // 716 | // 3D renderings of assembly 717 | // 718 | module 3d_head () 719 | { 720 | head_top_offset = head_z - mat_th; 721 | 722 | head_base (); 723 | translate ([2 * mat_th, 0, 0]) 724 | rotate ([0, -90, 0]) 725 | head_side (); 726 | translate ([head_x - mat_th, 0, 0]) 727 | rotate ([0, -90, 0]) 728 | head_side (); 729 | translate ([0, 0, head_top_offset]) 730 | head_top (); 731 | translate ([0, head_y - 2 * mat_th, 0]) 732 | rotate ([90, 0, 0]) 733 | head_front_back (); 734 | translate ([0, 2 * mat_th, 0]) 735 | rotate ([90, 0, 0]) 736 | head_front_back (); 737 | translate ([mat_th * 3 + screw_d, head_y - (5 * mat_th) - screw_r, head_top_offset + mat_th + 1]) 738 | cable_retention (); 739 | } 740 | 741 | module 3d_base () { 742 | // Base sides 743 | rotate ([0, -90, 0]) 744 | base_side (); 745 | translate ([head_x + mat_th, 0, 0]) 746 | rotate ([0, -90, 0]) 747 | base_side (); 748 | 749 | // Supports 750 | translate ([-mat_th, 0, 2 * mat_th]) 751 | base_front_support (); 752 | translate ([-mat_th, head_y - (head_y / 3) - mat_th, 2 * mat_th]) 753 | base_support (head_y / 3); 754 | translate ([-mat_th, base_y - pivot_support_r + mat_th/2, mat_th]) 755 | rotate ([90, 0, 0]) 756 | base_back_support (); 757 | 758 | // Add spacers 759 | translate ([0, base_y - pivot_support_r, base_z + base_pivot_offset]) 760 | rotate ([0, 90, 0]) 761 | spacer (); 762 | translate ([base_x - 3 * mat_th, base_y - pivot_support_r, base_z + base_pivot_offset]) 763 | rotate ([0, 90, 0]) 764 | spacer (); 765 | 766 | // Add carrier blank and carrier 767 | translate ([-mat_th, 0, base_z - (2 * mat_th)]) 768 | carrier (pcb_outline, pcb_x, pcb_y, pcb_support_border); 769 | translate ([-mat_th, 0, base_z - mat_th]) 770 | carrier (pcb_outline, pcb_x, pcb_y, 0); 771 | } 772 | 773 | module 3d_latch () { 774 | // Add latches 775 | translate ([-mat_th * 2 - washer_th, 0, 0]) 776 | rotate ([0, 90, 0]) 777 | latch (); 778 | translate ([base_x - mat_th + washer_th, 0, 0]) 779 | rotate ([0, 90, 0]) 780 | latch (); 781 | translate ([-2 * mat_th - washer_th, latch_z_offset / 4, support_x - mat_th + nut_pad]) 782 | latch_support (); 783 | } 784 | 785 | module 3d_model () { 786 | translate ([0, 0, base_z + base_pivot_offset - pivot_support_r]) 787 | translate ([0, head_y + pivot_support_r, pivot_support_r]) 788 | rotate ([-8, 0, 0]) 789 | translate ([0, -head_y - pivot_support_r, -pivot_support_r]) 790 | 3d_head (); 791 | 3d_base (); 792 | translate ([0, head_y / 12, base_z / 3]) 793 | rotate([120, 0, 0]) 794 | 3d_latch (); 795 | } 796 | 797 | module validate_testpoints (dxf_filename) 798 | { 799 | hull () { 800 | linear_extrude (height = mat_th) 801 | import (dxf_filename); 802 | } 803 | // Loop over test points 804 | for ( i = [0 : len (test_points) - 1] ) { 805 | 806 | // Drop pins for test points 807 | color ([1, 0, 0]) 808 | translate ([test_points[i][0], -test_points[i][1], 0]) 809 | cylinder (r = pogo_r, h = mat_th); 810 | } 811 | } 812 | 813 | module lasercut () 814 | { 815 | // Add carrier panels 816 | carrier (pcb_outline, pcb_x, pcb_y, pcb_support_border); 817 | xoffset1 = base_x + laser_pad; 818 | translate ([xoffset1, 0, 0]) 819 | carrier (pcb_outline, pcb_x, pcb_y, -0.05); 820 | 821 | // Add head top 822 | xoffset2 = xoffset1 + base_x + laser_pad; 823 | translate ([xoffset2, 0, 0]) 824 | head_top (); 825 | 826 | // Add head base, flip to take advantage of kerf securing nuts 827 | xoffset3 = xoffset2 + 2 * head_x + tab_length + laser_pad; 828 | translate ([xoffset3, 0, 0]) 829 | mirror ([1, 0, 0]) 830 | head_base (); 831 | 832 | // Add base sides 833 | xoffset4 = xoffset3 + tab_length + laser_pad; 834 | translate ([xoffset4, 0, 0]) 835 | base_side (); 836 | xoffset5 = xoffset4 + 2 * base_z + base_pivot_offset + pivot_support_r + laser_pad; 837 | translate ([xoffset5, base_y, 0]) 838 | rotate ([0, 0, 180]) 839 | base_side (); 840 | 841 | // Add spacer in center 842 | xoffset6 = xoffset4 + (2 * base_z + base_pivot_offset) / 2 + laser_pad; 843 | yoffset1 = 2 * pivot_support_d + laser_pad; 844 | translate ([xoffset6, yoffset1, 0]) 845 | spacer (); 846 | yoffset2 = yoffset1 + pivot_support_d + laser_pad; 847 | translate ([xoffset6, yoffset2, 0]) 848 | spacer (); 849 | 850 | // Add base supports 851 | xoffset7 = xoffset6 + base_z + base_pivot_offset + laser_pad; 852 | translate ([xoffset7, 0, 0]) 853 | base_front_support (); 854 | yoffset3 = head_y / 3 + laser_pad; 855 | translate ([xoffset7, yoffset3, 0]) 856 | base_support (head_y / 3); 857 | yoffset4 = yoffset3 + head_y / 3 + laser_pad; 858 | translate ([xoffset7, yoffset4, 0]) 859 | base_back_support (); 860 | 861 | // Add head sides 862 | xoffset8 = xoffset7 + base_x + laser_pad; 863 | translate ([xoffset8, 0, 0]) 864 | head_side (); 865 | xoffset9 = xoffset8 + head_z + laser_pad; 866 | translate ([xoffset9, 0, 0]) 867 | head_side (); 868 | 869 | // Add front latch support 870 | xoffset10 = xoffset9 + head_z + laser_pad; 871 | translate ([xoffset10, 0, 0]) 872 | latch_support (); 873 | 874 | // Add head front/back 875 | yoffset5 = latch_support_y + laser_pad; 876 | translate ([xoffset10, yoffset5, 0]) 877 | head_front_back (); 878 | yoffset6 = yoffset5 + head_z + laser_pad; 879 | translate ([xoffset10, yoffset6, 0]) 880 | head_front_back (); 881 | 882 | // Add cable retention 883 | yoffset7 = yoffset6 + head_z + laser_pad + screw_d; 884 | translate ([xoffset10 + screw_d, yoffset7, 0]) 885 | cable_retention (); 886 | 887 | // Add latches 888 | xoffset11 = xoffset10 + screw_d + support_x + laser_pad; 889 | //yoffset8 = yoffset7 + base_z + screw_d + laser_pad; 890 | yoffset8 = yoffset7 + screw_d + tab_width / 2 + laser_pad; 891 | translate ([xoffset11, yoffset8, 0]) 892 | latch (); 893 | xoffset12 = xoffset11 + screw_d + support_x + tab_width / 2 + laser_pad; 894 | translate ([xoffset12, yoffset8, 0]) 895 | latch (); 896 | } 897 | -------------------------------------------------------------------------------- /osh_logo.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $ACADVER 7 | 1 8 | AC1014 9 | 9 10 | $HANDSEED 11 | 5 12 | FFFF 13 | 9 14 | $MEASUREMENT 15 | 70 16 | 1 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 330 30 | 0 31 | 100 32 | AcDbSymbolTable 33 | 70 34 | 4 35 | 0 36 | VPORT 37 | 5 38 | 2E 39 | 330 40 | 8 41 | 100 42 | AcDbSymbolTableRecord 43 | 100 44 | AcDbViewportTableRecord 45 | 2 46 | *ACTIVE 47 | 70 48 | 0 49 | 10 50 | 0.0 51 | 20 52 | 0.0 53 | 11 54 | 1.0 55 | 21 56 | 1.0 57 | 12 58 | 210.0 59 | 22 60 | 148.5 61 | 13 62 | 0.0 63 | 23 64 | 0.0 65 | 14 66 | 10.0 67 | 24 68 | 10.0 69 | 15 70 | 10.0 71 | 25 72 | 10.0 73 | 16 74 | 0.0 75 | 26 76 | 0.0 77 | 36 78 | 1.0 79 | 17 80 | 0.0 81 | 27 82 | 0.0 83 | 37 84 | 0.0 85 | 40 86 | 341.0 87 | 41 88 | 1.24 89 | 42 90 | 50.0 91 | 43 92 | 0.0 93 | 44 94 | 0.0 95 | 50 96 | 0.0 97 | 51 98 | 0.0 99 | 71 100 | 0 101 | 72 102 | 100 103 | 73 104 | 1 105 | 74 106 | 3 107 | 75 108 | 0 109 | 76 110 | 0 111 | 77 112 | 0 113 | 78 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | LTYPE 121 | 5 122 | 5 123 | 330 124 | 0 125 | 100 126 | AcDbSymbolTable 127 | 70 128 | 1 129 | 0 130 | LTYPE 131 | 5 132 | 14 133 | 330 134 | 5 135 | 100 136 | AcDbSymbolTableRecord 137 | 100 138 | AcDbLinetypeTableRecord 139 | 2 140 | BYBLOCK 141 | 70 142 | 0 143 | 3 144 | 145 | 72 146 | 65 147 | 73 148 | 0 149 | 40 150 | 0.0 151 | 0 152 | LTYPE 153 | 5 154 | 15 155 | 330 156 | 5 157 | 100 158 | AcDbSymbolTableRecord 159 | 100 160 | AcDbLinetypeTableRecord 161 | 2 162 | BYLAYER 163 | 70 164 | 0 165 | 3 166 | 167 | 72 168 | 65 169 | 73 170 | 0 171 | 40 172 | 0.0 173 | 0 174 | LTYPE 175 | 5 176 | 16 177 | 330 178 | 5 179 | 100 180 | AcDbSymbolTableRecord 181 | 100 182 | AcDbLinetypeTableRecord 183 | 2 184 | CONTINUOUS 185 | 70 186 | 0 187 | 3 188 | Solid line 189 | 72 190 | 65 191 | 73 192 | 0 193 | 40 194 | 0.0 195 | 0 196 | ENDTAB 197 | 0 198 | TABLE 199 | 2 200 | LAYER 201 | 5 202 | 2 203 | 100 204 | AcDbSymbolTable 205 | 70 206 | 1 207 | 0 208 | LAYER 209 | 5 210 | 50 211 | 100 212 | AcDbSymbolTableRecord 213 | 100 214 | AcDbLayerTableRecord 215 | 2 216 | 0 217 | 70 218 | 0 219 | 6 220 | CONTINUOUS 221 | 0 222 | ENDTAB 223 | 0 224 | TABLE 225 | 2 226 | STYLE 227 | 5 228 | 3 229 | 330 230 | 0 231 | 100 232 | AcDbSymbolTable 233 | 70 234 | 1 235 | 0 236 | STYLE 237 | 5 238 | 11 239 | 330 240 | 3 241 | 100 242 | AcDbSymbolTableRecord 243 | 100 244 | AcDbTextStyleTableRecord 245 | 2 246 | STANDARD 247 | 70 248 | 0 249 | 40 250 | 0.0 251 | 41 252 | 1.0 253 | 50 254 | 0.0 255 | 71 256 | 0 257 | 42 258 | 2.5 259 | 3 260 | txt 261 | 4 262 | 263 | 0 264 | ENDTAB 265 | 0 266 | TABLE 267 | 2 268 | VIEW 269 | 5 270 | 6 271 | 330 272 | 0 273 | 100 274 | AcDbSymbolTable 275 | 70 276 | 0 277 | 0 278 | ENDTAB 279 | 0 280 | TABLE 281 | 2 282 | UCS 283 | 5 284 | 7 285 | 330 286 | 0 287 | 100 288 | AcDbSymbolTable 289 | 70 290 | 0 291 | 0 292 | ENDTAB 293 | 0 294 | TABLE 295 | 2 296 | APPID 297 | 5 298 | 9 299 | 330 300 | 0 301 | 100 302 | AcDbSymbolTable 303 | 70 304 | 2 305 | 0 306 | APPID 307 | 5 308 | 12 309 | 330 310 | 9 311 | 100 312 | AcDbSymbolTableRecord 313 | 100 314 | AcDbRegAppTableRecord 315 | 2 316 | ACAD 317 | 70 318 | 0 319 | 0 320 | ENDTAB 321 | 0 322 | TABLE 323 | 2 324 | DIMSTYLE 325 | 5 326 | A 327 | 330 328 | 0 329 | 100 330 | AcDbSymbolTable 331 | 70 332 | 1 333 | 0 334 | DIMSTYLE 335 | 105 336 | 27 337 | 330 338 | A 339 | 100 340 | AcDbSymbolTableRecord 341 | 100 342 | AcDbDimStyleTableRecord 343 | 2 344 | ISO-25 345 | 70 346 | 0 347 | 3 348 | 349 | 4 350 | 351 | 5 352 | 353 | 6 354 | 355 | 7 356 | 357 | 40 358 | 1.0 359 | 41 360 | 2.5 361 | 42 362 | 0.625 363 | 43 364 | 3.75 365 | 44 366 | 1.25 367 | 45 368 | 0.0 369 | 46 370 | 0.0 371 | 47 372 | 0.0 373 | 48 374 | 0.0 375 | 140 376 | 2.5 377 | 141 378 | 2.5 379 | 142 380 | 0.0 381 | 143 382 | 0.03937007874016 383 | 144 384 | 1.0 385 | 145 386 | 0.0 387 | 146 388 | 1.0 389 | 147 390 | 0.625 391 | 71 392 | 0 393 | 72 394 | 0 395 | 73 396 | 0 397 | 74 398 | 0 399 | 75 400 | 0 401 | 76 402 | 0 403 | 77 404 | 1 405 | 78 406 | 8 407 | 170 408 | 0 409 | 171 410 | 3 411 | 172 412 | 1 413 | 173 414 | 0 415 | 174 416 | 0 417 | 175 418 | 0 419 | 176 420 | 0 421 | 177 422 | 0 423 | 178 424 | 0 425 | 270 426 | 2 427 | 271 428 | 2 429 | 272 430 | 2 431 | 273 432 | 2 433 | 274 434 | 3 435 | 340 436 | 11 437 | 275 438 | 0 439 | 280 440 | 0 441 | 281 442 | 0 443 | 282 444 | 0 445 | 283 446 | 0 447 | 284 448 | 8 449 | 285 450 | 0 451 | 286 452 | 0 453 | 287 454 | 3 455 | 288 456 | 0 457 | 0 458 | ENDTAB 459 | 0 460 | TABLE 461 | 2 462 | BLOCK_RECORD 463 | 5 464 | 1 465 | 330 466 | 0 467 | 100 468 | AcDbSymbolTable 469 | 70 470 | 1 471 | 0 472 | BLOCK_RECORD 473 | 5 474 | 1F 475 | 330 476 | 1 477 | 100 478 | AcDbSymbolTableRecord 479 | 100 480 | AcDbBlockTableRecord 481 | 2 482 | *MODEL_SPACE 483 | 0 484 | BLOCK_RECORD 485 | 5 486 | 1B 487 | 330 488 | 1 489 | 100 490 | AcDbSymbolTableRecord 491 | 100 492 | AcDbBlockTableRecord 493 | 2 494 | *PAPER_SPACE 495 | 0 496 | ENDTAB 497 | 0 498 | ENDSEC 499 | 0 500 | SECTION 501 | 2 502 | BLOCKS 503 | 0 504 | BLOCK 505 | 5 506 | 20 507 | 330 508 | 1F 509 | 100 510 | AcDbEntity 511 | 8 512 | 0 513 | 100 514 | AcDbBlockBegin 515 | 2 516 | *MODEL_SPACE 517 | 70 518 | 0 519 | 10 520 | 0.0 521 | 20 522 | 0.0 523 | 30 524 | 0.0 525 | 3 526 | *MODEL_SPACE 527 | 1 528 | 529 | 0 530 | ENDBLK 531 | 5 532 | 21 533 | 330 534 | 1F 535 | 100 536 | AcDbEntity 537 | 8 538 | 0 539 | 100 540 | AcDbBlockEnd 541 | 0 542 | BLOCK 543 | 5 544 | 1C 545 | 330 546 | 1B 547 | 100 548 | AcDbEntity 549 | 67 550 | 1 551 | 8 552 | 0 553 | 100 554 | AcDbBlockBegin 555 | 2 556 | *PAPER_SPACE 557 | 1 558 | 559 | 0 560 | ENDBLK 561 | 5 562 | 1D 563 | 330 564 | 1B 565 | 100 566 | AcDbEntity 567 | 67 568 | 1 569 | 8 570 | 0 571 | 100 572 | AcDbBlockEnd 573 | 0 574 | ENDSEC 575 | 0 576 | SECTION 577 | 2 578 | ENTITIES 579 | 0 580 | LWPOLYLINE 581 | 5 582 | 100 583 | 100 584 | AcDbEntity 585 | 8 586 | 0 587 | 62 588 | 7 589 | 100 590 | AcDbPolyline 591 | 90 592 | 110 593 | 70 594 | 0 595 | 10 596 | 137.680888 597 | 20 598 | 74.740980 599 | 30 600 | 0.0 601 | 10 602 | 121.365776 603 | 20 604 | 77.774943 605 | 30 606 | 0.0 607 | 10 608 | 120.400104 609 | 20 610 | 78.605635 611 | 30 612 | 0.0 613 | 10 614 | 115.399080 615 | 20 616 | 90.273044 617 | 30 618 | 0.0 619 | 10 620 | 115.478440 621 | 20 622 | 91.534466 623 | 30 624 | 0.0 625 | 10 626 | 124.984296 627 | 20 628 | 105.389265 629 | 30 630 | 0.0 631 | 10 632 | 125.124981 633 | 20 634 | 105.970477 635 | 30 636 | 0.0 637 | 10 638 | 124.880088 639 | 20 640 | 106.516704 641 | 30 642 | 0.0 643 | 10 644 | 113.007240 645 | 20 646 | 118.389553 647 | 30 648 | 0.0 649 | 10 650 | 112.461509 651 | 20 652 | 118.635188 653 | 30 654 | 0.0 655 | 10 656 | 111.880792 657 | 20 658 | 118.493762 659 | 30 660 | 0.0 661 | 10 662 | 97.782840 663 | 20 664 | 108.819221 665 | 30 666 | 0.0 667 | 10 668 | 96.515464 669 | 20 670 | 108.727914 671 | 30 672 | 0.0 673 | 10 674 | 85.205344 675 | 20 676 | 113.357759 677 | 30 678 | 0.0 679 | 10 680 | 84.371672 681 | 20 682 | 114.312510 683 | 30 684 | 0.0 685 | 10 686 | 81.230520 687 | 20 688 | 131.187378 689 | 30 690 | 0.0 691 | 10 692 | 80.919632 693 | 20 694 | 131.698373 695 | 30 696 | 0.0 697 | 10 698 | 80.360128 699 | 20 700 | 131.910884 701 | 30 702 | 0.0 703 | 10 704 | 63.567641 705 | 20 706 | 131.910884 707 | 30 708 | 0.0 709 | 10 710 | 63.009007 711 | 20 712 | 131.698373 713 | 30 714 | 0.0 715 | 10 716 | 62.698242 717 | 20 718 | 131.187378 719 | 30 720 | 0.0 721 | 10 722 | 59.558086 723 | 20 724 | 114.312510 725 | 30 726 | 0.0 727 | 10 728 | 58.724416 729 | 20 730 | 113.357759 731 | 30 732 | 0.0 733 | 10 734 | 47.413302 735 | 20 736 | 108.727914 737 | 30 738 | 0.0 739 | 10 740 | 46.145926 741 | 20 742 | 108.819221 743 | 30 744 | 0.0 745 | 10 746 | 32.048965 747 | 20 748 | 118.493762 749 | 30 750 | 0.0 751 | 10 752 | 31.467008 753 | 20 754 | 118.635188 755 | 30 756 | 0.0 757 | 10 758 | 30.921526 759 | 20 760 | 118.389553 761 | 30 762 | 0.0 763 | 10 764 | 19.047685 765 | 20 766 | 106.516704 767 | 30 768 | 0.0 769 | 10 770 | 18.802422 771 | 20 772 | 105.970477 773 | 30 774 | 0.0 775 | 10 776 | 18.943476 777 | 20 778 | 105.389265 779 | 30 780 | 0.0 781 | 10 782 | 28.450290 783 | 20 784 | 91.534466 785 | 30 786 | 0.0 787 | 10 788 | 28.528698 789 | 20 790 | 90.273044 791 | 30 792 | 0.0 793 | 10 794 | 23.526678 795 | 20 796 | 78.605635 797 | 30 798 | 0.0 799 | 10 800 | 22.561011 801 | 20 802 | 77.774943 803 | 30 804 | 0.0 805 | 10 806 | 6.246882 807 | 20 808 | 74.740980 809 | 30 810 | 0.0 811 | 10 812 | 5.735515 813 | 20 814 | 74.428851 815 | 30 816 | 0.0 817 | 10 818 | 5.523376 819 | 20 820 | 73.869597 821 | 30 822 | 0.0 823 | 10 824 | 5.524368 825 | 20 826 | 57.078096 827 | 30 828 | 0.0 829 | 10 830 | 5.736879 831 | 20 832 | 56.517724 833 | 30 834 | 0.0 835 | 10 836 | 6.247874 837 | 20 838 | 56.206712 839 | 30 840 | 0.0 841 | 10 842 | 22.162037 843 | 20 844 | 53.245200 845 | 30 846 | 0.0 847 | 10 848 | 23.106863 849 | 20 850 | 52.408552 851 | 30 852 | 0.0 853 | 10 854 | 28.075138 855 | 20 856 | 39.997784 857 | 30 858 | 0.0 859 | 10 860 | 27.980854 861 | 20 862 | 38.730408 863 | 30 864 | 0.0 865 | 10 866 | 18.941491 867 | 20 868 | 25.557432 869 | 30 870 | 0.0 871 | 10 872 | 18.800809 873 | 20 874 | 24.975723 875 | 30 876 | 0.0 877 | 10 878 | 19.045700 879 | 20 880 | 24.429000 881 | 30 882 | 0.0 883 | 10 884 | 30.920533 885 | 20 886 | 12.556152 887 | 30 888 | 0.0 889 | 10 890 | 31.466016 891 | 20 892 | 12.312003 893 | 30 894 | 0.0 895 | 10 896 | 32.047972 897 | 20 898 | 12.451944 899 | 30 900 | 0.0 901 | 10 902 | 44.987720 903 | 20 904 | 21.333504 905 | 30 906 | 0.0 907 | 10 908 | 46.228300 909 | 20 910 | 21.376144 911 | 30 912 | 0.0 913 | 10 914 | 51.934969 915 | 20 916 | 18.329280 917 | 30 918 | 0.0 919 | 10 920 | 52.481320 921 | 20 922 | 18.292427 923 | 30 924 | 0.0 925 | 10 926 | 52.872847 927 | 20 928 | 18.674656 929 | 30 930 | 0.0 931 | 10 932 | 64.639502 933 | 20 934 | 47.105784 935 | 30 936 | 0.0 937 | 10 938 | 64.654761 939 | 20 940 | 47.698286 941 | 30 942 | 0.0 943 | 10 944 | 64.294124 945 | 20 946 | 48.168712 947 | 30 948 | 0.0 949 | 10 950 | 62.865969 951 | 20 952 | 49.043072 953 | 30 954 | 0.0 955 | 10 956 | 61.962826 957 | 20 958 | 49.734824 959 | 30 960 | 0.0 961 | 10 962 | 58.450325 963 | 20 964 | 52.646463 965 | 30 966 | 0.0 967 | 10 968 | 55.745907 969 | 20 970 | 56.328504 971 | 30 972 | 0.0 973 | 10 974 | 54.007466 975 | 20 976 | 60.624262 977 | 30 978 | 0.0 979 | 10 980 | 53.392898 981 | 20 982 | 65.377049 983 | 30 984 | 0.0 985 | 10 986 | 53.770207 987 | 20 988 | 69.119608 989 | 30 990 | 0.0 991 | 10 992 | 54.852332 993 | 20 994 | 72.605413 995 | 30 996 | 0.0 997 | 10 998 | 56.564572 999 | 20 1000 | 75.759798 1001 | 30 1002 | 0.0 1003 | 10 1004 | 58.832222 1005 | 20 1006 | 78.508094 1007 | 30 1008 | 0.0 1009 | 10 1010 | 61.580582 1011 | 20 1012 | 80.775634 1013 | 30 1014 | 0.0 1015 | 10 1016 | 64.734949 1017 | 20 1018 | 82.487751 1019 | 30 1020 | 0.0 1021 | 10 1022 | 68.220621 1023 | 20 1024 | 83.569777 1025 | 30 1026 | 0.0 1027 | 10 1028 | 71.962894 1029 | 20 1030 | 83.947046 1031 | 30 1032 | 0.0 1033 | 10 1034 | 75.705125 1035 | 20 1036 | 83.569777 1037 | 30 1038 | 0.0 1039 | 10 1040 | 79.190684 1041 | 20 1042 | 82.487751 1043 | 30 1044 | 0.0 1045 | 10 1046 | 82.344891 1047 | 20 1048 | 80.775634 1049 | 30 1050 | 0.0 1051 | 10 1052 | 85.093069 1053 | 20 1054 | 78.508094 1055 | 30 1056 | 0.0 1057 | 10 1058 | 87.360537 1059 | 20 1060 | 75.759798 1061 | 30 1062 | 0.0 1063 | 10 1064 | 89.072617 1065 | 20 1066 | 72.605413 1067 | 30 1068 | 0.0 1069 | 10 1070 | 90.154630 1071 | 20 1072 | 69.119608 1073 | 30 1074 | 0.0 1075 | 10 1076 | 90.531896 1077 | 20 1078 | 65.377049 1079 | 30 1080 | 0.0 1081 | 10 1082 | 89.917468 1083 | 20 1084 | 60.624262 1085 | 30 1086 | 0.0 1087 | 10 1088 | 88.179262 1089 | 20 1090 | 56.328504 1091 | 30 1092 | 0.0 1093 | 10 1094 | 85.474891 1095 | 20 1096 | 52.646463 1097 | 30 1098 | 0.0 1099 | 10 1100 | 81.961968 1101 | 20 1102 | 49.734824 1103 | 30 1104 | 0.0 1105 | 10 1106 | 81.060808 1107 | 20 1108 | 49.043072 1109 | 30 1110 | 0.0 1111 | 10 1112 | 79.632658 1113 | 20 1114 | 48.168712 1115 | 30 1116 | 0.0 1117 | 10 1118 | 79.273139 1119 | 20 1120 | 47.698286 1121 | 30 1122 | 0.0 1123 | 10 1124 | 79.287282 1125 | 20 1126 | 47.105784 1127 | 30 1128 | 0.0 1129 | 10 1130 | 91.052944 1131 | 20 1132 | 18.673664 1133 | 30 1134 | 0.0 1135 | 10 1136 | 91.444100 1137 | 20 1138 | 18.291816 1139 | 30 1140 | 0.0 1141 | 10 1142 | 91.990824 1143 | 20 1144 | 18.328288 1145 | 30 1146 | 0.0 1147 | 10 1148 | 97.697488 1149 | 20 1150 | 21.375152 1151 | 30 1152 | 0.0 1153 | 10 1154 | 98.938072 1155 | 20 1156 | 21.332512 1157 | 30 1158 | 0.0 1159 | 10 1160 | 111.878808 1161 | 20 1162 | 12.450952 1163 | 30 1164 | 0.0 1165 | 10 1166 | 112.460269 1167 | 20 1168 | 12.311011 1169 | 30 1170 | 0.0 1171 | 10 1172 | 113.005256 1173 | 20 1174 | 12.555160 1175 | 30 1176 | 0.0 1177 | 10 1178 | 124.880088 1179 | 20 1180 | 24.428008 1181 | 30 1182 | 0.0 1183 | 10 1184 | 125.125725 1185 | 20 1186 | 24.974731 1187 | 30 1188 | 0.0 1189 | 10 1190 | 124.984296 1191 | 20 1192 | 25.556440 1193 | 30 1194 | 0.0 1195 | 10 1196 | 115.943944 1197 | 20 1198 | 38.729416 1199 | 30 1200 | 0.0 1201 | 10 1202 | 115.850648 1203 | 20 1204 | 39.996792 1205 | 30 1206 | 0.0 1207 | 10 1208 | 120.818928 1209 | 20 1210 | 52.407560 1211 | 30 1212 | 0.0 1213 | 10 1214 | 121.762760 1215 | 20 1216 | 53.244208 1217 | 30 1218 | 0.0 1219 | 10 1220 | 137.676920 1221 | 20 1222 | 56.205720 1223 | 30 1224 | 0.0 1225 | 10 1226 | 138.187545 1227 | 20 1228 | 56.516744 1229 | 30 1230 | 0.0 1231 | 10 1232 | 138.400432 1233 | 20 1234 | 57.077104 1235 | 30 1236 | 0.0 1237 | 10 1238 | 138.402032 1239 | 20 1240 | 73.868604 1241 | 30 1242 | 0.0 1243 | 10 1244 | 138.190440 1245 | 20 1246 | 74.428726 1247 | 30 1248 | 0.0 1249 | 10 1250 | 137.680504 1251 | 20 1252 | 74.740980 1253 | 30 1254 | 0.0 1255 | 0 1256 | ENDSEC 1257 | 0 1258 | SECTION 1259 | 2 1260 | OBJECTS 1261 | 0 1262 | DICTIONARY 1263 | 5 1264 | C 1265 | 330 1266 | 0 1267 | 100 1268 | AcDbDictionary 1269 | 3 1270 | ACAD_GROUP 1271 | 350 1272 | D 1273 | 3 1274 | ACAD_MLINESTYLE 1275 | 350 1276 | 17 1277 | 0 1278 | DICTIONARY 1279 | 5 1280 | D 1281 | 330 1282 | C 1283 | 100 1284 | AcDbDictionary 1285 | 0 1286 | DICTIONARY 1287 | 5 1288 | 1A 1289 | 330 1290 | C 1291 | 100 1292 | AcDbDictionary 1293 | 0 1294 | DICTIONARY 1295 | 5 1296 | 17 1297 | 330 1298 | C 1299 | 100 1300 | AcDbDictionary 1301 | 3 1302 | STANDARD 1303 | 350 1304 | 18 1305 | 0 1306 | DICTIONARY 1307 | 5 1308 | 19 1309 | 330 1310 | C 1311 | 100 1312 | AcDbDictionary 1313 | 0 1314 | ENDSEC 1315 | 0 1316 | EOF 1317 | -------------------------------------------------------------------------------- /rfid_fob-outline.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $ANGBASE 7 | 50 8 | 0.0 9 | 9 10 | $ANGDIR 11 | 70 12 | 1 13 | 9 14 | $MEASUREMENT 15 | 70 16 | 0 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | LTYPE 27 | 70 28 | 1 29 | 0 30 | LTYPE 31 | 2 32 | CONTINUOUS 33 | 70 34 | 0 35 | 3 36 | Solid line 37 | 72 38 | 65 39 | 73 40 | 0 41 | 40 42 | 0.0 43 | 0 44 | ENDTAB 45 | 0 46 | TABLE 47 | 2 48 | STYLE 49 | 70 50 | 4 51 | 0 52 | STYLE 53 | 2 54 | KICAD 55 | 70 56 | 0 57 | 40 58 | 0 59 | 41 60 | 1 61 | 42 62 | 1 63 | 50 64 | 0 65 | 71 66 | 0 67 | 3 68 | isocp.shx 69 | 0 70 | STYLE 71 | 2 72 | KICADB 73 | 70 74 | 0 75 | 40 76 | 0 77 | 41 78 | 1 79 | 42 80 | 1 81 | 50 82 | 0 83 | 71 84 | 0 85 | 3 86 | isocp.shx 87 | 0 88 | STYLE 89 | 2 90 | KICADI 91 | 70 92 | 0 93 | 40 94 | 0 95 | 41 96 | 1 97 | 42 98 | 1 99 | 50 100 | 15 101 | 71 102 | 0 103 | 3 104 | isocp.shx 105 | 0 106 | STYLE 107 | 2 108 | KICADBI 109 | 70 110 | 0 111 | 40 112 | 0 113 | 41 114 | 1 115 | 42 116 | 1 117 | 50 118 | 15 119 | 71 120 | 0 121 | 3 122 | isocp.shx 123 | 0 124 | ENDTAB 125 | 0 126 | TABLE 127 | 2 128 | LAYER 129 | 70 130 | 30 131 | 0 132 | LAYER 133 | 2 134 | BLACK 135 | 70 136 | 0 137 | 62 138 | 7 139 | 6 140 | CONTINUOUS 141 | 0 142 | LAYER 143 | 2 144 | GRAY1 145 | 70 146 | 0 147 | 62 148 | 251 149 | 6 150 | CONTINUOUS 151 | 0 152 | LAYER 153 | 2 154 | GRAY2 155 | 70 156 | 0 157 | 62 158 | 8 159 | 6 160 | CONTINUOUS 161 | 0 162 | LAYER 163 | 2 164 | GRAY3 165 | 70 166 | 0 167 | 62 168 | 9 169 | 6 170 | CONTINUOUS 171 | 0 172 | LAYER 173 | 2 174 | WHITE 175 | 70 176 | 0 177 | 62 178 | 7 179 | 6 180 | CONTINUOUS 181 | 0 182 | LAYER 183 | 2 184 | LYELLOW 185 | 70 186 | 0 187 | 62 188 | 51 189 | 6 190 | CONTINUOUS 191 | 0 192 | LAYER 193 | 2 194 | BLUE1 195 | 70 196 | 0 197 | 62 198 | 178 199 | 6 200 | CONTINUOUS 201 | 0 202 | LAYER 203 | 2 204 | GREEN1 205 | 70 206 | 0 207 | 62 208 | 98 209 | 6 210 | CONTINUOUS 211 | 0 212 | LAYER 213 | 2 214 | CYAN1 215 | 70 216 | 0 217 | 62 218 | 138 219 | 6 220 | CONTINUOUS 221 | 0 222 | LAYER 223 | 2 224 | RED1 225 | 70 226 | 0 227 | 62 228 | 18 229 | 6 230 | CONTINUOUS 231 | 0 232 | LAYER 233 | 2 234 | MAGENTA1 235 | 70 236 | 0 237 | 62 238 | 228 239 | 6 240 | CONTINUOUS 241 | 0 242 | LAYER 243 | 2 244 | BROWN1 245 | 70 246 | 0 247 | 62 248 | 58 249 | 6 250 | CONTINUOUS 251 | 0 252 | LAYER 253 | 2 254 | BLUE2 255 | 70 256 | 0 257 | 62 258 | 5 259 | 6 260 | CONTINUOUS 261 | 0 262 | LAYER 263 | 2 264 | GREEN2 265 | 70 266 | 0 267 | 62 268 | 3 269 | 6 270 | CONTINUOUS 271 | 0 272 | LAYER 273 | 2 274 | CYAN2 275 | 70 276 | 0 277 | 62 278 | 4 279 | 6 280 | CONTINUOUS 281 | 0 282 | LAYER 283 | 2 284 | RED2 285 | 70 286 | 0 287 | 62 288 | 1 289 | 6 290 | CONTINUOUS 291 | 0 292 | LAYER 293 | 2 294 | MAGENTA2 295 | 70 296 | 0 297 | 62 298 | 6 299 | 6 300 | CONTINUOUS 301 | 0 302 | LAYER 303 | 2 304 | BROWN2 305 | 70 306 | 0 307 | 62 308 | 54 309 | 6 310 | CONTINUOUS 311 | 0 312 | LAYER 313 | 2 314 | BLUE3 315 | 70 316 | 0 317 | 62 318 | 171 319 | 6 320 | CONTINUOUS 321 | 0 322 | LAYER 323 | 2 324 | GREEN3 325 | 70 326 | 0 327 | 62 328 | 91 329 | 6 330 | CONTINUOUS 331 | 0 332 | LAYER 333 | 2 334 | CYAN3 335 | 70 336 | 0 337 | 62 338 | 131 339 | 6 340 | CONTINUOUS 341 | 0 342 | LAYER 343 | 2 344 | RED3 345 | 70 346 | 0 347 | 62 348 | 11 349 | 6 350 | CONTINUOUS 351 | 0 352 | LAYER 353 | 2 354 | MAGENTA3 355 | 70 356 | 0 357 | 62 358 | 221 359 | 6 360 | CONTINUOUS 361 | 0 362 | LAYER 363 | 2 364 | YELLOW3 365 | 70 366 | 0 367 | 62 368 | 2 369 | 6 370 | CONTINUOUS 371 | 0 372 | LAYER 373 | 2 374 | BLUE4 375 | 70 376 | 0 377 | 62 378 | 5 379 | 6 380 | CONTINUOUS 381 | 0 382 | LAYER 383 | 2 384 | GREEN4 385 | 70 386 | 0 387 | 62 388 | 3 389 | 6 390 | CONTINUOUS 391 | 0 392 | LAYER 393 | 2 394 | CYAN4 395 | 70 396 | 0 397 | 62 398 | 4 399 | 6 400 | CONTINUOUS 401 | 0 402 | LAYER 403 | 2 404 | RED4 405 | 70 406 | 0 407 | 62 408 | 1 409 | 6 410 | CONTINUOUS 411 | 0 412 | LAYER 413 | 2 414 | MAGENTA4 415 | 70 416 | 0 417 | 62 418 | 6 419 | 6 420 | CONTINUOUS 421 | 0 422 | LAYER 423 | 2 424 | YELLOW4 425 | 70 426 | 0 427 | 62 428 | 2 429 | 6 430 | CONTINUOUS 431 | 0 432 | ENDTAB 433 | 0 434 | ENDSEC 435 | 0 436 | SECTION 437 | 2 438 | ENTITIES 439 | 0 440 | LINE 441 | 8 442 | Black 443 | 10 444 | 20.4522 445 | 20 446 | -0.000382 447 | 11 448 | 20.4544 449 | 21 450 | -0.000191 451 | 0 452 | LINE 453 | 8 454 | Black 455 | 10 456 | 20.4544 457 | 20 458 | -0.000191 459 | 11 460 | 20.4607 461 | 21 462 | -0.00188 463 | 0 464 | LINE 465 | 8 466 | Black 467 | 10 468 | 20.4607 469 | 20 470 | -0.00188 471 | 11 472 | 20.4671 473 | 21 474 | -0.003015 475 | 0 476 | LINE 477 | 8 478 | Black 479 | 10 480 | 20.4671 481 | 20 482 | -0.003015 483 | 11 484 | 20.469 485 | 21 486 | -0.004115 487 | 0 488 | LINE 489 | 8 490 | Black 491 | 10 492 | 20.469 493 | 20 494 | -0.004115 495 | 11 496 | 20.4711 497 | 21 498 | -0.004684 499 | 0 500 | LINE 501 | 8 502 | Black 503 | 10 504 | 20.4711 505 | 20 506 | -0.004684 507 | 11 508 | 20.4765 509 | 21 510 | -0.008433 511 | 0 512 | LINE 513 | 8 514 | Black 515 | 10 516 | 20.4765 517 | 20 518 | -0.008433 519 | 11 520 | 20.4821 521 | 21 522 | -0.011698 523 | 0 524 | LINE 525 | 8 526 | Black 527 | 10 528 | 20.4821 529 | 20 530 | -0.011698 531 | 11 532 | 20.4836 533 | 21 534 | -0.013383 535 | 0 536 | LINE 537 | 8 538 | Black 539 | 10 540 | 20.4836 541 | 20 542 | -0.013383 543 | 11 544 | 20.4854 545 | 21 546 | -0.014645 547 | 0 548 | LINE 549 | 8 550 | Black 551 | 10 552 | 20.4854 553 | 20 554 | -0.014645 555 | 11 556 | 27.0854 557 | 21 558 | -6.61464 559 | 0 560 | LINE 561 | 8 562 | Black 563 | 10 564 | 27.0854 565 | 20 566 | -6.61464 567 | 11 568 | 27.0866 569 | 21 570 | -6.61645 571 | 0 572 | LINE 573 | 8 574 | Black 575 | 10 576 | 27.0866 577 | 20 578 | -6.61645 579 | 11 580 | 27.0883 581 | 21 582 | -6.61786 583 | 0 584 | LINE 585 | 8 586 | Black 587 | 10 588 | 27.0883 589 | 20 590 | -6.61786 591 | 11 592 | 27.0916 593 | 21 594 | -6.62351 595 | 0 596 | LINE 597 | 8 598 | Black 599 | 10 600 | 27.0916 601 | 20 602 | -6.62351 603 | 11 604 | 27.0953 605 | 21 606 | -6.62887 607 | 0 608 | LINE 609 | 8 610 | Black 611 | 10 612 | 27.0953 613 | 20 614 | -6.62887 615 | 11 616 | 27.0959 617 | 21 618 | -6.63099 619 | 0 620 | LINE 621 | 8 622 | Black 623 | 10 624 | 27.0959 625 | 20 626 | -6.63099 627 | 11 628 | 27.097 629 | 21 630 | -6.6329 631 | 0 632 | LINE 633 | 8 634 | Black 635 | 10 636 | 27.097 637 | 20 638 | -6.6329 639 | 11 640 | 27.0981 641 | 21 642 | -6.63933 643 | 0 644 | LINE 645 | 8 646 | Black 647 | 10 648 | 27.0981 649 | 20 650 | -6.63933 651 | 11 652 | 27.0998 653 | 21 654 | -6.64564 655 | 0 656 | LINE 657 | 8 658 | Black 659 | 10 660 | 27.0998 661 | 20 662 | -6.64564 663 | 11 664 | 27.0996 665 | 21 666 | -6.64783 667 | 0 668 | LINE 669 | 8 670 | Black 671 | 10 672 | 27.0996 673 | 20 674 | -6.64783 675 | 11 676 | 27.1 677 | 21 678 | -6.65 679 | 0 680 | LINE 681 | 8 682 | Black 683 | 10 684 | 27.1 685 | 20 686 | -6.65 687 | 11 688 | 27.1 689 | 21 690 | -16.75 691 | 0 692 | LINE 693 | 8 694 | Black 695 | 10 696 | 27.1 697 | 20 698 | -16.75 699 | 11 700 | 27.097 701 | 21 702 | -16.7671 703 | 0 704 | LINE 705 | 8 706 | Black 707 | 10 708 | 27.097 709 | 20 710 | -16.7671 711 | 11 712 | 27.0883 713 | 21 714 | -16.7821 715 | 0 716 | LINE 717 | 8 718 | Black 719 | 10 720 | 27.0883 721 | 20 722 | -16.7821 723 | 11 724 | 27.075 725 | 21 726 | -16.7933 727 | 0 728 | LINE 729 | 8 730 | Black 731 | 10 732 | 27.075 733 | 20 734 | -16.7933 735 | 11 736 | 27.0587 737 | 21 738 | -16.7992 739 | 0 740 | LINE 741 | 8 742 | Black 743 | 10 744 | 27.0587 745 | 20 746 | -16.7992 747 | 11 748 | 26.6911 749 | 21 750 | -16.864 751 | 0 752 | LINE 753 | 8 754 | Black 755 | 10 756 | 26.6911 757 | 20 758 | -16.864 759 | 11 760 | 26.3756 761 | 21 762 | -17.0462 763 | 0 764 | LINE 765 | 8 766 | Black 767 | 10 768 | 26.3756 769 | 20 770 | -17.0462 771 | 11 772 | 26.1413 773 | 21 774 | -17.3254 775 | 0 776 | LINE 777 | 8 778 | Black 779 | 10 780 | 26.1413 781 | 20 782 | -17.3254 783 | 11 784 | 26.0167 785 | 21 786 | -17.6678 787 | 0 788 | LINE 789 | 8 790 | Black 791 | 10 792 | 26.0167 793 | 20 794 | -17.6678 795 | 11 796 | 26.0167 797 | 21 798 | -18.0322 799 | 0 800 | LINE 801 | 8 802 | Black 803 | 10 804 | 26.0167 805 | 20 806 | -18.0322 807 | 11 808 | 26.1413 809 | 21 810 | -18.3746 811 | 0 812 | LINE 813 | 8 814 | Black 815 | 10 816 | 26.1413 817 | 20 818 | -18.3746 819 | 11 820 | 26.3756 821 | 21 822 | -18.6538 823 | 0 824 | LINE 825 | 8 826 | Black 827 | 10 828 | 26.3756 829 | 20 830 | -18.6538 831 | 11 832 | 26.6911 833 | 21 834 | -18.836 835 | 0 836 | LINE 837 | 8 838 | Black 839 | 10 840 | 26.6911 841 | 20 842 | -18.836 843 | 11 844 | 27.0587 845 | 21 846 | -18.9008 847 | 0 848 | LINE 849 | 8 850 | Black 851 | 10 852 | 27.0587 853 | 20 854 | -18.9008 855 | 11 856 | 27.075 857 | 21 858 | -18.9067 859 | 0 860 | LINE 861 | 8 862 | Black 863 | 10 864 | 27.075 865 | 20 866 | -18.9067 867 | 11 868 | 27.0858 869 | 21 870 | -18.9158 871 | 0 872 | LINE 873 | 8 874 | Black 875 | 10 876 | 27.0858 877 | 20 878 | -18.9158 879 | 11 880 | 27.0883 881 | 21 882 | -18.9179 883 | 0 884 | LINE 885 | 8 886 | Black 887 | 10 888 | 27.0883 889 | 20 890 | -18.9179 891 | 11 892 | 27.097 893 | 21 894 | -18.9329 895 | 0 896 | LINE 897 | 8 898 | Black 899 | 10 900 | 27.097 901 | 20 902 | -18.9329 903 | 11 904 | 27.1 905 | 21 906 | -18.95 907 | 0 908 | LINE 909 | 8 910 | Black 911 | 10 912 | 27.1 913 | 20 914 | -18.95 915 | 11 916 | 27.1 917 | 21 918 | -41.85 919 | 0 920 | LINE 921 | 8 922 | Black 923 | 10 924 | 27.1 925 | 20 926 | -41.85 927 | 11 928 | 27.0992 929 | 21 930 | -41.8543 931 | 0 932 | LINE 933 | 8 934 | Black 935 | 10 936 | 27.0992 937 | 20 938 | -41.8543 939 | 11 940 | 27.0992 941 | 21 942 | -41.8587 943 | 0 944 | LINE 945 | 8 946 | Black 947 | 10 948 | 27.0992 949 | 20 950 | -41.8587 951 | 11 952 | 26.9183 953 | 21 954 | -42.8847 955 | 0 956 | LINE 957 | 8 958 | Black 959 | 10 960 | 26.9183 961 | 20 962 | -42.8847 963 | 11 964 | 26.9183 965 | 21 966 | -42.8847 967 | 0 968 | LINE 969 | 8 970 | Black 971 | 10 972 | 26.9183 973 | 20 974 | -42.8847 975 | 11 976 | 26.9153 977 | 21 978 | -42.8929 979 | 0 980 | LINE 981 | 8 982 | Black 983 | 10 984 | 26.9153 985 | 20 986 | -42.8929 987 | 11 988 | 26.9124 989 | 21 990 | -42.9011 991 | 0 992 | LINE 993 | 8 994 | Black 995 | 10 996 | 26.9124 997 | 20 998 | -42.9011 999 | 11 1000 | 26.9124 1001 | 21 1002 | -42.9011 1003 | 0 1004 | LINE 1005 | 8 1006 | Black 1007 | 10 1008 | 26.9124 1009 | 20 1010 | -42.9011 1011 | 11 1012 | 26.3914 1013 | 21 1014 | -43.8034 1015 | 0 1016 | LINE 1017 | 8 1018 | Black 1019 | 10 1020 | 26.3914 1021 | 20 1022 | -43.8034 1023 | 11 1024 | 26.3914 1025 | 21 1026 | -43.8034 1027 | 0 1028 | LINE 1029 | 8 1030 | Black 1031 | 10 1032 | 26.3914 1033 | 20 1034 | -43.8034 1035 | 11 1036 | 26.3803 1037 | 21 1038 | -43.8167 1039 | 0 1040 | LINE 1041 | 8 1042 | Black 1043 | 10 1044 | 26.3803 1045 | 20 1046 | -43.8167 1047 | 11 1048 | 25.5821 1049 | 21 1050 | -44.4864 1051 | 0 1052 | LINE 1053 | 8 1054 | Black 1055 | 10 1056 | 25.5821 1057 | 20 1058 | -44.4864 1059 | 11 1060 | 25.5821 1061 | 21 1062 | -44.4864 1063 | 0 1064 | LINE 1065 | 8 1066 | Black 1067 | 10 1068 | 25.5821 1069 | 20 1070 | -44.4864 1071 | 11 1072 | 25.5766 1073 | 21 1074 | -44.4896 1075 | 0 1076 | LINE 1077 | 8 1078 | Black 1079 | 10 1080 | 25.5766 1081 | 20 1082 | -44.4896 1083 | 11 1084 | 25.5671 1085 | 21 1086 | -44.4951 1087 | 0 1088 | LINE 1089 | 8 1090 | Black 1091 | 10 1092 | 25.5671 1093 | 20 1094 | -44.4951 1095 | 11 1096 | 25.5671 1097 | 21 1098 | -44.4951 1099 | 0 1100 | LINE 1101 | 8 1102 | Black 1103 | 10 1104 | 25.5671 1105 | 20 1106 | -44.4951 1107 | 11 1108 | 24.588 1109 | 21 1110 | -44.8514 1111 | 0 1112 | LINE 1113 | 8 1114 | Black 1115 | 10 1116 | 24.588 1117 | 20 1118 | -44.8514 1119 | 11 1120 | 24.5816 1121 | 21 1122 | -44.8525 1123 | 0 1124 | LINE 1125 | 8 1126 | Black 1127 | 10 1128 | 24.5816 1129 | 20 1130 | -44.8525 1131 | 11 1132 | 24.5753 1133 | 21 1134 | -44.8542 1135 | 0 1136 | LINE 1137 | 8 1138 | Black 1139 | 10 1140 | 24.5753 1141 | 20 1142 | -44.8542 1143 | 11 1144 | 24.0544 1145 | 21 1146 | -44.8998 1147 | 0 1148 | LINE 1149 | 8 1150 | Black 1151 | 10 1152 | 24.0544 1153 | 20 1154 | -44.8998 1155 | 11 1156 | 24.0522 1157 | 21 1158 | -44.8996 1159 | 0 1160 | LINE 1161 | 8 1162 | Black 1163 | 10 1164 | 24.0522 1165 | 20 1166 | -44.8996 1167 | 11 1168 | 24.05 1169 | 21 1170 | -44.9 1171 | 0 1172 | LINE 1173 | 8 1174 | Black 1175 | 10 1176 | 24.05 1177 | 20 1178 | -44.9 1179 | 11 1180 | 3.05 1181 | 21 1182 | -44.9 1183 | 0 1184 | LINE 1185 | 8 1186 | Black 1187 | 10 1188 | 3.05 1189 | 20 1190 | -44.9 1191 | 11 1192 | 3.04569 1193 | 21 1194 | -44.8992 1195 | 0 1196 | LINE 1197 | 8 1198 | Black 1199 | 10 1200 | 3.04569 1201 | 20 1202 | -44.8992 1203 | 11 1204 | 3.04132 1205 | 21 1206 | -44.8992 1207 | 0 1208 | LINE 1209 | 8 1210 | Black 1211 | 10 1212 | 3.04132 1213 | 20 1214 | -44.8992 1215 | 11 1216 | 2.01526 1217 | 21 1218 | -44.7183 1219 | 0 1220 | LINE 1221 | 8 1222 | Black 1223 | 10 1224 | 2.01526 1225 | 20 1226 | -44.7183 1227 | 11 1228 | 2.01526 1229 | 21 1230 | -44.7183 1231 | 0 1232 | LINE 1233 | 8 1234 | Black 1235 | 10 1236 | 2.01526 1237 | 20 1238 | -44.7183 1239 | 11 1240 | 2.0071 1241 | 21 1242 | -44.7153 1243 | 0 1244 | LINE 1245 | 8 1246 | Black 1247 | 10 1248 | 2.0071 1249 | 20 1250 | -44.7153 1251 | 11 1252 | 1.99894 1253 | 21 1254 | -44.7124 1255 | 0 1256 | LINE 1257 | 8 1258 | Black 1259 | 10 1260 | 1.99894 1261 | 20 1262 | -44.7124 1263 | 11 1264 | 1.99894 1265 | 21 1266 | -44.7124 1267 | 0 1268 | LINE 1269 | 8 1270 | Black 1271 | 10 1272 | 1.99894 1273 | 20 1274 | -44.7124 1275 | 11 1276 | 1.09664 1277 | 21 1278 | -44.1914 1279 | 0 1280 | LINE 1281 | 8 1282 | Black 1283 | 10 1284 | 1.09664 1285 | 20 1286 | -44.1914 1287 | 11 1288 | 1.09664 1289 | 21 1290 | -44.1914 1291 | 0 1292 | LINE 1293 | 8 1294 | Black 1295 | 10 1296 | 1.09664 1297 | 20 1298 | -44.1914 1299 | 11 1300 | 1.08333 1301 | 21 1302 | -44.1803 1303 | 0 1304 | LINE 1305 | 8 1306 | Black 1307 | 10 1308 | 1.08333 1309 | 20 1310 | -44.1803 1311 | 11 1312 | 0.413625 1313 | 21 1314 | -43.3821 1315 | 0 1316 | LINE 1317 | 8 1318 | Black 1319 | 10 1320 | 0.413625 1321 | 20 1322 | -43.3821 1323 | 11 1324 | 0.413622 1325 | 21 1326 | -43.3821 1327 | 0 1328 | LINE 1329 | 8 1330 | Black 1331 | 10 1332 | 0.413622 1333 | 20 1334 | -43.3821 1335 | 11 1336 | 0.410444 1337 | 21 1338 | -43.3766 1339 | 0 1340 | LINE 1341 | 8 1342 | Black 1343 | 10 1344 | 0.410444 1345 | 20 1346 | -43.3766 1347 | 11 1348 | 0.404939 1349 | 21 1350 | -43.3671 1351 | 0 1352 | LINE 1353 | 8 1354 | Black 1355 | 10 1356 | 0.404939 1357 | 20 1358 | -43.3671 1359 | 11 1360 | 0.404938 1361 | 21 1362 | -43.3671 1363 | 0 1364 | LINE 1365 | 8 1366 | Black 1367 | 10 1368 | 0.404938 1369 | 20 1370 | -43.3671 1371 | 11 1372 | 0.048592 1373 | 21 1374 | -42.388 1375 | 0 1376 | LINE 1377 | 8 1378 | Black 1379 | 10 1380 | 0.048592 1381 | 20 1382 | -42.388 1383 | 11 1384 | 0.047458 1385 | 21 1386 | -42.3816 1387 | 0 1388 | LINE 1389 | 8 1390 | Black 1391 | 10 1392 | 0.047458 1393 | 20 1394 | -42.3816 1395 | 11 1396 | 0.045767 1397 | 21 1398 | -42.3753 1399 | 0 1400 | LINE 1401 | 8 1402 | Black 1403 | 10 1404 | 0.045767 1405 | 20 1406 | -42.3753 1407 | 11 1408 | 0.00019 1409 | 21 1410 | -41.8544 1411 | 0 1412 | LINE 1413 | 8 1414 | Black 1415 | 10 1416 | 0.00019 1417 | 20 1418 | -41.8544 1419 | 11 1420 | 0.000382 1421 | 21 1422 | -41.8522 1423 | 0 1424 | LINE 1425 | 8 1426 | Black 1427 | 10 1428 | 0.000382 1429 | 20 1430 | -41.8522 1431 | 11 1432 | 0 1433 | 21 1434 | -41.85 1435 | 0 1436 | LINE 1437 | 8 1438 | Black 1439 | 10 1440 | 0 1441 | 20 1442 | -41.85 1443 | 11 1444 | 0 1445 | 21 1446 | -18.95 1447 | 0 1448 | LINE 1449 | 8 1450 | Black 1451 | 10 1452 | 0 1453 | 20 1454 | -18.95 1455 | 11 1456 | 0.003015 1457 | 21 1458 | -18.9329 1459 | 0 1460 | LINE 1461 | 8 1462 | Black 1463 | 10 1464 | 0.003015 1465 | 20 1466 | -18.9329 1467 | 11 1468 | 0.011698 1469 | 21 1470 | -18.9179 1471 | 0 1472 | LINE 1473 | 8 1474 | Black 1475 | 10 1476 | 0.011698 1477 | 20 1478 | -18.9179 1479 | 11 1480 | 0.014153 1481 | 21 1482 | -18.9158 1483 | 0 1484 | LINE 1485 | 8 1486 | Black 1487 | 10 1488 | 0.014153 1489 | 20 1490 | -18.9158 1491 | 11 1492 | 0.025 1493 | 21 1494 | -18.9067 1495 | 0 1496 | LINE 1497 | 8 1498 | Black 1499 | 10 1500 | 0.025 1501 | 20 1502 | -18.9067 1503 | 11 1504 | 0.041318 1505 | 21 1506 | -18.9008 1507 | 0 1508 | LINE 1509 | 8 1510 | Black 1511 | 10 1512 | 0.041318 1513 | 20 1514 | -18.9008 1515 | 11 1516 | 0.408857 1517 | 21 1518 | -18.836 1519 | 0 1520 | LINE 1521 | 8 1522 | Black 1523 | 10 1524 | 0.408857 1525 | 20 1526 | -18.836 1527 | 11 1528 | 0.724431 1529 | 21 1530 | -18.6538 1531 | 0 1532 | LINE 1533 | 8 1534 | Black 1535 | 10 1536 | 0.724431 1537 | 20 1538 | -18.6538 1539 | 11 1540 | 0.958658 1541 | 21 1542 | -18.3746 1543 | 0 1544 | LINE 1545 | 8 1546 | Black 1547 | 10 1548 | 0.958658 1549 | 20 1550 | -18.3746 1551 | 11 1552 | 1.08329 1553 | 21 1554 | -18.0322 1555 | 0 1556 | LINE 1557 | 8 1558 | Black 1559 | 10 1560 | 1.08329 1561 | 20 1562 | -18.0322 1563 | 11 1564 | 1.08329 1565 | 21 1566 | -17.6678 1567 | 0 1568 | LINE 1569 | 8 1570 | Black 1571 | 10 1572 | 1.08329 1573 | 20 1574 | -17.6678 1575 | 11 1576 | 0.958658 1577 | 21 1578 | -17.3254 1579 | 0 1580 | LINE 1581 | 8 1582 | Black 1583 | 10 1584 | 0.958658 1585 | 20 1586 | -17.3254 1587 | 11 1588 | 0.724431 1589 | 21 1590 | -17.0462 1591 | 0 1592 | LINE 1593 | 8 1594 | Black 1595 | 10 1596 | 0.724431 1597 | 20 1598 | -17.0462 1599 | 11 1600 | 0.408857 1601 | 21 1602 | -16.864 1603 | 0 1604 | LINE 1605 | 8 1606 | Black 1607 | 10 1608 | 0.408857 1609 | 20 1610 | -16.864 1611 | 11 1612 | 0.041318 1613 | 21 1614 | -16.7992 1615 | 0 1616 | LINE 1617 | 8 1618 | Black 1619 | 10 1620 | 0.041318 1621 | 20 1622 | -16.7992 1623 | 11 1624 | 0.025 1625 | 21 1626 | -16.7933 1627 | 0 1628 | LINE 1629 | 8 1630 | Black 1631 | 10 1632 | 0.025 1633 | 20 1634 | -16.7933 1635 | 11 1636 | 0.011698 1637 | 21 1638 | -16.7821 1639 | 0 1640 | LINE 1641 | 8 1642 | Black 1643 | 10 1644 | 0.011698 1645 | 20 1646 | -16.7821 1647 | 11 1648 | 0.003015 1649 | 21 1650 | -16.7671 1651 | 0 1652 | LINE 1653 | 8 1654 | Black 1655 | 10 1656 | 0.003015 1657 | 20 1658 | -16.7671 1659 | 11 1660 | 0 1661 | 21 1662 | -16.75 1663 | 0 1664 | LINE 1665 | 8 1666 | Black 1667 | 10 1668 | 0 1669 | 20 1670 | -16.75 1671 | 11 1672 | 0 1673 | 21 1674 | -6.65 1675 | 0 1676 | LINE 1677 | 8 1678 | Black 1679 | 10 1680 | 0 1681 | 20 1682 | -6.65 1683 | 11 1684 | 0.000382 1685 | 21 1686 | -6.64783 1687 | 0 1688 | LINE 1689 | 8 1690 | Black 1691 | 10 1692 | 0.000382 1693 | 20 1694 | -6.64783 1695 | 11 1696 | 0.000191 1697 | 21 1698 | -6.64564 1699 | 0 1700 | LINE 1701 | 8 1702 | Black 1703 | 10 1704 | 0.000191 1705 | 20 1706 | -6.64564 1707 | 11 1708 | 0.00188 1709 | 21 1710 | -6.63934 1711 | 0 1712 | LINE 1713 | 8 1714 | Black 1715 | 10 1716 | 0.00188 1717 | 20 1718 | -6.63934 1719 | 11 1720 | 0.003015 1721 | 21 1722 | -6.6329 1723 | 0 1724 | LINE 1725 | 8 1726 | Black 1727 | 10 1728 | 0.003015 1729 | 20 1730 | -6.6329 1731 | 11 1732 | 0.004115 1733 | 21 1734 | -6.63099 1735 | 0 1736 | LINE 1737 | 8 1738 | Black 1739 | 10 1740 | 0.004115 1741 | 20 1742 | -6.63099 1743 | 11 1744 | 0.004684 1745 | 21 1746 | -6.62887 1747 | 0 1748 | LINE 1749 | 8 1750 | Black 1751 | 10 1752 | 0.004684 1753 | 20 1754 | -6.62887 1755 | 11 1756 | 0.008433 1757 | 21 1758 | -6.62351 1759 | 0 1760 | LINE 1761 | 8 1762 | Black 1763 | 10 1764 | 0.008433 1765 | 20 1766 | -6.62351 1767 | 11 1768 | 0.011698 1769 | 21 1770 | -6.61786 1771 | 0 1772 | LINE 1773 | 8 1774 | Black 1775 | 10 1776 | 0.011698 1777 | 20 1778 | -6.61786 1779 | 11 1780 | 0.013383 1781 | 21 1782 | -6.61645 1783 | 0 1784 | LINE 1785 | 8 1786 | Black 1787 | 10 1788 | 0.013383 1789 | 20 1790 | -6.61645 1791 | 11 1792 | 0.014645 1793 | 21 1794 | -6.61464 1795 | 0 1796 | LINE 1797 | 8 1798 | Black 1799 | 10 1800 | 0.014645 1801 | 20 1802 | -6.61464 1803 | 11 1804 | 6.61464 1805 | 21 1806 | -0.014644 1807 | 0 1808 | LINE 1809 | 8 1810 | Black 1811 | 10 1812 | 6.61464 1813 | 20 1814 | -0.014644 1815 | 11 1816 | 6.61645 1817 | 21 1818 | -0.013381 1819 | 0 1820 | LINE 1821 | 8 1822 | Black 1823 | 10 1824 | 6.61645 1825 | 20 1826 | -0.013381 1827 | 11 1828 | 6.61786 1829 | 21 1830 | -0.011698 1831 | 0 1832 | LINE 1833 | 8 1834 | Black 1835 | 10 1836 | 6.61786 1837 | 20 1838 | -0.011698 1839 | 11 1840 | 6.62351 1841 | 21 1842 | -0.008435 1843 | 0 1844 | LINE 1845 | 8 1846 | Black 1847 | 10 1848 | 6.62351 1849 | 20 1850 | -0.008435 1851 | 11 1852 | 6.62887 1853 | 21 1854 | -0.004684 1855 | 0 1856 | LINE 1857 | 8 1858 | Black 1859 | 10 1860 | 6.62887 1861 | 20 1862 | -0.004684 1863 | 11 1864 | 6.63099 1865 | 21 1866 | -0.004114 1867 | 0 1868 | LINE 1869 | 8 1870 | Black 1871 | 10 1872 | 6.63099 1873 | 20 1874 | -0.004114 1875 | 11 1876 | 6.6329 1877 | 21 1878 | -0.003015 1879 | 0 1880 | LINE 1881 | 8 1882 | Black 1883 | 10 1884 | 6.6329 1885 | 20 1886 | -0.003015 1887 | 11 1888 | 6.63933 1889 | 21 1890 | -0.001881 1891 | 0 1892 | LINE 1893 | 8 1894 | Black 1895 | 10 1896 | 6.63933 1897 | 20 1898 | -0.001881 1899 | 11 1900 | 6.64564 1901 | 21 1902 | -0.00019 1903 | 0 1904 | LINE 1905 | 8 1906 | Black 1907 | 10 1908 | 6.64564 1909 | 20 1910 | -0.00019 1911 | 11 1912 | 6.64783 1913 | 21 1914 | -0.000382 1915 | 0 1916 | LINE 1917 | 8 1918 | Black 1919 | 10 1920 | 6.64783 1921 | 20 1922 | -0.000382 1923 | 11 1924 | 6.65 1925 | 21 1926 | 0 1927 | 0 1928 | LINE 1929 | 8 1930 | Black 1931 | 10 1932 | 6.65 1933 | 20 1934 | 0 1935 | 11 1936 | 20.45 1937 | 21 1938 | 0 1939 | 0 1940 | LINE 1941 | 8 1942 | Black 1943 | 10 1944 | 20.45 1945 | 20 1946 | 0 1947 | 11 1948 | 20.4522 1949 | 21 1950 | -0.000382 1951 | 0 1952 | LINE 1953 | 8 1954 | Black 1955 | 10 1956 | 27 1957 | 20 1958 | -6.67071 1959 | 11 1960 | 20.4293 1961 | 21 1962 | -0.1 1963 | 0 1964 | LINE 1965 | 8 1966 | Black 1967 | 10 1968 | 20.4293 1969 | 20 1970 | -0.1 1971 | 11 1972 | 6.67071 1973 | 21 1974 | -0.1 1975 | 0 1976 | LINE 1977 | 8 1978 | Black 1979 | 10 1980 | 6.67071 1981 | 20 1982 | -0.1 1983 | 11 1984 | 0.1 1985 | 21 1986 | -6.67071 1987 | 0 1988 | LINE 1989 | 8 1990 | Black 1991 | 10 1992 | 0.1 1993 | 20 1994 | -6.67071 1995 | 11 1996 | 0.1 1997 | 21 1998 | -16.708 1999 | 0 2000 | LINE 2001 | 8 2002 | Black 2003 | 10 2004 | 0.1 2005 | 20 2006 | -16.708 2007 | 11 2008 | 0.434899 2009 | 21 2010 | -16.7671 2011 | 0 2012 | LINE 2013 | 8 2014 | Black 2015 | 10 2016 | 0.434899 2017 | 20 2018 | -16.7671 2019 | 11 2020 | 0.434905 2021 | 21 2022 | -16.7671 2023 | 0 2024 | LINE 2025 | 8 2026 | Black 2027 | 10 2028 | 0.434905 2029 | 20 2030 | -16.7671 2031 | 11 2032 | 0.443063 2033 | 21 2034 | -16.7701 2035 | 0 2036 | LINE 2037 | 8 2038 | Black 2039 | 10 2040 | 0.443063 2041 | 20 2042 | -16.7701 2043 | 11 2044 | 0.451222 2045 | 21 2046 | -16.773 2047 | 0 2048 | LINE 2049 | 8 2050 | Black 2051 | 10 2052 | 0.451222 2053 | 20 2054 | -16.773 2055 | 11 2056 | 0.451226 2057 | 21 2058 | -16.773 2059 | 0 2060 | LINE 2061 | 8 2062 | Black 2063 | 10 2064 | 0.451226 2065 | 20 2066 | -16.773 2067 | 11 2068 | 0.782061 2069 | 21 2070 | -16.964 2071 | 0 2072 | LINE 2073 | 8 2074 | Black 2075 | 10 2076 | 0.782061 2077 | 20 2078 | -16.964 2079 | 11 2080 | 0.782066 2081 | 21 2082 | -16.964 2083 | 0 2084 | LINE 2085 | 8 2086 | Black 2087 | 10 2088 | 0.782066 2089 | 20 2090 | -16.964 2091 | 11 2092 | 0.786751 2093 | 21 2094 | -16.968 2095 | 0 2096 | LINE 2097 | 8 2098 | Black 2099 | 10 2100 | 0.786751 2101 | 20 2102 | -16.968 2103 | 11 2104 | 0.795369 2105 | 21 2106 | -16.9752 2107 | 0 2108 | LINE 2109 | 8 2110 | Black 2111 | 10 2112 | 0.795369 2113 | 20 2114 | -16.9752 2115 | 11 2116 | 0.795373 2117 | 21 2118 | -16.9752 2119 | 0 2120 | LINE 2121 | 8 2122 | Black 2123 | 10 2124 | 0.795373 2125 | 20 2126 | -16.9752 2127 | 11 2128 | 1.04093 2129 | 21 2130 | -17.2679 2131 | 0 2132 | LINE 2133 | 8 2134 | Black 2135 | 10 2136 | 1.04093 2137 | 20 2138 | -17.2679 2139 | 11 2140 | 1.04093 2141 | 21 2142 | -17.2679 2143 | 0 2144 | LINE 2145 | 8 2146 | Black 2147 | 10 2148 | 1.04093 2149 | 20 2150 | -17.2679 2151 | 11 2152 | 1.04644 2153 | 21 2154 | -17.2774 2155 | 0 2156 | LINE 2157 | 8 2158 | Black 2159 | 10 2160 | 1.04644 2161 | 20 2162 | -17.2774 2163 | 11 2164 | 1.04961 2165 | 21 2166 | -17.2829 2167 | 0 2168 | LINE 2169 | 8 2170 | Black 2171 | 10 2172 | 1.04961 2173 | 20 2174 | -17.2829 2175 | 11 2176 | 1.04961 2177 | 21 2178 | -17.2829 2179 | 0 2180 | LINE 2181 | 8 2182 | Black 2183 | 10 2184 | 1.04961 2185 | 20 2186 | -17.2829 2187 | 11 2188 | 1.18027 2189 | 21 2190 | -17.6419 2191 | 0 2192 | LINE 2193 | 8 2194 | Black 2195 | 10 2196 | 1.18027 2197 | 20 2198 | -17.6419 2199 | 11 2200 | 1.18329 2201 | 21 2202 | -17.659 2203 | 0 2204 | LINE 2205 | 8 2206 | Black 2207 | 10 2208 | 1.18329 2209 | 20 2210 | -17.659 2211 | 11 2212 | 1.18329 2213 | 21 2214 | -18.041 2215 | 0 2216 | LINE 2217 | 8 2218 | Black 2219 | 10 2220 | 1.18329 2221 | 20 2222 | -18.041 2223 | 11 2224 | 1.18027 2225 | 21 2226 | -18.0581 2227 | 0 2228 | LINE 2229 | 8 2230 | Black 2231 | 10 2232 | 1.18027 2233 | 20 2234 | -18.0581 2235 | 11 2236 | 1.04961 2237 | 21 2238 | -18.4171 2239 | 0 2240 | LINE 2241 | 8 2242 | Black 2243 | 10 2244 | 1.04961 2245 | 20 2246 | -18.4171 2247 | 11 2248 | 1.04961 2249 | 21 2250 | -18.4171 2251 | 0 2252 | LINE 2253 | 8 2254 | Black 2255 | 10 2256 | 1.04961 2257 | 20 2258 | -18.4171 2259 | 11 2260 | 1.04644 2261 | 21 2262 | -18.4226 2263 | 0 2264 | LINE 2265 | 8 2266 | Black 2267 | 10 2268 | 1.04644 2269 | 20 2270 | -18.4226 2271 | 11 2272 | 1.04093 2273 | 21 2274 | -18.4321 2275 | 0 2276 | LINE 2277 | 8 2278 | Black 2279 | 10 2280 | 1.04093 2281 | 20 2282 | -18.4321 2283 | 11 2284 | 1.04093 2285 | 21 2286 | -18.4321 2287 | 0 2288 | LINE 2289 | 8 2290 | Black 2291 | 10 2292 | 1.04093 2293 | 20 2294 | -18.4321 2295 | 11 2296 | 0.795373 2297 | 21 2298 | -18.7248 2299 | 0 2300 | LINE 2301 | 8 2302 | Black 2303 | 10 2304 | 0.795373 2305 | 20 2306 | -18.7248 2307 | 11 2308 | 0.795369 2309 | 21 2310 | -18.7248 2311 | 0 2312 | LINE 2313 | 8 2314 | Black 2315 | 10 2316 | 0.795369 2317 | 20 2318 | -18.7248 2319 | 11 2320 | 0.786751 2321 | 21 2322 | -18.732 2323 | 0 2324 | LINE 2325 | 8 2326 | Black 2327 | 10 2328 | 0.786751 2329 | 20 2330 | -18.732 2331 | 11 2332 | 0.782066 2333 | 21 2334 | -18.736 2335 | 0 2336 | LINE 2337 | 8 2338 | Black 2339 | 10 2340 | 0.782066 2341 | 20 2342 | -18.736 2343 | 11 2344 | 0.782061 2345 | 21 2346 | -18.736 2347 | 0 2348 | LINE 2349 | 8 2350 | Black 2351 | 10 2352 | 0.782061 2353 | 20 2354 | -18.736 2355 | 11 2356 | 0.451226 2357 | 21 2358 | -18.927 2359 | 0 2360 | LINE 2361 | 8 2362 | Black 2363 | 10 2364 | 0.451226 2365 | 20 2366 | -18.927 2367 | 11 2368 | 0.451222 2369 | 21 2370 | -18.927 2371 | 0 2372 | LINE 2373 | 8 2374 | Black 2375 | 10 2376 | 0.451222 2377 | 20 2378 | -18.927 2379 | 11 2380 | 0.443063 2381 | 21 2382 | -18.9299 2383 | 0 2384 | LINE 2385 | 8 2386 | Black 2387 | 10 2388 | 0.443063 2389 | 20 2390 | -18.9299 2391 | 11 2392 | 0.434905 2393 | 21 2394 | -18.9329 2395 | 0 2396 | LINE 2397 | 8 2398 | Black 2399 | 10 2400 | 0.434905 2401 | 20 2402 | -18.9329 2403 | 11 2404 | 0.434899 2405 | 21 2406 | -18.9329 2407 | 0 2408 | LINE 2409 | 8 2410 | Black 2411 | 10 2412 | 0.434899 2413 | 20 2414 | -18.9329 2415 | 11 2416 | 0.1 2417 | 21 2418 | -18.992 2419 | 0 2420 | LINE 2421 | 8 2422 | Black 2423 | 10 2424 | 0.1 2425 | 20 2426 | -18.992 2427 | 11 2428 | 0.1 2429 | 21 2430 | -41.8478 2431 | 0 2432 | LINE 2433 | 8 2434 | Black 2435 | 10 2436 | 0.1 2437 | 20 2438 | -41.8478 2439 | 11 2440 | 0.144813 2441 | 21 2442 | -42.36 2443 | 0 2444 | LINE 2445 | 8 2446 | Black 2447 | 10 2448 | 0.144813 2449 | 20 2450 | -42.36 2451 | 11 2452 | 0.495894 2453 | 21 2454 | -43.3246 2455 | 0 2456 | LINE 2457 | 8 2458 | Black 2459 | 10 2460 | 0.495894 2461 | 20 2462 | -43.3246 2463 | 11 2464 | 1.15427 2465 | 21 2466 | -44.1092 2467 | 0 2468 | LINE 2469 | 8 2470 | Black 2471 | 10 2472 | 1.15427 2473 | 20 2474 | -44.1092 2475 | 11 2476 | 2.0413 2477 | 21 2478 | -44.6214 2479 | 0 2480 | LINE 2481 | 8 2482 | Black 2483 | 10 2484 | 2.0413 2485 | 20 2486 | -44.6214 2487 | 11 2488 | 3.05437 2489 | 21 2490 | -44.8 2491 | 0 2492 | LINE 2493 | 8 2494 | Black 2495 | 10 2496 | 3.05437 2497 | 20 2498 | -44.8 2499 | 11 2500 | 24.0478 2501 | 21 2502 | -44.8 2503 | 0 2504 | LINE 2505 | 8 2506 | Black 2507 | 10 2508 | 24.0478 2509 | 20 2510 | -44.8 2511 | 11 2512 | 24.56 2513 | 21 2514 | -44.7552 2515 | 0 2516 | LINE 2517 | 8 2518 | Black 2519 | 10 2520 | 24.56 2521 | 20 2522 | -44.7552 2523 | 11 2524 | 25.5246 2525 | 21 2526 | -44.4041 2527 | 0 2528 | LINE 2529 | 8 2530 | Black 2531 | 10 2532 | 25.5246 2533 | 20 2534 | -44.4041 2535 | 11 2536 | 26.3092 2537 | 21 2538 | -43.7457 2539 | 0 2540 | LINE 2541 | 8 2542 | Black 2543 | 10 2544 | 26.3092 2545 | 20 2546 | -43.7457 2547 | 11 2548 | 26.8214 2549 | 21 2550 | -42.8587 2551 | 0 2552 | LINE 2553 | 8 2554 | Black 2555 | 10 2556 | 26.8214 2557 | 20 2558 | -42.8587 2559 | 11 2560 | 27 2561 | 21 2562 | -41.8456 2563 | 0 2564 | LINE 2565 | 8 2566 | Black 2567 | 10 2568 | 27 2569 | 20 2570 | -41.8456 2571 | 11 2572 | 27 2573 | 21 2574 | -18.992 2575 | 0 2576 | LINE 2577 | 8 2578 | Black 2579 | 10 2580 | 27 2581 | 20 2582 | -18.992 2583 | 11 2584 | 26.6651 2585 | 21 2586 | -18.9329 2587 | 0 2588 | LINE 2589 | 8 2590 | Black 2591 | 10 2592 | 26.6651 2593 | 20 2594 | -18.9329 2595 | 11 2596 | 26.6651 2597 | 21 2598 | -18.9329 2599 | 0 2600 | LINE 2601 | 8 2602 | Black 2603 | 10 2604 | 26.6651 2605 | 20 2606 | -18.9329 2607 | 11 2608 | 26.6569 2609 | 21 2610 | -18.9299 2611 | 0 2612 | LINE 2613 | 8 2614 | Black 2615 | 10 2616 | 26.6569 2617 | 20 2618 | -18.9299 2619 | 11 2620 | 26.6488 2621 | 21 2622 | -18.927 2623 | 0 2624 | LINE 2625 | 8 2626 | Black 2627 | 10 2628 | 26.6488 2629 | 20 2630 | -18.927 2631 | 11 2632 | 26.6488 2633 | 21 2634 | -18.927 2635 | 0 2636 | LINE 2637 | 8 2638 | Black 2639 | 10 2640 | 26.6488 2641 | 20 2642 | -18.927 2643 | 11 2644 | 26.3179 2645 | 21 2646 | -18.7359 2647 | 0 2648 | LINE 2649 | 8 2650 | Black 2651 | 10 2652 | 26.3179 2653 | 20 2654 | -18.7359 2655 | 11 2656 | 26.3046 2657 | 21 2658 | -18.7248 2659 | 0 2660 | LINE 2661 | 8 2662 | Black 2663 | 10 2664 | 26.3046 2665 | 20 2666 | -18.7248 2667 | 11 2668 | 26.3046 2669 | 21 2670 | -18.7248 2671 | 0 2672 | LINE 2673 | 8 2674 | Black 2675 | 10 2676 | 26.3046 2677 | 20 2678 | -18.7248 2679 | 11 2680 | 26.0591 2681 | 21 2682 | -18.4321 2683 | 0 2684 | LINE 2685 | 8 2686 | Black 2687 | 10 2688 | 26.0591 2689 | 20 2690 | -18.4321 2691 | 11 2692 | 26.0591 2693 | 21 2694 | -18.4321 2695 | 0 2696 | LINE 2697 | 8 2698 | Black 2699 | 10 2700 | 26.0591 2701 | 20 2702 | -18.4321 2703 | 11 2704 | 26.0504 2705 | 21 2706 | -18.4171 2707 | 0 2708 | LINE 2709 | 8 2710 | Black 2711 | 10 2712 | 26.0504 2713 | 20 2714 | -18.4171 2715 | 11 2716 | 25.9197 2717 | 21 2718 | -18.0581 2719 | 0 2720 | LINE 2721 | 8 2722 | Black 2723 | 10 2724 | 25.9197 2725 | 20 2726 | -18.0581 2727 | 11 2728 | 25.9167 2729 | 21 2730 | -18.041 2731 | 0 2732 | LINE 2733 | 8 2734 | Black 2735 | 10 2736 | 25.9167 2737 | 20 2738 | -18.041 2739 | 11 2740 | 25.9167 2741 | 21 2742 | -17.659 2743 | 0 2744 | LINE 2745 | 8 2746 | Black 2747 | 10 2748 | 25.9167 2749 | 20 2750 | -17.659 2751 | 11 2752 | 25.9197 2753 | 21 2754 | -17.6419 2755 | 0 2756 | LINE 2757 | 8 2758 | Black 2759 | 10 2760 | 25.9197 2761 | 20 2762 | -17.6419 2763 | 11 2764 | 26.0504 2765 | 21 2766 | -17.2829 2767 | 0 2768 | LINE 2769 | 8 2770 | Black 2771 | 10 2772 | 26.0504 2773 | 20 2774 | -17.2829 2775 | 11 2776 | 26.0591 2777 | 21 2778 | -17.2679 2779 | 0 2780 | LINE 2781 | 8 2782 | Black 2783 | 10 2784 | 26.0591 2785 | 20 2786 | -17.2679 2787 | 11 2788 | 26.0591 2789 | 21 2790 | -17.2679 2791 | 0 2792 | LINE 2793 | 8 2794 | Black 2795 | 10 2796 | 26.0591 2797 | 20 2798 | -17.2679 2799 | 11 2800 | 26.3046 2801 | 21 2802 | -16.9752 2803 | 0 2804 | LINE 2805 | 8 2806 | Black 2807 | 10 2808 | 26.3046 2809 | 20 2810 | -16.9752 2811 | 11 2812 | 26.3046 2813 | 21 2814 | -16.9752 2815 | 0 2816 | LINE 2817 | 8 2818 | Black 2819 | 10 2820 | 26.3046 2821 | 20 2822 | -16.9752 2823 | 11 2824 | 26.3179 2825 | 21 2826 | -16.9641 2827 | 0 2828 | LINE 2829 | 8 2830 | Black 2831 | 10 2832 | 26.3179 2833 | 20 2834 | -16.9641 2835 | 11 2836 | 26.6488 2837 | 21 2838 | -16.773 2839 | 0 2840 | LINE 2841 | 8 2842 | Black 2843 | 10 2844 | 26.6488 2845 | 20 2846 | -16.773 2847 | 11 2848 | 26.6488 2849 | 21 2850 | -16.773 2851 | 0 2852 | LINE 2853 | 8 2854 | Black 2855 | 10 2856 | 26.6488 2857 | 20 2858 | -16.773 2859 | 11 2860 | 26.6569 2861 | 21 2862 | -16.7701 2863 | 0 2864 | LINE 2865 | 8 2866 | Black 2867 | 10 2868 | 26.6569 2869 | 20 2870 | -16.7701 2871 | 11 2872 | 26.6651 2873 | 21 2874 | -16.7671 2875 | 0 2876 | LINE 2877 | 8 2878 | Black 2879 | 10 2880 | 26.6651 2881 | 20 2882 | -16.7671 2883 | 11 2884 | 27 2885 | 21 2886 | -16.708 2887 | 0 2888 | LINE 2889 | 8 2890 | Black 2891 | 10 2892 | 27 2893 | 20 2894 | -16.708 2895 | 11 2896 | 27 2897 | 21 2898 | -6.67071 2899 | 0 2900 | ENDSEC 2901 | 0 2902 | EOF 2903 | --------------------------------------------------------------------------------