From 0540bcfafdc386fdd02b482413087619ffdfe34f Mon Sep 17 00:00:00 2001 From: Mario Voigt Date: Mon, 2 Jun 2025 22:00:41 +0200 Subject: [PATCH] various fixes, especially on Boxes.py --- .../about_upgrade_mightyscape.py | 2 +- .../animate_order/animate_order.py | 2 +- .../bounding_box/bounding_box.py | 6 +- .../fablabchemnitz/boxes.py/ABox-thumb.svg | 1 + .../boxes.py/AgricolaInsert-thumb.svg | 1 + .../boxes.py/AirPurifier-thumb.svg | 1 + .../boxes.py/AllEdges-thumb.svg | 1 + .../boxes.py/AngledBox-thumb.svg | 1 + .../boxes.py/AngledCutJig-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Arcade-thumb.svg | 1 + .../boxes.py/Atreus21-thumb.svg | 1 + .../boxes.py/BasedBox-thumb.svg | 1 + .../boxes.py/BayonetBox-thumb.svg | 1 + .../fablabchemnitz/boxes.py/BinTray-thumb.svg | 1 + .../boxes.py/BirdHouse-thumb.svg | 1 + .../boxes.py/BookHolder-back-thumb.jpg | Bin 0 -> 5505 bytes .../boxes.py/BookHolder-back-thumb.svg | 1 + .../boxes.py/BookHolder-minis-side-thumb.jpg | Bin 0 -> 5069 bytes .../boxes.py/BookHolder-minis-side-thumb.svg | 1 + .../boxes.py/BookHolder-minis-thumb.jpg | Bin 0 -> 4076 bytes .../boxes.py/BookHolder-minis-thumb.svg | 1 + .../boxes.py/BookHolder-thumb.jpg | Bin 0 -> 5496 bytes .../boxes.py/BookHolder-thumb.svg | 1 + .../boxes.py/BottleTag-thumb.svg | 1 + .../boxes.py/BreadBox-thumb.svg | 1 + .../boxes.py/BrickSorter-2-thumb.jpg | Bin 0 -> 7226 bytes .../boxes.py/BrickSorter-2-thumb.svg | 1 + .../boxes.py/BrickSorter-3-thumb.jpg | Bin 0 -> 9009 bytes .../boxes.py/BrickSorter-3-thumb.svg | 1 + .../boxes.py/BrickSorter-4-thumb.jpg | Bin 0 -> 4566 bytes .../boxes.py/BrickSorter-4-thumb.svg | 1 + .../boxes.py/BrickSorter-5-thumb.jpg | Bin 0 -> 4476 bytes .../boxes.py/BrickSorter-5-thumb.svg | 1 + .../boxes.py/BrickSorter-6-thumb.jpg | Bin 0 -> 9239 bytes .../boxes.py/BrickSorter-6-thumb.svg | 1 + .../boxes.py/BrickSorter-thumb.jpg | Bin 0 -> 12220 bytes .../boxes.py/BrickSorter-thumb.svg | 1 + .../boxes.py/BurnTest-thumb.svg | 1 + .../boxes.py/CanStorage-thumb.svg | 1 + .../boxes.py/CanStorageAA-thumb.svg | 1 + .../boxes.py/CardBox-detail-thumb.svg | 1 + .../fablabchemnitz/boxes.py/CardBox-thumb.svg | 1 + .../boxes.py/CardHolder-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Castle-thumb.svg | 1 + .../boxes.py/ClosedBox-thumb.svg | 1 + .../boxes.py/CoffeeCapsuleHolder-thumb.svg | 1 + .../boxes.py/CoinBankSafe-closed-thumb.svg | 1 + .../boxes.py/CoinBankSafe-open-thumb.svg | 1 + .../boxes.py/CoinBankSafe-pins-thumb.svg | 1 + .../boxes.py/CoinBankSafe-thumb.svg | 1 + .../boxes.py/CoinDisplay-thumb.svg | 1 + .../boxes.py/CompartmentBox-closed-thumb.jpg | Bin 0 -> 5708 bytes .../boxes.py/CompartmentBox-closed-thumb.svg | 1 + .../boxes.py/CompartmentBox-lid-thumb.jpg | Bin 0 -> 5749 bytes .../boxes.py/CompartmentBox-lid-thumb.svg | 1 + .../boxes.py/CompartmentBox-thumb.jpg | Bin 0 -> 5928 bytes .../boxes.py/CompartmentBox-thumb.svg | 1 + .../boxes.py/ConcaveKnob-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Console-thumb.svg | 1 + .../Console2-backwall-detail-thumb.svg | 1 + .../boxes.py/Console2-panel-detail-thumb.svg | 1 + .../boxes.py/Console2-thumb.svg | 1 + .../boxes.py/ConsoleArcadeStickBack-thumb.svg | 1 + .../ConsoleArcadeStickFront-thumb.svg | 1 + .../ConsoleArcadeStickInside-thumb.svg | 1 + .../boxes.py/Desksign-thumb.svg | 1 + .../fablabchemnitz/boxes.py/DiceBox-thumb.svg | 1 + .../boxes.py/DiceTower-thumb.jpg | Bin 0 -> 4455 bytes .../boxes.py/DiceTower-thumb.svg | 1 + .../boxes.py/DiscRack-thumb.svg | 1 + .../boxes.py/Dispenser-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Display-thumb.jpg | Bin 16904 -> 5598 bytes .../fablabchemnitz/boxes.py/Display-thumb.svg | 1 + .../boxes.py/DisplayCase-thumb.svg | 1 + .../boxes.py/DisplayShelf-thumb.svg | 1 + .../boxes.py/DividerTray-thumb.svg | 1 + .../boxes.py/DoubleFlexDoorBox-thumb.svg | 1 + .../boxes.py/DrillBox-thumb.svg | 1 + .../boxes.py/DrillBoxes-thumb.svg | 1 + .../boxes.py/DrillStand-assembly-1-thumb.svg | 1 + .../boxes.py/DrillStand-assembly-2-thumb.svg | 1 + .../boxes.py/DrillStand-assembly-3-thumb.svg | 1 + .../boxes.py/DrillStand-assembly-4-thumb.svg | 1 + .../boxes.py/DrillStand-thumb.svg | 1 + .../boxes.py/ElectronicsBox-thumb.svg | 1 + .../boxes.py/EuroRackSkiff-thumb.svg | 1 + .../fablabchemnitz/boxes.py/FanHole-thumb.svg | 1 + .../boxes.py/FatBallDispenser-thumb.jpg | Bin 0 -> 6485 bytes .../boxes.py/FatBallDispenser-thumb.svg | 1 + .../boxes.py/FilamentSpool-2-thumb.svg | 1 + .../boxes.py/FilamentSpool-thumb.svg | 1 + .../boxes.py/FillTest-thumb.svg | 1 + .../boxes.py/FlexBook-2-thumb.svg | 1 + .../boxes.py/FlexBook-thumb.svg | 1 + .../fablabchemnitz/boxes.py/FlexBox-thumb.svg | 1 + .../boxes.py/FlexBox2-thumb.svg | 1 + .../boxes.py/FlexBox3-thumb.svg | 1 + .../boxes.py/FlexBox4-thumb.svg | 1 + .../boxes.py/FlexBox5-thumb.svg | 1 + .../boxes.py/FlexTest-thumb.svg | 1 + .../boxes.py/FlexTest2-thumb.svg | 1 + .../boxes.py/Folder-2-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Folder-thumb.svg | 1 + .../boxes.py/FrontPanel-thumb.svg | 1 + .../fablabchemnitz/boxes.py/GearBox-thumb.svg | 1 + .../boxes.py/GridfinityBase-thumb.svg | 1 + .../boxes.py/GridfinityDrillBox-thumb.jpg | Bin 0 -> 7748 bytes .../boxes.py/GridfinityDrillBox-thumb.svg | 1 + .../boxes.py/GridfinityTrayLayout-thumb.svg | 1 + .../fablabchemnitz/boxes.py/HalfBox-thumb.svg | 1 + .../boxes.py/HalfBox_AngleJig_usage-thumb.svg | 1 + .../boxes.py/HalfBox_Bookend_usage-thumb.svg | 1 + .../boxes.py/HalfBox_Shelf_usage-thumb.svg | 1 + .../boxes.py/HeartBox-thumb.svg | 1 + .../boxes.py/HingeBox-thumb.svg | 1 + .../boxes.py/HobbyCase-thumb.jpg | Bin 0 -> 4597 bytes .../boxes.py/HobbyCase-thumb.svg | 1 + .../boxes.py/HolePattern-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Hook-thumb.svg | 1 + .../boxes.py/IntegratedHingeBox-thumb.svg | 1 + .../boxes.py/JointPanel-thumb.svg | 1 + .../boxes.py/Kamishibai-thumb.jpg | Bin 0 -> 7757 bytes .../boxes.py/Kamishibai-thumb.svg | 1 + .../boxes.py/KeyHolder-2-thumb.svg | 1 + .../boxes.py/KeyHolder-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Keypad-thumb.svg | 1 + .../fablabchemnitz/boxes.py/LBeam-thumb.svg | 1 + .../boxes.py/LaptopStand-thumb.svg | 1 + .../boxes.py/LaserClamp-thumb.svg | 1 + .../boxes.py/LaserHoldfast-thumb.svg | 1 + .../boxes.py/MagazineFile-thumb.svg | 1 + .../boxes.py/MakitaPowerSupply-thumb.svg | 1 + .../samples => }/March36539-box-thumb.jpg | Bin .../boxes.py/March36539-box-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Matrix-thumb.jpg | Bin 0 -> 13956 bytes .../fablabchemnitz/boxes.py/Matrix-thumb.svg | 1 + .../boxes.py/NemaPattern-thumb.svg | 1 + .../boxes.py/NightLightBox-thumb.jpg | Bin 0 -> 8679 bytes .../boxes.py/NightLightBox-thumb.svg | 1 + .../boxes.py/NotesHolder-thumb.svg | 1 + .../fablabchemnitz/boxes.py/OpenBox-thumb.svg | 1 + .../boxes.py/OttoBody-thumb.svg | 1 + .../boxes.py/OttoLegs-thumb.svg | 1 + .../boxes.py/OttoSoles-thumb.svg | 1 + .../boxes.py/PaintStorage-thumb.svg | 1 + .../boxes.py/PaperBox-thumb.svg | 1 + .../boxes.py/PhoneHolder-thumb.svg | 1 + .../boxes.py/PhotoFrame-thumb.jpg | Bin 0 -> 9279 bytes .../boxes.py/PhotoFrame-thumb.svg | 1 + .../boxes.py/PirateChest-thumb.svg | 1 + .../boxes.py/PizzaShovel-thumb.svg | 1 + .../boxes.py/Platonic-Icosahedron-thumb.svg | 1 + .../boxes.py/Platonic-thumb.svg | 1 + .../boxes.py/Rack19Box-thumb.svg | 1 + .../fablabchemnitz/boxes.py/RackBox-thumb.svg | 1 + .../boxes.py/RectangularWall-thumb.svg | 1 + .../boxes.py/RegularBox-thumb.svg | 1 + .../boxes.py/RegularStarBox-2-thumb.svg | 1 + .../boxes.py/RegularStarBox-thumb.svg | 1 + .../boxes.py/RobotArm-thumb.svg | 1 + .../boxes.py/RollHolder-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Rotary-thumb.svg | 1 + .../boxes.py/RoundedBox-2-thumb.svg | 1 + .../boxes.py/RoundedBox-3-thumb.svg | 1 + .../boxes.py/RoundedBox-thumb.svg | 1 + .../boxes.py/RoundedRegularBox-thumb.jpg | Bin 0 -> 10236 bytes .../boxes.py/RoundedRegularBox-thumb.svg | 1 + .../boxes.py/RoundedRegularBox2-thumb.jpg | Bin 0 -> 12185 bytes .../boxes.py/RoundedRegularBox2-thumb.svg | 1 + .../boxes.py/RoyalGame-2-thumb.svg | 1 + .../boxes.py/RoyalGame-3-thumb.svg | 1 + .../boxes.py/RoyalGame-thumb.svg | 1 + .../boxes.py/SBCMicroRack-thumb.svg | 1 + .../boxes.py/SevenSegmentClock-thumb.jpg | Bin 0 -> 7485 bytes .../boxes.py/SevenSegmentClock-thumb.svg | 1 + .../boxes.py/SevenSegmentPattern-thumb.svg | 1 + .../boxes.py/Shadowbox-backlit-thumb.svg | 1 + .../boxes.py/Shadowbox-diagram-thumb.svg | 1 + .../boxes.py/Shadowbox-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Shoe-thumb.svg | 1 + .../boxes.py/ShutterBox-2-thumb.svg | 1 + .../boxes.py/ShutterBox-3-thumb.svg | 1 + .../boxes.py/ShutterBox-thumb.svg | 1 + .../boxes.py/SideDoorHousing-2-thumb.svg | 1 + .../boxes.py/SideDoorHousing-thumb.svg | 1 + .../boxes.py/SideHingeBox-thumb.jpg | Bin 0 -> 6835 bytes .../boxes.py/SideHingeBox-thumb.svg | 1 + .../boxes.py/Silverware-thumb.svg | 1 + .../boxes.py/SkadisBoard-thumb.svg | 1 + .../boxes.py/SlantedTray-2-thumb.svg | 1 + .../boxes.py/SlantedTray-thumb.svg | 1 + .../boxes.py/SlidingDrawer-thumb.svg | 1 + .../boxes.py/SlidingLidBox-2-thumb.jpg | Bin 0 -> 6524 bytes .../boxes.py/SlidingLidBox-2-thumb.svg | 1 + .../boxes.py/SlidingLidBox-thumb.jpg | Bin 0 -> 6997 bytes .../boxes.py/SlidingLidBox-thumb.svg | 1 + .../boxes.py/SmallPartsTray-thumb.svg | 1 + .../boxes.py/SmallPartsTray2-thumb.svg | 1 + .../boxes.py/SpicesRack-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Spool-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Stachel-thumb.svg | 1 + .../boxes.py/StackableBin-thumb.jpg | Bin 0 -> 3976 bytes .../boxes.py/StackableBin-thumb.svg | 1 + .../boxes.py/StorageRack-2-thumb.svg | 1 + .../boxes.py/StorageRack-3-thumb.svg | 1 + .../boxes.py/StorageRack-thumb.svg | 1 + .../boxes.py/StorageShelf-thumb.svg | 1 + .../fablabchemnitz/boxes.py/Tetris-thumb.svg | 1 + .../boxes.py/TrafficLight-thumb.svg | 1 + .../boxes.py/TrayInsert-2-thumb.svg | 1 + .../boxes.py/TrayInsert-thumb.svg | 1 + .../boxes.py/TrayLayout-thumb.svg | 1 + .../boxes.py/TrayLayout2-thumb.svg | 1 + .../boxes.py/TwoPiece-thumb.svg | 1 + .../boxes.py/TwoPiece2-thumb.svg | 1 + .../boxes.py/TypeTray-thumb.svg | 1 + .../fablabchemnitz/boxes.py/UBox-thumb.svg | 1 + .../boxes.py/UnevenHeightBox-thumb.svg | 1 + .../boxes.py/UniversalBox-thumb.svg | 1 + .../boxes.py/WallCaliper-thumb.svg | 1 + .../boxes.py/WallChiselHolder-thumb.svg | 1 + .../boxes.py/WallConsole-thumb.svg | 1 + .../boxes.py/WallDrillBox-thumb.svg | 1 + .../boxes.py/WallHopper-thumb.jpg | Bin 0 -> 14855 bytes .../boxes.py/WallHopper-thumb.svg | 1 + .../boxes.py/WallPinRow-thumb.svg | 1 + .../boxes.py/WallPlaneHolder-thumb.svg | 1 + .../boxes.py/WallPliersHolder-thumb.svg | 1 + .../boxes.py/WallRack-thumb.svg | 1 + .../boxes.py/WallRollHolder-thumb.svg | 1 + .../boxes.py/WallSlottedHolder-thumb.svg | 1 + .../boxes.py/WallStackableBin-thumb.jpg | Bin 0 -> 7869 bytes .../boxes.py/WallStackableBin-thumb.svg | 1 + .../boxes.py/WallStairs-thumb.svg | 1 + .../boxes.py/WallTypeTray-thumb.svg | 1 + .../boxes.py/WallWrenchHolder-thumb.svg | 1 + .../boxes.py/WineRack-thumb.svg | 1 + .../boxes.py/ZBeam-flanged-ubeam-thumb.jpg | Bin 0 -> 6260 bytes .../boxes.py/ZBeam-flanged-ubeam-thumb.svg | 1 + .../fablabchemnitz/boxes.py/ZBeam-thumb.jpg | Bin 0 -> 6521 bytes .../fablabchemnitz/boxes.py/ZBeam-thumb.svg | 1 + .../fablabchemnitz/boxes.py/boxes.py.ABox.inx | 3 +- .../boxes.py/boxes.py.AgricolaInsert.inx | 3 +- .../boxes.py/boxes.py.AirPurifier.inx | 3 +- .../boxes.py/boxes.py.AllEdges.inx | 7 +- .../boxes.py/boxes.py.AngledBox.inx | 3 +- .../boxes.py/boxes.py.AngledCutJig.inx | 3 +- .../boxes.py/boxes.py.Arcade.inx | 3 +- .../boxes.py/boxes.py.Atreus21.inx | 3 +- .../boxes.py/boxes.py.BasedBox.inx | 3 +- .../boxes.py/boxes.py.BayonetBox.inx | 3 +- .../boxes.py/boxes.py.BinTray.inx | 3 +- .../boxes.py/boxes.py.BirdHouse.inx | 3 +- .../boxes.py/boxes.py.BookHolder.inx | 3 +- .../boxes.py/boxes.py.BottleStack.inx | 3 +- .../boxes.py/boxes.py.BottleTag.inx | 3 +- .../boxes.py/boxes.py.BreadBox.inx | 3 +- .../boxes.py/boxes.py.BrickSorter.inx | 3 +- .../boxes.py/boxes.py.BurnTest.inx | 3 +- .../boxes.py/boxes.py.CanStorage.inx | 3 +- .../boxes.py/boxes.py.CarbonFilter.inx | 3 +- .../boxes.py/boxes.py.CardBox.inx | 3 +- .../boxes.py/boxes.py.CardHolder.inx | 3 +- .../boxes.py/boxes.py.Castle.inx | 3 +- .../boxes.py/boxes.py.ClosedBox.inx | 3 +- .../boxes.py/boxes.py.CoffeeCapsuleHolder.inx | 5 +- .../boxes.py/boxes.py.CoinBankSafe.inx | 3 +- .../boxes.py/boxes.py.CoinDisplay.inx | 3 +- .../boxes.py/boxes.py.CompartmentBox.inx | 5 +- .../boxes.py/boxes.py.ConcaveKnob.inx | 3 +- .../boxes.py/boxes.py.Console.inx | 3 +- .../boxes.py/boxes.py.Console2.inx | 3 +- .../boxes.py/boxes.py.Desksign.inx | 7 +- .../boxes.py/boxes.py.DiceBox.inx | 3 +- .../boxes.py/boxes.py.DiceTower.inx | 3 +- .../boxes.py/boxes.py.DinRailBox.inx | 3 +- .../boxes.py/boxes.py.DiscRack.inx | 3 +- .../boxes.py/boxes.py.Dispenser.inx | 4 +- .../boxes.py/boxes.py.Display.inx | 3 +- .../boxes.py/boxes.py.DisplayCase.inx | 3 +- .../boxes.py/boxes.py.DisplayShelf.inx | 3 +- .../boxes.py/boxes.py.DividerTray.inx | 3 +- .../boxes.py/boxes.py.DoubleFlexDoorBox.inx | 3 +- .../boxes.py/boxes.py.DrillBox.inx | 3 +- .../boxes.py/boxes.py.DrillStand.inx | 3 +- .../boxes.py/boxes.py.ElectronicsBox.inx | 3 +- .../boxes.py/boxes.py.EuroRackSkiff.inx | 3 +- .../boxes.py/boxes.py.FanHole.inx | 3 +- .../boxes.py/boxes.py.FatBallDispenser.inx | 52 + .../boxes.py/boxes.py.FilamentSpool.inx | 3 +- .../boxes.py/boxes.py.FillTest.inx | 3 +- .../boxes.py/boxes.py.FlexBook.inx | 3 +- .../boxes.py/boxes.py.FlexBox.inx | 3 +- .../boxes.py/boxes.py.FlexBox2.inx | 3 +- .../boxes.py/boxes.py.FlexBox3.inx | 3 +- .../boxes.py/boxes.py.FlexBox4.inx | 3 +- .../boxes.py/boxes.py.FlexBox5.inx | 3 +- .../boxes.py/boxes.py.FlexTest.inx | 3 +- .../boxes.py/boxes.py.FlexTest2.inx | 3 +- .../boxes.py/boxes.py.Folder.inx | 3 +- .../boxes.py/boxes.py.FrontPanel.inx | 3 +- .../boxes.py/boxes.py.GearBox.inx | 3 +- .../boxes.py/boxes.py.Gears.inx | 3 +- .../boxes.py/boxes.py.GridfinityBase.inx | 31 +- .../boxes.py/boxes.py.GridfinityDrillBox.inx | 3 +- .../boxes.py.GridfinityTrayLayout.inx | 13 +- .../boxes.py/boxes.py.HalfBox.inx | 3 +- .../boxes.py/boxes.py.HeartBox.inx | 3 +- .../boxes.py/boxes.py.HingeBox.inx | 3 +- .../boxes.py/boxes.py.HobbyCase.inx | 66 + .../boxes.py/boxes.py.HolePattern.inx | 3 +- .../fablabchemnitz/boxes.py/boxes.py.Hook.inx | 3 +- .../boxes.py/boxes.py.IntegratedHingeBox.inx | 3 +- .../boxes.py/boxes.py.JointPanel.inx | 3 +- .../boxes.py/boxes.py.Kamishibai.inx | 122 + .../boxes.py/boxes.py.KeyHolder.inx | 3 +- .../boxes.py/boxes.py.Keypad.inx | 3 +- .../boxes.py/boxes.py.LBeam.inx | 3 +- .../boxes.py/boxes.py.LaptopStand.inx | 3 +- .../boxes.py/boxes.py.LaserClamp.inx | 3 +- .../boxes.py/boxes.py.LaserHoldfast.inx | 3 +- .../boxes.py/boxes.py.MagazineFile.inx | 3 +- .../boxes.py/boxes.py.MakitaPowerSupply.inx | 3 +- .../boxes.py/boxes.py.Matrix.inx | 3 +- .../boxes.py/boxes.py.NemaMount.inx | 3 +- .../boxes.py/boxes.py.NemaPattern.inx | 3 +- .../boxes.py/boxes.py.NightLightBox.inx | 88 + .../boxes.py/boxes.py.NotesHolder.inx | 3 +- .../boxes.py/boxes.py.OpenBox.inx | 3 +- .../boxes.py/boxes.py.OrganPipe.inx | 3 +- .../boxes.py/boxes.py.OttoBody.inx | 3 +- .../boxes.py/boxes.py.OttoLegs.inx | 3 +- .../boxes.py/boxes.py.OttoSoles.inx | 3 +- .../boxes.py/boxes.py.PaintStorage.inx | 3 +- .../boxes.py/boxes.py.PaperBox.inx | 3 +- .../boxes.py/boxes.py.PhoneHolder.inx | 3 +- .../boxes.py/boxes.py.PhotoFrame.inx | 3 +- .../boxes.py/boxes.py.PirateChest.inx | 7 +- .../boxes.py/boxes.py.PizzaShovel.inx | 3 +- .../boxes.py/boxes.py.Planetary.inx | 3 +- .../boxes.py/boxes.py.Planetary2.inx | 3 +- .../boxes.py/boxes.py.Platonic.inx | 3 +- .../boxes.py/boxes.py.PoleHook.inx | 3 +- .../boxes.py/boxes.py.Pulley.inx | 3 +- .../boxes.py/boxes.py.Rack10Box.inx | 3 +- .../boxes.py/boxes.py.Rack19Box.inx | 3 +- .../boxes.py/boxes.py.Rack19HalfWidth.inx | 3 +- .../boxes.py/boxes.py.RackBox.inx | 3 +- .../boxes.py/boxes.py.RectangularWall.inx | 7 +- .../boxes.py/boxes.py.RegularBox.inx | 3 +- .../boxes.py/boxes.py.RegularStarBox.inx | 3 +- .../boxes.py/boxes.py.RobotArm.inx | 3 +- .../boxes.py/boxes.py.RollHolder.inx | 3 +- .../boxes.py/boxes.py.Rotary.inx | 3 +- .../boxes.py/boxes.py.RoundedBox.inx | 5 +- .../boxes.py/boxes.py.RoundedRegularBox.inx | 5 +- .../boxes.py/boxes.py.RoyalGame.inx | 3 +- .../boxes.py/boxes.py.SBCMicroRack.inx | 3 +- .../boxes.py/boxes.py.SevenSegmentClock.inx | 3 +- .../boxes.py/boxes.py.SevenSegmentPattern.inx | 3 +- .../boxes.py/boxes.py.Shadowbox.inx | 3 +- .../fablabchemnitz/boxes.py/boxes.py.Shoe.inx | 3 +- .../boxes.py/boxes.py.ShutterBox.inx | 3 +- .../boxes.py/boxes.py.SideDoorHousing.inx | 3 +- .../boxes.py/boxes.py.SideHingeBox.inx | 3 +- .../boxes.py/boxes.py.Silverware.inx | 3 +- .../boxes.py/boxes.py.SkadisBoard.inx | 5 +- .../boxes.py/boxes.py.SlantedTray.inx | 3 +- .../boxes.py/boxes.py.SlidingDrawer.inx | 4 +- .../boxes.py/boxes.py.SlidingLidBox.inx | 72 + .../boxes.py/boxes.py.SmallPartsTray.inx | 3 +- .../boxes.py/boxes.py.SmallPartsTray2.inx | 90 +- .../boxes.py/boxes.py.SpicesRack.inx | 3 +- .../boxes.py/boxes.py.Spool.inx | 3 +- .../boxes.py/boxes.py.Stachel.inx | 3 +- .../boxes.py/boxes.py.StackableBin.inx | 3 +- .../boxes.py/boxes.py.StorageRack.inx | 3 +- .../boxes.py/boxes.py.StorageShelf.inx | 7 +- .../boxes.py/boxes.py.Tetris.inx | 3 +- .../boxes.py/boxes.py.TrafficLight.inx | 3 +- .../boxes.py/boxes.py.TrayInsert.inx | 5 +- .../boxes.py/boxes.py.TriangleLamp.inx | 3 +- .../boxes.py/boxes.py.TwoPiece.inx | 3 +- .../boxes.py/boxes.py.TypeTray.inx | 9 +- .../fablabchemnitz/boxes.py/boxes.py.UBox.inx | 7 +- .../boxes.py/boxes.py.UnevenHeightBox.inx | 5 +- .../boxes.py/boxes.py.UniversalBox.inx | 7 +- .../boxes.py/boxes.py.WallCaliper.inx | 14 +- .../boxes.py/boxes.py.WallChiselHolder.inx | 14 +- .../boxes.py/boxes.py.WallConsole.inx | 14 +- .../boxes.py/boxes.py.WallDrillBox.inx | 16 +- .../boxes.py/boxes.py.WallEdges.inx | 14 +- .../boxes.py/boxes.py.WallHopper.inx | 110 + .../boxes.py/boxes.py.WallPinRow.inx | 14 +- .../boxes.py/boxes.py.WallPlaneHolder.inx | 14 +- .../boxes.py/boxes.py.WallPliersHolder.inx | 14 +- .../boxes.py/boxes.py.WallRack.inx | 3 +- .../boxes.py/boxes.py.WallRollHolder.inx | 14 +- .../boxes.py/boxes.py.WallSlottedHolder.inx | 14 +- .../boxes.py/boxes.py.WallStackableBin.inx | 115 + .../boxes.py/boxes.py.WallStairs.inx | 14 +- .../boxes.py/boxes.py.WallTypeTray.inx | 16 +- .../boxes.py/boxes.py.WallWrenchHolder.inx | 14 +- .../boxes.py/boxes.py.WavyKnob.inx | 3 +- .../boxes.py/boxes.py.WineRack.inx | 3 +- .../boxes.py/boxes.py.ZBeam.inx | 68 + .../boxes.py/boxes/CODE_OF_CONDUCT.md | 1 - .../boxes.py/boxes/CONTRIBUTING.rst | 182 - .../fablabchemnitz/boxes.py/boxes/LICENSE.txt | 674 -- .../fablabchemnitz/boxes.py/boxes/MANIFEST.in | 6 - .../fablabchemnitz/boxes.py/boxes/README.rst | 62 - .../boxes.py/boxes/boxes/Color.py | 16 - .../boxes.py/boxes/boxes/__init__.py | 2988 ------ .../boxes.py/boxes/boxes/drawing.py | 1051 -- .../boxes.py/boxes/boxes/edges.py | 2666 ----- .../boxes.py/boxes/boxes/extents.py | 43 - .../boxes.py/boxes/boxes/formats.py | 105 - .../boxes.py/boxes/boxes/gears.py | 709 -- .../boxes/boxes/generators/__init__.py | 80 - .../boxes/boxes/generators/_swtemplate.py | 46 - .../boxes/boxes/generators/_template.py | 61 - .../boxes.py/boxes/boxes/generators/abox.py | 61 - .../boxes/boxes/generators/agricolainsert.py | 931 -- .../boxes/boxes/generators/airpurifier.py | 171 - .../boxes/boxes/generators/alledges.py | 60 - .../boxes/boxes/generators/angledbox.py | 141 - .../boxes/boxes/generators/angledcutjig.py | 64 - .../boxes.py/boxes/boxes/generators/arcade.py | 116 - .../boxes/boxes/generators/atreus21.py | 117 - .../boxes/boxes/generators/basedbox.py | 54 - .../boxes/boxes/generators/bayonetbox.py | 128 - .../boxes/boxes/generators/bintray.py | 158 - .../boxes/boxes/generators/birdhouse.py | 101 - .../boxes/boxes/generators/bottlestack.py | 163 - .../boxes/boxes/generators/bottletag.py | 87 - .../boxes/boxes/generators/breadbox.py | 150 - .../boxes/boxes/generators/burntest.py | 115 - .../boxes/boxes/generators/can_storage.py | 365 - .../boxes/boxes/generators/carbonfilter.py | 240 - .../boxes/boxes/generators/cardbox.py | 250 - .../boxes/boxes/generators/cardholder.py | 112 - .../boxes.py/boxes/boxes/generators/castle.py | 44 - .../boxes/boxes/generators/closedbox.py | 57 - .../boxes/generators/coffeecapsulesholder.py | 132 - .../boxes/boxes/generators/coinbanksafe.py | 223 - .../boxes/boxes/generators/coindisplay.py | 114 - .../boxes/boxes/generators/concaveknob.py | 63 - .../boxes/boxes/generators/console.py | 74 - .../boxes/boxes/generators/console2.py | 302 - .../boxes/boxes/generators/desksign.py | 86 - .../boxes/boxes/generators/dicebox.py | 123 - .../boxes/boxes/generators/dinrailbox.py | 148 - .../boxes/boxes/generators/discrack.py | 266 - .../boxes/boxes/generators/dispenser.py | 115 - .../boxes/boxes/generators/display.py | 52 - .../boxes/boxes/generators/displaycase.py | 59 - .../boxes/boxes/generators/displayshelf.py | 196 - .../boxes/boxes/generators/dividertray.py | 640 -- .../boxes/generators/doubleflexdoorbox.py | 128 - .../boxes/boxes/generators/drillbox.py | 129 - .../boxes/boxes/generators/drillstand.py | 233 - .../boxes.py/boxes/boxes/generators/edges.py | 33 - .../boxes/boxes/generators/electronicsbox.py | 95 - .../boxes/boxes/generators/eurorackskiff.py | 60 - .../boxes/boxes/generators/fanhole.py | 107 - .../boxes/boxes/generators/filamentspool.py | 98 - .../boxes/boxes/generators/filltest.py | 75 - .../boxes/boxes/generators/flexbook.py | 313 - .../boxes/boxes/generators/flexbox.py | 122 - .../boxes/boxes/generators/flexbox2.py | 118 - .../boxes/boxes/generators/flexbox3.py | 163 - .../boxes/boxes/generators/flexbox4.py | 115 - .../boxes/boxes/generators/flexbox5.py | 122 - .../boxes/boxes/generators/flextest.py | 42 - .../boxes/boxes/generators/flextest2.py | 34 - .../boxes.py/boxes/boxes/generators/folder.py | 44 - .../boxes/boxes/generators/frontpanel.py | 211 - .../boxes/generators/frontpanel_test.json | 3 - .../boxes.py/boxes/boxes/generators/gear.py | 95 - .../boxes/boxes/generators/gearbox.py | 94 - .../boxes/boxes/generators/gridfinitybase.py | 89 - .../boxes/generators/gridfinitytraylayout.py | 116 - .../boxes/boxes/generators/halfbox.py | 155 - .../boxes.py/boxes/boxes/generators/heart.py | 69 - .../boxes/boxes/generators/hingebox.py | 88 - .../boxes/boxes/generators/holepattern.py | 74 - .../boxes.py/boxes/boxes/generators/hooks.py | 122 - .../boxes/generators/integratedhingebox.py | 62 - .../boxes.py/boxes/boxes/generators/jigsaw.py | 83 - .../boxes/boxes/generators/jointpanel.py | 65 - .../boxes/boxes/generators/keyboard.py | 284 - .../boxes/boxes/generators/keyholder.py | 185 - .../boxes.py/boxes/boxes/generators/keypad.py | 140 - .../boxes.py/boxes/boxes/generators/lamp.py | 129 - .../boxes/boxes/generators/laptopstand.py | 200 - .../boxes/boxes/generators/laserclamp.py | 97 - .../boxes/boxes/generators/laserholdfast.py | 43 - .../boxes.py/boxes/boxes/generators/lbeam.py | 40 - .../boxes/boxes/generators/magazinefile.py | 89 - .../boxes/generators/makitapowersupply.py | 133 - .../boxes/boxes/generators/microrack.py | 199 - .../boxes/boxes/generators/nemamount.py | 54 - .../boxes/boxes/generators/nemapattern.py | 39 - .../boxes/boxes/generators/notesholder.py | 178 - .../boxes/boxes/generators/openbox.py | 47 - .../boxes/boxes/generators/organpipe.py | 147 - .../boxes/boxes/generators/ottobody.py | 163 - .../boxes/boxes/generators/ottolegs.py | 150 - .../boxes/boxes/generators/ottosoles.py | 70 - .../boxes/boxes/generators/paintbox.py | 162 - .../boxes/boxes/generators/paperbox.py | 276 - .../boxes/boxes/generators/phoneholder.py | 305 - .../boxes/boxes/generators/piratechest.py | 134 - .../boxes/boxes/generators/pizzashovel.py | 100 - .../boxes/boxes/generators/planetary.py | 101 - .../boxes/boxes/generators/planetary2.py | 208 - .../boxes/boxes/generators/platonic.py | 124 - .../boxes/boxes/generators/polehook.py | 127 - .../boxes.py/boxes/boxes/generators/pulley.py | 77 - .../boxes/boxes/generators/rack10box.py | 23 - .../boxes/boxes/generators/rack19box.py | 97 - .../boxes/boxes/generators/rack19halfwidth.py | 96 - .../boxes/boxes/generators/rackbox.py | 93 - .../boxes/boxes/generators/rectangularWall.py | 70 - .../boxes/boxes/generators/regularbox.py | 167 - .../boxes/boxes/generators/regularstarbox.py | 103 - .../boxes/boxes/generators/robotarm.py | 58 - .../boxes/boxes/generators/rollholder.py | 133 - .../boxes.py/boxes/boxes/generators/rotary.py | 324 - .../boxes/boxes/generators/roundedbox.py | 136 - .../boxes/boxes/generators/royalgame.py | 186 - .../boxes/boxes/generators/sevensegment.py | 109 - .../boxes/generators/sevensegmentclock.py | 86 - .../boxes/boxes/generators/shadowbox.py | 110 - .../boxes.py/boxes/boxes/generators/shoe.py | 146 - .../boxes/boxes/generators/shutterbox.py | 231 - .../boxes/boxes/generators/sidedoorhousing.py | 121 - .../boxes/boxes/generators/silverwarebox.py | 107 - .../boxes.py/boxes/boxes/generators/skadis.py | 44 - .../boxes/boxes/generators/slantedtray.py | 87 - .../boxes/boxes/generators/slidingdrawer.py | 50 - .../boxes/boxes/generators/smallpartstray.py | 255 - .../boxes/boxes/generators/smallpartstray2.py | 233 - .../boxes/boxes/generators/spicesrack.py | 173 - .../boxes.py/boxes/boxes/generators/spool.py | 99 - .../boxes/boxes/generators/stachel.py | 95 - .../boxes/boxes/generators/storagerack.py | 111 - .../boxes/boxes/generators/storageshelf.py | 147 - .../boxes.py/boxes/boxes/generators/tetris.py | 90 - .../boxes/boxes/generators/trafficlight.py | 206 - .../boxes/boxes/generators/trayinsert.py | 47 - .../boxes/boxes/generators/traylayout.py | 472 - .../boxes/boxes/generators/trianglelamp.py | 112 - .../boxes/boxes/generators/two_piece.py | 68 - .../boxes/boxes/generators/typetray.py | 355 - .../boxes.py/boxes/boxes/generators/ubox.py | 101 - .../boxes/boxes/generators/unevenheightbox.py | 100 - .../boxes/boxes/generators/universalbox.py | 104 - .../boxes/generators/wallcaliperholder.py | 64 - .../boxes/generators/wallchiselholder.py | 125 - .../boxes/boxes/generators/wallconsole.py | 67 - .../boxes/boxes/generators/walldrillbox.py | 55 - .../boxes/boxes/generators/walledges.py | 49 - .../boxes/boxes/generators/wallpinrow.py | 177 - .../boxes/boxes/generators/wallplaneholder.py | 59 - .../boxes/generators/wallpliersholder.py | 88 - .../boxes/boxes/generators/wallrack.py | 92 - .../boxes/boxes/generators/wallrollholder.py | 118 - .../boxes/generators/wallslottedholder.py | 125 - .../boxes/boxes/generators/wallstairs.py | 82 - .../boxes/boxes/generators/walltypetray.py | 123 - .../boxes/generators/wallwrenchholder.py | 95 - .../boxes/boxes/generators/wavyknob.py | 57 - .../boxes/boxes/generators/winerack.py | 131 - .../boxes.py/boxes/boxes/lids.py | 337 - .../boxes.py/boxes/boxes/parts.py | 169 - .../boxes.py/boxes/boxes/pulley.py | 141 - .../boxes.py/boxes/boxes/qrcode_factory.py | 63 - .../boxes.py/boxes/boxes/robot.py | 185 - .../boxes.py/boxes/boxes/servos.py | 121 - .../boxes.py/boxes/boxes/vectors.py | 117 - .../boxes.py/boxes/boxes/walledges.py | 447 - .../boxes.py/boxes/documentation/boxes.1 | 63 - .../boxes.py/boxes/documentation/boxes.xml | 135 - .../boxes/documentation/boxesserver.1 | 64 - .../boxes/documentation/boxesserver.xml | 132 - .../boxes/documentation/presentation.odp | Bin 882188 -> 0 bytes .../boxes/documentation/src/CONTRIBUTING.rst | 1 - .../boxes.py/boxes/documentation/src/Makefile | 20 - .../boxes/documentation/src/README.rst | 2 - .../documentation/src/api_architecture.rst | 97 - .../boxes/documentation/src/api_arguments.rst | 75 - .../boxes/documentation/src/api_burn.rst | 80 - .../boxes/documentation/src/api_drawing.rst | 90 - .../boxes/documentation/src/api_edges.rst | 193 - .../boxes/documentation/src/api_examples.rst | 97 - .../documentation/src/api_existing_parts.rst | 27 - .../boxes/documentation/src/api_generator.rst | 45 - .../documentation/src/api_navigation.rst | 42 - .../boxes/documentation/src/api_parts.rst | 86 - .../boxes/documentation/src/apidoc.rst | 20 - .../boxes/documentation/src/boxes.rst | 120 - .../boxes/documentation/src/boxes2rst.py | 58 - .../boxes.py/boxes/documentation/src/burn.svg | 61 - .../boxes/documentation/src/burn2.svg | 99 - .../boxes.py/boxes/documentation/src/conf.py | 94 - .../boxes.py/boxes/documentation/src/faq.rst | 54 - .../boxes/documentation/src/generators.rst | 9 - .../boxes/documentation/src/index.html | 15 - .../boxes/documentation/src/index.rst | 27 - .../boxes/documentation/src/install.rst | 112 - .../src/install/log-wsl-win11.txt | 173 - .../boxes/documentation/src/install/macos.rst | 124 - .../win11-wsl-boxesserver-localhost.png | Bin 245452 -> 0 bytes .../documentation/src/install/windows.rst | 93 - .../install/windows_boxespy_zip_extract.png | Bin 43195 -> 0 bytes .../src/install/windows_browser_boxespy.png | Bin 38916 -> 0 bytes .../windows_browser_download_boxespy.png | Bin 50333 -> 0 bytes .../windows_browser_download_python.png | Bin 78034 -> 0 bytes ...indows_cmd_python_boxesserver_firewall.png | Bin 50085 -> 0 bytes .../install/windows_install_python_path.png | Bin 210329 -> 0 bytes .../boxes.py/boxes/documentation/src/make.bat | 35 - .../boxes/documentation/src/modules.rst | 9 - .../boxes/documentation/src/overcuts.svg | 62 - .../boxes.py/boxes/documentation/src/static | 1 - .../boxes/documentation/src/usermanual.rst | 253 - .../boxes.py/boxes/examples/box2.svg | 10 - .../boxes.py/boxes/examples/box3.svg | 9 - .../boxes.py/boxes/examples/castle.svg | 11 - .../boxes.py/boxes/examples/drillbox.svg | 178 - .../boxes.py/boxes/examples/flexbox.svg | 6 - .../boxes.py/boxes/examples/flexbox2.svg | 7 - .../boxes.py/boxes/examples/flexbox3.svg | 8 - .../boxes.py/boxes/examples/folder.svg | 6 - .../boxes.py/boxes/examples/generate.sh | 21 - .../boxes.py/boxes/examples/lamp.svg | 14 - .../boxes.py/boxes/examples/magazinefile.svg | 9 - .../boxes.py/boxes/examples/silverwarebox.svg | 10 - .../boxes.py/boxes/examples/trayinsert.svg | 9 - .../boxes.py/boxes/examples/traylayout.svg | 16 - .../boxes.py/boxes/examples/traylayout.txt | 13 - .../boxes.py/boxes/examples/typetray.svg | 14 - .../boxes/locale/de/LC_MESSAGES/boxes.py.mo | Bin 57153 -> 0 bytes .../boxes/locale/en/LC_MESSAGES/boxes.py.mo | Bin 54196 -> 0 bytes .../boxes/locale/fr/LC_MESSAGES/boxes.py.mo | Bin 59142 -> 0 bytes .../locale/zh_CN/LC_MESSAGES/boxes.py.mo | Bin 62142 -> 0 bytes .../boxes.py/boxes/po/boxes.py.pot | 8668 ----------------- .../fablabchemnitz/boxes.py/boxes/po/de.po | 3889 -------- .../fablabchemnitz/boxes.py/boxes/po/en.po | 3871 -------- .../fablabchemnitz/boxes.py/boxes/po/fr.po | 3846 -------- .../boxes.py/boxes/po/readme.txt | 15 - .../boxes.py/boxes/po/zanata.xml | 8 - .../fablabchemnitz/boxes.py/boxes/po/zh_CN.po | 2792 ------ .../boxes.py/boxes/scripts/Dockerfile | 29 - .../boxes.py/boxes/scripts/boxes | 112 - .../boxes.py/boxes/scripts/boxes2inkscape | 155 - .../boxes.py/boxes/scripts/boxes2pot | 150 - .../boxes/scripts/boxes_example.ipynb | 176 - .../boxes.py/boxes/scripts/boxes_proxy.py | 77 - .../boxes.py/boxes/scripts/boxesserver | 711 -- .../boxes.py/boxes/scripts/gen_thumbnails.sh | 34 - .../boxes.py/boxes/static/boxes-logo.svg | 340 - .../boxes.py/boxes/static/favicon.ico | Bin 16958 -> 0 bytes .../boxes.py/boxes/static/fonts.css | 41 - .../bungee-shade-latin-400-normal.woff2 | Bin 43456 -> 0 bytes .../bungee-shade-latin-ext-400-normal.woff2 | Bin 37264 -> 0 bytes .../bungee-shade-vietnamese-400-normal.woff2 | Bin 15108 -> 0 bytes .../luckiest-guy-latin-400-normal.woff2 | Bin 17360 -> 0 bytes .../boxes.py/boxes/static/needs-image.png | Bin 5544 -> 0 bytes .../boxes.py/boxes/static/normalize.css | 298 - .../boxes.py/boxes/static/nothing.png | Bin 89 -> 0 bytes .../boxes/static/samples/ABox-thumb.jpg | Bin 4233 -> 0 bytes .../boxes.py/boxes/static/samples/ABox.jpg | Bin 61494 -> 0 bytes .../static/samples/AgricolaInsert-thumb.jpg | Bin 7693 -> 0 bytes .../boxes/static/samples/AgricolaInsert.jpg | Bin 191494 -> 0 bytes .../static/samples/AirPurifier-thumb.jpg | Bin 29276 -> 0 bytes .../boxes/static/samples/AirPurifier.jpg | Bin 579755 -> 0 bytes .../boxes/static/samples/AllEdges-thumb.jpg | Bin 6867 -> 0 bytes .../boxes/static/samples/AllEdges.jpg | Bin 92342 -> 0 bytes .../boxes/static/samples/AngledBox-thumb.jpg | Bin 3918 -> 0 bytes .../boxes/static/samples/AngledBox.jpg | Bin 70357 -> 0 bytes .../static/samples/AngledCutJig-thumb.jpg | Bin 2452 -> 0 bytes .../boxes/static/samples/AngledCutJig.jpg | Bin 39408 -> 0 bytes .../boxes/static/samples/Arcade-thumb.jpg | Bin 7525 -> 0 bytes .../boxes.py/boxes/static/samples/Arcade.jpg | Bin 71432 -> 0 bytes .../boxes/static/samples/Atreus21-thumb.jpg | Bin 6502 -> 0 bytes .../boxes/static/samples/Atreus21.jpg | Bin 112868 -> 0 bytes .../boxes/static/samples/BasedBox-thumb.jpg | Bin 3928 -> 0 bytes .../boxes/static/samples/BasedBox.jpg | Bin 61428 -> 0 bytes .../boxes/static/samples/BayonetBox-thumb.jpg | Bin 4158 -> 0 bytes .../boxes/static/samples/BayonetBox.jpg | Bin 73023 -> 0 bytes .../boxes/static/samples/BinTray-thumb.jpg | Bin 3232 -> 0 bytes .../boxes.py/boxes/static/samples/BinTray.jpg | Bin 68401 -> 0 bytes .../boxes/static/samples/BirdHouse-thumb.jpg | Bin 8367 -> 0 bytes .../boxes/static/samples/BirdHouse.jpg | Bin 128720 -> 0 bytes .../boxes/static/samples/BottleTag-thumb.jpg | Bin 6969 -> 0 bytes .../boxes/static/samples/BottleTag.jpg | Bin 82889 -> 0 bytes .../boxes/static/samples/BreadBox-thumb.jpg | Bin 8870 -> 0 bytes .../boxes/static/samples/BreadBox.jpg | Bin 168536 -> 0 bytes .../boxes/static/samples/BurnTest-thumb.jpg | Bin 3422 -> 0 bytes .../boxes/static/samples/BurnTest.jpg | Bin 55982 -> 0 bytes .../boxes/static/samples/CanStorage-thumb.jpg | Bin 5444 -> 0 bytes .../boxes/static/samples/CanStorage.jpg | Bin 114133 -> 0 bytes .../static/samples/CanStorageAA-thumb.jpg | Bin 5550 -> 0 bytes .../boxes/static/samples/CanStorageAA.jpg | Bin 102544 -> 0 bytes .../static/samples/CardBox-detail-thumb.jpg | Bin 3971 -> 0 bytes .../boxes/static/samples/CardBox-detail.jpg | Bin 67530 -> 0 bytes .../boxes/static/samples/CardBox-thumb.jpg | Bin 2896 -> 0 bytes .../boxes.py/boxes/static/samples/CardBox.jpg | Bin 42237 -> 0 bytes .../boxes/static/samples/CardHolder-thumb.jpg | Bin 2675 -> 0 bytes .../boxes/static/samples/CardHolder.jpg | Bin 44036 -> 0 bytes .../boxes/static/samples/Castle-thumb.jpg | Bin 3103 -> 0 bytes .../boxes.py/boxes/static/samples/Castle.jpg | Bin 48605 -> 0 bytes .../boxes/static/samples/ClosedBox-thumb.jpg | Bin 2253 -> 0 bytes .../boxes/static/samples/ClosedBox.jpg | Bin 47980 -> 0 bytes .../samples/CoffeeCapsuleHolder-thumb.jpg | Bin 4235 -> 0 bytes .../static/samples/CoffeeCapsuleHolder.jpg | Bin 65030 -> 0 bytes .../samples/CoinBankSafe-closed-thumb.jpg | Bin 8258 -> 0 bytes .../static/samples/CoinBankSafe-closed.jpg | Bin 149035 -> 0 bytes .../samples/CoinBankSafe-open-thumb.jpg | Bin 8514 -> 0 bytes .../static/samples/CoinBankSafe-open.jpg | Bin 196859 -> 0 bytes .../samples/CoinBankSafe-pins-thumb.jpg | Bin 7448 -> 0 bytes .../static/samples/CoinBankSafe-pins.jpg | Bin 188037 -> 0 bytes .../static/samples/CoinBankSafe-thumb.jpg | Bin 7309 -> 0 bytes .../boxes/static/samples/CoinBankSafe.jpg | Bin 98494 -> 0 bytes .../static/samples/CoinDisplay-thumb.jpg | Bin 4469 -> 0 bytes .../boxes/static/samples/CoinDisplay.jpg | Bin 62240 -> 0 bytes .../static/samples/ConcaveKnob-thumb.jpg | Bin 5947 -> 0 bytes .../boxes/static/samples/ConcaveKnob.jpg | Bin 124413 -> 0 bytes .../boxes/static/samples/Console-thumb.jpg | Bin 4454 -> 0 bytes .../boxes.py/boxes/static/samples/Console.jpg | Bin 60577 -> 0 bytes .../Console2-backwall-detail-thumb.jpg | Bin 3857 -> 0 bytes .../samples/Console2-backwall-detail.jpg | Bin 73256 -> 0 bytes .../samples/Console2-panel-detail-thumb.jpg | Bin 3439 -> 0 bytes .../static/samples/Console2-panel-detail.jpg | Bin 65355 -> 0 bytes .../boxes/static/samples/Console2-thumb.jpg | Bin 3440 -> 0 bytes .../boxes/static/samples/Console2.jpg | Bin 75684 -> 0 bytes .../samples/ConsoleArcadeStickBack-thumb.jpg | Bin 8860 -> 0 bytes .../static/samples/ConsoleArcadeStickBack.jpg | Bin 125126 -> 0 bytes .../samples/ConsoleArcadeStickFront-thumb.jpg | Bin 6812 -> 0 bytes .../samples/ConsoleArcadeStickFront.jpg | Bin 80705 -> 0 bytes .../ConsoleArcadeStickInside-thumb.jpg | Bin 10040 -> 0 bytes .../samples/ConsoleArcadeStickInside.jpg | Bin 165643 -> 0 bytes .../boxes/static/samples/Desksign-thumb.jpg | Bin 3059 -> 0 bytes .../boxes/static/samples/Desksign.jpg | Bin 53495 -> 0 bytes .../boxes/static/samples/DiceBox-thumb.jpg | Bin 7463 -> 0 bytes .../boxes.py/boxes/static/samples/DiceBox.jpg | Bin 164024 -> 0 bytes .../boxes/static/samples/DiscRack-thumb.jpg | Bin 5973 -> 0 bytes .../boxes/static/samples/DiscRack.jpg | Bin 114008 -> 0 bytes .../boxes/static/samples/Dispenser-thumb.jpg | Bin 6475 -> 0 bytes .../boxes/static/samples/Dispenser.jpg | Bin 85431 -> 0 bytes .../static/samples/DisplayCase-thumb.jpg | Bin 2960 -> 0 bytes .../boxes/static/samples/DisplayCase.jpg | Bin 58638 -> 0 bytes .../static/samples/DisplayShelf-thumb.jpg | Bin 4419 -> 0 bytes .../boxes/static/samples/DisplayShelf.jpg | Bin 75878 -> 0 bytes .../static/samples/DividerTray-thumb.jpg | Bin 4174 -> 0 bytes .../boxes/static/samples/DividerTray.jpg | Bin 96173 -> 0 bytes .../samples/DoubleFlexDoorBox-thumb.jpg | Bin 3811 -> 0 bytes .../static/samples/DoubleFlexDoorBox.jpg | Bin 64558 -> 0 bytes .../boxes/static/samples/DrillBox-thumb.jpg | Bin 7298 -> 0 bytes .../boxes/static/samples/DrillBox.jpg | Bin 140088 -> 0 bytes .../boxes/static/samples/DrillBoxes-thumb.jpg | Bin 10032 -> 0 bytes .../boxes/static/samples/DrillBoxes.jpg | Bin 157310 -> 0 bytes .../samples/DrillStand-assembly-1-thumb.jpg | Bin 4202 -> 0 bytes .../static/samples/DrillStand-assembly-1.jpg | Bin 63566 -> 0 bytes .../samples/DrillStand-assembly-2-thumb.jpg | Bin 3602 -> 0 bytes .../static/samples/DrillStand-assembly-2.jpg | Bin 61188 -> 0 bytes .../samples/DrillStand-assembly-3-thumb.jpg | Bin 3959 -> 0 bytes .../static/samples/DrillStand-assembly-3.jpg | Bin 61470 -> 0 bytes .../samples/DrillStand-assembly-4-thumb.jpg | Bin 3790 -> 0 bytes .../static/samples/DrillStand-assembly-4.jpg | Bin 64594 -> 0 bytes .../static/samples/DrillStand-drawing.png | Bin 58050 -> 0 bytes .../boxes/static/samples/DrillStand-thumb.jpg | Bin 4263 -> 0 bytes .../boxes/static/samples/DrillStand.jpg | Bin 77993 -> 0 bytes .../static/samples/ElectronicsBox-thumb.jpg | Bin 2622 -> 0 bytes .../boxes/static/samples/ElectronicsBox.jpg | Bin 51563 -> 0 bytes .../static/samples/EuroRackSkiff-thumb.jpg | Bin 7109 -> 0 bytes .../boxes/static/samples/EuroRackSkiff.jpg | Bin 46833 -> 0 bytes .../boxes/static/samples/FanHole-thumb.jpg | Bin 5779 -> 0 bytes .../boxes.py/boxes/static/samples/FanHole.jpg | Bin 51514 -> 0 bytes .../static/samples/FilamentSpool-2-thumb.jpg | Bin 8700 -> 0 bytes .../boxes/static/samples/FilamentSpool-2.jpg | Bin 143711 -> 0 bytes .../static/samples/FilamentSpool-thumb.jpg | Bin 9005 -> 0 bytes .../boxes/static/samples/FilamentSpool.jpg | Bin 161561 -> 0 bytes .../boxes/static/samples/FillTest-thumb.jpg | Bin 7447 -> 0 bytes .../boxes/static/samples/FillTest.jpg | Bin 187362 -> 0 bytes .../boxes/static/samples/FlexBook-2-thumb.jpg | Bin 8748 -> 0 bytes .../boxes/static/samples/FlexBook-2.jpg | Bin 209311 -> 0 bytes .../boxes/static/samples/FlexBook-thumb.jpg | Bin 7860 -> 0 bytes .../boxes/static/samples/FlexBook.jpg | Bin 131931 -> 0 bytes .../boxes/static/samples/FlexBox-thumb.jpg | Bin 2795 -> 0 bytes .../boxes.py/boxes/static/samples/FlexBox.jpg | Bin 68429 -> 0 bytes .../boxes/static/samples/FlexBox2-thumb.jpg | Bin 2676 -> 0 bytes .../boxes/static/samples/FlexBox2.jpg | Bin 60495 -> 0 bytes .../boxes/static/samples/FlexBox3-thumb.jpg | Bin 3002 -> 0 bytes .../boxes/static/samples/FlexBox3.jpg | Bin 55725 -> 0 bytes .../boxes/static/samples/FlexBox4-thumb.jpg | Bin 2764 -> 0 bytes .../boxes/static/samples/FlexBox4.jpg | Bin 52199 -> 0 bytes .../boxes/static/samples/FlexBox5-thumb.jpg | Bin 5466 -> 0 bytes .../boxes/static/samples/FlexBox5.jpg | Bin 146225 -> 0 bytes .../boxes/static/samples/FlexTest-thumb.jpg | Bin 5164 -> 0 bytes .../boxes/static/samples/FlexTest.jpg | Bin 84236 -> 0 bytes .../boxes/static/samples/FlexTest2-thumb.jpg | Bin 7613 -> 0 bytes .../boxes/static/samples/FlexTest2.jpg | Bin 196332 -> 0 bytes .../boxes/static/samples/Folder-2-thumb.jpg | Bin 2072 -> 0 bytes .../boxes/static/samples/Folder-2.jpg | Bin 47881 -> 0 bytes .../boxes/static/samples/Folder-thumb.jpg | Bin 1984 -> 0 bytes .../boxes.py/boxes/static/samples/Folder.jpg | Bin 49896 -> 0 bytes .../boxes/static/samples/FrontPanel-thumb.jpg | Bin 13796 -> 0 bytes .../boxes/static/samples/FrontPanel.jpg | Bin 99842 -> 0 bytes .../boxes/static/samples/GearBox-thumb.jpg | Bin 15139 -> 0 bytes .../boxes.py/boxes/static/samples/GearBox.jpg | Bin 136855 -> 0 bytes .../static/samples/GridfinityBase-thumb.jpg | Bin 21390 -> 0 bytes .../boxes/static/samples/GridfinityBase.jpg | Bin 310984 -> 0 bytes .../samples/GridfinityTrayLayout-thumb.jpg | Bin 16050 -> 0 bytes .../static/samples/GridfinityTrayLayout.jpg | Bin 185716 -> 0 bytes .../boxes/static/samples/HalfBox-thumb.jpg | Bin 5042 -> 0 bytes .../boxes.py/boxes/static/samples/HalfBox.jpg | Bin 97092 -> 0 bytes .../samples/HalfBox_AngleJig_usage-thumb.jpg | Bin 3794 -> 0 bytes .../static/samples/HalfBox_AngleJig_usage.jpg | Bin 65262 -> 0 bytes .../samples/HalfBox_Bookend_usage-thumb.jpg | Bin 8836 -> 0 bytes .../static/samples/HalfBox_Bookend_usage.jpg | Bin 43225 -> 0 bytes .../samples/HalfBox_Shelf_usage-thumb.jpg | Bin 5839 -> 0 bytes .../static/samples/HalfBox_Shelf_usage.jpg | Bin 46568 -> 0 bytes .../boxes/static/samples/HeartBox-thumb.jpg | Bin 3713 -> 0 bytes .../boxes/static/samples/HeartBox.jpg | Bin 76518 -> 0 bytes .../boxes/static/samples/HingeBox-thumb.jpg | Bin 3274 -> 0 bytes .../boxes/static/samples/HingeBox.jpg | Bin 58058 -> 0 bytes .../static/samples/HolePattern-thumb.jpg | Bin 5597 -> 0 bytes .../boxes/static/samples/HolePattern.jpg | Bin 121636 -> 0 bytes .../boxes/static/samples/Hook-thumb.jpg | Bin 14412 -> 0 bytes .../boxes.py/boxes/static/samples/Hook.jpg | Bin 47396 -> 0 bytes .../samples/IntegratedHingeBox-thumb.jpg | Bin 3065 -> 0 bytes .../static/samples/IntegratedHingeBox.jpg | Bin 55606 -> 0 bytes .../boxes/static/samples/JointPanel-thumb.jpg | Bin 4439 -> 0 bytes .../boxes/static/samples/JointPanel.jpg | Bin 71086 -> 0 bytes .../static/samples/KeyHolder-2-thumb.jpg | Bin 12299 -> 0 bytes .../boxes/static/samples/KeyHolder-2.jpg | Bin 227390 -> 0 bytes .../boxes/static/samples/KeyHolder-thumb.jpg | Bin 8182 -> 0 bytes .../boxes/static/samples/KeyHolder.jpg | Bin 300610 -> 0 bytes .../boxes/static/samples/Keypad-thumb.jpg | Bin 18066 -> 0 bytes .../boxes/static/samples/LBeam-thumb.jpg | Bin 3545 -> 0 bytes .../boxes.py/boxes/static/samples/LBeam.jpg | Bin 68958 -> 0 bytes .../static/samples/LaptopStand-thumb.jpg | Bin 7179 -> 0 bytes .../boxes/static/samples/LaptopStand.jpg | Bin 156045 -> 0 bytes .../boxes/static/samples/LaserClamp-thumb.jpg | Bin 4974 -> 0 bytes .../boxes/static/samples/LaserClamp.jpg | Bin 59534 -> 0 bytes .../static/samples/LaserHoldfast-thumb.jpg | Bin 4831 -> 0 bytes .../boxes/static/samples/LaserHoldfast.jpg | Bin 75600 -> 0 bytes .../static/samples/MagazineFile-thumb.jpg | Bin 4481 -> 0 bytes .../boxes/static/samples/MagazineFile.jpg | Bin 31958 -> 0 bytes .../samples/MakitaPowerSupply-thumb.jpg | Bin 7093 -> 0 bytes .../static/samples/MakitaPowerSupply.jpg | Bin 137702 -> 0 bytes .../boxes/static/samples/March36539-box.jpg | Bin 53359 -> 0 bytes .../static/samples/NemaPattern-thumb.jpg | Bin 3107 -> 0 bytes .../boxes/static/samples/NemaPattern.jpg | Bin 29332 -> 0 bytes .../static/samples/NotesHolder-thumb.jpg | Bin 2283 -> 0 bytes .../boxes/static/samples/NotesHolder.jpg | Bin 39130 -> 0 bytes .../boxes/static/samples/OpenBox-thumb.jpg | Bin 2085 -> 0 bytes .../boxes.py/boxes/static/samples/OpenBox.jpg | Bin 46616 -> 0 bytes .../boxes/static/samples/OttoBody-thumb.jpg | Bin 8535 -> 0 bytes .../boxes/static/samples/OttoBody.jpg | Bin 129008 -> 0 bytes .../boxes/static/samples/OttoLegs-thumb.jpg | Bin 8446 -> 0 bytes .../boxes/static/samples/OttoLegs.jpg | Bin 118337 -> 0 bytes .../boxes/static/samples/OttoSoles-thumb.jpg | Bin 8753 -> 0 bytes .../boxes/static/samples/OttoSoles.jpg | Bin 157357 -> 0 bytes .../static/samples/PaintStorage-thumb.jpg | Bin 4003 -> 0 bytes .../boxes/static/samples/PaintStorage.jpg | Bin 68266 -> 0 bytes .../boxes/static/samples/PaperBox-thumb.jpg | Bin 3301 -> 0 bytes .../boxes/static/samples/PaperBox.jpg | Bin 59961 -> 0 bytes .../static/samples/PhoneHolder-thumb.jpg | Bin 4000 -> 0 bytes .../boxes/static/samples/PhoneHolder.jpg | Bin 63747 -> 0 bytes .../static/samples/PirateChest-thumb.jpg | Bin 3609 -> 0 bytes .../boxes/static/samples/PirateChest.jpg | Bin 47449 -> 0 bytes .../static/samples/PizzaShovel-thumb.jpg | Bin 23758 -> 0 bytes .../boxes/static/samples/PizzaShovel.jpg | Bin 498688 -> 0 bytes .../samples/Platonic-Icosahedron-thumb.jpg | Bin 5910 -> 0 bytes .../static/samples/Platonic-Icosahedron.jpg | Bin 91974 -> 0 bytes .../boxes/static/samples/Platonic-thumb.jpg | Bin 3975 -> 0 bytes .../boxes/static/samples/Platonic.jpg | Bin 67183 -> 0 bytes .../boxes/static/samples/Rack19Box-thumb.jpg | Bin 26034 -> 0 bytes .../boxes/static/samples/Rack19Box.jpg | Bin 485378 -> 0 bytes .../boxes/static/samples/RackBox-thumb.jpg | Bin 10053 -> 0 bytes .../boxes.py/boxes/static/samples/RackBox.jpg | Bin 216134 -> 0 bytes .../static/samples/RectangularWall-thumb.jpg | Bin 6063 -> 0 bytes .../boxes/static/samples/RectangularWall.jpg | Bin 203657 -> 0 bytes .../boxes/static/samples/RegularBox-thumb.jpg | Bin 3899 -> 0 bytes .../boxes/static/samples/RegularBox.jpg | Bin 65798 -> 0 bytes .../static/samples/RegularStarBox-2-thumb.jpg | Bin 3782 -> 0 bytes .../boxes/static/samples/RegularStarBox-2.jpg | Bin 56659 -> 0 bytes .../static/samples/RegularStarBox-thumb.jpg | Bin 2829 -> 0 bytes .../boxes/static/samples/RegularStarBox.jpg | Bin 44003 -> 0 bytes .../boxes/static/samples/RobotArm-thumb.jpg | Bin 3544 -> 0 bytes .../boxes/static/samples/RobotArm.jpg | Bin 57149 -> 0 bytes .../boxes/static/samples/RollHolder-thumb.jpg | Bin 13140 -> 0 bytes .../boxes/static/samples/RollHolder.jpg | Bin 294514 -> 0 bytes .../boxes/static/samples/Rotary-thumb.jpg | Bin 4973 -> 0 bytes .../boxes.py/boxes/static/samples/Rotary.jpg | Bin 62714 -> 0 bytes .../static/samples/RoundedBox-2-thumb.jpg | Bin 7267 -> 0 bytes .../boxes/static/samples/RoundedBox-2.jpg | Bin 126123 -> 0 bytes .../static/samples/RoundedBox-3-thumb.jpg | Bin 7614 -> 0 bytes .../boxes/static/samples/RoundedBox-3.jpg | Bin 114511 -> 0 bytes .../boxes/static/samples/RoundedBox-thumb.jpg | Bin 2803 -> 0 bytes .../boxes/static/samples/RoundedBox.jpg | Bin 53893 -> 0 bytes .../static/samples/RoyalGame-2-thumb.jpg | Bin 3428 -> 0 bytes .../boxes/static/samples/RoyalGame-2.jpg | Bin 52765 -> 0 bytes .../static/samples/RoyalGame-3-thumb.jpg | Bin 8549 -> 0 bytes .../boxes/static/samples/RoyalGame-3.jpg | Bin 146397 -> 0 bytes .../boxes/static/samples/RoyalGame-thumb.jpg | Bin 4004 -> 0 bytes .../boxes/static/samples/RoyalGame.jpg | Bin 108500 -> 0 bytes .../static/samples/SBCMicroRack-thumb.jpg | Bin 8430 -> 0 bytes .../boxes/static/samples/SBCMicroRack.jpg | Bin 52305 -> 0 bytes .../samples/SevenSegmentPattern-thumb.jpg | Bin 29625 -> 0 bytes .../static/samples/SevenSegmentPattern.jpg | Bin 406384 -> 0 bytes .../samples/Shadowbox-backlit-thumb.jpg | Bin 9107 -> 0 bytes .../static/samples/Shadowbox-backlit.jpg | Bin 169024 -> 0 bytes .../samples/Shadowbox-diagram-thumb.jpg | Bin 14292 -> 0 bytes .../static/samples/Shadowbox-diagram.jpg | Bin 202089 -> 0 bytes .../boxes/static/samples/Shadowbox-thumb.jpg | Bin 8503 -> 0 bytes .../boxes/static/samples/Shadowbox.jpg | Bin 145085 -> 0 bytes .../boxes/static/samples/Shoe-thumb.jpg | Bin 3227 -> 0 bytes .../boxes.py/boxes/static/samples/Shoe.jpg | Bin 51061 -> 0 bytes .../static/samples/ShutterBox-2-thumb.jpg | Bin 4442 -> 0 bytes .../boxes/static/samples/ShutterBox-2.jpg | Bin 80815 -> 0 bytes .../static/samples/ShutterBox-3-thumb.jpg | Bin 5402 -> 0 bytes .../boxes/static/samples/ShutterBox-3.jpg | Bin 126341 -> 0 bytes .../boxes/static/samples/ShutterBox-thumb.jpg | Bin 2897 -> 0 bytes .../boxes/static/samples/ShutterBox.jpg | Bin 48583 -> 0 bytes .../samples/SideDoorHousing-2-thumb.jpg | Bin 5030 -> 0 bytes .../static/samples/SideDoorHousing-2.jpg | Bin 73008 -> 0 bytes .../static/samples/SideDoorHousing-thumb.jpg | Bin 6206 -> 0 bytes .../boxes/static/samples/SideDoorHousing.jpg | Bin 121888 -> 0 bytes .../boxes/static/samples/Silverware-thumb.jpg | Bin 4845 -> 0 bytes .../boxes/static/samples/Silverware.jpg | Bin 87607 -> 0 bytes .../static/samples/SkadisBoard-thumb.jpg | Bin 17776 -> 0 bytes .../boxes/static/samples/SkadisBoard.jpg | Bin 687288 -> 0 bytes .../static/samples/SlantedTray-2-thumb.jpg | Bin 8283 -> 0 bytes .../boxes/static/samples/SlantedTray-2.jpg | Bin 157090 -> 0 bytes .../static/samples/SlantedTray-thumb.jpg | Bin 8183 -> 0 bytes .../boxes/static/samples/SlantedTray.jpg | Bin 123728 -> 0 bytes .../static/samples/SlidingDrawer-thumb.jpg | Bin 3508 -> 0 bytes .../boxes/static/samples/SlidingDrawer.jpg | Bin 47212 -> 0 bytes .../static/samples/SmallPartsTray-thumb.jpg | Bin 6950 -> 0 bytes .../boxes/static/samples/SmallPartsTray.jpg | Bin 122851 -> 0 bytes .../static/samples/SmallPartsTray2-thumb.jpg | Bin 9338 -> 0 bytes .../boxes/static/samples/SmallPartsTray2.jpg | Bin 171934 -> 0 bytes .../boxes/static/samples/SpicesRack-thumb.jpg | Bin 5559 -> 0 bytes .../boxes/static/samples/SpicesRack.jpg | Bin 109718 -> 0 bytes .../boxes/static/samples/Spool-thumb.jpg | Bin 7815 -> 0 bytes .../boxes.py/boxes/static/samples/Spool.jpg | Bin 105666 -> 0 bytes .../boxes/static/samples/Stachel-thumb.jpg | Bin 4303 -> 0 bytes .../boxes.py/boxes/static/samples/Stachel.jpg | Bin 90581 -> 0 bytes .../static/samples/StorageRack-2-thumb.jpg | Bin 3551 -> 0 bytes .../boxes/static/samples/StorageRack-2.jpg | Bin 43660 -> 0 bytes .../static/samples/StorageRack-3-thumb.jpg | Bin 3054 -> 0 bytes .../boxes/static/samples/StorageRack-3.jpg | Bin 42220 -> 0 bytes .../static/samples/StorageRack-thumb.jpg | Bin 4588 -> 0 bytes .../boxes/static/samples/StorageRack.jpg | Bin 58334 -> 0 bytes .../static/samples/StorageShelf-thumb.jpg | Bin 3866 -> 0 bytes .../boxes/static/samples/StorageShelf.jpg | Bin 51936 -> 0 bytes .../boxes/static/samples/Tetris-thumb.jpg | Bin 4338 -> 0 bytes .../boxes.py/boxes/static/samples/Tetris.jpg | Bin 145511 -> 0 bytes .../static/samples/TrafficLight-thumb.jpg | Bin 4100 -> 0 bytes .../boxes/static/samples/TrafficLight.jpg | Bin 65943 -> 0 bytes .../static/samples/TrayInsert-2-thumb.jpg | Bin 2547 -> 0 bytes .../boxes/static/samples/TrayInsert-2.jpg | Bin 47187 -> 0 bytes .../boxes/static/samples/TrayInsert-thumb.jpg | Bin 2694 -> 0 bytes .../boxes/static/samples/TrayInsert.jpg | Bin 52310 -> 0 bytes .../boxes/static/samples/TrayLayout-thumb.jpg | Bin 3383 -> 0 bytes .../boxes/static/samples/TrayLayout.jpg | Bin 59659 -> 0 bytes .../static/samples/TrayLayout2-thumb.jpg | Bin 3383 -> 0 bytes .../boxes/static/samples/TrayLayout2.jpg | Bin 59659 -> 0 bytes .../boxes/static/samples/TwoPiece-thumb.jpg | Bin 2532 -> 0 bytes .../boxes/static/samples/TwoPiece.jpg | Bin 40192 -> 0 bytes .../boxes/static/samples/TwoPiece2-thumb.jpg | Bin 4012 -> 0 bytes .../boxes/static/samples/TwoPiece2.jpg | Bin 67540 -> 0 bytes .../boxes/static/samples/TypeTray-thumb.jpg | Bin 3553 -> 0 bytes .../boxes/static/samples/TypeTray.jpg | Bin 61399 -> 0 bytes .../boxes/static/samples/UBox-thumb.jpg | Bin 3114 -> 0 bytes .../boxes.py/boxes/static/samples/UBox.jpg | Bin 70468 -> 0 bytes .../static/samples/UnevenHeightBox-thumb.jpg | Bin 2528 -> 0 bytes .../boxes/static/samples/UnevenHeightBox.jpg | Bin 41285 -> 0 bytes .../static/samples/UniversalBox-thumb.jpg | Bin 5133 -> 0 bytes .../boxes/static/samples/UniversalBox.jpg | Bin 80591 -> 0 bytes .../static/samples/WallCaliper-thumb.jpg | Bin 6042 -> 0 bytes .../boxes/static/samples/WallCaliper.jpg | Bin 88441 -> 0 bytes .../static/samples/WallChiselHolder-thumb.jpg | Bin 7306 -> 0 bytes .../boxes/static/samples/WallChiselHolder.jpg | Bin 106399 -> 0 bytes .../static/samples/WallConsole-thumb.jpg | Bin 9212 -> 0 bytes .../boxes/static/samples/WallConsole.jpg | Bin 140255 -> 0 bytes .../static/samples/WallDrillBox-thumb.jpg | Bin 6095 -> 0 bytes .../boxes/static/samples/WallDrillBox.jpg | Bin 121779 -> 0 bytes .../boxes/static/samples/WallPinRow-thumb.jpg | Bin 8427 -> 0 bytes .../boxes/static/samples/WallPinRow.jpg | Bin 129088 -> 0 bytes .../static/samples/WallPlaneHolder-thumb.jpg | Bin 6607 -> 0 bytes .../boxes/static/samples/WallPlaneHolder.jpg | Bin 143561 -> 0 bytes .../static/samples/WallPliersHolder-thumb.jpg | Bin 6937 -> 0 bytes .../boxes/static/samples/WallPliersHolder.jpg | Bin 151152 -> 0 bytes .../boxes/static/samples/WallRack-thumb.jpg | Bin 5928 -> 0 bytes .../boxes/static/samples/WallRack.jpg | Bin 164259 -> 0 bytes .../static/samples/WallRollHolder-thumb.jpg | Bin 7315 -> 0 bytes .../boxes/static/samples/WallRollHolder.jpg | Bin 143083 -> 0 bytes .../samples/WallSlottedHolder-thumb.jpg | Bin 4920 -> 0 bytes .../static/samples/WallSlottedHolder.jpg | Bin 98263 -> 0 bytes .../boxes/static/samples/WallStairs-thumb.jpg | Bin 27329 -> 0 bytes .../boxes/static/samples/WallStairs.jpg | Bin 525046 -> 0 bytes .../static/samples/WallTypeTray-thumb.jpg | Bin 4143 -> 0 bytes .../boxes/static/samples/WallTypeTray.jpg | Bin 79567 -> 0 bytes .../static/samples/WallWrenchHolder-thumb.jpg | Bin 8313 -> 0 bytes .../boxes/static/samples/WallWrenchHolder.jpg | Bin 142665 -> 0 bytes .../boxes/static/samples/WineRack-thumb.jpg | Bin 5238 -> 0 bytes .../boxes/static/samples/WineRack.jpg | Bin 87107 -> 0 bytes .../boxes/static/samples/samples.sha256 | 167 - .../boxes.py/boxes/static/self.css | 237 - .../boxes.py/boxes/static/self.js | 303 - .../fablabchemnitz/boxes.py/boxes_proxy.py | 12 +- .../icons/info.festi.boxes.py.ABox.svg | 310 - .../contour_scanner_and_trimmer.py | 2 +- .../convert_to_polylines.py | 2 +- .../convert_vertical_horizontal_to_line.py | 2 +- .../create_links/create_links.py | 2 +- .../fablabchemnitz/cutcraft/cutcraftshape.py | 2 +- .../cutting_optimizer/cutting_optimizer.py | 4 +- .../dxf2papercraft/dxf2papercraft.inx | 2 +- .../dxf2papercraft/dxf2papercraft.py | 6 +- .../dxf_dwg_importer/dxf_dwg_importer.inx | 2 +- .../dxf_dwg_importer/dxf_dwg_importer.py | 6 +- .../epilog_dashboard_bbox_adjust.py | 4 +- .../filter_by_length_area.py | 6 +- .../imagetracerjs/imagetracerjs.py | 2 +- .../inventory_sticker/inventory_sticker.py | 4 +- .../papercraft_unfold/papercraft_unfold.py | 4 +- .../fablabchemnitz/paperfold/paperfold.py | 2 +- .../path_intersections/path_intersections.inx | 2 +- .../path_intersections/path_intersections.py | 2 +- .../fablabchemnitz/plycutter/plycutter.py | 2 +- .../fablabchemnitz/primitive/primitive.py | 2 +- .../purge_pointy_paths/purge_pointy_paths.py | 2 +- .../remove_empty_groups.py | 2 +- .../round_corners/round_corners.py | 2 +- .../split_and_break_bezier_at_t.py | 2 +- .../styles_to_layers/styles_to_layers.py | 8 +- .../ungrouper_and_element_migrator_filter.py | 10 +- .../unwind_paths/unwind_paths.py | 2 +- .../fablabchemnitz/vpypetools/vpypetools.py | 8 +- .../vpypetools/vpypetools_deduplicate.inx | 6 +- .../vpypetools/vpypetools_filter.inx | 6 +- .../vpypetools/vpypetools_freemode.inx | 6 +- .../vpypetools/vpypetools_linemerge.inx | 6 +- .../vpypetools/vpypetools_linesort.inx | 6 +- .../vpypetools/vpypetools_multipass.inx | 6 +- .../vpypetools/vpypetools_occult.inx | 6 +- .../vpypetools/vpypetools_relooping.inx | 6 +- .../vpypetools/vpypetools_splitall.inx | 6 +- .../vpypetools/vpypetools_trim.inx | 6 +- 1055 files changed, 1481 insertions(+), 60383 deletions(-) create mode 100644 extensions/fablabchemnitz/boxes.py/ABox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/AgricolaInsert-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/AirPurifier-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/AllEdges-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/AngledBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/AngledCutJig-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Arcade-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Atreus21-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BasedBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BayonetBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BinTray-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BirdHouse-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BookHolder-back-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BookHolder-back-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BookHolder-minis-side-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BookHolder-minis-side-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BookHolder-minis-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BookHolder-minis-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BookHolder-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BookHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BottleTag-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BreadBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-2-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-3-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-3-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-4-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-4-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-5-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-5-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-6-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-6-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/BrickSorter-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/BurnTest-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CanStorage-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CanStorageAA-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CardBox-detail-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CardBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CardHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Castle-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ClosedBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CoffeeCapsuleHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CoinBankSafe-closed-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CoinBankSafe-open-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CoinBankSafe-pins-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CoinBankSafe-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CoinDisplay-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CompartmentBox-closed-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/CompartmentBox-closed-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CompartmentBox-lid-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/CompartmentBox-lid-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/CompartmentBox-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/CompartmentBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ConcaveKnob-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Console-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Console2-backwall-detail-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Console2-panel-detail-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Console2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickBack-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickFront-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickInside-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Desksign-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DiceBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DiceTower-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/DiceTower-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DiscRack-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Dispenser-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Display-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DisplayCase-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DisplayShelf-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DividerTray-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DoubleFlexDoorBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DrillBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DrillBoxes-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DrillStand-assembly-1-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DrillStand-assembly-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DrillStand-assembly-3-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DrillStand-assembly-4-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/DrillStand-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ElectronicsBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/EuroRackSkiff-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FanHole-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FatBallDispenser-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/FatBallDispenser-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FilamentSpool-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FilamentSpool-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FillTest-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexBook-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexBook-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexBox2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexBox3-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexBox4-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexBox5-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexTest-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FlexTest2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Folder-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Folder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/FrontPanel-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/GearBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/GridfinityBase-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/GridfinityDrillBox-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/GridfinityDrillBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/GridfinityTrayLayout-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/HalfBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/HalfBox_AngleJig_usage-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/HalfBox_Bookend_usage-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/HalfBox_Shelf_usage-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/HeartBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/HingeBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/HobbyCase-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/HobbyCase-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/HolePattern-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Hook-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/IntegratedHingeBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/JointPanel-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Kamishibai-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/Kamishibai-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/KeyHolder-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/KeyHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Keypad-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/LBeam-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/LaptopStand-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/LaserClamp-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/LaserHoldfast-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/MagazineFile-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/MakitaPowerSupply-thumb.svg rename extensions/fablabchemnitz/boxes.py/{boxes/static/samples => }/March36539-box-thumb.jpg (100%) create mode 100644 extensions/fablabchemnitz/boxes.py/March36539-box-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Matrix-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/Matrix-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/NemaPattern-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/NightLightBox-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/NightLightBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/NotesHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/OpenBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/OttoBody-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/OttoLegs-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/OttoSoles-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/PaintStorage-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/PaperBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/PhoneHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/PhotoFrame-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/PhotoFrame-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/PirateChest-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/PizzaShovel-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Platonic-Icosahedron-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Platonic-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Rack19Box-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RackBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RectangularWall-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RegularBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RegularStarBox-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RegularStarBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RobotArm-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RollHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Rotary-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RoundedBox-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RoundedBox-3-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RoundedBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RoundedRegularBox-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/RoundedRegularBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RoundedRegularBox2-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/RoundedRegularBox2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RoyalGame-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RoyalGame-3-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/RoyalGame-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SBCMicroRack-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SevenSegmentClock-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/SevenSegmentClock-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SevenSegmentPattern-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Shadowbox-backlit-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Shadowbox-diagram-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Shadowbox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Shoe-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ShutterBox-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ShutterBox-3-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ShutterBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SideDoorHousing-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SideDoorHousing-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SideHingeBox-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/SideHingeBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Silverware-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SkadisBoard-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SlantedTray-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SlantedTray-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SlidingDrawer-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SlidingLidBox-2-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/SlidingLidBox-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SlidingLidBox-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/SlidingLidBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SmallPartsTray-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SmallPartsTray2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/SpicesRack-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Spool-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Stachel-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/StackableBin-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/StackableBin-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/StorageRack-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/StorageRack-3-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/StorageRack-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/StorageShelf-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/Tetris-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/TrafficLight-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/TrayInsert-2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/TrayInsert-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/TrayLayout-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/TrayLayout2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/TwoPiece-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/TwoPiece2-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/TypeTray-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/UBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/UnevenHeightBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/UniversalBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallCaliper-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallChiselHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallConsole-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallDrillBox-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallHopper-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/WallHopper-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallPinRow-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallPlaneHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallPliersHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallRack-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallRollHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallSlottedHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallStackableBin-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/WallStackableBin-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallStairs-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallTypeTray-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WallWrenchHolder-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/WineRack-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ZBeam-flanged-ubeam-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/ZBeam-flanged-ubeam-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/ZBeam-thumb.jpg create mode 100644 extensions/fablabchemnitz/boxes.py/ZBeam-thumb.svg create mode 100644 extensions/fablabchemnitz/boxes.py/boxes.py.FatBallDispenser.inx create mode 100644 extensions/fablabchemnitz/boxes.py/boxes.py.HobbyCase.inx create mode 100644 extensions/fablabchemnitz/boxes.py/boxes.py.Kamishibai.inx create mode 100644 extensions/fablabchemnitz/boxes.py/boxes.py.NightLightBox.inx create mode 100644 extensions/fablabchemnitz/boxes.py/boxes.py.SlidingLidBox.inx create mode 100644 extensions/fablabchemnitz/boxes.py/boxes.py.WallHopper.inx create mode 100644 extensions/fablabchemnitz/boxes.py/boxes.py.WallStackableBin.inx create mode 100644 extensions/fablabchemnitz/boxes.py/boxes.py.ZBeam.inx delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/CODE_OF_CONDUCT.md delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/CONTRIBUTING.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/LICENSE.txt delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/MANIFEST.in delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/README.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/Color.py delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/boxes/__init__.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/drawing.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/edges.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/extents.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/formats.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/gears.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/__init__.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/_swtemplate.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/_template.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/abox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/agricolainsert.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/airpurifier.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/alledges.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/angledbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/angledcutjig.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/arcade.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/atreus21.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/basedbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bayonetbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bintray.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/birdhouse.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bottlestack.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bottletag.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/breadbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/burntest.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/can_storage.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/carbonfilter.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/cardbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/cardholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/castle.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/closedbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coffeecapsulesholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coinbanksafe.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coindisplay.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/concaveknob.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/console.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/console2.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/desksign.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dicebox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dinrailbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/discrack.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dispenser.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/display.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/displaycase.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/displayshelf.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dividertray.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/doubleflexdoorbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/drillbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/drillstand.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/edges.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/electronicsbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/eurorackskiff.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/fanhole.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/filamentspool.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/filltest.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbook.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox2.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox3.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox4.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox5.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flextest.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flextest2.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/folder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/frontpanel.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/frontpanel_test.json delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gear.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gearbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gridfinitybase.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gridfinitytraylayout.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/halfbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/heart.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/hingebox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/holepattern.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/hooks.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/integratedhingebox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/jigsaw.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/jointpanel.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keyboard.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keyholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keypad.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/lamp.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laptopstand.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laserclamp.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laserholdfast.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/lbeam.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/magazinefile.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/makitapowersupply.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/microrack.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/nemamount.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/nemapattern.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/notesholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/openbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/organpipe.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottobody.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottolegs.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottosoles.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/paintbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/paperbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/phoneholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/piratechest.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/pizzashovel.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/planetary.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/planetary2.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/platonic.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/polehook.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/pulley.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack10box.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack19box.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack19halfwidth.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rackbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rectangularWall.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/regularbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/regularstarbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/robotarm.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rollholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rotary.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/roundedbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/royalgame.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sevensegment.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sevensegmentclock.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shadowbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shoe.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shutterbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sidedoorhousing.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/silverwarebox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/skadis.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/slantedtray.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/slidingdrawer.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/smallpartstray.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/smallpartstray2.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/spicesrack.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/spool.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/stachel.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/storagerack.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/storageshelf.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/tetris.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trafficlight.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trayinsert.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/traylayout.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trianglelamp.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/two_piece.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/typetray.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ubox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/unevenheightbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/universalbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallcaliperholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallchiselholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallconsole.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walldrillbox.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walledges.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallpinrow.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallplaneholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallpliersholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallrack.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallrollholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallslottedholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallstairs.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walltypetray.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallwrenchholder.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wavyknob.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/winerack.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/lids.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/parts.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/pulley.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/qrcode_factory.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/robot.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/servos.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/vectors.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/boxes/walledges.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/boxes.1 delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/boxes.xml delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/boxesserver.1 delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/boxesserver.xml delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/presentation.odp delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/CONTRIBUTING.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/Makefile delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/README.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_architecture.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_arguments.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_burn.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_drawing.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_edges.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_examples.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_existing_parts.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_generator.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_navigation.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/api_parts.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/apidoc.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/boxes.rst delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/boxes2rst.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/burn.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/burn2.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/conf.py delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/faq.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/generators.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/index.html delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/index.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/log-wsl-win11.txt delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/macos.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/win11-wsl-boxesserver-localhost.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_boxespy_zip_extract.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_browser_boxespy.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_browser_download_boxespy.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_browser_download_python.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_cmd_python_boxesserver_firewall.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_install_python_path.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/make.bat delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/modules.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/overcuts.svg delete mode 120000 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/static delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/documentation/src/usermanual.rst delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/box2.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/box3.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/castle.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/drillbox.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox2.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox3.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/folder.svg delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/examples/generate.sh delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/lamp.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/magazinefile.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/silverwarebox.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/trayinsert.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/traylayout.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/traylayout.txt delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/examples/typetray.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/locale/de/LC_MESSAGES/boxes.py.mo delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/locale/en/LC_MESSAGES/boxes.py.mo delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/locale/fr/LC_MESSAGES/boxes.py.mo delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/locale/zh_CN/LC_MESSAGES/boxes.py.mo delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/po/boxes.py.pot delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/po/de.po delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/po/en.po delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/po/fr.po delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/po/readme.txt delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/po/zanata.xml delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/po/zh_CN.po delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/scripts/Dockerfile delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes2inkscape delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes2pot delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes_example.ipynb delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes_proxy.py delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/scripts/boxesserver delete mode 100755 extensions/fablabchemnitz/boxes.py/boxes/scripts/gen_thumbnails.sh delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/boxes-logo.svg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/favicon.ico delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/fonts.css delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/fonts/bungeeshade/bungee-shade-latin-400-normal.woff2 delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/fonts/bungeeshade/bungee-shade-latin-ext-400-normal.woff2 delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/fonts/bungeeshade/bungee-shade-vietnamese-400-normal.woff2 delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/fonts/luckiestguy/luckiest-guy-latin-400-normal.woff2 delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/needs-image.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/normalize.css delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/nothing.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ABox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ABox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AgricolaInsert-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AgricolaInsert.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AirPurifier-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AirPurifier.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AllEdges-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AllEdges.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AngledBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AngledBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AngledCutJig-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/AngledCutJig.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Arcade-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Arcade.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Atreus21-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Atreus21.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BasedBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BasedBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BayonetBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BayonetBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BinTray-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BinTray.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BirdHouse-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BirdHouse.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BottleTag-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BottleTag.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BreadBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BreadBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BurnTest-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/BurnTest.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CanStorage-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CanStorage.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CanStorageAA-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CanStorageAA.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CardBox-detail-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CardBox-detail.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CardBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CardBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CardHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CardHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Castle-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Castle.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ClosedBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ClosedBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoffeeCapsuleHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoffeeCapsuleHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinBankSafe-closed-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinBankSafe-closed.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinBankSafe-open-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinBankSafe-open.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinBankSafe-pins-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinBankSafe-pins.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinBankSafe-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinBankSafe.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinDisplay-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/CoinDisplay.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ConcaveKnob-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ConcaveKnob.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Console-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Console.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Console2-backwall-detail-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Console2-backwall-detail.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Console2-panel-detail-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Console2-panel-detail.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Console2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Console2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ConsoleArcadeStickBack-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ConsoleArcadeStickBack.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ConsoleArcadeStickFront-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ConsoleArcadeStickFront.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ConsoleArcadeStickInside-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ConsoleArcadeStickInside.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Desksign-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Desksign.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DiceBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DiceBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DiscRack-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DiscRack.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Dispenser-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Dispenser.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DisplayCase-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DisplayCase.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DisplayShelf-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DisplayShelf.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DividerTray-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DividerTray.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DoubleFlexDoorBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DoubleFlexDoorBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillBoxes-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillBoxes.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-assembly-1-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-assembly-1.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-assembly-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-assembly-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-assembly-3-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-assembly-3.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-assembly-4-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-assembly-4.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-drawing.png delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/DrillStand.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ElectronicsBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ElectronicsBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/EuroRackSkiff-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/EuroRackSkiff.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FanHole-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FanHole.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FilamentSpool-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FilamentSpool-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FilamentSpool-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FilamentSpool.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FillTest-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FillTest.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBook-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBook-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBook-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBook.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox3-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox3.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox4-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox4.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox5-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexBox5.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexTest-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexTest.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexTest2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FlexTest2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Folder-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Folder-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Folder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Folder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FrontPanel-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/FrontPanel.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/GearBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/GearBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/GridfinityBase-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/GridfinityBase.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/GridfinityTrayLayout-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/GridfinityTrayLayout.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HalfBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HalfBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HalfBox_AngleJig_usage-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HalfBox_AngleJig_usage.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HalfBox_Bookend_usage-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HalfBox_Bookend_usage.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HalfBox_Shelf_usage-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HalfBox_Shelf_usage.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HeartBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HeartBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HingeBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HingeBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HolePattern-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/HolePattern.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Hook-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Hook.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/IntegratedHingeBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/IntegratedHingeBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/JointPanel-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/JointPanel.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/KeyHolder-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/KeyHolder-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/KeyHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/KeyHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Keypad-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/LBeam-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/LBeam.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/LaptopStand-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/LaptopStand.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/LaserClamp-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/LaserClamp.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/LaserHoldfast-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/LaserHoldfast.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/MagazineFile-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/MagazineFile.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/MakitaPowerSupply-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/MakitaPowerSupply.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/March36539-box.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/NemaPattern-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/NemaPattern.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/NotesHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/NotesHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/OpenBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/OpenBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/OttoBody-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/OttoBody.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/OttoLegs-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/OttoLegs.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/OttoSoles-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/OttoSoles.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PaintStorage-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PaintStorage.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PaperBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PaperBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PhoneHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PhoneHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PirateChest-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PirateChest.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PizzaShovel-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/PizzaShovel.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Platonic-Icosahedron-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Platonic-Icosahedron.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Platonic-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Platonic.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Rack19Box-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Rack19Box.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RackBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RackBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RectangularWall-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RectangularWall.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RegularBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RegularBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RegularStarBox-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RegularStarBox-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RegularStarBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RegularStarBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RobotArm-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RobotArm.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RollHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RollHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Rotary-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Rotary.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoundedBox-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoundedBox-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoundedBox-3-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoundedBox-3.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoundedBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoundedBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoyalGame-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoyalGame-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoyalGame-3-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoyalGame-3.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoyalGame-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/RoyalGame.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SBCMicroRack-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SBCMicroRack.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SevenSegmentPattern-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SevenSegmentPattern.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Shadowbox-backlit-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Shadowbox-backlit.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Shadowbox-diagram-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Shadowbox-diagram.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Shadowbox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Shadowbox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Shoe-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Shoe.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ShutterBox-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ShutterBox-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ShutterBox-3-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ShutterBox-3.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ShutterBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/ShutterBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SideDoorHousing-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SideDoorHousing-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SideDoorHousing-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SideDoorHousing.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Silverware-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Silverware.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SkadisBoard-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SkadisBoard.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SlantedTray-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SlantedTray-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SlantedTray-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SlantedTray.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SlidingDrawer-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SlidingDrawer.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SmallPartsTray-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SmallPartsTray.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SmallPartsTray2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SmallPartsTray2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SpicesRack-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/SpicesRack.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Spool-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Spool.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Stachel-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Stachel.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/StorageRack-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/StorageRack-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/StorageRack-3-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/StorageRack-3.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/StorageRack-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/StorageRack.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/StorageShelf-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/StorageShelf.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Tetris-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/Tetris.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrafficLight-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrafficLight.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrayInsert-2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrayInsert-2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrayInsert-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrayInsert.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrayLayout-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrayLayout.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrayLayout2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TrayLayout2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TwoPiece-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TwoPiece.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TwoPiece2-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TwoPiece2.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TypeTray-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/TypeTray.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/UBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/UBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/UnevenHeightBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/UnevenHeightBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/UniversalBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/UniversalBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallCaliper-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallCaliper.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallChiselHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallChiselHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallConsole-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallConsole.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallDrillBox-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallDrillBox.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallPinRow-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallPinRow.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallPlaneHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallPlaneHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallPliersHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallPliersHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallRack-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallRack.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallRollHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallRollHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallSlottedHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallSlottedHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallStairs-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallStairs.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallTypeTray-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallTypeTray.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallWrenchHolder-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WallWrenchHolder.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WineRack-thumb.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/WineRack.jpg delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/samples/samples.sha256 delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/self.css delete mode 100644 extensions/fablabchemnitz/boxes.py/boxes/static/self.js delete mode 100644 extensions/fablabchemnitz/boxes.py/icons/info.festi.boxes.py.ABox.svg diff --git a/extensions/fablabchemnitz/about_upgrade_mightyscape/about_upgrade_mightyscape.py b/extensions/fablabchemnitz/about_upgrade_mightyscape/about_upgrade_mightyscape.py index 342099e..40ea78b 100644 --- a/extensions/fablabchemnitz/about_upgrade_mightyscape/about_upgrade_mightyscape.py +++ b/extensions/fablabchemnitz/about_upgrade_mightyscape/about_upgrade_mightyscape.py @@ -3,7 +3,7 @@ """ Upgrade MightyScape from Inkscape Extension Dialog. Made for end users -Extension for InkScape 1.3.2 +Extension for Inkscape 1.3.2 Author: Mario Voigt / FabLab Chemnitz Mail: mario.voigt@stadtfabrikanten.org Date: 14.01.2024 diff --git a/extensions/fablabchemnitz/animate_order/animate_order.py b/extensions/fablabchemnitz/animate_order/animate_order.py index ed7501e..552079a 100644 --- a/extensions/fablabchemnitz/animate_order/animate_order.py +++ b/extensions/fablabchemnitz/animate_order/animate_order.py @@ -9,7 +9,7 @@ from lxml import etree import warnings """ -Extension for InkScape 1.X +Extension for Inkscape 1.X Features - Create SVG preview file and show it in browser. Helps to quickly evaluate line order for cutting processes diff --git a/extensions/fablabchemnitz/bounding_box/bounding_box.py b/extensions/fablabchemnitz/bounding_box/bounding_box.py index 9434dde..086de4e 100644 --- a/extensions/fablabchemnitz/bounding_box/bounding_box.py +++ b/extensions/fablabchemnitz/bounding_box/bounding_box.py @@ -50,8 +50,8 @@ class BoundingBox(inkex.EffectExtension): for element in self.svg.selected.values(): self.drawBBox(element.bounding_box()) else: #combined bbox - #self.drawBBox(self.svg.get_selected_bbox()) #works for InkScape (1:1.0+devel+202008292235+eff2292935) @ Linux and for Windows (but with deprecation) - #self.drawBBox(self.svg.selection.bounding_box()) #works for InkScape 1.1dev (9b1fc87, 2020-08-27)) @ Windows + #self.drawBBox(self.svg.get_selected_bbox()) #works for Inkscape (1:1.0+devel+202008292235+eff2292935) @ Linux and for Windows (but with deprecation) + #self.drawBBox(self.svg.selection.bounding_box()) #works for Inkscape 1.1dev (9b1fc87, 2020-08-27)) @ Windows bbox = inkex.BoundingBox() for element in self.svg.selected.values(): if isinstance (element, inkex.ShapeElement) and element.tag != inkex.addNS('use','svg') and element.get('inkscape:groupmode') != 'layer': #bbox fails for svg:use elements and layers: @@ -62,4 +62,4 @@ class BoundingBox(inkex.EffectExtension): return if __name__ == '__main__': - BoundingBox().run() \ No newline at end of file + BoundingBox().run() diff --git a/extensions/fablabchemnitz/boxes.py/ABox-thumb.svg b/extensions/fablabchemnitz/boxes.py/ABox-thumb.svg new file mode 100644 index 0000000..a21f8ea --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ABox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/AgricolaInsert-thumb.svg b/extensions/fablabchemnitz/boxes.py/AgricolaInsert-thumb.svg new file mode 100644 index 0000000..e789d17 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/AgricolaInsert-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/AirPurifier-thumb.svg b/extensions/fablabchemnitz/boxes.py/AirPurifier-thumb.svg new file mode 100644 index 0000000..8269c41 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/AirPurifier-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/AllEdges-thumb.svg b/extensions/fablabchemnitz/boxes.py/AllEdges-thumb.svg new file mode 100644 index 0000000..8cb41eb --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/AllEdges-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/AngledBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/AngledBox-thumb.svg new file mode 100644 index 0000000..c011f02 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/AngledBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/AngledCutJig-thumb.svg b/extensions/fablabchemnitz/boxes.py/AngledCutJig-thumb.svg new file mode 100644 index 0000000..368a279 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/AngledCutJig-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Arcade-thumb.svg b/extensions/fablabchemnitz/boxes.py/Arcade-thumb.svg new file mode 100644 index 0000000..4b6aae7 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Arcade-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Atreus21-thumb.svg b/extensions/fablabchemnitz/boxes.py/Atreus21-thumb.svg new file mode 100644 index 0000000..c4fc282 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Atreus21-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BasedBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/BasedBox-thumb.svg new file mode 100644 index 0000000..aedda43 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BasedBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BayonetBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/BayonetBox-thumb.svg new file mode 100644 index 0000000..2def402 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BayonetBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BinTray-thumb.svg b/extensions/fablabchemnitz/boxes.py/BinTray-thumb.svg new file mode 100644 index 0000000..580a3f3 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BinTray-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BirdHouse-thumb.svg b/extensions/fablabchemnitz/boxes.py/BirdHouse-thumb.svg new file mode 100644 index 0000000..796e712 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BirdHouse-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BookHolder-back-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BookHolder-back-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..222ad024cdc868da843e9cca9bfdc93cb2a099d4 GIT binary patch literal 5505 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 diff --git a/extensions/fablabchemnitz/boxes.py/BookHolder-minis-side-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BookHolder-minis-side-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14de5a21a9beae6352a7c4e864579038310869f2 GIT binary patch literal 5069 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 diff --git a/extensions/fablabchemnitz/boxes.py/BookHolder-minis-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BookHolder-minis-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13fc55090b0f5172037812d9354634f4da4953e5 GIT binary patch literal 4076 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 diff --git a/extensions/fablabchemnitz/boxes.py/BookHolder-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BookHolder-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69eb72bc1a4d7dd3c7f272508107af669854c764 GIT binary patch literal 5496 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 diff --git a/extensions/fablabchemnitz/boxes.py/BottleTag-thumb.svg b/extensions/fablabchemnitz/boxes.py/BottleTag-thumb.svg new file mode 100644 index 0000000..f55261a --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BottleTag-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BreadBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/BreadBox-thumb.svg new file mode 100644 index 0000000..ab23774 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BreadBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BrickSorter-2-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BrickSorter-2-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..face87ab9ab06c9eae09439f25a5d54b69c37512 GIT binary patch literal 7226 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 PcharY)ng2O`ThR@ft;>0 literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/BrickSorter-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/BrickSorter-2-thumb.svg new file mode 100644 index 0000000..468471e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BrickSorter-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BrickSorter-3-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BrickSorter-3-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74e5947341516666b9e0ce53c9ae51d4c671ba84 GIT binary patch literal 9009 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 km_gx(?}W=i@$ diff --git a/extensions/fablabchemnitz/boxes.py/BrickSorter-4-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BrickSorter-4-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c349a28f733d26ba49a94c67e18b1a1d06c67131 GIT binary patch literal 4566 zcmb7Cc{CJU+@3LJ24ml2ymrPCGMKTiW2r2I%3Ai9Y$HqA5?R97NlejU}gvll$C`A%EH3R#sOnxV`pPwfpNjuIXF4FI9XxbJlvc- zr#0u_A;44NUllVml#`W(_4M}tiIZ*s4+|g#FbD!l0hoAzARge!8vq;tU;+U^K*0Y3 z3;}?cnV>9xyJ&6z@YIxvnHkIk2LGi1PwC7&l3?C*5MwBx6qaAzGf_a=B#fBX!(#7s zqe)0cR>R>`DFOui-?67sCT1`MblOwkIsFkJGmr`LzrH{w9%c})!3 zFXMSK2Vg&CF!6wR0EU451(=bLr22c*R}--LqLD&=u4vM8E=8`%W+CPtoB3vm<}uwQ z->RHdBRiLTq=)i@O|S1DADwK`dCI?4cc%m-33bc8*x_5_%C*&Lt5j`UK%*l#&mu9U zBabf-9AW33Y=S^jnSF!MSMK4|+FAj+O3Bi*I-W*v<>4w2I1bN(Deh%?%~B1JHzS|( z6^j7P+ItMJvPvLJ{ECvyAJQw{8!3mRUf>qmz4I8}2IeAAkVqpiw44I%hBSNv6?WQ% za7=Po3L*rI1Pz9G0kzTyuqEUt)zBfyPK22BIFJ}p@8*mdev-ls7mKwLt68c@-T$t^{Pe2JL2!0GDIpaMXe^2|;8Ok45Dc(Rc)Mu8gGzQp7= z+|{XvR9$8_PrvF+ymX_PB?F}0%T<$Xjz~!rLKDAbe~!Qr_8TMxv}6N4^{F2RFQ@h# z8~XIa4#KEEJ${&*39tOT#?HbGo>1P)=&smHqbc7oy_?K_t*ERZSFrcS$dnc8RM;6yASMFhdQw!%uu;IgFhV4x$(3s&HJg2u)=2;EuD ziODa?>KW|pzFJu0yp#=zA~6GSl7Ho05R5}c5U6h78|VoLs=kYt&h7IPaw5QJV2p;I zr%0-3W-P-=%v(IY@M6gNw?op5VA6Y^OcdM+oqIdQKQv>`iD}N-2-Q+q>uvZ+r8=Eh z7?e&V;_;deNpuZSs_-qJqzzR0c=&eSv8$WJK_?p41FJX5R+p&(|k5$#cH}P5(?Q>&aid*XSI6Z=an&V zI(5^Qow2y0#7e)YgE4)!?i5oFyRkUEsNePZwOnwI>#O)H4K)<^(uQEo8Xc1=GdKfS zmsYrf6-R(CI-{vS^mOtAvWqIlpJeEM9E;0h zriDnr=(*sX?dN|CNjidtUv#2f%*>)~zv?4J&EiqL*}xUp$c;FGizsPZ>Oy5+n~-CB zjAU?=M=G)oakYnEV=m?D2Ho}3<^f?R;eNFLAZ{gJT}Ay_G4=`f>!Ei~$l}7cKnE+F zXK?_g^_&O1OSdFz@SxZUQ5RiX>fnlj@)nnz;ki=XdUl^zAPsNMC0JtEP|x!#@D6V6^*ROHK(y6*NA5GEnGxV z+{t&LEVAzsuh<|{cqr}K)O*~D*`+hofQp(Gn3$NM@WrV{8eZZ>JY4v1x#Y=JmHNh0 zZPLO^t%2>G$$b?bPsqkk=grxEo?7Rq)pK_qvGVS>_6kh|m6nY|Mjm2k0TCbU%qKpS z)-pq*8_=(B&F>vI7OhVND8e_FIZ5?R&HG}N<+Y4O+ygy}YVv!^pRz8IACM22SG`Eq z#3Z$uV40Xw>s|P{T`mMCp}xn#e$II%QXtH4Ps(23Ykg{fUBCU4I2}CvS)--uOuY4O zu}(lm-G7tT1moW@$9()$!m4!Qzy+x@^6D*LTAt=4O}y&p>v*C1-<3g1Ox6^sWDfan zD3#6Y`e)hl2+zKG_x490>*?!T4`11&zyD@%zhCp9{W};+l26q?e8AVTzS_uKus|F; zzTo5Pw!bzvAFHe&+l3!&Yqs|*kS_ZrYFyKUtWqx#HHWp`-%;&2HuL&JV+h{0ZOAZM z%seP*Lk|GFRs~Fw?VC}9)JpmlU4VUV7CpP=S zMfR_a0LjxqM_YJg+XmbPCi$Z>rf)kJdohN`R)%`T;wzKyT)p7r+ zg6Pua!cDLH@&=?j#tXsSx$83X2g@@}AcD&;n}ask)BbDgIkWJOZDYlB_fiA9nAGso zutDsiSB9vEdYFz1ll9Dp&gvuFhbClc(47YfwOc~*>KK2T<_qvMK zY)S9TGrK2n+?HE&fJWElrvN(h4hKXG^79Y*zM0FB%LqQ^PTO$D(B%&tjE?go7Phxq zlr>7rt*!0$6ct4EBzIfitu)@T4W!MteH>Ky|$sF(bFU`hL3pF4cRU8OW6S5LNG8{F0cSD!2 zd-bcn&Q8~(+Z;2xw$`eMo~iM=`U!uHHp}5!u_y0eGQKmJ&bQj_!wBiZAh#vl&S>_J z?*eg=a|Az}{Dq2~hz6B>;#ZxS-^Gw-7=3lD3j)-ue-wXKGa;#{MMG87%yIIUO4Z!v zO}11owe9GVM(Az{qWP!j`2>ZAmSc%U%7^o9WWTuE+@80IvTmU|FAt$_4u;+J8#w0{ zNBuTgb*~0*y9R<5;^TqwO6>X9T~de~ay9nhpw?ko&a-$RW%&cVIT%gxyxHr}zdpQX z)}L1_%3hC*6tbPPzaX?6aiE`9+>&cJ7S+8^HFXX5SOy--%C|&~T&5|^oz=@x6)`XS z@Jcs)@w{wg+3~JW{JtBgp|6|z0-MyOFA~5>R1RsE9tmMp0j>IGz7E;ypycMMQvK&r zOi8MtYi0_xbv0VEjtRtA<{uWQ;-GoQRB3aJIib4G8CfR2KQ(PO`g2y7^_CW}fo2sI za&Gv*MtxbY)v;4?cJE$YK&^j8Wkr&Xi+?I@Ii1+x{~w^XASM3NB{aFP)sFG%ejeQ& zmfyT`*JpsYe`yUUnx;$noH!0G53n6wJ+im?AsuAzK z@(2^%BVyAlAax#Iu>el-hHNA!I0_WZ7Zf!VG0`7;(&#OkOPuycidI@+w|^tMd>S~I zVm_v3zwC_}srTJpzrss+mZ%(T0ho@S)T2V2d0a?5&Em}CK0qt>5Px)Yv5&PQhMpcp3##1IuhO}50*42AH#eV5*z1jK8m9Df{tG_pWebM%d zK@iqK9qqI>ACR@yHy(hB+z<7nVrP6~<0QA(6t#sHq|k)*&FQl!Qn-(&{xC$ z^@uf!_(a5L!_;tx=!-<96+<-!uWq-FN$U@;vt80zw4Rw75jEbDKffO1G~2?n`d03U zH$ho_yS+;U!on7;3jX?CSKX!SQO%PBvZgRuJ`nzu-)u~B&IKOTx(?oX-7>kDnp(8D z%vR>K`RPty)#Yw z@QIk8NSu37y1 zQ}1AYHbIv@3=h6xOIcc;cPkVty1C@+zJ87JndhzgFZXO*>hPs!2_KZC>0FUfR{0JE zzNr@6t;3k?%d9uf>lF;;ThLd1V^ia&54gzUN*xz{)pH%4WuviBg5Rx=CNo1^O3Xpg z+pW*#3)$y}LbP3+wW6K9t8y73zRXWs&qIAji%}HX(50}==lSYbbVM;XN@qCQx9~X@ zKYLYn0D+IuLy4BzE^y~qRfLYd-=jG8=m=Kck|2h^2x~ubjzaqT6Z&+yrZO8iGUT*I z)3c6C`P&7nEDGa{_jiMDR%w#QL~S3<;hWVl%G|wSjxcM2mvT5Ed>b?N-*|Cv8AZ*Z zx9-Z7&4@cOB7;&yaF>&ZXJhPs$mjp8$6l(&4t6uVi?E3)1h?+BBkeYrb6sMU_U^`b zs@sZKO-Az~v^i=@tGaWCTpPH8%NvV0aKF=16W2ErnLg;Rt<;2wQ8KOa78!;N&%iWa zw0Aa$o0nT2fj6R?AL&Fne+ye&XaLk_Z+2?;e`y{#;%B5)aFXN;>QrWDnqz{n=Cl>O z1s_hhr{(eOURH8eR)*R;wX8Bipw+=ArNoIEyvKrHzwX6-5L*`~>?7Ow=RYq@V6x#BY&rf(5WNvK0DtJ7f41L`uKLp3Q5Y z#c*Svqqti%`!L*KV*l`bF6o{EchNor!!3yUky%UnifBeJJ*ygELnI;-o3vpXd1{Md zg;;yJo=M|>a4FU{-Huq)yTrYeOn6>mB)^@UPpr}F?dO)tM+lO?<&Z?vDu&;(;AHlH E0A diff --git a/extensions/fablabchemnitz/boxes.py/BrickSorter-5-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BrickSorter-5-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6be02314f1b08df47a6841e8f680c3ece7495247 GIT binary patch literal 4476 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 diff --git a/extensions/fablabchemnitz/boxes.py/BrickSorter-6-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BrickSorter-6-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a72fe5a2676c1583541d524752cacdab1879c953 GIT binary patch literal 9239 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 IPq#Dw4 diff --git a/extensions/fablabchemnitz/boxes.py/BrickSorter-thumb.jpg b/extensions/fablabchemnitz/boxes.py/BrickSorter-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b99a95f6b3e3ec7b8dcda5b24db6ace9e5e819e GIT binary patch literal 12220 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

Cm|5jLmzL}8z7x0>Mg@1= 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 ZN>QwU*~a;*qHS?ymO3t${ptPE{{b#IpGg1! literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/BrickSorter-thumb.svg b/extensions/fablabchemnitz/boxes.py/BrickSorter-thumb.svg new file mode 100644 index 0000000..c39b035 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BrickSorter-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/BurnTest-thumb.svg b/extensions/fablabchemnitz/boxes.py/BurnTest-thumb.svg new file mode 100644 index 0000000..5f44455 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/BurnTest-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CanStorage-thumb.svg b/extensions/fablabchemnitz/boxes.py/CanStorage-thumb.svg new file mode 100644 index 0000000..eca5aa6 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CanStorage-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CanStorageAA-thumb.svg b/extensions/fablabchemnitz/boxes.py/CanStorageAA-thumb.svg new file mode 100644 index 0000000..ab98e74 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CanStorageAA-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CardBox-detail-thumb.svg b/extensions/fablabchemnitz/boxes.py/CardBox-detail-thumb.svg new file mode 100644 index 0000000..bc4c933 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CardBox-detail-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CardBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/CardBox-thumb.svg new file mode 100644 index 0000000..f0217b3 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CardBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CardHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/CardHolder-thumb.svg new file mode 100644 index 0000000..a6fb21e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CardHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Castle-thumb.svg b/extensions/fablabchemnitz/boxes.py/Castle-thumb.svg new file mode 100644 index 0000000..0399a2f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Castle-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ClosedBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/ClosedBox-thumb.svg new file mode 100644 index 0000000..9b827b1 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ClosedBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CoffeeCapsuleHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/CoffeeCapsuleHolder-thumb.svg new file mode 100644 index 0000000..5a3be0f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CoffeeCapsuleHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CoinBankSafe-closed-thumb.svg b/extensions/fablabchemnitz/boxes.py/CoinBankSafe-closed-thumb.svg new file mode 100644 index 0000000..dc08e21 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CoinBankSafe-closed-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CoinBankSafe-open-thumb.svg b/extensions/fablabchemnitz/boxes.py/CoinBankSafe-open-thumb.svg new file mode 100644 index 0000000..6afbd4c --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CoinBankSafe-open-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CoinBankSafe-pins-thumb.svg b/extensions/fablabchemnitz/boxes.py/CoinBankSafe-pins-thumb.svg new file mode 100644 index 0000000..08da28e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CoinBankSafe-pins-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CoinBankSafe-thumb.svg b/extensions/fablabchemnitz/boxes.py/CoinBankSafe-thumb.svg new file mode 100644 index 0000000..c30ad27 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CoinBankSafe-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CoinDisplay-thumb.svg b/extensions/fablabchemnitz/boxes.py/CoinDisplay-thumb.svg new file mode 100644 index 0000000..4067154 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CoinDisplay-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CompartmentBox-closed-thumb.jpg b/extensions/fablabchemnitz/boxes.py/CompartmentBox-closed-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9812817ffe3baa9baf8b470fa0e518b2d5240b70 GIT binary patch literal 5708 zcmb7oWmME(xb<&{VJHFV8c-x8MOr{WLTOMs6daI_fuTi8LL{UW5E1EaW`<^vp^=sr zhK8XVl*|9VYu)efbJjUu_OtieYoF(QIoH3h{{Yk)YU*kL2m}D2n+06Y0LlQEh?tm| z2z+ypfWaiBRAi(O2q`V)EpjRbT1G|&T6%gWRxT(L%N-Vadgy(QJNLMG`FNSw1%w57 zgt>TldHxdtfk{Y6A*8p-$Zqp6(=+q@f7f*zKm!4ifNnw%4M0ExBBTLbcLJ;cKtMov zWAy(D1O^BQiHJ#VKzV8aL`X8t|RlqDmyR`tXFi)*;{N=pQ~& zPONGl=6dnkBQ$3b!tlIi|Ax*C`hWF*(l`A7q;DWTnwx|O2naw#1fc&F{tu!d6uo^% ziT3V8{U_FNA}+CzgzIU5;>O$!LIWrO$L>u!OVlQue0Mo>vX!htiHSN0vOg<52+ocI zQ?uO#Q>!R;WOGIlfZo&SE5Aw;xH{LYQL8FJ{2O!Isu#by{Io4aSX=qp{u&GP#hiO(a#ROy zy;u;Ke%CZ!6BRFg9}=ErE*Pj)eFgKRfWymbW6D2&WDl*!OP#W^W{E9XcxyiVmNIg# z8zwJhhhANtHIR%RAl=})#Ks@hoLgL-Rs9{iEHP@-T96e&k2q#{{XBg(vu*SM+cw$d zR~xJ||1Xl*3!4UYSbUSYBgNX>`~>rQw4t$CxV3u1pz|W)gDjGbrQv|J_SGU^o#?}lEsaiPQrfR*|dwA+Xa8@6?uxa&NK{YW7V-KXFRh3uhU(5 zHt-VSm?XQhAi}q2PY=a zrf-$M)>M=9M81+>JMjIf$`srBWlDj2XbYym7IZY;JQ|y!Xn(0r6*@pP692QffA<>j zewuCC)bz!F+83j&$z>HA>%=q{rr5?oJdn@ZD;9$0dX7`3?2R+ih{7y=qE=ciJ;p<2 zU}c5d7~?)$)a}1whNs=R5g{PzJFl7yEZybnQ;=uc4)(eV76Q6vu5Ga>M! zIOklRmypb=uFc3>O8kP^d8GL2Tumb*R?DOLiD6&80GsXbR9W4m=_A=Nv|Z7{a*apA zi2Kac^Q~#4x-y~{k`X;Lo5SINYGae`DBrqp#*2q6n`(E8*I-?Y`YuM`>B;c-KIC!|`f7C*|yylkOFmsoBX1!>G ziDW92b7&Y|zcS~jjhJz2_zfG-hHQXwG6#lqOF^jb0Ofwqp&6r7VE2d2AP~WPBU3mZt)cJ} z8d<1MuVVe*tk;xD)D=8Cr9dhh%Z&>OM?dmC>;$#M zFvd`XGJU`hk)hyFh1R}07o18vKs)umWmy+jLnC2L5vc>DTVn0r3ca&elOm7rU*;d? z2iVy#oVxep9obzdsnaj6@7y#J8?A0<%nK|w;sxJd-Ta2 z?35-VcG3XR29&iSj`!2!e^COJvPi0X^upMwp>z;xf#bHG35W0FXM(IPL0$^oU`XGHh7B|uD)*=(}VN!FZa{FjQuyb zdlDPq65fDjF|DYtG#B8FqHXC?3;TtG|2hvZ*K%V&9#{9F5>LC7M%Q<`CPy?aKm4pQ zf9UG6xY3}x5Gh!CvY7Sgls%Nuj+=}NVwg8g?OX8o*>jyWlg;;uOpsLJ?Z8ie6W%b_(RO_L|TrzHg41Z;oAj=Wh12R^~RS_uN?EXCLB79l1SqDKjF8mB80k zm+POU*z|iYd!O@I%zk-WC;DlI0n?0x93(n)suqPr96z6^Ec16tab!VYT*f7Gy(IVW&i zG3>_5HK1eUxFc29Zxs8~>IWX&ZpbcVW5xXW9!2t}ppyq@o*cvv4m!?^^0UIH@~h(w zrW=dXDlHw%WKX25x%^1Y9;Z_amoEkVl{g#dG|-X z2`n^GDfA+w^Vy-S@b7)~UH*Z}2KBr*H0}oD51Fok8jZH$t;toi#gf~^_kt<`*;nPR zh6XoLtJFP#xz&Ah`8P<_CXJhAEa1R;tqoquk9RNqO7!SjBP&tMUtS-S*3lqh4=Cl0 z7_uZXSTZ>y=O!u9!7i6(n7r7o(VE|Iqh7FnP(N#a&t`w+pb}rn)&T4@$z6S(azFRq z|0ZJ9Am649a&T}$W+cjRocHcoUwFBK*UGnEFP3uH$43{2w^0OZkbSU_l7=o%edivW zqca=HfxPkIT{8UD=x1ehMQyk%NZkG%+eXL0?7pgtFvtd9Sc%mhh$CbU`DhSTBDf^P<wPyB}V)AqAXTb z=I?e#f&=FjBzm>y)J~4Fup7S-Nv^LGYV#Kba-CRPD@PRXoh5a?6BvzqEb`bGvAUAa zmL9Arml_Feg6=`z^T`bvkG5z8yqB9@MVVAK{|I=Jp|kPb?V|3u`UCqMvX`j~2ZZ&X zu{RkfWrPjM@9I8l1z8hXG{Q0v=;<<{U19p8qq4mO+~dp< zw?%|T<4K);0S~Jx-K2~kNnk_}w-@%Kz`~E=*J~wp_-S4yq>I5?uJ)q0+~C$bIp252 zHvc|)iF^Ns8y4=2>Ixi~VWm-n2dhDS@h4Gta_XMzzYv#X@inCd)`5;=x&GzsUn!_t30ZF(y24`w?V+tu&{E>%P$C$R z>(nQ$tS-~WypnR@=XuyTIx5e6$1k1d8JI8v{-;L%rv(LjWbqFkdLnUH>N>e;3W?-y zp>t|PnuV*oQalQq=1)1EI3G(>{kNIv9=(ez z1DP`#jMi+u0$Y~pS=q|_mdcp^x|te=k6DWb)5S>64}Yu+BAeWqhb$up5STceME%3% zsg9u^8%48F>)l)q|5r{>OOkfP=k7I++L@=$J8dWMUBfgTzD})05*reJO1ncdw&{qK z3P)mXRhmF1cV zuq9@BbeT)xdnG9wJ0Iex=`a2adwolKF=S}FO4q@rZ_L|4SuZ@f3jf#!Fek7FfTCgTcAXdEBI39s$R5Gp=;f4 zXzJ>^gY?rXjgGaX$uyA4sGKXN)C=;J|P#vl9yQTkNZ6@{GX(LZC;hs|oj{@#M8 zGvf6px`3?+Yvx4TFZMg_*eO?yFV@NE(*FAK<{8)N2zz4QAf;zrpAPjjeNTVy5nklW z;3D6R^qJxx-JW~OWmi~SRQLsTNwqW6`q=zxRQPS_uxJEi!==8PLr_mulg>prAboC6 zCebeiJ8#(XF~#iQ>&mdHP#q&PylPR%?eIeQF!UM_C{Pd?tx-j!=OjW;2ps3zY$ABl z+#6ZL`#NS23&}|{-(0s(952qdwu;hU$%S77lW?C~x}3ueMK4R=9+zjjntXF%VTt3B zNEGj#ICvv%qA>D+A)mJ16)~q|6~O?m=II(9{sD4`G$Vt+SYwK+>L*0QK;J>!#Oi#} ziJ`gK5Q4&vztah3DTGrb?fO0Ct{gv?=%9f`_aAP4hMd@taL^mcdFbC0uX&MZcHyA; zj4Q*kb(5;t(Hy-ITW!CXBb=;fc8TJ4^Pf!JQ=8{)thm!^xV+kR-e?`j#8XmQ1j`8x zL&4g?8V&Bt9AJuX7J}NU@G>)=0dmFSL^Eu|4sx&Im(a?<*R4@8Qi?IUi3?7voKUj2 zp3d69l`*RezD&H1`@~#}I`DS*c#_URS1lXNdAV%yeeWe&bE7SwWAH^MVZ}wNw$$%(W?ggwHK5!AY_(=P#hFmzq87B|M>d zp*&AT*vi~^0#h%j=Da_v&wL%s#H0Pmd@-*>5^52In6-Drs`Kg)wDO{Oo5M664r1KJ2zVNsrQ;laI+f!06$`IW9;IIlB ziaGFpBw$-J>U&}};xnzWS!BPCAJ*&af=fj*%l=s-?D3P4-VyW0&#>kB6z9ZZo5Yv~ zMXOg>xeX-$zVax_%ddEA(0*p;G4gWta{sDA4a#yXWzzWf3!**_^&D;7X#*?3`f)2G zGvWVe`j(8UyVho)FQ9PD~ogfg+GT87sPf@(T_b2^-~3$1y(kCqOt6R?u=^e z=m3O%Y}*SM{8LwZ%@cCFc7U6x7nH1WvuXMGLpdRL3z=15kWuokWqz3y%0B2g!OsgR zb(L)bO`Yd7D=a$$9;G(4!y}qp)9~#&Hx9h_`i2XaAuCrpKac+4DsXP=7tpW@unIH7 zQY|M diff --git a/extensions/fablabchemnitz/boxes.py/CompartmentBox-lid-thumb.jpg b/extensions/fablabchemnitz/boxes.py/CompartmentBox-lid-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42c4cf1c3800b935aa256ade08bb8d57e61e8388 GIT binary patch literal 5749 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 literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/CompartmentBox-lid-thumb.svg b/extensions/fablabchemnitz/boxes.py/CompartmentBox-lid-thumb.svg new file mode 100644 index 0000000..d7d6a68 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CompartmentBox-lid-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/CompartmentBox-thumb.jpg b/extensions/fablabchemnitz/boxes.py/CompartmentBox-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45a1555463d345ed44c390fe1718b4b35e53f717 GIT binary patch literal 5928 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 Gn*0y_dI-V* literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/CompartmentBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/CompartmentBox-thumb.svg new file mode 100644 index 0000000..4325d2d --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/CompartmentBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ConcaveKnob-thumb.svg b/extensions/fablabchemnitz/boxes.py/ConcaveKnob-thumb.svg new file mode 100644 index 0000000..5f122b5 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ConcaveKnob-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Console-thumb.svg b/extensions/fablabchemnitz/boxes.py/Console-thumb.svg new file mode 100644 index 0000000..28c8f6f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Console-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Console2-backwall-detail-thumb.svg b/extensions/fablabchemnitz/boxes.py/Console2-backwall-detail-thumb.svg new file mode 100644 index 0000000..d9b570e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Console2-backwall-detail-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Console2-panel-detail-thumb.svg b/extensions/fablabchemnitz/boxes.py/Console2-panel-detail-thumb.svg new file mode 100644 index 0000000..89fddd1 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Console2-panel-detail-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Console2-thumb.svg b/extensions/fablabchemnitz/boxes.py/Console2-thumb.svg new file mode 100644 index 0000000..8d61183 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Console2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickBack-thumb.svg b/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickBack-thumb.svg new file mode 100644 index 0000000..e77caef --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickBack-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickFront-thumb.svg b/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickFront-thumb.svg new file mode 100644 index 0000000..8de24d2 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickFront-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickInside-thumb.svg b/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickInside-thumb.svg new file mode 100644 index 0000000..5bcdf52 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ConsoleArcadeStickInside-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Desksign-thumb.svg b/extensions/fablabchemnitz/boxes.py/Desksign-thumb.svg new file mode 100644 index 0000000..6fb8009 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Desksign-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DiceBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/DiceBox-thumb.svg new file mode 100644 index 0000000..231e5b4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DiceBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DiceTower-thumb.jpg b/extensions/fablabchemnitz/boxes.py/DiceTower-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b19f89f1fe189fdf8507ef8f17c33fbc6a8f8621 GIT binary patch literal 4455 zcmb7|S5y<+(uNZfkRm1Yk6r?VUJaplNB~2XUKEfPq$5S?QWPN}6zPKWrj*bWQ9wXI z5Rl#kLzfncf};F<|61qVpLZ_y#k1#~S!=Jkn0+~WxdLD?)JN$9fIt8Mcol%l1%M8K zhLVz+@)`{_6*cX38d?Y!BZQtFBJd9fGnXh-Tnq*k5s{SBRFsralMxX?7%Qpi=pj)^ zak$AXw7#XL0aEW@6X11PS_nOapOKMYPfA2e?|;_idjNzIumbo90tx`gAV3fVc=-Xq zdDSQRzuo>0bx|lQZ(mYEdwmF$>%Yh?O%> zFX?8{9$&pC2$fgRalto|SS{iXuhQ9p|F8c#|C@j1eMNX7S0%~FKv(=f6i5c)mjy9u zfz9q*&I7JrRU?CdAOH=(#7KI>jT{JXNYP2<#*BDdrHDR7-yfuo`?Gm&|C% zz*GwlY;;k4+V#rk%;VzXY>yI{@Oc_d>n}3KoNYP&Q4qyPS(e2|C5SR7e`t<^#zLPM zK4O%Go1vi(@l+#XRQz`m-aD<(2jduTl~vVpn*S=TlkF}cpf;~=E zu}Uo`odQoWKKAknvf+4p4naa5m@h}O^l1-l=aR<~I6NC7A`-?|H*V}=@>c9Dm+>Q& z`Mowxwtab?>YQ!Z_m=<`eP?=ai0$J;H@co-?(^A;=})$*Ay%9?`dbqowqMe+l}PVC z5O1=5Xd3t?AuOklR2yjdD)6STyEoo?t9ora$JTwb|MC9s1<${NSsnSxf!SI0xfk+~ zO*Uaqlcmtp)Qj_rX>@%O{BdGnQ+X_jPHn~~2wQxu`d7X2x|%V{s&^O*=Y`8`q|}7H zU`eRZ6W0RM5wvbn7KfC@peP$*7cENhjU-IL#BH(hmbUs3Gz8yyk-8__cb#O`NBJN?Ot zyvMw~(Rm9!hZhiri>5&6_XGd&6YH<56yFvIkwzjk6Kv0wrGLChKM|{I!sLaXy;WA7 zO*(Iv`q@<%su6qBb9tV$>#Ac1j~yewlLox=4Kp9*P-OZMViJ6(fPGm#!Mp7d^NmiR zyy{s}r}9KkJpb9j;2io%k=%F#jSK9Qw|u49%d=Wuq*olDoP2@Wtk&u~wxZtE$-kJGp~1n)z)`CbrK0Gi z-|1IlFvLob;coMVZzARbPDNfrzo1T7+xWhY$FKu00g)g6K7Y|wz3pERDa|TB)tGW# zWO7l9A#4w&7AKS?^D|Gbn4zhlj9U39I;LtdU4+s;JZRfKYVF$J@cn-r%49pw^>whQlE<8!!Zt1=NZm5{?rauaN}LirO|C5 zX#Mk6jj}&HwX}E@Z0hLn7>d(l*7ihGaxo&IajDQ$Xfove(ca=6NSKhasHn~VJat4+ zyZugGCb%HA-mNi3R^yMe#;^U?03RDeR6GT2jd>%@pi*3U(-(i($`l6>0n|`howT>@NQ7@QaYa=om^qIV)xV^R{#N1W zKEp@rdEDJ@jdR~YDg_6riD@F3wM79>kbM3q_=J`tHM*>tVP229n&M|dh*zN8k-{7Z zBwLCh3RZ)UF;%-A8gw2m205QZ1^&*!f=Y2RkvJu`^NH{3DbMG}s|Ar_F?dUS4Brz< zC24Li^YzufDg)@9ya&$WM1MG`d*z3!w8n?<3|7VVz>T=5+9uME%5(}#>ShG?6)ftpPWmyk@(P>U@udvil;LV6kdiN7-H67(JVQv(>e6Jvor~8 ziUGflTCiRbHd=@Zd~3Hzk}z1C3Y2bUr&0}mEPTxlSutT*h_a?k{P!@Yc`YdO&bt?G z*=0GN7qeeKs>(X^fTqoXLW(BnIDiSwX*^82z@G^lh zB)gy{8$(_}v|bo7iS!RX8}X71mZ0Mb;r5;Elvsb6r#(1zIvBh~TI>5#IqI&dVyu>G z(`Y3jeip7ilfv9DDjdi)U2aI4%<=-_n^Cb;Ar`)^9AjJ8*%ZCCu4$ z^IgWmO4V*uxT^(D|GU{HMy3vSD zeV^T>#EEuIGQDNfX;j%U)~C>A*`)ZhPl4CSI;h|5L(s`FN26{V?-j8)8>rUg+gUim@?+5xa#-$!;>5C?ssT>L zJ^GFmF9DLDf>PnCVS0bKtYx8Txxc?Z^Y8!l&{{HZPa1^IT9952l~WmukgQjy4<{g~ z6D5GDYhMFRLSB{j%QumTK|ge$MfS5ZmW3Lt_L)7=bw8%AZ;`3n8VQpBa+uH`?A+pb z@Tcl;G&vM4wenYNwO~{zPe#^q^kbA_wxFlbl3#jTQd8P#%E|^S~$;J ztA}&HzPVCg?}e$9*7y<$UwMUKK~9p1-Ig}fO>#fjsH79$7Gv?9)Av9zh%GkWk&WR& zpLZO?{{SArs$*J@5__y$My}p(7EfIz!VpWDSZpYyP^?pvEmsOezE5r)@GoDiA!NZ| zl_(}*=0ob%kR@vfiJfQ8^>!&&{9a^4O-yDRi-PjQ5!((1t=}4O_GYfo)_=knXRMeO zUfrt1s#FfR;d{26HsZFHwItOOpB1?gn}u2g?*-@ib_pin)@8C=N?z!vc}64@-tsS! zjk*M|?pQ_FdOhXX*SSWr4Z|tJ_i^~+@3Rq-_dFoyMWT~|vF*Gt+2?kitYuiL@;45Q zCiV9HStQ#H!)bd>;rd13v7M5#TYHD^r#o)GSj2iLS)(jb%MdLS{ZQu%=~A zbpGIKc7_Q{t>s>;+(~V^EDn7%rR8D$m}1i|={RaS7sGHt!5XBDY1zrVE<7EmoPPDg zp$d*Mx!U59Ol1Br9^ATu2$=5mO(Ez+Y&o@V83XHKg%>qn!LmBCme$|=#;JF^n0_WJ zsNQfuY(&8_HIT+QRJE2?mG{=oSLF(R*QUr{d^tAjDDX#^>xbCGT diff --git a/extensions/fablabchemnitz/boxes.py/DiscRack-thumb.svg b/extensions/fablabchemnitz/boxes.py/DiscRack-thumb.svg new file mode 100644 index 0000000..46fc814 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DiscRack-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Dispenser-thumb.svg b/extensions/fablabchemnitz/boxes.py/Dispenser-thumb.svg new file mode 100644 index 0000000..ccacc56 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Dispenser-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Display-thumb.jpg b/extensions/fablabchemnitz/boxes.py/Display-thumb.jpg index f9bfaeac20d87059dc1f0f1b4806be85a8ec1518..18bbd465858b4e5de6cae215e83daf26093a1d4c 100644 GIT binary patch literal 5598 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 qx4F9%G)v6v1DNV2`=grW@){KK&O)P5NX2 literal 16904 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 vUg}FGR{Tyjsc!*E3 diff --git a/extensions/fablabchemnitz/boxes.py/DisplayCase-thumb.svg b/extensions/fablabchemnitz/boxes.py/DisplayCase-thumb.svg new file mode 100644 index 0000000..848ea58 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DisplayCase-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DisplayShelf-thumb.svg b/extensions/fablabchemnitz/boxes.py/DisplayShelf-thumb.svg new file mode 100644 index 0000000..85b7a39 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DisplayShelf-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DividerTray-thumb.svg b/extensions/fablabchemnitz/boxes.py/DividerTray-thumb.svg new file mode 100644 index 0000000..3d36f27 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DividerTray-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DoubleFlexDoorBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/DoubleFlexDoorBox-thumb.svg new file mode 100644 index 0000000..2e9e0f4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DoubleFlexDoorBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DrillBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/DrillBox-thumb.svg new file mode 100644 index 0000000..5ec5c9b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DrillBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DrillBoxes-thumb.svg b/extensions/fablabchemnitz/boxes.py/DrillBoxes-thumb.svg new file mode 100644 index 0000000..9be8ef0 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DrillBoxes-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-1-thumb.svg b/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-1-thumb.svg new file mode 100644 index 0000000..faa70ec --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-1-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-2-thumb.svg new file mode 100644 index 0000000..9d372d9 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-3-thumb.svg b/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-3-thumb.svg new file mode 100644 index 0000000..9b7f114 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-3-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-4-thumb.svg b/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-4-thumb.svg new file mode 100644 index 0000000..eeefaa2 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DrillStand-assembly-4-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/DrillStand-thumb.svg b/extensions/fablabchemnitz/boxes.py/DrillStand-thumb.svg new file mode 100644 index 0000000..f823e32 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/DrillStand-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ElectronicsBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/ElectronicsBox-thumb.svg new file mode 100644 index 0000000..0359fb1 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ElectronicsBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/EuroRackSkiff-thumb.svg b/extensions/fablabchemnitz/boxes.py/EuroRackSkiff-thumb.svg new file mode 100644 index 0000000..13f128f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/EuroRackSkiff-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FanHole-thumb.svg b/extensions/fablabchemnitz/boxes.py/FanHole-thumb.svg new file mode 100644 index 0000000..b3f9d20 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FanHole-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FatBallDispenser-thumb.jpg b/extensions/fablabchemnitz/boxes.py/FatBallDispenser-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e69d53d24705378dff109d04162531312d9fcc10 GIT binary patch literal 6485 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 H{o;QC)zm)F literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/FatBallDispenser-thumb.svg b/extensions/fablabchemnitz/boxes.py/FatBallDispenser-thumb.svg new file mode 100644 index 0000000..8a0a400 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FatBallDispenser-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FilamentSpool-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/FilamentSpool-2-thumb.svg new file mode 100644 index 0000000..060b990 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FilamentSpool-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FilamentSpool-thumb.svg b/extensions/fablabchemnitz/boxes.py/FilamentSpool-thumb.svg new file mode 100644 index 0000000..2c23238 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FilamentSpool-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FillTest-thumb.svg b/extensions/fablabchemnitz/boxes.py/FillTest-thumb.svg new file mode 100644 index 0000000..52614e3 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FillTest-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexBook-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexBook-2-thumb.svg new file mode 100644 index 0000000..fcde2f6 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexBook-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexBook-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexBook-thumb.svg new file mode 100644 index 0000000..be19665 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexBook-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexBox-thumb.svg new file mode 100644 index 0000000..8bdf1e5 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexBox2-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexBox2-thumb.svg new file mode 100644 index 0000000..8fc262c --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexBox2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexBox3-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexBox3-thumb.svg new file mode 100644 index 0000000..cdf3e88 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexBox3-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexBox4-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexBox4-thumb.svg new file mode 100644 index 0000000..784ab82 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexBox4-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexBox5-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexBox5-thumb.svg new file mode 100644 index 0000000..41e1c89 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexBox5-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexTest-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexTest-thumb.svg new file mode 100644 index 0000000..bff7349 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexTest-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FlexTest2-thumb.svg b/extensions/fablabchemnitz/boxes.py/FlexTest2-thumb.svg new file mode 100644 index 0000000..db05a4f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FlexTest2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Folder-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/Folder-2-thumb.svg new file mode 100644 index 0000000..b20411f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Folder-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Folder-thumb.svg b/extensions/fablabchemnitz/boxes.py/Folder-thumb.svg new file mode 100644 index 0000000..176bf54 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Folder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/FrontPanel-thumb.svg b/extensions/fablabchemnitz/boxes.py/FrontPanel-thumb.svg new file mode 100644 index 0000000..9c18741 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/FrontPanel-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/GearBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/GearBox-thumb.svg new file mode 100644 index 0000000..df59907 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/GearBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/GridfinityBase-thumb.svg b/extensions/fablabchemnitz/boxes.py/GridfinityBase-thumb.svg new file mode 100644 index 0000000..f6d7e4f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/GridfinityBase-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/GridfinityDrillBox-thumb.jpg b/extensions/fablabchemnitz/boxes.py/GridfinityDrillBox-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5861e317172fea37cacbf07e474215e5b0e64cdd GIT binary patch literal 7748 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 WGE`R8)5`tvyMn4puh9N!`F{b}aZ!N) literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/GridfinityDrillBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/GridfinityDrillBox-thumb.svg new file mode 100644 index 0000000..f394d8a --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/GridfinityDrillBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/GridfinityTrayLayout-thumb.svg b/extensions/fablabchemnitz/boxes.py/GridfinityTrayLayout-thumb.svg new file mode 100644 index 0000000..f9788c3 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/GridfinityTrayLayout-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/HalfBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/HalfBox-thumb.svg new file mode 100644 index 0000000..5896c66 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/HalfBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/HalfBox_AngleJig_usage-thumb.svg b/extensions/fablabchemnitz/boxes.py/HalfBox_AngleJig_usage-thumb.svg new file mode 100644 index 0000000..a247766 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/HalfBox_AngleJig_usage-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/HalfBox_Bookend_usage-thumb.svg b/extensions/fablabchemnitz/boxes.py/HalfBox_Bookend_usage-thumb.svg new file mode 100644 index 0000000..1af8961 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/HalfBox_Bookend_usage-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/HalfBox_Shelf_usage-thumb.svg b/extensions/fablabchemnitz/boxes.py/HalfBox_Shelf_usage-thumb.svg new file mode 100644 index 0000000..47b87d3 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/HalfBox_Shelf_usage-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/HeartBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/HeartBox-thumb.svg new file mode 100644 index 0000000..18b26e4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/HeartBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/HingeBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/HingeBox-thumb.svg new file mode 100644 index 0000000..14f9600 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/HingeBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/HobbyCase-thumb.jpg b/extensions/fablabchemnitz/boxes.py/HobbyCase-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14ad226551f19fd519d79c26b57d488f7a4c7bd4 GIT binary patch literal 4597 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 literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/HobbyCase-thumb.svg b/extensions/fablabchemnitz/boxes.py/HobbyCase-thumb.svg new file mode 100644 index 0000000..f2baf1b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/HobbyCase-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/HolePattern-thumb.svg b/extensions/fablabchemnitz/boxes.py/HolePattern-thumb.svg new file mode 100644 index 0000000..e8676e4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/HolePattern-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Hook-thumb.svg b/extensions/fablabchemnitz/boxes.py/Hook-thumb.svg new file mode 100644 index 0000000..3a890ce --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Hook-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/IntegratedHingeBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/IntegratedHingeBox-thumb.svg new file mode 100644 index 0000000..e07d23e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/IntegratedHingeBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/JointPanel-thumb.svg b/extensions/fablabchemnitz/boxes.py/JointPanel-thumb.svg new file mode 100644 index 0000000..e5d9af3 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/JointPanel-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Kamishibai-thumb.jpg b/extensions/fablabchemnitz/boxes.py/Kamishibai-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c45db068065b4635d8e2cdf6fb5ce8f3e2eb7d3 GIT binary patch literal 7757 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 literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/Kamishibai-thumb.svg b/extensions/fablabchemnitz/boxes.py/Kamishibai-thumb.svg new file mode 100644 index 0000000..8564619 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Kamishibai-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/KeyHolder-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/KeyHolder-2-thumb.svg new file mode 100644 index 0000000..7825cec --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/KeyHolder-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/KeyHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/KeyHolder-thumb.svg new file mode 100644 index 0000000..d465c2b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/KeyHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Keypad-thumb.svg b/extensions/fablabchemnitz/boxes.py/Keypad-thumb.svg new file mode 100644 index 0000000..42e3176 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Keypad-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/LBeam-thumb.svg b/extensions/fablabchemnitz/boxes.py/LBeam-thumb.svg new file mode 100644 index 0000000..97ad85a --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/LBeam-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/LaptopStand-thumb.svg b/extensions/fablabchemnitz/boxes.py/LaptopStand-thumb.svg new file mode 100644 index 0000000..2666c22 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/LaptopStand-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/LaserClamp-thumb.svg b/extensions/fablabchemnitz/boxes.py/LaserClamp-thumb.svg new file mode 100644 index 0000000..a93d5e8 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/LaserClamp-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/LaserHoldfast-thumb.svg b/extensions/fablabchemnitz/boxes.py/LaserHoldfast-thumb.svg new file mode 100644 index 0000000..9f7fe2a --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/LaserHoldfast-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/MagazineFile-thumb.svg b/extensions/fablabchemnitz/boxes.py/MagazineFile-thumb.svg new file mode 100644 index 0000000..e039dc0 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/MagazineFile-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/MakitaPowerSupply-thumb.svg b/extensions/fablabchemnitz/boxes.py/MakitaPowerSupply-thumb.svg new file mode 100644 index 0000000..76de1aa --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/MakitaPowerSupply-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/samples/March36539-box-thumb.jpg b/extensions/fablabchemnitz/boxes.py/March36539-box-thumb.jpg similarity index 100% rename from extensions/fablabchemnitz/boxes.py/boxes/static/samples/March36539-box-thumb.jpg rename to extensions/fablabchemnitz/boxes.py/March36539-box-thumb.jpg diff --git a/extensions/fablabchemnitz/boxes.py/March36539-box-thumb.svg b/extensions/fablabchemnitz/boxes.py/March36539-box-thumb.svg new file mode 100644 index 0000000..5e6717b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/March36539-box-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Matrix-thumb.jpg b/extensions/fablabchemnitz/boxes.py/Matrix-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f638ace13bdf938f84e4aba7fbcd1bfe6d3f1cae GIT binary patch literal 13956 zcmb8WbzD@z_cwm&kdTy?ltw{X7G%j?VqxhNq*Gc#x}<9nLAsX~>6Qkimt2r;NeMxa zAAUa1_w{}LdH(pFyEF5?=Y7tZJF|1|-q+0R-Q3*@@DQp9Q3NnBFaYKI1Grnml+v{<81*L_s4(4+``>ORzpMe-^u@! z|7HFsznJ;2?G*pNSU+zI;>E+2dYtOoVZIAAPyfg2|4|ZJTDe=?b2sbS%Kfb0PP3^u!%yP5wd9M*k~X>APvrzHSDYybch z8h}A83|0V>3A{|#gQViijw`S0TT-c7YF-afBzdp zm}FQig4mkmvgSAxtU^i8;jVd~zp{Z}y9KigC)b9o9^WkhME4hcZ$}2m0Q*6izP6~) zq@>E^%o04sBFU=opp--pH?2{BPejS)SaB@DdT8DQjbv?DvG_!=^uiz(o8tNum>S@0 zXuzUd0xYr>W0kkTWd70x4RKJIdc!XB$!H_ggT;)K@jO0@fnrpoQ@P*!R+#0{q_1KP zx%`+Yio|cH3)D2p;z<6y zvg;1`AxtjhVWZ3meyA+I;#%45JrSjRFgTGXnco zL$5d(PP%l!7@z%RDyQy>IhoIiN9V$CQIO|jr z8Al_*m@-G-`8kQqN1|({g%DFQOX}(;R%PiPhdMnH7^?k2+8Ms@YVZbSRrr|(f|CO* zQbtQ<>W~RsJZKM?1aIXbec3|2N%Ztr!#HRXJ6E6ijmRcnJ%kz)3EBw`6LkT zADH}-`HzD`W3SU!9jiYI^!&<|IvIBONh0tiW3X;eMT4Y9?lV8CYo=?cZ@`$k1_#Y2mmf1(cz z!sIQ|WI;OTa;OzSH5K9c_;^fLv-y#s15O@@v^q1HUH}kc6Ui_$gjU1xY}2Ms=exnalB$6L~xU4pyaw)%DU~l}*h|@hnn=V%L7i-%f zJ;l&kaSGAhIR?rs?Ab|Sr+!?aSFu@cR-ZlfMI4%@?5Lfl-Qk-o3L^8*3Y)qS>gu|O zR3VV=NT!Sw<84=qgzkzR?FT%e$E)_0(}m4j!g*hzp8!s_CHX)0p{%e1wNcidPckWTYLWY%#{xW5BXakD3 zBR8v}Zfp4wubrIxzQ}{5vG8}g^T=CnIuUxfx`Q?khTt`{z%DEz$>or@*p)c%FXI;LBkXIlR8%|ga!%c3$q_P< z%;7JTW9Fr0VP>gv5nRTb)%L`4C?aku*K+8_zWQb8EhEvi0zz&15Hg<<(8wH=(5pB& z#h6?aT{#CZ8>u)edx4{*ZpCRBZ-L3Tj$821Cz$V=E`PnT)gxAj;dL^!|C7#vUz*X* zO^Sa+o?WZru%`)ZBc&K@3@V(9FMAu2s50Se|DN9|@zraK#W#W>01QeN9$R=$P8iJg z_(P6eELvu5uhe6+{>eTvwTXL2nY78s5h=e-(@hTh?k_ytzY2FCdt>!d&SklQh2vZd zuHiV$>(V&BtnPztlSQHW0OMO#!0;yjlQJX&pHzRh!l*Bo1vS-(jPsLr!w+ju#f%2l z)lk`<8&>A>?8uiva7kqb3-|*ir+mXve<;(Rrz0|CA-@Mh`mLkcb z-zIA<6%mYKJsABNv5Cp(pb82UG(J#Z!Myy(bacnDll&ge6IIFRM=JdNiKlI4VKqj7 zSs);G@omuOP-K2y(#e>Dc?-FGd(Y{oS5K%WzyQf9ciIj`5G2M0rs*Kb0Iy+v1`O3wn`_e}$_QGA^Gu#-E(x;JoL>S^d& z;-H+)(S0lFW}4=0ZznfUwbDdmXrz`$_= z?jsX50TQL{il%QAubT#Za27hb4qYg7FKv9uzslH>?ByITj9s8O8SIDT9RTW zzaX=%xI6Ok)P8B|SI82&O#2&H=R|luw&6owzVFQ@GC$F!0}+x>qV&CB&VI3ak*m?` zHOKJ=o|OiN)VgL?Y{PJtAz^afq&A@oTv7ewTj?YF;V=A>o7A6GE6YC9A_Z#4^^C1& z5T%7Ti=~)K;u~K5$hW8=j0o$wOcTd1U+SyPeJlZt_6irbjJ+3@eJYOV+)*taD5G7M zg)j|!nw@8NU>!`i}fuK47RX(>RQ31bPrzE`Ew}|f{i)(rfD~|>_;EViEd%yR^4&b*fW=kJuKmtqC3E-(8yN)x*inC zL&cRPTQ9T#gAVa_jlq+jNo=b<6C;Uwg?8Ag>HWa{oPWA5B2PP@dDw+(lMye7P+2C> zNl*7Y@71UE?q)|*z1Nk{%stB~QAa&Mt_+{#j3U#cx`gxe5~Vm0*?`zZH>$N|nSg!G z*e-olcr^F?1^9SrRyHWJ{e`DAnu`f~)FN(uDkV+QiiJ(YU>7$zf@e!UP9KeE$bJDw&+#}$KmquXCwdDMp! zmsr5DH&#|pp`<09OV0nQmV++>%LrmtZ3yu%qA&S-y;ISL}&dpoSX{5+xPfU!OxZ0E zx2fdOnV+}dN{_!!NwjeZS6Ko<5{MygEo0xX5GCi^`rHS8Q)F8pA3oc+ZUi4!-^kkB zO542~1_?clidoBfYw`fm!2Ko06MuLxjf01gKzdhm>;m<|;->C*VEDN!vXS)0YHRQ#z0-*VOkJCZ)Rt`C!GXbc6m&k|C%^-DZ#bm)md=SO&D7k$)K z*Ibt~+q=>kyv=7bA%$Nu<4IyCyhj^p`@`7a;@fii5H>k5B}Fy&#YCxLFd<%|_oVA+ zEDW8~5SHA;_V$1P(LT^LBK;DKK-~d+MYLBO%+f)!hnSOar7Fm*v{O-mQbAWRZFE=^ zoU=!MAj74QLqZvg04sQ)%Fm(v1}s}T)#%0O-x=j5?)HgW!hrwE)_ryP<=O7820UfA zyWO+zf{L|V^@Pm>Wj47iOd9RQ=G?LZ`vBjS)`v)RyXAEaFgT>5YA{y^sV2tX22oiZ zN-xWB_KX;I{y`tt?RhHYwP22t6HcabquiI|F9uGtbY_M9%L2ceq_QUeiMRsLs)!t9>XGw;g+I3ScK+Y0`h_5;ty~M0WaU9H**hGAu%$dK2rvCm8jD{UKFD}h~ zpYwodnTDOwo=u+@OH$T7elCMb?8p~h()M$&%9$TB<$~N*rb9$&;8LjueOc z1xdEJ?-y52=1ngj7d7a`8U7I?NQc-8!c56aAyAix5*s9$Ht~wdi4II(%}LzfiaqAY z(~B>#mr|P>@XH@M+^KhZp>h#2zWS=s@aTcv5bup{E+dy=NQOS60$wa{iTK%+PNYfW z4ijf}=}ceo?XDtHqewB7VvwXMEIhC4P%x1kV~9pvQu6PodatARBMsFD`=rL&JCm!> zEL`ZfzrNj*+B3RB`BigLmb(|}Ms3Eog>lNY{NfkkeOmU$`lyydiu=r%#6^T=5ds4n@s+MQ8e3G;9cvl($oSpzvzGCc^)!m8zr!cR*=j(t zuL3-MI>wWZgy)>acqO_n&BOx?L$)o%3HCa*Ys?mnWc0ou6Vy_vq8+9`R+F#2LZpfs zJ9^r%K(Q?vB{Q`4#4?u|(|9Vbv8c1WJOv8Fr>vM+_=F63JwejZ1hQS17bx6cWja=l zx?`gX`TQ5mT6Fdtdfy1tAZk*1+cvX=>IBjYH3CqzH+R58-L*rtA4^P@y@S8^+6B!x zFkE#DgOsmzx|Nw-T#LI_Hm#f7#kmc)=`z7D*Ual{C6{z5>3mXZTQkn~OQ#s4w4(Er z_q%PlAs$rgON=sifT4Xk$d=9OVs$|ZLb9luo3Z^7VmC{{VZyEMhZ&R<-2Y)bt8U$h zK8M6fNWr?|3(Z7{Fo6np0gV!cYE;*A&l?4;Mea7kP$f+;akj z|B4S#V9NHd&&7DUD??OonN6lRzxpD@<{HP$XI4$AzkT$)Qz6cJ+H%s~YT+FsEdK>g zNQnlnIEXFysI1c}vHDl?FK0e(Yr3xkx02a2wBVc9+UU-z)3sS#!<@3I>7J?^3I0Nh z31~MAtwEf2I<+oOO$}8Q39GnHxLt?CFVt@ z{bW?9Yx}5b*HD|%jU-^*sO9NF-)xS3`)A1X*Q2;cH**tZ*m1VFFg8QN41%wq^CoPf zEN27}@bc!oMtNvFSyu@E&yKB`jT{)F!HhqFgzSxamNHxnO$@=_m=NIViF?QSdKgJ3 zu(B%_z2-ZWM7b3e74nH4Oy;J#FETic4fl-*MXr&DL&GFo&nv(gh z9P;O;$29+l?O|%Ix^n8{G1ur=v#+Pu(b{V_1t~X3Zo_1lv!dq~hp&I0PrU#fTt@9k|v+vTL`Jzx#DVpBAen{|L(mp!&KUJQd?Gn&vq!<6|a3 z5i4ic5EEl}9z4G0I(Mw7Wag>pIAVVXxZ7O@e6Ow4Evp+C=G3OX4lRleje=ES zdMe98inAC3(NL2=`SNE#0IAvYDrnQ=s6HCpZHwA-=N`W-aH8YtCTJLB(*i07?7`?4q#nfsvNirMf|R06fCk~)cbKR#J+%Iq(^?9=zBDh(2#u2 z(*%c0MtPT8>a7GSq`&ZB<9VxaR(CbjzJRulC*e4G*dX~>fWts})rN&;EKhQBq7wWn zly_z+vhi@n>a*d~zsDk^NI@e*vdQq)*n}c|hftx0&iXute(_Y22}iPRiwUdXHq%J@CI zPQ2|r)E@~vy;?Z;+GLUt$DLnPoIA_?c z8bMBvMI0>TX;y5Yc6pErsXWDX@ntSMhU604Tf3m9l|3uPs_v4%<8!qa5#O~-f6=6o zd{X+D^Ypt)(hSx8gX|c745P zHacDj4W~=5u`?C=nXb8%-mJS8^WYQh@he|w+T$%-K>9UxUJ%~t9_AlW`y19ixV_Mi zcB4uar=9T0VzS2s{7r}p?Bptc*K%?-^_t7~?Wst^20u|9?P5g6o4&?PLGHCM(R9Lf zM5TObIm7m>uJYjK)7?8Da5$GZ;}9{rEqJW?=e5q@`llh1>HOM00R`?f`$`pN0d}vA zcj3&JAeG%qlu$Xf(v@B#N4xtIC=S$JbprSr6-f^Lb73Gcz*sM4ow@ycq-8>&wL*i3 ze=^(kD^UpQa*E|~*VtJm@@2yAbRY-X<+qhn1lOdDcam=EiH>Qi57ev(rw$8^lo4Fd z_I#cB2vh9Mlw0Yn9TCf7=&wHwgbu{lSkgSNTWySL1zMoF%BtSa$&FpROQVNJ19Owx z?tpKl+2d(s>*gKBJy1biNl-#@MY_64@{OsH15$>tt9-EdU9#rXX6<}QX^5}7(AqQc zbJKEuBn%dh57GMJ7Q;LIbya^%GCTdli;D!LfqyJ}BYuCu3S&Q1bCcK*9N} z%x|xZjcN)pgb(qvo`dnJ$zkbEzLpuvd>DIn7ZH)~wn@%rcD{>eeV)uz`1V4zqs|*V zmps&B+~*H1TyhC_a)#F0N8Q^fRK82Z!hJYw=0n)F)Z`#jTh~ zg7o9X$1h;a+%g}>EG`-LasuWn=JnWEXRA8tQd#`D61dXRolK)Nq|UPE8RBfqtW4V3 z-)`%}lao?iKptOZtJ^gL6htfW;rmJNNopRUBFX*uzwD9zu~%&PDoY3?X!uN)PHLC( zZo#nRlqeDR3vW5!FkX)OKd1q-^E?@onhM{z7rXQE(I$C@B^;Fc$+g$CY z7bWkitfT`!+NVaV6iYBVA|cz@g;dxfp!gCr3|cwq6+(rHq$;*ju*rjvM!uv4-4F8j z>pB8!&l_g~-%P-!Bh6|BH8h0%H6U!a@d&a z9$qtnQ6eg@e4ReYmQuFBKid0S3vWxBK=F*s`D2+}@FfP!OD6PM7jE;l2^w^YXBKC8 ziUwU+bZG=Lpe9x?Qwuq{v58hVJH$}|ON}2B)`o9$okh;h8%&A@jgi_VLC!{lhT3%O z@o=|-_$!)qohTAJ599h0cZ-HcX8j*PmDpW=pKNVUh(}PmDGK>2#|EaKblNus^-GLN zMCg_tD4W~CALj2cozqq+q^c}u^_TpphlsJg3hT&l z9E5SRTm_>%O2aO(JzczKE~hBHQySu1_1cy@(o+euSdnC}c=AOFCD$=ivdIbEGf#H2 zAWpt96K&2j6ZKxNbw?BvG~x);bXhw2LuL)rZeZF)w7{vKd$BN?${W%iJa^9*3Do&& zH?If!ww$|%2_R`&Nh?3Li@;wpd{gLle&sY#&OL}Pp?Rr-eXHLMZEwDuL>EzcYI;eR zc$qjs3ty<0+(?v^lTPKcjE5xqGeF_We-cc@CSIeM=Gw=c)fSfMqzvoyOml<3Z&OB6 z%#e8R5DdI|rS?pReIf2Z5#1>tC15hxPi(P<(CvvYhHybKR@e*KABu16?NDeWHD5Kl zUl>H7>az(wY=1@;Hi@Gw{Ubpy(7NHi`7b;No?1I9iYL#5d{pZ< z&#T0D#fO6cU;7+KBQ{HC+zqvib5zFiwU<9iO7o<&Ub$J#*L zT@ZA55o+Q<$abY9KCoRiq8*C~tQ(Wo>8z?O``)U@IV)G{T29FeeS@&{v5PO9J|iI) zk`Skzef3;@(XjOU?%6k;@W;P3&_Wv+Is2Lfc&DTFXPnnAk1*~hK~yt6B2eqmD*U8K z=ZA;{)EAGs=p7*R7qRX9hD<9z#vd7Q&5Akv*>cqo8J}`_#`FkK)#QCy2 z7X5bY;31ek4E|@rr9pY^IGhcE{0xZ9iGPXhQnj~5cOx;OlvYT+VQ`L}#$L#C2uJ_SIPg&Hj^1$H9j^x7Nd3KMa{ZM4Y zxzGGT&1zq)E&meZMC8LHWmvjV+(604o9+AkmG$P&#!j8&Jv@(*qc2$ zP*Yv7vZ)@ZHHbd^mx`^I@4xe-$7g^H{c z=W|Q>I2B@q#ab{N`|WkLmW%XxSD<+_rfV`5269q~G<%ymi5czPiHjzIYtmPojP*Jd ztRJ2ER%gwhwwHuY1n92yioStKB@XIT9xt-uB#szJ4Mb{eEjNA zB$Qm2N|lq#8~Syd4nfh=FL6w7R1A&nVoetpp?8-m8K%JL)4ZR(Ps?gZk^lUo02Va* zWLCF3)RPnKon2GpQelP_+AmlRK776DH*mnQ^u2|3eu_t}Qi}(n5UEAm$i^2$g6kXc z(0!+1S%c?`p1)j|Nh^<4kJ{~QiH@~=Fa(;=$1+-5kCX$jlRG4&9;@+|D%Y}lM=e~< z^tfL>$%jKesEk{{^SKSViRvNwr7~8*dFs0m`*sX5Z5z5q0 zENY&?W5(eHvRCY3&h(#+a@stuwT`{68f{hF%GExdrV2$7^m=uzS8!V-n0e}bH>s+A z@RRK%BP`}~OK)8(h6*k(-^1ica=~-1bITkj)v5ktch_0|Go5U4J8_HdlLkf^igT^K z?#g~Cv#n~atd_cM^Uf_9Mqar|6YbX;U=8=MYV6nx$QUik{^MqEC-K`eTgpLIH2)&m ztl%~xi6c#gm$)JLoDxx(5|2TbG3eF$*SR8XM_c@brl^h}CTBnAH*>EhN`zb}aJClJ_nSR_6%hJG9GvZU4tB{QUYQzTszD_&gnmh_KM)^+FC zLA&YQS?p+ZF~%g5``ju+S1)@-dlpCDt ziJ^5%q=`V=d^e>_hf)pb-2UTn>qvuKG_p2a>FV4v>=vIg`OB?9}oS`H9=Z{8sS4{|cPRHfq z$~PIK6KL5^$LMwyX3LJmQl&P+A78^okoht}k8sK;^vg?Mz``gCB^lpNUy?dK8*VoG zrJ|A03z} z_dV?}x@H4{EU(0uITbl8ImpZsA9UeZ1NQW8>xK`USKhMNmL${|mHZu=VjmEAJMPQT z7aJRRn#Zm5r*tva*ZEQGo)N?Su8?oo#``GqEClD@mP zugX%O@`fefpdZhl!P|ON#y} z?|0Yu(4^FdijqpNeb!BA^(Oo}Uq zq-le~_{{aK*6bk{x-FOl{f1*RS-J>eXHWyOuCo4RxGGXQ>eA4HgUODEM+NGR0fobB z1V`~;PJD|EhdzIZ>-9XR-hnHXe6zdFr*b!iScI0LzPhkqtKx%<1646!kmn1Lk?r4# z)jQc1&RR?qgcx$UIn-5sY!6cs0Y)0o6_&>C(VUPJEBy6T={dI;%8ry32~ro|@MxT= z=HrloO2f0Ck;oop=>l()f2ePwoLz4Oj)(HrwnnW5rfU8mf0r869Wi)0F4Z({zH&+9 z9E!uN)nd`gaxE&sQGeHbzw+#jZ3AA8@eGVZ*DIyF^q?P^7D(Pg=>`lfahI?aVbB(E zhnwusI_S)KeXL_^#>@Gz$)Lo5jC~-;P7C?XNnLnUBZ)=X@um<{XHr=@)9%yi&*4{b zPy|m^YfFMQiRq$@fIH?HuJo0Op>C>~GTrr^B=nYw7 zs-$Vq-ZS##{#~DkCxOQU(&xmJd@|#9;%D~OD^B4?G|oXpBZjA(+C7gP9IYEMxgeO* zt?on9g(6u`cT_q)YCP5R7_HEq=T%)0j;9F;ldk%J9$@EYCvmCp z1*MT)TGDu-*Vr4aB4LxX#j+)7IjZY&-6bK*9Elmsn?9uez+_77`r@9~q>JrSK?aH4 zalR2HTe~@9I%}1_3g%wp#k^M)3#gGPbXnGzn~eXY3{mtZB&0~m$ZX(id@@OZ++^l< zc8;1Hx0sHb4(qRmihU<{=Gn*QN@OjFS%mQ}fvynV35lN#mR^NP0a`^;2Nc~FHtQh7 zsG=$&xB^Y+{E&hMGBfwwc9pk`P8i1`G%;&Zi@SH*MEI zF3s0Vg_q(<#CTVOq1n+v#Xm3B7PW`LRnZH!+Sh(8O*?!0Mrwu00B|e;nl6W?HWz9Qp;~O&5pG6X|J?2&ZL$TxOglg#CYue|c^6MK`>mZMv;&v+Jw`9m}RNi31 z1*BW*xY2$#3YDzIwyuTKk-x)47?trweAD z(iItIsiji~70;mGj6@V;?O{|U2US7Usm9PI`cK%dT<}V0rY$hkYLYfdf_D?tl;;q- z&k8er9Tc+!)!JArQ9gc!$T!)kyq$k`x^n&OlJblANCH71CEJu=UN`4vT=+^HICAj| z5`0uxi2)1xQxbsRZeP<45iyUwt*ZJ9Pg{HC_XFctdB}%Z?=F>xbfp*O#PgG>1}9y! zGj}F()II4aRDYL`eVqHdP+g6v|4U-5lEmoNL-t@-&JM@iRs*h`c^!gr6FgmiiWJva z*<*9l3jJ^ZNt6k@(WB>N+GP&x5FUuKBUF6+(A0GKLch}F!x9fMO!dqP5Urm1URk#D-$6CIcW-nAq^v}vpd@bPF1RqRY2{fQ&u}MKB>LA73 zs2|X9nO+Y2#xEE9b>^C38&7u6c6##~jJY{zfb3m{^^TZ)Cz4}hWcC4M!_cF-3h%LM z$+P;$0bv{4c&NB%c0b<1f;Yw5`<=qkItL(*rw?G1t_k=t46k?}Ierq5iKNH%ZrP(M zPZWuc~KR$JL{c_reUH0JHFlhQmF9?#I(&~%!>TBw5-^90}hwo}wR-=^TM zYjQ-!dTR_;!t4-_4VtmY+V-3nF}f?MLKB zQr!@4L!2h2rw=(H*D<#>5sqFmlqc?NSoTUI3qwewFu%Xmg_%{50JPi7usU8gciu-S zI!43Iup+GmmEdR-!H|yZDon(e*hCq@(ds81)b!l1De%qfVmbIrFxciWx@Nw)Zj+YM zHH`3!rVo#K@vq@k%oZ-7Nc0M?OH z00v5!H|!>p#QHw%?v?-r@&gu)#o6g*Cwsyw znnU_iXd4?bA_~_ZG2YnI8qE${XCM)@JueixqWAgI_T^vE*bqH-Y7@T^w zo1vZh%}Mr9D+JTMzfnyz|4UAUuJk&c_=G*-8$`pL462=-GXD{Ua~4vw1lHU^U~ioY z5BXUNg%L(-SmHe_vY!Gnog-_lV#QuZU`X(@Fb7P6Kg&8UMYf>9__$4v{ZAN2cby)mO?4_>#Cb+XTj=2KQH4q~cSW~8wHayCF{!RS@6&+8bIwOog<=C$40az^dD?xZ zdS8=7$1a*-^%$%Xlqe%xJ|T()Y#Qiocob2q>JHpUB^`=*Xc5=w#C(gJrlUcuJ;PAG z1DqJ59ik;PICGp#aZzTNSQh6Kc8&Be2f#1?V3h!$ShPxupJuY(+ws~X>baOQHL@^lbMf)G^<2Y7j;+ z(2$uCB0KtGPx(Di5*B=IXXMh{|GWs}8KNHr2G-S`6hNTQC0=>K326x(Y4s072i`c^ z4N(|r{8pzZv3{NS!fvQE=#o*!NkW7Ie+))P0d=;Q`HpA4UxK@ih`*Yw6GkNUBLMMr zI&U@khB^EV8?+qs8OHcz9>=LZai(z2K_QGX7*R;%+BH5t9+v9N_>IS)OZ?yY ztK_6i43ximQrT0uvgYI5Z8|7UfaN|XdP+_XOa@g~ zmYn(qQGfPg=YD_Y?2wY4)0>TgL?x_$WRyAW_7qy_{a}AYL>PZt4!_A)nv2N~w9rIS zi!5Sde3eh}i9Q><_B0p<_q#i7!S}Ch)Fi@%7IF8S5!rHZ1y*QYUP)L_DpC`hY*|iD L4w@8rH~;?upsUpD literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/Matrix-thumb.svg b/extensions/fablabchemnitz/boxes.py/Matrix-thumb.svg new file mode 100644 index 0000000..6fcbcda --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Matrix-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/NemaPattern-thumb.svg b/extensions/fablabchemnitz/boxes.py/NemaPattern-thumb.svg new file mode 100644 index 0000000..feee504 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/NemaPattern-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/NightLightBox-thumb.jpg b/extensions/fablabchemnitz/boxes.py/NightLightBox-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..633d7a425ac5143a57152120424bd7c0c6e0ad45 GIT binary patch literal 8679 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 P3T&dazlVKyJ@ diff --git a/extensions/fablabchemnitz/boxes.py/NotesHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/NotesHolder-thumb.svg new file mode 100644 index 0000000..f4078a8 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/NotesHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/OpenBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/OpenBox-thumb.svg new file mode 100644 index 0000000..973ca1e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/OpenBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/OttoBody-thumb.svg b/extensions/fablabchemnitz/boxes.py/OttoBody-thumb.svg new file mode 100644 index 0000000..ddc3394 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/OttoBody-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/OttoLegs-thumb.svg b/extensions/fablabchemnitz/boxes.py/OttoLegs-thumb.svg new file mode 100644 index 0000000..9302a8e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/OttoLegs-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/OttoSoles-thumb.svg b/extensions/fablabchemnitz/boxes.py/OttoSoles-thumb.svg new file mode 100644 index 0000000..8a94289 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/OttoSoles-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/PaintStorage-thumb.svg b/extensions/fablabchemnitz/boxes.py/PaintStorage-thumb.svg new file mode 100644 index 0000000..8e1177b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/PaintStorage-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/PaperBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/PaperBox-thumb.svg new file mode 100644 index 0000000..7aaced0 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/PaperBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/PhoneHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/PhoneHolder-thumb.svg new file mode 100644 index 0000000..e28f07d --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/PhoneHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/PhotoFrame-thumb.jpg b/extensions/fablabchemnitz/boxes.py/PhotoFrame-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8da2cf53e8a347f49495eb7e97406c12802eb8a9 GIT binary patch literal 9279 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 W#imA9B#3f@kj#FnROiR%mHz_)gFa9I literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/PhotoFrame-thumb.svg b/extensions/fablabchemnitz/boxes.py/PhotoFrame-thumb.svg new file mode 100644 index 0000000..d30d92d --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/PhotoFrame-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/PirateChest-thumb.svg b/extensions/fablabchemnitz/boxes.py/PirateChest-thumb.svg new file mode 100644 index 0000000..af88c1f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/PirateChest-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/PizzaShovel-thumb.svg b/extensions/fablabchemnitz/boxes.py/PizzaShovel-thumb.svg new file mode 100644 index 0000000..4216763 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/PizzaShovel-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Platonic-Icosahedron-thumb.svg b/extensions/fablabchemnitz/boxes.py/Platonic-Icosahedron-thumb.svg new file mode 100644 index 0000000..50cc091 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Platonic-Icosahedron-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Platonic-thumb.svg b/extensions/fablabchemnitz/boxes.py/Platonic-thumb.svg new file mode 100644 index 0000000..33397b7 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Platonic-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Rack19Box-thumb.svg b/extensions/fablabchemnitz/boxes.py/Rack19Box-thumb.svg new file mode 100644 index 0000000..e972709 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Rack19Box-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RackBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/RackBox-thumb.svg new file mode 100644 index 0000000..76bc7e8 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RackBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RectangularWall-thumb.svg b/extensions/fablabchemnitz/boxes.py/RectangularWall-thumb.svg new file mode 100644 index 0000000..d42f69c --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RectangularWall-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RegularBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/RegularBox-thumb.svg new file mode 100644 index 0000000..04fb3fc --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RegularBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RegularStarBox-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/RegularStarBox-2-thumb.svg new file mode 100644 index 0000000..e977a10 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RegularStarBox-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RegularStarBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/RegularStarBox-thumb.svg new file mode 100644 index 0000000..8d300bf --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RegularStarBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RobotArm-thumb.svg b/extensions/fablabchemnitz/boxes.py/RobotArm-thumb.svg new file mode 100644 index 0000000..97978a2 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RobotArm-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RollHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/RollHolder-thumb.svg new file mode 100644 index 0000000..dc63285 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RollHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Rotary-thumb.svg b/extensions/fablabchemnitz/boxes.py/Rotary-thumb.svg new file mode 100644 index 0000000..ecbdbcc --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Rotary-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RoundedBox-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/RoundedBox-2-thumb.svg new file mode 100644 index 0000000..161eca9 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RoundedBox-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RoundedBox-3-thumb.svg b/extensions/fablabchemnitz/boxes.py/RoundedBox-3-thumb.svg new file mode 100644 index 0000000..cd4e414 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RoundedBox-3-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RoundedBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/RoundedBox-thumb.svg new file mode 100644 index 0000000..bb0635e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RoundedBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RoundedRegularBox-thumb.jpg b/extensions/fablabchemnitz/boxes.py/RoundedRegularBox-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d8443eeffa3f05d450a0a13c535296f3f08c2fc GIT binary patch literal 10236 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 M diff --git a/extensions/fablabchemnitz/boxes.py/RoundedRegularBox2-thumb.jpg b/extensions/fablabchemnitz/boxes.py/RoundedRegularBox2-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a00c5bfbf0f38de8921e1aaab0b6b3538874d238 GIT binary patch literal 12185 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 diff --git a/extensions/fablabchemnitz/boxes.py/RoyalGame-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/RoyalGame-2-thumb.svg new file mode 100644 index 0000000..ca8a6b2 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RoyalGame-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RoyalGame-3-thumb.svg b/extensions/fablabchemnitz/boxes.py/RoyalGame-3-thumb.svg new file mode 100644 index 0000000..259eb38 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RoyalGame-3-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/RoyalGame-thumb.svg b/extensions/fablabchemnitz/boxes.py/RoyalGame-thumb.svg new file mode 100644 index 0000000..f91a54b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/RoyalGame-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SBCMicroRack-thumb.svg b/extensions/fablabchemnitz/boxes.py/SBCMicroRack-thumb.svg new file mode 100644 index 0000000..390f427 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SBCMicroRack-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SevenSegmentClock-thumb.jpg b/extensions/fablabchemnitz/boxes.py/SevenSegmentClock-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de5224306530ee594398b5d762dc324777a56a66 GIT binary patch literal 7485 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 PD=VLZOatS>#lrsp?lX*@ literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/SevenSegmentClock-thumb.svg b/extensions/fablabchemnitz/boxes.py/SevenSegmentClock-thumb.svg new file mode 100644 index 0000000..c01b60b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SevenSegmentClock-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SevenSegmentPattern-thumb.svg b/extensions/fablabchemnitz/boxes.py/SevenSegmentPattern-thumb.svg new file mode 100644 index 0000000..9d73e79 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SevenSegmentPattern-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Shadowbox-backlit-thumb.svg b/extensions/fablabchemnitz/boxes.py/Shadowbox-backlit-thumb.svg new file mode 100644 index 0000000..f938ce8 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Shadowbox-backlit-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Shadowbox-diagram-thumb.svg b/extensions/fablabchemnitz/boxes.py/Shadowbox-diagram-thumb.svg new file mode 100644 index 0000000..d933084 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Shadowbox-diagram-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Shadowbox-thumb.svg b/extensions/fablabchemnitz/boxes.py/Shadowbox-thumb.svg new file mode 100644 index 0000000..f37783c --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Shadowbox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Shoe-thumb.svg b/extensions/fablabchemnitz/boxes.py/Shoe-thumb.svg new file mode 100644 index 0000000..7e7c336 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Shoe-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ShutterBox-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/ShutterBox-2-thumb.svg new file mode 100644 index 0000000..8fb390f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ShutterBox-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ShutterBox-3-thumb.svg b/extensions/fablabchemnitz/boxes.py/ShutterBox-3-thumb.svg new file mode 100644 index 0000000..8efae51 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ShutterBox-3-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ShutterBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/ShutterBox-thumb.svg new file mode 100644 index 0000000..ba4a7ae --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ShutterBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SideDoorHousing-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/SideDoorHousing-2-thumb.svg new file mode 100644 index 0000000..aa476a1 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SideDoorHousing-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SideDoorHousing-thumb.svg b/extensions/fablabchemnitz/boxes.py/SideDoorHousing-thumb.svg new file mode 100644 index 0000000..a89d2ac --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SideDoorHousing-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SideHingeBox-thumb.jpg b/extensions/fablabchemnitz/boxes.py/SideHingeBox-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d5a1921c47feab74d4d9bf4d594d604968eb391 GIT binary patch literal 6835 zcmb7mWmptk)a?um-5mqcDc#*AAWBFh-Q6IKNar8}Ga?-lBHc=N4j~Lk4c(=r$j5u{ z^WFb<{W(9@IqTVH?S1yykBg7%0AfwG7is_?5b%HTxC~GRV1h6(F+iA@7?@aCnAo_) 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 literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/SideHingeBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/SideHingeBox-thumb.svg new file mode 100644 index 0000000..d870bbe --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SideHingeBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Silverware-thumb.svg b/extensions/fablabchemnitz/boxes.py/Silverware-thumb.svg new file mode 100644 index 0000000..5125ba4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Silverware-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SkadisBoard-thumb.svg b/extensions/fablabchemnitz/boxes.py/SkadisBoard-thumb.svg new file mode 100644 index 0000000..23c5f4f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SkadisBoard-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SlantedTray-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/SlantedTray-2-thumb.svg new file mode 100644 index 0000000..1efb764 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SlantedTray-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SlantedTray-thumb.svg b/extensions/fablabchemnitz/boxes.py/SlantedTray-thumb.svg new file mode 100644 index 0000000..a47fc8f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SlantedTray-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SlidingDrawer-thumb.svg b/extensions/fablabchemnitz/boxes.py/SlidingDrawer-thumb.svg new file mode 100644 index 0000000..92da54f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SlidingDrawer-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SlidingLidBox-2-thumb.jpg b/extensions/fablabchemnitz/boxes.py/SlidingLidBox-2-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2238fdcccd223e546d4abe0e535367e1a9ac0c2b GIT binary patch literal 6524 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 literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/SlidingLidBox-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/SlidingLidBox-2-thumb.svg new file mode 100644 index 0000000..cb6ab66 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SlidingLidBox-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SlidingLidBox-thumb.jpg b/extensions/fablabchemnitz/boxes.py/SlidingLidBox-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01ee9ea7d95e0366b70a4931944bf2782fc132eb GIT binary patch literal 6997 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 A8vp diff --git a/extensions/fablabchemnitz/boxes.py/SmallPartsTray-thumb.svg b/extensions/fablabchemnitz/boxes.py/SmallPartsTray-thumb.svg new file mode 100644 index 0000000..331dc36 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SmallPartsTray-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SmallPartsTray2-thumb.svg b/extensions/fablabchemnitz/boxes.py/SmallPartsTray2-thumb.svg new file mode 100644 index 0000000..d9a40d4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SmallPartsTray2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/SpicesRack-thumb.svg b/extensions/fablabchemnitz/boxes.py/SpicesRack-thumb.svg new file mode 100644 index 0000000..2310b6b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/SpicesRack-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Spool-thumb.svg b/extensions/fablabchemnitz/boxes.py/Spool-thumb.svg new file mode 100644 index 0000000..c83fdcf --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Spool-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Stachel-thumb.svg b/extensions/fablabchemnitz/boxes.py/Stachel-thumb.svg new file mode 100644 index 0000000..8fec4f4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Stachel-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/StackableBin-thumb.jpg b/extensions/fablabchemnitz/boxes.py/StackableBin-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45f06e7fd4e4b503c12f9abacbdd61b0220698dc GIT binary patch literal 3976 zcmbV~c{r4P+sCgl!!T)~F-eN-OM@{pCX=PIlgSpc6=pDGn=u(wirX$SBB6vB$|yCG zCFQo0C9;GRB1^VHmhg=Gxu2f*c#h|f_kFMHIFIXl{jT$O{?5<$I=B0`KLh)W^^Noa z5C{ZZPXMTw)1<1rXK7X4q>c6tCk@CXR-!z(NMP?emCzAhvs zS6^>sy0f1$N=Zc-(9ov)IlFq10>oWN?qnZL+4;)Xvf^Z-rmPLtRK?U!hvY#v45pAQ zg9%oy!CtQFL|JXE-7pP0p6>1EO$u-pr+Z)Wq2lS95`R_4bM(%#vV@ifh3JO2(AEDt zgY%{-@pmtQfq_baXeD2YyD~~$U0qp4RasRP$;m)cgM0#<=|~@{m$BX(AmY87N99XqmhYtH)l7j3z3LLx;UeWNEC|bjC3ZVQAi>hO~heQ$5q`>E)xH0 z(A)3#@&DBd&UqXpybgur96-|Lgw~GDNR{JARg~4gY*tc5sc0zwN1lfAPGkS0QLTTj zaM(HOw^KW|{dSw=!?8G!$Ea!67Xfe=3?E-51`uONR=45@;YQ<0XFm)j`fcLPYNW zd~Lr01bBfPKo}S#0dNU`zyhG{IzWswt=ycM-Wlt^FAx`)(=U{l54MYwP`VG`0)fF? z5HL44gfrZrtDNruM1WiHDC!i?esgE2gg;#MMp8Df{H`u?q1^|9Ai1YKn z0)RHK1Tnsi)D>MR1iy!CAf@7y8agBua^h2E0V|x1|G;Td=B?{v;%-lAvo6Eabv2jH z$36X+lmNw|3x$y;5jb3SnQKA+C(~orfqtgPY<~!dBF-!|O)IPne78Sjv@|bb=XE*0 z`oist710d-nEpgRzn~?d-l5f>gwkHj%&v@(w5_2n2deXBMIvzMK0Y>`mW!!O!K=o7 z$A4sd=U>eScUfsKC}^y17-rq`ej8uZIGgJ&m#RI_{Oa&J8k><)fg=Ba=n5YL)U|KA zTNIHWKbz`KF(3vEl2HyFVYIb*mXG)H9o_2E+r{72_*}JVjlQl4qZRO~(o|oW6VXnN zl`j;-`j;E?tlSH}v%iqnpE{w=5MNH$YhH_6d?BC_P z`+|e_r!UOAY*BY8wz=_#e({O;KF8vRfq2a!G=JUVt)a1m<<>W`M^9!Jn1R|Uicvyd z`Inum5jvH!5F6|wqM5ny!=a{b#ixwdz&v5^Bz4t>;JWs5G$z|VBS`!%g>h8>f|>qq zs=mXsGn0&p5~|^Q{oLI1pN<}Kk8!xspVahgkDg7{EBg0+U$y~-@vVbHRl!c#xr7fH zgqOscttr{{NbQ?GZ3l-;6*^K)h4dASzeO1aGQ5%{5z^~f4_Kz921Zd|GZW_Rs;#-H zKRhqJBj`32*|&!0dIdW@JD$LIrLbdD^%|eHPPpT)h7fBf7HOqbe)b_y6m7K;(tG<6 zrP(m1HXV870YTru*tytuq~XyzGXfb=vkjQAWxD)==Lp*7;j4Z6J#$PNwa&A>))a?9 z<z{j z1C*dNiIm#A_kLL2rgr^+N*1x$m6-*l<2(Irc_0Y6kmRy1^JdRuB z8Xm=d$J{jUPdFJZko6{=R@m+zpHmffdkoR-u9v4Tl)nvJ>CJ!VfX#|2)l(I|f-Gz< zFWcQ>7CMRb-4YZNYzd`~Sf342I=OYx24CAVyP8Y3W)4jgjSG*_uJ=`=@61h!TvFc# z?lb1LOwA8n5Ft>yCs#gi0|Dw=k!;(b<&q2**z!-D*at23@@KAbSFM$?ni^lGp*=yr z6yMoZ1tWJkW;u0hb+hbBzo=f#ksEu_&b2HR?;Jv%ajI%-#LkS&HziL7rNyZaOCGtK zez35-I2`oe60HZEeqwC*z?$jyR86!o+@a!={ne6L{uU)6NTjOY>HFJ&@nowFHYDHH z^Mc240g*oN@rzCrEI7VTO&X~b;JlvNH;_NX#h^E`C@(G#ew`UEaHKD?#%-m$lp;C?_<3Z;0$U6fm&LCgEIw!YI?6J;8QC%rSsFB&5eHdV zj++?Rj2e6xui?)vJdAE2jQYq3P^^lszs{zh#36zX1yyzhH|$KBF%xmh-k@%i`Dq=$kgsxgfHhoqs#q!Rm)CJO8M7z@7h4M9nv2CC?uT`nGWSZwBR5U&8{EI3Num
{uno-gF@GuCH@)!Zi;5RHl8m+CbAsQ1 zM{^BOrg85*S=qvSMwG)m8F@7qf1G)oad&Z|iD1-tQWIGEiS>VEP!Lo6o?&gE7#K+O zHX?YQI&<3GBvy_qEcPl)zQ1U9Q*@CYVj!Zei#s5F_^kXrLU$()LKE$sfi*{XC!1C6 zyCv&po#tMBT>I9hVwS){hWQY!&I{t-B9wSr?bn0kvZ+rGem!ol#-!!HV;ANSldg5& zY@sHx`vDHy)fiHBH(H?j*)k`1G44qWTS|L9} zl3NPL<)eW=NGFAXa|aO>^M#16dJhBH8Ow+^J>eQ{yAt8-u>H-$d3-0%nmdgzpe^^) zovtFEN_S6)@3p$}EUP1M+({v<;!~subH(81EcgX-nOlt!>@ywpL-?2Hl*w>O3f&23 z(8(W^FA@TC7V4r1q@xJ+a&TbCoKO!3ogz16J~i0}G(K&uF|XdY+y;(uR56uOX??OR zR?}jd7&_ckaG2W3|9Ok~owW@-I}~OK+og z%-7Do)pq`y5>jSDeas_cQh&D^YNnS7zONW__}JPTsnjXyhhzKgnmS+pw2WmTX`zDb zG3PP$4_dbKx#!=H-K>oi%MTTq(0cpbP(bKj2LNJ(!e(DBqwQ^(2h`Vl3T7U5X&qjT zGgs*B*Q|11o!gtLE!i>U*c-QSUCz1}E7(|dxi#?@eH)07H-b$aG0S0JVtd<|pYvAe z3X-|`M^Z&GaFL?r6ZUGxWWoAI-si!o#b)s>_1E-JC+LVB?v7foCxjt&<;o*`)`Mv; ztq{)}?4B6*6zP8Zf%52DKUYhsAgGr>Q`1ZvK~EEi#x2|eRHWaLe5Fv%#`CDQ@@nl0Q?HJ(UGa-Ng;WA7fdruHT)HX zbi(TReb)4YejaC8TsCa6zt>hjv`^GT;xTR4`>a})dqC1)UWT2?Xlkq`*kSP;i-D-F7D$}S9?WXZ z>do&YhMPaP@6p}B4CTy@NBXC31F-LkiTr0T$LEY!Q*Z|kCE6`@?7{V8GVG@`oo$+dfuD7i{;6M1|`=TrPAw@Uuvr9mLA;synrA z-O}oE$d{TK**Nf|h6weXJjPbM+w`aR1xrVntdahsHEHv{U2)F>48+{?ThSmmaZBjk z)bQbJyKB9VgjGaeOpxZnz%(O_xp~j9+?j)et}guR>6K^T(~lWS9&K diff --git a/extensions/fablabchemnitz/boxes.py/StorageRack-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/StorageRack-2-thumb.svg new file mode 100644 index 0000000..a05546e --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/StorageRack-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/StorageRack-3-thumb.svg b/extensions/fablabchemnitz/boxes.py/StorageRack-3-thumb.svg new file mode 100644 index 0000000..e50e556 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/StorageRack-3-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/StorageRack-thumb.svg b/extensions/fablabchemnitz/boxes.py/StorageRack-thumb.svg new file mode 100644 index 0000000..7ce7a8b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/StorageRack-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/StorageShelf-thumb.svg b/extensions/fablabchemnitz/boxes.py/StorageShelf-thumb.svg new file mode 100644 index 0000000..7085a6f --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/StorageShelf-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/Tetris-thumb.svg b/extensions/fablabchemnitz/boxes.py/Tetris-thumb.svg new file mode 100644 index 0000000..59847e1 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/Tetris-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/TrafficLight-thumb.svg b/extensions/fablabchemnitz/boxes.py/TrafficLight-thumb.svg new file mode 100644 index 0000000..819591b --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/TrafficLight-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/TrayInsert-2-thumb.svg b/extensions/fablabchemnitz/boxes.py/TrayInsert-2-thumb.svg new file mode 100644 index 0000000..60a5999 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/TrayInsert-2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/TrayInsert-thumb.svg b/extensions/fablabchemnitz/boxes.py/TrayInsert-thumb.svg new file mode 100644 index 0000000..f067406 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/TrayInsert-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/TrayLayout-thumb.svg b/extensions/fablabchemnitz/boxes.py/TrayLayout-thumb.svg new file mode 100644 index 0000000..a6cb9e2 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/TrayLayout-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/TrayLayout2-thumb.svg b/extensions/fablabchemnitz/boxes.py/TrayLayout2-thumb.svg new file mode 100644 index 0000000..5b429a7 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/TrayLayout2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/TwoPiece-thumb.svg b/extensions/fablabchemnitz/boxes.py/TwoPiece-thumb.svg new file mode 100644 index 0000000..945030a --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/TwoPiece-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/TwoPiece2-thumb.svg b/extensions/fablabchemnitz/boxes.py/TwoPiece2-thumb.svg new file mode 100644 index 0000000..4e142ab --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/TwoPiece2-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/TypeTray-thumb.svg b/extensions/fablabchemnitz/boxes.py/TypeTray-thumb.svg new file mode 100644 index 0000000..b348109 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/TypeTray-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/UBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/UBox-thumb.svg new file mode 100644 index 0000000..032be4d --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/UBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/UnevenHeightBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/UnevenHeightBox-thumb.svg new file mode 100644 index 0000000..d2dd4dc --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/UnevenHeightBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/UniversalBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/UniversalBox-thumb.svg new file mode 100644 index 0000000..c382a8a --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/UniversalBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallCaliper-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallCaliper-thumb.svg new file mode 100644 index 0000000..b7d0e95 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallCaliper-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallChiselHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallChiselHolder-thumb.svg new file mode 100644 index 0000000..9c3d1a6 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallChiselHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallConsole-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallConsole-thumb.svg new file mode 100644 index 0000000..f4feaa3 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallConsole-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallDrillBox-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallDrillBox-thumb.svg new file mode 100644 index 0000000..fde00c4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallDrillBox-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallHopper-thumb.jpg b/extensions/fablabchemnitz/boxes.py/WallHopper-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..303537f6067cd14618147fc205bbd9c142eb4111 GIT binary patch literal 14855 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 literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/WallHopper-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallHopper-thumb.svg new file mode 100644 index 0000000..4bc51ad --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallHopper-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallPinRow-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallPinRow-thumb.svg new file mode 100644 index 0000000..1869856 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallPinRow-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallPlaneHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallPlaneHolder-thumb.svg new file mode 100644 index 0000000..90526a6 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallPlaneHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallPliersHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallPliersHolder-thumb.svg new file mode 100644 index 0000000..afdb6dd --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallPliersHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallRack-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallRack-thumb.svg new file mode 100644 index 0000000..51db15c --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallRack-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallRollHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallRollHolder-thumb.svg new file mode 100644 index 0000000..2a9cd92 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallRollHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallSlottedHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallSlottedHolder-thumb.svg new file mode 100644 index 0000000..eafd41d --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallSlottedHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallStackableBin-thumb.jpg b/extensions/fablabchemnitz/boxes.py/WallStackableBin-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a10d18086e91b87aff0587dc9b2c77badfb30db0 GIT binary patch literal 7869 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 fs$&eG;FuQmer9I diff --git a/extensions/fablabchemnitz/boxes.py/WallStairs-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallStairs-thumb.svg new file mode 100644 index 0000000..17121cd --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallStairs-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallTypeTray-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallTypeTray-thumb.svg new file mode 100644 index 0000000..5649063 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallTypeTray-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WallWrenchHolder-thumb.svg b/extensions/fablabchemnitz/boxes.py/WallWrenchHolder-thumb.svg new file mode 100644 index 0000000..c268092 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WallWrenchHolder-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/WineRack-thumb.svg b/extensions/fablabchemnitz/boxes.py/WineRack-thumb.svg new file mode 100644 index 0000000..0723218 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/WineRack-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ZBeam-flanged-ubeam-thumb.jpg b/extensions/fablabchemnitz/boxes.py/ZBeam-flanged-ubeam-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12f36be8de2f5966ebe78b147ac534fa698cf09f GIT binary patch literal 6260 zcmb8SWmFX27d1S?Q2yuv1cs9C4uK&?K{`dcg^`?rA*4$X5O4tL6i~XPV*o*7DCv++ z=}r-ZhyPmddY{kFzW38T`|fqlUhAB-&i$|Z6#%)qvYIjg2m}Ct4+n5R4^RZ)fwsasKoDMBeTFd- z&=0&b*pre9!6yJUE&%Y8uEl}?_2n1x=CKjwH`W0`o^Z^;u2_$)+4Q0Y^yTE=Jo_oT zj(7obLR#1pc?VpI3)mBKLVzwI1ONy2cq_ovjcGa%G zjy9UJeYtByL`^atdY+o$gCy@idBG-Dr8mT^Da1Q8?M)J6C;&-AG1eT5s(T0+Vl|zN z<+k)RSKB+ss#cB^tGvF)^`px-H;(VlQM)ZN(U1>3dp4hP^2H*td_?BUx`z9jrcX&d zyQjVQf_QV4#C4(hxcGW{xl{xau#g`>KxnxB`4pHKmn;DWh-#~!D|3}d7@ONEC@YCy zE&tdoUzB@jC|U1FpIYGPJX}U{8P{o1au3jrrduiaSWuBLA@jCfa_=}^f~(o998^duU-4HkLV>m6D3VVo z#?QmjW~fhqU5Z>eoZ@}mILlAU_=ul4&#Am#5CV&EAAw+i(CyITyjQ}xKHJ5M4K!Ud z2OdL-=8oGXX$Rw@iktGW8_?vU%>Gz&=afUT#~#X;dr=0Vuwu96I#KaO9yC2h>Ua?1UOZ%`sMfSC@<~-bNx`$Nps8F=0pCtM8IfH z3`tFtgPF-%MXmjtOKFY0GIvmk<4M{*V8aK5Hdj9{EU>DmMd!evJW*^A z8@Pd^9pqdR{d)346za5l`s{J`Ah^v^IRy434-f)`0ef`EU`h`S)3MWo`%Q7PZ+Z(j z43Zj||D2yF6QM`%9hi0O*XdT<(~1O7s+-;eoPw;~7`kkq?Ch0p=%gmj`Ml*>UBB=` zWX%#;yo=X2EnY9Ay;{OQNAIKx_?x;yYu%G7*bH1yhZEiAur3{9SFkUxJvk!91QcdG zZGVbUQgn%UV(G1%wk#76V)TxR01`>_t@UZd2_)%*mhcrciR!gQ=Vn`lpqup)+lGXE z^nv&WK@ZVl@2Y{mLyd+&WkRKBi(!iFdeM_$?MJ(9718xki_IzZ9&>NJELrd(rUJfO zE!WYjXlN;qFaBDi_;@Uqbv*2!ZAd3zTvcI*H8Z`tj8rcyC=6G%E^rabz8QZkOtR+F zbaBCF)jqFB!6=JqIQ?+h{^#T#un5Gi-N-k)eq`Mld9WFH0Vm3~65H-)ni z0_&Ut!~-j%Adgrh)M7Fz8Ce{bSSq+cCEL)FruR|lJKz5}R=a*T*SwhaJrpOt-LxSV z@ZRNGV+=L5)OP&plsM?$(@E2Cz#vEB{L7hLLaX8)pqdMJh;R8RSUCm>Fiv)|xt6OiPZMIiKMB;VbQBi(6pTC;N`d`mLU+ zPQ7Lp3qtS-*SyAgLYRlg9g-8K^ipZ`g*dV2T9{p!jpRF(m#(vA^9P@A-K^P$j&iId zR;71_i;CI;{D+(Th`K70%4TC=?;29xW#n~%Ym!|1x$ac5V$n2in{HApMni^b}mhTxN_h$`t%kTXI>*u~$ z7L9SZjQv%7l;oL25-VRQ<4ws;2lCnq<%%CEHlwN+(O()H)MvL6_{WE&@m!+0@#>Sm z2Y8iMHR{K6mss$i0HlJlYQvt)2H{)RUdEFn&a_VvOWqU{Uvwv;xw}0_qfE!*d^XTq z@upKBB?}C9z?Ad>v%o)1pIiD##zo_$^Omlq1VJ)?3(u7hku65o;uqi-PgoL~d%9A9 zn=iSN)284XMbLm$$`gjFuV|LjUB7(1mpIYX;hfE5P0~fUZoE8CWOB*vFP&|L%uLwk z?eYRnYS+_lsv8?lCgf6+PbZkCgj{@F6L%t2j_(0KD)PRx^thMt*Gdvt%j9$RT?O|< zN?qJkFtf=atc-tuU;i^x(N+|h$CHbrAef(bno11E>My(>E_Y%y7!vLR1r(>*F`&Ao z?g5`UQfFy^;{)S#+2aa4*hL!kjRI)cP(o(NJ9;$NMEYSVZ`^XCW@2V?sq z&Wd6*3%&c*ci8kjz)t%M0{nZ8F`{A2#7HOb9Xc9pD*+-4x)bjr{d!J21*iJnSUwfL zf!&jgk)}?C7Yo%<(_pgKY6=_5e7_lJ{CUIh39=$~Vw(bEkg&WutTf7fd<#bbm$ucQXfxHu3oS!W2-$c`z!NicD<)w_5x2c{*Ah$s`TbroHsN7>U=%@)k*vBF34v0 zXJ%D>%RHq3KJAJ_$H&-3eyqTfMi>SehzX>A-E!?`|3WH=IL-%@h=2IJJZeydXprvr zw`>iM5~Dd1PQ)u0N0~#Z8dz@(dDte};`s&@L161WQj<(XN@ zrkCxeVEuJaDng#8tdhWe`p=+P+r%PjrX6~|G8>K6C-ja9wKfp5J$SW^Wy&wxJdbw#V3J zmOqz4p=R<5ajGiJsC_UYC{4f|ekpTqezV@r^KW&$(De6uiDIo8nMcEd^ViG1S!Cd= zxX_li8#H?z4HGV@B9Cuu78cIq;{Rc1thgffokFkwV4MZnMCxHemxK{tHgyi#@sLtQ zO@(~Pe`{w*_B!J}J6;2|qe8K>tjTonC+wr^tSWLYN1Ub+9Ra3{Jky?^f- zd09q+v1joY7*$bcM|s8}YgBbu&nltBLPVA`*|W8pURX$(5T0}i(~XkbJ>XhFkiCRB zd88Yw)cX!!BTn%8PQJM1**;PfBrL>c;mOQ0F{QN~HRrS!pZ~txIVMXLhkH)V+Zz9C z`BSlO(Mcu#m6}O&r>?z?(_Dc;huI^Bd%&x3$I}&PdA@ko2qLta)|x+Bj{#=gf6Ko{ z>EM{Rn6O5>$g-jB2HmZR8b=rmx1&eYIJBnodEY8O{gB*&AD2;0zY{y8gfs_rlR-+W zz-o#$ho3Ss!?qyuIyyVd!7tikdT*AGH{YCY?O?Cn-*#&Z{^mGkbT@j=%JMUP&Qd)W z7SE_l2eXeR+JiPa|03IT&b%NZ@*K|o>fd`7W_D%jhdhwr2)Mj%?PG4yd3@sB_WT(G zRKD}ik3Zp_^@pAx9RMQTuEJh6w_Vj!j?35?aaY?@wlXL+)3}+F!=jm%0sT(L;KndW zWJXrr*~o*kcolw1Kuha>DCSsU+PpN87(>L#Omm`fF$1 zHuGf!^3l79Lxog#A;wM!&mY|E%hBWu5luKxvnN;1OoPE^V$e-9J#<2Ei~S(;KiO-&#hT-#FNOa-&Cj}v8w39o#Bt5QhM9p zO^-2DeaYoS3ct0~u&oCNg>V^r$mZCC|8ZDg8ro!T5 z-?bh30~z@}j{p+m1NdrdtGE0HY`m{sGSO)gSUML)pWDR_)?~zZN`~-t4!$Q+`vf)e zV{Bxj+A^)*y1ZR^)1YZ=ESp#uv+Opq=`;4_+mx|wNeVK9Q>laY=UA?@sZ{7Ff0=O< zyuMqc-P(fA1+l5}V{G9}0iIAdPPk$l#ZlqxzQg2ZP5@S0pew~=-(Ap zEUiuf{S7X@T4@yVIYT14rDt24%6D4_-%n3ZE|kK{nuq^>$ZgjkLlN5;;Hw~QDlKA$z~+bI$m`MP-YYayd~N`beUnB(<(Kmx-JYQHiu zxTXx=!e(+X^VI)^Dz2zXkYSFdD?WPbWzCI4^uOO3f%=@cQf5uP$Ic2#_LVe~b%M$1 zJ|1*K#5YSt8Q*jWh33^Ci z=gjBfyv}T^fib{Yw7Dn z+jQUF>pB|7;>tk8X2F@4iUYGl%Y zE&#%x7d4OvhrxAg3V#fMc;6@EMu+0SMvVvLuJ{e9Y=A?#OSeL4FTA5xXe3KT#TLj7 zKc_N(d9(FFp^WT>e?T(x!A@AI6L4ITgf=+2C(`?m#l(IdyMg5e4RqP6k|+cBgBC_+tgvs1G{BGKh3O6 z+>4{5bL2E~?i5C>X$pL^Rb2T@`RLPEx4x6hA}ZSG5I3Sb4u~xkjVulBi`$R;61zqk zG%?iIl^gb_o67<+?r+1`&UlvH_WE6eN&S?S6&rKheMz6e$+1pT&yt9^AM3K?;N@@= z=bAj@h5mY_Y0`ty4Uv^3k=&4}z%KJ8&GRie^D z(LOJsMUW+oRD;m3KCtCPX0}=&B}vxM{G= z#9VeQ=HR_!am%Yz<%vJ2k8Dvv2{X-8Uez{*+*9V7%~cuRZ%Cy&Z5E_PBo2>v_}E;m zBThE`N_z|qh)Q#H-@)LpxjAI^(QK|T)0}crGf@RECvy3Xa&+=t0ccZp`haIE040a;B zb54U4_C^%a7g2Y?>tP!F$zU1vqUIz28h3Yd9Z@44Q#3DW2Z#NeXqb4vcm5AXmo_zd?VIqDtkDwGor95iswd@UE%TW4hjf-JA9bi+dR}JF^b4zU$QxNgG z(7odSsLTEcMB1yXUm9wI`_EvMKpZDzx0s3mt_1ED*6`F<4{d!#qo`bN!eav#&r#1; x4jBs(H>oBhK7-*BaTDiNClS2DCx_VJ^eNhzlk0B+v&nVgx_X=7SIqab{|AcA%oG3s literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/ZBeam-flanged-ubeam-thumb.svg b/extensions/fablabchemnitz/boxes.py/ZBeam-flanged-ubeam-thumb.svg new file mode 100644 index 0000000..9b88ad4 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ZBeam-flanged-ubeam-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/ZBeam-thumb.jpg b/extensions/fablabchemnitz/boxes.py/ZBeam-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3034f94350643f1836cd16581e742de65599b50 GIT binary patch literal 6521 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 literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/boxes.py/ZBeam-thumb.svg b/extensions/fablabchemnitz/boxes.py/ZBeam-thumb.svg new file mode 100644 index 0000000..4684789 --- /dev/null +++ b/extensions/fablabchemnitz/boxes.py/ZBeam-thumb.svg @@ -0,0 +1 @@ + diff --git a/extensions/fablabchemnitz/boxes.py/boxes.py.ABox.inx b/extensions/fablabchemnitz/boxes.py/boxes.py.ABox.inx index a106c50..9704ebd 100644 --- a/extensions/fablabchemnitz/boxes.py/boxes.py.ABox.inx +++ b/extensions/fablabchemnitz/boxes.py/boxes.py.ABox.inx @@ -64,7 +64,7 @@ ./ABox-thumb.jpg - + all @@ -72,6 +72,7 @@ + ABox-thumb.svg + \ No newline at end of file diff --git a/extensions/fablabchemnitz/boxes.py/boxes.py.FilamentSpool.inx b/extensions/fablabchemnitz/boxes.py/boxes.py.FilamentSpool.inx index 5e0c126..fba8dfc 100644 --- a/extensions/fablabchemnitz/boxes.py/boxes.py.FilamentSpool.inx +++ b/extensions/fablabchemnitz/boxes.py/boxes.py.FilamentSpool.inx @@ -42,7 +42,7 @@ ./FilamentSpool-thumb.jpg - + all @@ -50,6 +50,7 @@ + FilamentSpool-thumb.svg + \ No newline at end of file diff --git a/extensions/fablabchemnitz/boxes.py/boxes.py.HolePattern.inx b/extensions/fablabchemnitz/boxes.py/boxes.py.HolePattern.inx index 0d3d75e..d0efff2 100644 --- a/extensions/fablabchemnitz/boxes.py/boxes.py.HolePattern.inx +++ b/extensions/fablabchemnitz/boxes.py/boxes.py.HolePattern.inx @@ -52,7 +52,7 @@ ./HolePattern-thumb.jpg - + all @@ -60,6 +60,7 @@ + HolePattern-thumb.svg + \ No newline at end of file diff --git a/extensions/fablabchemnitz/boxes.py/boxes.py.KeyHolder.inx b/extensions/fablabchemnitz/boxes.py/boxes.py.KeyHolder.inx index 297ef9f..7942137 100644 --- a/extensions/fablabchemnitz/boxes.py/boxes.py.KeyHolder.inx +++ b/extensions/fablabchemnitz/boxes.py/boxes.py.KeyHolder.inx @@ -60,7 +60,7 @@ ./KeyHolder-thumb.jpg - + all @@ -68,6 +68,7 @@ + KeyHolder-thumb.svg + \ No newline at end of file diff --git a/extensions/fablabchemnitz/boxes.py/boxes.py.NotesHolder.inx b/extensions/fablabchemnitz/boxes.py/boxes.py.NotesHolder.inx index fd92728..bdc2e5f 100644 --- a/extensions/fablabchemnitz/boxes.py/boxes.py.NotesHolder.inx +++ b/extensions/fablabchemnitz/boxes.py/boxes.py.NotesHolder.inx @@ -54,7 +54,7 @@ ./NotesHolder-thumb.jpg - + all @@ -62,6 +62,7 @@ + NotesHolder-thumb.svg + \ No newline at end of file diff --git a/extensions/fablabchemnitz/boxes.py/boxes.py.SmallPartsTray.inx b/extensions/fablabchemnitz/boxes.py/boxes.py.SmallPartsTray.inx index 982bb6d..a6f8bbf 100644 --- a/extensions/fablabchemnitz/boxes.py/boxes.py.SmallPartsTray.inx +++ b/extensions/fablabchemnitz/boxes.py/boxes.py.SmallPartsTray.inx @@ -62,7 +62,7 @@ ./SmallPartsTray-thumb.jpg - + all @@ -70,6 +70,7 @@ + SmallPartsTray-thumb.svg + \ No newline at end of file diff --git a/extensions/fablabchemnitz/boxes.py/boxes.py.WallPinRow.inx b/extensions/fablabchemnitz/boxes.py/boxes.py.WallPinRow.inx index 6b56300..3f48bc1 100644 --- a/extensions/fablabchemnitz/boxes.py/boxes.py.WallPinRow.inx +++ b/extensions/fablabchemnitz/boxes.py/boxes.py.WallPinRow.inx @@ -9,6 +9,7 @@ + 8 35 @@ -80,11 +81,19 @@ 200.0 1.0 - +5.1 + + + + + +1.0 + + ./WallPinRow-thumb.jpg - + all @@ -92,6 +101,7 @@ + WallPinRow-thumb.svg + \ No newline at end of file diff --git a/extensions/fablabchemnitz/boxes.py/boxes.py.WallStairs.inx b/extensions/fablabchemnitz/boxes.py/boxes.py.WallStairs.inx index cd310e7..01218ee 100644 --- a/extensions/fablabchemnitz/boxes.py/boxes.py.WallStairs.inx +++ b/extensions/fablabchemnitz/boxes.py/boxes.py.WallStairs.inx @@ -9,6 +9,7 @@ + 250/3 40*3 @@ -76,11 +77,19 @@ 200.0 1.0 - +5.1 + + + + + +1.0 + + ./WallStairs-thumb.jpg - + all @@ -88,6 +97,7 @@ + WallStairs-thumb.svg + \ No newline at end of file diff --git a/extensions/fablabchemnitz/boxes.py/boxes/CODE_OF_CONDUCT.md b/extensions/fablabchemnitz/boxes.py/boxes/CODE_OF_CONDUCT.md deleted file mode 100644 index 124e420..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/CODE_OF_CONDUCT.md +++ /dev/null @@ -1 +0,0 @@ -This page is intentionally left blank. diff --git a/extensions/fablabchemnitz/boxes.py/boxes/CONTRIBUTING.rst b/extensions/fablabchemnitz/boxes.py/boxes/CONTRIBUTING.rst deleted file mode 100644 index 07897bd..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/CONTRIBUTING.rst +++ /dev/null @@ -1,182 +0,0 @@ -Contributing to Boxes.py -======================== - -You are thinking about contributing to Boxes.py? That's great! -Boxes.py is designed to be re-used and extended. - -This document gives you some guidelines how your contribution is most -likely to impact the development and your changes are most likely to -be merged into the upstream repository. - -Most of them should be just general best practises and not be -surprising. Don't worry if you find them too complicated. It is OK -leave the final touch to someone else. - -Writing code for Boxes.py -------------------------- - -You will often be compelled to just do a quick thing that will solve -your immediate needs. That's fine. But nevertheless it is often worth -doing things the right way and be able to submit your changes -upstream. For one to give something back to the community. But also -for purely selfish reasons like getting the code maintained. Also -Boxes.py is designed to make doing things properly the easy way. - -Here are some guidelines that make this easier. Depending on what you -are up to they may apply to a varying degree. It's ok to submit -patches that are not quite ready yet. But please state in the pull -request message what you think the status is and whether you want help -or are going to finish it on your own. - -* Please fork the repository at GitHub before getting started -* Start with creating separate branches for each of your new generators or features - - * You can merge them into your master branch to have them all in one place - * Please continue your work in the branches and repeatedly merge them to master - -* Before submitting a pull request intended to go upstream have clean patches that are self contained and error free - - * Re-order and squash patches with *git rebase -i* - * The patches should containing meaningful changes and not (necessarily) reflect how the code was created - * Rebase your branch to the current master branch - * Be prepared that your code may get reworked before being merged upstream - -* Submit a pull request in GitHub based on your feature branch - - * Describe the status of the patch set and your intentions with it in the pull request message - -If you want to discuss your idea open a ticket describing it and ask -questions there. This is encouraged even if you think you know what -you want to do. There are many short cuts in Boxes.py and pointing you -in the right direction may save you a lot of work. - -If you want feed back on you code feel free to open a PR. State that -this is work in progress in the PR message. It's OK if it does not -follow the guidelines (yet). - -Check Code -.......... - -The `pre-commit `_ tool is used to verify the code style. -When installed, it automatically checks and corrects the code before each commit. - -* Install *pre-commit*, e.g. :code:`pip install pre-commit` -* Install githook :code:`pre-commit install` - -For manual check use :code:`pre-commit run --all-files`. - -To remove githook use :code:`pre-commit uninstall`. - -Writing new Generators -...................... - -Writing new generators is the most straight forward thing to do with -Boxes.py. Here are some guidelines that make it easier to get them added: - -* Start with a copy of another generator or *boxes/generators/_template.py* -* Commit changes to the library in separate patches -* Use parameters with sane defaults instead of hard coding dimensions -* Simple generators can end up as one single commit -* For more complicated generators there can be multiple patches - - each adding another feature - -Adding new Dependencies -....................... - -Adding new dependencies should be considered thoroughly. If a new -dependency is added it needs to be added in all these places: - -* *documentation/src/install.rst* -* RST files in *documentation/src/install/* -* *scripts/Dockerfile* - -If it is a Python module it also needs to be added: -* *requirements.txt* -* *setup.py* - -Improving the Documentation ---------------------------- - -Boxes.py comes with Sphinx based documentation that is in large parts -generated from the doc strings in the code. Nevertheless documentation -has a tendency to get outdated. If you encounter outdated pieces of -documentation feel free to submit a pull request or open a ticket -pointing out what should be changed or even suggesting a better text. - -To check your changes docs need to be build with *make html* in -*documentation/src*. This places the compiled documentation in -*documentation/build/html*. You need to have *sphinx* installed for -this to work. - -The online documentation gets build and updated automatically by the Github Actions -as soon as the changes makes it into the GitHub *master* branch. - -Provide photos for generators ------------------------------ - -Many generators still come without an example photo. If you are -creating such an item consider donating a good picture. You can -simply attach it to `ticket #628 -`_. If you want you can -also create a proper pull request instead: - -* Make sure you have sh, ImageMagick (You will need to install legacy utilities for convert), sed and sha256sum installed -* The picture needs to be an jpg file with the name of the generator - (This is case sensitive. Use CamelCase.) -* The picture should be 1200 pixels wide and square or not too far - from square (3:4 is fine). -* Minimize the file size by running it through `Tiny Png `_ -* Place the file in *static/samples/* -* Check if the picture shows up at the bottom of the settings page of - the generator when running *scripts/boxesserver* -* Change dir to *./scripts* and there execute *./gen_thumbnails.sh* -* Check if the thumbnail is seen in the main page when hovering over - the generator entry -* Create a commit including *static/samples/$GeneratorName\*.jpg* and - *static/samples/samples.sha256* -* Create a pull request from that - -Improving the User Interface ----------------------------- - -Coming up with good names and good descriptions is hard. Often writing -a new generator is much easier than coming up with a good name for it -and its arguments. If you think something deserves a better name or -description and you can come up with one please don't hesitate to open -a ticket. It is this small things that make something like Boxes.py -easy or hard to use. - -There is also an - often empty - space for a longer text for each -generator that could house assembling instructions, instructions for -use or just more detailed descriptions. If you are interested in -writing some please open a ticket. Your text does not have to be -perfect. We can work on it together. - -Running the Code ----------------------------- - -To serve website, run :code:`scripts/boxesserver` script. - -You can set the BOXES_GENERATOR_PATH environment variable to add -custom generators if you cannot easily copy them in the sources / -system installation. - -Reporting bugs --------------- - -If you encounter issues with Boxes.py, please open a ticket at -GitHub. Please provide all information necessary to reproduce the -bug. Often this can be the URL of the broken result. If the issue is -easy to spot it may be sufficient to just give a brief -description. Otherwise it can be helpful to attach the resulting SVG, -a screen shot or the error message. Add a "bug" tag to draw additional -attention. - -Suggesting new generators or features -------------------------------------- - -If you have an idea for a new generator or feature please open a -ticket. Give some short rational how or where you would use such a -thing. Try to give a precise description how it should look like and -which features and details are important. The less is left open the -easier it is to implement. You can add an "enhancement" tag. diff --git a/extensions/fablabchemnitz/boxes.py/boxes/LICENSE.txt b/extensions/fablabchemnitz/boxes.py/boxes/LICENSE.txt deleted file mode 100644 index 94a9ed0..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/extensions/fablabchemnitz/boxes.py/boxes/MANIFEST.in b/extensions/fablabchemnitz/boxes.py/boxes/MANIFEST.in deleted file mode 100644 index 58a9fdc..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/MANIFEST.in +++ /dev/null @@ -1,6 +0,0 @@ -include README.rst LICENSE.txt -include examples/*.svg -include documentation/presentation.odp -include inkex/*.txt -include po/* -include scripts/boxes2pot scripts/boxes2inkscape scripts/boxes_proxy.py diff --git a/extensions/fablabchemnitz/boxes.py/boxes/README.rst b/extensions/fablabchemnitz/boxes.py/boxes/README.rst deleted file mode 100644 index b6cf699..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/README.rst +++ /dev/null @@ -1,62 +0,0 @@ -About Boxes.py -============== - -+----------------------------------------------+----------------------------------------------+----------------------------------------------+----------------------------------------------+----------------------------------------------+ -| .. image:: static/samples/NotesHolder.jpg | .. image:: static/samples/OttoBody.jpg | .. image:: static/samples/PaintStorage.jpg | .. image:: static/samples/ShutterBox.jpg | .. image:: static/samples/TwoPiece.jpg | -+----------------------------------------------+----------------------------------------------+----------------------------------------------+----------------------------------------------+----------------------------------------------+ - -* Boxes.py is an online box generator - - * https://www.festi.info/boxes.py/index.html - -* Boxes.py is an Inkscape plug-in -* Boxes.py is library to write your own -* Boxes.py is free software licensed under GPL v3+ -* Boxes.py is written in Python and runs with Python 3 - -Boxes.py comes with a growing set of ready-to-use, fully parametrized -generators. See https://florianfesti.github.io/boxes/html/generators.html for the full list. - -+----------------------------------------------+----------------------------------------------+----------------------------------------------+ -| .. image:: static/samples/AngledBox.jpg | .. image:: static/samples/FlexBox2.jpg | .. image:: static/samples/HingeBox.jpg | -+----------------------------------------------+----------------------------------------------+----------------------------------------------+ - -Features --------- - -Boxes.py generates SVG images that can be viewed directly in a web browser but also -postscript and - with pstoedit as external helper - other vector formats -including dxf, plt (aka hpgl) and gcode. - -Of course the library and the generators allow selecting the "thickness" -of the material used and automatically adjusts lengths and width of -joining fingers and other elements. - -The "burn" parameter compensates for the material removed by the laser. This -allows fine tuning the gaps between joins up to the point where plywood -can be press fitted even without any glue. - -Finger Joints are the work horse of the library. They allow 90° edges -and T connections. Their size is scaled up with the material -"thickness" to maintain the same appearance. The library also allows -putting holes and slots for screws (bed bolts) into finger joints, -although this is currently not supported for the included generators. - -Dovetail joints can be used to join pieces in the same plane. - -Flex cuts allows bending and stretching the material in one direction. This -is used for rounded edges and living hinges. - -+----------------------------------------------+----------------------------------------------+----------------------------------------------+ -| .. image:: static/samples/TypeTray.jpg | .. image:: static/samples/BinTray.jpg | .. image:: static/samples/DisplayShelf.jpg | -+----------------------------------------------+----------------------------------------------+----------------------------------------------+ -| .. image:: static/samples/AgricolaInsert.jpg | .. image:: static/samples/HeartBox.jpg | .. image:: static/samples/Atreus21.jpg | -+----------------------------------------------+----------------------------------------------+----------------------------------------------+ - -Documentation -------------- - -Boxes.py comes with Sphinx based documentation for usage, installation -and development. - -The rendered version can be viewed at . diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/Color.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/Color.py deleted file mode 100644 index 884c12b..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/Color.py +++ /dev/null @@ -1,16 +0,0 @@ -class Color: - BLACK = [ 0.0, 0.0, 0.0 ] - BLUE = [ 0.0, 0.0, 1.0 ] - GREEN = [ 0.0, 1.0, 0.0 ] - RED = [ 1.0, 0.0, 0.0 ] - CYAN = [ 0.0, 1.0, 1.0 ] - YELLOW = [ 1.0, 1.0, 0.0 ] - MAGENTA = [ 1.0, 0.0, 1.0 ] - WHITE = [ 1.0, 1.0, 1.0 ] - - # TODO: Make this configurable - OUTER_CUT = BLACK - INNER_CUT = BLUE - ANNOTATIONS = RED - ETCHING = GREEN - ETCHING_DEEP = CYAN diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/__init__.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/__init__.py deleted file mode 100755 index c928017..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/__init__.py +++ /dev/null @@ -1,2988 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -from __future__ import annotations - -import argparse -import copy -import gettext -import math -import random -import re -import sys -from argparse import ArgumentParser -from contextlib import contextmanager -from functools import wraps -from shlex import quote -from typing import Any -from xml.sax.saxutils import quoteattr - -import qrcode -from shapely.geometry import * -from shapely.ops import split - -from boxes import edges, formats, gears, parts, pulley -from boxes.Color import * -from boxes.qrcode_factory import BoxesQrCodeFactory -from boxes.vectors import kerf - -### Helpers - -def dist(dx, dy): - """ - Return distance - - :param dx: delta x - :param dy: delay y - """ - return (dx * dx + dy * dy) ** 0.5 - -def restore(func): - """ - Wrapper: Restore coordinates after function - - :param func: function to wrap - """ - - @wraps(func) - def f(self, *args, **kw): - with self.saved_context(): - pt = self.ctx.get_current_point() - func(self, *args, **kw) - self.ctx.move_to(*pt) - - return f - - -def holeCol(func): - """ - Wrapper: color holes differently - - :param func: function to wrap - """ - - @wraps(func) - def f(self, *args, **kw): - if "color" in kw: - color = kw.pop("color") - else: - color = Color.INNER_CUT - - self.ctx.stroke() - with self.saved_context(): - self.set_source_color(color) - func(self, *args, **kw) - self.ctx.stroke() - - return f - - -############################################################################# -### Building blocks -############################################################################# - -class NutHole: - """Draw a hex nut""" - sizes = { - "M1.6": (3.2, 1.3), - "M2": (4, 1.6), - "M2.5": (5, 2.0), - "M3": (5.5, 2.4), - "M4": (7, 3.2), - "M5": (8, 4.7), - "M6": (10, 5.2), - "M8": (13.7, 6.8), - "M10": (16, 8.4), - "M12": (18, 10.8), - "M14": (21, 12.8), - "M16": (24, 14.8), - "M20": (30, 18.0), - "M24": (36, 21.5), - "M30": (46, 25.6), - "M36": (55, 31), - "M42": (65, 34), - "M48": (75, 38), - "M56": (85, 45), - "M64": (95, 51), - } - - def __init__(self, boxes, settings) -> None: - self.boxes = boxes - self.ctx = boxes.ctx - self.settings = settings - - def __getattr__(self, name): - return getattr(self.boxes, name) - - @restore - @holeCol - def __call__(self, size, x=0, y=0, angle=0): - size = self.sizes.get(size, (size,))[0] - side = size / 3 ** 0.5 - self.boxes.moveTo(x, y, angle) - self.boxes.moveTo(-0.5 * side, 0.5 * size, angle) - for i in range(6): - self.boxes.edge(side) - self.boxes.corner(-60) - - -############################################################################## -### Argument types -############################################################################## - -def argparseSections(s): - """ - Parse sections parameter - - :param s: string to parse - """ - - result = [] - - s = re.split(r"\s|:", s) - - try: - for part in s: - m = re.match(r"^(\d+(\.\d+)?)/(\d+)$", part) - if m: - n = int(m.group(3)) - result.extend([float(m.group(1)) / n] * n) - continue - m = re.match(r"^(\d+(\.\d+)?)\*(\d+)$", part) - if m: - n = int(m.group(3)) - result.extend([float(m.group(1))] * n) - continue - result.append(float(part)) - except ValueError: - raise argparse.ArgumentTypeError("Don't understand sections string") - - if not result: - result.append(0.0) - - return result - -class ArgparseEdgeType: - """argparse type to select from a set of edge types""" - - names = edges.getDescriptions() - edges: list[str] = [] - - def __init__(self, edges: str | None = None) -> None: - if edges: - self.edges = list(edges) - - def __call__(self, pattern): - if len(pattern) != 1: - raise ValueError("Edge type can only have one letter.") - if pattern not in self.edges: - raise ValueError("Use one of the following values: " + - ", ".join(edges)) - return pattern - - def html(self, name, default, translate): - options = "\n".join( - """""" % - (e, ' selected="selected"' if e == default else "", - translate("{} {}".format(e, self.names.get(e, "")))) for e in self.edges) - return """\n""".format(name, name, name+"_id", name+"_description", options) - - def inx(self, name, viewname, arg): - return (' \n' % - (name, viewname, quoteattr(arg.help or "")) + - ''.join(' \n'.format( - e, e, self.names.get(e, "")) - for e in self.edges) + - ' \n') - -class BoolArg: - def __call__(self, arg): - if not arg or arg.lower() in ("none", "0", "off", "false"): - return False - return True - - def html(self, name, default, _): - if isinstance(default, (str)): - default = self(default) - return """ -""" % \ - (name, name, name, name+"_id", name+"_description",' checked="checked"' if default else "") - -boolarg = BoolArg() - - -class HexHolesSettings(edges.Settings): - """Settings for hexagonal hole patterns - -Values: - -* absolute - * diameter : 5.0 : diameter of the holes - * distance : 3.0 : distance between the holes - * style : "circle" : currently only supported style - -""" - - absolute_params = { - 'diameter' : 10.0, - 'distance' : 3.0, - 'style' : ('circle', ), - } - - relative_params: dict[str, Any] = {} - -class fillHolesSettings(edges.Settings): - """Settings for Hole filling - -Values: - -* absolute - * fill_pattern : "no fill" : style of hole pattern - * hole_style : "round" : style of holes (does not apply to fill patterns 'vbar' and 'hbar') - * max_random : 1000 : maximum number of random holes - * bar_length : 50 : maximum length of bars - * hole_max_radius : 12.0 : maximum radius of generated holes (in mm) - * hole_min_radius : 4.0 : minimum radius of generated holes (in mm) - * space_between_holes : 4.0 : hole to hole spacing (in mm) - * space_to_border : 4.0 : hole to border spacing (in mm) - -""" - - absolute_params = { - "fill_pattern": ("no fill", "hex", "square", "random", "hbar", "vbar"), - "hole_style": ("round", "triangle", "square", "hexagon", "octagon"), - "max_random": 1000, - "bar_length": 50, - "hole_max_radius": 3.0, - "hole_min_radius": 0.5, - "space_between_holes": 4.0, - "space_to_border": 4.0, - } - -############################################################################## -### Main class -############################################################################## - -class Boxes: - """Main class -- Generator should subclass this """ - - webinterface = True - ui_group = "Misc" - UI = "" - - description: str = "" # Markdown syntax is supported - - def __init__(self) -> None: - self.formats = formats.Formats() - self.ctx = None - description: str = self.__doc__ or "" - if self.description: - description += "\n\n" + self.description - self.argparser = ArgumentParser(description=description) - self.edgesettings: dict[Any, Any] = {} - self.non_default_args: dict[Any, Any] = {} - self.translations = gettext.NullTranslations() - - self.metadata = { - "name" : self.__class__.__name__, - "short_description" : self.__doc__, - "description" : self.description, - "group" : self.ui_group, - "url" : "", - "url_short" : "", - "cli" : "", - "cli_short" : "", - } - - # Dummy attribute for static analytic tools. Will be overwritten by `argparser` at runtime. - self.thickness: float = 0.0 - - self.argparser._action_groups[1].title = self.__class__.__name__ + " Settings" - defaultgroup = self.argparser.add_argument_group( - "Default Settings") - defaultgroup.add_argument( - "--thickness", action="store", type=float, default=3.0, - help="thickness of the material (in mm) [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#thickness)") - defaultgroup.add_argument( - "--output", action="store", type=str, default="box.svg", - help="name of resulting file") - defaultgroup.add_argument( - "--format", action="store", type=str, default="svg", - choices=self.formats.getFormats(), - help="format of resulting file [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#format)") - defaultgroup.add_argument( - "--tabs", action="store", type=float, default=0.0, - help="width of tabs holding the parts in place (in mm)(not supported everywhere) [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#tabs)") - defaultgroup.add_argument( - "--qr_code", action="store", type=boolarg, default=False, - help="Add a QR Code with link or command line to the generated output") - defaultgroup.add_argument( - "--debug", action="store", type=boolarg, default=False, - help="print surrounding boxes for some structures [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#debug)") - defaultgroup.add_argument( - "--labels", action="store", type=boolarg, default=True, - help="label the parts (where available)") - defaultgroup.add_argument( - "--reference", action="store", type=float, default=100, - help="print reference rectangle with given length (in mm)(zero to disable) [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#reference)") - defaultgroup.add_argument( - "--inner_corners", action="store", type=str, default="loop", - choices=["loop", "corner", "backarc"], - help="style for inner corners [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#inner-corners)") - defaultgroup.add_argument( - "--burn", action="store", type=float, default=0.1, - help='burn correction (in mm)(bigger values for tighter fit) [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#burn)') - - @contextmanager - def saved_context(self): - """ - Generator: for saving and restoring contexts. - """ - cr = self.ctx - cr.save() - try: - yield cr - finally: - cr.restore() - - def set_source_color(self, color): - """ - Sets the color of the pen. - """ - self.ctx.set_source_rgb(*color) - - def set_font(self, style, bold=False, italic=False): - """ - Set font style used - :param style: "serif", "sans-serif" or "monospaced" - :param bold: Use bold font - :param italic: Use italic font - """ - self.ctx.set_font(style, bold, italic) - - def open(self): - """ - Prepare for rendering - - Create canvas and edge and other objects - Call this before .render() - """ - if self.ctx is not None: - return - - self.bedBoltSettings = (3, 5.5, 2, 20, 15) # d, d_nut, h_nut, l, l1 - self.surface, self.ctx = self.formats.getSurface(self.format) - - if self.format == 'svg_Ponoko': - self.ctx.set_line_width(0.01) - self.set_source_color(Color.BLUE) - else: - self.ctx.set_line_width(max(2 * self.burn, 0.05)) - self.set_source_color(Color.BLACK) - - self.spacing = 2 * self.burn + 0.5 * self.thickness - self.set_font("sans-serif") - self._buildObjects() - if self.reference and self.format != 'svg_Ponoko': - self.move(self.reference, 10, "up", before=True) - self.ctx.rectangle(0, 0, self.reference, 10) - if self.reference < 80: - self.text(f"{self.reference:.2f}mm, burn:{self.burn:.2f}mm", self.reference + 5, 5, - fontsize=8, align="middle left", color=Color.ANNOTATIONS) - else: - self.text(f"{self.reference:.2f}mm, burn:{self.burn:.2f}mm", self.reference / 2.0, 5, - fontsize=8, align="middle center", color=Color.ANNOTATIONS) - self.move(self.reference, 10, "up") - if self.qr_code: - self.renderQrCode() - self.ctx.stroke() - - def renderQrCode(self): - content = self.metadata['url_short'] or self.metadata["cli_short"] - size = 1.5 - if content: - with self.saved_context(): - self.qrcode(content, box_size=size, move="right") - self.text(text=content, y=6, color=Color.ANNOTATIONS, fontsize=6) - self.qrcode(content, box_size=size, move="up only") - - def buildArgParser(self, *l, **kw): - """ - Add commonly used arguments - - :param l: parameter names - :param kw: parameters with new default values - - Supported parameters are - - * floats: x, y, h, hi - * argparseSections: sx, sy, sh - * ArgparseEdgeType: bottom_edge, top_edge - * boolarg: outside - * str (selection): nema_mount - """ - for arg in l: - kw[arg] = None - for arg, default in kw.items(): - if arg == "x": - if default is None: default = 100.0 - help = "inner width in mm" - if "outside" in kw: - help += " (unless outside selected)" - self.argparser.add_argument( - "--x", action="store", type=float, default=default, - help=help) - elif arg == "y": - if default is None: default = 100.0 - help = "inner depth in mm" - if "outside" in kw: - help += " (unless outside selected)" - self.argparser.add_argument( - "--y", action="store", type=float, default=default, - help=help) - elif arg == "sx": - if default is None: default = "50*3" - self.argparser.add_argument( - "--sx", action="store", type=argparseSections, - default=default, - help="""sections left to right in mm [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#section-parameters)""") - elif arg == "sy": - if default is None: default = "50*3" - self.argparser.add_argument( - "--sy", action="store", type=argparseSections, - default=default, - help="""sections back to front in mm [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#section-parameters)""") - elif arg == "sh": - if default is None: default = "50*3" - self.argparser.add_argument( - "--sh", action="store", type=argparseSections, - default=default, - help="""sections bottom to top in mm [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#section-parameters)""") - elif arg == "h": - if default is None: default = 100.0 - help = "inner height in mm" - if "outside" in kw: - help += " (unless outside selected)" - self.argparser.add_argument( - "--h", action="store", type=float, default=default, - help=help) - elif arg == "hi": - if default is None: default = 0.0 - self.argparser.add_argument( - "--hi", action="store", type=float, default=default, - help="inner height of inner walls in mm (unless outside selected)(leave to zero for same as outer walls)") - elif arg == "hole_dD": - if default is None: default = "3.5:6.5" - self.argparser.add_argument( - "--hole_dD", action="store", type=argparseSections, default=default, - help="mounting hole diameter (shaft:head) in mm [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#mounting-holes)") - elif arg == "bottom_edge": - if default is None: default = "h" - self.argparser.add_argument( - "--bottom_edge", action="store", - type=ArgparseEdgeType("Fhse"), choices=list("Fhse"), - default=default, - help="edge type for bottom edge") - elif arg == "top_edge": - if default is None: default = "e" - self.argparser.add_argument( - "--top_edge", action="store", - type=ArgparseEdgeType("efFhcESŠikvLtGyY"), choices=list("efFhcESŠikvfLtGyY"), - default=default, help="edge type for top edge") - elif arg == "outside": - if default is None: default = True - self.argparser.add_argument( - "--outside", action="store", type=boolarg, default=default, - help="treat sizes as outside measurements [\U0001F6C8](https://florianfesti.github.io/boxes/html/usermanual.html#outside)") - elif arg == "nema_mount": - if default is None: default = 23 - self.argparser.add_argument( - "--nema_mount", action="store", - type=int, choices=list(sorted(self.nema_sizes.keys())), - default=default, help="NEMA size of motor") - else: - raise ValueError("No default for argument", arg) - - def addSettingsArgs(self, settings, prefix=None, **defaults): - prefix = prefix or settings.__name__[:-len("Settings")] - settings.parserArguments(self.argparser, prefix, **defaults) - self.edgesettings[prefix] = {} - - - def parseArgs(self, args=None): - """ - Parse command line parameters - - :param args: (Default value = None) parameters, None for using sys.argv - """ - if args is None: - args = sys.argv[1:] - - def cliquote(s): - s = s.replace('\r', '') - s = s.replace('\n', "\\n") - return quote(s) - - self.metadata["cli"] = "boxes " + self.__class__.__name__ + " " + " ".join(cliquote(arg) for arg in args) - - for key, value in vars(self.argparser.parse_args(args=args)).items(): - default = self.argparser.get_default(key) - - # treat edge settings separately - for setting in self.edgesettings: - if key.startswith(setting + '_'): - self.edgesettings[setting][key[len(setting)+1:]] = value - continue - setattr(self, key, value) - if (value != default): - self.non_default_args[key] = value - - # Change file ending to format if not given explicitly - format = getattr(self, "format", "svg") - if getattr(self, 'output', None) == 'box.svg': - self.output = 'box.' + format.split("_")[0] - - self.metadata["cli_short"] = "boxes " + self.__class__.__name__ + " " + " ".join(cliquote(arg) for arg in args if (arg.split("=")[0][2:] in self.non_default_args)) - - def addPart(self, part, name=None): - """ - Add Edge or other part instance to this one and add it as attribute - - :param part: Callable - :param name: (Default value = None) attribute name (__name__ as default) - """ - if name is None: - name = part.__class__.__name__ - name = name[0].lower() + name[1:] - # if not hasattr(self, name): - if isinstance(part, edges.BaseEdge): - self.edges[part.char] = part - else: - setattr(self, name, part) - - def addParts(self, parts): - for part in parts: - self.addPart(part) - - def _buildObjects(self): - """Add default edges and parts""" - self.edges = {} - self.addPart(edges.Edge(self, None)) - self.addPart(edges.OutSetEdge(self, None)) - edges.GripSettings(self.thickness).edgeObjects(self) - - # Finger joints - # Share settings object - s = edges.FingerJointSettings(self.thickness, True, - **self.edgesettings.get("FingerJoint", {})) - s.edgeObjects(self) - self.addPart(edges.FingerHoles(self, s), name="fingerHolesAt") - # Stackable - edges.StackableSettings(self.thickness, True, - **self.edgesettings.get("Stackable", {})).edgeObjects(self) - # Dove tail joints - edges.DoveTailSettings(self.thickness, True, - **self.edgesettings.get("DoveTail", {})).edgeObjects(self) - # Flex - s = edges.FlexSettings(self.thickness, True, - **self.edgesettings.get("Flex", {})) - self.addPart(edges.FlexEdge(self, s)) - # Clickable - edges.ClickSettings(self.thickness, True, - **self.edgesettings.get("Click", {})).edgeObjects(self) - # Hinges - edges.HingeSettings(self.thickness, True, - **self.edgesettings.get("Hinge", {})).edgeObjects(self) - edges.ChestHingeSettings(self.thickness, True, - **self.edgesettings.get("ChestHinge", {})).edgeObjects(self) - edges.CabinetHingeSettings(self.thickness, True, - **self.edgesettings.get("CabinetHinge", {})).edgeObjects(self) - # Sliding Lid - edges.SlideOnLidSettings(self.thickness, True, - **self.edgesettings.get("SlideOnLid", {})).edgeObjects(self) - # Rounded Triangle Edge - edges.RoundedTriangleEdgeSettings(self.thickness, True, - **self.edgesettings.get("RoundedTriangleEdge", {})).edgeObjects(self) - # Grooved Edge - edges.GroovedSettings(self.thickness, True, - **self.edgesettings.get("Grooved", {})).edgeObjects(self) - # Mounting Edge - edges.MountingSettings(self.thickness, True, - **self.edgesettings.get("Mounting", {})).edgeObjects(self) - # Handle Edge - edges.HandleEdgeSettings(self.thickness, True, - **self.edgesettings.get("HandleEdge", {})).edgeObjects(self) - # HexHoles - self.hexHolesSettings = HexHolesSettings(self.thickness, True, - **self.edgesettings.get("HexHoles", {})) - # Lids - from . import lids - self.lidSettings = lids.LidSettings(self.thickness, True, - **self.edgesettings.get("Lid", {})) - self.lid = lids.Lid(self, self.lidSettings) - - # Nuts - self.addPart(NutHole(self, None)) - # Gears - self.addPart(gears.Gears(self)) - s = edges.GearSettings(self.thickness, True, - **self.edgesettings.get("Gear", {})) - self.addPart(edges.RackEdge(self, s)) - self.addPart(pulley.Pulley(self)) - self.addPart(parts.Parts(self)) - - def adjustSize(self, l, e1=True, e2=True): - # Char to edge object - e1 = self.edges.get(e1, e1) - e2 = self.edges.get(e2, e2) - - try: - total = sum(l) - walls = (len(l) - 1) * self.thickness - except TypeError: - total = l - walls = 0 - - if isinstance(e1, edges.BaseEdge): - walls += e1.startwidth() + e1.margin() - elif e1: - walls += self.thickness - - if isinstance(e2, edges.BaseEdge): - walls += e2.startwidth() + e2.margin() - elif e2: - walls += self.thickness - - try: - if total > 0.0: - factor = (total - walls) / total - else: - factor = 1.0 - return [s * factor for s in l] - except TypeError: - return l - walls - - def render(self): - """Implement this method in your subclass. - - You will typically need to call .parseArgs() before calling this one - """ - # Change settings and create new Edges and part classes here - raise NotImplementedError - - def cc(self, callback, number, x=0.0, y=None, a=0.0): - """Call callback from edge of a part - - :param callback: callback (callable or list of callables) - :param number: number of the callback - :param x: (Default value = 0.0) x position to be call on - :param y: (Default value = None) y position to be called on (default does burn correction) - """ - if y is None: - y = self.burn - - if hasattr(callback, '__getitem__'): - try: - callback = callback[number] - number = None - except (KeyError, IndexError): - pass - - if callback and callable(callback): - with self.saved_context(): - self.moveTo(x, y, a) - if number is None: - callback() - else: - callback(number) - self.ctx.move_to(0, 0) - - def getEntry(self, param, idx): - """ - Get entry from list or items itself - - :param param: list or item - :param idx: index in list - """ - if isinstance(param, list): - if len(param) > idx: - return param[idx] - else: - return None - else: - return param - - def close(self): - """Finish rendering - - Flush canvas to disk and convert output to requested format if needed. - Call after .render()""" - if self.ctx is None: - return - - self.ctx.stroke() - self.ctx = None - - self.surface.set_metadata(self.metadata) - - self.surface.flush() - data = self.surface.finish(self.inner_corners) - - data = self.formats.convert(data, self.format) - return data - - ############################################################ - ### Turtle graphics commands - ############################################################ - - def corner(self, degrees, radius=0, tabs=0): - """ - Draw a corner - - This is what does the burn corrections - - :param degrees: angle - :param radius: (Default value = 0) - """ - - try: - degrees, radius = degrees - except: - pass - - rad = degrees * math.pi / 180 - - if tabs and self.tabs: - if degrees > 0: - r_ = radius + self.burn - tabrad = self.tabs / max(r_, 0.01) - else: - r_ = radius - self.burn - tabrad = -self.tabs / max(r_, 0.01) - - length = abs(r_ * rad) - tabs = min(tabs, int(length // (tabs*3*self.tabs))) - if tabs and self.tabs: - l = (length - tabs * self.tabs) / tabs - lang = math.degrees(l / r_) - if degrees < 0: - lang = -lang - #print(degrees, radius, l, lang, tabs, math.degrees(tabrad)) - self.corner(lang/2., radius) - for i in range(tabs-1): - self.moveArc(math.degrees(tabrad), r_) - self.corner(lang, radius) - if tabs: - self.moveArc(math.degrees(tabrad), r_) - self.corner(lang/2., radius) - return - - if ((radius > 0.5* self.burn and abs(degrees) > 36) or - (abs(degrees) > 100)): - steps = int(abs(degrees)/ 36.) + 1 - for i in range(steps): - self.corner(float(degrees)/steps, radius) - return - - if degrees > 0: - self.ctx.arc(0, radius + self.burn, radius + self.burn, - -0.5 * math.pi, rad - 0.5 * math.pi) - elif radius > self.burn: - self.ctx.arc_negative(0, -(radius - self.burn), radius - self.burn, - 0.5 * math.pi, rad + 0.5 * math.pi) - else: # not rounded inner corner - self.ctx.arc_negative(0, self.burn - radius, self.burn - radius, - -0.5 * math.pi, -0.5 * math.pi + rad) - - self._continueDirection(rad) - - def edge(self, length, tabs=0): - """ - Simple line - :param length: length in mm - """ - self.ctx.move_to(0, 0) - if tabs and self.tabs: - if self.tabs > length: - self.ctx.move_to(length, 0) - else: - tabs = min(tabs, max(1, int(length // (tabs*3*self.tabs)))) - l = (length - tabs * self.tabs) / tabs - self.ctx.line_to(0.5*l, 0) - for i in range(tabs-1): - self.ctx.move_to((i+0.5)*l+self.tabs, 0) - self.ctx.line_to((i+0.5)*l+self.tabs+l, 0) - if tabs == 1: - self.ctx.move_to((tabs-0.5)*l+self.tabs, 0) - else: - self.ctx.move_to((tabs-0.5)*l+2*self.tabs, 0) - - self.ctx.line_to(length, 0) - else: - self.ctx.line_to(length, 0) - self.ctx.translate(*self.ctx.get_current_point()) - - def step(self, out): - """ - Create a parallel step perpendicular to the current direction - Positive values move to the outside of the part - """ - if out > 1E-5: - self.corner(-90) - self.edge(out) - self.corner(90) - elif out < -1E-5: - self.corner(90) - self.edge(-out) - self.corner(-90) - - def curveTo(self, x1, y1, x2, y2, x3, y3): - """control point 1, control point 2, end point - - :param x1: - :param y1: - :param x2: - :param y2: - :param x3: - :param y3: - """ - self.ctx.curve_to(x1, y1, x2, y2, x3, y3) - dx = x3 - x2 - dy = y3 - y2 - rad = math.atan2(dy, dx) - self._continueDirection(rad) - - def polyline(self, *args): - """ - Draw multiple connected lines - - :param args: Alternating length in mm and angle in degrees. - - lengths may be a tuple (length, #tabs) - angles may be tuple (angle, radius) - """ - for i, arg in enumerate(args): - if i % 2: - if isinstance(arg, tuple): - self.corner(*arg) - else: - self.corner(arg) - else: - if isinstance(arg, tuple): - self.edge(*arg) - else: - self.edge(arg) - - def bedBoltHole(self, length, bedBoltSettings=None, tabs=0): - """ - Draw an edge with slot for a bed bolt - - :param length: length of the edge in mm - :param bedBoltSettings: (Default value = None) Dimensions of the slot - """ - d, d_nut, h_nut, l, l1 = bedBoltSettings or self.bedBoltSettings - self.edge((length - d) / 2.0, tabs=tabs//2) - self.corner(90) - self.edge(l1) - self.corner(90) - self.edge((d_nut - d) / 2.0) - self.corner(-90) - self.edge(h_nut) - self.corner(-90) - self.edge((d_nut - d) / 2.0) - self.corner(90) - self.edge(l - l1 - h_nut) - self.corner(-90) - self.edge(d) - self.corner(-90) - self.edge(l - l1 - h_nut) - self.corner(90) - self.edge((d_nut - d) / 2.0) - self.corner(-90) - self.edge(h_nut) - self.corner(-90) - self.edge((d_nut - d) / 2.0) - self.corner(90) - self.edge(l1) - self.corner(90) - self.edge((length - d) / 2.0, tabs=tabs-(tabs//2)) - - def edgeCorner(self, edge1, edge2, angle=90): - """Make a corner between two Edges. Take width of edges into account""" - edge1 = self.edges.get(edge1, edge1) - edge2 = self.edges.get(edge2, edge2) - - self.edge(edge2.startwidth() * math.tan(math.radians(angle/2.))) - self.corner(angle) - self.edge(edge1.endwidth() * math.tan(math.radians(angle/2.))) - - def regularPolygon(self, corners=3, radius=None, h=None, side=None): - """Give measures of a regular polygon - - :param corners: number of corners of the polygon - :param radius: distance center to one of the corners - :param h: distance center to one of the sides (height of sector) - :param side: length of one side - :return: (radius, h, side) - """ - if radius: - side = 2 * math.sin(math.radians(180.0/corners)) * radius - h = radius * math.cos(math.radians(180.0/corners)) - elif h: - side = 2 * math.tan(math.radians(180.0/corners)) * h - radius = ((side/2.)**2+h**2)**0.5 - elif side: - h = 0.5 * side * math.tan(math.radians(90-180./corners)) - radius = ((side/2.)**2+h**2)**0.5 - - return radius, h, side - - @restore - def regularPolygonAt(self, x, y, corners, angle=0, r=None, h=None, side=None): - """Draw regular polygon""" - self.moveTo(x, y, angle) - r, h, side = self.regularPolygon(corners, r, h, side) - self.moveTo(-side/2.0, -h-self.burn) - for i in range(corners): - self.edge(side) - self.corner(360./corners) - - def regularPolygonWall(self, corners=3, r=None, h=None, side=None, - edges='e', hole=None, callback=None, move=None): - """Create regular polygon as a wall - - :param corners: number of corners of the polygon - :param r: radius distance center to one of the corners - :param h: distance center to one of the sides (height of sector) - :param side: length of one side - :param edges: (Default value = "e", may be string/list of length corners) - :param hole: diameter of central hole (Default value = 0) - :param callback: (Default value = None, middle=0, then sides=1..) - :param move: (Default value = None) - """ - r, h, side = self.regularPolygon(corners, r, h, side) - - t = self.thickness - - if not hasattr(edges, "__getitem__") or len(edges) == 1: - edges = [edges] * corners - edges = [self.edges.get(e, e) for e in edges] - edges += edges # append for wrapping around - - if corners % 2: - th = r + h + edges[0].spacing() + ( - max(edges[corners//2].spacing(), - edges[corners//2+1].spacing()) / - math.sin(math.radians(90-180/corners))) - else: - th = 2*h + edges[0].spacing() + edges[corners//2].spacing() - - tw = 0 - for i in range(corners): - ang = (180+360*i)/corners - tw = max(tw, 2*abs(math.sin(math.radians(ang))* - (r + max(edges[i].spacing(), edges[i+1].spacing())/ - math.sin(math.radians(90-180/corners))))) - - if self.move(tw, th, move, before=True): - return - - self.moveTo(0.5*tw-0.5*side, edges[0].margin()) - - - if hole: - self.hole(side/2., h+edges[0].startwidth() + self.burn, hole/2.) - self.cc(callback, 0, side/2., h+edges[0].startwidth() + self.burn) - for i in range(corners): - self.cc(callback, i+1, 0, edges[i].startwidth() + self.burn) - edges[i](side) - self.edgeCorner(edges[i], edges[i+1], 360.0/corners) - - self.move(tw, th, move) - - def grip(self, length, depth): - """Corrugated edge useful as a gipping area - - :param length: length - :param depth: depth of the grooves - """ - grooves = max(int(length // (depth * 2.0)) + 1, 1) - depth = length / grooves / 4.0 - for groove in range(grooves): - self.corner(90, depth) - self.corner(-180, depth) - self.corner(90, depth) - - def _latchHole(self, length): - """ - :param length: - """ - self.edge(1.1 * self.thickness) - self.corner(-90) - self.edge(length / 2.0 + 0.2 * self.thickness) - self.corner(-90) - self.edge(1.1 * self.thickness) - - def _latchGrip(self, length, extra_length=0.0): - """ - :param length: - """ - self.corner(90, self.thickness / 4.0) - self.grip(length / 2.0 - self.thickness / 2.0 - 0.2 * self.thickness + extra_length, self.thickness / 2.0) - self.corner(90, self.thickness / 4.0) - - def latch(self, length, positive=True, reverse=False, extra_length=0.0): - """Latch to fix a flex box door to the box - - :param length: length in mm - :param positive: (Default value = True) False: Door side; True: Box side - :param reverse: (Default value = False) True when running away from the latch - """ - t = self.thickness - if positive: - poly = [0, -90, t, 90, length / 2.0, 90, t, -90, length / 2.] - if reverse: - poly = list(reversed(poly)) - self.polyline(*poly) - else: - if reverse: - self._latchGrip(length, extra_length) - else: - self.corner(90) - self._latchHole(length) - if not reverse: - self._latchGrip(length, extra_length) - else: - self.corner(90) - - def handle(self, x, h, hl, r=30): - """Creates an Edge with a handle - - :param x: width in mm - :param h: height in mm - :param hl: height if th grip hole - :param r: (Default value = 30) radius of the corners - """ - d = (x - hl - 2 * r) / 2.0 - - # Hole - with self.saved_context(): - self.moveTo(d + 2 * r, 0) - self.edge(hl - 2 * r) - self.corner(-90, r) - self.edge(h - 3 * r) - self.corner(-90, r) - self.edge(hl - 2 * r) - self.corner(-90, r) - self.edge(h - 3 * r) - self.corner(-90, r) - - self.moveTo(0, 0) - - self.curveTo(d, 0, d, 0, d, -h + r) - self.curveTo(r, 0, r, 0, r, r) - self.edge(hl) - self.curveTo(r, 0, r, 0, r, r) - self.curveTo(h - r, 0, h - r, 0, h - r, -d) - - ### Navigation - - def moveTo(self, x, y=0.0, degrees=0): - """ - Move coordinate system to given point - - :param x: - :param y: (Default value = 0.0) - :param degrees: (Default value = 0) - """ - self.ctx.move_to(0, 0) - self.ctx.translate(x, y) - self.ctx.rotate(degrees * math.pi / 180.0) - self.ctx.move_to(0, 0) - - def moveArc(self, angle, r=0.0): - """ - :param angle: - :param r: (Default value = 0.0) - """ - if r < 0: - r = -r - angle = -angle - - rad = math.radians(angle) - if angle > 0: - self.moveTo(r*math.sin(rad), - r*(1-math.cos(rad)), angle) - else: - self.moveTo(r*math.sin(-rad), - -r*(1-math.cos(rad)), angle) - - def _continueDirection(self, angle=0): - """ - Set coordinate system to current position (end point) - - :param angle: (Default value = 0) heading - """ - self.ctx.translate(*self.ctx.get_current_point()) - self.ctx.rotate(angle) - - def move(self, x, y, where, before=False, label=""): - """Intended to be used by parts - where can be combinations of "up" or "down", "left" or "right", "only", - "mirror" and "rotated" - when "only" is included the move is only done when before is True - "mirror" will flip the part along the y-axis - "rotated" draws the parts rotated 90 counter clockwise - The function returns whether actual drawing of the part - should be omitted. - - :param x: width of part - :param y: height of part - :param where: which direction to move - :param before: (Default value = False) called before or after part being drawn - """ - if not where: - where = "" - - terms = where.split() - dontdraw = before and "only" in terms - - x += self.spacing - y += self.spacing - - if "rotated" in terms: - x, y = y, x - - moves = { - "up": (0, y, False), - "down": (0, -y, True), - "left": (-x, 0, True), - "right": (x, 0, False), - "only": (0, 0, None), - "mirror": (0, 0, None), - "rotated": (0, 0, None), - } - - if not before: - # restore position - self.ctx.restore() - if self.labels and label: - self.text(label, x/2, y/2, align="middle center", color=Color.ANNOTATIONS, fontsize=4) - self.ctx.stroke() - - for term in terms: - if not term in moves: - raise ValueError("Unknown direction: '%s'" % term) - mx, my, movebeforeprint = moves[term] - if movebeforeprint and before: - self.moveTo(mx, my) - elif (not movebeforeprint and not before) or dontdraw: - self.moveTo(mx, my) - if not dontdraw: - if before: - # paint debug rectangle - if self.debug: - with self.saved_context(): - self.set_source_color(Color.ANNOTATIONS) - self.ctx.rectangle(0, 0, x, y) - # save position - self.ctx.save() - if "rotated" in terms: - self.moveTo(x, 0, 90) - x, y = y, x # change back for "mirror" - if "mirror" in terms: - self.moveTo(x, 0) - self.ctx.scale(-1, 1) - self.moveTo(self.spacing / 2.0, self.spacing / 2.0) - self.ctx.new_part() - - return dontdraw - - @restore - def circle(self, x, y, r): - """ - Draw a round disc - - :param x: position - :param y: position - :param r: radius - """ - r += self.burn - self.moveTo(x + r, y) - a = 0 - n = 10 - da = 2 * math.pi / n - for i in range(n): - self.ctx.arc(-r, 0, r, a, a+da) - a += da - self.ctx.stroke() - - @restore - @holeCol - def regularPolygonHole(self, x, y, r=0.0, d=0.0, n=6, a=0.0, tabs=0, corner_radius=0.0): - """ - Draw a hole in shape of an n-edged regular polygon - - :param x: position - :param y: position - :param r: radius - :param n: number of edges - :param a: rotation angle - """ - - if not r: - r = d / 2.0 - - if n == 0: - self.hole(x, y, r=r, tabs=tabs) - return - - if r < self.burn: - r = self.burn + 1E-9 - r_ = r - self.burn - - if corner_radius < self.burn: - corner_radius = self.burn - cr_ = corner_radius - self.burn - - side_length = 2 * r_ * math.sin(math.pi / n) - apothem = r_ * math.cos(math.pi / n) - # the corner chord: - s = math.sqrt(2 * math.pow(cr_, 2) * (1 - math.cos(2 * math.pi / n))) - # the missing portion of the rounded corner: - b = math.sin(math.pi / n) / math.sin(2 * math.pi / n) * s - # the flat portion of the side: - flat_side_length = side_length - 2 * b - - self.moveTo(x, y, a) - self.moveTo(r_, 0, 90+180/n) - self.moveTo(b, 0, 0) - for _ in range(n): - self.edge(flat_side_length) - self.corner(360/n, cr_) - - @restore - @holeCol - def hole(self, x, y, r=0.0, d=0.0, tabs=0): - """ - Draw a round hole - - :param x: position - :param y: position - :param r: radius - """ - - if not r: - r = d / 2.0 - if r < self.burn: - r = self.burn + 1E-9 - r_ = r - self.burn - self.moveTo(x + r_, y, -90) - self.corner(-360, r, tabs) - - @restore - @holeCol - def rectangularHole(self, x, y, dx, dy, r=0, center_x=True, center_y=True): - """ - Draw a rectangular hole - - :param x: position - :param y: position - :param dx: width - :param dy: height - :param r: (Default value = 0) radius of the corners - :param center_x: (Default value = True) if True, x position is the center, else the start - :param center_y: (Default value = True) if True, y position is the center, else the start - """ - r = min(r, dx/2., dy/2.) - x_start = x if center_x else x + dx / 2.0 - y_start = y - dy / 2.0 if center_y else y - self.moveTo(x_start, y_start + self.burn, 180) - self.edge(dx / 2.0 - r) # start with an edge to allow easier change of inner corners - for d in (dy, dx, dy, dx / 2.0 + r): - self.corner(-90, r) - self.edge(d - 2 * r) - - @restore - @holeCol - def dHole(self, x, y, r=None, d=None, w=None, rel_w=0.75, angle=0): - """ - Draw a hole for a shaft with flat edge - D shaped hole - - :param x: center position - :param y: center position - :param r: radius (overrides d) - :param d: diameter - :param w: width measured against flat side in mm - :param rel_w: width in percent - :param angle: orientation (rotation) of the flat side - """ - - if r is None: - r = d / 2.0 - if w is None: - w = 2.0 * r * rel_w - w -= r - if r <= 0.0: - return - if abs(w) > r: - return self.hole(x, y, r) - - a = math.degrees(math.acos(w / r)) - self.moveTo(x, y, angle-a) - self.moveTo(r-self.burn, 0, -90) - self.corner(-360+2*a, r) - self.corner(-a) - self.edge(2*r*math.sin(math.radians(a))) - - @restore - @holeCol - def flatHole(self, x, y, r=None, d=None, w=None, rel_w=0.75, angle=0): - """ - Draw a hole for a shaft with two opposed flat edges - ( ) shaped hole - - :param x: center position - :param y: center position - :param r: radius (overrides d) - :param d: diameter - :param w: width measured against flat side in mm - :param rel_w: width in percent - :param angle: orientation (rotation) of the flat sides - """ - - if r is None: - r = d / 2.0 - if w is None: - w = r * rel_w - else: - w = w / 2.0 - - if r < 0.0: - return - if abs(w) > r: - return self.hole(x, y, r) - - a = math.degrees(math.acos(w / r)) - self.moveTo(x, y, angle-a) - self.moveTo(r-self.burn, 0, -90) - for i in range(2): - self.corner(-180+2*a, r) - self.corner(-a) - self.edge(2*r*math.sin(math.radians(a))) - self.corner(-a) - - @restore - @holeCol - def mountingHole(self, x, y, d_shaft, d_head=0.0, angle=0, tabs=0): - """ - Draw a pear shaped mounting hole for sliding over a screw head. Total height = 1.5* d_shaft + d_head - - :param x: position - :param y: position - :param d_shaft: diameter of the screw shaft - :param d_head: diameter of the screw head - :param angle: rotation angle of the hole - """ - - if d_shaft < (2 * self.burn): - return # no hole if diameter is smaller then the capabilities of the machine - - if not d_head or d_head < (2 * self.burn): # if no head diameter is given - self.hole(x, y ,d=d_shaft, tabs=tabs) # only a round hole is generated - return - - rs = d_shaft / 2 - rh = d_head / 2 - - self.moveTo(x, y, angle) - self.moveTo(0, rs - self.burn, 0) - self.corner(-180, rs, tabs) - self.edge(2 * rs,tabs) - a = math.degrees(math.asin(rs / rh)) - self.corner(90 - a, 0, tabs) - self.corner(-360 + 2 * a, rh, tabs) - self.corner(90 - a, 0, tabs) - self.edge(2 * rs, tabs) - - @restore - def text(self, text, x=0, y=0, angle=0, align="", fontsize=10, color=[0.0, 0.0, 0.0], font="Arial"): - """ - Draw text - - :param text: text to render - :param x: (Default value = 0) - :param y: (Default value = 0) - :param angle: (Default value = 0) - :param align: (Default value = "") string with combinations of (top|middle|bottom) and (left|center|right) separated by a space - """ - self.moveTo(x, y, angle) - text = text.split("\n") - - lines = len(text) - height = lines * fontsize + (lines - 1) * 0.4 * fontsize - align = align.split() - halign = "left" - moves = { - "top": -height, - "middle": -0.5 * height, - "bottom": 0, - "left": "left", - "center": "middle", - "right": "end", - } - for a in align: - if a in moves: - if isinstance(moves[a], str): - halign = moves[a] - else: - self.moveTo(0, moves[a]) - else: - raise ValueError("Unknown alignment: %s" % align) - - for line in reversed(text): - self.ctx.show_text(line, fs=fontsize, align=halign, rgb=color, font=font) - self.moveTo(0, 1.4 * fontsize) - - tx_sizes = { - 1 : 0.61, - 2 : 0.70, - 3 : 0.82, - 4 : 0.96, - 5 : 1.06, - 6 : 1.27, - 7 : 1.49, - 8 : 1.75, - 9 : 1.87, - 10 : 2.05, - 15 : 2.40, - 20 : 2.85, - 25 : 3.25, - 30 : 4.05, - 40 : 4.85, - 45 : 5.64, - 50 : 6.45, - 55 : 8.05, - 60 : 9.60, - 70 : 11.20, - 80 : 12.80, - 90 : 14.40, - 100 : 16.00, - } - - @restore - @holeCol - def TX(self, size, x=0, y=0, angle=0): - """Draw a star pattern - - :param size: 1 to 100 - :param x: (Default value = 0) - :param y: (Default value = 0) - :param angle: (Default value = 0) - """ - self.moveTo(x, y, angle) - - size = self.tx_sizes.get(size, 0) - ri = 0.5 * size * math.tan(math.radians(30)) - ro = ri * (2**0.5-1) - - self.moveTo(size * 0.5 - self.burn, 0, -90) - for i in range(6): - self.corner(45, ri) - self.corner(-150, ro) - self.corner(45, ri) - - nema_sizes = { - # motor,flange, holes, screws - 8: (20.3, 16, 15.4, 3), - 11: (28.2, 22, 23, 4), - 14: (35.2, 22, 26, 4), - 16: (39.2, 22, 31, 4), - 17: (42.2, 22, 31, 4), - 23: (56.4, 38.1, 47.1, 5.2), - 24: (60, 36, 49.8, 5.1), - 34: (86.3, 73, 69.8, 6.6), - 42: (110, 55.5, 89, 8.5), - } - - @restore - def NEMA(self, size, x=0, y=0, angle=0, screwholes=None): - """Draw holes for mounting a NEMA stepper motor - - :param size: Nominal size in tenths of inches - :param x: (Default value = 0) - :param y: (Default value = 0) - :param angle: (Default value = 0) - :param screwholes: - """ - width, flange, holedistance, diameter = self.nema_sizes[size] - if screwholes: - diameter = screwholes - self.moveTo(x, y, angle) - if self.debug: - self.rectangularHole(0, 0, width, width) - self.hole(0, 0, 0.5 * flange) - for x in (-1, 1): - for y in (-1, 1): - self.hole(x * 0.5 * holedistance, - y * 0.5 * holedistance, - 0.5 * diameter) - - def drawPoints(self, lines, kerfdir=1, close=True): - - if not lines: - return - - if kerfdir != 0: - lines = kerf(lines, self.burn*kerfdir, closed=close) - - self.ctx.save() - self.ctx.move_to(*lines[0]) - - for x, y in lines[1:]: - self.ctx.line_to(x, y) - - if close: - self.ctx.line_to(*lines[0]) - self.ctx.restore() - - def qrcode(self, content, box_size=1.0, color=Color.ETCHING, move=None): - q = qrcode.QRCode(image_factory=BoxesQrCodeFactory, box_size=box_size*10) - q.add_data(content) - m = q.get_matrix() - tw, th = len(m) * box_size, len(m[0]) * box_size - if self.move(tw, th, move, True): - return - - self.set_source_color(color) - q.make_image(ctx=self.ctx) - - self.move(tw, th, move) - - @restore - def showBorderPoly(self,border,color=Color.ANNOTATIONS): - """ - draw border polygon (for debugging only) - - :param border: array with coordinate [(x0,y0), (x1,y1),...] of the border polygon - :param color: - """ - self.set_source_color(color) - self.ctx.save() - self.ctx.move_to(*border[0]) - - for x, y in border[1:]: - self.ctx.line_to(x, y) - - self.ctx.line_to(*border[0]) - self.ctx.restore() - - i = 0 - for x, y in border: - i += 1 - self.hole(x, y, 0.5, color=color) - self.text(str(i), x, y, fontsize=2, color=color) - - @restore - @holeCol - def fillHoles(self, pattern, border, max_radius, hspace=3, bspace=0, min_radius=0.5, style="round", bar_length=50, max_random=1000): - """ - fill a polygon defined by its outline with holes - - :param pattern: defines the hole pattern - currently "random", "hex", "square" "hbar" or "vbar" are supported - :param border: array with coordinate [(x0,y0), (x1,y1),...] of the border polygon - :param max_radius: maximum hole radius - :param hspace: space between holes - :param bspace: space to border - :param min_radius: minimum hole radius - :param style: defines hole style - currently one of "round", "triangle", "square", "hexagon" or "octagon" - :param bar_length: maximum bar length - :param max_random: maximum number of random holes - """ - if pattern not in ["random", "hex", "square", "hbar", "vbar"]: - return - - a = 0 - if style == "round": - n = 0 - elif style == "triangle": - n = 3 - a = 60 - elif style == "square": - n = 4 - elif style == "hexagon": - n = 6 - a = 30 - elif style == "octagon": - n = 8 - a = 22.5 - else: - raise ValueError("fillHoles - unknown hole style: %s)" % style) - -# note to myself: ^y x> - - if self.debug: - self.showBorderPoly(border) - - borderPoly = Polygon(border) - min_x, min_y, max_x, max_y = borderPoly.bounds - - if pattern == "vbar": - border = [(max_y - y + min_y, x) for x, y in border] - borderPoly = Polygon(border) - min_x, min_y, max_x, max_y = borderPoly.bounds - self.moveTo(0, max_x + min_x, -90) - pattern = "hbar" - if self.debug: - self.showBorderPoly(border, color=Color.MAGENTA) - - row = 0 - i = 0 - - # calc the next smaller radius to fit an 'optimum' number of circles - # for x direction - nx = math.ceil((max_x - min_x - 2 * bspace + hspace) / (2 * max_radius + hspace)) - max_radius_x = (max_x - min_x - 2 * bspace - (nx - 1) * hspace) / nx / 2 - - # for y direction - if pattern == "hex": - ny = math.ceil((max_y - min_y - 2 * bspace - 2 * max_radius) / (math.sqrt(3) / 2 * (2 * max_radius + hspace))) - max_radius_y = (max_y - min_y - 2 * bspace - math.sqrt(3) / 2 * ny * hspace) / (math.sqrt(3) * ny + 2 ) - else: - ny = math.ceil((max_y - min_y - 2 * bspace + hspace) / (2 * max_radius + hspace)) - max_radius_y = (max_y - min_y - 2 * bspace - (ny - 1) * hspace) / ny / 2 - - if pattern == "random": - grid = {} - misses = 0 # in a row - while i < max_random and misses < 20: - i += 1 - misses += 1 - # random new point - x = random.randrange(math.floor(min_x + bspace), math.ceil(max_x - bspace)) # randomness takes longer to compute - y = random.randrange(math.floor(min_y + bspace), math.ceil(max_y - bspace)) # but generates a new pattern for each run - pt = Point(x, y).buffer(min_radius + bspace) - # check if point is within border - if borderPoly.contains(pt): - pt1 = Point(x, y) - grid_x = int(x//(2*max_radius+hspace)) - grid_y = int(y//(2*max_radius+hspace)) - # compute distance between hole and border - bdist = borderPoly.exterior.distance(pt1) - bspace - # compute minimum distance to all other holes - hdist = max_radius - try: # learned from https://medium.com/techtofreedom/5-ways-to-break-out-of-nested-loops-in-python-4c505d34ace7 - for gx in (-1, 0, 1): - for gy in (-1, 0, 1): - for pt2 in grid.get((grid_x+gx, grid_y+gy), []): - pt3 = Point(pt2.x, pt2.y) - hdist = min(hdist, pt1.distance(pt3) - pt2.z - hspace) - if hdist < min_radius: - hdist = 0 - raise StopIteration - except StopIteration: - pass - # find maximum radius depending on distances - r = min(bdist, hdist) - # if too small, dismiss cycle - if r < min_radius: - continue - # if too large, limit to max size - if r > max_radius: - r = max_radius - # store in grid with radius as z value - grid.setdefault((grid_x, grid_y), []).append( - Point(x, y, r)) - misses = 0 - # and finally paint the hole - self.regularPolygonHole(x, y, r=r, n=n, a=a) - # rinse and repeat - - elif pattern in ("square", "hex"): - # use 'optimum' hole size - max_radius = min(max_radius_x, max_radius_y) - - # check if at least one line fits (we do horizontal filling) - if (max_y - min_y) < (2 * max_radius + 2 * bspace): - return - - # make cutPolys a little wider to avoid - # overlapping with lines to be cut - outerCutPoly = borderPoly.buffer(-1 * (bspace - 0.000001), - join_style=2) - outerTestPoly = borderPoly.buffer(-1 * (bspace - 0.01), - join_style=2) - # shrink original polygon to get place for full size polygons - innerCutPoly = borderPoly.buffer(-1 * (bspace + max_radius - 0.0001), join_style=2) - innerTestPoly = borderPoly.buffer(-1 * (bspace + max_radius - 0.001), join_style=2) - - # get left and right boundaries of cut polygon - x_cpl, y_cpl, x_cpr, y_cpr = outerCutPoly.bounds - - if self.debug: - self.showBorderPoly(list(outerCutPoly.exterior.coords)) - self.showBorderPoly(list(innerCutPoly.exterior.coords)) - - # set startpoint - y = min_y + bspace + max_radius_y - - while y < (max_y - bspace - max_radius_y): - if pattern == "square" or row % 2 == 0: - xs = min_x + bspace + max_radius_x - else: - xs = min_x + max_radius_x * 2 + hspace / 2 + bspace - - # create line segments cut by the polygons - line_complete = LineString([(x_cpl, y), (max_x + 1, y)]) - # cut accurate - outer_line_split = split(line_complete, outerCutPoly) - line_complete = LineString([(x_cpl, y), (max_x + 1, y)]) - inner_line_split = split(line_complete, innerCutPoly) - inner_line_index = 0 - - if self.debug and False: - for line in inner_line_split.geoms: - self.hole(line.bounds[0], line.bounds[1], 1.1) - self.hole(line.bounds[2], line.bounds[3], .9) - - # process each line - for line_this in outer_line_split.geoms: - - if self.debug and False: # enable to debug missing lines - x_start, y_start, x_end, y_end = line_this.bounds - with self.saved_context(): - self.moveTo(x_start, y_start ,0) - self.hole(0, 0, 0.5) - self.edge(x_end - x_start) - with self.saved_context(): - self.moveTo(x_start, y_start ,0) - self.text(str(outerTestPoly.contains(line_this)), 0, 0, fontsize=2, color=Color.ANNOTATIONS) - with self.saved_context(): - self.moveTo(x_end, y_end ,0) - self.hole(0, 0, 0.5) - - if not outerTestPoly.contains(line_this): - continue - x_start, y_start , x_end, y_end = line_this.bounds - #initialize walking x coordinate - xw = (math.ceil((x_start - xs) / (2 * max_radius_x + hspace)) * (2 * max_radius_x + hspace)) + xs - - # look up matching inner line - while (inner_line_index < len(inner_line_split) and - (inner_line_split.geoms[inner_line_index].bounds[2] < xw - or not innerTestPoly.contains(inner_line_split.geoms[inner_line_index]))): - inner_line_index += 1 - - # and process line - while not xw > x_end: - # are we in inner polygon already? - if (len(inner_line_split) > inner_line_index and - xw > inner_line_split.geoms[inner_line_index].bounds[0]): - # place inner, full size polygons - while xw < inner_line_split.geoms[inner_line_index].bounds[2]: - self.regularPolygonHole(xw, y, r=max_radius, n=n, a=a) - xw += (2 * max_radius_x + hspace) - # forward to next inner line - while (inner_line_index < len(inner_line_split) and - (inner_line_split.geoms[inner_line_index].bounds[0] < xw - or not innerTestPoly.contains(inner_line_split.geoms[inner_line_index]))): - inner_line_index += 1 - if xw > x_end: - break - - # Check distance to border to size the polygon - pt = Point(xw, y) - r = min(borderPoly.exterior.distance(pt) - bspace, - max_radius) - # if too small, dismiss - if r >= min_radius: - self.regularPolygonHole(xw, y, r=r, n=n, a=a) - xw += (2 * max_radius_x + hspace) - - row += 1 - if pattern == "square": - y += 2 * max_radius_y + hspace - 0.0001 - else: - y += (math.sqrt(3) / 2 * (2 * max_radius_y + hspace)) - 0.0001 - - elif pattern == "hbar": - # 'optimum' hole size to be used - max_radius = max_radius_y - # check if at least one bar fits - if (max_y - min_y) < (2 * max_radius + 2 * bspace): - return - - #shrink original polygon - shrinkPoly = borderPoly.buffer(-1 * (bspace + max_radius - 0.01), join_style=2) - cutPoly = borderPoly.buffer(-1 * (bspace + max_radius - 0.000001), join_style=2) - - if self.debug: - self.showBorderPoly(list(shrinkPoly.exterior.coords)) - - segment_length = [bar_length / 2, bar_length] - segment_max = 1 - segment_toggle = False - - # set startpoint - y = min_y + bspace + max_radius - # and calc step width - step_y = 2 * max_radius_y + hspace - 0.0001 - - while y < (max_y - bspace - max_radius): - # toggle segment length each new line - if segment_toggle: - segment_max = 0 - segment_toggle ^= 1 - - # create line from left to right and cut according to shrunk polygon - line_complete = LineString([(min_x - 1, y), (max_x + 1, y)]) - line_split = split(line_complete, cutPoly) - - # process each line - for line_this in line_split.geoms: - - if self.debug and False: # enable to debug missing lines - x_start, y_start , x_end, y_end = line_this.bounds - with self.saved_context(): - self.moveTo(x_start, y_start ,0) - self.hole(0, 0, 0.5) - self.edge(x_end - x_start) - with self.saved_context(): - self.moveTo(x_start, y_start ,0) - self.text(str(shrinkPoly.contains(line_this)), 0, 0, fontsize=2, color=Color.ANNOTATIONS) - with self.saved_context(): - self.moveTo(x_end, y_end ,0) - self.hole(0, 0, 0.5) - - if shrinkPoly.contains(line_this): - # long segment are cut down further - if line_this.length > segment_length[segment_max]: - line_working = line_this - length = line_working.length - while length > 0: - x_start, y_start , xw_end, yw_end = line_working.bounds - # calculate point with required distance from start point - p = line_working.interpolate(segment_length[segment_max]) - # and use its coordinates as endpoint for this segment - x_end = p.x - y_end = p.y - # draw segment - self.set_source_color(Color.INNER_CUT) - with self.saved_context(): - self.moveTo(x_start, y_start + max_radius,0) - self.edge(x_end - x_start) - self.corner(-180, max_radius) - self.edge(x_end - x_start) - self.corner(-180, max_radius) - - if self.debug and False: # enable to debug cutting lines - self.set_source_color(Color.ANNOTATIONS) - with self.saved_context(): - self.moveTo(x_start, y_start, 0) - self.edge(x_end - x_start) - - s = "long - y: " + str(round(y, 1)) + " xs: " + str(round(x_start, 1)) + " xe: " + str(round(x_end, 1)) + " l: " + str(round(length, 1)) + " max: " + str(round(segment_length[segment_max], 1)) - with self.saved_context(): - self.text(s, x_start, y_start, fontsize=2, color=Color.ANNOTATIONS) - - # subtract length of segmant from total segment length - length -= (x_end - x_start + hspace + 2 * max_radius) - # create remaining line to work with - line_working = LineString([(x_end + hspace + 2 * max_radius, y_end), (xw_end, yw_end)]) - # next segment shall be long - segment_max = 1 - else: - # short segment can be drawn instantly - x_start, y_start , x_end, y_end = line_this.bounds - self.set_source_color(Color.INNER_CUT) - with self.saved_context(): - self.moveTo(x_start, y_start + max_radius, 0) - self.edge(x_end - x_start) - self.corner(-180, max_radius) - self.edge(x_end - x_start) - self.corner(-180, max_radius) - - if self.debug and False: # enable to debug short lines - self.set_source_color(Color.ANNOTATIONS) - with self.saved_context(): - self.moveTo(x_start, y_start, 0) - self.edge(x_end - x_start) - - s = "short - y: " + str(round(y, 1)) + " xs: " + str(round(x_start, 1)) + " xe: " + str(round(x_end, 1)) + " l: " + str(round(line_this.length, 1)) + " max: " + str(round(segment_length[segment_max], 1)) - with self.saved_context(): - self.text(s, x_start, y_start, fontsize=2, color=Color.ANNOTATIONS) - - segment_max = 1 - # short segment shall be skipped if a short segment shall start the line - if segment_toggle: - segment_max = 0 - y += step_y - else: - raise ValueError("fillHoles - unknown hole pattern: %s)" % pattern) - - def hexHolesRectangle(self, x, y, settings=None, skip=None): - """Fills a rectangle with holes in a hex pattern. - - Settings have: - r : radius of holes - b : space between holes - style : what types of holes (not yet implemented) - - :param x: width - :param y: height - :param settings: (Default value = None) - :param skip: (Default value = None) function to check if hole should be present - gets x, y, r, b, posx, posy - """ - - if settings is None: - settings = self.hexHolesSettings - r, b, style = settings.diameter/2, settings.distance, settings.style - - w = r + b / 2.0 - dist = w * math.cos(math.pi / 6.0) - - # how many half circles do fit - cx = int((x - 2 * r) // (w)) + 2 - cy = int((y - 2 * r) // (dist)) + 2 - - # what's left on the sides - lx = (x - (2 * r + (cx - 2) * w)) / 2.0 - ly = (y - (2 * r + ((cy // 2) * 2) * dist - 2 * dist)) / 2.0 - - for i in range(cy // 2): - for j in range((cx - (i % 2)) // 2): - px = 2 * j * w + r + lx - py = i * 2 * dist + r + ly - if i % 2: - px += w - if skip and skip(x, y, r, b, px, py): - continue - self.hole(px, py, r=r) - - def __skipcircle(self, x, y, r, b, posx, posy): - cx, cy = x / 2.0, y / 2.0 - return (dist(posx - cx, posy - cy) > (cx - r)) - - def hexHolesCircle(self, d, settings=None): - """ - Fill circle with holes in a hex pattern - - :param d: diameter of the circle - :param settings: (Default value = None) - """ - d2 = d / 2.0 - self.hexHolesRectangle(d, d, settings=settings, skip=self.__skipcircle) - - def hexHolesPlate(self, x, y, rc, settings=None): - """ - Fill a plate with holes in a hex pattern - - :param x: width - :param y: height - :param rc: radius of the corners - :param settings: (Default value = None) - """ - - def skip(x, y, r, b, posx, posy): - """ - :param x: - :param y: - :param r: - :param b: - :param posx: - :param posy: - """ - posx = abs(posx - (x / 2.0)) - posy = abs(posy - (y / 2.0)) - - wx = 0.5 * x - rc - r - wy = 0.5 * y - rc - r - - if (posx <= wx) or (posy <= wx): - return 0 - return dist(posx - wx, posy - wy) > rc - - self.hexHolesRectangle(x, y, settings, skip=skip) - - def hexHolesHex(self, h, settings=None, grow=None): - """ - Fill a hexagon with holes in a hex pattern - - :param h: height - :param settings: (Default value = None) - :param grow: (Default value = None) - """ - if settings is None: - settings = self.hexHolesSettings - r, b, style = settings.diameter/2, settings.distance, settings.style - - self.ctx.rectangle(0, 0, h, h) - w = r + b / 2.0 - dist = w * math.cos(math.pi / 6.0) - cy = 2 * int((h - 4 * dist) // (4 * w)) + 1 - - leftover = h - 2 * r - (cy - 1) * 2 * r - if grow == 'space ': - b += leftover / (cy - 1) / 2 - - # recalculate with adjusted values - w = r + b / 2.0 - dist = w * math.cos(math.pi / 6.0) - - self.moveTo(h / 2.0 - (cy // 2) * 2 * w, h / 2.0) - for j in range(cy): - self.hole(2 * j * w, 0, r) - for i in range(1, cy / 2 + 1): - for j in range(cy - i): - self.hole(j * 2 * w + i * w, i * 2 * dist, r) - self.hole(j * 2 * w + i * w, -i * 2 * dist, r) - - def flex2D(self, x, y, width=1): - """ - Fill a rectangle with a pattern allowing bending in both axis - - :param x: width - :param y: height - :param width: width between the lines of the pattern in multiples of thickness - """ - width *= self.thickness - cx = int(x // (5 * width)) - cy = int(y // (5 * width)) - - if cx == 0 or cy == 0: - return - - wx = x / 5. / cx - wy = y / 5. / cy - - armx = (4 * wx, 90, 4 * wy, 90, 2 * wx, 90, 2 * wy) - army = (4 * wy, 90, 4 * wx, 90, 2 * wy, 90, 2 * wx) - for i in range(cx): - for j in range(cy): - if (i + j) % 2: - with self.saved_context(): - self.moveTo((5 * i) * wx, (5 * j) * wy) - self.polyline(*armx) - with self.saved_context(): - self.moveTo((5 * i + 5) * wx, (5 * j + 5) * wy, -180) - self.polyline(*armx) - else: - with self.saved_context(): - self.moveTo((5 * i + 5) * wx, (5 * j) * wy, 90) - self.polyline(*army) - with self.saved_context(): - self.moveTo((5 * i) * wx, (5 * j + 5) * wy, -90) - self.polyline(*army) - self.ctx.stroke() - - @restore - def fingerHoleRectangle(self, dx, dy, x=0., y=0., angle=0., outside=False): - """ - Place finger holes for four walls - attaching a box on this plane - - :param dx: size in x direction - :param dy: size in y direction - :param x: x position of the center - :param y: y position of the center - :param angle: angle in which the rectangle is placed - :param outside: measure size from the outside of the walls - not the inside - """ - self.moveTo(x, y, angle) - d = 0.5*self.thickness - if outside: - d = -d - - self.fingerHolesAt(dx/2+d, -dy/2, dy, 90) - self.fingerHolesAt(-dx/2-d, -dy/2, dy, 90) - self.fingerHolesAt(-dx/2, -dy/2-d, dx, 0) - self.fingerHolesAt(-dx/2, dy/2+d, dx, 0) - - ################################################## - ### parts - ################################################## - - def _splitWall(self, pieces, side): - """helper for roundedPlate and surroundingWall - figures out what sides to split - """ - return [ - (False, False, False, False, True), - (True, False, False, False, True), - (True, False, True, False, True), - (True, True, True, False, True), - (True, True, True, True, True), - ][pieces][side] - - def roundedPlate(self, x, y, r, edge="f", callback=None, - holesMargin=None, holesSettings=None, - bedBolts=None, bedBoltSettings=None, - wallpieces=1, - extend_corners=True, - move=None): - """Plate with rounded corner fitting to .surroundingWall() - - For the callbacks the sides are counted depending on wallpieces - - :param x: width - :param y: height - :param r: radius of the corners - :param edge: - :param callback: (Default value = None) - :param holesMargin: (Default value = None) set to get hex holes - :param holesSettings: (Default value = None) - :param bedBolts: (Default value = None) - :param bedBoltSettings: (Default value = None) - :param wallpieces: (Default value = 1) # of separate surrounding walls - :param extend_corners: (Default value = True) have corners outset with the edges - :param move: (Default value = None) - """ - corner_holes = True - - t = self.thickness - edge = self.edges.get(edge, edge) - overallwidth = x + 2 * edge.spacing() - overallheight = y + 2 * edge.spacing() - - if self.move(overallwidth, overallheight, move, before=True): - return - - lx = x - 2*r - ly = y - 2*r - - self.moveTo(edge.spacing(), - edge.margin()) - self.moveTo(r, 0) - - if wallpieces > 4: - wallpieces = 4 - - wallcount = 0 - for nr, l in enumerate((lx, ly, lx, ly)): - if self._splitWall(wallpieces, nr): - for i in range(2): - self.cc(callback, wallcount, y=edge.startwidth()+self.burn) - edge(l / 2.0 , - bedBolts=self.getEntry(bedBolts, wallcount), - bedBoltSettings=self.getEntry(bedBoltSettings, wallcount)) - wallcount += 1 - else: - self.cc(callback, wallcount, y=edge.startwidth()+self.burn) - edge(l, - bedBolts=self.getEntry(bedBolts, wallcount), - bedBoltSettings=self.getEntry(bedBoltSettings, wallcount)) - wallcount += 1 - if extend_corners: - if corner_holes: - with self.saved_context(): - self.moveTo(0, edge.startwidth()) - self.polyline(0, (90, r), 0, -90, t, -90, 0, - (-90, r+t), 0, -90, t, -90, 0,) - self.ctx.stroke() - self.corner(90, r + edge.startwidth()) - else: - self.step(-edge.endwidth()) - self.corner(90, r) - self.step(edge.startwidth()) - - self.ctx.restore() - self.ctx.save() - - self.moveTo(edge.margin(), - edge.margin()) - - if holesMargin is not None: - self.moveTo(holesMargin, holesMargin) - if r > holesMargin: - r -= holesMargin - else: - r = 0 - self.hexHolesPlate(x - 2 * holesMargin, y - 2 * holesMargin, r, - settings=holesSettings) - - self.move(overallwidth, overallheight, move) - - def surroundingWallPiece(self, cbnr, x, y, r, pieces=1): - """ - Return the geometry of a pices of surroundingWall with the given - callback number. - :param cbnr: number of the callback corresponding to this part of the wall - :param x: width of matching roundedPlate - :param y: height of matching roundedPlate - :param r: corner radius of matching roundedPlate - :param pieces: (Default value = 1) number of separate pieces - :return: (left, length, right) left and right are Booleans that are True if the start or end of the wall is on that side. - """ - if pieces<=2 and (y - 2 * r) < 1E-3: - # remove zero length y sides - sides = (x/2-r, x - 2*r, x - 2*r) - if pieces > 0: # hack to get the right splits - pieces += 1 - else: - sides = (x/2-r, y - 2*r, x - 2*r, y - 2*r, x - 2*r) - - wallcount = 0 - for nr, l in enumerate(sides): - if self._splitWall(pieces, nr) and nr > 0: - if wallcount == cbnr: - return (False, l/2, True) - wallcount += 1 - if wallcount == cbnr: - return (True, l/2, False) - wallcount += 1 - else: - if wallcount == cbnr: - return (False, l, False) - wallcount += 1 - return (False, 0.0, False) - - def surroundingWall(self, x, y, r, h, - bottom='e', top='e', - left="D", right="d", - pieces=1, - extend_corners=True, - callback=None, - move=None): - """ - Wall(s) with flex filing around a roundedPlate() - - For the callbacks the sides are counted depending on pieces - - :param x: width of matching roundedPlate - :param y: height of matching roundedPlate - :param r: corner radius of matching roundedPlate - :param h: inner height of the wall (without edges) - :param bottom: (Default value = 'e') Edge type - :param top: (Default value = 'e') Edge type - :param left: (Default value = 'D') left edge(s) - :param right: (Default value = 'd') right edge(s) - :param pieces: (Default value = 1) number of separate pieces - :param callback: (Default value = None) - :param move: (Default value = None) - """ - t = self.thickness - c4 = (r + self.burn) * math.pi * 0.5 # circumference of quarter circle - c4 = c4 / self.edges["X"].settings.stretch - - top = self.edges.get(top, top) - bottom = self.edges.get(bottom, bottom) - left = self.edges.get(left, left) - right = self.edges.get(right, right) - - # XXX assumes startwidth == endwidth - if extend_corners: - topwidth = t - bottomwidth = t - else: - topwidth = top.startwidth() - bottomwidth = bottom.startwidth() - - overallwidth = 2*x + 2*y - 8*r + 4*c4 + (self.edges["d"].spacing() + self.edges["D"].spacing() + self.spacing) * pieces - overallheight = h + max(t, top.spacing()) + max(t, bottom.spacing()) - - if self.move(overallwidth, overallheight, move, before=True): - return - - self.moveTo(left.spacing(), bottom.margin()) - - wallcount = 0 - tops = [] # edges needed on the top for this wall segment - - if pieces<=2 and (y - 2 * r) < 1E-3: - # remove zero length y sides - c4 *= 2 - sides = (x/2-r, x - 2*r, x - 2*r) - if pieces > 0: # hack to get the right splits - pieces += 1 - else: - sides = (x/2-r, y - 2*r, x - 2*r, y - 2*r, x - 2*r) - - for nr, l in enumerate(sides): - if self._splitWall(pieces, nr) and nr > 0: - self.cc(callback, wallcount, y=bottomwidth + self.burn) - wallcount += 1 - bottom(l / 2.) - tops.append(l / 2.) - - # complete wall segment - with self.saved_context(): - self.edgeCorner(bottom, right, 90) - right(h) - self.edgeCorner(right, top, 90) - for n, d in enumerate(reversed(tops)): - if n % 2: # flex - self.step(topwidth-top.endwidth()) - self.edge(d) - self.step(top.startwidth()-topwidth) - else: - top(d) - self.edgeCorner(top, left, 90) - left(h) - self.edgeCorner(left, bottom, 90) - - if nr == len(sides) - 1: - break - # start new wall segment - tops = [] - self.moveTo(right.margin() + left.margin() + self.spacing) - self.cc(callback, wallcount, y=bottomwidth + self.burn) - wallcount += 1 - bottom(l / 2.) - tops.append(l / 2.) - else: - self.cc(callback, wallcount, y=bottomwidth + self.burn) - wallcount += 1 - bottom(l) - tops.append(l) - self.step(bottomwidth-bottom.endwidth()) - self.edges["X"](c4, h + topwidth + bottomwidth) - self.step(bottom.startwidth()-bottomwidth) - tops.append(c4) - - self.move(overallwidth, overallheight, move) - - def rectangularWall(self, x, y, edges="eeee", - ignore_widths=[], - holesMargin=None, holesSettings=None, - bedBolts=None, bedBoltSettings=None, - callback=None, - move=None, - label=""): - """ - Rectangular wall for all kind of box like objects - - :param x: width - :param y: height - :param edges: (Default value = "eeee") bottom, right, top, left - :param ignore_widths: list of edge_widths added to adjacent edge - :param holesMargin: (Default value = None) - :param holesSettings: (Default value = None) - :param bedBolts: (Default value = None) - :param bedBoltSettings: (Default value = None) - :param callback: (Default value = None) - :param move: (Default value = None) - :param label: rendered to identify parts, it is not meant to be cut or etched (Default value = "") - """ - if len(edges) != 4: - raise ValueError("four edges required") - edges = [self.edges.get(e, e) for e in edges] - edges += edges # append for wrapping around - overallwidth = x + edges[-1].spacing() + edges[1].spacing() - overallheight = y + edges[0].spacing() + edges[2].spacing() - - if self.move(overallwidth, overallheight, move, before=True): - return - - if 7 not in ignore_widths: - self.moveTo(edges[-1].spacing()) - self.moveTo(0, edges[0].margin()) - for i, l in enumerate((x, y, x, y)): - self.cc(callback, i, y=edges[i].startwidth() + self.burn) - e1, e2 = edges[i], edges[i + 1] - if (2*i-1 in ignore_widths or - 2*i-1+8 in ignore_widths): - l += edges[i-1].endwidth() - if 2*i in ignore_widths: - l += edges[i+1].startwidth() - e2 = self.edges["e"] - if 2*i+1 in ignore_widths: - e1 = self.edges["e"] - - edges[i](l, - bedBolts=self.getEntry(bedBolts, i), - bedBoltSettings=self.getEntry(bedBoltSettings, i)) - self.edgeCorner(e1, e2, 90) - - if holesMargin is not None: - self.moveTo(holesMargin, - holesMargin + edges[0].startwidth()) - self.hexHolesRectangle(x - 2 * holesMargin, y - 2 * holesMargin, settings=holesSettings) - - self.move(overallwidth, overallheight, move, label=label) - - def flangedWall(self, x, y, edges="FFFF", flanges=None, r=0.0, - callback=None, move=None, label=""): - """Rectangular wall with flanges extending the regular size - - This is similar to the rectangularWall but it may extend to either - side. Sides with flanges may only have e, E, or F edges - the later - being replaced with fingerHoles. - - :param x: width - :param y: height - :param edges: (Default value = "FFFF") bottom, right, top, left - :param flanges: (Default value = None) list of width of the flanges - :param r: radius of the corners of the flange - :param callback: (Default value = None) - :param move: (Default value = None) - :param label: rendered to identify parts, it is not meant to be cut or etched (Default value = "") - """ - - t = self.thickness - - if not flanges: - flanges = [0.0] * 4 - - while len(flanges) < 4: - flanges.append(0.0) - - edges = [self.edges.get(e, e) for e in edges] - # double to allow looping around - edges = edges + edges - flanges = flanges + flanges - - tw = x + edges[1].spacing() + flanges[1] + edges[3].spacing() + flanges[3] - th = y + edges[0].spacing() + flanges[0] + edges[2].spacing() + flanges[2] - - if self.move(tw, th, move, True): - return - - rl = min(r, max(flanges[-1], flanges[0])) - self.moveTo(rl + edges[-1].margin(), edges[0].margin()) - - for i in range(4): - l = y if i % 2 else x - - rl = min(r, max(flanges[i-1], flanges[i])) - rr = min(r, max(flanges[i], flanges[i+1])) - self.cc(callback, i, x=-rl) - if flanges[i]: - if edges[i] is self.edges["F"] or edges[i] is self.edges["h"]: - self.fingerHolesAt(flanges[i-1]+edges[i-1].endwidth()-rl, 0.5*t+flanges[i], l, - angle=0) - self.edge(l+flanges[i-1]+flanges[i+1]+edges[i-1].endwidth()+edges[i+1].startwidth()-rl-rr) - else: - self.edge(flanges[i-1]+edges[i-1].endwidth()-rl) - edges[i](l) - self.edge(flanges[i+1]+edges[i+1].startwidth()-rr) - self.corner(90, rr) - self.move(tw, th, move, label=label) - - def rectangularTriangle(self, x, y, edges="eee", r=0.0, num=1, - bedBolts=None, bedBoltSettings=None, - callback=None, - move=None, - label=""): - """ - Rectangular triangular wall - - :param x: width - :param y: height - :param edges: (Default value = "eee") bottom, right[, diagonal] - :param r: radius towards the hypotenuse - :param num: (Default value = 1) number of triangles - :param bedBolts: (Default value = None) - :param bedBoltSettings: (Default value = None) - :param callback: (Default value = None) - :param move: (Default value = None) - :param label: rendered to identify parts, it is not meant to be cut or etched (Default value = "") - """ - edges = [self.edges.get(e, e) for e in edges] - if len(edges) == 2: - edges.append(self.edges["e"]) - if len(edges) != 3: - raise ValueError("two or three edges required") - - r = min(r, x, y) - a = math.atan2(y-r, float(x-r)) - alpha = math.degrees(a) - if a > 0: - width = x + (edges[-1].spacing()+self.spacing)/math.sin(a) + edges[1].spacing() + self.spacing - else: - width = x + (edges[-1].spacing()+self.spacing) + edges[1].spacing() + self.spacing - height = y + edges[0].spacing() + edges[2].spacing() * math.cos(a) + 2* self.spacing + self.spacing - if num > 1: - width = 2*width - x + r - self.spacing - dx = width - x - edges[1].spacing() - self.spacing / 2 - dy = edges[0].margin() + self.spacing / 2 - - overallwidth = width * (num // 2 + num % 2) - self.spacing - overallheight = height - self.spacing - - if self.move(overallwidth, overallheight, move, before=True): - return - - if self.debug: - self.rectangularHole(width/2., height/2., width, height) - - self.moveTo(dx - self.spacing / 2, dy - self.spacing / 2) - - for n in range(num): - for i, l in enumerate((x, y)): - self.cc(callback, i, y=edges[i].startwidth() + self.burn) - edges[i](l, - bedBolts=self.getEntry(bedBolts, i), - bedBoltSettings=self.getEntry(bedBoltSettings, i)) - if i==0: - self.edgeCorner(edges[i], edges[i + 1], 90) - self.edgeCorner(edges[i], "e", 90) - - self.corner(alpha, r) - self.cc(callback, 2) - self.step(edges[2].startwidth()) - edges[2](((x-r)**2+(y-r)**2)**0.5) - self.step(-edges[2].endwidth()) - self.corner(90-alpha, r) - self.edge(edges[0].startwidth()) - self.corner(90) - self.ctx.stroke() - - self.moveTo(width-2*dx, height - 2*dy, 180) - if n % 2: - self.moveTo(width) - - self.move(overallwidth, overallheight, move, label=label) - - def trapezoidWall(self, w, h0, h1, edges="eeee", - callback=None, move=None, - label=""): - """ - Rectangular trapezoidal wall - - :param w: width - :param h0: left height - :param h1: right height - :param edges: (Default value = "eee") bottom, right, left - :param callback: (Default value = None) - :param move: (Default value = None) - :param label: rendered to identify parts, it is not meant to be cut or etched (Default value = "") - """ - - edges = [self.edges.get(e, e) for e in edges] - - overallwidth = w + edges[-1].spacing() + edges[1].spacing() - overallheight = max(h0, h1) + edges[0].spacing() - - if self.move(overallwidth, overallheight, move, before=True): - return - - a = math.degrees(math.atan((h1-h0)/w)) - l = ((h0-h1)**2+w**2)**0.5 - - self.moveTo(edges[-1].spacing(), edges[0].margin()) - self.cc(callback, 0, y=edges[0].startwidth()) - edges[0](w) - self.edgeCorner(edges[0], edges[1], 90) - self.cc(callback, 1, y=edges[1].startwidth()) - edges[1](h1) - self.edgeCorner(edges[1], self.edges["e"], 90) - self.corner(a) - self.cc(callback, 2) - edges[2](l) - self.corner(-a) - self.edgeCorner(self.edges["e"], edges[-1], 90) - self.cc(callback, 3, y=edges[-1].startwidth()) - edges[3](h0) - self.edgeCorner(edges[-1], edges[0], 90) - - self.move(overallwidth, overallheight, move, label=label) - - def trapezoidSideWall(self, w, h0, h1, edges="eeee", - radius=0.0, callback=None, move=None, - label=""): - """ - Rectangular trapezoidal wall - - :param w: width - :param h0: left height - :param h1: right height - :param edges: (Default value = "eeee") bottom, right, left - :param radius: (Default value = 0.0) radius of upper corners - :param callback: (Default value = None) - :param move: (Default value = None) - :param label: rendered to identify parts, it is not meant to be cut or etched (Default value = "") - """ - - edges = [self.edges.get(e, e) for e in edges] - - overallwidth = w + edges[-1].spacing() + edges[1].spacing() - overallheight = max(h0, h1) + edges[0].spacing() - - if self.move(overallwidth, overallheight, move, before=True): - return - - r = min(radius, abs(h0-h1)) - ws = w-r - if h0 > h1: - ws += edges[1].endwidth() - else: - ws += edges[3].startwidth() - hs = abs(h1-h0) - r - a = math.degrees(math.atan(hs/ws)) - l = (ws**2+hs**2)**0.5 - - self.moveTo(edges[-1].spacing(), edges[0].margin()) - self.cc(callback, 0, y=edges[0].startwidth()) - edges[0](w) - self.edgeCorner(edges[0], edges[1], 90) - self.cc(callback, 1, y=edges[1].startwidth()) - edges[1](h1) - - if h0 > h1: - self.polyline(0, (90-a, r)) - self.cc(callback, 2) - edges[2](l) - self.polyline(0, (a, r), edges[3].startwidth(), 90) - else: - self.polyline(0, 90, edges[1].endwidth(), (a, r)) - self.cc(callback, 2) - edges[2](l) - self.polyline(0, (90-a, r)) - self.cc(callback, 3, y=edges[-1].startwidth()) - edges[3](h0) - self.edgeCorner(edges[-1], edges[0], 90) - - self.move(overallwidth, overallheight, move, label=label) - - ### polygonWall and friends - - def _polygonWallExtend(self, borders, edges, close=False): - posx, posy = 0, 0 - ext = [ 0.0 ] * 4 - angle = 0 - - def checkpoint(ext, x, y): - ext[0] = min(ext[0], x) - ext[1] = min(ext[1], y) - ext[2] = max(ext[2], x) - ext[3] = max(ext[3], y) - - # trace edge margins - nborders = [] - for i, val in enumerate(borders): - if i % 2: - nborders.append(val) - else: - edge = edges[(i//2)%len(edges)] - margin = edge.margin() - try: - l = val[0] - except TypeError: - l = val - if margin: - nborders.extend([0.0, -90, margin, 90, l, 90, margin, -90, 0.0]) - else: - nborders.append(val) - - borders = nborders - for i in range(len(borders)): - if i % 2: - try: - a, r = borders[i] - except TypeError: - angle = (angle + borders[i]) % 360 - continue - if a > 0: - centerx = posx + r * math.cos(math.radians(angle+90)) - centery = posy + r * math.sin(math.radians(angle+90)) - else: - centerx = posx + r * math.cos(math.radians(angle-90)) - centery = posy + r * math.sin(math.radians(angle-90)) - - for direction in (0, 90, 180, 270): - if (a > 0 and - angle <= direction and (angle + a) % 360 >= direction): - direction -= 90 - elif (a < 0 and - angle >= direction and (angle + a) % 360 <= direction): - direction -= 90 - else: - continue - checkpoint(ext, centerx + r * math.cos(math.radians(direction)), centery + r * math.sin(math.radians(direction))) - #print("%4s %4s %4s %f %f" % (angle, direction+90, angle+a, centerx + r * math.cos(math.radians(direction)), centery + r * math.sin(math.radians(direction)))) - angle = (angle + a) % 360 - if a > 0: - posx = centerx + r * math.cos(math.radians(angle-90)) - posy = centery + r * math.sin(math.radians(angle-90)) - else: - posx = centerx + r * math.cos(math.radians(angle+90)) - posy = centery + r * math.sin(math.radians(angle+90)) - else: - posx += borders[i] * math.cos(math.radians(angle)) - posy += borders[i] * math.sin(math.radians(angle)) - checkpoint(ext, posx, posy) - - return ext - - def _closePolygon(self, borders): - posx, posy = 0, 0 - angle = 0.0 - - if borders and borders[-1] is not None: - return borders - - borders = borders[:-1] - - for i in range(len(borders)): - if i % 2: - try: - a, r = borders[i] - except TypeError: - angle = (angle + borders[i]) % 360 - continue - if a > 0: - centerx = posx + r * math.cos(math.radians(angle+90)) - centery = posy + r * math.sin(math.radians(angle+90)) - else: - centerx = posx + r * math.cos(math.radians(angle-90)) - centery = posy + r * math.sin(math.radians(angle-90)) - - angle = (angle + a) % 360 - if a > 0: - posx = centerx + r * math.cos(math.radians(angle-90)) - posy = centery + r * math.sin(math.radians(angle-90)) - else: - posx = centerx + r * math.cos(math.radians(angle+90)) - posy = centery + r * math.sin(math.radians(angle+90)) - else: - posx += borders[i] * math.cos(math.radians(angle)) - posy += borders[i] * math.sin(math.radians(angle)) - if len(borders) % 2 == 0: - borders.append(0.0) - - a = math.degrees(math.atan2(-posy, -posx)) - #print(a, angle, a - angle) - borders.append((a - angle + 360) % 360) - borders.append((posx**2 + posy**2)**.5) - borders.append(-a) - #print(borders) - return borders - - def polygonWall(self, borders, edge="f", turtle=False, - correct_corners=True, - callback=None, move=None, label=""): - """ - Polygon wall for all kind of multi-edged objects - - :param borders: array of distance and angles to draw - :param edge: (Default value = "f") Edges to apply. If the array of borders contains more segments that edges, the edge will wrap. Only edge types without start and end width supported for now. - :param turtle: (Default value = False) - :param correct_corners: (Default value = True) - :param callback: (Default value = None) - :param move: (Default value = None) - :param label: rendered to identify parts, it is not meant to be cut or etched (Default value = "") - - borders is alternating between length of the edge and angle of the corner. For now neither tabs nor radii are supported. None at the end closes the polygon. - """ - try: - edges = [self.edges.get(e, e) for e in edge] - except TypeError: - edges = [self.edges.get(edge, edge)] - - t = self.thickness # XXX edge.margin() - - borders = self._closePolygon(borders) - - minx, miny, maxx, maxy = self._polygonWallExtend(borders, edges) - - tw, th = maxx - minx, maxy - miny - - if not turtle: - if self.move(tw, th, move, True): - return - - self.moveTo(-minx, -miny) - - length_correction = 0. - for i in range(0, len(borders), 2): - self.cc(callback, i // 2) - self.edge(length_correction) - l = borders[i] - length_correction - next_angle = borders[i+1] - - if (correct_corners and - isinstance(next_angle, (int, float)) and next_angle < 0): - length_correction = t * math.tan(math.radians(-next_angle / 2)) - else: - length_correction = 0.0 - l -= length_correction - edge = edges[(i//2)%len(edges)] - edge(l) - self.edge(length_correction) - self.corner(next_angle, tabs=1) - - if not turtle: - self.move(tw, th, move, label=label) - - @restore - def polygonWalls(self, borders, h, bottom="F", top="F", symmetrical=True): - if not borders: - return - - borders = self._closePolygon(borders) - bottom = self.edges.get(bottom, bottom) - top = self.edges.get(top, top) - t = self.thickness # XXX edge.margin() - - leftsettings = copy.deepcopy(self.edges["f"].settings) - lf, lF, lh = leftsettings.edgeObjects(self, add=False) - rightsettings = copy.deepcopy(self.edges["f"].settings) - rf, rF, rh = rightsettings.edgeObjects(self, add=False) - - length_correction = 0. - angle = borders[-1] - i = 0 - part_cnt = 0 - - self.moveTo(0, bottom.margin()) - while i < len(borders): - if symmetrical: - if part_cnt % 2: - left, right = lf, rf - else: - # last part of an uneven lot - if (part_cnt == (len(borders)//2)-1): - left, right = lF, rf - else: - left, right = lF, rF - else: - left, right = lf, rF - - top_lengths = [] - top_edges = [] - - self.moveTo(left.spacing() + self.spacing, 0) - l = borders[i] - length_correction - leftsettings.setValues(self.thickness, angle=angle) - angle = borders[i+1] - - while isinstance(angle, (tuple, list)): - bottom(l) - angle, radius = angle - lr = abs(math.radians(angle) * radius) - self.edges["X"](lr, h + 2*t) # XXX - top_lengths.append(l) - top_lengths.append(lr) - top_edges.append(top) - top_edges.append("E") - - i += 2 - l = borders[i] - angle = borders[i+1] - - rightsettings.setValues(self.thickness, angle=angle) - if angle < 0: - length_correction = t * math.tan(math.radians(-angle / 2)) - else: - length_correction = 0.0 - l -= length_correction - - bottom(l) - - top_lengths.append(l) - top_edges.append(top) - with self.saved_context(): - self.edgeCorner(bottom, right, 90) - right(h) - self.edgeCorner(right, top, 90) - - top_edges.reverse() - top_lengths.reverse() - edges.CompoundEdge(self, top_edges, top_lengths)(sum(top_lengths)) - self.edgeCorner(top, left, 90) - left(h) - self.edgeCorner(left, bottom, 90) - self.ctx.stroke() - - self.moveTo(right.spacing() + self.spacing) - part_cnt += 1 - i += 2 - - - ################################################## - ### Place Parts - ################################################## - - def partsMatrix(self, n, width, move, part, *l, **kw): - """place many of the same part - - :param n: number of parts - :param width: number of parts in a row (0 for same as n) - :param move: (Default value = "") - :param part: callable that draws a part and knows move param - :param l: params for part - :param kw: keyword params for part - """ - if n <= 0: - return - - if not width: - width = n - - rows = n//width + (1 if n % width else 0) - - if not move: - move = "" - move = move.split() - - #move down / left before - for m in move: - if m == "left": - kw["move"] = "left only" - for i in range(width): - part(*l, **kw) - if m == "down": - kw["move"] = "down only" - for i in range(rows): - part(*l, **kw) - # draw matrix - for i in range(rows): - with self.saved_context(): - for j in range(width): - if "only" in move: - break - if width*i+j >= n: - break - kw["move"] = "right" - part(*l, **kw) - kw["move"] = "up only" - part(*l, **kw) - - # Move back down - if "up" not in move: - kw["move"] = "down only" - for i in range(rows): - part(*l, **kw) - - # Move right - if "right" in move: - kw["move"] = "right only" - for i in range(width): - part(*l, **kw) - - def mirrorX(self, f, offset=0.0): - """Wrap a function to draw mirrored at the y axis - - :param f: function to wrap - :param offset: (default value = 0.0) axis to mirror at - """ - def r(): - self.moveTo(offset, 0) - with self.saved_context(): - self.ctx.scale(-1, 1) - f() - return r - - def mirrorY(self, f, offset=0.0): - """Wrap a function to draw mirrored at the x axis - - :param f: function to wrap - :param offset: (default value = 0.0) axis to mirror at - """ - def r(): - self.moveTo(0, offset) - with self.saved_context(): - self.ctx.scale(1, -1) - f() - return r diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/drawing.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/drawing.py deleted file mode 100644 index 3645772..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/drawing.py +++ /dev/null @@ -1,1051 +0,0 @@ -from __future__ import annotations - -import codecs -import datetime -import io -import math -from typing import Any -from xml.etree import ElementTree as ET - -from affine import Affine - -from boxes.extents import Extents - -EPS = 1e-4 -PADDING = 10 - -RANDOMIZE_COLORS = False # enable to ease check for continuity of paths - - -def reorder_attributes(root) -> None: - """ - Source: https://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.remove - """ - for el in root.iter(): - attrib = el.attrib - if len(attrib) > 1: - # adjust attribute order, e.g. by sorting - attribs = sorted(attrib.items()) - attrib.clear() - attrib.update(attribs) - - -def points_equal(x1, y1, x2, y2): - return abs(x1 - x2) < EPS and abs(y1 - y2) < EPS - - -def pdiff(p1, p2): - x1, y1 = p1 - x2, y2 = p2 - return (x1 - x2, y1 - y2) - - -class Surface: - - scale = 1.0 - invert_y = False - - def __init__(self) -> None: - self.parts: list[Any] = [] - self._p = self.new_part("default") - self.count = 0 - - def set_metadata(self, metadata): - self.metadata = metadata - - def flush(self): - pass - - def finish(self): - pass - - def _adjust_coordinates(self): - extents = self.extents() - extents.xmin -= PADDING - extents.ymin -= PADDING - extents.xmax += PADDING - extents.ymax += PADDING - - m = Affine.translation(-extents.xmin, -extents.ymin) - if self.invert_y: - m = Affine.scale(self.scale, -self.scale) * m - m = Affine.translation(0, self.scale*extents.height) * m - else: - m = Affine.scale(self.scale, self.scale) * m - - self.transform(self.scale, m, self.invert_y) - - return Extents(0, 0, extents.width * self.scale, extents.height * self.scale) - - def render(self, renderer): - renderer.init(**self.args) - for p in self.parts: - p.render(renderer) - renderer.finish() - - def transform(self, f, m, invert_y=False): - for p in self.parts: - p.transform(f, m, invert_y) - - def new_part(self, name="part"): - if self.parts and len(self.parts[-1].pathes) == 0: - return self._p - p = Part(name) - self.parts.append(p) - self._p = p - return p - - def append(self, *path): - self.count += 1 - if self.count > 100000: - raise ValueError("Too many lines") - self._p.append(*path) - - def stroke(self, **params): - return self._p.stroke(**params) - - def move_to(self, *xy): - self._p.move_to(*xy) - - def extents(self): - if not self.parts: - return Extents() - return sum([p.extents() for p in self.parts]) - - -class Part: - def __init__(self, name) -> None: - self.pathes: list[Any] = [] - self.path: list[Any] = [] - - def extents(self): - if not self.pathes: - return Extents() - return sum([p.extents() for p in self.pathes]) - - def transform(self, f, m, invert_y=False): - assert(not self.path) - for p in self.pathes: - p.transform(f, m, invert_y) - - def append(self, *path): - self.path.append(list(path)) - - def stroke(self, **params): - if len(self.path) == 0: - return - # search for path ending at new start coordinates to append this path to - xy0 = self.path[0][1:3] - if (not points_equal(*xy0, *self.path[-1][1:3]) and - not self.path[0][0] == "T"): - for p in reversed(self.pathes): - xy1 = p.path[-1][1:3] - if points_equal(*xy0, *xy1) and p.params == params: - p.path.extend(self.path[1:]) - self.path = [] - return p - p = Path(self.path, params) - self.pathes.append(p) - self.path = [] - return p - - def move_to(self, *xy): - if len(self.path) == 0: - self.path.append(["M", *xy]) - elif self.path[-1][0] == "M": - self.path[-1] = ["M", *xy] - else: - xy0 = self.path[-1][1:3] - if not points_equal(*xy0, *xy): - self.path.append(["M", *xy]) - - -class Path: - def __init__(self, path, params) -> None: - self.path = path - self.params = params - - def __repr__(self) -> str: - l = len(self.path) - # x1,y1 = self.path[0][1:3] - if l>0: - x2, y2 = self.path[-1][1:3] - return f"Path[{l}] to ({x2:.2f},{y2:.2f})" - return f"empty Path" - - def extents(self): - e = Extents() - for p in self.path: - e.add(*p[1:3]) - if p[0] == 'T': - m, text, params = p[3:] - h = params['fs'] - l = len(text) * h * 0.7 - align = params.get('align', 'left') - start, end = { - 'left' : (0, 1), - 'middle' : (-0.5, 0.5), - 'end' : (-1, 0), - }[align] - for x in (start*l, end*l): - for y in (0, h): - x_, y_ = m * (x, y) - e.add(x_, y_) - return e - - def transform(self, f, m, invert_y=False): - self.params["lw"] *= f - for c in self.path: - C = c[0] - c[1], c[2] = m * (c[1], c[2]) - if C == 'C': - c[3], c[4] = m * (c[3], c[4]) - c[5], c[6] = m * (c[5], c[6]) - if C == "T": - c[3] = m * c[3] - if invert_y: - c[3] *= Affine.scale(1, -1) - - def faster_edges(self, inner_corners): - if inner_corners == "backarc": - return - - for (i, p) in enumerate(self.path): - if p[0] == "C" and i > 1 and i < len(self.path) - 1: - if self.path[i - 1][0] == "L" and self.path[i + 1][0] == "L": - p11 = self.path[i - 2][1:3] - p12 = self.path[i - 1][1:3] - p21 = p[1:3] - p22 = self.path[i + 1][1:3] - if (((p12[0]-p21[0])**2 + (p12[1]-p21[1])**2) > - self.params["lw"]**2): - continue - lines_intersect, x, y = line_intersection((p11, p12), (p21, p22)) - if lines_intersect: - self.path[i - 1] = ("L", x, y) - if inner_corners == "loop": - self.path[i] = ("C", x, y, *p12, *p21) - else: - self.path[i] = ("L", x, y) - # filter duplicates - if len(self.path) > 1: # no need to find duplicates if only one element in path - self.path = [p for n, p in enumerate(self.path) if p != self.path[n-1]] - -class Context: - def __init__(self, surface, *al, **ad) -> None: - self._renderer = self._dwg = surface - - self._bounds = Extents() - self._padding = PADDING - - self._stack: list[Any] = [] - self._m = Affine.translation(0, 0) - self._xy = (0, 0) - self._mxy = self._m * self._xy - self._lw = 0 - self._rgb = (0, 0, 0) - self._ff = "sans-serif" - self._fs = 10 - self._last_path = None - - def _update_bounds_(self, mx, my): - self._bounds.update(mx, my) - - def save(self): - self._stack.append( - (self._m, self._xy, self._lw, self._rgb, self._mxy, self._last_path) - ) - self._xy = (0, 0) - - def restore(self): - ( - self._m, - self._xy, - self._lw, - self._rgb, - self._mxy, - self._last_path, - ) = self._stack.pop() - - ## transformations - - def translate(self, x, y): - self._m *= Affine.translation(x, y) - self._xy = (0, 0) - - def scale(self, sx, sy): - self._m *= Affine.scale(sx, sy) - - def rotate(self, r): - self._m *= Affine.rotation(180 * r / math.pi) - - def set_line_width(self, lw): - self._lw = lw - - def set_source_rgb(self, r, g, b): - self._rgb = (r, g, b) - - ## path methods - - def _line_to(self, x, y): - self._add_move() - x1, y1 = self._mxy - self._xy = x, y - x2, y2 = self._mxy = self._m * self._xy - if not points_equal(x1, y1, x2, y2): - self._dwg.append("L", x2, y2) - - def _add_move(self): - self._dwg.move_to(*self._mxy) - - def move_to(self, x, y): - self._xy = (x, y) - self._mxy = self._m * self._xy - - def line_to(self, x, y): - self._line_to(x, y) - - def _arc(self, xc, yc, radius, angle1, angle2, direction): - if abs(angle1 - angle2) < EPS or radius < EPS: - return - x1, y1 = radius * math.cos(angle1) + xc, radius * math.sin(angle1) + yc - x4, y4 = radius * math.cos(angle2) + xc, radius * math.sin(angle2) + yc - - # XXX direction seems not needed for small arcs - ax = x1 - xc - ay = y1 - yc - bx = x4 - xc - by = y4 - yc - q1 = ax * ax + ay * ay - q2 = q1 + ax * bx + ay * by - k2 = 4/3 * ((2 * q1 * q2)**0.5 - q2) / (ax * by - ay * bx) - - x2 = xc + ax - k2 * ay - y2 = yc + ay + k2 * ax - x3 = xc + bx + k2 * by - y3 = yc + by - k2 * bx - - mx1, my1 = self._m * (x1, y1) - mx2, my2 = self._m * (x2, y2) - mx3, my3 = self._m * (x3, y3) - mx4, my4 = self._m * (x4, y4) - mxc, myc = self._m * (xc, yc) - - self._add_move() - self._dwg.append("C", mx4, my4, mx2, my2, mx3, my3) - self._xy = (x4, y4) - self._mxy = (mx4, my4) - - def arc(self, xc, yc, radius, angle1, angle2): - self._arc(xc, yc, radius, angle1, angle2, 1) - - def arc_negative(self, xc, yc, radius, angle1, angle2): - self._arc(xc, yc, radius, angle1, angle2, -1) - - def curve_to(self, x1, y1, x2, y2, x3, y3): - # mx0,my0 = self._m*self._xy - mx1, my1 = self._m * (x1, y1) - mx2, my2 = self._m * (x2, y2) - mx3, my3 = self._m * (x3, y3) - self._add_move() - self._dwg.append("C", mx3, my3, mx1, my1, mx2, my2) # destination first! - self._xy = (x3, y3) - self._mxy = (mx3, my3) - - def stroke(self): - # print('stroke stack-level=',len(self._stack),'lastpath=',self._last_path,) - self._last_path = self._dwg.stroke(rgb=self._rgb, lw=self._lw) - self._xy = (0, 0) - - def fill(self): - self._xy = (0, 0) - raise NotImplementedError() - - def set_font(self, style, bold=False, italic=False): - if style not in ("serif", "sans-serif", "monospaced"): - raise ValueError("Unknown font style") - self._ff = (style, bold, italic) - - def set_font_size(self, fs): - self._fs = fs - - def show_text(self, text, **args): - params = {"ff": self._ff, "fs": self._fs, "lw": self._lw, "rgb": self._rgb} - params.update(args) - mx0, my0 = self._m * self._xy - m = self._m - self._dwg.append("T", mx0, my0, m, text, params) - - def text_extents(self, text): - fs = self._fs - # XXX ugly hack! Fix Boxes.text() ! - return (0, 0, 0.6 * fs * len(text), 0.65 * fs, fs * 0.1, 0) - - def rectangle(self, x, y, width, height): - - # todo: better check for empty path? - self.stroke() - - self.move_to(x, y) - self.line_to(x + width, y) - self.line_to(x + width, y + height) - self.line_to(x, y + height) - self.line_to(x, y) - self.stroke() - - def get_current_point(self): - return self._xy - - def flush(self): - pass - # todo: check, if needed - # self.stroke() - - ## additional methods - def new_part(self): - self._dwg.new_part() - - -class SVGSurface(Surface): - - invert_y = True - - fonts = { - 'serif' : 'TimesNewRoman, "Times New Roman", Times, Baskerville, Georgia, serif', - 'sans-serif' : '"Helvetica Neue", Helvetica, Arial, sans-serif', - 'monospaced' : '"Courier New", Courier, "Lucida Sans Typewriter"' - } - - def _addTag(self, parent, tag, text, first=False): - if first: - t = ET.Element(tag) - else: - t = ET.SubElement(parent, tag) - t.text = text - t.tail = '\n' - if first: - parent.insert(0, t) - return t - - def _add_metadata(self, root): - md = self.metadata - - # Add Inkscape style rdf meta data - root.set("xmlns:dc", "http://purl.org/dc/elements/1.1/") - root.set("xmlns:cc", "http://creativecommons.org/ns#") - root.set("xmlns:rdf","http://www.w3.org/1999/02/22-rdf-syntax-ns#") - - title = "{group} - {name}".format(**md) - date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - - m = self._addTag(root, "metadata", '\n', True) - r = ET.SubElement(m, 'rdf:RDF') - w = ET.SubElement(r, 'cc:Work') - w.text = '\n' - - self._addTag(w, 'dc:title', title) - self._addTag(w, 'dc:date', date) - - if "url" in md and md["url"]: - self._addTag(w, 'dc:source', md["url"]) - self._addTag(w, 'dc:source', md["url_short"]) - else: - self._addTag(w, 'dc:source', md["cli"]) - - desc = md["short_description"] or "" - if "description" in md and md["description"]: - desc += "\n\n" + md["description"] - desc += "\n\nCreated with Boxes.py (https://festi.info/boxes.py)\n" - desc += "Command line: %s\n" % md["cli"] - desc += "Command line short: %s\n" % md["cli_short"] - if md["url"]: - desc += "Url: %s\n" % md["url"] - desc += "Url short: %s\n" % md["url_short"] - desc += "SettingsUrl: %s\n" % md["url"].replace("&render=1", "") - desc += "SettingsUrl short: %s\n" % md["url_short"].replace("&render=1", "") - self._addTag(w, 'dc:description', desc) - - # title - self._addTag(root, "title", md["name"], True) - - # Add XML comment - txt = """ -{name} - {short_description} -""".format(**md) - if md["description"]: - txt += """ - -{description} - -""".format(**md) - txt += """ -Created with Boxes.py (https://festi.info/boxes.py) -Creation date: {date} -""".format(date=date, **md) - - txt += "Command line (remove spaces between dashes): %s\n" % md["cli_short"] - - if md["url"]: - txt += "Url: %s\n" % md["url"] - txt += "Url short: %s\n" % md["url_short"] - txt += "SettingsUrl: %s\n" % md["url"].replace("&render=1", "") - txt += "SettingsUrl short: %s\n" % md["url_short"].replace("&render=1", "") - m = ET.Comment(txt.replace("--", "- -").replace("--", "- -")) # ---- - m.tail = '\n' - root.insert(0, m) - - def finish(self, inner_corners="loop"): - extents = self._adjust_coordinates() - w = extents.width * self.scale - h = extents.height * self.scale - - - nsmap = { - "dc": "http://purl.org/dc/elements/1.1/", - "cc": "http://creativecommons.org/ns#", - "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - "svg": "http://www.w3.org/2000/svg", - "xlink": "http://www.w3.org/1999/xlink", - "inkscape": "http://www.inkscape.org/namespaces/inkscape", - } - ET.register_namespace("", "http://www.w3.org/2000/svg") - ET.register_namespace("xlink", "http://www.w3.org/1999/xlink") - svg = ET.Element('svg', width=f"{w:.2f}mm", height=f"{h:.2f}mm", - viewBox=f"0.0 0.0 {w:.2f} {h:.2f}", - xmlns="http://www.w3.org/2000/svg") - for name, value in nsmap.items(): - svg.set(f"xmlns:{name}", value) - svg.text = "\n" - tree = ET.ElementTree(svg) - - self._add_metadata(svg) - - for i, part in enumerate(self.parts): - if not part.pathes: - continue - g = ET.SubElement(svg, "g", id=f"p-{i}", - style="fill:none;stroke-linecap:round;stroke-linejoin:round;") - g.text = "\n " - g.tail = "\n" - for j, path in enumerate(part.pathes): - p = [] - x, y = 0, 0 - start = None - last = None - path.faster_edges(inner_corners) - for c in path.path: - x0, y0 = x, y - C, x, y = c[0:3] - if C == "M": - if start and points_equal(start[1], start[2], - last[1], last[2]): - p.append("Z") - start = c - p.append(f"M {x:.3f} {y:.3f}") - elif C == "L": - if abs(x - x0) < EPS: - p.append(f"V {y:.3f}") - elif abs(y - y0) < EPS: - p.append(f"H {x:.3f}") - else: - p.append(f"L {x:.3f} {y:.3f}") - elif C == "C": - x1, y1, x2, y2 = c[3:] - p.append( - f"C {x1:.3f} {y1:.3f} {x2:.3f} {y2:.3f} {x:.3f} {y:.3f}" - ) - elif C == "T": - m, text, params = c[3:] - m = m * Affine.translation(0, -params['fs']) - tm = " ".join(f"{m[i]:.3f}" for i in (0, 3, 1, 4, 2, 5)) - font, bold, italic = params['ff'] - fontweight = ("normal", "bold")[bool(bold)] - fontstyle = ("normal", "italic")[bool(italic)] - - style = f"font-family: {font} ; font-weight: {fontweight}; font-style: {fontstyle}; fill: {rgb_to_svg_color(*params['rgb'])}" - t = ET.SubElement(g, "text", - #x=f"{x:.3f}", y=f"{y:.3f}", - transform=f"matrix( {tm} )", - style=style) - t.text = text - t.set("font-size", f"{params['fs']}px") - t.set("text-anchor", params.get('align', 'left')) - t.set("dominant-baseline", 'hanging') - else: - print("Unknown", c) - - last = c - - if start and start is not last and \ - points_equal(start[1], start[2], last[1], last[2]): - p.append("Z") - color = ( - random_svg_color() - if RANDOMIZE_COLORS - else rgb_to_svg_color(*path.params["rgb"]) - ) - if p and p[-1][0] == "M": - p.pop() - if p: # might be empty if only contains text - t = ET.SubElement(g, "path", d=" ".join(p), stroke=color) - t.set("stroke-width", f'{path.params["lw"]:.2f}') - t.tail = "\n " - t.tail = "\n" - reorder_attributes(tree) - f = io.BytesIO() - tree.write(f, encoding="utf-8", xml_declaration=True, method="xml") - f.seek(0) - return f - -class PSSurface(Surface): - - scale = 72 / 25.4 # 72 dpi - - fonts = { - ('serif', False, False) : 'Times-Roman', - ('serif', False, True) : 'Times-Italic', - ('serif', True, False) : 'Times-Bold', - ('serif', True, True) : 'Times-BoldItalic', - ('sans-serif', False, False) : 'Helvetica', - ('sans-serif', False, True) : 'Helvetica-Oblique', - ('sans-serif', True, False) : 'Helvetica-Bold', - ('sans-serif', True, True) : 'Helvetica-BoldOblique', - ('monospaced', False, False) : 'Courier', - ('monospaced', False, True) : 'Courier-Oblique', - ('monospaced', True, False) : 'Courier-Bold', - ('monospaced', True, True) : 'Courier-BoldOblique', - } - - def _metadata(self): - md = self.metadata - - desc = "" - desc += "%%Title: Boxes.py - {group} - {name}\n".format(**md) - desc += f'%%CreationDate: {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}\n' - desc += f'%%Keywords: boxes.py, laser, laser cutter\n' - desc += f'%%Creator: {md.get("url") or md["cli"]}\n' - desc += "%%CreatedBy: Boxes.py (https://festi.info/boxes.py)\n" - for line in (md["short_description"] or "").split("\n"): - desc += "%% %s\n" % line - desc += "%\n" - if "description" in md and md["description"]: - desc += "%\n" - for line in md["description"].split("\n"): - desc += "%% %s\n" % line - desc += "%\n" - - desc += "%% Command line: %s\n" % md["cli"] - desc += "%% Command line short: %s\n" % md["cli_short"] - if md["url"]: - desc += f'%%Url: {md["url"]}\n' - desc += f'%%Url short: {md["url_short"]}\n' - desc += f'%%SettingsUrl: {md["url"].replace("&render=1", "")}\n' - desc += f'%%SettingsUrl short: {md["url_short"].replace("&render=1", "")}\n' - return desc - - def finish(self, inner_corners="loop"): - - extents = self._adjust_coordinates() - w = extents.width - h = extents.height - - data = io.BytesIO() - f = codecs.getwriter('utf-8')(data) - - f.write(f"""%!PS-Adobe-2.0 EPSF-2.0 -%%BoundingBox: 0 0 {w:.0f} {h:.0f} -{self._metadata()} -%%EndComments - -1 setlinecap -1 setlinejoin -0.0 0.0 0.0 setrgbcolor -""") - f.write(""" -/ReEncode { % inFont outFont encoding | - - /MyEncoding exch def - exch findfont - dup length dict - begin - {def} forall - /Encoding MyEncoding def - currentdict - end - definefont -} def - -""") - for font in self.fonts.values(): - f.write(f"/{font} /{font}-Latin1 ISOLatin1Encoding ReEncode\n") - # f.write(f"%%DocumentMedia: \d+x\d+mm ((\d+) (\d+)) 0 \(" - # dwg['width']=f'{w:.2f}mm' - # dwg['height']=f'{h:.2f}mm' - - for i, part in enumerate(self.parts): - if not part.pathes: - continue - for j, path in enumerate(part.pathes): - p = [] - x, y = 0, 0 - path.faster_edges(inner_corners) - - for c in path.path: - x0, y0 = x, y - C, x, y = c[0:3] - if C == "M": - p.append(f"{x:.3f} {y:.3f} moveto") - elif C == "L": - p.append(f"{x:.3f} {y:.3f} lineto") - elif C == "C": - x1, y1, x2, y2 = c[3:] - p.append( - f"{x1:.3f} {y1:.3f} {x2:.3f} {y2:.3f} {x:.3f} {y:.3f} curveto" - ) - elif C == "T": - m, text, params = c[3:] - tm = " ".join(f"{m[i]:.3f}" for i in (0, 3, 1, 4, 2, 5)) - text = text.replace("(", r"\(").replace(")", r"\)") - color = " ".join(f"{c:.2f}" for c in params["rgb"]) - align = params.get('align', 'left') - f.write(f"/{self.fonts[params['ff']]}-Latin1 findfont\n") - f.write(f"{params['fs']} scalefont\n") - f.write("setfont\n") - #f.write(f"currentfont /Encoding ISOLatin1Encoding put\n") - f.write(f"{color} setrgbcolor\n") - f.write("matrix currentmatrix") # save current matrix - f.write(f"[ {tm} ] concat\n") - if align == "left": - f.write(f"0.0\n") - else: - f.write(f"({text}) stringwidth pop ") - if align == "middle": - f.write(f"-0.5 mul\n") - else: # end - f.write(f"neg\n") - # offset y by descender - f.write("currentfont dup /FontBBox get 1 get \n") - f.write("exch /FontMatrix get 3 get mul neg moveto \n") - - f.write(f"({text}) show\n") # text created by dup above - f.write("setmatrix\n\n") # restore matrix - else: - print("Unknown", c) - color = ( - random_svg_color() - if RANDOMIZE_COLORS - else rgb_to_svg_color(*path.params["rgb"]) - ) - if p: # todo: might be empty since text is not implemented yet - color = " ".join(f"{c:.2f}" for c in path.params["rgb"]) - f.write("newpath\n") - f.write("\n".join(p)) - f.write("\n") - f.write(f"{path.params['lw']} setlinewidth\n") - f.write(f"{color} setrgbcolor\n") - f.write("stroke\n\n") - f.write( - """ -showpage -%%Trailer -%%EOF -""" - ) - data.seek(0) - return data - -class LBRN2Surface(Surface): - - - invert_y = False - dbg = False - - fonts = { - 'serif' : 'Times New Roman', - 'sans-serif' : 'Arial', - 'monospaced' : 'Courier New' - } - - lbrn2_colors=[ - 0, # Colors.OUTER_CUT (BLACK) --> Lightburn C00 (black) - 1, # Colors.INNER_CUT (BLUE) --> Lightburn C01 (blue) - 3, # Colors.ETCHING (GREEN) --> Lightburn C02 (green) - 6, # Colors.ETCHING_DEEP (CYAN) --> Lightburn C06 (cyan) - 30, # Colors.ANNOTATIONS (RED) --> Lightburn T1 - 7, # Colors.OUTER_CUT (MAGENTA) --> Lightburn C07 (magenta) - 4, # Colors.OUTER_CUT (YELLOW) --> Lightburn C04 (yellow) - 8, # Colors.OUTER_CUT (WHITE) --> Lightburn C08 (grey) - ] - - def finish(self, inner_corners="loop"): - if self.dbg: print("LBRN2 save") - extents = self._adjust_coordinates() - w = extents.width * self.scale - h = extents.height * self.scale - - svg = ET.Element('LightBurnProject', AppVersion="1.0.06", FormatVersion="1", MaterialHeight="0", MirrorX="False", MirrorY="False") - svg.text = "\n" - num = 0 - txtOffset = {} - - tree = ET.ElementTree(svg) - if self.dbg: print ("8", num) - - cs = ET.SubElement(svg, "CutSetting", Type="Cut") - index = ET.SubElement(cs, "index", Value="3") # green layer (ETCHING) - name = ET.SubElement(cs, "name", Value="Etch") - priority = ET.SubElement(cs, "priority", Value="0") # is cut first - - cs = ET.SubElement(svg, "CutSetting", Type="Cut") - index = ET.SubElement(cs, "index", Value="6") # cyan layer (ETCHING_DEEP) - name = ET.SubElement(cs, "name", Value="Deep Etch") - priority = ET.SubElement(cs, "priority", Value="1") # is cut second - - cs = ET.SubElement(svg, "CutSetting", Type="Cut") - index = ET.SubElement(cs, "index", Value="7") # magenta layer (MAGENTA) - name = ET.SubElement(cs, "name", Value="C07") - priority = ET.SubElement(cs, "priority", Value="2") # is cut third - - cs = ET.SubElement(svg, "CutSetting", Type="Cut") - index = ET.SubElement(cs, "index", Value="4") # yellow layer (YELLOW) - name = ET.SubElement(cs, "name", Value="C04") - priority = ET.SubElement(cs, "priority", Value="3") # is cut third - - cs = ET.SubElement(svg, "CutSetting", Type="Cut") - index = ET.SubElement(cs, "index", Value="8") # grey layer (WHITE) - name = ET.SubElement(cs, "name", Value="C08") - priority = ET.SubElement(cs, "priority", Value="4") # is cut fourth - - cs = ET.SubElement(svg, "CutSetting", Type="Cut") - index = ET.SubElement(cs, "index", Value="1") # blue layer (INNER_CUT) - name = ET.SubElement(cs, "name", Value="Inner Cut") - priority = ET.SubElement(cs, "priority", Value="5") # is cut fifth - - cs = ET.SubElement(svg, "CutSetting", Type="Cut") - index = ET.SubElement(cs, "index", Value="0") # black layer (OUTER_CUT) - name = ET.SubElement(cs, "name", Value="Outer Cut") - priority = ET.SubElement(cs, "priority", Value="6") # is cut sixth - - cs = ET.SubElement(svg, "CutSetting", Type="Tool") - index = ET.SubElement(cs, "index", Value="30") # T1 layer (ANNOTATIONS) - name = ET.SubElement(cs, "name", Value="T1") # tool layer do not support names - priority = ET.SubElement(cs, "priority", Value="7") # is not cut at all - - for i, part in enumerate(self.parts): - if self.dbg: print ("7", num) - if not part.pathes: - continue - gp = ET.SubElement(svg, "Shape", Type="Group") - gp.text = "\n " - gp.tail = "\n" - children = ET.SubElement(gp, "Children") - children.text = "\n " - children.tail = "\n" - - for j, path in enumerate(part.pathes): - myColor = self.lbrn2_colors[4*int(path.params["rgb"][0])+2*int(path.params["rgb"][1])+int(path.params["rgb"][2])] - - p = [] - x, y = 0, 0 - C = "" - start = None - last = None - path.faster_edges(inner_corners) - num = 0 - cnt = 1 - end = len(path.path) - 1 - if self.dbg: - for c in path.path: - print ("6",num, c) - num += 1 - num = 0 - - c = path.path[num] - C, x, y = c[0:3] - if self.dbg: - print("end:", end) - while num < end or (C == "T" and num <= end): # len(path.path): - if self.dbg: - print("0", num) - c = path.path[num] - if self.dbg: print("first: ", num, c) - - C, x, y = c[0:3] - if C == "M": - if self.dbg: print ("1", num) - sh = ET.SubElement(children, "Shape", Type="Path", CutIndex=str(myColor)) - sh.text = "\n " - sh.tail = "\n" - vl = ET.SubElement(sh, "VertList") - vl.text = f"V{x:.3f} {y:.3f}c0x1c1x1" - vl.tail = "\n" - pl = ET.SubElement(sh, "PrimList") - pl.text = ""#f"L{cnt} {cnt+1}" - pl.tail = "\n" - start = c - x0, y0 = x, y - # do something with M - done = False - bspline = False - while done == False and num < end: # len(path.path): - num += 1 - c = path.path[num] - if self.dbg: print ("next: ",num, c) - C, x, y = c[0:3] - if C == "M": - if start and points_equal(start[1], start[2], x, y): - pl.text = "LineClosed" - start = c - cnt = 1 - if self.dbg: print ("next, because M") - done = True - elif C == "T": - if self.dbg: print ("next, because T") - done = True - else: - if C == "L": - vl.text+=(f"V{x:.3f} {y:.3f}c0x1c1x1") - pl.text += f"L{cnt-1} {cnt}" - cnt +=1 - elif C == "C": - x1, y1, x2, y2 = c[3:] - if self.dbg: print ("C: ",x0, y0, x1, y1, x, y, x2, y2) - vl.text+=(f"V{x0:.3f} {y0:.3f}c0x{(x1):.3f}c0y{(y1):.3f}c1x1V{x:.3f} {y:.3f}c0x1c1x{(x2):.3f}c1y{(y2):.3f}") - pl.text += f"L{cnt-1} {cnt}B{cnt} {cnt+1}" - cnt +=2 - bspline = True - else: - print("unknown", c) - if done == False: - x0, y0 = x, y - - if start and points_equal(start[1], start[2], x0, y0): - if bspline == False: - pl.text = "LineClosed" - start = c - if self.dbg: print ("2", num) - elif C == "T": - cnt = 1 - #C = "" - if self.dbg: print ("3", num) - m, text, params = c[3:] - m = m * Affine.translation(0, params['fs']) - if self.dbg: print ("T: ",x, y, c) - num += 1 - font, bold, italic = params['ff'] - if params.get('font', 'Arial')=='Arial': - f = self.fonts[font] - else: - f = params.get('font', 'Arial') - fontColor = self.lbrn2_colors[4*int(params["rgb"][0])+2*int(params["rgb"][1])+int(params["rgb"][2])] - - #alignment can be left|middle|end - if params.get('align', 'left')=='middle': - hor = '1' - else: - if params.get('align', 'left')=='end': - hor = '2' - else: - hor = '0' - ver = 1 # vertical is always bottom, text is shifted in box class - - pos = text.find('%') - offs = 0 - if pos >- 1: - if self.dbg: print ("p: ", pos, text[pos+1:pos+3]) - texttype = '2' - if self.dbg: print("l ", len(text[pos+1:pos+3])) - if text[pos+1:pos+2].isnumeric(): - if self.dbg: print ("t0", text[pos+1:pos+3]) - if text[pos+1:pos+3].isnumeric() and len(text[pos+1:pos+3]) == 2: - if self.dbg: print ("t1") - if text[pos:pos+3] in txtOffset: - if self.dbg: print ("t2") - offs = txtOffset[text[pos:pos+3]] + 1 - else: - if self.dbg: print ("t3") - offs = 0 - txtOffset[text[pos:pos+3]] = offs - else: - if self.dbg: print ("t4") - if text[pos:pos+2] in txtOffset: - if self.dbg: print ("t5") - offs = txtOffset[text[pos:pos+2]] + 1 - else: - offs = 0 - if self.dbg: print ("t6") - txtOffset[text[pos:pos+2]] = offs - else: - if self.dbg: print ("t7") - texttype = '0' - else: - texttype = '0' - if self.dbg: print ("t8") - if self.dbg: print ("o: ", text, txtOffset, offs) - - if not text: - if self.dbg: print ("T: text with empty string - ",x, y, c) - else: - sh = ET.SubElement(children, "Shape", Type="Text", CutIndex=str(fontColor), Font=f"{f}", H=f"{(params['fs']*1.75*0.6086434):.3f}", Str=f"{text}", Bold=f"{'1' if bold else '0'}", Italic=f"{'1' if italic else '0'}", Ah=f"{str(hor)}", Av=f"{str(ver)}", Eval=f"{texttype}", VariableOffset=f"{str(offs)}") # 1mm = 1.75 Lightburn H units - sh.text = "\n " - sh.tail = "\n" - xf = ET.SubElement(sh, "XForm") - xf.text = " ".join(f"{m[i]:.3f}" for i in (0, 3, 1, 4, 2, 5)) - xf.tail = "\n" - else: - if self.dbg: print ("4", num) - print ("next, because not M") - num += 1 - - url = self.metadata["url"].replace("&render=1", "") # remove render argument to get web form again - - pl = ET.SubElement(svg, "Notes", ShowOnLoad="1", Notes="File created by Boxes.py script, programmed by Florian Festi.\nLightburn output by Klaus Steinhammer.\n\nURL with settings:\n" + str(url)) - pl.text = "" - pl.tail = "\n" - - if self.dbg: print ("5", num) - f = io.BytesIO() - tree.write(f, encoding="utf-8", xml_declaration=True, method="xml") - f.seek(0) - return f - -from random import random - - -def random_svg_color(): - r, g, b = random(), random(), random() - return f"rgb({r*255:.0f},{g*255:.0f},{b*255:.0f})" - - -def rgb_to_svg_color(r, g, b): - return f"rgb({r*255:.0f},{g*255:.0f},{b*255:.0f})" - - -def line_intersection(line1, line2): - - xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0]) - ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) - - def det(a, b): - return a[0] * b[1] - a[1] * b[0] - - div = det(xdiff, ydiff) - if div == 0: - # todo: deal with parallel line intersection / overlay - return False, None, None - - d = (det(*line1), det(*line2)) - x = det(d, xdiff) / div - y = det(d, ydiff) / div - - on_segments = ( - (x + EPS >= min(line1[0][0], line1[1][0])), - (x + EPS >= min(line2[0][0], line2[1][0])), - (x - EPS <= max(line1[0][0], line1[1][0])), - (x - EPS <= max(line2[0][0], line2[1][0])), - (y + EPS >= min(line1[0][1], line1[1][1])), - (y + EPS >= min(line2[0][1], line2[1][1])), - (y - EPS <= max(line1[0][1], line1[1][1])), - (y - EPS <= max(line2[0][1], line2[1][1])), - ) - - return min(on_segments), x, y diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/edges.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/edges.py deleted file mode 100644 index 18f6643..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/edges.py +++ /dev/null @@ -1,2666 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -from __future__ import annotations - -import argparse -import inspect -import math -import re -from abc import ABC, abstractmethod -from typing import Any - -from boxes import gears - - -def argparseSections(s: str) -> list[float]: - """ - Parse sections parameter - - :param s: string to parse - """ - - result: list[float] = [] - - parse = re.split(r"\s|:", s) - - try: - for part in parse: - m = re.match(r"^(\d+(\.\d+)?)/(\d+)$", part) - if m: - n = int(m.group(3)) - result.extend([float(m.group(1)) / n] * n) - continue - m = re.match(r"^(\d+(\.\d+)?)\*(\d+)$", part) - if m: - n = int(m.group(3)) - result.extend([float(m.group(1))] * n) - continue - result.append(float(part)) - except ValueError: - raise argparse.ArgumentTypeError("Don't understand sections string") - - if not result: - result.append(0.0) - - return result - - -def getDescriptions() -> dict: - d = {edge.char: edge.description for edge in globals().values() - if inspect.isclass(edge) and issubclass(edge, BaseEdge) - and edge.char} - d['j'] = d['i'] + " (other end)" - d['J'] = d['I'] + " (other end)" - d['k'] = d['i'] + " (both ends)" - d['K'] = d['I'] + " (both ends)" - d['O'] = d['o'] + ' (other end)' - d['P'] = d['p'] + ' (other end)' - d['U'] = d['u'] + ' top side' - d['v'] = d['u'] + ' for 90° lid' - d['V'] = d['u'] + ' 90° lid' - return d - - -class BoltPolicy(ABC): - """Abstract class - - Distributes (bed) bolts on a number of segments - (fingers of a finger joint) - """ - - def drawbolt(self, pos) -> bool: - """Add a bolt to this segment? - - :param pos: number of the finger - """ - return False - - def numFingers(self, numFingers: int) -> int: - """Return next smaller, possible number of fingers - - :param numFingers: number of fingers to aim for - """ - return numFingers - - def _even(self, numFingers: int) -> int: - """ - Return same or next smaller even number - - :param numFingers: - """ - return (numFingers // 2) * 2 - - def _odd(self, numFingers: int) -> int: - """ - Return same or next smaller odd number - - :param numFingers: - """ - if numFingers % 2: - return numFingers - return numFingers - 1 - - -class Bolts(BoltPolicy): - """Distribute a fixed number of bolts evenly""" - - def __init__(self, bolts: int = 1) -> None: - self.bolts = bolts - - def numFingers(self, numFingers: int) -> int: - if self.bolts % 2: - self.fingers = self._even(numFingers) - else: - self.fingers = numFingers - - return self.fingers - - def drawBolt(self, pos): - """ - Return if this finger needs a bolt - - :param pos: number of this finger - """ - if pos > self.fingers // 2: - pos = self.fingers - pos - - if pos == 0: - return False - - if pos == self.fingers // 2 and not (self.bolts % 2): - return False - - return (math.floor((float(pos) * (self.bolts + 1) / self.fingers) - 0.01) != - math.floor((float(pos + 1) * (self.bolts + 1) / self.fingers) - 0.01)) - - -############################################################################# -### Settings -############################################################################# - -class Settings: - """Generic Settings class - - Used by different other classes to store measurements and details. - Supports absolute values and settings that grow with the thickness - of the material used. - - Overload the absolute_params and relative_params class attributes with - the supported keys and default values. The values are available via - attribute access. - """ - absolute_params: dict[str, Any] = {} # TODO find better typing. - relative_params: dict[str, Any] = {} # TODO find better typing. - - @classmethod - def parserArguments(cls, parser, prefix=None, **defaults): - prefix = prefix or cls.__name__[:-len("Settings")] - - lines = cls.__doc__.split("\n") - - # Parse doc string - descriptions = {} - r = re.compile(r"^ +\* +(\S+) +: .* : +(.*)") - for l in lines: - m = r.search(l) - if m: - descriptions[m.group(1)] = m.group(2) - - group = parser.add_argument_group(lines[0] or lines[1]) - group.prefix = prefix - for name, default in (sorted(cls.absolute_params.items()) + - sorted(cls.relative_params.items())): - # Handle choices - choices = None - if isinstance(default, tuple): - choices = default - t = type(default[0]) - for val in default: - if (type(val) is not t or - type(val) not in (bool, int, float, str)): - raise ValueError("Type not supported: %r", val) - default = default[0] - - # Overwrite default - if name in defaults: - default = type(default)(defaults[name]) - - if type(default) not in (bool, int, float, str): - raise ValueError("Type not supported: %r", default) - if type(default) is bool: - from boxes import BoolArg - t = BoolArg() - else: - t = type(default) - - group.add_argument(f"--{prefix}_{name}", - type=t, - action="store", default=default, - choices=choices, - help=descriptions.get(name)) - - def __init__(self, thickness, relative: bool = True, **kw) -> None: - self.values = {} - for name, value in self.absolute_params.items(): - if isinstance(value, tuple): - value = value[0] - if type(value) not in (bool, int, float, str): - raise ValueError("Type not supported: %r", value) - self.values[name] = value - - self.thickness = thickness - factor = 1.0 - if relative: - factor = thickness - for name, value in self.relative_params.items(): - self.values[name] = value * factor - self.setValues(thickness, relative, **kw) - - def edgeObjects(self, boxes, chars: str = "", add: bool = True): - """ - Generate Edge objects using this kind of settings - - :param boxes: Boxes object - :param chars: sequence of chars to be used by Edge objects - :param add: add the resulting Edge objects to the Boxes object's edges - """ - edges: list[Any] = [] - return self._edgeObjects(edges, boxes, chars, add) - - def _edgeObjects(self, edges, boxes, chars: str, add: bool): - for i, edge in enumerate(edges): - try: - char = chars[i] - edge.char = char - except IndexError: - pass - except TypeError: - pass - if add: - boxes.addParts(edges) - return edges - - def setValues(self, thickness, relative: bool = True, **kw): - """ - Set values - - :param thickness: thickness of the material used - :param relative: Do scale by thickness (Default value = True) - :param kw: parameters to set - """ - factor = 1.0 - if relative: - factor = thickness - for name, value in kw.items(): - if name in self.absolute_params: - self.values[name] = value - elif name in self.relative_params: - self.values[name] = value * factor - else: - raise ValueError(f"Unknown parameter for {self.__class__.__name__}: {name}") - self.checkValues() - - def checkValues(self) -> None: - """ - Check if all values are in the right range. Raise ValueError if needed. - """ - pass - - def __getattr__(self, name): - if "values" in self.__dict__ and name in self.values: - return self.values[name] - raise AttributeError - - -############################################################################# -### Edges -############################################################################# - - -class BaseEdge(ABC): - """Abstract base class for all Edges""" - char: str | None = None - description: str = "Abstract Edge Class" - - def __init__(self, boxes, settings) -> None: - self.boxes = boxes - self.ctx = boxes.ctx - self.settings = settings - - def __getattr__(self, name): - """Hack for using unalter code form Boxes class""" - return getattr(self.boxes, name) - - @abstractmethod - def __call__(self, length, **kw): - pass - - def startwidth(self) -> float: - """Amount of space the beginning of the edge is set below the inner space of the part """ - return 0.0 - - def endwidth(self) -> float: - return self.startwidth() - - def margin(self) -> float: - """Space needed right of the starting point""" - return 0.0 - - def spacing(self) -> float: - """Space the edge needs outside of the inner space of the part""" - return self.startwidth() + self.margin() - - def startAngle(self) -> float: - """Not yet supported""" - return 0.0 - - def endAngle(self) -> float: - """Not yet supported""" - return 0.0 - - -class Edge(BaseEdge): - """Straight edge""" - char = 'e' - description = "Straight Edge" - positive = False - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - """Draw edge of length mm""" - if bedBolts: - # distribute the bolts equidistantly - interval_length = length / bedBolts.bolts - if self.positive: - d = (bedBoltSettings or self.bedBoltSettings)[0] - for i in range(bedBolts.bolts): - self.hole(0.5 * interval_length, - 0.5 * self.thickness, 0.5 * d) - self.edge(interval_length, tabs= - (i == 0 or i == bedBolts.bolts - 1)) - else: - for i in range(bedBolts.bolts): - self.bedBoltHole(interval_length, bedBoltSettings, tabs= - (i == 0 or i == bedBolts.bolts - 1)) - else: - self.edge(length, tabs=2) - - -class OutSetEdge(Edge): - """Straight edge out set by one thickness""" - char = 'E' - description = "Straight Edge (outset by thickness)" - positive = True - - def startwidth(self) -> float: - return self.settings if self.settings is not None else self.boxes.thickness - - -############################################################################# -#### MountingEdge -############################################################################# - -class MountingSettings(Settings): - """Settings for Mounting Edge -Values: -* absolute_params - - * style : "straight edge, within" : edge style - * side : "back" : side of box (not all valid configurations make sense...) - * num : 2 : number of mounting holes (integer) - * margin : 0.125 : minimum space left and right without holes (fraction of the edge length) - * d_shaft : 3.0 : shaft diameter of mounting screw (in mm) - * d_head : 6.5 : head diameter of mounting screw (in mm) -""" - - PARAM_IN = "straight edge, within" - PARAM_EXT = "straight edge, extended" - PARAM_TAB = "mounting tab" - - PARAM_LEFT = "left" - PARAM_BACK = "back" - PARAM_RIGHT = "right" - PARAM_FRONT = "front" - - absolute_params = { - "style": (PARAM_IN, PARAM_EXT, PARAM_TAB), - "side": (PARAM_BACK, PARAM_LEFT, PARAM_RIGHT, PARAM_FRONT), - "num": 2, - "margin": 0.125, - "d_shaft": 3.0, - "d_head": 6.5 - } - - def edgeObjects(self, boxes, chars: str = "G", add: bool = True): - edges = [MountingEdge(boxes, self)] - return self._edgeObjects(edges, boxes, chars, add) - - -class MountingEdge(BaseEdge): - description = """Edge with pear shaped mounting holes""" # for slide-on mounting using flat-head screws""" - char = 'G' - - def margin(self) -> float: - if self.settings.style == MountingSettings.PARAM_TAB: - return 2.75 * self.boxes.thickness + self.settings.d_head - return 0.0 - - def startwidth(self) -> float: - if self.settings.style == MountingSettings.PARAM_EXT: - return 2.5 * self.boxes.thickness + self.settings.d_head - return 0.0 - - def __call__(self, length, **kw): - if length == 0.0: - return - - def check_bounds(val, mn, mx, name): - if not mn <= val <= mx: - raise ValueError(f"MountingEdge: {name} needs to be in [{mn}, {mx}] but is {val}") - - style = self.settings.style - margin = self.settings.margin - num = self.settings.num - ds = self.settings.d_shaft - dh = self.settings.d_head - if dh > 0: - width = 3 * self.thickness + dh - else: - width = ds - - if num != int(num): - raise ValueError(f"MountingEdge: num needs to be an integer number") - - check_bounds(margin, 0, 0.5, "margin") - if not dh == 0: - if not dh > ds: - raise ValueError(f"MountingEdge: d_shaft needs to be in 0 or > {ds}, but is {dh}") - - # Check how many holes fit - count = max(1, int(num)) - if count > 1: - margin_ = length * margin - gap = (length - 2 * margin_ - width * count) / (count - 1) - if gap < width: - count = int(((length - 2 * margin + width) / (2 * width)) - 0.5) - if count < 1: - self.edge(length) - return - if count < 2: - margin_ = (length - width) / 2 - gap = 0 - else: - gap = (length - 2 * margin_ - width * count) / (count - 1) - else: - margin_ = (length - width) / 2 - gap = 0 - - if style == MountingSettings.PARAM_TAB: - - # The edge until the first groove - self.edge(margin_, tabs=1) - - for i in range(count): - if i > 0: - self.edge(gap) - self.corner(-90, self.thickness / 2) - self.edge(dh + 1.5 * ds - self.thickness / 4 - dh / 2) - self.corner(90, self.thickness + dh / 2) - self.corner(-90) - self.corner(90) - self.mountingHole(0, self.thickness * 1.25 + ds / 2, ds, dh, -90) - self.corner(90, self.thickness + dh / 2) - self.edge(dh + 1.5 * ds - self.thickness / 4 - dh / 2) - self.corner(-90, self.thickness / 2) - - # The edge until the end - self.edge(margin_, tabs=1) - else: - x = margin_ - for i in range(count): - x += width / 2 - self.mountingHole(x, ds / 2 + self.thickness * 1.5, ds, dh, -90) - x += width / 2 - x += gap - self.edge(length) - - -############################################################################# -#### GroovedEdge -############################################################################# - -class GroovedSettings(Settings): - """Settings for Grooved Edge -Values: - -* absolute_params - - * style : "arc" : the style of grooves - * tri_angle : 30 : the angle of triangular cuts - * arc_angle : 120 : the angle of arc cuts - * width : 0.2 : the width of each groove (fraction of the edge length) - * gap : 0.1 : the gap between grooves (fraction of the edge length) - * margin : 0.3 : minimum space left and right without grooves (fraction of the edge length) - * inverse : False : invert the groove directions - * interleave : False : alternate the direction of grooves -""" - - PARAM_ARC = "arc" - PARAM_FLAT = "flat" - PARAM_SOFTARC = "softarc" - PARAM_TRIANGLE = "triangle" - - absolute_params = { - "style": (PARAM_ARC, PARAM_FLAT, PARAM_TRIANGLE, PARAM_SOFTARC), - "tri_angle": 30, - "arc_angle": 120, - "width": 0.2, - "gap": 0.1, - "margin": 0.3, - "inverse": False, - "interleave": False, - } - - def edgeObjects(self, boxes, chars: str = "zZ", add: bool = True): - edges = [GroovedEdge(boxes, self), - GroovedEdgeCounterPart(boxes, self)] - return self._edgeObjects(edges, boxes, chars, add) - - -class GroovedEdgeBase(BaseEdge): - def is_inverse(self) -> bool: - return self.settings.inverse != self.inverse - - def groove_arc(self, width, angle: float = 90.0, inv: float = -1.0) -> None: - side_length = width / math.sin(math.radians(angle)) / 2 - self.corner(inv * -angle) - self.corner(inv * angle, side_length) - self.corner(inv * angle, side_length) - self.corner(inv * -angle) - - def groove_soft_arc(self, width, angle: float = 60.0, inv: float = -1.0) -> None: - side_length = width / math.sin(math.radians(angle)) / 4 - self.corner(inv * -angle, side_length) - self.corner(inv * angle, side_length) - self.corner(inv * angle, side_length) - self.corner(inv * -angle, side_length) - - def groove_triangle(self, width, angle: float = 45.0, inv: float = -1.0) -> None: - side_length = width / math.cos(math.radians(angle)) / 2 - self.corner(inv * -angle) - self.edge(side_length) - self.corner(inv * 2 * angle) - self.edge(side_length) - self.corner(inv * -angle) - - def __call__(self, length, **kw): - if length == 0.0: - return - - def check_bounds(val, mn, mx, name): - if not mn <= val <= mx: - raise ValueError(f"{name} needs to be in [{mn}, {mx}] but is {val}") - - style = self.settings.style - width = self.settings.width - margin = self.settings.margin - gap = self.settings.gap - interleave = self.settings.interleave - - check_bounds(width, 0, 1, "width") - check_bounds(margin, 0, 0.5, "margin") - check_bounds(gap, 0, 1, "gap") - - # Check how many grooves fit - count = max(0, int((1 - 2 * margin + gap) / (width + gap))) - inside_width = max(0, count * (width + gap) - gap) - margin = (1 - inside_width) / 2 - - # Convert to actual length - margin = length * margin - gap = length * gap - width = length * width - - # Determine the initial inversion - inv = 1 if self.is_inverse() else -1 - if interleave and self.inverse and count % 2 == 0: - inv = -inv - - # The edge until the first groove - self.edge(margin, tabs=1) - - # Grooves - for i in range(count): - if i > 0: - self.edge(gap) - if interleave: - inv = -inv - if style == GroovedSettings.PARAM_FLAT: - self.edge(width) - elif style == GroovedSettings.PARAM_ARC: - angle = self.settings.arc_angle / 2 - self.groove_arc(width, angle, inv) - elif style == GroovedSettings.PARAM_SOFTARC: - angle = self.settings.arc_angle / 2 - self.groove_soft_arc(width, angle, inv) - elif style == GroovedSettings.PARAM_TRIANGLE: - angle = self.settings.tri_angle - self.groove_triangle(width, angle, inv) - else: - raise ValueError("Unknown GroovedEdge style: %s)" % style) - - # The final edge - self.edge(margin, tabs=1) - - -class GroovedEdge(GroovedEdgeBase): - description = """Edge with grooves""" - char = 'z' - inverse = False - - -class GroovedEdgeCounterPart(GroovedEdgeBase): - description = """Edge with grooves (opposing side)""" - char = 'Z' - inverse = True - - -############################################################################# -#### Gripping Edge -############################################################################# - -class GripSettings(Settings): - """Settings for GrippingEdge -Values: - -* absolute_params - - * style : "wave" : "wave" or "bumps" - * outset : True : extend outward the straight edge - -* relative (in multiples of thickness) - - * depth : 0.3 : depth of the grooves - -""" - - absolute_params = { - "style": ("wave", "bumps"), - "outset": True, - } - - relative_params = { - "depth": 0.3, - } - - def edgeObjects(self, boxes, chars: str = "g", add: bool = True): - edges = [GrippingEdge(boxes, self)] - return self._edgeObjects(edges, boxes, chars, add) - - -class GrippingEdge(BaseEdge): - description = """Corrugated edge useful as an gipping area""" - char = 'g' - - def wave(self, length) -> None: - depth = self.settings.depth - grooves = int(length // (depth * 2.0)) + 1 - depth = length / grooves / 4.0 - - o = 1 if self.settings.outset else -1 - for groove in range(grooves): - self.corner(o * -90, depth) - self.corner(o * 180, depth) - self.corner(o * -90, depth) - - def bumps(self, length) -> None: - depth = self.settings.depth - grooves = int(length // (depth * 2.0)) + 1 - depth = length / grooves / 2.0 - o = 1 if self.settings.outset else -1 - - if self.settings.outset: - self.corner(-90) - else: - self.corner(90) - self.edge(depth) - self.corner(-180) - - for groove in range(grooves): - self.corner(180, depth) - self.corner(-180, 0) - - if self.settings.outset: - self.corner(90) - else: - self.edge(depth) - self.corner(90) - - def margin(self) -> float: - if self.settings.outset: - return self.settings.depth - return 0.0 - - def __call__(self, length, **kw): - if length == 0.0: - return - getattr(self, self.settings.style)(length) - - -class CompoundEdge(BaseEdge): - """Edge composed of multiple different Edges""" - description = "Compound Edge" - - def __init__(self, boxes, types, lengths) -> None: - super().__init__(boxes, None) - - self.types = [self.edges.get(edge, edge) for edge in types] - self.lengths = lengths - self.length = sum(lengths) - - def startwidth(self) -> float: - return self.types[0].startwidth() - - def endwidth(self) -> float: - return self.types[-1].endwidth() - - def margin(self) -> float: - return max(e.margin() + e.startwidth() for e in self.types) - self.types[0].startwidth() - - def __call__(self, length, **kw): - if length and abs(length - self.length) > 1E-5: - raise ValueError("Wrong length for CompoundEdge") - lastwidth = self.types[0].startwidth() - - for e, l in zip(self.types, self.lengths): - self.step(e.startwidth() - lastwidth) - e(l) - lastwidth = e.endwidth() - - -############################################################################# -#### Slots -############################################################################# - -class Slot(BaseEdge): - """Edge with a slot to slide another piece through """ - - description = "Slot" - - def __init__(self, boxes, depth) -> None: - super().__init__(boxes, None) - - self.depth = depth - - def __call__(self, length, **kw): - if self.depth: - self.boxes.corner(90) - self.boxes.edge(self.depth) - self.boxes.corner(-90) - self.boxes.edge(length) - self.boxes.corner(-90) - self.boxes.edge(self.depth) - self.boxes.corner(90) - else: - self.boxes.edge(self.length) - - -class SlottedEdge(BaseEdge): - """Edge with multiple slots""" - description = "Straight Edge with slots" - - def __init__(self, boxes, sections, edge: str = "e", slots: int = 0) -> None: - super().__init__(boxes, Settings(boxes.thickness)) - - self.edge = self.edges.get(edge, edge) - self.sections = sections - self.slots = slots - - def startwidth(self) -> float: - return self.edge.startwidth() - - def endwidth(self) -> float: - return self.edge.endwidth() - - def margin(self) -> float: - return self.edge.margin() - - def __call__(self, length, **kw): - - for l in self.sections[:-1]: - self.edge(l) - - if self.slots: - Slot(self.boxes, self.slots)(self.settings.thickness) - else: - self.boxes.edge(self.settings.thickness) - - self.edge(self.sections[-1]) - - -############################################################################# -#### Finger Joints -############################################################################# - -class FingerJointSettings(Settings): - """Settings for Finger Joints - -Values: - -* absolute - * style : "rectangular" : style of the fingers - * surroundingspaces : 2.0 : space at the start and end in multiple of normal spaces - * angle: 90 : Angle of the walls meeting - -* relative (in multiples of thickness) - - * space : 2.0 : space between fingers (multiples of thickness) - * finger : 2.0 : width of the fingers (multiples of thickness) - * width : 1.0 : width of finger holes (multiples of thickness) - * edge_width : 1.0 : space below holes of FingerHoleEdge (multiples of thickness) - * play : 0.0 : extra space to allow finger move in and out (multiples of thickness) - * extra_length : 0.0 : extra material to grind away burn marks (multiples of thickness) - * bottom_lip : 0.0 : height of the bottom lips sticking out (multiples of thickness) FingerHoleEdge only! -""" - - absolute_params = { - "style": ("rectangular", "springs", "barbs", "snap"), - "surroundingspaces": 2.0, - "angle": 90.0, - } - - relative_params = { - "space": 2.0, - "finger": 2.0, - "width": 1.0, - "edge_width": 1.0, - "play": 0.0, - "extra_length": 0.0, - "bottom_lip": 0.0, - } - - def checkValues(self) -> None: - if abs(self.space + self.finger) < 0.1: - raise ValueError("FingerJointSettings: space + finger must not be close to zero") - - def edgeObjects(self, boxes, chars: str = "fFh", add: bool = True): - edges = [FingerJointEdge(boxes, self), - FingerJointEdgeCounterPart(boxes, self), - FingerHoleEdge(boxes, self), - ] - return self._edgeObjects(edges, boxes, chars, add) - - -class FingerJointBase(ABC): - """Abstract base class for finger joint.""" - - def calcFingers(self, length: float, bedBolts) -> tuple[int, float]: - space, finger = self.settings.space, self.settings.finger # type: ignore - fingers = int((length - (self.settings.surroundingspaces - 1) * space) // (space + finger)) # type: ignore - # shrink surrounding space up to half a thickness each side - if fingers == 0 and length > finger + 1.0 * self.settings.thickness: # type: ignore - fingers = 1 - if not finger: - fingers = 0 - if bedBolts: - fingers = bedBolts.numFingers(fingers) - leftover = length - fingers * (space + finger) + space - - if fingers <= 0: - fingers = 0 - leftover = length - - return fingers, leftover - - def fingerLength(self, angle: float) -> tuple[float, float]: - # sharp corners - if angle >= 90 or angle <= -90: - return self.settings.thickness + self.settings.extra_length, 0.0 # type: ignore - - # inner blunt corners - if angle < 0: - return (math.sin(math.radians(-angle)) * self.settings.thickness + self.settings.extra_length), 0 # type: ignore - - # 0 to 90 (blunt corners) - a = 90 - (180 - angle) / 2.0 - fingerlength = self.settings.thickness * math.tan(math.radians(a)) # type: ignore - b = 90 - 2 * a - spacerecess = -math.sin(math.radians(b)) * fingerlength - return fingerlength + self.settings.extra_length, spacerecess # type: ignore - - -class FingerJointEdge(BaseEdge, FingerJointBase): - """Finger joint edge """ - char = 'f' - description = "Finger Joint" - positive = True - - def draw_finger(self, f, h, style, positive: bool = True, firsthalf: bool = True) -> None: - t = self.settings.thickness - - if positive: - if style == "springs": - self.polyline( - 0, -90, 0.8 * h, (90, 0.2 * h), - 0.1 * h, 90, 0.9 * h, -180, 0.9 * h, 90, - f - 0.6 * h, - 90, 0.9 * h, -180, 0.9 * h, 90, 0.1 * h, - (90, 0.2 * h), 0.8 * h, -90) - elif style == "barbs": - n = int((h - 0.1 * t) // (0.3 * t)) - a = math.degrees(math.atan(0.5)) - l = 5 ** 0.5 - poly = [h - n * 0.3 * t] + \ - ([-45, 0.1 * 2 ** 0.5 * t, 45 + a, l * 0.1 * t, -a, 0] * n) - self.polyline( - 0, -90, *poly, 90, f, 90, *reversed(poly), -90 - ) - elif style == "snap" and f > 1.9 * t: - a12 = math.degrees(math.atan(0.5)) - l12 = t / math.cos(math.radians(a12)) - d = 4 * t - d2 = d + 1 * t - a = math.degrees(math.atan((0.5 * t) / (h + d2))) - l = (h + d2) / math.cos(math.radians(a)) - poly = [0, 90, d, -180, d + h, -90, 0.5 * t, 90 + a12, l12, 90 - a12, - 0.5 * t, 90 - a, l, +a, 0, (-180, 0.1 * t), h + d2, 90, f - 1.7 * t, 90 - a12, l12, a12, h, -90, 0] - if firsthalf: - poly = list(reversed(poly)) - self.polyline(*poly) - else: - self.polyline(0, -90, h, 90, f, 90, h, -90) - else: - self.polyline(0, 90, h, -90, f, -90, h, 90) - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - - positive = self.positive - t = self.settings.thickness - - s, f = self.settings.space, self.settings.finger - thickness = self.settings.thickness - style = self.settings.style - play = self.settings.play - - fingers, leftover = self.calcFingers(length, bedBolts) - - # not enough space for normal fingers - use small rectangular one - if (fingers == 0 and f and - leftover > 0.75 * thickness and leftover > 4 * play): - fingers = 1 - f = leftover = leftover / 2.0 - bedBolts = None - style = "rectangular" - - if not positive: - f += play - s -= play - leftover -= play - - self.edge(leftover / 2.0, tabs=1) - - l1, l2 = self.fingerLength(self.settings.angle) - h = l1 - l2 - - d = (bedBoltSettings or self.bedBoltSettings)[0] - - for i in range(fingers): - if i != 0: - if not positive and bedBolts and bedBolts.drawBolt(i): - self.hole(0.5 * s, - 0.5 * self.settings.thickness, 0.5 * d) - - if positive and bedBolts and bedBolts.drawBolt(i): - self.bedBoltHole(s, bedBoltSettings) - else: - self.edge(s) - self.draw_finger(f, h, style, - positive, i < fingers // 2) - - self.edge(leftover / 2.0, tabs=1) - - def margin(self) -> float: - """ """ - widths = self.fingerLength(self.settings.angle) - if self.positive: - if self.settings.style == "snap": - return widths[0] - widths[1] + self.settings.thickness - return widths[0] - widths[1] - return 0.0 - - def startwidth(self) -> float: - widths = self.fingerLength(self.settings.angle) - return widths[self.positive] - - -class FingerJointEdgeCounterPart(FingerJointEdge): - """Finger joint edge - other side""" - char = 'F' - description = "Finger Joint (opposing side)" - positive = False - - -class FingerHoles(FingerJointBase): - """Hole matching a finger joint edge""" - - def __init__(self, boxes, settings) -> None: - self.boxes = boxes - self.ctx = boxes.ctx - self.settings = settings - - def __call__(self, x, y, length, angle=90, bedBolts=None, bedBoltSettings=None): - """ - Draw holes for a matching finger joint edge - - :param x: position - :param y: position - :param length: length of matching edge - :param angle: (Default value = 90) - :param bedBolts: (Default value = None) - :param bedBoltSettings: (Default value = None) - """ - with self.boxes.saved_context(): - self.boxes.moveTo(x, y, angle) - s, f = self.settings.space, self.settings.finger - p = self.settings.play - b = self.boxes.burn - fingers, leftover = self.calcFingers(length, bedBolts) - - # not enough space for normal fingers - use small rectangular one - if (fingers == 0 and f and - leftover > 0.75 * self.settings.thickness and leftover > 4 * p): - fingers = 1 - f = leftover = leftover / 2.0 - bedBolts = None - - if self.boxes.debug: - self.ctx.rectangle(b, -self.settings.width / 2 + b, - length - 2 * b, self.settings.width - 2 * b) - for i in range(fingers): - pos = leftover / 2.0 + i * (s + f) - - if bedBolts and bedBolts.drawBolt(i): - d = (bedBoltSettings or self.boxes.bedBoltSettings)[0] - self.boxes.hole(pos - 0.5 * s, 0, d * 0.5) - - self.boxes.rectangularHole(pos + 0.5 * f, 0, - f + p, self.settings.width + p) - - -class FingerHoleEdge(BaseEdge): - """Edge with holes for a parallel finger joint""" - char = 'h' - description = "Edge (parallel Finger Joint Holes)" - - def __init__(self, boxes, fingerHoles=None, **kw) -> None: - settings = None - if isinstance(fingerHoles, Settings): - settings = fingerHoles - fingerHoles = FingerHoles(boxes, settings) - super().__init__(boxes, settings, **kw) - - self.fingerHoles = fingerHoles or boxes.fingerHolesAt - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - dist = self.fingerHoles.settings.edge_width - with self.saved_context(): - self.fingerHoles( - 0, self.burn + dist + self.settings.thickness / 2, length, 0, - bedBolts=bedBolts, bedBoltSettings=bedBoltSettings) - if self.settings.bottom_lip: - h = self.settings.bottom_lip + \ - self.fingerHoles.settings.edge_width - sp = self.boxes.spacing - self.moveTo(-sp / 2, -h - sp) - self.rectangularWall(length - 1.05 * self.boxes.thickness, h) - self.edge(length, tabs=2) - - def startwidth(self) -> float: - """ """ - return self.fingerHoles.settings.edge_width + self.settings.thickness - - def margin(self) -> float: - if self.settings.bottom_lip: - return self.settings.bottom_lip + self.fingerHoles.settings.edge_width + self.boxes.spacing - return 0.0 - - -class CrossingFingerHoleEdge(Edge): - """Edge with holes for finger joints 90° above""" - - description = "Edge (orthogonal Finger Joint Holes)" - char = '|' - - def __init__(self, boxes, height, fingerHoles=None, outset: float = 0.0, **kw) -> None: - super().__init__(boxes, None, **kw) - - self.fingerHoles = fingerHoles or boxes.fingerHolesAt - self.height = height - self.outset = outset - - def __call__(self, length, **kw): - self.fingerHoles(length / 2.0, self.outset + self.burn, self.height) - super().__call__(length) - - def startwidth(self) -> float: - return self.outset - - -############################################################################# -#### Stackable Joints -############################################################################# - -class StackableSettings(Settings): - """Settings for Stackable Edges - -Values: - -* absolute_params - - * angle : 60 : inside angle of the feet - -* relative (in multiples of thickness) - - * height : 2.0 : height of the feet (multiples of thickness) - * width : 4.0 : width of the feet (multiples of thickness) - * holedistance : 1.0 : distance from finger holes to bottom edge (multiples of thickness) - * bottom_stabilizers : 0.0 : height of strips to be glued to the inside of bottom edges (multiples of thickness) - -""" - - absolute_params = { - "angle": 60, - } - - relative_params = { - "height": 2.0, - "width": 4.0, - "holedistance": 1.0, - "bottom_stabilizers": 0.0, - } - - def checkValues(self) -> None: - if self.angle < 20: - raise ValueError("StackableSettings: 'angle' is too small. Use value >= 20") - if self.angle > 260: - raise ValueError("StackableSettings: 'angle' is too big. Use value < 260") - - def edgeObjects(self, boxes, chars: str = "sSšŠ", add: bool = True, fingersettings=None): - fingersettings = fingersettings or boxes.edges["f"].settings - edges = [StackableEdge(boxes, self, fingersettings), - StackableEdgeTop(boxes, self, fingersettings), - StackableFeet(boxes, self, fingersettings), - StackableHoleEdgeTop(boxes, self, fingersettings), - ] - return self._edgeObjects(edges, boxes, chars, add) - - -class StackableBaseEdge(BaseEdge): - """Edge for having stackable Boxes. The Edge creates feet on the bottom - and has matching recesses on the top corners.""" - - char = "s" - description = "Abstract Stackable class" - bottom = True - - def __init__(self, boxes, settings, fingerjointsettings) -> None: - super().__init__(boxes, settings) - - self.fingerjointsettings = fingerjointsettings - - def __call__(self, length, **kw): - s = self.settings - r = s.height / 2.0 / (1 - math.cos(math.radians(s.angle))) - l = r * math.sin(math.radians(s.angle)) - p = 1 if self.bottom else -1 - - if self.bottom and s.bottom_stabilizers: - with self.saved_context(): - sp = self.boxes.spacing - self.moveTo(-sp / 2, -s.height - sp) - self.rectangularWall(length - 1.05 * self.boxes.thickness, - s.bottom_stabilizers) - - self.boxes.edge(s.width, tabs=1) - self.boxes.corner(p * s.angle, r) - self.boxes.corner(-p * s.angle, r) - self.boxes.edge(length - 2 * s.width - 4 * l) - self.boxes.corner(-p * s.angle, r) - self.boxes.corner(p * s.angle, r) - self.boxes.edge(s.width, tabs=1) - - def _height(self): - return self.settings.height + self.settings.holedistance + self.settings.thickness - - def startwidth(self) -> float: - return self._height() if self.bottom else 0 - - def margin(self) -> float: - if self.bottom: - if self.settings.bottom_stabilizers: - return self.settings.bottom_stabilizers + self.boxes.spacing - else: - return 0 - else: - return self.settings.height - - -class StackableEdge(StackableBaseEdge): - """Edge for having stackable Boxes. The Edge creates feet on the bottom - and has matching recesses on the top corners.""" - - char = "s" - description = "Stackable (bottom, finger joint holes)" - - def __call__(self, length, **kw): - s = self.settings - self.boxes.fingerHolesAt( - 0, - s.height + s.holedistance + 0.5 * self.boxes.thickness, - length, 0) - super().__call__(length, **kw) - - -class StackableEdgeTop(StackableBaseEdge): - char = "S" - description = "Stackable (top)" - bottom = False - - -class StackableFeet(StackableBaseEdge): - char = "š" - description = "Stackable feet (bottom)" - - def _height(self): - return self.settings.height - - -class StackableHoleEdgeTop(StackableBaseEdge): - char = "Š" - description = "Stackable edge with finger holes (top)" - bottom = False - - def startwidth(self) -> float: - return self.settings.thickness + self.settings.holedistance - - def __call__(self, length, **kw): - s = self.settings - self.boxes.fingerHolesAt( - 0, - s.holedistance + 0.5 * self.boxes.thickness, - length, 0) - super().__call__(length, **kw) - - -############################################################################# -#### Hinges -############################################################################# - -class HingeSettings(Settings): - """Settings for Hinges and HingePins -Values: - -* absolute_params - - * style : "outset" : "outset" or "flush" - * outset : False : have lid overlap at the sides (similar to OutSetEdge) - * pinwidth : 1.0 : set to lower value to get disks surrounding the pins - * grip_percentage" : 0 : percentage of the lid that should get grips - -* relative (in multiples of thickness) - - * hingestrength : 1 : thickness of the arc holding the pin in place (multiples of thickness) - * axle : 2 : diameter of the pin hole (multiples of thickness) - * grip_length : 0 : fixed length of the grips on he lids (multiples of thickness) - -""" - absolute_params = { - "style": ("outset", "flush"), - "outset": False, - "pinwidth": 0.5, - "grip_percentage": 0, - } - - relative_params = { - "hingestrength": 1, # 1.5-0.5*2**0.5, - "axle": 2.0, - "grip_length": 0, - } - - def checkValues(self) -> None: - if self.axle / self.thickness < 0.1: - raise ValueError("HingeSettings: 'axle' need to be at least 0.1 strong") - - def edgeObjects(self, boxes, chars: str = "iIjJkK", add: bool = True): - edges = [ - Hinge(boxes, self, 1), - HingePin(boxes, self, 1), - Hinge(boxes, self, 2), - HingePin(boxes, self, 2), - Hinge(boxes, self, 3), - HingePin(boxes, self, 3), - ] - return self._edgeObjects(edges, boxes, chars, add) - - -class Hinge(BaseEdge): - char = 'i' - description = "Straight edge with hinge eye" - - def __init__(self, boxes, settings=None, layout: int = 1) -> None: - super().__init__(boxes, settings) - - if not (0 < layout <= 3): - raise ValueError("layout must be 1, 2 or 3 (got %i)" % layout) - - self.layout = layout - self.char = "eijk"[layout] - self.description = self.description + ('', ' (start)', ' (end)', ' (both ends)')[layout] - - def margin(self) -> float: - t: float = self.settings.thickness - if self.settings.style == "outset": - r = 0.5 * self.settings.axle - alpha = math.degrees(math.asin(0.5 * t / r)) - pos = math.cos(math.radians(alpha)) * r - return 1.5 * t + pos - else: # flush - return 0.5 * t + 0.5 * self.settings.axle + self.settings.hingestrength - - def outset(self, _reversed: bool = False) -> None: - t: float = self.settings.thickness - r = 0.5 * self.settings.axle - alpha = math.degrees(math.asin(0.5 * t / r)) - pinl = (self.settings.axle ** 2 - self.settings.thickness ** 2) ** 0.5 * self.settings.pinwidth - pos = math.cos(math.radians(alpha)) * r - hinge = ( - 0., - 90. - alpha, 0., - (-360., r), 0., - 90. + alpha, - t, - 90., - 0.5 * t, - (180., t + pos), 0., - (-90., 0.5 * t), 0. - ) - - if _reversed: - hinge = reversed(hinge) # type: ignore - self.polyline(*hinge) - self.boxes.rectangularHole(-pos, -0.5 * t, pinl, self.settings.thickness) - else: - self.boxes.rectangularHole(pos, -0.5 * t, pinl, self.settings.thickness) - self.polyline(*hinge) - - def outsetlen(self) -> float: - t = self.settings.thickness - r = 0.5 * self.settings.axle - alpha = math.degrees(math.asin(0.5 * t / r)) - pos = math.cos(math.radians(alpha)) * r - - return 2.0 * pos + 1.5 * t - - def flush(self, _reversed: bool = False) -> None: - t = self.settings.thickness - - hinge = ( - 0., -90., - 0.5 * t, - (180., 0.5 * self.settings.axle + self.settings.hingestrength), 0., - (-90., 0.5 * t), 0. - ) - pos = 0.5 * self.settings.axle + self.settings.hingestrength - pinl = (self.settings.axle ** 2 - self.settings.thickness ** 2) ** 0.5 * self.settings.pinwidth - - if _reversed: - hinge = reversed(hinge) # type: ignore - self.hole(0.5 * t + pos, -0.5 * t, 0.5 * self.settings.axle) - self.boxes.rectangularHole(0.5 * t + pos, -0.5 * t, pinl, self.settings.thickness) - else: - self.hole(pos, -0.5 * t, 0.5 * self.settings.axle) - self.boxes.rectangularHole(pos, -0.5 * t, pinl, self.settings.thickness) - - self.polyline(*hinge) - - def flushlen(self) -> float: - return self.settings.axle + 2.0 * self.settings.hingestrength + 0.5 * self.settings.thickness - - def __call__(self, l, **kw): - hlen = getattr(self, self.settings.style + 'len', self.outsetlen)() - - if self.layout & 1: - getattr(self, self.settings.style, self.outset)() - - self.edge(l - (self.layout & 1) * hlen - bool(self.layout & 2) * hlen, - tabs=2) - - if self.layout & 2: - getattr(self, self.settings.style, self.outset)(True) - - -class HingePin(BaseEdge): - char = 'I' - description = "Edge with hinge pin" - - def __init__(self, boxes, settings=None, layout: int = 1) -> None: - super().__init__(boxes, settings) - - if not (0 < layout <= 3): - raise ValueError("layout must be 1, 2 or 3 (got %i)" % layout) - - self.layout = layout - self.char = "EIJK"[layout] - self.description = self.description + ('', ' (start)', ' (end)', ' (both ends)')[layout] - - def startwidth(self) -> float: - if self.layout & 1: - return 0.0 - return self.settings.outset * self.boxes.thickness - - def endwidth(self) -> float: - if self.layout & 2: - return 0.0 - return self.settings.outset * self.boxes.thickness - - def margin(self) -> float: - return self.settings.thickness - - def outset(self, _reversed: bool = False) -> None: - t: float = self.settings.thickness - r = 0.5 * self.settings.axle - alpha = math.degrees(math.asin(0.5 * t / r)) - pos = math.cos(math.radians(alpha)) * r - pinl = (self.settings.axle ** 2 - self.settings.thickness ** 2) ** 0.5 * self.settings.pinwidth - pin = (pos - 0.5 * pinl, -90., - t, 90., - pinl, - 90., - t, - -90.) - - if self.settings.outset: - pin += ( # type: ignore - pos - 0.5 * pinl + 1.5 * t, - -90., - t, - 90., - 0., - ) - else: - pin += (pos - 0.5 * pinl,) # type: ignore - - if _reversed: - pin = reversed(pin) # type: ignore - - self.polyline(*pin) - - def outsetlen(self): - t = self.settings.thickness - r = 0.5 * self.settings.axle - alpha = math.degrees(math.asin(0.5 * t / r)) - pos = math.cos(math.radians(alpha)) * r - - if self.settings.outset: - return 2 * pos + 1.5 * self.settings.thickness - return 2 * pos - - def flush(self, _reversed: bool = False) -> None: - t: float = self.settings.thickness - pinl = (self.settings.axle ** 2 - t ** 2) ** 0.5 * self.settings.pinwidth - d = (self.settings.axle - pinl) / 2.0 - pin = (self.settings.hingestrength + d, -90., - t, 90., - pinl, - 90., - t, - -90., d) - - if self.settings.outset: - pin += ( # type: ignore - 0., - self.settings.hingestrength + 0.5 * t, - -90., - t, - 90., - 0., - ) - - if _reversed: - pin = reversed(pin) # type: ignore - - self.polyline(*pin) - - def flushlen(self): - l = self.settings.hingestrength + self.settings.axle - - if self.settings.outset: - l += self.settings.hingestrength + 0.5 * self.settings.thickness - - return l - - def __call__(self, l, **kw): - plen = getattr(self, self.settings.style + 'len', self.outsetlen)() - glen = l * self.settings.grip_percentage / 100 + \ - self.settings.grip_length - - if not self.settings.outset: - glen = 0.0 - - glen = min(glen, l - plen) - - if self.layout & 1 and self.layout & 2: - getattr(self, self.settings.style, self.outset)() - self.edge(l - 2 * plen, tabs=2) - getattr(self, self.settings.style, self.outset)(True) - elif self.layout & 1: - getattr(self, self.settings.style, self.outset)() - self.edge(l - plen - glen, tabs=2) - self.edges['g'](glen) - else: - self.edges['g'](glen) - self.edge(l - plen - glen, tabs=2) - getattr(self, self.settings.style, self.outset)(True) - - -############################################################################# -#### Chest Hinge -############################################################################# - -class ChestHingeSettings(Settings): - """Settings for Chest Hinges -Values: - -* relative (in multiples of thickness) - - * pin_height : 2.0 : radius of the disc rotating in the hinge (multiples of thickness) - * hinge_strength : 1.0 : thickness of the arc holding the pin in place (multiples of thickness) - -* absolute - - * finger_joints_on_box : False : whether to include finger joints on the edge with the box - * finger_joints_on_lid : False : whether to include finger joints on the edge with the lid -""" - - relative_params = { - "pin_height": 2.0, - "hinge_strength": 1.0, - "play": 0.1, - } - - absolute_params = { - "finger_joints_on_box": False, - "finger_joints_on_lid": False, - } - - def checkValues(self) -> None: - if self.pin_height / self.thickness < 1.2: - raise ValueError("ChestHingeSettings: 'pin_height' must be >= 1.2") - - def pinheight(self): - return ((0.9 * self.pin_height) ** 2 - self.thickness ** 2) ** 0.5 - - def edgeObjects(self, boxes, chars: str = "oOpPqQ", add: bool = True): - edges = [ - ChestHinge(boxes, self), - ChestHinge(boxes, self, True), - ChestHingeTop(boxes, self), - ChestHingeTop(boxes, self, True), - ChestHingePin(boxes, self), - ChestHingeFront(boxes, self), - ] - return self._edgeObjects(edges, boxes, chars, add) - - -class ChestHinge(BaseEdge): - description = "Edge with chest hinge" - - char = "o" - - def __init__(self, boxes, settings=None, reversed: bool = False) -> None: - super().__init__(boxes, settings) - - self.reversed = reversed - self.char = "oO"[reversed] - self.description = self.description + (' (start)', ' (end)')[reversed] - - def __call__(self, l, **kw): - t = self.settings.thickness - p = self.settings.pin_height - s = self.settings.hinge_strength - pinh = self.settings.pinheight() - if self.reversed: - self.hole(l + t, 0, p, tabs=4) - self.rectangularHole(l + 0.5 * t, -0.5 * pinh, t, pinh) - else: - self.hole(-t, -s - p, p, tabs=4) - self.rectangularHole(-0.5 * t, -s - p - 0.5 * pinh, t, pinh) - - if self.settings.finger_joints_on_box: - final_segment = t - s - draw_rest_of_edge = lambda: self.edges["F"](l - p) - else: - final_segment = l + t - p - s - draw_rest_of_edge = lambda: None - - poly = (0, -180, t, (270, p + s), 0, -90, final_segment) - - if self.reversed: - draw_rest_of_edge() - self.polyline(*reversed(poly)) - else: - self.polyline(*poly) - draw_rest_of_edge() - - def margin(self) -> float: - if self.reversed: - return 0.0 - return 1 * (self.settings.pin_height + self.settings.hinge_strength) - - def startwidth(self) -> float: - if self.reversed: - return self.settings.pin_height + self.settings.hinge_strength - return 0.0 - - def endwidth(self) -> float: - if self.reversed: - return 0.0 - return self.settings.pin_height + self.settings.hinge_strength - - -class ChestHingeTop(ChestHinge): - """Edge above a chest hinge""" - - char = "p" - - def __init__(self, boxes, settings=None, reversed: bool = False) -> None: - super().__init__(boxes, settings) - - self.reversed = reversed - self.char = "oO"[reversed] - self.description = self.description + (' (start)', ' (end)')[reversed] - - def __call__(self, l, **kw): - t = self.settings.thickness - p = self.settings.pin_height - s = self.settings.hinge_strength - play = self.settings.play - - if self.settings.finger_joints_on_lid: - final_segment = t - s - play - draw_rest_of_edge = lambda: self.edges["F"](l - p) - else: - final_segment = l + t - p - s - play - draw_rest_of_edge = lambda: None - - poly = (0, -180, t, -180, 0, (-90, p + s + play), 0, 90, final_segment) - - if self.reversed: - draw_rest_of_edge() - self.polyline(*reversed(poly)) - else: - self.polyline(*poly) - draw_rest_of_edge() - - def startwidth(self) -> float: - if self.reversed: - return self.settings.play + self.settings.pin_height + self.settings.hinge_strength - return 0.0 - - def endwidth(self) -> float: - if self.reversed: - return 0.0 - return self.settings.play + self.settings.pin_height + self.settings.hinge_strength - - def margin(self) -> float: - if self.reversed: - return 0.0 - return 1 * (self.settings.play + self.settings.pin_height + self.settings.hinge_strength) - - -class ChestHingePin(BaseEdge): - description = "Edge with pins for an chest hinge" - - char = "q" - - def __call__(self, l, **kw): - t = self.settings.thickness - p = self.settings.pin_height - s = self.settings.hinge_strength - pinh = self.settings.pinheight() - - if self.settings.finger_joints_on_lid: - middle_segment = [0] - draw_rest_of_edge = lambda: (self.edge(t), self.edges["F"](l), self.edge(t)) - else: - middle_segment = [l + 2 * t, ] - draw_rest_of_edge = lambda: None - - poly = [0, -90, s + p - pinh, -90, t, 90, pinh, 90, ] - self.polyline(*poly) - draw_rest_of_edge() - self.polyline(*(middle_segment + list(reversed(poly)))) - - def margin(self) -> float: - return (self.settings.pin_height + self.settings.hinge_strength) - - -class ChestHingeFront(Edge): - description = "Edge opposing a chest hinge" - - char = "Q" - - def startwidth(self) -> float: - return self.settings.pin_height + self.settings.hinge_strength - - -############################################################################# -#### Cabinet Hinge -############################################################################# - -class CabinetHingeSettings(Settings): - """Settings for Cabinet Hinges -Values: - -* absolute_params - - * bore : 3.2 : diameter of the pin hole in mm - * eyes_per_hinge : 5 : pieces per hinge - * hinges : 2 : number of hinges per edge - * style : inside : style of hinge used - -* relative (in multiples of thickness) - - * eye : 1.5 : radius of the eye (multiples of thickness) - * play : 0.05 : space between eyes (multiples of thickness) - * spacing : 2.0 : minimum space around the hinge (multiples of thickness) -""" - absolute_params = { - "bore": 3.2, - "eyes_per_hinge": 5, - "hinges": 2, - "style": ("inside", "outside"), - } - - relative_params = { - "eye": 1.5, - "play": 0.05, - "spacing": 2.0, - } - - def edgeObjects(self, boxes, chars: str = "uUvV", add: bool = True): - edges = [CabinetHingeEdge(boxes, self), - CabinetHingeEdge(boxes, self, top=True), - CabinetHingeEdge(boxes, self, angled=True), - CabinetHingeEdge(boxes, self, top=True, angled=True), - ] - for e, c in zip(edges, chars): - e.char = c - return self._edgeObjects(edges, boxes, chars, add) - - -class CabinetHingeEdge(BaseEdge): - """Edge with cabinet hinges""" - - char = "u" - description = "Edge with cabinet hinges" - - def __init__(self, boxes, settings=None, top: bool = False, angled: bool = False) -> None: - super().__init__(boxes, settings) - self.top = top - self.angled = angled - self.char = "uUvV"[bool(top) + 2 * bool(angled)] - - def startwidth(self) -> float: - return self.settings.thickness if self.top and self.angled else 0.0 - - def __poly(self): - n = self.settings.eyes_per_hinge - p = self.settings.play - e = self.settings.eye - t = self.settings.thickness - spacing = self.settings.spacing - - if self.settings.style == "outside" and self.angled: - e = t - elif self.angled and not self.top: - # move hinge up to leave space for lid - e -= t - - if self.top: - # start with space - poly = [spacing, 90, e + p] - else: - # start with hinge eye - poly = [spacing + p, 90, e + p, 0] - for i in range(n): - if (i % 2) ^ self.top: - # space - if i == 0: - poly += [-90, t + 2 * p, 90] - else: - poly += [90, t + 2 * p, 90] - else: - # hinge eye - poly += [t - p, -90, t, -90, t - p] - - if (n % 2) ^ self.top: - # stopped with hinge eye - poly += [0, e + p, 90, p + spacing] - else: - # stopped with space - poly[-1:] = [-90, e + p, 90, 0 + spacing] - - width = (t + p) * n + p + 2 * spacing - - return poly, width - - def __call__(self, l, **kw): - n = self.settings.eyes_per_hinge - p = self.settings.play - e = self.settings.eye - t = self.settings.thickness - hn = self.settings.hinges - - poly, width = self.__poly() - - if self.settings.style == "outside" and self.angled: - e = t - elif self.angled and not self.top: - # move hinge up to leave space for lid - e -= t - - hn = min(hn, int(l // width)) - - if hn == 1: - self.edge((l - width) / 2, tabs=2) - - for j in range(hn): - for i in range(n): - if not (i % 2) ^ self.top: - self.rectangularHole(self.settings.spacing + 0.5 * t + p + i * (t + p), e + 2.5 * t, t, t) - self.polyline(*poly) - if j < (hn - 1): - self.edge((l - hn * width) / (hn - 1), tabs=2) - - if hn == 1: - self.edge((l - width) / 2, tabs=2) - - def parts(self, move=None) -> None: - e, b = self.settings.eye, self.settings.bore - t = self.settings.thickness - - n = self.settings.eyes_per_hinge * self.settings.hinges - pairs = n // 2 + 2 * (n % 2) - - if self.settings.style == "outside": - th = 2 * e + 4 * t - tw = n * (max(3 * t, 2 * e) + self.boxes.spacing) - else: - th = 4 * e + 3 * t + self.boxes.spacing - tw = max(e, 2 * t) * pairs - - if self.move(tw, th, move, True, label="hinges"): - return - - if self.settings.style == "outside": - ax = max(t / 2, e - t) - self.moveTo(t + ax) - for i in range(n): - if self.angled: - if i > n // 2: - l = 4 * t + ax - else: - l = 5 * t + ax - else: - l = 3 * t + e - self.hole(0, e, b / 2.0) - da = math.asin((t - ax) / e) - dad = math.degrees(da) - dy = e * (1 - math.cos(da)) - self.polyline(0, (180 - dad, e), 0, (-90 + dad), dy + l - e, (90, t)) - self.polyline(0, 90, t, -90, t, 90, t, 90, t, -90, t, -90, t, - 90, t, 90, (ax + t) - e, -90, l - 3 * t, (90, e)) - self.moveTo(2 * max(e, 1.5 * t) + self.boxes.spacing) - - self.move(tw, th, move, label="hinges") - return - - if e <= 2 * t: - if self.angled: - corner = [2 * e - t, (90, 2 * t - e), 0, -90, t, (90, e)] - else: - corner = [2 * e, (90, 2 * t)] - else: - a = math.asin(2 * t / e) - ang = math.degrees(a) - corner = [e * (1 - math.cos(a)) + 2 * t, -90 + ang, 0, (180 - ang, e)] - self.moveTo(max(e, 2 * t)) - for i in range(n): - self.hole(0, e, b / 2.0) - self.polyline(*[0, (180, e), 0, -90, t, 90, t, -90, t, -90, t, 90, t, 90, t, (90, t)] + corner) - self.moveTo(self.boxes.spacing, 4 * e + 3 * t + self.boxes.spacing, 180) - if i % 2: - self.moveTo(2 * max(e, 2 * t) + 2 * self.boxes.spacing) - - self.move(th, tw, move, label="hinges") - - -############################################################################# -#### Slide-on lid -############################################################################# - -class SlideOnLidSettings(FingerJointSettings): - """Settings for Slide-on Lids - -Note that edge_width below also determines how much the sides extend above the lid. - -Values: - -* absolute_params - - * second_pin : True : additional pin for better positioning - * spring : "both" : position(s) of the extra locking springs in the lid - * hole_width : 0 : width of the "finger hole" in mm - """ - __doc__ += FingerJointSettings.__doc__ or "" - - absolute_params = FingerJointSettings.absolute_params.copy() - relative_params = FingerJointSettings.relative_params.copy() - - relative_params.update({ - "play": 0.05, - "finger": 3.0, - "space": 2.0, - }) - - absolute_params.update({ - "second_pin": True, - "spring": ("both", "none", "left", "right"), - "hole_width": 0 - }) - - def edgeObjects(self, boxes, chars=None, add: bool = True): - edges = [LidEdge(boxes, self), - LidHoleEdge(boxes, self), - LidRight(boxes, self), - LidLeft(boxes, self), - LidSideRight(boxes, self), - LidSideLeft(boxes, self), - ] - return self._edgeObjects(edges, boxes, chars, add) - - -class LidEdge(FingerJointEdge): - char = "l" - description = "Edge for slide on lid (back)" - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - hole_width = self.settings.hole_width - if hole_width > 0: - super().__call__((length - hole_width) / 2) - GroovedEdgeBase.groove_arc(self, hole_width) - super().__call__((length - hole_width) / 2) - else: - super().__call__(length) - - -class LidHoleEdge(FingerHoleEdge): - char = "L" - description = "Edge for slide on lid (box back)" - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw) -> None: - hole_width = self.settings.hole_width - if hole_width > 0: - super().__call__((length - hole_width) / 2) - self.edge(hole_width) - super().__call__((length - hole_width) / 2) - else: - super().__call__(length) - - -class LidRight(BaseEdge): - char = "n" - description = "Edge for slide on lid (right)" - rightside = True - - def __call__(self, length, **kw): - t = self.boxes.thickness - - if self.rightside: - spring = self.settings.spring in ("right", "both") - else: - spring = self.settings.spring in ("left", "both") - - if spring: - l = min(6 * t, length - 2 * t) - a = 30 - sqt = 0.4 * t / math.cos(math.radians(a)) - sw = 0.5 * t - p = [0, 90, 1.5 * t + sw, -90, l, (-180, 0.25 * t), l - 0.2 * t, 90, sw, 90 - a, sqt, 2 * a, sqt, -a, length - t] - else: - p = [t, 90, t, -90, length - t] - - pin = self.settings.second_pin - - if pin: - pinl = 2 * t - p[-1:] = [length - 2 * t - pinl, -90, t, 90, pinl, 90, t, -90, t] - - if not self.rightside: - p = list(reversed(p)) - self.polyline(*p) - - def startwidth(self) -> float: - if self.rightside: # or self.settings.second_pin: - return self.boxes.thickness - return 0.0 - - def endwidth(self) -> float: - if not self.rightside: # or self.settings.second_pin: - return self.boxes.thickness - return 0.0 - - def margin(self) -> float: - if not self.rightside: # and not self.settings.second_pin: - return self.boxes.thickness - return 0.0 - - -class LidLeft(LidRight): - char = "m" - description = "Edge for slide on lid (left)" - rightside = False - - -class LidSideRight(BaseEdge): - char = "N" - description = "Edge for slide on lid (box right)" - - rightside = True - - def __call__(self, length, **kw): - t = self.boxes.thickness - s = self.settings.play - pin = self.settings.second_pin - edge_width = self.settings.edge_width - r = edge_width / 3 - - if self.rightside: - spring = self.settings.spring in ("right", "both") - else: - spring = self.settings.spring in ("left", "both") - - if spring: - p = [s, -90, t + s, -90, t + s, 90, edge_width - s / 2, 90, length + t] - else: - p = [t + s, -90, t + s, -90, 2 * t + s, 90, edge_width - s / 2, 90, length + t] - - if pin: - pinl = 2 * t - p[-1:] = [p[-1] - 1.5 * t - 2 * pinl - r, (90, r), edge_width + t + s / 2 - r, -90, 2 * pinl + s + 0.5 * t, -90, t + s, -90, - pinl - r, (90, r), edge_width - s / 2 - 2 * r, (90, r), pinl + t - s - r] - - holex = 0.6 * t - holey = -0.5 * t + self.burn - s / 2 - if self.rightside: - p = list(reversed(p)) - holex = length - holex - holey = edge_width + 0.5 * t + self.burn - - if spring: - self.rectangularHole(holex, holey, 0.4 * t, t + 2 * s) - self.polyline(*p) - - def startwidth(self) -> float: - return self.boxes.thickness + self.settings.edge_width if self.rightside else -self.settings.play / 2 - - def endwidth(self) -> float: - return self.boxes.thickness + self.settings.edge_width if not self.rightside else -self.settings.play / 2 - - def margin(self) -> float: - return self.boxes.thickness + self.settings.edge_width + self.settings.play / 2 if not self.rightside else 0.0 - - -class LidSideLeft(LidSideRight): - char = "M" - description = "Edge for slide on lid (box left)" - rightside = False - - -############################################################################# -#### Click Joints -############################################################################# - -class ClickSettings(Settings): - """Settings for Click-on Lids -Values: - -* absolute_params - - * angle : 5.0 : angle of the hooks bending outward - -* relative (in multiples of thickness) - - * depth : 3.0 : length of the hooks (multiples of thickness) - * bottom_radius : 0.1 : radius at the bottom (multiples of thickness) -""" - - absolute_params = { - "angle": 5.0, - } - - relative_params = { - "depth": 3.0, - "bottom_radius": 0.1, - } - - def edgeObjects(self, boxes, chars: str = "cC", add: bool = True): - edges = [ClickConnector(boxes, self), - ClickEdge(boxes, self)] - return self._edgeObjects(edges, boxes, chars, add) - - -class ClickConnector(BaseEdge): - char = "c" - description = "Click on (bottom side)" - - def hook(self, reverse: bool = False) -> None: - t = self.settings.thickness - a = self.settings.angle - d = self.settings.depth - r = self.settings.bottom_radius - c = math.cos(math.radians(a)) - s = math.sin(math.radians(a)) - - p1 = (0, 90 - a, c * d) - p2 = ( - d + t, - -90, - t * 0.5, - 135, - t * 2 ** 0.5, - 135, - d + 2 * t + s * 0.5 * t) - p3 = (c * d - s * c * 0.2 * t, -a, 0) - - if not reverse: - self.polyline(*p1) - self.corner(-180, r) - self.polyline(*p2) - self.corner(-180 + 2 * a, r) - self.polyline(*p3) - else: - self.polyline(*reversed(p3)) - self.corner(-180 + 2 * a, r) - self.polyline(*reversed(p2)) - self.corner(-180, r) - self.polyline(*reversed(p1)) - - def hookWidth(self): - t = self.settings.thickness - a = self.settings.angle - d = self.settings.depth - r = self.settings.bottom_radius - c = math.cos(math.radians(a)) - s = math.sin(math.radians(a)) - - return 2 * s * d * c + 0.5 * c * t + c * 4 * r - - def hookOffset(self): - a = self.settings.angle - d = self.settings.depth - r = self.settings.bottom_radius - c = math.cos(math.radians(a)) - s = math.sin(math.radians(a)) - - return s * d * c + 2 * r - - def finger(self, length) -> None: - t = self.settings.thickness - self.polyline( - 2 * t, - 90, - length, - 90, - 2 * t, - ) - - def __call__(self, length, **kw): - t = self.settings.thickness - self.edge(4 * t) - self.hook() - self.finger(2 * t) - self.hook(reverse=True) - - self.edge(length - 2 * (6 * t + 2 * self.hookWidth()), tabs=2) - - self.hook() - self.finger(2 * t) - self.hook(reverse=True) - self.edge(4 * t) - - def margin(self) -> float: - return 2 * self.settings.thickness - - -class ClickEdge(ClickConnector): - char = "C" - description = "Click on (top)" - - def startwidth(self) -> float: - return self.boxes.thickness - - def margin(self) -> float: - return 0.0 - - def __call__(self, length, **kw): - t = self.settings.thickness - o = self.hookOffset() - w = self.hookWidth() - p1 = ( - 4 * t + o, - 90, - t, - -90, - 2 * (t + w - o), - -90, - t, - 90, - 0) - self.polyline(*p1) - self.edge(length - 2 * (6 * t + 2 * w) + 2 * o, tabs=2) - self.polyline(*reversed(p1)) - - -############################################################################# -#### Dove Tail Joints -############################################################################# - -class DoveTailSettings(Settings): - """Settings for Dove Tail Joints - -Values: - -* absolute - - * angle : 50 : how much should fingers widen (-80 to 80) - -* relative (in multiples of thickness) - - * size : 3 : from one middle of a dove tail to another (multiples of thickness) - * depth : 1.5 : how far the dove tails stick out of/into the edge (multiples of thickness) - * radius : 0.2 : radius used on all four corners (multiples of thickness) - -""" - absolute_params = { - "angle": 50, - } - - relative_params = { - "size": 3, - "depth": 1.5, - "radius": 0.2, - } - - def edgeObjects(self, boxes, chars: str = "dD", add: bool = True): - edges = [DoveTailJoint(boxes, self), - DoveTailJointCounterPart(boxes, self)] - return self._edgeObjects(edges, boxes, chars, add) - - -class DoveTailJoint(BaseEdge): - """Edge with dove tail joints """ - - char = 'd' - description = "Dove Tail Joint" - positive = True - - def __call__(self, length, **kw): - s = self.settings - radius = max(s.radius, self.boxes.burn) # no smaller than burn - positive = self.positive - a = s.angle + 90 - alpha = 0.5 * math.pi - math.pi * s.angle / 180.0 - - l1 = radius / math.tan(alpha / 2.0) - diffx = 0.5 * s.depth / math.tan(alpha) - l2 = 0.5 * s.depth / math.sin(alpha) - - sections = int((length) // (s.size * 2)) - leftover = length - sections * s.size * 2 - - if sections == 0: - self.edge(length) - return - - p = 1 if positive else -1 - - self.edge((s.size + leftover) / 2.0 + diffx - l1, tabs=1) - - for i in range(sections): - self.corner(-1 * p * a, radius) - self.edge(2 * (l2 - l1)) - self.corner(p * a, radius) - self.edge(2 * (diffx - l1) + s.size) - self.corner(p * a, radius) - self.edge(2 * (l2 - l1)) - self.corner(-1 * p * a, radius) - - if i < sections - 1: # all but the last - self.edge(2 * (diffx - l1) + s.size) - - self.edge((s.size + leftover) / 2.0 + diffx - l1, tabs=1) - - def margin(self) -> float: - """ """ - return self.settings.depth - - -class DoveTailJointCounterPart(DoveTailJoint): - """Edge for other side of dove joints """ - char = 'D' - description = "Dove Tail Joint (opposing side)" - - positive = False - - def margin(self) -> float: - return 0.0 - - -class FlexSettings(Settings): - """Settings for Flex - -Values: - -* absolute - - * stretch : 1.05 : Hint of how much the flex part should be shortened - -* relative (in multiples of thickness) - - * distance : 0.5 : width of the pattern perpendicular to the cuts (multiples of thickness) - * connection : 1.0 : width of the gaps in the cuts (multiples of thickness) - * width : 5.0 : width of the pattern in direction of the cuts (multiples of thickness) - -""" - relative_params = { - "distance": 0.5, - "connection": 1.0, - "width": 5.0, - } - - absolute_params = { - "stretch": 1.05, - } - - def checkValues(self) -> None: - if self.distance < 0.01: - raise ValueError("Flex Settings: distance parameter must be > 0.01mm") - if self.width < 0.1: - raise ValueError("Flex Settings: width parameter must be > 0.1mm") - - -class FlexEdge(BaseEdge): - """Edge with flex cuts - use straight edge for the opposing side""" - char = 'X' - description = "Flex cut" - - def __call__(self, x, h, **kw): - dist = self.settings.distance - connection = self.settings.connection - width = self.settings.width - - burn = self.boxes.burn - h += 2 * burn - lines = int(x // dist) - leftover = x - lines * dist - sections = max(int((h - connection) // width), 1) - sheight = ((h - connection) / sections) - connection - - self.ctx.stroke() - for i in range(1, lines): - pos = i * dist + leftover / 2 - - if i % 2: - self.ctx.move_to(pos, 0) - self.ctx.line_to(pos, connection + sheight) - - for j in range((sections - 1) // 2): - self.ctx.move_to(pos, (2 * j + 1) * sheight + (2 * j + 2) * connection) - self.ctx.line_to(pos, (2 * j + 3) * (sheight + connection)) - - if not sections % 2: - self.ctx.move_to(pos, h - sheight - connection) - self.ctx.line_to(pos, h) - else: - if sections % 2: - self.ctx.move_to(pos, h) - self.ctx.line_to(pos, h - connection - sheight) - - for j in range((sections - 1) // 2): - self.ctx.move_to( - pos, h - ((2 * j + 1) * sheight + (2 * j + 2) * connection)) - self.ctx.line_to( - pos, h - (2 * j + 3) * (sheight + connection)) - - else: - for j in range(sections // 2): - self.ctx.move_to(pos, - h - connection - 2 * j * (sheight + connection)) - self.ctx.line_to(pos, h - 2 * (j + 1) * (sheight + connection)) - - self.ctx.stroke() - self.ctx.move_to(0, 0) - self.ctx.line_to(x, 0) - self.ctx.translate(*self.ctx.get_current_point()) - - -class GearSettings(Settings): - """Settings for rack (and pinion) edge -Values: -* absolute_params - - * dimension : 3.0 : modulus of the gear (in mm) - * angle : 20.0 : pressure angle - * profile_shift : 20.0 : Profile shift - * clearance : 0.0 : clearance -""" - - absolute_params = { - "dimension": 3.0, - "angle": 20.0, - "profile_shift": 20.0, - "clearance": 0.0, - } - - relative_params: dict[str, Any] = {} - - -class RackEdge(BaseEdge): - char = "R" - - description = "Rack (and pinion) Edge" - - def __init__(self, boxes, settings) -> None: - super().__init__(boxes, settings) - self.gear = gears.Gears(boxes) - - def __call__(self, length, **kw): - params = self.settings.values.copy() - params["draw_rack"] = True - params["rack_base_height"] = -1E-36 - params["rack_teeth_length"] = int(length // (params["dimension"] * math.pi)) - params["rack_base_tab"] = (length - (params["rack_teeth_length"]) * params["dimension"] * math.pi) / 2.0 - s_tmp = self.boxes.spacing - self.boxes.spacing = 0 - self.moveTo(length, 0, 180) - self.gear(move="", **params) - self.moveTo(0, 0, 180) - self.boxes.spacing = s_tmp - - def margin(self) -> float: - return self.settings.dimension * 1.1 - - -class RoundedTriangleEdgeSettings(Settings): - """Settings for RoundedTriangleEdge -Values: - -* absolute_params - - * height : 150. : height above the wall - * radius : 30. : radius of top corner - * r_hole : 0. : radius of hole - -* relative (in multiples of thickness) - - * outset : 0 : extend the triangle along the length of the edge (multiples of thickness) - -""" - - absolute_params = { - "height": 50., - "radius": 30., - "r_hole": 2., - } - - relative_params = { - "outset": 0., - } - - def edgeObjects(self, boxes, chars: str = "t", add: bool = True): - edges = [RoundedTriangleEdge(boxes, self), - RoundedTriangleFingerHolesEdge(boxes, self)] - return self._edgeObjects(edges, boxes, chars, add) - - -class RoundedTriangleEdge(Edge): - """Makes an 'edge' with a rounded triangular bumpout and - optional hole""" - description = "Triangle for handle" - char = "t" - - def __call__(self, length, **kw): - length += 2 * self.settings.outset - r = self.settings.radius - if r > length / 2: - r = length / 2 - if length - 2 * r < self.settings.height: # avoid division by zero - angle = 90 - math.degrees(math.atan( - (length - 2 * r) / (2 * self.settings.height))) - l = self.settings.height / math.cos(math.radians(90 - angle)) - else: - angle = math.degrees(math.atan( - 2 * self.settings.height / (length - 2 * r))) - l = 0.5 * (length - 2 * r) / math.cos(math.radians(angle)) - if self.settings.outset: - self.polyline(0, -180, self.settings.outset, 90) - else: - self.corner(-90) - if self.settings.r_hole: - self.hole(self.settings.height, length / 2., self.settings.r_hole) - self.corner(90 - angle, r, tabs=1) - self.edge(l, tabs=1) - self.corner(2 * angle, r, tabs=1) - self.edge(l, tabs=1) - self.corner(90 - angle, r, tabs=1) - if self.settings.outset: - self.polyline(0, 90, self.settings.outset, -180) - else: - self.corner(-90) - - def margin(self) -> float: - return self.settings.height + self.settings.radius - - -class RoundedTriangleFingerHolesEdge(RoundedTriangleEdge): - char = "T" - - def startwidth(self) -> float: - return self.settings.thickness - - def __call__(self, length, **kw): - self.fingerHolesAt(0, 0.5 * self.settings.thickness, length, 0) - super().__call__(length, **kw) - - -class HandleEdgeSettings(Settings): - """Settings for HandleEdge -Values: - -* absolute_params - - * height : 20. : height above the wall in mm - * radius : 10. : radius of corners in mm - * hole_width : "40:40" : width of hole(s) in percentage of maximum hole width (width of edge - (n+1) * material thickness) - * hole_height : 75. : height of hole(s) in percentage of maximum hole height (handle height - 2 * material thickness) - * on_sides : True, : added to side panels if checked, to front and back otherwise (only used with top_edge parameter) - -* relative - - * outset : 1. : extend the handle along the length of the edge (multiples of thickness) - -""" - - absolute_params = { - "height": 20., - "radius": 10., - "hole_width": "40:40", - "hole_height": 75., - "on_sides": True, - } - - relative_params = { - "outset": 1., - } - - def edgeObjects(self, boxes, chars: str = "yY", add: bool = True): - edges = [HandleEdge(boxes, self), - HandleHoleEdge(boxes, self)] - return self._edgeObjects(edges, boxes, chars, add) - - -# inspiration came from https://www.thingiverse.com/thing:327393 - -class HandleEdge(Edge): - """Extends an 'edge' by adding a rounded bumpout with optional holes""" - description = "Handle for e.g. a drawer" - char = "y" - extra_height = 0.0 - - def __call__(self, length, **kw): - length += 2 * self.settings.outset - extra_height = self.extra_height * self.settings.thickness - - r = self.settings.radius - if r > length / 2: - r = length / 2 - if r > self.settings.height: - r = self.settings.height - - widths = argparseSections(self.settings.hole_width) - - if self.settings.outset: - self.polyline(0, -180, self.settings.outset, 90) - else: - self.corner(-90) - - if self.settings.hole_height and sum(widths) > 0: - if sum(widths) < 100: - slot_offset = ((1 - sum(widths) / 100) * (length - (len(widths) + 1) * self.thickness)) / (len(widths) * 2) - else: - slot_offset = 0 - - slot_height = (self.settings.height - 2 * self.thickness) * self.settings.hole_height / 100 - slot_x = self.thickness + slot_offset - - for w in widths: - if sum(widths) > 100: - slotwidth = w / sum(widths) * (length - (len(widths) + 1) * self.thickness) - else: - slotwidth = w / 100 * (length - (len(widths) + 1) * self.thickness) - slot_x += slotwidth / 2 - with self.saved_context(): - self.moveTo((self.settings.height / 2) + extra_height, slot_x, 0) - self.rectangularHole(0, 0, slot_height, slotwidth, slot_height / 2, True, True) - slot_x += slotwidth / 2 + slot_offset + self.thickness + slot_offset - - self.edge(self.settings.height - r + extra_height, tabs=1) - self.corner(90, r, tabs=1) - self.edge(length - 2 * r, tabs=1) - self.corner(90, r, tabs=1) - self.edge(self.settings.height - r + extra_height, tabs=1) - - if self.settings.outset: - self.polyline(0, 90, self.settings.outset, -180) - else: - self.corner(-90) - - def margin(self) -> float: - return self.settings.height - - -class HandleHoleEdge(HandleEdge): - """Extends an 'edge' by adding a rounded bumpout with optional holes and holes for parallel finger joint""" - description = "Handle with holes for parallel finger joint" - char = "Y" - extra_height = 1.0 - - def __call__(self, length, **kw): - self.fingerHolesAt(0, -0.5 * self.settings.thickness, length, 0) - super().__call__(length, **kw) - - def margin(self) -> float: - return self.settings.height + self.extra_height * self.settings.thickness diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/extents.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/extents.py deleted file mode 100644 index b2ab4a6..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/extents.py +++ /dev/null @@ -1,43 +0,0 @@ -class Extents: - __slots__ = "xmin ymin xmax ymax".split() - - def __init__(self, xmin: float = float('inf'), ymin: float = float('inf'), xmax: float = float('-inf'), ymax: float = float('-inf')) -> None: - self.xmin = xmin - self.ymin = ymin - self.xmax = xmax - self.ymax = ymax - - def add(self, x: float, y: float) -> None: - self.xmin = min(self.xmin, x) - self.xmax = max(self.xmax, x) - self.ymin = min(self.ymin, y) - self.ymax = max(self.ymax, y) - - def extend(self, l) -> None: - for x, y in l: - self.add(x, y) - - def __add__(self, extent): - # todo: why can this happen? - if extent == 0: - return Extents(self.xmin, self.ymin, self.xmax, self.ymax) - return Extents( - min(self.xmin, extent.xmin), min(self.ymin, extent.ymin), - max(self.xmax, extent.xmax), max(self.ymax, extent.ymax) - ) - - def __radd__(self, extent): - if extent == 0: - return Extents(self.xmin, self.ymin, self.xmax, self.ymax) - return self.__add__(extent) - - @property - def width(self) -> float: - return self.xmax - self.xmin - - @property - def height(self) -> float: - return self.ymax - self.ymin - - def __repr__(self) -> str: - return f'Extents ({self.xmin},{self.ymin})-({self.xmax},{self.ymax})' diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/formats.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/formats.py deleted file mode 100644 index b49f196..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/formats.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - - -import os -import shutil -import subprocess -import tempfile - -from boxes.drawing import Context, LBRN2Surface, PSSurface, SVGSurface - - -class Formats: - - pstoedit_candidates = ["/usr/bin/pstoedit", "pstoedit", "pstoedit.exe"] - ps2pdf_candidates = ["/usr/bin/ps2pdf", "ps2pdf", "ps2pdf.exe"] - - _BASE_FORMATS = ['svg', 'svg_Ponoko', 'ps', 'lbrn2'] - - formats = { - "svg": None, - "svg_Ponoko": None, - "ps": None, - "lbrn2": None, - "dxf": "{pstoedit} -flat 0.1 -f dxf:-mm {input} {output}", - "gcode": "{pstoedit} -f gcode {input} {output}", - "plt": "{pstoedit} -f hpgl {input} {output}", - # "ai": "{pstoedit} -f ps2ai", - "pdf": "{ps2pdf} -dEPSCrop {input} {output}", - } - - http_headers = { - "svg": [('Content-type', 'image/svg+xml; charset=utf-8')], - "svg_Ponoko": [('Content-type', 'image/svg+xml; charset=utf-8')], - "ps": [('Content-type', 'application/postscript')], - "lbrn2": [('Content-type', 'application/lbrn2')], - "dxf": [('Content-type', 'image/vnd.dxf')], - "plt": [('Content-type', ' application/vnd.hp-hpgl')], - "gcode": [('Content-type', 'text/plain; charset=utf-8')], - - # "" : [('Content-type', '')], - } - - def __init__(self) -> None: - for cmd in self.pstoedit_candidates: - self.pstoedit = shutil.which(cmd) - if self.pstoedit: - break - for cmd in self.ps2pdf_candidates: - self.ps2pdf = shutil.which(cmd) - if self.ps2pdf: - break - - def getFormats(self): - if self.pstoedit: - return sorted(self.formats.keys()) - return self._BASE_FORMATS - - def getSurface(self, fmt): - if fmt in ("svg", "svg_Ponoko"): - surface = SVGSurface() - elif fmt == "lbrn2": - surface = LBRN2Surface() - else: - surface = PSSurface() - - ctx = Context(surface) - return surface, ctx - - def convert(self, data, fmt): - - if fmt not in self._BASE_FORMATS: - fd, tmpfile = tempfile.mkstemp() - os.write(fd, data.getvalue()) - os.close(fd) - fd2, outfile = tempfile.mkstemp() - - cmd = self.formats[fmt].format( - pstoedit=self.pstoedit, - ps2pdf=self.ps2pdf, - input=tmpfile, - output=outfile).split() - - result = subprocess.run(cmd) - os.unlink(tmpfile) - if result.returncode: - # XXX show stderr output - raise ValueError("Conversion failed. pstoedit returned %i\n\n %s" % (result.returncode, result.stderr)) - data = open(outfile, 'rb') - os.unlink(outfile) - os.close(fd2) - - return data diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/gears.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/gears.py deleted file mode 100644 index 55c5f20..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/gears.py +++ /dev/null @@ -1,709 +0,0 @@ -# Copyright (C) 2007 Aaron Spike (aaron @ ekips.org) -# Copyright (C) 2007 Tavmjong Bah (tavmjong @ free.fr) -# Copyright (C) https://cnc-club.ru/forum/viewtopic.php?f=33&t=434&p=2594#p2500 -# Copyright (C) 2014 Jürgen Weigert (juewei@fabmail.org) -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# 2014-03-20 jw@suse.de 0.2 Option --accuracy=0 for automatic added. -# 2014-03-21 sent upstream: https://bugs.launchpad.net/inkscape/+bug/1295641 -# 2014-03-21 jw@suse.de 0.3 Fixed center of rotation for gears with odd number of teeth. -# 2014-04-04 juewei 0.7 Revamped calc_unit_factor(). -# 2014-04-05 juewei 0.7a Correctly positioned rack gear. -# The geometry above the meshing line is wrong. -# 2014-04-06 juewei 0.7b Undercut detection added. Reference: -# https://web.archive.org/web/20140801105942/https://nptel.ac.in/courses/IIT-MADRAS/Machine_Design_II/pdf/2_2.pdf -# Manually merged https://github.com/jnweiger/inkscape-gears-dev/pull/15 -# 2014-04-07 juewei 0.7c Manually merged https://github.com/jnweiger/inkscape-gears-dev/pull/17 -# 2014-04-09 juewei 0.8 Fixed https://github.com/jnweiger/inkscape-gears-dev/issues/19 -# Ring gears are ready for production now. Thanks neon22 for driving this. -# Profile shift implemented (Advanced Tab), fixing -# https://github.com/jnweiger/inkscape-gears-dev/issues/9 -# 2015-05-29 juewei 0.9 ported to inkscape 0.91 -# AttributeError: 'module' object inkex has no attribute 'uutounit -# Fixed https://github.com/jnweiger/inkscape-gears-dev - -from math import acos, asin, ceil, cos, degrees, pi, radians, sin, sqrt, tan -from os import devnull # for debugging - -two_pi = 2 * pi -import argparse - -from boxes.vectors import vdiff, vlength - -__version__ = '0.9' - -def linspace(a,b,n): - """ return list of linear interp of a to b in n steps - - if a and b are ints - you'll get an int result. - - n must be an integer - """ - return [a+x*(b-a)/(n-1) for x in range(0,n)] - -def involute_intersect_angle(Rb, R): - Rb, R = float(Rb), float(R) - return (sqrt(R**2 - Rb**2) / (Rb)) - (acos(Rb / R)) - -def point_on_circle(radius, angle): - """ return xy coord of the point at distance radius from origin at angle """ - x = radius * cos(angle) - y = radius * sin(angle) - return (x, y) - -### Undercut support functions -def undercut_min_teeth(pitch_angle, k=1.0): - """ - computes the minimum tooth count for a - spur gear so that no undercut with the given pitch_angle (in deg) - and an addendum = k * metric_module, where 0 < k < 1 - - Note: - The return value should be rounded upwards for perfect safety. E.g. - min_teeth = int(math.ceil(undercut_min_teeth(20.0))) # 18, not 17 - """ - x = max(sin(radians(pitch_angle)), 0.01) - return 2*k /(x*x) - -def undercut_max_k(teeth, pitch_angle=20.0): - """ computes the maximum k value for a given teeth count and pitch_angle - so that no undercut occurs. - """ - x = max(sin(radians(pitch_angle)), 0.01) - return 0.5 * teeth * x * x - -def undercut_min_angle(teeth, k=1.0): - """ computes the minimum pitch angle, to that the given teeth count (and - profile shift) cause no undercut. - """ - return degrees(asin(min(0.856, sqrt(2.0*k/teeth)))) # max 59.9 deg - - -def have_undercut(teeth, pitch_angle=20.0, k=1.0): - """ returns true if the specified number of teeth would - cause an undercut. - """ - return (teeth < undercut_min_teeth(pitch_angle, k)) - - -## gather all basic gear calculations in one place -def gear_calculations(num_teeth, circular_pitch, pressure_angle, clearance=0, ring_gear=False, profile_shift=0.): - """ Put base calcs for spur/ring gears in one place. - - negative profile shifting helps against undercut. - """ - diametral_pitch = pi / circular_pitch - pitch_diameter = num_teeth / diametral_pitch - pitch_radius = pitch_diameter / 2.0 - addendum = 1 / diametral_pitch - dedendum = addendum - dedendum *= 1+profile_shift - addendum *= 1-profile_shift - - if ring_gear: - addendum = addendum + clearance # our method - else: - dedendum = dedendum + clearance # our method - - base_radius = pitch_diameter * cos(radians(pressure_angle)) / 2.0 - outer_radius = pitch_radius + addendum - root_radius = pitch_radius - dedendum - - # Tooth thickness: Tooth width along pitch circle. - tooth_thickness = ( pi * pitch_diameter ) / ( 2.0 * num_teeth ) - - return (pitch_radius, base_radius, - addendum, dedendum, outer_radius, root_radius, - tooth_thickness - ) - - -def generate_rack_points(tooth_count, pitch, addendum, pressure_angle, - base_height, tab_length, clearance=0, draw_guides=False): - """ Return path (suitable for svg) of the Rack gear. - - rack gear uses straight sides - - - involute on a circle of infinite radius is a simple linear ramp - - - the meshing circle touches at y = 0, - - the highest elevation of the teeth is at y = +addendum - - the lowest elevation of the teeth is at y = -addendum-clearance - - the base_height extends downwards from the lowest elevation. - - we generate this middle tooth exactly centered on the y=0 line. - (one extra tooth on the right hand side, if number of teeth is even) - """ - spacing = 0.5 * pitch # rolling one pitch distance on the spur gear pitch_diameter. - - # roughly center rack in drawing, exact position is so that it meshes - # nicely with the spur gear. - # -0.5*spacing has a gap in the center. - # +0.5*spacing has a tooth in the center. - - if tab_length <= 0.0: - tab_length = 1E-8 - - tas = tan(radians(pressure_angle)) * addendum - tasc = tan(radians(pressure_angle)) * (addendum+clearance) - base_top = addendum+clearance - base_bot = addendum+clearance+base_height - - x_lhs = -pitch * 0.5*tooth_count - tab_length - # Start with base tab on LHS - points = [] # make list of points - points.append((x_lhs, base_bot)) - points.append((x_lhs, base_top)) - x = x_lhs + tab_length+tasc - - # An involute on a circle of infinite radius is a simple linear ramp. - # We need to add curve at bottom and use clearance. - for i in range(tooth_count): - # move along path, generating the next 'tooth' - # pitch line is at y=0. the left edge hits the pitch line at x - points.append((x-tasc, base_top)) - points.append((x+tas, -addendum)) - points.append((x+spacing-tas, -addendum)) - points.append((x+spacing+tasc, base_top)) - x += pitch - - # add base on RHS - x_rhs = x - tasc + tab_length - points.append((x_rhs, base_top)) - points.append((x_rhs, base_bot)) - # We don't close the path here. Caller does it. - # points.append((x_lhs, base_bot)) - - # Draw line representing the pitch circle of infinite diameter - guide_path = None - p = [] - if draw_guides: - p.append( (x_lhs + 0.5 * tab_length, 0) ) - p.append( (x_rhs - 0.5 * tab_length, 0) ) - - return (points, p) - - -def generate_spur_points(teeth, base_radius, pitch_radius, outer_radius, root_radius, accuracy_involute, accuracy_circular): - """ given a set of core gear params - - generate the svg path for the gear - """ - half_thick_angle = two_pi / (4.0 * teeth ) #?? = pi / (2.0 * teeth) - pitch_to_base_angle = involute_intersect_angle( base_radius, pitch_radius ) - pitch_to_outer_angle = involute_intersect_angle( base_radius, outer_radius ) - pitch_to_base_angle - - start_involute_radius = max(base_radius, root_radius) - radii = linspace(start_involute_radius, outer_radius, accuracy_involute) - angles = [involute_intersect_angle(base_radius, r) for r in radii] - - centers = [(x * two_pi / float( teeth) ) for x in range( teeth ) ] - points = [] - - for c in centers: - # Angles - pitch1 = c - half_thick_angle - base1 = pitch1 - pitch_to_base_angle - offsetangles1 = [ base1 + x for x in angles] - points1 = [ point_on_circle( radii[i], offsetangles1[i]) for i in range(0,len(radii)) ] - - pitch2 = c + half_thick_angle - base2 = pitch2 + pitch_to_base_angle - offsetangles2 = [ base2 - x for x in angles] - points2 = [ point_on_circle( radii[i], offsetangles2[i]) for i in range(0,len(radii)) ] - - points_on_outer_radius = [ point_on_circle(outer_radius, x) for x in linspace(offsetangles1[-1], offsetangles2[-1], accuracy_circular) ] - - if root_radius > base_radius: - pitch_to_root_angle = pitch_to_base_angle - involute_intersect_angle(base_radius, root_radius ) - root1 = pitch1 - pitch_to_root_angle - root2 = pitch2 + pitch_to_root_angle - points_on_root = [point_on_circle (root_radius, x) for x in linspace(root2, root1+(two_pi/float(teeth)), accuracy_circular) ] - p_tmp = points1 + points_on_outer_radius[1:-1] + points2[::-1] + points_on_root[1:-1] # [::-1] reverses list; [1:-1] removes first and last element - else: - points_on_root = [point_on_circle (root_radius, x) for x in linspace(base2, base1+(two_pi/float(teeth)), accuracy_circular) ] - p_tmp = points1 + points_on_outer_radius[1:-1] + points2[::-1] + points_on_root # [::-1] reverses list - - points.extend( p_tmp ) - - return (points) - -def inkbool(val): - return val not in ("False", False, "0", 0, "None", None) - -class OptionParser(argparse.ArgumentParser): - - types = { - "int" : int, - "float" : float, - "string" : str, - "inkbool" : inkbool, - } - - def add_option(self, short, long_, **kw): - kw["type"] = self.types[kw["type"]] - names = [] - if short: - names.append("-" + short.replace("-", "_")[1:]) - if long_: - names.append("--" + long_.replace("-", "_")[2:]) - self.add_argument(*names, **kw) - -class Gears(): - - def __init__(self, boxes, **kw) -> None: - # an alternate way to get debug info: - # could use inkex.debug(string) instead... - #try: - # self.tty = open("/dev/tty", 'w') - #except: - # self.tty = open(devnull, 'w') # '/dev/null' for POSIX, 'nul' for Windows. - # # print >>self.tty, "gears-dev " + __version__ - - self.boxes = boxes - self.OptionParser = OptionParser() - self.OptionParser.add_option("-t", "--teeth", - action="store", type="int", - dest="teeth", default=24, - help="Number of teeth") - - self.OptionParser.add_option("-s", "--system", - action="store", type="string", - dest="system", default='MM', - help="Select system: 'CP' (Cyclic Pitch (default)), 'DP' (Diametral Pitch), 'MM' (Metric Module)") - - self.OptionParser.add_option("-d", "--dimension", - action="store", type="float", - dest="dimension", default=1.0, - help="Tooth size, depending on system (which defaults to CP)") - - - self.OptionParser.add_option("-a", "--angle", - action="store", type="float", - dest="angle", default=20.0, - help="Pressure Angle (common values: 14.5, 20, 25 degrees)") - - self.OptionParser.add_option("-p", "--profile-shift", - action="store", type="float", - dest="profile_shift", default=20.0, - help="Profile shift [in percent of the module]. Negative values help against undercut") - - self.OptionParser.add_option("-u", "--units", - action="store", type="string", - dest="units", default='mm', - help="Units this dialog is using") - - self.OptionParser.add_option("-A", "--accuracy", - action="store", type="int", - dest="accuracy", default=0, - help="Accuracy of involute: automatic: 5..20 (default), best: 20(default), medium 10, low: 5; good accuracy is important with a low tooth count") - # Clearance: Radial distance between top of tooth on one gear to bottom of gap on another. - self.OptionParser.add_option("", "--clearance", - action="store", type="float", - dest="clearance", default=0.0, - help="Clearance between bottom of gap of this gear and top of tooth of another") - - self.OptionParser.add_option("", "--annotation", - action="store", type="inkbool", - dest="annotation", default=False, - help="Draw annotation text") - - self.OptionParser.add_option("-i", "--internal-ring", - action="store", type="inkbool", - dest="internal_ring", default=False, - help="Ring (or Internal) gear style (default: normal spur gear)") - - self.OptionParser.add_option("", "--mount-hole", - action="store", type="float", - dest="mount_hole", default=0., - help="Mount hole diameter") - - self.OptionParser.add_option("", "--mount-diameter", - action="store", type="float", - dest="mount_diameter", default=15, - help="Mount support diameter") - - self.OptionParser.add_option("", "--spoke-count", - action="store", type="int", - dest="spoke_count", default=3, - help="Spokes count") - - self.OptionParser.add_option("", "--spoke-width", - action="store", type="float", - dest="spoke_width", default=5, - help="Spoke width") - - self.OptionParser.add_option("", "--holes-rounding", - action="store", type="float", - dest="holes_rounding", default=5, - help="Holes rounding") - - self.OptionParser.add_option("", "--active-tab", - action="store", type="string", - dest="active_tab", default='', - help="Active tab. Not used now.") - - self.OptionParser.add_option("-x", "--centercross", - action="store", type="inkbool", - dest="centercross", default=False, - help="Draw cross in center") - - self.OptionParser.add_option("-c", "--pitchcircle", - action="store", type="inkbool", - dest="pitchcircle", default=False, - help="Draw pitch circle (for mating)") - - self.OptionParser.add_option("-r", "--draw-rack", - action="store", type="inkbool", - dest="drawrack", default=False, - help="Draw rack gear instead of spur gear") - - self.OptionParser.add_option("", "--rack-teeth-length", - action="store", type="int", - dest="teeth_length", default=12, - help="Length (in teeth) of rack") - - self.OptionParser.add_option("", "--rack-base-height", - action="store", type="float", - dest="base_height", default=8, - help="Height of base of rack") - - self.OptionParser.add_option("", "--rack-base-tab", - action="store", type="float", - dest="base_tab", default=14, - help="Length of tabs on ends of rack") - - self.OptionParser.add_option("", "--undercut-alert", - action="store", type="inkbool", - dest="undercut_alert", default=False, - help="Let the user confirm a warning dialog if undercut occurs. This dialog also shows helpful hints against undercut") - - def calc_circular_pitch(self): - """We use math based on circular pitch.""" - dimension = self.options.dimension - if self.options.system == 'CP': # circular pitch - circular_pitch = dimension * 25.4 - elif self.options.system == 'DP': # diametral pitch - circular_pitch = pi * 25.4 / dimension - elif self.options.system == 'MM': # module (metric) - circular_pitch = pi * dimension - else: - raise ValueError("unknown system '%s', try CP, DP, MM" % self.options.system) - - # circular_pitch defines the size in mm - return circular_pitch - - def generate_spokes(self, root_radius, spoke_width, spokes, mount_radius, mount_hole, - unit_factor, unit_label): - """ given a set of constraints - - generate the svg path for the gear spokes - - lies between mount_radius (inner hole) and root_radius (bottom of the teeth) - - spoke width also defines the spacing at the root_radius - - mount_radius is adjusted so that spokes fit if there is room - - if no room (collision) then spokes not drawn - """ - - if not spokes: - return [] - - # Spokes - collision = False # assume we draw spokes - messages = [] # messages to send back about changes. - spoke_holes = [] - r_outer = root_radius - spoke_width - - try: - spoke_count = spokes - spokes = [i*2*pi/spokes for i in range(spoke_count)] - except TypeError: - spoke_count = len(spokes) - spokes = [radians(a) for a in spokes] - spokes.append(spokes[0]+two_pi) - - # checks for collision with spokes - # check for mount hole collision with inner spokes - if mount_radius <= mount_hole/2: - adj_factor = (r_outer - mount_hole/2) / 5 - - if adj_factor < 0.1: - # not enough reasonable room - collision = True - else: - mount_radius = mount_hole/2 + adj_factor # small fix - messages.append(f"Mount support too small. Auto increased to {mount_radius/unit_factor*2:2.2f}{unit_label}.") - - # then check to see if cross-over on spoke width - for i in range(spoke_count): - angle = spokes[i]-spokes[i-1] - - if spoke_width >= angle * mount_radius: - adj_factor = 1.2 # wrong value. its probably one of the points distances calculated below - mount_radius += adj_factor - messages.append(f"Too many spokes. Increased Mount support by {adj_factor/unit_factor:2.3f}{unit_label}") - - # check for collision with outer rim - if r_outer <= mount_radius: - # not enough room to draw spokes so cancel - collision = True - if collision: # don't draw spokes if no room. - messages.append("Not enough room for Spokes. Decrease Spoke width.") - else: # draw spokes - - for i in range(spoke_count): - self.boxes.ctx.save() - start_a, end_a = spokes[i], spokes[i+1] - # inner circle around mount - asin_factor = spoke_width/mount_radius/2 - # check if need to clamp radius - asin_factor = max(-1.0, min(1.0, asin_factor)) # no longer needed - resized above - a = asin(asin_factor) - - # is inner circle too small - asin_factor = spoke_width/r_outer/2 - # check if need to clamp radius - asin_factor = max(-1.0, min(1.0, asin_factor)) # no longer needed - resized above - a2 = asin(asin_factor) - l = vlength(vdiff(point_on_circle(mount_radius, start_a + a), - point_on_circle(r_outer, start_a + a2))) - self.boxes.moveTo(*point_on_circle(mount_radius, start_a + a), degrees=degrees(start_a)) - self.boxes.polyline( - l, - +90+degrees(a2), 0, - (degrees(end_a-start_a-2*a2), r_outer), 0, - +90+degrees(a2), - l, 90-degrees(a), 0, - (-degrees(end_a-start_a-2*a), mount_radius), - 0, 90+degrees(a2), 0 - ) - - self.boxes.ctx.restore() - - return messages - - def sizes(self, **kw): - self.options = self.OptionParser.parse_args([f"--{name}={value}" for name, value in kw.items()]) - # Pitch (circular pitch): Length of the arc from one tooth to the next) - # Pitch diameter: Diameter of pitch circle. - pitch = self.calc_circular_pitch() - - if self.options.drawrack: - base_height = self.options.base_height * unit_factor - tab_width = self.options.base_tab * unit_factor - tooth_count = self.options.teeth_length - width = tooth_count * pitch + 2*tab_width - height = base_height+ 2* addendum - return 0, width, height - - teeth = self.options.teeth - # Angle of tangent to tooth at circular pitch wrt radial line. - angle = self.options.angle - # Clearance: Radial distance between top of tooth on one gear to - # bottom of gap on another. - clearance = self.options.clearance # * unit_factor - # Replace section below with this call to get the combined gear_calculations() above - (pitch_radius, base_radius, addendum, dedendum, - outer_radius, root_radius, tooth) = gear_calculations(teeth, pitch, angle, clearance, self.options.internal_ring, self.options.profile_shift*0.01) - if self.options.internal_ring: - outer_radius += self.options.spoke_width - return pitch_radius, 2*outer_radius, 2*outer_radius - - def gearCarrier(self, r, spoke_width, positions, mount_radius, mount_hole, circle=True, callback=None, move=None): - width = 2*r+spoke_width - - if self.boxes.move(width, width, move, before=True): - return - - try: - positions = [i*360/positions for i in range(positions)] - except TypeError: - pass - - self.boxes.ctx.save() - self.boxes.moveTo(width/2.0, width/2.0) - if callback: - self.boxes.cc(callback, None) - self.generate_spokes(r+0.5*spoke_width, spoke_width, positions, mount_radius, mount_hole, 1, "") - self.boxes.hole(0, 0, mount_hole) - - for angle in positions: - self.boxes.ctx.save() - self.boxes.moveTo(0, 0, angle) - self.boxes.hole(r, 0, mount_hole) - self.boxes.ctx.restore() - - self.boxes.moveTo(r+0.5*spoke_width+self.boxes.burn, 0, 90) - self.boxes.corner(360, r+0.5*spoke_width) - - self.boxes.ctx.restore() - self.boxes.move(width, width, move) - - def __call__(self, teeth_only=False, move="", callback=None, **kw): - """ Calculate Gear factors from inputs. - - Make list of radii, angles, and centers for each tooth and - iterate through them - - Turn on other visual features e.g. cross, rack, annotations, etc - """ - self.options = self.OptionParser.parse_args([f"--{name}={value}" for name, value in kw.items()]) - - warnings = [] # list of extra messages to be shown in annotations - # calculate unit factor for units defined in dialog. - unit_factor = 1 - # User defined options - teeth = self.options.teeth - # Angle of tangent to tooth at circular pitch wrt radial line. - angle = self.options.angle - # Clearance: Radial distance between top of tooth on one gear to - # bottom of gap on another. - clearance = self.options.clearance * unit_factor - mount_hole = self.options.mount_hole * unit_factor - # for spokes - mount_radius = self.options.mount_diameter * 0.5 * unit_factor - spoke_count = self.options.spoke_count - spoke_width = self.options.spoke_width * unit_factor - holes_rounding = self.options.holes_rounding * unit_factor # unused - # visible guide lines - centercross = self.options.centercross # draw center or not (boolean) - pitchcircle = self.options.pitchcircle # draw pitch circle or not (boolean) - - # Accuracy of teeth curves - accuracy_involute = 20 # Number of points of the involute curve - accuracy_circular = 9 # Number of points on circular parts - if self.options.accuracy is not None: - if self.options.accuracy == 0: - # automatic - if teeth < 10: accuracy_involute = 20 - elif teeth < 30: accuracy_involute = 12 - else: accuracy_involute = 6 - else: - accuracy_involute = self.options.accuracy - - accuracy_circular = max(3, int(accuracy_involute/2) - 1) # never less than three - # print >>self.tty, "accuracy_circular=%s accuracy_involute=%s" % (accuracy_circular, accuracy_involute) - # Pitch (circular pitch): Length of the arc from one tooth to the next) - # Pitch diameter: Diameter of pitch circle. - pitch = self.calc_circular_pitch() - # Replace section below with this call to get the combined gear_calculations() above - (pitch_radius, base_radius, addendum, dedendum, - outer_radius, root_radius, tooth) = gear_calculations(teeth, pitch, angle, clearance, self.options.internal_ring, self.options.profile_shift*0.01) - - b = self.boxes.burn - # Add Rack (instead) - if self.options.drawrack: - base_height = self.options.base_height * unit_factor - tab_width = self.options.base_tab * unit_factor - tooth_count = self.options.teeth_length - (points, guide_points) = generate_rack_points(tooth_count, pitch, addendum, angle, - base_height, tab_width, clearance, pitchcircle) - width = tooth_count * pitch + 2 * tab_width - height = base_height + 2 * addendum - if self.boxes.move(width, height, move, before=True): - return - - self.boxes.cc(callback, None) - self.boxes.moveTo(width/2.0, base_height+addendum, -180) - if base_height < 0: - points = points[1:-1] - self.boxes.drawPoints(points, close=base_height >= 0) - self.boxes.drawPoints(guide_points, kerfdir=0) - self.boxes.move(width, height, move) - - return - - # Move only - width = height = 2 * outer_radius - if self.options.internal_ring: - width = height = width + 2 * self.options.spoke_width - - if not teeth_only and self.boxes.move(width, height, move, before=True): - return - - # Detect Undercut of teeth -## undercut = int(ceil(undercut_min_teeth( angle ))) -## needs_undercut = teeth < undercut #? no longer needed ? - if have_undercut(teeth, angle, 1.0): - min_teeth = int(ceil(undercut_min_teeth(angle, 1.0))) - min_angle = undercut_min_angle(teeth, 1.0) + .1 - max_k = undercut_max_k(teeth, angle) - msg = "Undercut Warning: This gear (%d teeth) will not work well.\nTry tooth count of %d or more,\nor a pressure angle of %.1f [deg] or more,\nor try a profile shift of %d %%.\nOr other decent combinations." % (teeth, min_teeth, min_angle, int(100.*max_k)-100.) - # alas annotation cannot handle the degree symbol. Also it ignore newlines. - # so split and make a list - warnings.extend(msg.split("\n")) - - # All base calcs done. Start building gear - points = generate_spur_points(teeth, base_radius, pitch_radius, outer_radius, root_radius, accuracy_involute, accuracy_circular) - - if not teeth_only: - self.boxes.moveTo(width/2, height/2) - self.boxes.cc(callback, None, 0, 0) - self.boxes.drawPoints(points) - # Spokes - if not teeth_only and not self.options.internal_ring: # only draw internals if spur gear - msg = self.generate_spokes(root_radius, spoke_width, spoke_count, mount_radius, mount_hole, - unit_factor, self.options.units) - warnings.extend(msg) - - # Draw mount hole - # A : rx,ry x-axis-rotation, large-arch-flag, sweepflag x,y - r = mount_hole / 2 - self.boxes.hole(0, 0, r) - elif not teeth_only: - # its a ring gear - # which only has an outer ring where width = spoke width - r = outer_radius + spoke_width + self.boxes.burn - self.boxes.ctx.save() - self.boxes.moveTo(r, 0) - self.boxes.ctx.arc(-r, 0, r, 0, 2*pi) - self.boxes.ctx.restore() - - # Add center - if centercross: - cs = pitch / 3.0 # centercross length - self.boxes.ctx.save() - self.boxes.ctx.move_to(-cs, 0) - self.boxes.ctx.line_to(+cs, 0) - self.boxes.ctx.move_to(0, -cs) - self.boxes.ctx.line_to(0, +cs) - self.boxes.ctx.restore() - - # Add pitch circle (for mating) - if pitchcircle: - self.boxes.hole(0, 0, pitch_radius) - - # Add Annotations (above) - if self.options.annotation: - outer_dia = outer_radius * 2 - - if self.options.internal_ring: - outer_dia += 2 * spoke_width - - notes = [] - notes.extend(warnings) - #notes.append('Document (%s) scale conversion = %2.4f' % (self.document.getroot().find(inkex.addNS('namedview', 'sodipodi')).get(inkex.addNS('document-units', 'inkscape')), unit_factor)) - notes.extend(['Teeth: %d CP: %2.4f(%s) ' % (teeth, pitch / unit_factor, self.options.units), - f'DP: {25.4 * pi / pitch:2.3f} Module: {pitch:2.4f}(mm)', - 'Pressure Angle: %2.2f degrees' % (angle), - f'Pitch diameter: {pitch_radius * 2 / unit_factor:2.3f} {self.options.units}', - f'Outer diameter: {outer_dia / unit_factor:2.3f} {self.options.units}', - f'Base diameter: {base_radius * 2 / unit_factor:2.3f} {self.options.units}'#, - #'Addendum: %2.4f %s' % (addendum / unit_factor, self.options.units), - #'Dedendum: %2.4f %s' % (dedendum / unit_factor, self.options.units) - ]) - # text height relative to gear size. - # ranges from 10 to 22 over outer radius size 60 to 360 - text_height = max(10, min(10+(outer_dia-60)/24, 22)) - # position above - y = - outer_radius - (len(notes)+1) * text_height * 1.2 - - for note in notes: - self.boxes.text(note, -outer_radius, y) - y += text_height * 1.2 - - if not teeth_only: - self.boxes.move(width, height, move) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/__init__.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/__init__.py deleted file mode 100644 index 89de2fd..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/__init__.py +++ /dev/null @@ -1,80 +0,0 @@ -from __future__ import annotations - -import importlib -import inspect -import os -import pkgutil -from types import ModuleType -from typing import Any - -import boxes - -ui_groups_by_name = {} - - -class UIGroup: - - def __init__(self, name: str, title: str | None = None, description: str = "", image: str = "") -> None: - self.name = name - self.title = title or name - self.description = description - self._image = image - self.generators: list[Any] = [] - # register - ui_groups_by_name[name] = self - - def add(self, box) -> None: - self.generators.append(box) - self.generators.sort(key=lambda b: getattr(b, '__name__', None) or b.__class__.__name__) - - @property - def thumbnail(self) -> str: - return self._image and f"{self._image}-thumb.jpg" - - @property - def image(self) -> str: - return self._image and f"{self._image}.jpg" - - -ui_groups: list[UIGroup] = [ - UIGroup("Box", "Boxes", image="UniversalBox"), - UIGroup("FlexBox", "Boxes with flex", image="RoundedBox"), - UIGroup("Tray", "Trays and Drawer Inserts", image="TypeTray"), - UIGroup("Shelf", "Shelves", image="DisplayShelf"), - UIGroup("WallMounted", image="WallTypeTray"), - UIGroup("Holes", "Hole patterns", image=""), - UIGroup("Part", "Parts and Samples", image="BurnTest"), - UIGroup("Misc", image="TrafficLight"), - UIGroup("Unstable", description="Generators are still untested or need manual adjustment to be useful."), -] - - -def getAllBoxGenerators() -> dict[str, type[boxes.Boxes]]: - generators = {} - path = __path__ - if "BOXES_GENERATOR_PATH" in os.environ: - path.extend(os.environ.get("BOXES_GENERATOR_PATH", "").split(":")) - for importer, modname, ispkg in pkgutil.walk_packages(path=path, prefix=__name__ + '.'): - module = importlib.import_module(modname) - if module.__name__.split('.')[-1].startswith("_"): - continue - for k, v in module.__dict__.items(): - if v is boxes.Boxes: - continue - if inspect.isclass(v) and issubclass(v, boxes.Boxes) and v.__name__[0] != '_': - generators[modname + '.' + v.__name__] = v - return generators - - -def getAllGeneratorModules() -> dict[str, ModuleType]: - generators = {} - path = __path__ - if "BOXES_GENERATOR_PATH" in os.environ: - path.extend(os.environ.get("BOXES_GENERATOR_PATH", "").split(":")) - for importer, modname, ispkg in pkgutil.walk_packages( - path=path, - prefix=__name__ + '.', - onerror=lambda x: None): - module = importlib.import_module(modname) - generators[modname.split('.')[-1]] = module - return generators diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/_swtemplate.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/_swtemplate.py deleted file mode 100644 index a185bfe..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/_swtemplate.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# mypy: ignore-errors - -from boxes import * - - -class SlatwallXXX(Boxes): # Change class name! - """DESCRIPTION""" - - ui_group = "SlatWall" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.SlatWallSettings) - - # remove cli params you do not need - self.buildArgParser(x=100, sx="3*50", y=100, sy="3*50", h=100, hi=0) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--XX", action="store", type=float, default=0.5, - help="DESCRIPTION") - - def render(self): - # Add slat wall edges - s = edges.SlatWallSettings(self.thickness, True, - **self.edgesettings.get("SlatWall", {})) - s.edgeObjects(self) - self.slatWallHolesAt = edges.SlatWallHoles(self, s) - - # render your parts here diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/_template.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/_template.py deleted file mode 100644 index a99cb19..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/_template.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class BOX(Boxes): # Change class name! - """DESCRIPTION""" - - ui_group = "Unstable" # see ./__init__.py for names - - def __init__(self) -> None: - Boxes.__init__(self) - - # Uncomment the settings for the edge types you use - # use keyword args to set default values - # self.addSettingsArgs(edges.FingerJointSettings, finger=1.0,space=1.0) - # self.addSettingsArgs(edges.DoveTailSettings) - # self.addSettingsArgs(edges.StackableSettings) - # self.addSettingsArgs(edges.HingeSettings) - # self.addSettingsArgs(edges.SlideOnLidSettings) - # self.addSettingsArgs(edges.ClickSettings) - # self.addSettingsArgs(edges.FlexSettings) - # self.addSettingsArgs(edges.HandleEdgeSettings) - # self.addSettingsArgs(edges.RoundedTriangleEdgeSettings) - # self.addSettingsArgs(edges.MountingSettings) - - # remove cli params you do not need - self.buildArgParser(x=100, sx="3*50", y=100, sy="3*50", h=100, hi=0) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--XX", action="store", type=float, default=0.5, - help="DESCRIPTION") - - - def render(self): - # adjust to the variables you want in the local scope - x, y, h = self.x, self.y, self.h - t = self.thickness - - # Create new Edges here if needed E.g.: - s = edges.FingerJointSettings(self.thickness, relative=False, - space = 10, finger=10, - width=self.thickness) - p = edges.FingerJointEdge(self, s) - p.char = "a" # 'a', 'A', 'b' and 'B' is reserved for being used within generators - self.addPart(p) - - # render your parts here diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/abox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/abox.py deleted file mode 100644 index 4e32ea5..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/abox.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.lids import LidSettings - - -class ABox(Boxes): - """A simple Box""" - - description = "This box is kept simple on purpose. If you need more features have a look at the UniversalBox." - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(LidSettings) - self.buildArgParser("x", "y", "h", "outside", "bottom_edge") - - def render(self): - x, y, h = self.x, self.y, self.h - t = self.thickness - - t1, t2, t3, t4 = "eeee" - b = self.edges.get(self.bottom_edge, self.edges["F"]) - sideedge = "F" # if self.vertical_edges == "finger joints" else "h" - - if self.outside: - self.x = x = self.adjustSize(x, sideedge, sideedge) - self.y = y = self.adjustSize(y) - self.h = h = self.adjustSize(h, b, t1) - - with self.saved_context(): - self.rectangularWall(x, h, [b, sideedge, t1, sideedge], - ignore_widths=[1, 6], move="up") - self.rectangularWall(x, h, [b, sideedge, t3, sideedge], - ignore_widths=[1, 6], move="up") - - if self.bottom_edge != "e": - self.rectangularWall(x, y, "ffff", move="up") - self.lid(x, y) - - self.rectangularWall(x, h, [b, sideedge, t3, sideedge], - ignore_widths=[1, 6], move="right only") - self.rectangularWall(y, h, [b, "f", t2, "f"], - ignore_widths=[1, 6], move="up") - self.rectangularWall(y, h, [b, "f", t4, "f"], - ignore_widths=[1, 6], move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/agricolainsert.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/agricolainsert.py deleted file mode 100644 index 3b1a8a6..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/agricolainsert.py +++ /dev/null @@ -1,931 +0,0 @@ -# Copyright (C) 2020 Guillaume Collic -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import math -from functools import partial - -from boxes import Boxes, edges - -from .dividertray import DividerSlotsEdge, SlotDescriptionsGenerator - - -class AgricolaInsert(Boxes): - """ - Agricola Revised Edition game box insert, including some expansions. - """ - - ui_group = "Misc" - - description = """ -This insert was designed with 3 mm plywood in mind, and should work fine with -materials around this thickness. - -This is an insert for the [Agricola Revised Edition](https://boardgamegeek.com/boardgame/200680/agricola-revised-edition) -board game. It is specifically designed around the [Farmers Of The Moor expansion](https://boardgamegeek.com/boardgameexpansion/257344/agricola-farmers-moor), -and should also store the [5-6 players expansion](https://boardgamegeek.com/boardgameexpansion/210625/agricola-expansion-5-and-6-players) -(not tested, but I tried to take everything into account for it, please inform -us if you tested it). - -It can be stored inside the original game box, including the 2 expansions, -with the lid slightly raised. - -The parts of a given element are mostly generated next to each other vertically. -It should be straightforward to match them. - -Here are the different elements, from left to right in the generated file. - -#### Card tray - -The cards are all kept in a tray, with paper dividers to sort them easily. When -the tray is not full of cards, wood dividers slides in slots in order to keep -the cards from falling into the empty space. - -There should be enough space for the main game, Farmers Of The Moor, and the 5-6 -player expansion, but not much more than that. - -To keep a lower profile, the cards are at a slight angle, and the paper dividers -tabs are horizontal instead of vertical. -A small wall keeps the card against one side while the tabs protrude on the -other side, above the small wall. - -The wall with the big hole is the sloped one. It goes between the two -"comb-like" walls first, with its two small holes at the bottom. Then there is a -low-height long wall with a sloped edge which should go from the sloped wall to -the other side. You can finish the tray with the last wall at the end. - -#### Upper level trays - -4 trays with movable walls are used to store resources. They were designed to -store them in this order: - -* Stone / Vegetable / Pig / Cow -* Reed / Grain / Sheep -* Wood / Clay -* Food / Fire - -The wall would probably be better if fixed instead of movable, but I would like -to test with the 5-6 player expansion to be sure their positions are correct -with it too. - -The little feet of the movable wall should be glued. The triangles are put -horizontally, with their bases towards the sides. - -#### Lower level tray - -The lower level tray is used to store the horses. - -#### Room/Field tiles - -Two boxes are generated to store the room/field tiles. One for the wood/field, -the other for the clay/stone. They are stored with the main opening upside, but -I prefer to use them during play with this face on the side. - -#### Moor/Forest and miscellaneous tiles - -A box is generated to store the Moor/Forest tiles, and some other tiles such as -the "multiple resources" cardboard tokens. - -The Moor/Forest tiles are at the same height as the Room/Field, and the upper -level trays are directly on them. The horse box and player box are slightly -lower. This Moor/Forest box have a lowered corner (the one for the miscellaneous -tiles). Two cardboard pieces can be stored between the smaller boxes and the -upper level trays (as seen on the picture). - -Be sure to match the pieces so that the walls with smaller heights are next to -each other. - -#### Players bit boxes - -Each player has its own box where the bits of his color are stored. -The cardboard bed from Farmers Of The Moor is central to this box. - -* The fences are stored inside the bed -* The bed is placed in the box, with holes to keep it there (and to take less - height) -* The stables are stored in the two corners -* The five farmers are stored between the bed and the three walls, alternatively - head up and head down. - -During assembly, the small bars are put in the middle holes. The two bigger -holes at the ends are used for the bed feet. The bar keeps the bed from -protruding underneath. - -""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1.0) - - def render(self): - player_box_height = 34.5 - player_box_inner_width = 50.5 - bigger_box_inner_height = 36.7 - row_width = 37.2 - tray_inner_height = 17 - box_width = 218 - card_tray_height = ( - self.thickness * 2 + tray_inner_height + bigger_box_inner_height - ) - card_tray_width = ( - 305.35 - player_box_inner_width * 2 - row_width * 2 - 9 * self.thickness - ) - - self.render_card_divider_tray(card_tray_height, box_width, card_tray_width) - self.render_upper_token_trays(tray_inner_height, box_width) - wood_room_box_width = 39.8 - self.render_room_box(wood_room_box_width, bigger_box_inner_height, row_width) - stone_room_box_width = 26.7 - self.render_room_box(stone_room_box_width, bigger_box_inner_height, row_width) - moor_box_length = 84.6 - self.render_moor_box( - bigger_box_inner_height, player_box_height, row_width, moor_box_length - ) - horse_box_margin = 0.5 - horse_box_length = ( - box_width - - wood_room_box_width - - stone_room_box_width - - moor_box_length - - 6 * self.thickness - - horse_box_margin - ) - self.render_horse_box(player_box_height, row_width, horse_box_length) - for _ in range(6): - self.render_player_box(player_box_height, player_box_inner_width) - - def render_card_divider_tray( - self, card_tray_height, card_tray_length, card_tray_width - ): - """ - The whole tray which contains the cards, including its dividers. - Cards are at an angle, to save height. - """ - self.ctx.save() - - tray_inner_length = card_tray_length - self.thickness - margin_for_score_sheet = 0 # 3 if you want more space for score sheet - sleeved_cards_width = 62 + margin_for_score_sheet - - rad = math.acos(card_tray_height / sleeved_cards_width) - angle = math.degrees(rad) - cos = math.cos(rad) - tan = math.tan(rad) - sin = math.sin(rad) - - slots_number = 19 - slot_depth = 30 - slot_descriptions = SlotDescriptionsGenerator().generate_all_same_angles( - [tray_inner_length / slots_number for _ in range(slots_number)], - self.thickness, - 0.2, - slot_depth, - card_tray_height, - angle, - ) - slot_descriptions.adjust_to_target_length(tray_inner_length) - - sloped_wall_height = sleeved_cards_width - self.thickness * (tan + 1 / tan) - sloped_wall_posx_at_y0 = ( - tray_inner_length - sloped_wall_height * tan - cos * self.thickness - ) - sloped_wall_posx = sloped_wall_posx_at_y0 + cos * self.thickness / 2 - sloped_wall_posy = sin * self.thickness / 2 - - dse = DividerSlotsEdge(self, slot_descriptions.descriptions) - for _ in range(2): - self.rectangularWall( - tray_inner_length, - card_tray_height, - ["e", "e", dse, "f"], - move="up", - callback=[ - partial( - lambda: self.fingerHolesAt( - sloped_wall_posx, - sloped_wall_posy, - sloped_wall_height, - angle=90 - angle, - ) - ) - ], - ) - - # generate spacer - spacer_height = card_tray_height / 2 - spacer_spacing = card_tray_width-99.8 - spacer_upper_width = sloped_wall_posx_at_y0 + spacer_height * tan - self.trapezoidWall( - spacer_height, - spacer_upper_width, - sloped_wall_posx_at_y0, - "fefe", - move="up rotated", - ) - - self.rectangularWall( - card_tray_width, - card_tray_height, - "eFeF", - move="up", - callback=[ - partial( - lambda: self.fingerHolesAt( - spacer_spacing - self.thickness / 2, 0, spacer_height - ) - ) - ], - ) - self.rectangularWall( - card_tray_width, - sloped_wall_height, - "efef", - move="up", - callback=[ - partial( - self.generate_card_tray_sloped_wall_holes, - card_tray_width, - sloped_wall_height, - spacer_height, - spacer_spacing, - rad, - ) - ], - ) - - self.ctx.restore() - self.rectangularWall(card_tray_length, 0, "FFFF", move="right only") - self.ctx.save() - - divider_height = sleeved_cards_width - self.thickness * tan - self.generate_divider( - card_tray_width, divider_height, slot_depth, spacer_spacing, "up" - ) - self.explain( - [ - "Wood divider", - "Hard separation to keep the card", - "from slipping in empty space left.", - "Takes more space, but won't move.", - "Duplicate as much as you want", - "(I use 2).", - ] - ) - - self.ctx.restore() - self.rectangularWall(card_tray_width, 0, "ffff", move="right only") - self.ctx.save() - - self.generate_paper_divider( - card_tray_width, sleeved_cards_width, slot_depth, spacer_spacing, "up" - ) - self.explain( - [ - "Paper divider", - "Soft separation to search easily", - "the card group you need", - "(by expansion, number of player,", - "etc.).", - "Duplicate as much as you want", - "(I use 7).", - ] - ) - self.ctx.restore() - self.rectangularWall(card_tray_width, 0, "ffff", move="right only") - - def explain(self, strings): - self.text( - str.join( - "\n", - strings, - ), - fontsize=7, - align="bottom left", - ) - - def generate_sloped_wall_holes(self, side_wall_length, rad, sloped_wall_height): - cos = math.cos(rad) - tan = math.tan(rad) - sin = math.sin(rad) - posx_at_y0 = side_wall_length - sloped_wall_height * tan - posx = posx_at_y0 - cos * self.thickness / 2 - posy = sin * self.thickness / 2 - self.fingerHolesAt(posx, posy, sloped_wall_height, angle=90 - math.degrees(rad)) - - def generate_card_tray_sloped_wall_holes( - self, side_wall_length, sloped_wall_height, spacer_height, spacer_spacing, rad - ): - # Spacer finger holes - self.fingerHolesAt( - side_wall_length - (spacer_spacing - self.thickness / 2), - # the sloped wall doesn't exactly touch the bottom of the spacer - -self.thickness * math.tan(rad), - spacer_height / math.cos(rad), - ) - - # Big hole to access "lost" space behind sloped wall - radius = 5 - padding = 8 - total_loss = 2 * radius + 2 * padding - self.moveTo(radius + padding, padding) - self.polyline( - side_wall_length - total_loss, - (90, radius), - sloped_wall_height - total_loss, - (90, radius), - side_wall_length - total_loss, - (90, radius), - sloped_wall_height - total_loss, - (90, radius), - ) - - def generate_paper_divider(self, width, height, slot_depth, spacer_spacing, move): - """ - A card separation made of paper, which moves freely in the card tray. - Takes less space and easy to manipulate, but won't block cards in place. - """ - if self.move(width, height, move, True): - return - - margin = 0.5 - actual_width = width - margin - self.polyline( - actual_width - spacer_spacing, - 90, - height - slot_depth, - -90, - spacer_spacing, - 90, - slot_depth, - 90, - actual_width, - 90, - height, - 90, - ) - - # Move for next piece - self.move(width, height, move) - - def generate_divider(self, width, height, slot_depth, spacer_spacing, move): - """ - A card separation made of wood which slides in the side slots. - Can be useful to do hard separations, but takes more space and - less movable than the paper ones. - """ - total_width = width + 2 * self.thickness - - if self.move(total_width, height, move, True): - return - - radius = 16 - padding = 20 - divider_notch_depth = 35 - - self.polyline( - self.thickness + spacer_spacing + padding - radius, - (90, radius), - divider_notch_depth - radius - radius, - (-90, radius), - width - 2 * radius - 2 * padding - spacer_spacing, - (-90, radius), - divider_notch_depth - radius - radius, - (90, radius), - self.thickness + padding - radius, - 90, - slot_depth, - 90, - self.thickness, - -90, - height - slot_depth, - 90, - width - spacer_spacing, - 90, - height - slot_depth, - -90, - self.thickness + spacer_spacing, - 90, - slot_depth, - ) - - # Move for next piece - self.move(total_width, height, move) - - def render_horse_box(self, player_box_height, row_width, width): - """ - Box for the horses on lower level. Same height as player boxes. - """ - length = 2 * row_width + 3 * self.thickness - self.render_simple_tray(width, length, player_box_height) - - def render_moor_box( - self, bigger_box_inner_height, player_box_height, row_width, length - ): - """ - Box for the moor/forest tiles, and the cardboard tokens with multiple - units of resources. - A corner is lowered (the one for the tokens) at the same height as player boxes - to store 2 levels of small boards there. - """ - self.ctx.save() - height = bigger_box_inner_height - lowered_height = player_box_height - self.thickness - lowered_corner_height = height - lowered_height - corner_length = 53.5 - - self.rectangularWall( - length, - 2 * row_width + self.thickness, - "FfFf", - move="up", - callback=[ - partial( - lambda: self.fingerHolesAt( - 0, row_width + 0.5 * self.thickness, length, 0 - ) - ) - ], - ) - - for i in range(2): - self.rectangularWall( - length, - lowered_height, - [ - "f", - "f", - MoorBoxSideEdge( - self, corner_length, lowered_corner_height, i % 2 == 0 - ), - "f", - ], - move="up", - ) - self.rectangularWall(length, height / 2, "ffef", move="up") - - for i in range(2): - self.rectangularWall( - 2 * row_width + self.thickness, - lowered_height, - [ - "F", - "F", - MoorBoxHoleEdge(self, height, lowered_corner_height, i % 2 == 0), - "F", - ], - move="up", - callback=[ - partial(self.generate_side_finger_holes, row_width, height / 2) - ], - ) - - self.ctx.restore() - self.rectangularWall(length, 0, "FFFF", move="right only") - - def generate_side_finger_holes(self, row_width, height): - self.fingerHolesAt(row_width + 0.5 * self.thickness, 0, height) - - def render_room_box(self, width, height, row_width): - """ - A box in which storing room/field tiles. - """ - border_height = 12 - room_box_length = row_width * 2 + self.thickness - - self.ctx.save() - - self.rectangularWall( - room_box_length, - height, - "eFfF", - move="up", - callback=[partial(self.generate_side_finger_holes, row_width, height)], - ) - - self.rectangularWall( - room_box_length, - width, - "FFfF", - move="up", - callback=[partial(self.generate_side_finger_holes, row_width, width)], - ) - - self.rectangularWall( - room_box_length, - border_height, - "FFeF", - move="up", - callback=[ - partial(self.generate_side_finger_holes, row_width, border_height) - ], - ) - - for _ in range(3): - self.trapezoidWall(width, height, border_height, "ffef", move="up") - - self.ctx.restore() - - self.rectangularWall(room_box_length, 0, "FFFF", move="right only") - - def render_player_box(self, player_box_height, player_box_inner_width): - """ - A box in which storing all the bits of a single player, - including (and designed for) the cardboard bed from Farmers Of The Moor. - """ - self.ctx.save() - bed_inner_height = player_box_height - self.thickness - bed_inner_length = 66.75 - bed_inner_width = player_box_inner_width - cardboard_bed_foot_height = 6.5 - cardboard_bed_hole_margin = 5 - cardboard_bed_hole_length = 12 - bed_head_length = 20 - bed_foot_height = 18 - support_length = 38 - - bed_edge = Bed2SidesEdge( - self, bed_inner_length, bed_head_length, bed_foot_height - ) - noop_edge = NoopEdge(self) - self.ctx.save() - optim_180_x = ( - bed_inner_length + self.thickness + bed_head_length + 2 * self.spacing - ) - optim_180_y = 2 * bed_foot_height - player_box_height + 2 * self.spacing - for _ in range(2): - self.rectangularWall( - bed_inner_length, - bed_inner_height, - ["F", bed_edge, noop_edge, "F"], - move="up", - ) - self.moveTo(optim_180_x, optim_180_y, -180) - self.ctx.restore() - self.moveTo(0, bed_inner_height + self.thickness + self.spacing + optim_180_y) - - self.rectangularWall( - bed_inner_length, - bed_inner_width, - "feff", - move="up", - callback=[ - partial( - self.generate_bed_holes, - bed_inner_width, - cardboard_bed_hole_margin, - cardboard_bed_hole_length, - support_length, - ) - ], - ) - - self.ctx.save() - self.rectangularWall( - bed_inner_width, - bed_inner_height, - ["F", "f", BedHeadEdge(self, bed_inner_height - 15), "f"], - move="right", - ) - for _ in range(2): - self.rectangularWall( - cardboard_bed_foot_height - self.thickness, - support_length, - "efee", - move="right", - ) - self.ctx.restore() - self.rectangularWall( - bed_inner_width, - bed_inner_height, - "Ffef", - move="up only", - ) - - self.ctx.restore() - self.rectangularWall( - bed_inner_length + bed_head_length + self.spacing - self.thickness, - 0, - "FFFF", - move="right only", - ) - - def generate_bed_holes(self, width, margin, hole_length, support_length): - support_start = margin + hole_length - - bed_width = 29.5 - bed_space_to_wall = (width - bed_width) / 2 - bed_feet_width = 3 - - posy_1 = bed_space_to_wall - posy_2 = width - bed_space_to_wall - - for y, direction in [(posy_1, 1), (posy_2, -1)]: - bed_feet_middle_y = y + direction * bed_feet_width / 2 - support_middle_y = y + direction * self.thickness / 2 - self.rectangularHole( - margin, - bed_feet_middle_y, - hole_length, - bed_feet_width, - center_x=False, - ) - self.fingerHolesAt(support_start, support_middle_y, support_length, angle=0) - self.rectangularHole( - support_start + support_length, - bed_feet_middle_y, - hole_length, - bed_feet_width, - center_x=False, - ) - - def render_upper_token_trays(self, tray_inner_height, box_width): - """ - Upper level : multiple trays for each resource - (beside horses which are on the lower level) - """ - tray_height = tray_inner_height + self.thickness - upper_level_width = 196 - upper_level_length = box_width - row_width = upper_level_width / 3 - - # Stone / Vegetable / Pig / Cow - self.render_simple_tray(row_width, upper_level_length, tray_height, 3) - # Reed / Grain / Sheep - self.render_simple_tray(row_width, upper_level_length * 2 / 3, tray_height, 2) - # Wood / Clay - self.render_simple_tray(row_width, upper_level_length * 2 / 3, tray_height, 1) - # Food / Fire - self.render_simple_tray(upper_level_length / 3, row_width * 2, tray_height, 1) - - def render_simple_tray(self, outer_width, outer_length, outer_height, dividers=0): - """ - One of the upper level trays, with movable dividers. - """ - width = outer_width - 2 * self.thickness - length = outer_length - 2 * self.thickness - height = outer_height - self.thickness - self.ctx.save() - self.rectangularWall(width, length, "FFFF", move="up") - for _ in range(2): - self.rectangularWall(width, height, "ffef", move="up") - self.ctx.restore() - self.rectangularWall(width, length, "FFFF", move="right only") - for _ in range(2): - self.rectangularWall(height, length, "FfFe", move="right") - - if dividers: - self.ctx.save() - for _ in range(dividers): - self.render_simple_tray_divider(width, height, "up") - self.ctx.restore() - self.render_simple_tray_divider(width, height, "right only") - - def render_simple_tray_divider(self, width, height, move): - """ - Simple movable divider. A wall with small feet for a little more stability. - """ - - if self.move(height, width, move, True): - return - - t = self.thickness - self.polyline( - height - t, - 90, - t, - -90, - t, - 90, - width - 2 * t, - 90, - t, - -90, - t, - 90, - height - t, - 90, - width, - 90, - ) - - self.move(height, width, move) - - self.render_simple_tray_divider_feet(width, height, move) - - def render_simple_tray_divider_feet(self, width, height, move): - sqr2 = math.sqrt(2) - t = self.thickness - divider_foot_width = 2 * t - full_width = t + 2 * divider_foot_width - move_length = self.spacing + full_width / sqr2 - move_width = self.spacing + max(full_width, height) - - if self.move(move_width, move_length, move, True): - return - - self.ctx.save() - self.polyline( - sqr2 * divider_foot_width, - 135, - t, - -90, - t, - -90, - t, - 135, - sqr2 * divider_foot_width, - 135, - full_width, - 135, - ) - self.ctx.restore() - - self.moveTo(-self.burn / sqr2, self.burn * (1 + 1 / sqr2), 45) - self.moveTo(full_width) - - self.polyline( - 0, - 135, - sqr2 * divider_foot_width, - 135, - t, - -90, - t, - -90, - t, - 135, - sqr2 * divider_foot_width, - 135, - ) - - self.move(move_width, move_length, move) - - -class MoorBoxSideEdge(edges.BaseEdge): - """ - Edge for the sides of the moor tiles box - """ - - def __init__(self, boxes, corner_length, corner_height, lower_corner) -> None: - super().__init__(boxes, None) - self.corner_height = corner_height - self.lower_corner = lower_corner - self.corner_length = corner_length - - def __call__(self, length, **kw): - radius = self.corner_height / 2 - if self.lower_corner: - self.polyline( - length - self.corner_height - self.corner_length, - (90, radius), - 0, - (-90, radius), - self.corner_length, - ) - else: - self.polyline(length) - - def startwidth(self) -> float: - return self.corner_height - - def endwidth(self) -> float: - return 0.0 if self.lower_corner else self.corner_height - - -class MoorBoxHoleEdge(edges.BaseEdge): - """ - Edge which does the notches for the moor tiles box - """ - - def __init__(self, boxes, height, corner_height, lower_corner) -> None: - super().__init__(boxes, None) - self.height = height - self.corner_height = corner_height - self.lower_corner = lower_corner - - def __call__(self, length, **kw): - one_side_width = (length - self.thickness) / 2 - notch_width = 20 - radius = 6 - upper_edge = (one_side_width - notch_width - 2 * radius) / 2 - hole_start = 10 - lowered_hole_start = 2 - hole_depth = self.height - 2 * radius - lower_edge = notch_width - 2 * radius - - one_side_polyline = lambda margin1, margin2: [ - upper_edge, - (90, radius), - hole_depth - margin1, - (-90, radius), - lower_edge, - (-90, radius), - hole_depth - margin2, - (90, radius), - upper_edge, - ] - - normal_side_polyline = one_side_polyline(hole_start, hole_start) - corner_side_polyline = one_side_polyline( - lowered_hole_start, lowered_hole_start + self.corner_height - ) - - full_polyline = ( - normal_side_polyline - + [0, self.thickness, 0] - + (corner_side_polyline if self.lower_corner else normal_side_polyline) - ) - self.polyline(*full_polyline) - - def startwidth(self) -> float: - return self.corner_height - - def endwidth(self) -> float: - return 0.0 if self.lower_corner else self.corner_height - - -class BedHeadEdge(edges.BaseEdge): - """ - Edge which does the head side of the Agricola player box - """ - - def __init__(self, boxes, hole_depth) -> None: - super().__init__(boxes, None) - self.hole_depth = hole_depth - - def __call__(self, length, **kw): - hole_length = 16 - upper_corner = 10 - lower_corner = 6 - depth = self.hole_depth - upper_corner - lower_corner - upper_edge = (length - hole_length - 2 * upper_corner) / 2 - lower_edge = hole_length - 2 * lower_corner - - self.polyline( - upper_edge, - (90, upper_corner), - depth, - (-90, lower_corner), - lower_edge, - (-90, lower_corner), - depth, - (90, upper_corner), - upper_edge, - ) - - -class Bed2SidesEdge(edges.BaseEdge): - """ - Edge which does a bed like shape, skipping the next corner. - The next edge should be a NoopEdge - """ - - def __init__(self, boxes, bed_length, full_head_length, full_foot_height) -> None: - super().__init__(boxes, None) - self.bed_length = bed_length - self.full_head_length = full_head_length - self.full_foot_height = full_foot_height - - def __call__(self, bed_height, **kw): - foot_corner = 6 - middle_corner = 3 - head_corner = 10 - foot_height = self.full_foot_height - self.thickness - foot_corner - head_length = self.full_head_length - head_corner - self.thickness - corners = foot_corner + middle_corner + head_corner - head_height = bed_height - foot_height - corners - middle_length = self.bed_length - head_length - corners - - self.polyline( - foot_height, - (90, foot_corner), - middle_length, - (-90, middle_corner), - head_height, - (90, head_corner), - head_length, - ) - - -class NoopEdge(edges.BaseEdge): - """ - Edge which does nothing, not even turn or move. - """ - - def __init__(self, boxes) -> None: - super().__init__(boxes, None) - - def __call__(self, length, **kw): - # cancel turn - self.corner(-90) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/airpurifier.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/airpurifier.py deleted file mode 100644 index c308c7b..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/airpurifier.py +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class AirPurifier(Boxes): - """Housing for the Nukit Open Air Purifier""" - - ui_group = "Misc" - - description = """See [Nukit Open Air Purifier](https://github.com/opennukit/Nukit-Open-Air-Purifier/) -""" - - fan_holes = { - 40.: 32.5, - 60.: 50, - 80.: 71.5, - 92.: 82.5, - 120.: 105, - 140.: 125, - } - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.DoveTailSettings, size=2.0, depth=1) - - self.buildArgParser(x=498., y=496.) - - self.argparser.add_argument( - "--filter_height", action="store", type=float, default=46.77, - help="height of the filter along the flow direction (in mm)") - self.argparser.add_argument( - "--rim", action="store", type=float, default=30., - help="rim around the filter holing it in place (in mm)") - self.argparser.add_argument( - "--fan_diameter", action="store", type=float, default=140., - choices=list(self.fan_holes.keys()), - help="diameter of the fans (in mm)") - self.argparser.add_argument( - "--filters", action="store", type=int, default=2, - choices=(1, 2), - help="Filters on both sides or only one") - self.argparser.add_argument( - "--split_frames", action="store", type=BoolArg(), default=True, - help="Split frame pieces into four thin rectangles to save material") - self.argparser.add_argument( - "--fans_left", action="store", type=int, default=-1, - help="number of fans on the left side (-1 for maximal number)") - self.argparser.add_argument( - "--fans_right", action="store", type=int, default=-1, - help="number of fans on the right side (-1 for maximal number)") - self.argparser.add_argument( - "--fans_top", action="store", type=int, default=0, - help="number of fans on the top side (-1 for maximal number)") - self.argparser.add_argument( - "--fans_bottom", action="store", type=int, default=0, - help="number of fans on the bottom side (-1 for maximal number)") - self.argparser.add_argument( - "--screw_holes", action="store", type=float, default=5., - help="diameter of the holes for screwing in the fans (in mm)") - - def fanCB(self, n, h, l, fingerHoles=True, split_frames=False): - fh = self.filter_height - t = self.thickness - r = self.rim - - def cb(): - if fingerHoles: - heights = [fh + t/2] - if self.filters > 1: - heights.append(h - fh - t/2) - for h_ in heights: - if split_frames: - self.fingerHolesAt(0, h_, r, 0) - self.fingerHolesAt(r, h_, l-2*r, 0) - self.fingerHolesAt(l-r, h_, r, 0) - else: - self.fingerHolesAt(0, h_, l, 0) - - max_n = int((l-20) // (self.fan_diameter + 10)) - if n == -1: - n_ = max_n - else: - n_ = min(max_n, n) - - if n_ == 0: - return - w = (l-20) / n_ - x = 10 + w / 2 - delta = self.fan_holes[self.fan_diameter] / 2 - if self.filters==2: - posy = h / 2 - else: - posy = (h + t + fh) / 2 - - for i in range(n_): - posx = x+i*w - self.hole(posx, posy, d=self.fan_diameter-4) - for dx in [-delta, delta]: - for dy in [-delta, delta]: - self.hole(posx + dx, posy + dy, d=self.screw_holes) - - return cb - - def render(self): - x, y, d = self.x, self.y, self.fan_diameter - t = self.thickness - r = self.rim - - y = self.y = y - t # shorten by one thickness as we use the wall space - - fh = self.filter_height - h = d + 2 + self.filters * (fh + t) - - - self.rectangularWall(x, d, "ffff", callback=[ - self.fanCB(self.fans_top, d, x, False)], label="top", move="up") - self.rectangularWall(x, h, "ffff", callback=[ - self.fanCB(self.fans_bottom, h, x)], label="bottom", move="up") - - be = te = edges.CompoundEdge(self, "fff", (r, y - 2*r, r)) \ - if self.split_frames else "f" - - if self.filters==2: - le = edges.CompoundEdge(self, "EFE", (fh + t, d+2, fh + t)) - else: - le = edges.CompoundEdge(self, "FE", (d+2, fh + t)) - te = "f" - - for fans in (self.fans_left, self.fans_right): - self.rectangularWall( - y, h, [be, "h", te, le], - callback=[self.fanCB(fans, h, y, split_frames=self.split_frames)], - move="up") - - - if self.split_frames: - e = edges.CompoundEdge(self, "DeD", (r, x - 2*r, r)) - for _ in range(self.filters): - self.rectangularWall(x, r, ["E", "h", e, "h"], move="up") - self.rectangularWall(y - 2*r, r, "hded", move="up") - self.rectangularWall(y - 2*r, r, "hded", move="up") - self.rectangularWall(x, r, [e, "h", "h", "h"], move="up") - - self.rectangularWall(x, r, ["F", "f", e, "f"], move="up") - self.rectangularWall(y - 2*r, r, "fded", move="up") - self.rectangularWall(y - 2*r, r, "fded", move="up") - self.rectangularWall(x, r, [e, "f", "f", "f"], move="up") - else: - for _ in range(self.filters): - self.rectangularWall(x, y, "Ffff", callback=[ - lambda:self.rectangularHole(x/2, y/2, x - r, y - r, r=10)], move="up") - self.rectangularWall(x, y, "Ehhh", callback=[ - lambda:self.rectangularHole(x/2, y/2, x - r, y - r, r=10)], move="up") - if self.filters==1: - self.rectangularWall(x, y, "hhhh", move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/alledges.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/alledges.py deleted file mode 100644 index 6f31f92..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/alledges.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) 2013-2018 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class AllEdges(Boxes): - """Showing all edge types""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.StackableSettings) - self.addSettingsArgs(edges.HingeSettings) - self.addSettingsArgs(edges.SlideOnLidSettings) - self.addSettingsArgs(edges.ClickSettings) - self.addSettingsArgs(edges.FlexSettings) - self.addSettingsArgs(edges.HandleEdgeSettings) - - self.buildArgParser(x=100) - - def render(self): - x = self.x - t = self.thickness - - chars = list(self.edges.keys()) - chars.sort(key=lambda c: c.lower() + (c if c.isupper() else '')) - chars.reverse() - - self.moveTo(0, 10*t) - - for c in chars: - with self.saved_context(): - self.move(0, 0, "", True) - self.moveTo(x, 0, 90) - self.edge(t+self.edges[c].startwidth()) - self.corner(90) - self.edges[c](x, h=4*t) - self.corner(90) - self.edge(t+self.edges[c].endwidth()) - self.move(0, 0, "") - - self.moveTo(0, 3*t + self.edges[c].spacing()) - self.text(f"{c} - {self.edges[c].description}") - self.moveTo(0, 12*t) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/angledbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/angledbox.py deleted file mode 100644 index 35e86f2..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/angledbox.py +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class AngledBox(Boxes): - """Box with both ends cornered""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("x", "y", "h", "outside", "bottom_edge") - self.argparser.add_argument( - "--n", action="store", type=int, default=5, - help="number of walls at one side (1+)") - self.argparser.add_argument( - "--top", action="store", type=str, default="none", - choices=["none", "angled hole", "angled lid", "angled lid2"], - help="style of the top and lid") - - def floor(self, x, y, n, edge='e', hole=None, move=None, callback=None, label=""): - r, h, side = self.regularPolygon(2*n+2, h=y/2.0) - t = self.thickness - - if n % 2: - lx = x - 2 * h + side - else: - lx = x - 2 * r + side - - edge = self.edges.get(edge, edge) - - tx = x + 2 * edge.spacing() - ty = y + 2 * edge.spacing() - - if self.move(tx, ty, move, before=True): - return - - self.moveTo((tx-lx)/2., edge.margin()) - - if hole: - with self.saved_context(): - hr, hh, hside = self.regularPolygon(2*n+2, h=y/2.0-t) - dx = side - hside - hlx = lx - dx - - self.moveTo(dx/2.0, t+edge.spacing()) - for i, l in enumerate(([hlx] + ([hside] * n))* 2): - self.edge(l) - self.corner(360.0/(2*n + 2)) - - for i, l in enumerate(([lx] + ([side] * n))* 2): - self.cc(callback, i, 0, edge.startwidth() + self.burn) - edge(l) - self.edgeCorner(edge, edge, 360.0/(2*n + 2)) - - self.move(tx, ty, move, label=label) - - def render(self): - - x, y, h, n = self.x, self.y, self.h, self.n - b = self.bottom_edge - - if n < 1: - n = self.n = 1 - - if x < y: - x, y = y, x - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - if self.top == "none": - h = self.adjustSize(h, False) - elif "lid" in self.top and self.top != "angled lid": - h = self.adjustSize(h) - self.thickness - else: - h = self.adjustSize(h) - - t = self.thickness - - r, hp, side = self.regularPolygon(2*n+2, h=y/2.0) - - if n % 2: - lx = x - 2 * hp + side - else: - lx = x - 2 * r + side - - fingerJointSettings = copy.deepcopy(self.edges["f"].settings) - fingerJointSettings.setValues(self.thickness, angle=360./(2 * (n+1))) - fingerJointSettings.edgeObjects(self, chars="gGH") - - with self.saved_context(): - if b != "e": - self.floor(x, y , n, edge='f', move="right", label="Bottom") - if self.top == "angled lid": - self.floor(x, y, n, edge='e', move="right", label="Lower Lid") - self.floor(x, y, n, edge='E', move="right", label="Upper Lid") - elif self.top in ("angled hole", "angled lid2"): - self.floor(x, y, n, edge='F', move="right", hole=True, label="Top Rim and Lid") - if self.top == "angled lid2": - self.floor(x, y, n, edge='E', move="right", label="Upper Lid") - self.floor(x, y , n, edge='F', move="up only") - - fingers = self.top in ("angled lid2", "angled hole") - - cnt = 0 - for j in range(2): - cnt += 1 - if j == 0 or n % 2: - self.rectangularWall(lx, h, move="right", - edges=b+"GfG" if fingers else b+"GeG", - label=f"wall {cnt}") - else: - self.rectangularWall(lx, h, move="right", - edges=b+"gfg" if fingers else b+"geg", - label=f"wall {cnt}") - for i in range(n): - cnt += 1 - if (i+j*((n+1)%2)) % 2: # reverse for second half if even n - self.rectangularWall(side, h, move="right", - edges=b+"GfG" if fingers else b+"GeG", - label=f"wall {cnt}") - else: - self.rectangularWall(side, h, move="right", - edges=b+"gfg" if fingers else b+"geg", - label=f"wall {cnt}") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/angledcutjig.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/angledcutjig.py deleted file mode 100644 index 08e5ebf..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/angledcutjig.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class AngledCutJig(Boxes): # Change class name! - """Jig for making angled cuts in a laser cutter""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1.) - - # remove cli params you do not need - self.buildArgParser(x=50, y=100) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--angle", action="store", type=float, default=45., - help="Angle of the cut") - - def bottomCB(self): - t = self.thickness - self.fingerHolesAt(10-t, 4.5*t, 20, 0) - self.fingerHolesAt(30+t, 4.5*t, self.x, 0) - self.fingerHolesAt(10-t, self.y-4.5*t, 20, 0) - self.fingerHolesAt(30+t, self.y-4.5*t, self.x, 0) - - def render(self): - # adjust to the variables you want in the local scope - x, y = self.x, self.y - t = self.thickness - - th = x * math.tan(math.radians(90-self.angle)) - l = (x**2 + th**2)**0.5 - th2 = 20 * math.tan(math.radians(self.angle)) - l2 = (20**2 + th2**2)**0.5 - - self.rectangularWall(30+x+2*t, y, callback=[self.bottomCB], move="right") - self.rectangularWall(l, y, callback=[ - lambda:self.fingerHolesAt(0, 4.5*t, l, 0), None, - lambda:self.fingerHolesAt(0, 4.5*t, l, 0), None], - move="right") - self.rectangularWall(l2, y, callback=[ - lambda:self.fingerHolesAt(0, 4.5*t, l2, 0), None, - lambda:self.fingerHolesAt(0, 4.5*t, l2, 0), None], - move="right") - - self.rectangularTriangle(x, th, "fef", num=2, move="up") - self.rectangularTriangle(20, th2, "fef", num=2, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/arcade.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/arcade.py deleted file mode 100644 index 37c6008..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/arcade.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Arcade(Boxes): - """Desktop Arcade Machine""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.argparser.add_argument( - "--width", action="store", type=float, default=450.0, - help="inner width of the console") - self.argparser.add_argument( - "--monitor_height", action="store", type=float, default=350.0, - help="inner width of the console") - self.argparser.add_argument( - "--keyboard_depth", action="store", type=float, default=150.0, - help="inner width of the console") - - def side(self, move=None): - # TODO: Add callbacks - - y, h = self.y, self.h - t = self.thickness - r = 10 - d_30 = 2* r * math.tan(math.radians(15)) - - tw, th = y+2*r+(self.front+t) * math.sin(math.radians(15)), h+2*r+(self.topback+t)/2**0.5 - if self.move(tw, th, move, True): - return - - self.moveTo(r+(self.front+t) * math.sin(math.radians(15)), 0) - - with self.saved_context(): - self.moveTo(0, r) - self.polyline(y, 90, h, 45, self.topback+t, 90, self.top+2*t, 90, 100, -90, self.monitor_height, -30, self.keyboard_depth+2*t, 90, self.front+t, 75) - - self.fingerHolesAt(10, r+t/2, self.bottom, 0) - self.polyline(y, (90, r)) - self.fingerHolesAt(0.5*t, r+t/2, self.back, 0) - self.fingerHolesAt(h-40-40, r+t/2, self.back, 0) - - self.polyline(h, (45, r)) - self.fingerHolesAt(0, r+t/2, self.topback, 0) - self.fingerHolesAt(self.topback+t/2, r+t, self.top, 90) - self.fingerHolesAt(self.topback, self.top+r+1.5*t, self.speaker, -180) - self.polyline(self.topback+t, (90, r), self.top+2*t, (90, r), 100-2*r, (-90, r), self.monitor_height-2*r-d_30, (-30, r)) - self.fingerHolesAt(-d_30+t, r+.5*t, self.keyboard_depth, 0) - self.fingerHolesAt(-d_30+0.5*t, r+t, self.keyback, 90) - self.fingerHolesAt(self.keyboard_depth-d_30+1.5*t, r+t, self.front, 90) - self.polyline(self.keyboard_depth-d_30+2*t, (90, r), self.front+t, (75, r)) - - self.move(tw, th, move) - - def keyboard(self): - # Add holes for the joystick and buttons here - pass - - def speakers(self): - self.hole(self.width/4., 50, 40) - self.hole(self.width*3/4., 50, 40) - - def render(self): - width = self.width - t = self.thickness - - self.back = 40 - self.front = 120 - self.keyback = 50 - self.speaker = 150 - self.top = 100 - self.topback = 200 - y, h = self.y, self.h = 540, 450 - y = self.y = ((self.topback+self.top+3*t-100+self.monitor_height) / 2**0.5 - + (self.keyboard_depth+2*t)*math.cos(math.radians(15)) - - (self.front+t) * math.sin(math.radians(15))) - h = self.h = ((self.monitor_height-self.topback+self.top+1*t+100) / 2**0.5 + - + (self.keyboard_depth+2*t)*math.sin(math.radians(15)) - + (self.front+t) * math.cos(math.radians(15))) - - self.bottom = y-40-0.5*t - self.backwall = h-40 - - # Floor - self.rectangularWall(width, self.bottom, "efff", move="up") - # Back - self.rectangularWall(width, self.back, "Ffef", move="up") - self.rectangularWall(width, self.backwall, move="up") - self.rectangularWall(width, self.back, "efef", move="up") - - # Front bottom - self.rectangularWall(width, self.front, "efff", move="up") - self.rectangularWall(width, self.keyboard_depth, "FfFf", callback=[self.keyboard], move="up") - self.rectangularWall(width, self.keyback, "ffef", move="up") - # Top - self.rectangularWall(width, self.speaker, "efff", callback=[None, None, self.speakers], move="up") - self.rectangularWall(width, self.top, "FfFf", move="up") - self.rectangularWall(width, self.topback, "ffef", move="up") - # Sides - self.side(move="up") - self.side(move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/atreus21.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/atreus21.py deleted file mode 100644 index eee3b5a..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/atreus21.py +++ /dev/null @@ -1,117 +0,0 @@ -"""Generator for a split atreus keyboard.""" - -from boxes import Boxes, restore - -from .keyboard import Keyboard - - -class Atreus21(Boxes, Keyboard): - """Generator for a split atreus keyboard.""" - ui_group = 'Misc' - btn_size = 15.6 - half_btn = btn_size / 2 - border = 6 - - def __init__(self) -> None: - super().__init__() - self.add_common_keyboard_parameters( - # By default, columns from Atreus 21 - default_columns_definition=f'4@3/4@6/4@11/4@5/4@0/1@{self.btn_size * 0.5}' - ) - - def render(self): - """Renders the keyboard.""" - - self.moveTo(10, 30) - case_x, case_y = self._case_x_y() - - margin = 2 * self.border + 1 - - for reverse in [False, True]: - # keyholder - self.outer() - self.half(reverse=reverse) - self.holes() - self.moveTo(case_x + margin) - - # support - self.outer() - self.half(self.support, reverse=reverse) - self.holes() - self.moveTo(-case_x - margin, case_y + margin) - - # hotplug - self.outer() - self.half(self.hotplug, reverse=reverse) - self.holes() - self.moveTo(case_x + margin) - - # border - self.outer() - self.rim() - self.holes() - self.moveTo(-case_x - margin, case_y + margin) - - def holes(self, diameter=3, margin=1.5): - case_x, case_y = self._case_x_y() - for x in [-margin, case_x + margin]: - for y in [-margin, case_y + margin]: - self.hole(x, y, d=diameter) - - def micro(self): - x = 17.9 - y = 33 - b = self.border - case_x, case_y = self._case_x_y() - self.rectangularHole( - x * -.5 + case_x + b * .5, - y * -.5 + case_y + b * .5, - x, y - ) - - @restore - def rim(self): - x, y = self._case_x_y() - self.moveTo(x * .5, y * .5) - self.rectangularHole(0, 0, x, y, 5) - - @restore - def outer(self): - x, y = self._case_x_y() - b = self.border - self.moveTo(0, -b) - corner = [90, b] - self.polyline(*([x, corner, y, corner] * 2)) - - @restore - def half(self, hole_cb=None, reverse=False): - if hole_cb is None: - hole_cb = self.key - self.moveTo(self.half_btn, self.half_btn) - self.apply_callback_on_columns( - hole_cb, - self.columns_definition, - reverse=reverse, - ) - - def support(self): - self.configured_plate_cutout(support=True) - - def hotplug(self): - self.pcb_holes( - with_hotswap=self.hotswap_enable, - with_pcb_mount=self.pcb_mount_enable, - with_diode=self.diode_enable, - with_led=self.led_enable, - ) - - def key(self): - self.configured_plate_cutout() - - # get case sizes - def _case_x_y(self): - spacing = Keyboard.STANDARD_KEY_SPACING - margin = spacing - self.btn_size - x = len(self.columns_definition) * spacing - margin - y = max(offset + keys * spacing for (offset, keys) in self.columns_definition) - margin - return x, y diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/basedbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/basedbox.py deleted file mode 100644 index 065a5f7..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/basedbox.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class BasedBox(Boxes): - """Fully closed box on a base""" - - ui_group = "Box" - - description = """This box is more of a building block than a finished item. -Use a vector graphics program (like Inkscape) to add holes or adjust the base -plate. The width of the "brim" can also be adjusted with the **edge_width** - parameter in the **Finger Joints Settings**. - -See ClosedBox for variant without a base. -""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("x", "y", "h", "outside") - - def render(self): - - x, y, h = self.x, self.y, self.h - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h) - - t = self.thickness - - self.rectangularWall(x, h, "fFFF", move="right", label="Wall 1") - self.rectangularWall(y, h, "ffFf", move="up", label="Wall 2") - self.rectangularWall(y, h, "ffFf", label="Wall 4") - self.rectangularWall(x, h, "fFFF", move="left up", label="Wall 3") - - self.rectangularWall(x, y, "ffff", move="right", label="Top") - self.rectangularWall(x, y, "hhhh", label="Base") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bayonetbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bayonetbox.py deleted file mode 100644 index 136178e..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bayonetbox.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class BayonetBox(Boxes): - """Round box made from layers with twist on top""" - - description = """Glue together - all outside rings to the bottom, all inside rings to the top.""" - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.argparser.add_argument( - "--diameter", action="store", type=float, default=50., - help="Diameter of the box in mm") - self.argparser.add_argument( - "--lugs", action="store", type=int, default=10, - help="number of locking lugs") - self.argparser.add_argument( - "--alignment_pins", action="store", type=float, default=1.0, - help="diameter of the alignment pins") - self.buildArgParser("outside") - - def alignmentHoles(self, inner=False, outer=False): - d = self.diameter - r = d / 2 - t = self.thickness - p = 0.05*t - l = self.lugs - - a = 180 / l - with self.saved_context(): - for i in range(3): - if outer: - self.hole(r-t/2, 0, d=self.alignment_pins) - if inner: - self.hole(r-2*t-p, 0, d=self.alignment_pins) - self.moveTo(0, 0, 360/3) - - def lowerLayer(self, asPart=False, move=None): - d = self.diameter - r = d / 2 - t = self.thickness - p = 0.05*t - l = self.lugs - - a = 180 / l - - if asPart: - if self.move(d, d, move, True): - return - self.moveTo(d/2, d/2) - - self.alignmentHoles(inner=True) - self.hole(0, 0, r=d/2 - 2.5*t) - self.moveTo(d/2 - 1.5*t, 0, -90) - - for i in range(l): - self.polyline(0, (-4/3*a, r-1.5*t), 0, 90, 0.5*t, -90, 0, (-2/3*a, r-t), 0, -90, 0.5*t, 90) - - if asPart: - self.move(d, d, move) - - def lowerCB(self): - d = self.diameter - r = d / 2 - t = self.thickness - p = 0.05*t - l = self.lugs - - a = 180 / l - - self.alignmentHoles(outer=True) - with self.saved_context(): - self.lowerLayer() - - self.moveTo(d/2 - 1.5*t+p, 0, -90) - for i in range(l): - self.polyline(0, (-2/3*a, r-1.5*t+p), 0, 90, 0.5*t, -90, 0, (-4/3*a, r-t+p), 0, -90, 0.5*t, 90) - - - def upperCB(self): - d = self.diameter - r = d / 2 - t = self.thickness - p = 0.05*t - l = self.lugs - - a = 180 / l - - self.hole(0, 0, r=d/2 - 2.5*t) - self.hole(0, 0, r=d/2 - 1.5*t) - self.alignmentHoles(inner=True, outer=True) - self.moveTo(d/2 - 1.5*t, 0, -90) - - for i in range(l): - self.polyline(0, (-1.3*a, r-1.5*t+p), 0, 90, 0.5*t, -90, 0, (-0.7*a, r-t+p), 0, -90, 0.5*t, 90) - - - def render(self): - d = self.diameter - t = self.thickness - p = 0.05*t - - if not self.outside: - self.diameter = d = d - 3*t - - - self.parts.disc(d, callback=lambda: self.alignmentHoles(outer=True), move="right") - self.parts.disc(d, callback=lambda: (self.alignmentHoles(outer=True), self.hole(0, 0, d/2-1.5*t)), move="right") - self.parts.disc(d, callback=self.lowerCB, move="right") - self.parts.disc(d, callback=self.upperCB, move="right") - self.parts.disc(d, callback=lambda : self.alignmentHoles(inner=True),move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bintray.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bintray.py deleted file mode 100644 index f872be3..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bintray.py +++ /dev/null @@ -1,158 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class BinFrontEdge(edges.BaseEdge): - char = "B" - def __call__(self, length, **kw): - f = self.settings.front - a1 = math.degrees(math.atan(f/(1-f))) - a2 = 45 + a1 - self.corner(-a1) - for i, l in enumerate(self.settings.sy): - self.edges["e"](l* (f**2+(1-f)**2)**0.5) - self.corner(a2) - self.edges["f"](l*f*2**0.5) - if i < len(self.settings.sy)-1: - if self.char == "B": - self.polyline(0, 45, 0.5*self.settings.hi, - -90, self.thickness, -90, 0.5*self.settings.hi, 90-a1) - else: - self.polyline(0, -45, self.thickness, -a1) - else: - self.corner(-45) - - def margin(self) -> float: - return max(self.settings.sy) * self.settings.front - -class BinFrontSideEdge(BinFrontEdge): - char = 'b' - -class BinTray(Boxes): - """A Type tray variant to be used up right with sloped walls in front""" - - ui_group = "Shelf" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser("sx", "sy", "h", "outside", "hole_dD") - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=0.5) - self.argparser.add_argument( - "--front", action="store", type=float, default=0.4, - help="fraction of bin height covered with slope") - - def xSlots(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - posy = 0 - for y in self.sy: - self.fingerHolesAt(posx, posy, y) - posy += y + self.thickness - - def ySlots(self): - posy = -0.5 * self.thickness - for y in self.sy[:-1]: - posy += y + self.thickness - posx = 0 - for x in self.sx: - self.fingerHolesAt(posy, posx, x) - posx += x + self.thickness - - def addMount(self): - ds = self.hole_dD[0] - - if len(self.hole_dD) < 2: # if no head diameter is given - dh = 0 # only a round hole is generated - y = max (self.thickness * 1.25, self.thickness * 1.0 + ds) # and we assume that a typical screw head diameter is twice the shaft diameter - else: - dh = self.hole_dD[1] # use given head diameter - y = max (self.thickness * 1.25, self.thickness * 1.0 + dh / 2) # and offset the hole to have enough space for the head - - dx = sum(self.sx) + self.thickness * (len(self.sx) - 1) - x1 = dx * 0.125 - x2 = dx * 0.875 - - self.mountingHole(x1, y, ds, dh, -90) - self.mountingHole(x2, y, ds, dh, -90) - - def xHoles(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - self.fingerHolesAt(posx, 0, self.hi) - - def frontHoles(self, i): - def CB(): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - self.fingerHolesAt(posx, 0, self.sy[i]*self.front*2**0.5) - return CB - - def yHoles(self): - posy = -0.5 * self.thickness - for y in reversed(self.sy[1:]): - posy += y + self.thickness - self.fingerHolesAt(posy, 0, self.hi) - - def render(self): - if self.outside: - self.sx = self.adjustSize(self.sx) - self.sy = self.adjustSize(self.sy) - self.h = self.adjustSize(self.h, e2=False) - - x = sum(self.sx) + self.thickness * (len(self.sx) - 1) - y = sum(self.sy) + self.thickness * (len(self.sy) - 1) - - h = self.h - hi = self.hi = h - t = self.thickness - self.front = min(self.front, 0.999) - - self.addPart(BinFrontEdge(self, self)) - self.addPart(BinFrontSideEdge(self, self)) - - angledsettings = copy.deepcopy(self.edges["f"].settings) - angledsettings.setValues(self.thickness, True, angle=45) - angledsettings.edgeObjects(self, chars="gGH") - - # outer walls - e = ["F", "f", edges.SlottedEdge(self, self.sx[::-1], "G"), "f"] - - self.rectangularWall(x, h, e, callback=[self.xHoles], move="right", label="bottom") - self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ], move="up", label="left") - self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ], label="right") - self.rectangularWall(x, h, "Ffef", callback=[self.xHoles, ], move="left", label="top") - self.rectangularWall(y, h, "FFBF", move="up only") - - # floor - self.rectangularWall(x, y, "ffff", callback=[self.xSlots, self.ySlots, self.addMount], move="right", label="back") - # Inner walls - for i in range(len(self.sx) - 1): - e = [edges.SlottedEdge(self, self.sy, "f"), "f", "B", "f"] - self.rectangularWall(y, hi, e, move="up", label="inner vertical " + str(i+1)) - - for i in range(len(self.sy) - 1): - e = [edges.SlottedEdge(self, self.sx, "f", slots=0.5 * hi), "f", - edges.SlottedEdge(self, self.sx[::-1], "G"), "f"] - self.rectangularWall(x, hi, e, move="up", label="inner horizontal " + str(i+1)) - - # Front walls - for i in range(len(self.sy)): - e = [edges.SlottedEdge(self, self.sx, "g"), "F", "e", "F"] - self.rectangularWall(x, self.sy[i]*self.front*2**0.5, e, callback=[self.frontHoles(i)], move="up", label="retainer " + str(i+1)) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/birdhouse.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/birdhouse.py deleted file mode 100644 index e363822..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/birdhouse.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright (C) 2013-2022 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class BirdHouse(Boxes): - """Simple Bird House""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, finger=10.0,space=10.0) - self.buildArgParser(x=200, y=200, h=200) - self.argparser.add_argument( - "--roof_overhang", action="store", type=float, default=0.4, - help="overhang as fraction of the roof length") - - def side(self, x, h, edges="hfeffef", callback=None, move=None): - angles = (90, 0, 45, 90, 45, 0, 90) - roof = 2**0.5 * x / 2 - t = self.thickness - lengths = (x, h, t, roof, roof, t, h) - - edges = [self.edges.get(e, e) for e in edges] - edges.append(edges[0]) # wrap around - - tw = x + edges[1].spacing() + edges[-2].spacing() - th = h + x/2 + t + edges[0].spacing() + max(edges[3].spacing(), edges[4].spacing()) - - if self.move(tw, th, move, True): - return - - self.moveTo(edges[-2].spacing()) - for i in range(7): - self.cc(callback, i, y=self.burn+edges[i].startwidth()) - edges[i](lengths[i]) - self.edgeCorner(edges[i], edges[i+1], angles[i]) - - self.move(tw, th, move) - - def roof(self, x, h, overhang, edges="eefe", move=None): - t = self.thickness - edges = [self.edges.get(e, e) for e in edges] - - tw = x + 2*t + 2*overhang + edges[1].spacing() + edges[3].spacing() - th = h + 2*t + overhang + edges[0].spacing() + edges[2].spacing() - - if self.move(tw, th, move, True): - return - - self.moveTo(overhang + edges[3].spacing(), edges[0].margin()) - edges[0](x + 2*t) - self.corner(90, overhang) - edges[1](h + 2*t) - self.edgeCorner(edges[1], edges[2]) - self.fingerHolesAt(overhang + 0.5*t, edges[2].startwidth(), h, 90) - self.fingerHolesAt(x + overhang + 1.5*t, edges[2].startwidth(), h, 90) - edges[2](x + 2*t + 2*overhang) - self.edgeCorner(edges[2], edges[3]) - edges[3](h + 2*t) - self.corner(90, overhang) - - self.move(tw, th, move) - - def side_hole(self, width): - self.rectangularHole(width/2, self.h/2, - 0.75*width, 0.75*self.h, - r=self.thickness) - - def render(self): - x, y, h = self.x, self.y, self.h - - roof = 2**0.5 * x / 2 - overhang = roof * self.roof_overhang - - cbx = [lambda: self.side_hole(x)] - cby = [lambda: self.side_hole(y)] - - self.side(x, h, callback=cbx, move="right") - self.side(x, h, callback=cbx, move="right") - self.rectangularWall(y, h, "hFeF", callback=cby, move="right") - self.rectangularWall(y, h, "hFeF", callback=cby, move="right") - self.rectangularWall(x, y, "ffff", move="right") - self.edges["h"].settings.setValues(self.thickness, relative=False, edge_width=overhang) - self.roof(y, roof, overhang, "eefe", move="right") - self.roof(y, roof, overhang, "eeFe", move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bottlestack.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bottlestack.py deleted file mode 100644 index fb96e6f..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bottlestack.py +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (C) 2013-2020 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class BottleStack(Boxes): - """Stack bottles in a fridge""" - - description = """When rendered with the "double" option the parts with the double slots get connected the shorter beams in the asymmetrical slots. - -Without the "double" option the stand is a bit more narrow. -""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.argparser.add_argument( - "--diameter", action="store", type=float, default=80, - help="diameter of the bottles in mm") - self.argparser.add_argument( - "--number", action="store", type=int, default=3, - help="number of bottles to hold in the bottom row") - self.argparser.add_argument( - "--depth", action="store", type=float, default=80, - help="depth of the stand along the base of the bottles") - self.argparser.add_argument( - "--double", action="store", type=boolarg, default=True, - help="two pieces that can be combined to up to double the width") - - - - def front(self, h_sides, offset=0, move=None): - t = self.thickness - a = 60 - nr = self.number - r1 = self.diameter / 2.0 # bottle - r2 = r1 / math.cos(math.radians(90-a)) - r1 # in between - if self.double: - r3 = 1.5*t # upper corners - else: - r3 = .5*t - h = (r1+r2) * (1-math.cos(math.radians(a))) - h_extra = 1*t - h_s = h_sides - t - p = 0.05*t # play - - tw, th = nr * r1 * 2 + 2*r3, h + 2*t - - - if self.move(tw, th, move, True): - return - - open_sides = r3 <= 0.5*t - - if offset == 0: - slot = [0, 90, h_s, -90, t, -90, h_s, 90] - if open_sides: - self.moveTo(0, h_s) - self.polyline(r3-0.5*t) - self.polyline(*slot[4:]) - else: - self.polyline(r3-0.5*t) - self.polyline(*slot) - for i in range(nr-open_sides): - self.polyline(2*r1-t) - self.polyline(*slot) - if open_sides: - self.polyline(2*r1-t) - self.polyline(*slot[:-3]) - self.polyline(r3-0.5*t) - else: - self.polyline(r3-0.5*t) - else: - slot = [0, 90, h_s, -90, t, -90, h_s, 90] - h_s += t - slot2 = [0, 90, h_s, -90, t+2*p, -90, h_s, 90] - if open_sides: - self.moveTo(0, h_s) - self.polyline(t+p, -90, h_s, 90) - else: - self.polyline(r3-0.5*t-p) - self.polyline(*slot2) - self.polyline(t-p) - self.polyline(*slot) - self.polyline(2*r1-5*t) - self.polyline(*slot) - self.polyline(t-p) - self.polyline(*slot2) - for i in range(1, nr-open_sides): - self.polyline(2*r1-3*t-p) - self.polyline(*slot) - self.polyline(t-p) - self.polyline(*slot2) - if open_sides: - self.polyline(2*r1-3*t-p) - self.polyline(*slot) - self.polyline(t-p) - self.polyline(0, 90, h_s, -90, t+p) - else: - self.polyline(r3-0.5*t-p) - - if open_sides: - h_extra -= h_s - - self.polyline(0, 90, h_extra+h-r3, (90, r3)) - - for i in range(nr): - self.polyline(0, (a, r2), 0, (-2*a, r1), 0, (a, r2)) - self.polyline(0, (90, r3), h_extra+h-r3, 90) - - self.move(tw, th, move) - - def side(self, l, h, short=False, move=None): - t = self.thickness - short = bool(short) - - tw, th = l + 2*t - 4*t*short, h - - if self.move(tw, th, move, True): - return - - self.moveTo(t, 0) - - self.polyline(l-3*t*short) - if short: - end = [90, h-t, 90, t, -90, t, 90] - else: - end = [(90, t), h-2*t, (90, t), 0, 90, t, -90, t, -90, t, 90] - self.polyline(0, *end) - self.polyline(l-2*t- 3*t*short) - self.polyline(0, *reversed(end)) - - self.move(tw, th, move) - - def render(self): - t = self.thickness - d = self.depth - nr = self.number - h_sides = 2*t - pieces = 2 if self.double else 1 - - for offset in range(pieces): - self.front(h_sides, offset, move="up") - self.front(h_sides, offset, move="up") - - for short in range(pieces): - for i in range(nr+1): - self.side(d, h_sides, short, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bottletag.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bottletag.py deleted file mode 100644 index 5d6a704..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/bottletag.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class BottleTag(Boxes): - """Paper slip over bottle tag""" - - ui_group = "Misc" # see ./__init__.py for names - - def __init__(self) -> None: - Boxes.__init__(self) - - self.buildArgParser() - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--width", action="store", type=float, default=72, - help="width of neck tag") - self.argparser.add_argument( - "--height", action="store", type=float, default=98, - help="height of neck tag") - self.argparser.add_argument( - "--min_diameter", action="store", type=float, default=24, - help="inner diameter of bottle neck hole") - self.argparser.add_argument( - "--max_diameter", action="store", type=float, default=50, - help="outer diameter of bottle neck hole") - self.argparser.add_argument( - "--radius", action="store", type=float, default=15, - help="corner radius of bottom tag") - self.argparser.add_argument( - "--segment_width", action="store", type=int, default=3, - help="inner segment width") - - def render(self): - # adjust to the variables you want in the local scope - width = self.width - height = self.height - r_min = self.min_diameter / 2 - r_max = self.max_diameter / 2 - r = self.radius - segment_width = self.segment_width - - # tag outline - self.moveTo(r) - self.edge(width - r - r) - self.corner(90, r) - self.edge(height - width / 2.0 - r) - self.corner(180, width / 2) - self.edge(height - width / 2.0 - r) - self.corner(90, r) - - # move to centre of hole and cut the inner circle - self.moveTo(width / 2 - r, height - width / 2) - with self.saved_context(): - self.moveTo(0, -r_min) - self.corner(360, r_min) - - # draw the radial lines approx 2mm apart on r_min - seg_angle = math.degrees(segment_width / r_min) - # for neatness, we want an integral number of cuts - num = math.floor(360 / seg_angle) - for i in range(num): - with self.saved_context(): - self.moveTo(0, 0, i * 360.0 / num) - self.moveTo(r_min) - self.edge(r_max - r_min) - # Add some right angle components to reduce tearing - with self.saved_context(): - self.moveTo(0, 0, 90) - self.edge(0.5) - with self.saved_context(): - self.moveTo(0, 0, -90) - self.edge(0.5) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/breadbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/breadbox.py deleted file mode 100644 index 492f02c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/breadbox.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright (C) 2013-2022 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class BreadBox(Boxes): - """A BreadBox with a gliding door""" - - ui_group = "FlexBox" - - description = """Beware of the rolling shutter effect! Use wax on sliding surfaces. -""" - - def side(self, l, h, r, move=None): - t = self.thickness - - if self.move(l+2*t, h+2*t, move, True): - return - - self.moveTo(t, t) - - self.ctx.save() - - n = self.n - a = 90. / n - ls = 2*math.sin(math.radians(a/2)) * (r-2.5*t) - - self.fingerHolesAt(2*t, 0, h-r, 90) - self.moveTo(2.5*t, h-r, 90-a/2) - for i in range(n): - self.fingerHolesAt(0, 0.5*t, ls, 0) - self.moveTo(ls, 0, -a) - self.moveTo(0, 0, a/2) - self.fingerHolesAt(0, 0.5*t, l / 2 - r, 0) - self.ctx.restore() - - self.edges["f"](l) - self.polyline(t, 90, h-r, (90, r+t), l/2-r, 90, t, -90, 0,) - self.edges["f"](l/2) - self.polyline(0, 90) - self.edges["f"](h) - - self.move(l+2*t, h+2*t, move) - - def cornerRadius(self, r, two=False, move=None): - s = self.spacing - if self.move(r, r+s, move, True): - return - for i in range(2 if two else 1): - self.polyline(r, 90, r, 180, 0, (-90, r), 0 ,-180) - self.moveTo(r, r+s, 180) - self.move(r, r+s, move) - - def rails(self, l, h, r, move=None): - t = self.thickness - s = self.spacing - tw, th = l/2+2.5*t+3*s, h+1.5*t+3*s - - if self.move(tw, th, move, True): - return - - self.moveTo(2.5*t+s, 0) - self.polyline(l/2-r, (90, r+t), h-r, 90, t, 90, h-r, (-90, r), l/2-r, 90, t, 90) - self.moveTo(-t-s, t+s) - self.polyline(l/2-r, (90, r+t), h-r, 90, t, 90, h-r, (-90, r), l/2-r, 90, t, 90) - self.moveTo(+t-s, t+s) - self.polyline(l/2-r, (90, r-1.5*t), h-r, 90, t, 90, h-r, (-90, r-2.5*t), l/2-r, 90, t, 90) - self.moveTo(-t-s, t+s) - self.polyline(l/2-r, (90, r-1.5*t), h-r, 90, t, 90, h-r, (-90, r-2.5*t), l/2-r, 90, t, 90) - - self.move(tw, th, move) - - def door(self, l, h, move=None): - t = self.thickness - if self.move(l, h, move, True): - return - self.fingerHolesAt(t, t, h-2*t) - self.edge(2*t) - self.edges["X"](l-2*t, h) - self.polyline(0, 90, h, 90, l, 90, h, 90) - self.move(l, h, move) - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=0.5) - self.addSettingsArgs(edges.FlexSettings, distance=.75, connection=2.) - - self.buildArgParser(x=150, y=100, h=100) - self.argparser.add_argument( - "--radius", action="store", type=float, default=40.0, - help="radius of the corners") - - def render(self): - x, y, h, r = self.x, self.y, self.h, self.radius - self.n = n = 3 - - if not r: - self.radius = r = h / 2 - self.radius = r = min(r, h/2) - - t = self.thickness - self.ctx.save() - self.side(x, h, r, move="right") - self.side(x, h, r, move="right") - self.rectangularWall(y, h, "fFfF", move="right") - - self.ctx.restore() - self.side(x, h, r, move="up only") - - self.rectangularWall(x, y, "FEFF", move="right") - self.rectangularWall(x/2, y, "FeFF", move="right") - - self.door(x/2 + h - 2*r + 0.5*math.pi*r + 2*t, y-0.2*t, move="right") - - self.rectangularWall(2*t, y-2.2*t, edges="eeef", move="right") - - - a = 90. / n - ls = 2*math.sin(math.radians(a/2)) * (r-2.5*t) - - edges.FingerJointSettings(t, angle=a).edgeObjects(self, chars="aA") - edges.FingerJointSettings(t, angle=a/2).edgeObjects(self, chars="bB") - - - self.rectangularWall(h-r, y, "fbfe", move="right") - - self.rectangularWall(ls, y, "fafB", move="right") - - for i in range(n-2): - self.rectangularWall(ls, y, "fafA", move="right") - - self.rectangularWall(ls, y, "fbfA", move="right") - self.rectangularWall(x/2 - r, y, "fefB", move="right") - - self.rails(x, h, r, move="right mirror") - self.cornerRadius(r, two=True, move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/burntest.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/burntest.py deleted file mode 100644 index b291f3d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/burntest.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# Copyright (C) 2024 Seth Fischer -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from datetime import date - -from boxes import * - - -class BurnTest(Boxes): - """Test different burn values""" - - description = """This generator will make shapes that you can use to select -optimal value for burn parameter for other generators. After burning try to -attach sides with the same value and use best fitting one on real projects. -In this generator set burn in the Default Settings to the lowest value -to be tested. To get an idea cut a rectangle with known nominal size and -measure the shrinkage due to the width of the laser cut. Now you can -measure the burn value that you should use in other generators. It is half -the difference of the overall size as shrinkage is occurring on both -sides. You can use the reference rectangle as it is rendered without burn -correction. - -See also LBeam that can serve as compact BurnTest and FlexTest for testing flex settings. -""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser(x=100) - self.argparser.add_argument( - "--step", - action="store", - type=float, - default=0.01, - help="increases in burn value between the sides", - ) - self.argparser.add_argument( - "--pairs", - action="store", - type=int, - default=2, - help="number of pairs (each testing four burn values)", - ) - self.argparser.add_argument( - "--date", - action="store", - type=boolarg, - default=False, - help="add current date etching to each piece", - ) - self.argparser.add_argument( - "--id", - action="store", - type=str, - default="", - help="add identifier etching to each piece", - ) - - def render(self): - font = { - "fontsize": 12.5 * self.x / 100 if self.x < 81 else 10, - "align": "center", - "color": Color.ETCHING, - } - font_meta = font.copy() - font_meta["fontsize"] = font["fontsize"] * 0.75 - - today = date.today().strftime("%Y-%m-%d") - - x, s = self.x, self.step - t = self.thickness - - self.moveTo(t, t) - - for cnt in range(self.pairs): - for i in range(4): - self.text("%.3fmm" % self.burn, x / 2, t, **font) - if self.date and i == 3: - self.text(today, x / 2, 20, **font_meta) - if self.id and i == 1: - self.text(self.id, x / 2, 20, **font_meta) - self.edges["f"](x) - self.corner(90) - self.burn += s - - self.burn -= 4 * s - self.moveTo(x + 2 * t + self.spacing, -t) - - for i in range(4): - self.text("%.3fmm" % self.burn, x / 2, t, **font) - if self.date and i == 3: - self.text(today, x / 2, 20, **font_meta) - if self.id and i == 1: - self.text(self.id, x / 2, 20, **font_meta) - self.edges["F"](x) - self.polyline(t, 90, t) - self.burn += s - - self.moveTo(x + 2 * t + self.spacing, t) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/can_storage.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/can_storage.py deleted file mode 100644 index 1c19aa1..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/can_storage.py +++ /dev/null @@ -1,365 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FrontEdge(edges.BaseEdge): - char = "a" - - def __call__(self, length, **kw): - x = math.ceil( ((self.canDiameter * 0.5 + 2 * self.thickness) * math.sin(math.radians(self.chuteAngle))) / self.thickness) - if self.top_edge != "e": - self.corner(90, self.thickness) - self.edge(0.5 * self.canDiameter) - self.corner(-90, 0.25 * self.canDiameter) - else: - self.moveTo(-self.burn, self.canDiameter + self.thickness, -90) - self.corner(90, 0.25 * self.canDiameter) - self.edge(self.thickness) - - self.edge(0.5 * self.canDiameter - self.thickness) - self.corner(-90, 0.25 * self.canDiameter) - self.edge(0.5 * self.canDiameter) - self.corner(90, self.thickness) - self.edge(x * self.thickness ) - self.corner(90, self.thickness) - self.edge(0.5 * self.canDiameter) - self.corner(-90, 0.25 * self.canDiameter) - self.edge(0.5 * self.canDiameter - (1 + x) * self.thickness + self.top_chute_height + self.bottom_chute_height - self.barrier_height) - self.corner(-90, 0.25 * self.canDiameter) - self.edge(0.5 * self.canDiameter) - self.corner(90, self.thickness) - self.edge(self.barrier_height) - self.edge(self.thickness) - -class TopChuteEdge(edges.BaseEdge): - char = "b" - - def __call__(self, length, **kw): - self.edge(0.2 * length - self.thickness) - self.corner(90, self.thickness) - self.edge(1.5*self.canDiameter - 2 * self.thickness) - self.corner(-90, self.thickness) - self.edge(0.6 * length - 2 * self.thickness) - self.corner(-90, self.thickness) - self.edge(1.5*self.canDiameter - 2 * self.thickness) - self.corner(90, self.thickness) - self.edge(0.2 * length - self.thickness) - -class BarrierEdge(edges.BaseEdge): - char = "A" - - def __call__(self, length, **kw): - self.edge(0.2*length) - self.corner(90,self.thickness/2) - self.corner(-90,self.thickness/2) - self.edge(0.6*length-2*self.thickness) - self.corner(-90,self.thickness/2) - self.corner(90,self.thickness/2) - self.edge(0.2*length) - - def startwidth(self) -> float: - return self.boxes.thickness - -class CanStorage(Boxes): - """Storage box for round containers""" - - description = """ -for AA batteries: - -![CanStorage for AA batteries](static/samples/CanStorageAA.jpg) - -for canned tomatoes: -""" - - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, finger=2.0, space=2.0, surroundingspaces=0.0) - self.addSettingsArgs(edges.StackableSettings) - self.addSettingsArgs(fillHolesSettings) - - self.argparser.add_argument( - "--top_edge", action="store", - type=ArgparseEdgeType("efhŠ"), choices=list("efhŠ"), - default="Š", help="edge type for top edge") - self.argparser.add_argument( - "--bottom_edge", action="store", - type=ArgparseEdgeType("eEš"), choices=list("eEš"), - default="š", help="edge type for bottom edge") - - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--canDiameter", action="store", type=float, default=75, - help="outer diameter of the cans to be stored (in mm)") - self.argparser.add_argument( - "--canHeight", action="store", type=float, default=110, - help="height of the cans to be stored (in mm)") - self.argparser.add_argument( - "--canNum", action="store", type=int, default=12, - help="number of cans to be stored") - self.argparser.add_argument( - "--chuteAngle", action="store", type=float, default=5.0, - help="slope angle of the chutes") - - def DrawPusher(self, dbg = False): - with self.saved_context(): - if dbg == False: - self.moveTo(0,self.thickness) - self.edge(0.25*self.pusherA) - self.corner(-90) - self.edge(self.thickness) - self.corner(90) - self.edge(0.5*self.pusherA) - self.corner(90) - self.edge(self.thickness) - self.corner(-90) - self.edge(0.25*self.pusherA) - - self.corner(90-self.chuteAngle) - - self.edge(0.25*self.pusherB) - self.corner(-90) - self.edge(self.thickness) - self.corner(90) - self.edge(0.5*self.pusherB) - self.corner(90) - self.edge(self.thickness) - self.corner(-90) - self.edge(0.25*self.pusherB) - - self.corner(90+self.pusherAngle+self.chuteAngle) - self.edge(self.pusherC) - - def cb_top_chute(self, nr): - if nr == 0: - # fill with holes - border = [ - (0, 0), - (self.top_chute_depth, 0), - (self.top_chute_depth, 0.2 * self.width - self.thickness), - (self.top_chute_depth - self.thickness, 0.2 * self.width), - (self.top_chute_depth - 1.5*self.canDiameter, 0.2 * self.width), - (self.top_chute_depth - 1.5*self.canDiameter, 0.8 * self.width), - (self.top_chute_depth - self.thickness, 0.8 * self.width), - (self.top_chute_depth, 0.8 * self.width + self.thickness), - (self.top_chute_depth, self.width), - (0, self.width), - ] - - if self.fillHoles_fill_pattern != "no fill": - self.fillHoles( - pattern="hbar", - border=border, - max_radius = min(2*self.thickness, self.fillHoles_hole_max_radius) if self.fillHoles_fill_pattern in ["hbar", "vbar"] else min(2*self.thickness, self.width/30), - hspace=min(2*self.thickness, self.fillHoles_space_between_holes) if self.fillHoles_fill_pattern in ["hbar", "vbar"] else min(2*self.thickness, self.width/20), - bspace=min(2*self.thickness, self.fillHoles_space_to_border) if self.fillHoles_fill_pattern in ["hbar", "vbar"] else min(2*self.thickness, self.width/20), - bar_length=self.fillHoles_bar_length, - max_random=self.fillHoles_max_random, - ) - - def cb_top(self, nr): - if nr == 0: - # fill with holes - border = [ - (0, 0), - (self.depth, 0), - (self.depth, self.width), - (0, self.width), - ] - - if self.fillHoles_fill_pattern != "no fill": - self.fillHoles( - pattern="hbar", - border=border, - max_radius = min(2*self.thickness, self.fillHoles_hole_max_radius) if self.fillHoles_fill_pattern in ["hbar", "vbar"] else min(2*self.thickness, self.width/30), - hspace=min(2*self.thickness, self.fillHoles_space_between_holes) if self.fillHoles_fill_pattern in ["hbar", "vbar"] else min(2*self.thickness, self.width/20), - bspace=min(2*self.thickness, self.fillHoles_space_to_border) if self.fillHoles_fill_pattern in ["hbar", "vbar"] else min(2*self.thickness, self.width/20), - bar_length=self.fillHoles_bar_length, - max_random=self.fillHoles_max_random, - ) - - def cb_bottom_chute(self, nr): - if nr == 1: - # holes for pusher - self.rectangularHole(self.width*0.85-0.5*self.thickness, 0.25*self.pusherA, self.thickness, 0.5*self.pusherA, center_x=False, center_y=False) - self.rectangularHole(self.width*0.5 -0.5*self.thickness, 0.25*self.pusherA, self.thickness, 0.5*self.pusherA, center_x=False, center_y=False) - self.rectangularHole(self.width*0.15-0.5*self.thickness, 0.25*self.pusherA, self.thickness, 0.5*self.pusherA, center_x=False, center_y=False) - - - def cb_back(self, nr): - if nr == 1: - # holes for pusher - self.rectangularHole(self.width*0.85-0.5*self.thickness, self.thickness + self.depth * math.tan(math.radians(self.chuteAngle)) + 0.25*self.pusherB, self.thickness, 0.5*self.pusherB + self.thickness, center_x=False, center_y=False) - self.rectangularHole(self.width*0.5 -0.5*self.thickness, self.thickness + self.depth * math.tan(math.radians(self.chuteAngle)) + 0.25*self.pusherB, self.thickness, 0.5*self.pusherB + self.thickness, center_x=False, center_y=False) - self.rectangularHole(self.width*0.15-0.5*self.thickness, self.thickness + self.depth * math.tan(math.radians(self.chuteAngle)) + 0.25*self.pusherB, self.thickness, 0.5*self.pusherB + self.thickness, center_x=False, center_y=False) - - - def cb_sides(self, nr): - if nr == 0: - # for debugging only - if self.debug: - # draw orientation points - self.hole(0, 0, 1, color=Color.ANNOTATIONS) - self.hole(0, self.thickness, 1, color=Color.ANNOTATIONS) - self.hole(0, self.thickness + self.canDiameter, 1, color=Color.ANNOTATIONS) - self.hole(0, self.thickness + self.canDiameter + self.bottom_chute_height, 1, color=Color.ANNOTATIONS) - self.hole(0, self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height + self.thickness, 1, color=Color.ANNOTATIONS) - self.hole(0, self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height + self.thickness + self.canDiameter, 1, color=Color.ANNOTATIONS) - self.hole(0, self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height + self.thickness + self.canDiameter + 1.0 * self.thickness, 1, color=Color.ANNOTATIONS) - with self.saved_context(): - # draw cans, bottom row - self.moveTo(0, self.thickness, self.chuteAngle) - self.rectangularHole(2*self.thickness, 0, math.ceil(self.canNum / 2) * self.canDiameter, self.canDiameter, center_x=False, center_y=False, color=Color.ANNOTATIONS) - for i in range(math.ceil(self.canNum / 2)-1): - self.hole(2*self.thickness+(0.5 + i) * self.canDiameter, self.canDiameter / 2, self.canDiameter / 2, color=Color.ANNOTATIONS) - i+=1 - self.hole(2*self.thickness+(0.5 + i) * self.canDiameter, self.canDiameter*0.8 , self.canDiameter / 2, color=Color.ANNOTATIONS) - - with self.saved_context(): - # draw pusher - self.moveTo(self.depth-self.pusherA, self.thickness + (self.depth-self.pusherA) * math.tan(math.radians(self.chuteAngle))) - self.moveTo(0,0,self.chuteAngle) - self.DrawPusher(True) - - with self.saved_context(): - # draw cans, top row - self.moveTo(0, self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height + 0.5 * self.thickness, -self.chuteAngle) - self.rectangularHole(0, 0.5 * self.thickness, math.ceil(self.canNum / 2) * self.canDiameter, self.canDiameter, center_x=False, center_y=False, color=Color.ANNOTATIONS) - for i in range(math.ceil(self.canNum / 2)): - self.hole((0.5 + i) * self.canDiameter, self.canDiameter / 2 + 0.5 * self.thickness, self.canDiameter / 2, color=Color.ANNOTATIONS) - with self.saved_context(): - # draw barrier - self.moveTo(1.5 * self.thickness, 1.1 * self.thickness + self.burn + math.sin(math.radians(self.chuteAngle)) * 2 * self.thickness, 90) - self.rectangularHole(0, 0, self.barrier_height, self.thickness, center_x=False, center_y=True, color=Color.ANNOTATIONS) - - # bottom chute - with self.saved_context(): - self.moveTo(0, 0.5 * self.thickness, self.chuteAngle) - self.fingerHolesAt(0, 0, self.depth / math.cos(math.radians(self.chuteAngle)), 0) - # top chute - with self.saved_context(): - self.moveTo(0, self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height + 0.5 * self.thickness, -self.chuteAngle) - self.fingerHolesAt(0, 0, self.top_chute_depth, 0) - # front barrier - with self.saved_context(): - self.moveTo(1.5 * self.thickness, 1.1 * self.thickness + self.burn + math.sin(math.radians(self.chuteAngle)) * 2 * self.thickness, 90) - self.fingerHolesAt(0, 0, self.barrier_height, 0) - # fill with holes - border = [ - (2*self.thickness, 0.5*self.thickness + 2*self.thickness * math.tan(math.radians(self.chuteAngle)) + 0.5*self.thickness/math.cos(math.radians(self.chuteAngle))), - (self.depth, self.thickness + self.depth * math.tan(math.radians(self.chuteAngle))), - (self.depth, self.height), - (self.thickness + 0.75 * self.canDiameter, self.height), - (self.thickness + 0.75 * self.canDiameter, 0.5*self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height + self.thickness - (self.thickness + 0.75 * self.canDiameter) * math.tan(math.radians(self.chuteAngle)) + 0.5*self.thickness/math.cos(math.radians(self.chuteAngle))), - (self.top_chute_depth * math.cos(math.radians(self.chuteAngle)), self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height + self.thickness - (self.top_chute_depth) * math.sin(math.radians(self.chuteAngle))), - (self.top_chute_depth * math.cos(math.radians(self.chuteAngle)), self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height - (self.top_chute_depth) * math.sin(math.radians(self.chuteAngle))), - (self.thickness + 0.75 * self.canDiameter, 1.5*self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height - (self.thickness + 0.75 * self.canDiameter) * math.tan(math.radians(self.chuteAngle)) - 0.5*self.thickness/math.cos(math.radians(self.chuteAngle))), - (self.thickness + 0.75 * self.canDiameter, 2*self.thickness + self.barrier_height ), - (2*self.thickness, 2*self.thickness + self.barrier_height), - ] - - self.fillHoles( - pattern=self.fillHoles_fill_pattern, - border=border, - max_radius=self.fillHoles_hole_max_radius, - hspace=self.fillHoles_space_between_holes, - bspace=self.fillHoles_space_to_border, - min_radius=self.fillHoles_hole_min_radius, - style=self.fillHoles_hole_style, - bar_length=self.fillHoles_bar_length, - max_random=self.fillHoles_max_random, - ) - - def render(self): - self.chuteAngle = self.chuteAngle - - self.pusherAngle = 30 # angle of pusher - self.pusherA = 0.75 * self.canDiameter # length of pusher - self.pusherB = self.pusherA / math.sin(math.radians(180 - (90+self.chuteAngle) - self.pusherAngle)) * math.sin(math.radians(self.pusherAngle)) - self.pusherC = self.pusherA / math.sin(math.radians(180 - (90+self.chuteAngle) - self.pusherAngle)) * math.sin(math.radians(90+self.chuteAngle)) - - self.addPart(FrontEdge(self, self)) - self.addPart(TopChuteEdge(self, self)) - self.addPart(BarrierEdge(self, self)) - - if self.canDiameter < 8 * self.thickness: - self.edges["f"].settings.setValues(self.thickness, True, finger=1.0) - self.edges["f"].settings.setValues(self.thickness, True, space=1.0) - self.edges["f"].settings.setValues(self.thickness, True, surroundingspaces=0.0) - - if self.canDiameter < 4 * self.thickness: - raise ValueError("Can diameter has to be at least 4 times the material thickness!") - - if self.canNum < 4: - raise ValueError("4 cans is the minimum!") - - self.depth = self.canDiameter * (math.ceil(self.canNum / 2) + 0.1) + self.thickness - self.top_chute_height = max(self.depth * math.sin(math.radians(self.chuteAngle)), 0.1 * self.canDiameter) - self.top_chute_depth = (self.depth - 1.1 * self.canDiameter) / math.cos(math.radians(self.chuteAngle)) - self.bottom_chute_height = max((self.depth - 1.1 * self.canDiameter) * math.sin(math.radians(self.chuteAngle)), 0.1 * self.canDiameter) - self.bottom_chute_depth = self.depth / math.cos(math.radians(self.chuteAngle)) - self.barrier_height = min( - 0.25 * self.canDiameter, - self.bottom_chute_height + self.top_chute_height - self.thickness) - - if (self.top_chute_depth + self.bottom_chute_height - self.thickness) < (self.barrier_height + self.canDiameter * 0.1): - self.bottom_chute_height = self.barrier_height + self.canDiameter * 0.1 + self.thickness - self.top_chute_depth - - self.height = self.thickness + self.canDiameter + self.bottom_chute_height + self.top_chute_height + 0.5 * self.thickness + self.canDiameter + 1.5 * self.thickness # measurements from bottom to top - self.width = 0.01 * self.canHeight + self.canHeight + 0.01 * self.canHeight - edgs = self.bottom_edge + "h" + self.top_edge + "a" - - # render your parts here - self.rectangularWall(self.depth, self.height, edges=edgs, callback=self.cb_sides, move="up", label="right") - self.rectangularWall(self.depth, self.height, edges=edgs, callback=self.cb_sides, move="up mirror", label="left") - - self.rectangularWall(self.bottom_chute_depth, self.width, "fefe", callback=self.cb_bottom_chute, move="up", label="bottom chute") - self.rectangularWall(self.top_chute_depth, self.width, "fbfe", callback=self.cb_top_chute, move="up", label="top chute") - - self.rectangularWall(self.barrier_height, self.width, "fAfe", move="right", label="barrier") - self.rectangularWall(self.height, self.width, "fefe", callback=self.cb_back, move="up", label="back") - self.rectangularWall(self.barrier_height, self.width, "fefe", move="left only", label="invisible") - - if self.top_edge != "e": - self.rectangularWall(self.depth, self.width, "fefe", callback=self.cb_top, move="up", label="top") - - pusherH = self.pusherB * math.cos(math.radians(self.chuteAngle)) + self.thickness - pusherV = self.pusherC * math.cos(math.radians(self.chuteAngle)) + self.thickness - - self.move(pusherV, pusherH, where ="right", before=True, label="Pusher") - self.DrawPusher() - self.move(pusherV, pusherH, where ="right", before=False, label="Pusher") - self.move(pusherV, pusherH, where ="right", before=True, label="Pusher") - self.DrawPusher() - self.move(pusherV, pusherH, where ="right", before=False, label="Pusher") - self.move(pusherV, pusherH, where ="up", before=True, label="Pusher") - self.DrawPusher() - self.text("Glue the Pusher pieces into slots on bottom\nand back plates to prevent stuck cans.", pusherV+3,0, fontsize=4, color=Color.ANNOTATIONS) - self.move(pusherV, pusherH, where ="up", before=False, label="Pusher") - - self.move(pusherV, pusherH, where ="left only", before=True, label="Pusher") - self.move(pusherV, pusherH, where ="left only", before=True, label="Pusher") - - if self.bottom_edge == "š": - self.rectangularWall(self.edges["š"].settings.width+3*self.thickness, self.edges["š"].settings.height-4*self.burn, "eeee", move="right", label="Stabilizer 1") - self.rectangularWall(self.edges["š"].settings.width+3*self.thickness, self.edges["š"].settings.height-4*self.burn, "eeee", move="right", label="Stabilizer 2") - self.rectangularWall(self.edges["š"].settings.width+5*self.thickness, self.edges["š"].settings.height-4*self.burn, "eeee", move="right", label="Stabilizer 3") - self.rectangularWall(self.edges["š"].settings.width+5*self.thickness, self.edges["š"].settings.height-4*self.burn, "eeee", move="right", label="Stabilizer 4") - self.text("Glue a stabilizer on the inside of each bottom\nside stacking foot for lateral stabilization.",3 ,0 , fontsize=4, color=Color.ANNOTATIONS) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/carbonfilter.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/carbonfilter.py deleted file mode 100644 index ebf2c8c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/carbonfilter.py +++ /dev/null @@ -1,240 +0,0 @@ -# Copyright (C) 2013-2023 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class CarbonFilter(Boxes): - """Compact filter for activated char coal pellets""" - - description = """The filter does not include the top rim. You need some rectangular wooden strip about 2-3cm in size to glue around. The x and y are without this rim and should be about 5 cm smaller that the nominal size. - -The following sizes are currently hard coded: - -* Height of rails on top: 50mm -* Borders on top: 40mm -* Char coal width (horizontal): 40mm -* Bottom width: 40 + 20 + 40 mm - -For assembly it is important that all bottom plates are the same way up. This allows the ribs of adjacent pockets to pass beside each other. - -There are three type of ribs: - -* Those with staight tops go in the middle of the bottom plates -* Those pointier angle go at the outer sides and meet with the side bars -* The less pointy go at all other sides of the bottom plates that will end up on the inside - -The last two types of ribs do not have finger joints on the outside but still need to be glued to the top beam of the adjacent pocket or the left or right side bar. -""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser(x=550, y=550, h=250) - self.argparser.add_argument( - "--pockets", action="store", type=int, default=3, - help="number of V shaped filter pockets") - self.argparser.add_argument( - "--ribs", action="store", type=int, default=12, - help="number of ribs to hold the bottom and the mesh") - - def sideCB(self): - x, y, h = self.x, self.y, self.h - t = self.thickness - p = self.pockets - - posx = t - w = self.w - a = self.a - - self.fingerHolesAt(t/2, h, 50, -90) - self.fingerHolesAt(x-t/2, h, 50, -90) - - for i in range(p): - self.fingerHolesAt(posx + t/2, h, 50, -90+a) - self.fingerHolesAt(posx + 40 + t/2, h, 50, -90+a) - self.fingerHolesAt(posx + w - t/2, h, 50, -90-a) - self.fingerHolesAt(posx + w - 40 - t/2, h, 50, -90-a) - - self.fingerHolesAt(posx + w/2 -50 + t, 3.5*t, 100 - 2*t, 0) - - posx += w - - def bottomCB(self): - t = self.thickness - for i in range(self.ribs): - self.fingerHolesAt((i+1) * self.y / (self.ribs + 1) - 1.5 * t, - 0, 4*t, 90) - self.fingerHolesAt((i+1) * self.y / (self.ribs + 1) - 1.5 * t, - 40 - t, 20, 90) - - def topRailCB(self): - t = self.thickness - for i in range(self.ribs): - self.fingerHolesAt((i+1) * self.y / (self.ribs + 1) - 1.5 * t, - 0, 30, 90) - - def innerRibs(self, n, move=None): - - x, y, h = self.x, self.y, self.h - t = self.thickness - a = self.a - a_ = math.radians(a) - - l = (h-4*t) / math.cos(a_) - 0.5 * t * math.sin(a_) - - tw = n * (20 + self.spacing) + l * math.sin(a_) - th = h-3*t - 20 * math.cos(a_) + self.spacing - - if self.move(tw, th, move, True): - return - - self.moveTo(0, t) - - for i in range(n): - self.edges["f"](20) - self.polyline(0, 90-a, l - 50, 90, t, -90) - self.edges["f"](30) - self.polyline(0, 90 + a, 20-t, 90 - a, l-20 + t * math.sin(a_), - 90+a) - - self.moveTo(20 + self.spacing) - self.ctx.stroke() - - self.move(tw, th, move, label="Inner ribs") - - def sideHolders(self, n, move=None): - - x, y, h = self.x, self.y, self.h - t = self.thickness - a = self.a - a_ = math.radians(a) - - l = (h-4*t) / math.cos(a_) - 0.5 * t * math.sin(a_) - 50 - - tw = n * (10 + self.spacing) + l * math.sin(a_) - th = h - 4*t - 50 - - if self.move(tw, th, move, True): - return - - for i in range(n): - self.polyline(10, 90-a, l, 90+a, 10, 90-a, l, 90+a) - self.ctx.stroke() - self.moveTo(10+self.spacing) - - self.move(tw, th, move, label="Inner ribs") - - def topStabilizers(self, n, move=None): - t = self.thickness - - l = 2* (self.h-60) * math.sin(math.radians(self.a)) - 20 - tw = n * (6*t + self.spacing) - th = l + 4*t - - if self.move(tw, th, move, True): - return - - self.moveTo(t) - for i in range(n): - for j in range(2): - self.polyline(0, 90, 2*t, -90, t, -90, 2*t, 90, 3*t, (90, t), - l+2*t, (90, t)) - self.ctx.stroke() - self.moveTo(6*t + self.spacing) - - self.move(tw, th, move, label="Inner ribs") - - def outerRibs(self, n, n_edge, move=None): - - x, y, h = self.x, self.y, self.h - t = self.thickness - a = self.a - a_ = math.radians(a) - - l = (h-4*t) / math.cos(a_) + 0.5 * t * math.sin(a_) - - dl = (20 - t) * (math.tan(math.pi/2 - 2*a_) + math.sin(a_)) - dll = (20 - t) * (1 / math.sin(2*a_)) - - dl2 = (20 - t) * (math.tan(math.pi/2 - a_) + math.sin(a_)) - dll2 = (20 - t) * (1 / math.sin(a_)) - - tw = (n // 2) * (40 + t) + l * math.sin(a_) - th = h + 5*t - - if self.move(tw, th, move, True): - return - - self.moveTo(2*t) - - for i in range(n): - self.polyline(0*t + 20, (90, 2*t), 2*t, -a) - if i < n_edge: - self.polyline(l - dl2 - t * math.sin(a_), a, - dll2, 180 - a, 20) - else: - self.polyline(l - dl - t * math.sin(a_), 2*a, - dll, 180 - 2*a, 20) - self.edges["f"](30) - self.polyline(0, -90, t, 90, l - 50, a, t, -90) - self.edges["f"](4*t) - self.polyline(0, 90, 1*t, (90, 2*t)) - - self.moveTo(t + 40)# + self.spacing) - if i + 1 == n // 2: - self.moveTo(2*t+0.7*self.spacing, h + 5*t, 180) - self.ctx.stroke() - - self.move(tw, th, move, label="Outer ribs") - - def render(self): - # adjust to the variables you want in the local scope - x, y, h = self.x, self.y, self.h - - self.y = y = self.adjustSize(y) - - t = self.thickness - - self.w = (x - 2*t) / self.pockets - self.a = math.degrees(math.atan((self.w - 100) / 2 / (h - 4*t))) - - # sides - for i in range(2): - self.rectangularWall(x, h, callback=[self.sideCB], move="up") - for i in range(2): - self.rectangularWall(y, 50, "efef", label="Sides", move="up") - - # top rails - for i in range(self.pockets * 4): - self.rectangularWall(y, 50, "efef", - callback=[self.topRailCB], - label="Top rails", move="up") - - # bottoms - w = 100 - 2*t - for i in range(self.pockets): - self.rectangularWall( - y, w, "efef", - callback=[self.bottomCB, None, self.bottomCB], - label="bottom plate", move="up") - - self.innerRibs(self.pockets * self.ribs * 2, move="up") - self.outerRibs(self.pockets * self.ribs * 2, self.ribs * 2, move="up") - self.sideHolders(self.pockets * 8, move="up") - self.topStabilizers(min(3, self.ribs) *self.pockets) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/cardbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/cardbox.py deleted file mode 100644 index 377b9b9..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/cardbox.py +++ /dev/null @@ -1,250 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# Copyright (C) 2018 jens persson -# Copyright (C) 2023 Manuel Lohoff -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import BoolArg, Boxes, edges - - -class InsetEdgeSettings(edges.Settings): - """Settings for InsetEdge""" - absolute_params = { - "thickness": 0, - } - - -class InsetEdge(edges.BaseEdge): - """An edge with space to slide in a lid""" - def __call__(self, length, **kw): - t = self.settings.thickness - self.corner(90) - self.edge(t, tabs=2) - self.corner(-90) - self.edge(length, tabs=2) - self.corner(-90) - self.edge(t, tabs=2) - self.corner(90) - - -class FingerHoleEdgeSettings(edges.Settings): - """Settings for FingerHoleEdge""" - absolute_params = { - "wallheight": 0, - "fingerholedepth": 0, - } - - -class FingerHoleEdge(edges.BaseEdge): - """An edge with room to get your fingers around cards""" - def __call__(self, length, **kw): - depth = self.settings.fingerholedepth-10 - self.edge(length/2-10, tabs=2) - self.corner(90) - self.edge(depth, tabs=2) - self.corner(-180, 10) - self.edge(depth, tabs=2) - self.corner(90) - self.edge(length/2-10, tabs=2) - - -class CardBox(Boxes): - """Box for storage of playing cards, with versatile options""" - ui_group = "Box" - - description = """ -### Description -Versatile Box for Storage of playing cards. Multiple different styles of storage are supported, e.g. a flat storage or a trading card deck box style storage. See images for ideas. - -#### Building instructions -Place inner walls on floor first (if any). Then add the outer walls. Glue the two walls without finger joins to the inside of the side walls. Make sure there is no squeeze out on top, as this is going to form the rail for the lid. - -Add the top of the rails to the sides (front open) or to the back and front (right side open) and the grip rail to the lid. -Details of the lid and rails -![Details](static/samples/CardBox-detail.jpg) -Whole box (early version still missing grip rail on the lid): -""" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser(y=68, h=92, outside=False, sx="65*4") - self.argparser.add_argument( - "--openingdirection", action="store", type=str, default="front", - choices=['front', 'right'], - help="Direction in which the lid slides open. Lid length > Lid width recommended.") - self.argparser.add_argument( - "--fingerhole", action="store", type=str, default="regular", - choices=['regular', 'deep', 'custom'], - help="Depth of cutout to grab the cards") - self.argparser.add_argument( - "--fingerhole_depth", action="store", type=float, default=20, - help="Depth of cutout if fingerhole is set to 'custom'. Disabled otherwise.") - self.argparser.add_argument( - "--add_lidtopper", action="store", type=BoolArg(), default=False, - help="Add an additional lid topper for optical reasons and customisation" - ) - - @property - def fingerholedepth(self): - if self.fingerhole == 'custom': - return self.fingerhole_depth - elif self.fingerhole == 'regular': - a = self.h/4 - if a < 35: - return a - else: - return 35 - elif self.fingerhole == 'deep': - return self.h-self.thickness-10 - - #inner dimensions of surrounding box (disregarding inlays) - @property - def boxhight(self): - if self.outside: - return self.h - 3 * self.thickness - return self.h - @property - def boxwidth(self): - return (len(self.sx) + 1) * self.thickness + sum(self.sx) - @property - def boxdepth(self): - if self.outside: - return self.y - 2 * self.thickness - if self.openingdirection == 'right': - return self.y + 2 * self.thickness - return self.y - - def divider_bottom(self): - t = self.thickness - sx = self.sx - y = self.boxdepth - - pos = 0.5 * t - for i in sx[:-1]: - pos += i + t - self.fingerHolesAt(pos, 0, y, 90) - - def divider_back_and_front(self): - t = self.thickness - sx = self.sx - y = self.boxhight - - pos = 0.5 * t - for i in sx[:-1]: - pos += i + t - self.fingerHolesAt(pos, 0, y, 90) - - def render(self): - t = self.thickness - - h = self.boxhight - x = self.boxwidth - y = self.boxdepth - sx = self.sx - - s = InsetEdgeSettings(thickness=t) - p = InsetEdge(self, s) - p.char = "a" - self.addPart(p) - - s = FingerHoleEdgeSettings(thickness=t, wallheight=h, fingerholedepth=self.fingerholedepth) - p = FingerHoleEdge(self, s) - p.char = "A" - self.addPart(p) - - if self.openingdirection == 'right': - with self.saved_context(): - self.rectangularWall(x, y-t*.2, "eFee", move="right", label="Lid") - self.rectangularWall(x, y, "ffff", callback=[self.divider_bottom], - move="right", label="Bottom") - self.rectangularWall(x, y, "eEEE", move="up only") - self.rectangularWall(x, t, "feee", move="up", label="Lip Front") - self.rectangularWall(x, t, "eefe", move="up", label="Lip Back") - - with self.saved_context(): - self.rectangularWall(x, h+t, "FfFf", - callback=[self.divider_back_and_front], - move="right", - label="Back") - self.rectangularWall(x, h+t, "FfFf", - callback=[self.divider_back_and_front], - move="right", - label="Front") - self.rectangularWall(x, h+t, "EEEE", move="up only") - - with self.saved_context(): - self.rectangularWall(y, h+t, "FFEF", move="right", label="Outer Side Left") - self.rectangularWall(y, h+t, "FFaF", move="right", label="Outer Side Right") - self.rectangularWall(y, h+t, "fFfF", move="up only") - - with self.saved_context(): - self.rectangularWall(y, h, "Aeee", move="right", label="Inner Side Left") - self.rectangularWall(y, h, "Aeee", move="right", label="Inner Side Right") - self.rectangularWall(y, h, "eAee", move="up only") - - with self.saved_context(): - self.rectangularWall(y-t*.2, t, "fEeE", move="right", label="Lid Lip") - self.rectangularWall(y, t*2, "efee", move="up only") - - for i in range(len(sx) - 1): - self.rectangularWall(h, y, "fAff", move="right", label="Divider") - - for c in sx: - self.rectangularWall(c, h, "eeee", move="right", label="Front inlay") - self.rectangularWall(c, h, "eeee", move="right", label="Back inlay") - - if self.add_lidtopper: - self.rectangularWall(x, y - 2*t, "eeee", move="right", label="Lid topper") - - elif self.openingdirection == 'front': - with self.saved_context(): - self.rectangularWall(x - t * .2, y, "eeFe", move="right", label="Lid") - self.rectangularWall(x, y, "ffff", callback=[self.divider_bottom], - move="right", label="Bottom") - self.rectangularWall(x, y, "eEEE", move="up only") - self.rectangularWall(x - t * .2, t, "fEeE", move="up", label="Lid Lip") - - with self.saved_context(): - self.rectangularWall(x, h + t, "FFEF", - callback=[self.divider_back_and_front], - move="right", - label="Back") - self.rectangularWall(x, h + t, "FFaF", - callback=[self.divider_back_and_front], - move="right", - label="Front") - self.rectangularWall(x, h + t, "EEEE", move="up only") - - with self.saved_context(): - self.rectangularWall(y, h + t, "FfFf", move="right", label="Outer Side Left") - self.rectangularWall(y, h + t, "FfFf", move="right", label="Outer Side Right") - self.rectangularWall(y, h + t, "fFfF", move="up only") - - with self.saved_context(): - self.rectangularWall(y, h, "Aeee", move="right", label="Inner Side Left") - self.rectangularWall(y, h, "Aeee", move="right", label="Inner Side Right") - self.rectangularWall(y, h, "eAee", move="up only") - - with self.saved_context(): - self.rectangularWall(y, t, "eefe", move="right", label="Lip Left") - self.rectangularWall(y, t, "feee", move="right", label="Lip Right") - self.rectangularWall(y, t * 2, "efee", move="up only") - - for i in range(len(sx) - 1): - self.rectangularWall(h, y, "fAff", move="right", label="Divider") - - if self.add_lidtopper: - self.rectangularWall(x, y - 2 * t, "eeee", move="right", label="Lid topper (optional)") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/cardholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/cardholder.py deleted file mode 100644 index bcefe39..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/cardholder.py +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright (C) 2013-2021 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class CardHolder(Boxes): - """Shelf for holding (multiple) piles of playing cards / notes""" - - ui_group = "Shelf" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.StackableSettings) - self.addSettingsArgs(edges.GroovedSettings) - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1.0) - - self.buildArgParser(sx="68*3", y=100, h=40, outside=False) - self.argparser.add_argument( - "--angle", action="store", type=float, default=7.5, - help="backward angle of floor") - self.argparser.add_argument( - "--stackable", action="store", type=boolarg, default=True, - help="make holders stackable") - - def side(self): - t = self.thickness - a = math.radians(self.angle) - - pos_y = self.y - abs(0.5 * t * math.sin(a)) - pos_h = t - math.cos(a) * 0.5 * t - self.fingerHolesAt(pos_y, pos_h, self.y, 180-self.angle) - - def fingerHoleCB(self, length, posy=0.0): - def CB(): - t = self.thickness - px = -0.5 * t - for x in self.sx[:-1]: - px += x + t - self.fingerHolesAt(px, posy, length, 90) - return CB - - def middleWall(self, move=None): - y, h = self.y , self.h - a = self.angle - t = self.thickness - tw = y + t - th = h - - if self.move(tw, th, move, True): - return - - self.moveTo(t, t, a) - - self.edges["f"](y) - self.polyline(0, 90-a, h-t-y*math.sin(math.radians(a)), 90, - y*math.cos(math.radians(a)), 90) - self.edges["f"](h-t) - - self.move(tw, th, move) - - def render(self): - sx, y = self.sx, self.y - t = self.thickness - - bottom = "š" if self.stackable else "e" - top = "S" if self.stackable else "e" - - if self.outside: - self.sx = sx = self.adjustSize(sx) - h = self.h = self.adjustSize(self.h, bottom, top) - else: - h = self.h = self.h + t + y * math.sin(math.radians(self.angle)) - self.x = x = sum(sx) + t * (len(sx) - 1) - - self.rectangularWall(y, h, [bottom, "F", top, "e"], - ignore_widths=[1, 6], - callback=[self.side], move="up") - self.rectangularWall(y, h, [bottom, "F", top, "e"], - ignore_widths=[1, 6], - callback=[self.side], move="up mirror") - - nx = len(sx) - f_lengths = [] - for val in self.sx: - f_lengths.append(val) - f_lengths.append(t) - f_lengths = f_lengths[:-1] - - frontedge = edges.CompoundEdge( - self, "e".join("z" * nx), f_lengths) - - self.rectangularWall(x, y, [frontedge, "f", "e", "f"], - callback=[self.fingerHoleCB(y)], move="up") - self.rectangularWall(x, h, bottom + "f" + top + "f", - ignore_widths=[1, 6], - callback=[self.fingerHoleCB(h-t, t)], move="up") - for i in range(nx-1): - self.middleWall(move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/castle.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/castle.py deleted file mode 100644 index 61d40db..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/castle.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Castle(Boxes): - """Castle tower with two walls""" - - description = """This was done as a table decoration. May be at some point in the future someone will create a proper castle -with towers and gates and walls that can be attached in multiple configurations.""" - ui_group = "Unstable" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - - def render(self, t_x=70, t_h=250, w1_x=300, w1_h=120, w2_x=100, w2_h=120): - s = edges.FingerJointSettings(10.0, relative=True, - space=1, finger=1, - width=self.thickness) - - s.edgeObjects(self, "pPQ") - - self.moveTo(0, 0) - self.rectangularWall(t_x, t_h, edges="efPf", move="right", callback=[lambda: self.fingerHolesAt(t_x * 0.5, 0, w1_h, 90), ]) - self.rectangularWall(t_x, t_h, edges="efPf", move="right") - self.rectangularWall(t_x, t_h, edges="eFPF", move="right", callback=[lambda: self.fingerHolesAt(t_x * 0.5, 0, w2_h, 90), ]) - self.rectangularWall(t_x, t_h, edges="eFPF", move="right") - - self.rectangularWall(w1_x, w1_h, "efpe", move="right") - self.rectangularWall(w2_x, w2_h, "efpe", move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/closedbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/closedbox.py deleted file mode 100644 index 95dd6bc..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/closedbox.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class ClosedBox(Boxes): - """Fully closed box""" - - ui_group = "Box" - - description = """This box is more of a building block than a finished item. -Use a vector graphics program (like Inkscape) to add holes or adjust the base -plate. - -See BasedBox for variant with a base.""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("x", "y", "h", "outside") - - def render(self): - - x, y, h = self.x, self.y, self.h - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h) - - t = self.thickness - - d2 = edges.Bolts(2) - d3 = edges.Bolts(3) - - d2 = d3 = None - - self.rectangularWall(x, h, "FFFF", bedBolts=[d2] * 4, move="right", label="Wall 1") - self.rectangularWall(y, h, "FfFf", bedBolts=[d3, d2, d3, d2], move="up", label="Wall 2") - self.rectangularWall(y, h, "FfFf", bedBolts=[d3, d2, d3, d2], label="Wall 4") - self.rectangularWall(x, h, "FFFF", bedBolts=[d2] *4, move="left up", label="Wall 3") - - self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], move="right", label="Top") - self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], label="Bottom") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coffeecapsulesholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coffeecapsulesholder.py deleted file mode 100644 index b9b5617..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coffeecapsulesholder.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright (C) 2021 Guillaume Collic -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import math - -from boxes import Boxes, boolarg - - -class CoffeeCapsuleHolder(Boxes): - """ - Coffee capsule holder - """ - - ui_group = "Misc" - - description = """ - You can store your coffee capsule near your espresso machine with this. It works both vertically, or upside down under a shelf. -""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.argparser.add_argument( - "--columns", - type=int, - default=4, - help="Number of columns of capsules.", - ) - self.argparser.add_argument( - "--rows", - type=int, - default=5, - help="Number of capsules by columns.", - ) - self.argparser.add_argument( - "--backplate", - type=boolarg, - default=True, - help="True if a backplate should be generated.", - ) - - def render(self): - self.lid_size = 37 - self.lid_size_with_margin = 39 - self.body_size = 30 - self.column_spacing = 5 - self.corner_radius = 3 - self.screw_margin = 6 - self.outer_margin = 7 - # Add space for the opening. A full row is not necessary for it. - self.rows = self.rows + 0.6 - - self.render_plate(screw_hole=7, hole_renderer=self.render_front_hole) - self.render_plate(hole_renderer=self.render_middle_hole) - if self.backplate: - self.render_plate() - - def render_plate(self, screw_hole=3.5, hole_renderer=None, move="right"): - width = ( - self.columns * (self.lid_size_with_margin + self.column_spacing) - - self.column_spacing - + 2 * self.outer_margin - ) - height = self.rows * self.lid_size + 2 * self.outer_margin - - if self.move(width, height, move, True): - return - - with self.saved_context(): - self.moveTo(self.corner_radius) - self.polyline( - width - 2 * self.corner_radius, - (90, self.corner_radius), - height - 2 * self.corner_radius, - (90, self.corner_radius), - width - 2 * self.corner_radius, - (90, self.corner_radius), - height - 2 * self.corner_radius, - (90, self.corner_radius), - ) - - if hole_renderer: - for col in range(self.columns): - with self.saved_context(): - self.moveTo( - self.outer_margin + col * (self.lid_size_with_margin + self.column_spacing) - self.burn, - self.outer_margin + (self.rows - 0.5) * self.lid_size + self.burn, - -90, - ) - hole_renderer() - - if screw_hole: - for x in [self.screw_margin, width - self.screw_margin]: - for y in [self.screw_margin, height - self.screw_margin]: - self.hole(x, y + self.burn, d=screw_hole) - - self.move(width, height, move) - - def render_front_hole(self): - radians = math.acos(self.body_size / self.lid_size_with_margin) - height_difference = (self.lid_size / 2) * math.sin(radians) - degrees = math.degrees(radians) - half = [ - 0, - (degrees, self.lid_size_with_margin / 2), - 0, - -degrees, - (self.rows - 1) * self.lid_size - height_difference, - ] - path = ( - half - + [(180, self.body_size / 2)] - + list(reversed(half)) - + [(180, self.lid_size_with_margin / 2)] - ) - self.polyline(*path) - - def render_middle_hole(self): - half = [(self.rows - 1) * self.lid_size, (180, self.lid_size_with_margin / 2)] - path = half * 2 - self.polyline(*path) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coinbanksafe.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coinbanksafe.py deleted file mode 100644 index 8124689..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coinbanksafe.py +++ /dev/null @@ -1,223 +0,0 @@ -# Copyright (C) 2024 Oliver Jensen -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class CoinBankSafe(Boxes): - """A piggy-bank designed to look like a safe.""" - - description =''' -Make sure not to discard the circle cutouts from the lid, base, and door. They are all needed. - -![Closed](static/samples/CoinBankSafe-closed.jpg) - -![Open](static/samples/CoinBankSafe-open.jpg) - -Assemble the locking pins like this: wiggle-disc, number-disc, doorhole-disc, spacer-disc, D-disc. -Glue the first three in place, but do not glue the last two. -Leaving them unglued will allow you change the code, and to remove the pin from the door. - -![Pins](static/samples/CoinBankSafe-pins.jpg) - -''' - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("x", "y", "h") - self.argparser.add_argument( - "--slotlength", action="store", type=float, default=30, - help="Length of the coin slot in mm") - self.argparser.add_argument( - "--slotwidth", action="store", type=float, default=4, - help="Width of the coin slot in mm") - self.argparser.add_argument( - "--handlelength", action="store", type=float, default=8, - help="Length of handle in multiples of thickness") - self.argparser.add_argument( - "--handleclearance", action="store", type=float, default=1.5, - help="Clearance of handle in multiples of thickness") - - def drawNumbers(self, radius, cover): - fontsize = 0.8 * (radius - cover) - for num in range(8): - angle = num*45 - x = (cover + fontsize *0.4) * math.sin(math.radians(angle)) - y = (cover + fontsize *0.4) * math.cos(math.radians(angle)) - self.text(str(num+1), align="center middle", fontsize=fontsize, angle=-angle, color=[1,0,0], - y=y, x=x) - - def lockPin(self, layers, move=None): - t = self.thickness - cutout_width = t/3 - barb_length = t - base_length = layers * t - base_width = t - total_length = base_length + barb_length - total_width = base_width + cutout_width * 0.5 - cutout_angle = math.degrees(math.atan(cutout_width / base_length)) - cutout_length = math.sqrt(cutout_width**2 + base_length**2) - - #self.rectangularWall(5*t, t) - - if self.move(total_length, total_width, move, True): - return - - self.edge(total_length) - self.corner(90) - self.edge(base_width * 1/3) - self.corner(90) - self.edge(base_length) - self.corner(180+cutout_angle, 0) - self.edge(cutout_length) - self.corner(90-cutout_angle) - self.edge(cutout_width * 1.5) - self.corner(90) - self.edge(barb_length) - self.corner(90) - self.corner(-90, cutout_width * 0.5) - self.edge(base_length - cutout_width * 0.5) - self.corner(90) - self.edge(t) - self.corner(90) - - self.move(total_length, total_width, move) - - - def render(self): - x, y, h = self.x, self.y, self.h - t = self.thickness - - slot_length = self.slotlength - slot_width = self.slotwidth - - handle_length = self.handlelength * t - handle_clearance = self.handleclearance * t - - # lock parameters - big_radius = 2.25 * t - small_radius = 1.4 * t - doorhole_radius = 1.25 * t - spacing = 1 - - # side walls - with self.saved_context(): - self.rectangularWall(x, h, "seFf", move="mirror right") - self.rectangularWall(y, h, "sFFF", move="right") - - # wall with holes for the locking bar - self.rectangularWall( - x, h, "sfFe", ignore_widths=[3,4,7,8], - callback=[lambda: self.fingerHolesAt(2.75*t, 0, h, 90)], - move="mirror right") - - # locking bar - self.moveTo(0, self.edges['s'].spacing() + t) - self.rectangularWall(1.33*t, h, "eeef", move="right") - # door - door_clearance = .1 * t # amount to shave off of the door width so it can open - before_hinge = 1.25 * t - door_clearance - after_hinge = y - 2.25 * t - door_clearance - self.moveTo(self.spacing/2, -t) - self.polyline( - after_hinge, -90, t, 90, t, 90, t, -90, before_hinge, 90, - h, 90, - before_hinge, -90, t, 90, t, 90, t, -90, after_hinge, 90, - h, 90) - num_dials = 3 - space_under_dials = 6*big_radius - space_not_under_dials = h - space_under_dials - dial_spacing = space_not_under_dials / (num_dials + 1) - if dial_spacing < 1 : - min_height = 6*big_radius + 4 - raise ValueError(f"With thickness {t}, h must be at least {min_height} to fit the dials.") - - for pos_y in (h/2, - h/2 - (2*big_radius + dial_spacing), - h/2 + (2*big_radius + dial_spacing)): - self.hole(3*t - door_clearance, pos_y, doorhole_radius) - self.rectangularHole(3*t - door_clearance, pos_y, t, t) - self.rectangularHole(y/2 - door_clearance, h/2, t, handle_length / 2) - - self.rectangularWall(x, h, "seff", move="up only") - - # top - self.rectangularWall( - y, x, "efff", callback=[ - lambda: self.rectangularHole(y/2, x/2, slot_length, slot_width), - lambda: (self.hole(1.75*t, 1.75*t, 1.15*t), - self.rectangularHole(1.75*t, 1.75*t, t, t))], - label="top", move="right") - - # bottom - self.rectangularWall( - y, x, "efff", callback=[ - lambda: (self.hole(1.75*t, 1.75*t, 1.15*t), - self.rectangularHole(1.75*t, 1.75*t, t, t))], - label="bottom", move="right") - - def holeCB(): - self.rectangularHole(0, 0, t, t) - self.moveTo(0, 0, 45) - self.rectangularHole(0, 0, t, t) - - # locks - with self.saved_context(): - self.partsMatrix(3, 1, "right", self.parts.disc, 2*big_radius, - callback=lambda: (self.drawNumbers(big_radius, small_radius), self.rectangularHole(0, 0, t, t))) - self.partsMatrix(3, 1, "right", self.parts.disc, 2*big_radius, - dwidth=0.8,callback=holeCB) - self.partsMatrix( - 3, 1, "right", self.parts.disc, 2*small_radius, - callback=lambda:self.rectangularHole(0, 0, t, t)) - self.partsMatrix( - 3, 1, "right", self.parts.wavyKnob, 2*small_radius, - callback=lambda:self.rectangularHole(0, 0, t, t)) - - self.partsMatrix(3, 1, "up only", self.parts.disc, 2*big_radius) - - # lock pins - with self.saved_context(): - self.lockPin(5, move="up") - self.lockPin(5, move="up") - self.lockPin(5, move="up") - self.lockPin(5, move="right only") - - # handle - self.moveTo(0) - handle_curve_radius = 0.2 * t - self.moveTo(t * 2.5) - self.polyline( - 0, - (90, handle_curve_radius), - handle_length - 2 * handle_curve_radius, - (90, handle_curve_radius), - handle_clearance - handle_curve_radius, - 90, - handle_length / 4, - -90, - t, - 90, - handle_length / 2, - 90, - t, - -90, - handle_length / 4, - 90, - handle_clearance - handle_curve_radius, - ) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coindisplay.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coindisplay.py deleted file mode 100644 index b98190d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/coindisplay.py +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class CoinHolderSideEdge(edges.BaseEdge): - char = "B" - def __call__(self, length, **kw): - a_l = self.coin_plate - a_l2 = self.settings.coin_plate * math.sin(self.settings.angle) - a = math.degrees(self.settings.angle) - - print(a, a_l, a_l2) - self.corner(-a) - # Draw the angled edge, but set the thickness to two temporarily - # as two pieces will go on top of another - self.edges["F"].settings.thickness = self.thickness * 2 - self.edges["F"](a_l) - self.edges["F"].settings.thickness = self.thickness - - self.polyline(0, 90+a, a_l2, -90) - - def margin(self) -> float: - return self.settings.coin_plate_x - -class CoinDisplay(Boxes): - """A showcase for a single coin""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--coin_d", action="store", type=float, default=20.0, - help="The diameter of the coin in mm") - self.argparser.add_argument( - "--coin_plate", action="store", type=float, default=50.0, - help="The size of the coin plate") - self.argparser.add_argument( - "--coin_showcase_h", action="store", type=float, default=50.0, - help="The height of the coin showcase piece") - self.argparser.add_argument( - "--angle", action="store", type=float, default=30, - help="The angle that the coin will tilt as") - - def bottomHoles(self): - """ - Function that puts two finger holes at the bottom cube plate for the coin holder - """ - self.fingerHolesAt(self.x/2 - self.thickness - self.thickness/2 - (self.coin_plate/2), self.y/2+self.coin_plate_x/2-self.thickness, self.coin_plate_x, -90) - self.fingerHolesAt(self.x/2 - self.thickness + self.thickness/2 + (self.coin_plate/2), self.y/2+self.coin_plate_x/2-self.thickness, self.coin_plate_x, -90) - - self.fingerHolesAt(self.x/2-self.coin_plate/2-self.thickness, self.y/2-self.coin_plate_x/2-self.thickness*1.5, self.coin_plate, 0) - - def coinCutout(self): - """ - Function that puts a circular hole in the coin holder piece - """ - self.hole(self.coin_plate/2, self.coin_plate/2, self.coin_d/2) - - def render(self): - - x, y, h = self.x, self.y, self.h - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h) - - t = self.thickness - - d2 = edges.Bolts(2) - d3 = edges.Bolts(3) - - d2 = d3 = None - - self.addPart(CoinHolderSideEdge(self, self)) - - self.angle = math.radians(self.angle) - self.coin_plate_x = self.coin_plate * math.cos(self.angle) - - self.rectangularWall(x, h, "FFFF", bedBolts=[d2] * 4, move="right", label="Wall 1") - self.rectangularWall(y, h, "FfFf", bedBolts=[d3, d2, d3, d2], move="up", label="Wall 2") - self.rectangularWall(y, h, "FfFf", bedBolts=[d3, d2, d3, d2], label="Wall 4") - self.rectangularWall(x, h, "FFFF", bedBolts=[d2] *4, move="left up", label="Wall 3") - - self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], move="right", label="Top") - self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], move="right", label="Bottom", callback=[self.bottomHoles]) - - # Draw the coin holder side holsers - e = ["f", "f", "B", "e"] - self.rectangularWall(self.coin_plate_x, self.coin_showcase_h, e, move="right", label="CoinSide1") - self.rectangularWall(self.coin_plate_x, self.coin_showcase_h, e, move="right", label="CoinSide2") - - self.rectangularWall(self.coin_plate, self.coin_plate, "efef", move="left down", label="Coin Plate Base") - self.rectangularWall(self.coin_plate, self.coin_plate, "efef", move="down", label="Coin Plate", callback=[self.coinCutout]) - - self.rectangularWall(self.coin_plate, self.coin_showcase_h, "fFeF", move="down", label="CoinSide3") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/concaveknob.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/concaveknob.py deleted file mode 100644 index 19cbe8d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/concaveknob.py +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (C) 2013-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class ConcaveKnob(Boxes): - """Round knob serrated outside for better gripping""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--diameter", action="store", type=float, default=50., - help="Diameter of the knob (mm)") - self.argparser.add_argument( - "--serrations", action="store", type=int, default=3, - help="Number of serrations") - self.argparser.add_argument( - "--rounded", action="store", type=float, default=.2, - help="Amount of circumference used for non convex parts") - self.argparser.add_argument( - "--angle", action="store", type=float, default=70., - help="Angle between convex and concave parts") - self.argparser.add_argument( - "--bolthole", action="store", type=float, default=6., - help="Diameter of the bolt hole (mm)") - self.argparser.add_argument( - "--dhole", action="store", type=float, default=1., - help="D-Flat in fraction of the diameter") - self.argparser.add_argument( - "--hexhead", action="store", type=float, default=10., - help="Width of the hex bolt head (mm)") - - def render(self): - t = self.thickness - self.parts.concaveKnob(self.diameter, self.serrations, - self.rounded, self.angle, - callback=lambda:self.dHole(0, 0, - d=self.bolthole, - rel_w=self.dhole), - move="right") - self.parts.concaveKnob(self.diameter, self.serrations, - self.rounded, self.angle, - callback=lambda: self.nutHole(self.hexhead), - move="right") - self.parts.concaveKnob(self.diameter, self.serrations, - self.rounded, self.angle) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/console.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/console.py deleted file mode 100644 index 09105ee..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/console.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Console(Boxes): - """Console with slanted panel""" - - ui_group = "Box" - - description = """ - -Console Arcade Stick - -![Front](static/samples/ConsoleArcadeStickFront.jpg) -![Back](static/samples/ConsoleArcadeStickBack.jpg) -![Inside](static/samples/ConsoleArcadeStickInside.jpg) - -Keyboard enclosure: -""" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=.5) - self.addSettingsArgs(edges.StackableSettings) - - self.buildArgParser(x=100, y=100, h=100, outside=False) - self.argparser.add_argument( - "--front_height", action="store", type=float, default=30, - help="height of the front below the panel (in mm)") - self.argparser.add_argument( - "--angle", action="store", type=float, default=50, - help="angle of the front panel (90°=upright)") - - def render(self): - x, y, h, hf = self.x, self.y, self.h, self.front_height - t = self.thickness - - if self.outside: - self.x = x = self.adjustSize(x) - self.y = y = self.adjustSize(y) - self.h = h = self.adjustSize(h) - - panel = min((h-hf)/math.cos(math.radians(90-self.angle)), - y/math.cos(math.radians(self.angle))) - top = y - panel * math.cos(math.radians(self.angle)) - h = hf + panel * math.sin(math.radians(self.angle)) - - if top>0.1*t: - borders = [y, 90, hf, 90-self.angle, panel, self.angle, top, - 90, h, 90] - else: - borders = [y, 90, hf, 90-self.angle, panel, self.angle+90, h, 90] - - if hf < 0.01*t: - borders[1:4] = [180-self.angle] - - self.polygonWall(borders, move="right") - self.polygonWall(borders, move="right") - self.polygonWalls(borders, x) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/console2.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/console2.py deleted file mode 100644 index 300a85c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/console2.py +++ /dev/null @@ -1,302 +0,0 @@ -# Copyright (C) 2013-2020 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Console2(Boxes): - """Console with slanted panel and service hatches""" - - ui_group = "Box" - - description = """ -This box is designed as a housing for electronic projects. It has hatches that can be re-opened with simple tools. It intentionally cannot be opened with bare hands - if build with thin enough material. - -#### Caution -There is a chance that the latches of the back wall or the back wall itself interfere with the front panel or it's mounting frame/lips. The generator does not check for this. So depending on the variant chosen you might need to make the box deeper (increase y parameter) or the panel angle steeper (increase angle parameter) until there is enough room. - -It's also possible that the frame of the panel interferes with the floor if the hi parameter is too small. - -#### Assembly instructions -The main body is easy to assemble by starting with the floor and then adding the four walls and (if present) the top piece. - -If the back wall is removable you need to add the lips and latches. The U-shaped clamps holding the latches in place need to be clued in place without also gluing the latches themselves. Make sure the springs on the latches point inwards and the angled ends point to the side walls as shown here: - -![Back wall details](static/samples/Console2-backwall-detail.jpg) - -If the panel is removable you need to add the springs with the tabs to the side lips. This photo shows the variant which has the panel glued to the frame: - -![Back wall details](static/samples/Console2-panel-detail.jpg) - -If space is tight you may consider not gluing the cross pieces in place and remove them after the glue-up. This may prevent the latches of the back wall and the panel from interfering with each other. - -The variant using finger joints only has the two side lips without the cross bars. - -#### Re-Opening - -The latches at the back wall lock in place when closed. To open them they need to be pressed in and can then be moved aside. - -To remove the panel you have to press in the four tabs at the side. It is easiest to push them in and then pull the panel up a little bit so the tabs stay in. -""" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=.5) - self.addSettingsArgs(edges.StackableSettings) - - self.buildArgParser(x=100, y=100, h=100, bottom_edge="s", - outside=False) - self.argparser.add_argument( - "--front_height", action="store", type=float, default=30, - help="height of the front below the panel (in mm)") - self.argparser.add_argument( - "--angle", action="store", type=float, default=50, - help="angle of the front panel (90°=upright)") - self.argparser.add_argument( - "--removable_backwall", action="store", type=boolarg, default=True, - help="have latches at the backwall") - self.argparser.add_argument( - "--removable_panel", action="store", type=boolarg, default=True, - help="The panel is held by tabs and can be removed") - self.argparser.add_argument( - "--glued_panel", action="store", type=boolarg, default=True, - help="the panel is glued and not held by finger joints") - - def borders(self): - x, y, h, fh = self.x, self.y, self.h, self.front_height - t = self.thickness - - panel = min((h-fh)/math.cos(math.radians(90-self.angle)), - y/math.cos(math.radians(self.angle))) - top = y - panel * math.cos(math.radians(self.angle)) - h = fh + panel * math.sin(math.radians(self.angle)) - - if top>0.1*t: - borders = [y, 90, fh, 90-self.angle, panel, self.angle, top, - 90, h, 90] - else: - borders = [y, 90, fh, 90-self.angle, panel, self.angle+90, h, 90] - return borders - - def latch(self, move=None): - t = self.thickness - s = 0.1 * t - - tw, th = 8*t, 3*t - - if self.move(tw, th, move, True): - return - - self.moveTo(0, 1.2*t) - self.polyline(t, -90, .2*t, 90, 2*t, -90, t, 90, t, 90, t, -90, 3*t, - 90, t, -90, t, 90, t, 90, 2*t, 90, 0.5*t, - -94, 4.9*t, 94, .5*t, 86, 4.9*t, -176, 5*t, - -90, 1.0*t, 90, t, 90, 1.8*t, 90) - - self.move(tw, th, move) - - def latch_clamp(self, move=None): - t = self.thickness - s = 0.1 * t - - tw, th = 4*t, 4*t - - if self.move(tw, th, move, True): - return - - self.moveTo(0.5*t) - self.polyline(t-0.5*s, 90, 2.5*t+.5*s, -90, t+s, -90, 2.5*t+.5*s, 90, t-0.5*s, 90, - t, -90, 0.5*t, 90, 2*t, 45, 2**.5*t, 45, 2*t, 45, 2**.5*t, 45, 2*t, 90, 0.5*t, -90, t, 90) - - self.move(tw, th, move) - - @restore - @holeCol - def latch_hole(self, posx): - t = self.thickness - s = 0.1 * t - - self.moveTo(posx, 2*t, 180) - - path = [1.5*t, -90, t, -90, t-0.5*s, 90] - path = path + [2*t] + list(reversed(path)) - path = path[:-1] + [3*t] + list(reversed(path[:-1])) - - self.polyline(*path) - - def panel_side(self, l, move=None): - t = self.thickness - s = 0.1 * t - - tw, th = l, 3*t - - if not self.glued_panel: - th += t - - if self.move(tw, th, move, True): - return - - self.rectangularHole(3*t, 1.5*t, 3*t, 1.05*t) - self.rectangularHole(l-3*t, 1.5*t, 3*t, 1.05*t) - self.rectangularHole(l/2, 1.5*t, 2*t, t) - if self.glued_panel: - self.polyline(*([l, 90, t, 90, t, -90, t, -90, t, 90, t, 90]*2)) - else: - self.polyline(l, 90, 3*t, 90) - self.edges["f"](l) - self.polyline(0, 90, 3*t, 90) - self.move(tw, th, move) - - def panel_lock(self, l, move=None): - t = self.thickness - - l -= 4*t - tw, th = l, 2.5*t - - if self.move(tw, th, move, True): - return - - end = [l/2-3*t, -90, 1.5*t, (90, .5*t), t, (90, .5*t), - t, 90, .5*t, -90, 0.5*t, -90, 0, (90, .5*t), 0, 90,] - - self.moveTo(l/2-t, 2*t, -90) - self.polyline(*([t, 90, 2*t, 90, t, -90] + end + [l] + - list(reversed(end)))) - self.move(tw, th, move) - - def panel_cross_beam(self, l, move=None): - t = self.thickness - - tw, th = l+2*t, 3*t - - if self.move(tw, th, move, True): - return - - self.moveTo(t, 0) - self.polyline(*([l, 90, t, -90, t, 90, t, 90, t, -90, t, 90]*2)) - - self.move(tw, th, move) - - def side(self, borders, bottom="s", move=None, label=""): - - t = self.thickness - bottom = self.edges.get(bottom, bottom) - - tw = borders[0] + 2* self.edges["f"].spacing() - th = borders[-2] + bottom.spacing() + self.edges["f"].spacing() - if self.move(tw, th, move, True): - return - - d1 = t * math.cos(math.radians(self.angle)) - d2 = t * math.sin(math.radians(self.angle)) - - self.moveTo(t, 0) - bottom(borders[0]) - self.corner(90) - self.edges["f"](borders[2]+bottom.endwidth()-d1) - self.edge(d1) - self.corner(borders[3]) - if self.removable_panel: - self.rectangularHole(3*t, 1.5*t, 2.5*t, 1.05*t) - if not self.removable_panel and not self.glued_panel: - self.edges["f"](borders[4]) - else: - self.edge(borders[4]) - if self.removable_panel: - self.rectangularHole(-3*t, 1.5*t, 2.5*t, 1.05*t) - if len(borders) == 10: - self.corner(borders[5]) - self.edge(d2) - self.edges["f"](borders[6]-d2) - self.corner(borders[-3]) - if self.removable_backwall: - self.rectangularHole(self.latchpos, 1.55*t, 1.1*t, 1.1*t) - self.edge(borders[-2]-t) - self.edges["f"](t+bottom.startwidth()) - else: - self.edges["f"](borders[-2]+bottom.startwidth()) - self.corner(borders[-1]) - - self.move(tw, th, move, label=label) - - def render(self): - x, y, h = self.x, self.y, self.h - t = self.thickness - bottom = self.edges.get(self.bottom_edge) - - if self.outside: - self.x = x = self.adjustSize(x) - self.y = y = self.adjustSize(y) - self.h = h = self.adjustSize(h, bottom) - - d1 = t * math.cos(math.radians(self.angle)) - d2 = t * math.sin(math.radians(self.angle)) - - self.latchpos = latchpos = 6*t - - borders = self.borders() - self.side(borders, bottom, move="right", label="Left Side") - self.side(borders, bottom, move="right", label="Right Side") - - self.rectangularWall(borders[0], x, "ffff", move="right", label="Floor") - self.rectangularWall( - borders[2]-d1, x, ("F", "e", "F", bottom), ignore_widths=[7, 4], - move="right", label="Front") - - if self.glued_panel: - self.rectangularWall(borders[4], x, "EEEE", move="right", label="Panel") - elif self.removable_panel: - self.rectangularWall(borders[4], x-2*t, "hEhE", move="right", label="Panel") - else: - self.rectangularWall(borders[4], x, "FEFE", move="right", label="Panel") - - if len(borders) == 10: - self.rectangularWall(borders[6]-d2, x, "FEFe", move="right", label="Top") - - if self.removable_backwall: - self.rectangularWall( - borders[-2]-1.05*t, x, "EeEe", - callback=[ - lambda:self.latch_hole(latchpos), - lambda: self.fingerHolesAt(.5*t, 0, borders[-2]-4.05*t-latchpos), - lambda:self.latch_hole(borders[-2]-1.2*t-latchpos), - lambda: self.fingerHolesAt(.5*t, 3.05*t+latchpos, borders[-2]-4.05*t-latchpos)], - move="right", - label="Back Wall") - self.rectangularWall(2*t, borders[-2]-4.05*t-latchpos, "EeEf", move="right", label="Guide") - self.rectangularWall(2*t, borders[-2]-4.05*t-latchpos, "EeEf", move="right", label="Guide") - self.rectangularWall(t, x, ("F", bottom, "F", "e"), - ignore_widths=[0, 3], move="right", label="Bottom Back") - else: - self.rectangularWall(borders[-2], x, ("F", bottom, "F", "e"), - ignore_widths=[0, 3], move="right", label="Back Wall") - - # hardware for panel - if self.removable_panel: - if self.glued_panel: - self.panel_cross_beam(x-2.05*t, "rotated right") - self.panel_cross_beam(x-2.05*t, "rotated right") - - self.panel_lock(borders[4], "up") - self.panel_lock(borders[4], "up") - self.panel_side(borders[4], "up") - self.panel_side(borders[4], "up") - - # hardware for back wall - if self.removable_backwall: - self.latch(move="up") - self.latch(move="up") - self.partsMatrix(4, 2, "up", self.latch_clamp) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/desksign.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/desksign.py deleted file mode 100644 index 44c4395..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/desksign.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Desksign(Boxes): - """Simple diagonal plate with stands to show name or message.""" - - description = """Text to be engraved can be generated by inputting the label and fontsize fields. - height represents the area that can be used for writing text, does not match the actual - height when standing. Generated text is put in the center. Currently only a single - line of text is supported.""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.StackableSettings, width=2.0) # used for feet - - self.argparser.add_argument( - "--width", action="store", type=float, default=150, - help="plate width in mm (excluding holes)") - self.argparser.add_argument( - "--height", action="store", type=float, default=80, - help="plate height in mm") - self.argparser.add_argument( - "--angle", action="store", type=float, default=60, - help="plate angle in degrees (90 is vertical)") - self.argparser.add_argument( - "--label", action="store", type=str, default="", - help="optional text to engrave (leave blank to omit)") - self.argparser.add_argument( - "--fontsize", action="store", type=float, default=20, - help="height of text") - self.argparser.add_argument( - "--feet", action="store", type=boolarg, default=False, - help="add raised feet") - self.argparser.add_argument( - "--mirror", action="store", type=boolarg, default=True, - help="mirrors one of the stand so the same side of the material can be placed on the outside") - - def render(self): - width = self.width - height = self.height - angle = self.angle - feet = self.feet - mirror = self.mirror - t = self.thickness - - if not (0 < angle and angle < 90): - raise ValueError("angle has to between 0 and 90 degrees") - - base = math.cos(math.radians(angle)) * height - h = math.sin(math.radians(angle)) * height - - label = self.label - fontsize = self.fontsize - - if label and fontsize: - self.rectangularWall(width, height, "eheh", move="right", callback=[ - lambda: self.text("%s" % label, width/2, (height-fontsize)/2, - fontsize = fontsize, align="center", color=Color.ETCHING)]) # add text - else: - self.rectangularWall(width, height, "eheh", move="right") # front - - # stands at back/side - edge = "šef" if feet else "eef" - if mirror: - self.rectangularTriangle(base, h, edge, num=1, move="right") - self.rectangularTriangle(base, h, edge, num=1, move="mirror right") - else: - self.rectangularTriangle(base, h, edge, num=2, move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dicebox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dicebox.py deleted file mode 100644 index e646011..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dicebox.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (C) 2022 Erik Snider (SniderThanYou@gmail.com) -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class DiceBox(Boxes): - """Box with lid and integraded hinge for storing dice""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs( - edges.FingerJointSettings, - surroundingspaces=2.0) - self.addSettingsArgs( - edges.ChestHingeSettings, - finger_joints_on_box=True, - finger_joints_on_lid=True) - self.buildArgParser( - x=100, - y=100, - h=18, - outside=True) - self.argparser.add_argument( - "--lidheight", action="store", type=float, default=18, - help="height of lid in mm") - self.argparser.add_argument( - "--hex_hole_corner_radius", action="store", type=float, default=5, - help="The corner radius of the hexagonal dice holes, in mm") - self.argparser.add_argument( - "--magnet_diameter", action="store", type=float, default=6, - help="The diameter of magnets for holding the box closed, in mm") - - def diceCB(self): - t = self.thickness - xi = self.x - 2 * t - yi = self.y - 2 * t - xc = xi / 2 - yc = yi / 2 - cr = self.hex_hole_corner_radius - - # -4*t because there are four gaps across: - # 2 between the outer holes and the finger joints - # 2 between the outer holes and the center hole - # /6 because there are 6 apothems across, 2 for each hexagon - apothem = (min(xi, yi) - 4 * t) / 6 - r = apothem * 2 / math.sqrt(3) - - # dice - centers = [[xc, yc]] # start with one in the center - polar_r = 2 * apothem + t # the full width of a hexagon, plus a gap of t width - for i in range(6): - theta = i * math.pi / 3 # 60 degrees each step - centers.append( - [ - xc + polar_r * math.cos(theta), - yc + polar_r * math.sin(theta), - ] - ) - for center in centers: - self.regularPolygonHole(x=center[0], y=center[1], n=6, r=r, corner_radius=cr, a=30) - - # magnets - d = self.magnet_diameter - mo = t + d/2 - self.hole(mo, mo, d=d) - self.hole(xi-mo, mo, d=d) - - def render(self): - x, y, h, hl = self.x, self.y, self.h, self.lidheight - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h) - hl = self.adjustSize(hl) - - t = self.thickness - - hy = self.edges["O"].startwidth() - hy2 = self.edges["P"].startwidth() - - e1 = edges.CompoundEdge(self, "eF", (hy-t, h-hy+t)) - e2 = edges.CompoundEdge(self, "Fe", (h-hy+t, hy-t)) - e_back = ("F", e1, "F", e2) - - p = self.edges["o"].settings.pin_height - e_inner_1 = edges.CompoundEdge(self, "fe", (y-p, p)) - e_inner_2 = edges.CompoundEdge(self, "ef", (p, y-p)) - e_inner_topbot = ("f", e_inner_1, "f", e_inner_2) - - self.ctx.save() - - self.rectangularWall(x, y, e_inner_topbot, move="up", callback=[self.diceCB]) - self.rectangularWall(x, y, e_inner_topbot, move="up", callback=[self.diceCB]) - self.rectangularWall(x, h, "FFFF", ignore_widths=[1,2,5,6], move="up") - self.rectangularWall(x, h, e_back, move="up") - self.rectangularWall(x, hl, "FFFF", ignore_widths=[1,2,5,6], move="up") - self.rectangularWall(x, hl-hy2+t, "FFqF", move="up") - - self.ctx.restore() - self.rectangularWall(x, y, "ffff", move="right only") - - self.rectangularWall(y, x, "ffff", move="up") - self.rectangularWall(y, x, "ffff", move="up") - self.rectangularWall(y, hl-hy2+t, "Ffpf", ignore_widths=[5,6], move="up") - self.rectangularWall(y, h-hy+t, "OfFf", ignore_widths=[5,6], move="up") - self.rectangularWall(y, h-hy+t, "Ffof", ignore_widths=[5,6], move="up") - self.rectangularWall(y, hl-hy2+t, "PfFf", ignore_widths=[5,6], move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dinrailbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dinrailbox.py deleted file mode 100644 index ed9b2b3..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dinrailbox.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (C) 2013-2020 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class DinRailEdge(edges.FingerHoleEdge): - - def __init__(self, boxes, settings, width=35.0, offset=0.0) -> None: - super().__init__(boxes, settings) - self.width = width - self.offset = offset - - def startwidth(self) -> float: - return 8 + self.settings.thickness - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - with self.saved_context(): - self.fingerHoles( - 0, self.burn + 8 + self.settings.thickness / 2, length, 0, - bedBolts=bedBolts, bedBoltSettings=bedBoltSettings) - - w = self.width - o = self.offset - l = length - self.polyline((l-w)/2-o, 45, 2.75*2**.5, 90, 2.75*2**.5, -45, .5, -90, - w+0.25, - -90, 1, 30, 5*2*3**-.5, 60, (l-w)/2+o-3.25) - - -class DinRailBox(Boxes): - """Box for DIN rail used in electrical junction boxes""" - - ui_group = "WallMounted" - - def latch(self, l, move=None): - - t = self.thickness - tw = l+3+6+t - th = 8 - - if self.move(tw, th, move, True): - return - - self.moveTo(tw, th, 180) - self.polyline(2, 90, 0, (-180, 1.5), 0, 90, l+1.2*t, 90, - 3, -90, 1, 30, 2*2*3**-.5, 90, 4.5*2*3**-.5, 60, - 4+1.25, 90, 4.5, -90, t+4, -90, 2, 90, l-.8*t-9, 90, 2, -90, 5+t, 90, 4, 90) - - self.move(tw, th, move) - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=.8) - - self.buildArgParser(x=70, y=90, h=60) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--rail_width", action="store", type=float, default=35., - help="width of the rail (typically 35 or 15mm)") - self.argparser.add_argument( - "--rail_offset", action="store", type=float, default=0., - help="offset of the rail from the middle of the box (in mm)") - - def spring(self): - t = self.thickness - l = min(self.x/2-1.5*t, 50) - self.moveTo(self.x/2-l, -6-t, 0) - self.polyline(l+0.525*t, 90 , 6, 90 , 1.1*t, 90, 3, -90, l-0.525*t, - 180, l-0.525*t, -90, 1+0.1*t, 90, t-0.5, -90, 2) - - def lid_lip(self, l, move=None): - t = self.thickness - tw, th = l+2, t+8 - - if self.move(tw, th, move, True): - return - self.moveTo(1, t) - self.edges["f"](l) - - poly = [0, 90, 6, -60, 0, (120, 2*3**-.5), 0, 30, 2, 90, 5, - (-180, .5), 5, 90] - self.polyline(*(poly+[l-2*3]+list(reversed(poly)))) - - self.move(tw, th, move) - - def lid_holes(self): - t = self.thickness - self.rectangularHole(0.55*t, 7, 1.1*t, 1.6) - self.rectangularHole(self.x-0.55*t, 7, 1.1*t, 1.6) - - def render(self): - # adjust to the variables you want in the local scope - x, y, h = self.x, self.y, self.h - w = self.rail_width - o = self.rail_offset - t = self.thickness - - self.rectangularWall(x, y, "EEEE", callback=[ - lambda:self.fingerHolesAt(.55*t, .05*t, y-.1*t, 90), None, - lambda:self.fingerHolesAt(.55*t, .05*t, y-.1*t, 90), None], - move="right", label="Lid") - - self.lid_lip(y-.1*t, move="rotated right") - self.lid_lip(y-.1*t, move="rotated right") - - self.rectangularWall(x, y, "ffff", - callback=[ - lambda:self.fingerHolesAt(0, (y-w)/2-0.5*t+o-9, x, 0)], - move="right", label="Back") - - # Change h edge to 8mm! - self.edges["f"].settings.setValues(t, False, edge_width=8) - dr = DinRailEdge(self, self.edges["f"].settings, w, o) - - self.rectangularWall(y, h, [dr, "F", "e", "F"], - ignore_widths=[1, 6], move="rotated right", - label="Left Side upsidedown") - self.rectangularWall(y, h, [dr, "F", "e", "F"], - ignore_widths=[1, 6], move="rotated mirror right", - label="Right Side") - self.rectangularWall(x, h, ["h", "f", "e", "f"], - ignore_widths=[1, 6], callback=[ - self.spring, None, self.lid_holes], - move="up", - label="Bottom") - self.rectangularWall(x, h, ["h", "f", "e", "f"], - callback=[None, None, self.lid_holes], - ignore_widths=[1, 6], move="up", - label="Top") - - - self.rectangularWall(x, 8, "feee", callback=[ - lambda:self.rectangularHole(x/2, 2.05-0.5*t, t, t+4.1)], move="up") - self.latch((y-w)/2+o, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/discrack.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/discrack.py deleted file mode 100644 index f40adc1..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/discrack.py +++ /dev/null @@ -1,266 +0,0 @@ -# Copyright (C) 2019 chrysn -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from math import cos, pi, sin, sqrt - -from boxes import * - - -def offset_radius_in_square(squareside, angle, outset): - """From the centre of a square, rotate by an angle relative to the - vertical, move away from the center (down if angle = 0), and then in a - right angle until the border of the square. Return the length of that last - segment. - - Note that for consistency with other boxes.py methods, angle is given in - degree. - - >>> # Without rotation, it's always half the square length - >>> offset_radius_in_square(20, 0, 0) - 10.0 - >>> offset_radius_in_square(20, 0, 5) - 10.0 - >>> # Without offset, it's half square length divided by cos(angle) -- at - >>> # least before it hits the next wall - >>> offset_radius_in_square(20, 15, 0) # doctest:+ELLIPSIS - 10.35276... - >>> offset_radius_in_square(20, 45, 0) # doctest:+ELLIPSIS - 14.1421... - >>> # Positive angles make the segment initially shorter... - >>> offset_radius_in_square(20, 5, 10) < 10 - True - >>> # ... while negative angles make it longer. - >>> offset_radius_in_square(20, -5, 10) > 10 - True - """ - - if angle <= -90: - return offset_radius_in_square(squareside, angle + 180, outset) - if angle > 90: - return offset_radius_in_square(squareside, angle - 180, outset) - - angle = angle / 180 * pi - - step_right = outset * sin(angle) - step_down = outset * cos(angle) - - try: - len_right = (squareside / 2 - step_right) / cos(angle) - except ZeroDivisionError: - return squareside / 2 - - if angle == 0: - return len_right - if angle > 0: - len_up = (squareside / 2 + step_down) / sin(angle) - - return min(len_up, len_right) - else: # angle < 0 - len_down = - (squareside / 2 - step_down) / sin(angle) - - return min(len_down, len_right) - -class DiscRack(Boxes): - """A rack for storing disk-shaped objects vertically next to each other""" - - ui_group = "Shelf" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.buildArgParser(sx="20*10") - self.argparser.add_argument( - "--disc_diameter", action="store", type=float, default=150.0, - help="Disc diameter in mm") - self.argparser.add_argument( - "--disc_thickness", action="store", type=float, default=5.0, - help="Thickness of the discs in mm") - - self.argparser.add_argument( - "--lower_factor", action="store", type=float, default=0.75, - help="Position of the lower rack grids along the radius") - self.argparser.add_argument( - "--rear_factor", action="store", type=float, default=0.75, - help="Position of the rear rack grids along the radius") - - self.argparser.add_argument( - "--disc_outset", action="store", type=float, default=3.0, - help="Additional space kept between the disks and the outbox of the rack") - - # These can be parameterized, but the default value of pulling them up - # to the box front is good enough for so many cases it'd only clutter - # the user interface. - # - # The parameters can be resurfaced when there is something like rare or - # advanced settings. - ''' - self.argparser.add_argument( - "--lower_outset", action="store", type=float, default=0.0, - help="Space in front of the disk slits (0: automatic)") - self.argparser.add_argument( - "--rear_outset", action="store", type=float, default=0.0, - help="Space above the disk slits (0: automatic)") - ''' - - self.argparser.add_argument( - "--angle", action="store", type=float, default=18, - help="Backwards slant of the rack") - self.addSettingsArgs(edges.FingerJointSettings) - - def parseArgs(self, *args, **kwargs): - Boxes.parseArgs(self, *args, **kwargs) - self.lower_outset = self.rear_outset = 0 - - self.calculate() - - def calculate(self): - self.outer = self.disc_diameter + 2 * self.disc_outset - - r = self.disc_diameter / 2 - - # distance between radius line and front (or rear) end of the slit - self.lower_halfslit = r * sqrt(1 - self.lower_factor**2) - self.rear_halfslit = r * sqrt(1 - self.rear_factor**2) - - if True: # self.lower_outset == 0: # when lower_outset parameter is re-enabled - toplim = offset_radius_in_square(self.outer, self.angle, r * self.lower_factor) - # With typical positive angles, the lower surface of board will be limiting - bottomlim = offset_radius_in_square(self.outer, self.angle, r * self.lower_factor + self.thickness) - self.lower_outset = min(toplim, bottomlim) - self.lower_halfslit - - if True: # self.rear_outset == 0: # when rear_outset parameter is re-enabled - # With typical positive angles, the upper surface of board will be limiting - toplim = offset_radius_in_square(self.outer, -self.angle, r * self.rear_factor) - bottomlim = offset_radius_in_square(self.outer, -self.angle, r * self.rear_factor + self.thickness) - self.rear_outset = min(toplim, bottomlim) - self.rear_halfslit - - # front outset, space to radius, space to rear part, plus nothing as fingers extend out - self.lower_size = self.lower_outset + \ - self.lower_halfslit + \ - r * self.rear_factor - - self.rear_size = r * self.lower_factor + \ - self.rear_halfslit + \ - self.rear_outset - - self.warn_on_demand() - - def warn_on_demand(self): - warnings = [] - - # Are the discs supported on the outer ends? - - def word_thickness(length): - if length > 0: - return f"very thin ({length:.2g} mm at a thickness of {self.thickness:.2g} mm)" - if length < 0: - return "absent" - - if self.rear_outset < self.thickness: - warnings.append("Rear upper constraint is %s. Consider increasing the disc outset parameter, or move the angle away from 45°." % word_thickness(self.rear_outset)) - - if self.lower_outset < self.thickness: - warnings.append("Lower front constraint is %s. Consider increasing the disc outset parameter, or move the angle away from 45°." % word_thickness(self.lower_outset)) - - # Are the discs supported where the grids meet? - - r = self.disc_diameter / 2 - inner_lowerdistance = r * self.rear_factor - self.lower_halfslit - inner_reardistance = r * self.lower_factor - self.rear_halfslit - - if inner_lowerdistance < 0 or inner_reardistance < 0: - warnings.append("Corner is inside the disc radios, discs would not be supported. Consider increasing the factor parameters.") - - # Won't the type-H edge on the rear side make the whole contraption - # wiggle? - - max_slitlengthplush = offset_radius_in_square( - self.outer, self.angle, r * self.rear_factor + self.thickness) - slitlengthplush = self.rear_halfslit + self.thickness * ( 1 + - self.edgesettings['FingerJoint']['edge_width']) - - if slitlengthplush > max_slitlengthplush: - warnings.append("Joint would protrude from lower box edge. Consider increasing the the disc outset parameter, or move the angle away from 45°.") - - # Can the discs be removed at all? - # Does not need explicit checking, for Thales' theorem tells us that at - # the point where there is barely support in the corner, three contact - # points on the circle form just a semicircle and the discs can be - # inserted/removed. When we keep the other contact points and move the - # slits away from the corner, the disc gets smaller and thus will fit - # through the opening that is as wide as the diameter of the largest - # possible circle. - - # Act on warnings - - if warnings: - self.argparser.error("\n".join(warnings)) - - def sidewall_holes(self): - r = self.disc_diameter / 2 - - self.moveTo(self.outer/2, self.outer/2, -self.angle) - # can now move down to paint horizontal lower part, or right to paint - # vertical rear part - with self.saved_context(): - self.moveTo( - r * self.rear_factor, - -r * self.lower_factor - self.thickness/2, - 90) - self.fingerHolesAt(0, 0, self.lower_size) - with self.saved_context(): - self.moveTo( - r * self.rear_factor + self.thickness/2, - -r * self.lower_factor, - 0) - self.fingerHolesAt(0, 0, self.rear_size) - - if self.debug: - self.circle(0, 0, self.disc_diameter / 2) - - def _draw_slits(self, inset, halfslit): - total_x = 0 - - for x in self.sx: - center_x = total_x + x / 2 - - total_x += x - self.rectangularHole(inset, center_x, 2 * halfslit, self.disc_thickness) - if self.debug: - self.ctx.rectangle(inset - halfslit, center_x - x/2, 2 * halfslit, x) - - def lower_holes(self): - r = self.disc_diameter / 2 - inset = self.lower_outset + self.lower_halfslit - - self._draw_slits(inset, self.lower_halfslit) - - def rear_holes(self): - r = self.disc_diameter / 2 - inset = r * self.lower_factor - - self._draw_slits(inset, self.rear_halfslit) - - def render(self): - o = self.outer - - self.lower_factor = min(self.lower_factor, 0.99) - self.rear_factor = min(self.rear_factor, 0.99) - - self.rectangularWall(o, o, "eeee", move="right", callback=[self.sidewall_holes]) - self.rectangularWall(o, o, "eeee", move="right mirror", callback=[self.sidewall_holes]) - - self.rectangularWall(self.lower_size, sum(self.sx), "fffe", move="right", callback=[self.lower_holes]) - self.rectangularWall(self.rear_size, sum(self.sx), "fefh", move="right", callback=[self.rear_holes]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dispenser.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dispenser.py deleted file mode 100644 index c624b04..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dispenser.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FrontEdge(edges.BaseEdge): - """An edge with room to get your fingers around cards""" - def __call__(self, length, **kw): - depth = self.settings.y * 2 / 3 - t = self.settings.thickness - r = min(depth-t, length/4) - self.edge(length/4-t, tabs=2) - self.corner(90, t) - self.edge(depth-t-r, tabs=2) - self.corner(-90, r) - self.edge(length/2 - 2*r) - self.corner(-90, r) - self.edge(depth-t-r, tabs=2) - self.corner(90, t) - self.edge(length/4-t, tabs=2) - - -class Dispenser(Boxes): - """Dispenser for stackable (flat) items of same size""" - - description = """Set *bottomheight* to 0 for a wall mounting variant. -Please add mounting holes yourself.""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.StackableSettings) - - self.buildArgParser(x=100, y=100, h=100) - - self.argparser.add_argument( - "--slotheight", action="store", type=float, default=10.0, - help="height of the dispenser slot / items (in mm)") - self.argparser.add_argument( - "--bottomheight", action="store", type=float, default=0.0, - help="height underneath the dispenser (in mm)") - self.argparser.add_argument( - "--sideedges", action="store", type=ArgparseEdgeType("Fh"), - choices=list("Fh"), default="F", - help="edges used for holding the front panels and back") - - - def render(self): - x, y, h, hs = self.x, self.y, self.h, self.slotheight - hb = self.bottomheight - t = self.thickness - - se = self.sideedges - fe = FrontEdge(self, self) - - hb = max(0, hb-self.edges["š"].spacing()) - th = h + (hb+t if hb else 0.0) - hh = hb + 0.5*t - - with self.saved_context(): - self.rectangularWall(x, y, [fe, "f", "f", "f"], - label="Floor", move="right") - self.rectangularWall(x, y, "eeee", label="Lid bottom", move="right") - self.rectangularWall(x, y, "EEEE", label="Lid top", move="right") - - - self.rectangularWall(x, y, "ffff", move="up only") - - if hb: - frontedge = edges.CompoundEdge(self, "Ef", (hb+t+hs, h-hs)) - self.rectangularWall( - y, th, ("š", frontedge, "e", "f"), ignore_widths=[6], - callback=[lambda:self.fingerHolesAt(0, hh, y, 0)], - label="Left wall", move="right mirror") - self.rectangularWall( - x, th, ["š", se, "e", se], ignore_widths=[1, 6], - callback=[lambda:self.fingerHolesAt(0, hh, x, 0)], - label="Back wall", move="right") - self.rectangularWall( - y, th, ("š", frontedge, "e", "f"), ignore_widths=[6], - callback=[lambda:self.fingerHolesAt(0, hh, y, 0)], - label="Right wall", move="right") - - else: - frontedge = edges.CompoundEdge(self, "Ef", (hs, h-hs)) - self.rectangularWall( - y, th, ("h", frontedge, "e", "f"), - label="Left wall", ignore_widths=[6], move="right mirror") - self.rectangularWall( - x, th, ["h", se, "e", se], ignore_widths=[1, 6], - label="Back wall", move="right") - self.rectangularWall( - y, th, ("h", frontedge, "e", "f"), - label="Right wall", ignore_widths=[6], move="right") - - self.rectangularWall(x/3, h-hs, "eee" + se, - label="Left front", move="right") - self.rectangularWall(x/3, h-hs, "eee" + se, - label="Right front", move="mirror right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/display.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/display.py deleted file mode 100644 index 3f4e429..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/display.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Display(Boxes): - """Display for flyers or leaflets""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.buildArgParser(x=150., h=200.0) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--radius", action="store", type=float, default=5., - help="radius of the corners in mm") - self.argparser.add_argument( - "--angle", action="store", type=float, default=0., - help="greater zero for top wider as bottom") - - - def render(self): - # adjust to the variables you want in the local scope - x, h, r = self.x, self.h, self.radius - a = self.angle - t = self.thickness - - self.roundedPlate(0.7*x, x, r, "e", extend_corners=False, move="up") - - oh = 1.2*h-2*r - if a > 0: - self.moveTo(math.sin(math.radians(a))*oh) - self.rectangularHole(x/2, h*0.2, 0.7*x+0.1*t, 1.3*t) - self.moveTo(r) - self.polyline(x-2*r, (90-a, r), oh, (90+a, r), - x-2*r+2*math.sin(math.radians(a))*oh, - (90+a, r), oh, (90-a, r)) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/displaycase.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/displaycase.py deleted file mode 100644 index 5ec363d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/displaycase.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# Copyright (C) 2018 Alexander Bulimov -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class DisplayCase(Boxes): - """Fully closed box intended to be cut from transparent acrylics and to serve as a display case.""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--overhang", - action="store", - type=float, - default=2, - help="overhang for joints in mm", - ) - - def render(self): - - x, y, h = self.x, self.y, self.h - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h) - - t = self.thickness - - d2 = edges.Bolts(2) - d3 = edges.Bolts(3) - - d2 = d3 = None - - self.rectangularWall(x, h, "ffff", bedBolts=[d2] * 4, move="right", label="Wall 1") - self.rectangularWall(y, h, "fFfF", bedBolts=[d3, d2, d3, d2], move="up", label="Wall 2") - self.rectangularWall(y, h, "fFfF", bedBolts=[d3, d2, d3, d2], label="Wall 4") - self.rectangularWall(x, h, "ffff", bedBolts=[d2] * 4, move="left up", label="Wall 3") - - self.flangedWall(x, y, "FFFF", flanges=[self.overhang] * 4, move="right", label="Top") - self.flangedWall(x, y, "FFFF", flanges=[self.overhang] * 4, label="Bottom") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/displayshelf.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/displayshelf.py deleted file mode 100644 index 5a9eeba..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/displayshelf.py +++ /dev/null @@ -1,196 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class DisplayShelf(Boxes): - """Shelf with slanted floors""" - - ui_group = "Shelf" - - # arguments/properties - num: int - x: float - y: float - h: float - angle: float - thickness: float - radians: float - sl: float - front_wall_height: float - include_back: bool - slope_top: bool - outside: bool - divider_wall_height: float - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - - self.buildArgParser(sx="400", y=100, h=300, outside=True) - self.argparser.add_argument( - "--num", action="store", type=int, default=3, - help="number of shelves") - self.argparser.add_argument( - "--front_wall_height", action="store", type=float, default=20.0, - help="height of front walls") - self.argparser.add_argument( - "--angle", action="store", type=float, default=30.0, - help="angle of floors (negative values for slanting backwards)") - self.argparser.add_argument( - "--include_back", action="store", type=boolarg, default=False, - help="Include panel on the back of the shelf") - self.argparser.add_argument( - "--slope_top", action="store", type=boolarg, default=False, - help="Slope the sides and the top by front wall height") - self.argparser.add_argument( - "--divider_wall_height", action="store", type=float, default=20.0, - help="height of divider walls") - - def generate_finger_holes(self): - t = self.thickness - a = self.radians - hs = (self.sl + t) * math.sin(a) + math.cos(a) * t - for i in range(self.num): - pos_x = abs(0.5 * t * math.sin(a)) - pos_y = hs - math.cos(a) * 0.5 * t + i * (self.h - abs(hs)) / (self.num - 0.5) - if a < 0: - pos_y += -math.sin(a) * self.sl - self.fingerHolesAt(pos_x, pos_y, self.sl, -self.angle) - pos_x += math.cos(-a) * (self.sl + 0.5 * t) + math.sin(a) * 0.5 * t - pos_y += math.sin(-a) * (self.sl + 0.5 * t) + math.cos(a) * 0.5 * t - self.fingerHolesAt(pos_x, pos_y, self.front_wall_height, 90 - self.angle) - - def generate_sloped_sides(self, width, height): - top_segment_height = height / self.num - a = self.radians - - # Maximum size to cut out - vertical_cut = top_segment_height - self.front_wall_height - hypotenuse = vertical_cut / math.sin(a) - horizontal_cut = math.sqrt((hypotenuse ** 2) - (vertical_cut ** 2)) - - if horizontal_cut > width: - # Shrink the cut to keep the full height - horizontal_cut = width - 1 # keep a 1mm edge on the top - vertical_cut = horizontal_cut * math.tan(a) - hypotenuse = math.sqrt((horizontal_cut ** 2) + (vertical_cut ** 2)) - - top = width - horizontal_cut - front = height - vertical_cut - - borders = [width, 90, front, 90 - self.angle, hypotenuse, self.angle, top, 90, height, 90] - edges = 'eeeef' if self.include_back else 'e' - self.polygonWall(borders, edge=edges, callback=[self.generate_finger_holes], move="up", label="left side") - self.polygonWall(borders, edge=edges, callback=[self.generate_finger_holes], move="up", label="right side") - - def generate_rectangular_sides(self, width, height): - edges = "eeee" - if self.include_back: - edges = "eeef" - self.rectangularWall(width, height, edges, callback=[self.generate_finger_holes], move="up", label="left side") - self.rectangularWall(width, height, edges, callback=[self.generate_finger_holes], move="up", label="right side") - - def generate_shelve_finger_holes(self): - t = self.thickness - pos_x = -0.5 * t - for x in self.sx[:-1]: - pos_x += x + t - self.fingerHolesAt(pos_x, 0, self.sl, 90) - - def generate_front_lip_finger_holes(self): - t = self.thickness - height = self.front_wall_height - if self.divider_wall_height < height: - height = self.divider_wall_height - pos_x = -0.5 * t - for x in self.sx[:-1]: - pos_x += x + t - self.fingerHolesAt(pos_x, 0, height, 90) - - def generate_shelves(self): - if self.front_wall_height: - for i in range(self.num): - self.rectangularWall( - self.x, - self.sl, - "ffef", - callback=[self.generate_shelve_finger_holes], - move="up", - label=f"shelf {i + 1}" - ) - self.rectangularWall( - self.x, - self.front_wall_height, - "Ffef", - callback=[self.generate_front_lip_finger_holes], - move="up", - label=f"front lip {i + 1}" - ) - else: - for i in range(self.num): - self.rectangularWall( - self.x, - self.sl, - "Efef", - callback=[self.generate_shelve_finger_holes], - move="up", - label=f"shelf {i + 1}" - ) - - def generate_dividers(self): - edges_ = "feee" - if self.front_wall_height: - edges_ = "ffee" - if self.divider_wall_height > self.front_wall_height: - edges_ = [ - "f", - edges.CompoundEdge(self, "fe", [self.front_wall_height, self.divider_wall_height - self.front_wall_height]), - "e", - "e" - ] - - for i in range(self.num): - for j in range(len(self.sx) -1): - self.rectangularWall(self.sl, self.divider_wall_height, edges_, move="up", label=f"divider {j + 1} for shelf {i + 1}") - - def render(self): - # adjust to the variables you want in the local scope - sx, y, h = self.sx, self.y, self.h - front = self.front_wall_height - thickness = self.thickness - - if self.outside: - self.sx = sx = self.adjustSize(sx) - if self.include_back: - self.y = y = self.adjustSize(y, False) - - self.x = x = sum(sx) + thickness * (len(sx) - 1) - self.radians = a = math.radians(self.angle) - self.sl = (y - (thickness * (math.cos(a) + abs(math.sin(a)))) - max(0, math.sin(a) * front)) / math.cos(a) - - # render your parts here - if self.slope_top: - self.generate_sloped_sides(y, h) - else: - self.generate_rectangular_sides(y, h) - - self.generate_shelves() - self.generate_dividers() - - if self.include_back: - self.rectangularWall(x, h, "eFeF", label="back wall", move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dividertray.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dividertray.py deleted file mode 100644 index e3d28ec..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/dividertray.py +++ /dev/null @@ -1,640 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from __future__ import annotations - -import math -from functools import partial - -from boxes import Boxes, boolarg, edges, lids - - -class NotchSettings(edges.Settings): - """Settings for Notches on the Dividers""" - - absolute_params = { - "upper_radius": 1, - "lower_radius": 8, - "depth": 15, - } - - -class SlotSettings(edges.Settings): - """Settings for Divider Slots - - Values: - - * absolute - * depth : 20 : depth of the slot in mm - * angle : 0 : angle at which slots are generated, in degrees. 0° is vertical. - * radius : 2 : radius of the slot entrance in mm - * extra_slack : 0.2 : extra slack (in addition to thickness and kerf) to help insert dividers in mm""" - - absolute_params = { - "depth": 20, - "angle": 0, - "radius": 2, - "extra_slack": 0.2, - } - - -class DividerSettings(edges.Settings): - """Settings for Dividers - Values: - - * absolute_params - - * bottom_margin : 0 : margin between box's bottom and divider's in mm - - * relative (in multiples of thickness) - - * play : 0.05 : play to avoid them clamping onto the walls (in multiples of thickness) - """ - - absolute_params = { - "bottom_margin": 0, - } - relative_params = { - "play": 0.05, - } - - -class DividerTray(Boxes): - """Divider tray - rows and dividers""" - - description = """ -Adding '0:' at the start of the sy parameter adds a slot at the very back. Adding ':0' at the end of sy adds a slot meeting the bottom at the very front. This is especially useful if slot angle is set above zero. - -There are 4 different sets of dividers rendered: - -* With asymmetric tabs so the tabs fit on top of each other -* With tabs of half wall thickness that can go side by side -* With tabs of a full wall thickness -* One single divider spanning across all columns - -You will likely need to cut each of the dividers you want multiple times. -""" - - ui_group = "Tray" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.HandleEdgeSettings) - self.addSettingsArgs(lids.LidSettings) - self.buildArgParser("sx", "sy", "h", "outside") - self.addSettingsArgs(SlotSettings) - self.addSettingsArgs(NotchSettings) - self.addSettingsArgs(DividerSettings) - self.argparser.add_argument( - "--notches_in_wall", - type=boolarg, - default=True, - help="generate the same notches on the walls that are on the dividers", - ) - self.argparser.add_argument( - "--left_wall", - type=boolarg, - default=True, - help="generate wall on the left side", - ) - self.argparser.add_argument( - "--right_wall", - type=boolarg, - default=True, - help="generate wall on the right side", - ) - self.argparser.add_argument( - "--bottom", type=boolarg, default=False, help="generate wall on the bottom", - ) - self.argparser.add_argument( - "--handle", type=boolarg, default=False, help="add handle to the bottom", - ) - - def render(self): - - side_walls_number = len(self.sx) - 1 + sum([self.left_wall, self.right_wall]) - if side_walls_number == 0: - raise ValueError("You need at least one side wall to generate this tray") - - # We need to adjust height before slot generation - if self.outside: - if self.bottom: - self.h -= self.thickness - else: - # If the parameter 'h' is the inner height of the content itself, - # then the actual tray height needs to be adjusted with the angle - self.h = self.h * math.cos(math.radians(self.Slot_angle)) - - slot_descriptions = SlotDescriptionsGenerator().generate_all_same_angles( - self.sy, - self.thickness, - self.Slot_extra_slack, - self.Slot_depth, - self.h, - self.Slot_angle, - self.Slot_radius, - ) - - # If measures are outside, we need to readjust slots afterwards - if self.outside: - self.sx = self.adjustSize(self.sx, self.left_wall, self.right_wall) - side_wall_target_length = sum(self.sy) - 2 * self.thickness - slot_descriptions.adjust_to_target_length(side_wall_target_length) - - self.ctx.save() - - # Facing walls (outer) with finger holes to support side walls - facing_wall_length = sum(self.sx) + self.thickness * (len(self.sx) - 1) - side_edge = lambda with_wall: "F" if with_wall else "e" - bottom_edge = lambda with_wall, with_handle: ("f" if with_handle else "F") if with_wall else "e" - upper_edge = ( - DividerNotchesEdge( - self, - list(reversed(self.sx)), - ) - if self.notches_in_wall - else "e" - ) - for _ in range(2): - self.rectangularWall( - facing_wall_length, - self.h, - [ - bottom_edge(self.bottom, _ and self.handle), - side_edge(self.right_wall), - upper_edge, - side_edge(self.left_wall), - ], - callback=[partial(self.generate_finger_holes, self.h)], - move="up", label = "Front" if _ else "Back", - ) - - # Side walls (outer & inner) with slots to support dividers - side_wall_length = slot_descriptions.total_length() - for _ in range(side_walls_number): - if _ < side_walls_number - (len(self.sx) - 1): - be = "F" if self.bottom else "e" - else: - be = "f" if self.bottom else "e" - se = DividerSlotsEdge(self, slot_descriptions.descriptions) - self.rectangularWall( - side_wall_length, self.h, [be, "f", se, "f"], move="up", label="Sidepiece " + str(_ + 1) - ) - - self.lid(facing_wall_length, side_wall_length) - - # Switch to right side of the file - self.ctx.restore() - self.rectangularWall( - max(facing_wall_length, side_wall_length), self.h, "ffff", move="right only", label="invisible" - ) - - # Bottom piece. - if self.bottom: - self.rectangularWall( - facing_wall_length, - side_wall_length, - [ - "f", - "f" if self.right_wall else "e", - "Y" if self.handle else "f", - "f" if self.left_wall else "e", - ], - callback=[partial(self.generate_finger_holes, side_wall_length)], - move="up", label="Bottom", - ) - - # Dividers - divider_height = ( - # h, with angle adjustment - self.h / math.cos(math.radians(self.Slot_angle)) - # removing what exceeds in the width of the divider - - self.thickness * math.tan(math.radians(self.Slot_angle)) - # with margin - - self.Divider_bottom_margin - ) - self.generate_divider( - self.sx, divider_height, "up", - first_tab_width=self.thickness if self.left_wall else 0, - second_tab_width=self.thickness if self.right_wall else 0 - ) - for tabs, asymmetric_tabs in [(self.thickness, None), - (self.thickness / 2, None), - (self.thickness, 0.5),]: - with self.saved_context(): - for i, length in enumerate(self.sx): - self.generate_divider( - [length], - divider_height, - "right", - first_tab_width=tabs if self.left_wall or i>0 else 0, - second_tab_width=tabs if self.right_wall or i<(len(self.sx) - 1) else 0, - asymmetric_tabs=asymmetric_tabs, - ) - if asymmetric_tabs: - self.moveTo(-tabs, self.spacing) - self.generate_divider(self.sx, divider_height, "up only") - - if self.debug: - debug_info = ["Debug"] - debug_info.append(f"Slot_edge_outer_length:{slot_descriptions.total_length() + 2 * self.thickness:.2f}") - debug_info.append( - "Slot_edge_inner_lengths:{}".format( - str.join( - "|", - [ - f"{e.useful_length():.2f}" - for e in slot_descriptions.get_straight_edges() - ], - ) - ) - ) - debug_info.append(f"Face_edge_outer_length:{facing_wall_length + self.thickness * sum([self.left_wall, self.right_wall]):.2f}") - debug_info.append("Face_edge_inner_lengths:{}".format(str.join("|", [f"{e:.2f}" for e in self.sx]))) - debug_info.append(f"Tray_height:{self.h:.2f}") - debug_info.append(f"Content_height:{self.h / math.cos(math.radians(self.Slot_angle)):.2f}") - self.text(str.join("\n", debug_info), x=5, y=5, align="bottom left") - - def generate_finger_holes(self, length): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - self.fingerHolesAt(posx, 0, length) - - def generate_divider( - self, widths, height, move, - first_tab_width=0, second_tab_width=0, - asymmetric_tabs=None): - total_width = sum(widths) + (len(widths)-1) * self.thickness + first_tab_width + second_tab_width - - if self.move(total_width, height, move, True): - return - - play = self.Divider_play - left_tab_height = right_tab_height = self.Slot_depth - if asymmetric_tabs: - left_tab_height = left_tab_height * asymmetric_tabs - play - right_tab_height = right_tab_height * (1 - asymmetric_tabs) - - # Upper: first tab width - if asymmetric_tabs: - self.moveTo(first_tab_width - play) - else: - self.edge(first_tab_width - play) - # Upper edge with a finger notch - for nr, width in enumerate(widths): - if nr > 0: - self.edge(self.thickness) - DividerNotchesEdge( - self, - [width], - )(width) - - self.polyline( - # Upper: second tab width if needed - second_tab_width - play, - # First side, with tab depth only if there is 2 walls - 90, - left_tab_height, - 90, - second_tab_width, - -90, - height - left_tab_height, - 90, - ) - # Lower edge - for width in reversed(widths[1:]): - self.polyline( - width - 2 * play, - 90, - height - self.Slot_depth, - -90, - self.thickness + 2 * play, - -90, - height - self.Slot_depth, - 90, - ) - - self.polyline( - # Second side tab - widths[0] - 2 * play, - 90, - height - self.Slot_depth, - -90, - first_tab_width, - 90, - right_tab_height, - 90 - ) - if asymmetric_tabs: - self.polyline( - first_tab_width - play, - -90, - self.Slot_depth-right_tab_height, - 90 - ) - - # Move for next piece - self.move(total_width, height, move, label="Divider") - - -class SlottedEdgeDescriptions: - def __init__(self) -> None: - self.descriptions: list[str] = [] - - def add(self, description: str) -> None: - self.descriptions.append(description) - - def get_straight_edges(self): - return [x for x in self.descriptions if isinstance(x, StraightEdgeDescription)] - - def get_last_edge(self): - return self.descriptions[-1] - - def adjust_to_target_length(self, target_length): - actual_length = sum([d.tracing_length() for d in self.descriptions]) - compensation = actual_length - target_length - - compensation_ratio = compensation / sum( - [d.asked_length for d in self.get_straight_edges()] - ) - - for edge in self.get_straight_edges(): - edge.outside_ratio = 1 - compensation_ratio - - def total_length(self): - return sum([x.tracing_length() for x in self.descriptions]) - - -class StraightEdgeDescription: - def __init__( - self, - asked_length, - round_edge_compensation=0, - outside_ratio=1, - angle_compensation=0, - ) -> None: - self.asked_length = asked_length - self.round_edge_compensation = round_edge_compensation - self.outside_ratio = outside_ratio - self.angle_compensation = angle_compensation - - def __repr__(self) -> str: - return f"StraightEdgeDescription({self.asked_length}, round_edge_compensation={self.round_edge_compensation}, angle_compensation={self.angle_compensation}, outside_ratio={self.outside_ratio})" - - def tracing_length(self): - """ - How much length should take tracing this straight edge - """ - return ( - (self.asked_length * self.outside_ratio) - - self.round_edge_compensation - + self.angle_compensation - ) - - def useful_length(self): - """ - Part of the length which might be used by the content of the tray - """ - return self.asked_length * self.outside_ratio - - -class Memoizer(dict): - def __init__(self, computation) -> None: - self.computation = computation - - def __missing__(self, key): - res = self[key] = self.computation(key) - return res - - -class SlotDescription: - _div_by_cos_cache = Memoizer(lambda a: 1 / math.cos(math.radians(a))) - _tan_cache = Memoizer(lambda a: math.tan(math.radians(a))) - - def __init__( - self, width, depth=20, angle=0, radius=0, start_radius=None, end_radius=None - ) -> None: - self.depth = depth - self.width = width - self.start_radius = radius if start_radius is None else start_radius - self.end_radius = radius if end_radius is None else end_radius - self.angle = angle - - def __repr__(self) -> str: - return f"SlotDescription({self.width}, depth={self.depth}, angle={self.angle}, start_radius={self.start_radius}, end_radius={self.end_radius})" - - def _div_by_cos(self): - return SlotDescription._div_by_cos_cache[self.angle] - - def _tan(self): - return SlotDescription._tan_cache[self.angle] - - def angle_corrected_width(self): - """ - returns how much width is the slot when measured horizontally, since the angle makes it bigger. - It's the same as the slot entrance width when radius is 0°. - """ - return self.width * self._div_by_cos() - - def round_edge_start_correction(self): - """ - returns by how much we need to stop tracing our straight lines at the start of the slot - in order to do a curve line instead - """ - return self.start_radius * (self._div_by_cos() - self._tan()) - - def round_edge_end_correction(self): - """ - returns by how much we need to stop tracing our straight lines at the end of the slot - in order to do a curve line instead - """ - return self.end_radius * (self._div_by_cos() + self._tan()) - - def _depth_angle_correction(self): - """ - The angle makes one side of the slot deeper than the other. - """ - extra_depth = self.width * self._tan() - return extra_depth - - def corrected_start_depth(self): - """ - Returns the depth of the straight part of the slot starting side - """ - extra_depth = self._depth_angle_correction() - return self.depth + max(0, extra_depth) - self.round_edge_start_correction() - - def corrected_end_depth(self): - """ - Returns the depth of the straight part of the slot ending side - """ - extra_depth = self._depth_angle_correction() - return self.depth + max(0, -extra_depth) - self.round_edge_end_correction() - - def tracing_length(self): - """ - How much length this slot takes on an edge - """ - return ( - self.round_edge_start_correction() - + self.angle_corrected_width() - + self.round_edge_end_correction() - ) - - -class SlotDescriptionsGenerator: - def generate_all_same_angles( - self, sections, thickness, extra_slack, depth, height, angle, radius=2, - ): - width = thickness + extra_slack - - descriptions = SlottedEdgeDescriptions() - - # Special case: if first slot start at 0, then radius is 0 - first_correction = 0 - current_section = 0 - if sections[0] == 0: - slot = SlotDescription( - width, depth=depth, angle=angle, start_radius=0, end_radius=radius, - ) - descriptions.add(slot) - first_correction = slot.round_edge_end_correction() - current_section += 1 - - first_length = sections[current_section] - current_section += 1 - descriptions.add( - StraightEdgeDescription( - first_length, round_edge_compensation=first_correction - ) - ) - - for l in sections[current_section:]: - slot = SlotDescription(width, depth=depth, angle=angle, radius=radius,) - - # Fix previous edge length - previous_edge = descriptions.get_last_edge() - previous_edge.round_edge_compensation += slot.round_edge_start_correction() - - # Add this slot - descriptions.add(slot) - - # Add the straight edge after this slot - descriptions.add( - StraightEdgeDescription(l, slot.round_edge_end_correction()) - ) - - # We need to add extra space for the divider (or the actual content) - # to slide all the way down to the bottom of the tray in spite of walls - end_length = height * math.tan(math.radians(angle)) - descriptions.get_last_edge().angle_compensation += end_length - - return descriptions - - -class DividerNotchesEdge(edges.BaseEdge): - """Edge with multiple notches for easier access to dividers""" - - description = "Edge with multiple notches for easier access to dividers" - - def __init__(self, boxes, sx) -> None: - - super().__init__(boxes, None) - - self.sx = sx - - def __call__(self, _, **kw): - first = True - for width in self.sx: - if first: - first = False - else: - self.edge(self.thickness) - self.edge_with_notch(width) - - def edge_with_notch(self, width): - # width (with notch if possible) - upper_third = ( - width - 2 * self.Notch_upper_radius - 2 * self.Notch_lower_radius - ) / 3 - if upper_third > 0: - straightHeight = ( - self.Notch_depth - self.Notch_upper_radius - self.Notch_lower_radius - ) - self.polyline( - upper_third, - (90, self.Notch_upper_radius), - straightHeight, - (-90, self.Notch_lower_radius), - upper_third, - (-90, self.Notch_lower_radius), - straightHeight, - (90, self.Notch_upper_radius), - upper_third, - ) - else: - # if there isn't enough room for the radius, we don't use it - self.edge(width) - - -class DividerSlotsEdge(edges.BaseEdge): - """Edge with multiple angled rounded slots for dividers""" - - description = "Edge with multiple angled rounded slots for dividers" - - def __init__(self, boxes, descriptions) -> None: - - super().__init__(boxes, None) - - self.descriptions = descriptions - - def __call__(self, length, **kw): - - self.ctx.save() - - for description in self.descriptions: - if isinstance(description, SlotDescription): - self.do_slot(description) - elif isinstance(description, StraightEdgeDescription): - self.do_straight_edge(description) - - # rounding errors might accumulate : - # restore context and redo the move straight - self.ctx.restore() - self.moveTo(length) - - def do_straight_edge(self, straight_edge): - self.edge(straight_edge.tracing_length()) - - def do_slot(self, slot): - self.ctx.save() - - self.polyline( - 0, - (90 - slot.angle, slot.start_radius), - slot.corrected_start_depth(), - -90, - slot.width, - -90, - slot.corrected_end_depth(), - (90 + slot.angle, slot.end_radius), - ) - - # rounding errors might accumulate : - # restore context and redo the move straight - self.ctx.restore() - self.moveTo(slot.tracing_length()) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/doubleflexdoorbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/doubleflexdoorbox.py deleted file mode 100644 index 8eb3a60..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/doubleflexdoorbox.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import math - -import boxes - - -class DoubleFlexDoorBox(boxes.Boxes): - """Box with two part lid with living hinges and round corners""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - boxes.Boxes.__init__(self) - self.addSettingsArgs(boxes.edges.FingerJointSettings) - self.addSettingsArgs(boxes.edges.FlexSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--radius", action="store", type=float, default=15, - help="Radius of the latch in mm") - self.argparser.add_argument( - "--latchsize", action="store", type=float, default=8, - help="size of latch in multiples of thickness") - - def flexBoxSide(self, x, y, r, callback=None, move=None): - t = self.thickness - ll = (x - 2*r) / 2 - self.latchsize - - if self.move(x+2*t, y+2*t, move, True): - return - - self.moveTo(t+r, t) - - for i, l in zip(range(2), (x, y)): - self.cc(callback, i) - self.edges["f"](l - 2 * r) - self.corner(90, r) - - self.cc(callback, 2) - self.edge(ll) - self.latch(self.latchsize) - self.latch(self.latchsize, reverse=True) - self.edge(ll) - - self.corner(90, r) - self.cc(callback, 3) - self.edges["f"](y - 2 * r) - self.corner(90, r) - - self.move(x+2*t, y+2*t, move) - - def surroundingWall(self, x, y, h, r, move=None): - t = self.thickness - c4 = math.pi * r * 0.5 - - tw = 2*x + 2*y - 8*r + 4*c4 - th = h + 2.5*t - - if self.move(tw, th, move, True): - return - - self.moveTo(0, 0.25*t, -90) - - self.latch(self.latchsize, False, True) - self.edge((x-2*r)/2 - self.latchsize, False) - if y - 2 * r < t: - self.edges["X"](2 * c4 + y - 2 * r, h + 2 * t) - else: - self.edges["X"](c4, h + 2 * t) - self.edges["F"](y - 2 * r, False) - self.edges["X"](c4, h + 2 * t) - self.edges["F"](x - 2 * r, False) - if y - 2 * r < t: - self.edges["X"](2 * c4 + y - 2 * r, h + 2 * t) - else: - self.edges["X"](c4, h + 2 * t) - self.edges["F"](y - 2 * r) - self.edges["X"](c4, h + 2 * t) - self.edge((x-2*r)/2 - self.latchsize, False) - self.latch(self.latchsize, False) - self.edge(h + 2 * t) - self.latch(self.latchsize, False, True) - self.edge((x-2*r)/2 - self.latchsize, False) - self.edge(c4) - self.edges["F"](y - 2 * r) - self.edge(c4) - self.edges["F"](x - 2 * r, False) - self.edge(c4) - self.edges["F"](y - 2 * r, False) - self.edge(c4) - self.edge((x-2*r)/2 - self.latchsize) - self.latch(self.latchsize, False, False) - self.edge(h + 2 * t) - - self.move(tw, th, move) - - def render(self): - - if self.outside: - self.x = self.adjustSize(self.x) - self.y = self.adjustSize(self.y) - self.h = self.adjustSize(self.h) - - t = self.thickness - self.latchsize *= t - x, y, h = self.x, self.y, self.h - r = self.radius or min(x - 2*self.latchsize, y) / 2.0 - r = min(r, y / 2.0) - self.radius = r = min(r, max(0, (x - 2*self.latchsize) / 2.0)) - - - # swap y and h for more consistent axis names - self.surroundingWall(x, h, y, r, move="up") - self.flexBoxSide(x, h, r, move="right") - self.flexBoxSide(x, h, r, move="mirror") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/drillbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/drillbox.py deleted file mode 100644 index 7306d60..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/drillbox.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import ArgparseEdgeType, Boxes, Color, edges -from boxes.lids import LidSettings, _TopEdge - - -class DrillBox(_TopEdge): - """A parametrized box for drills""" - - description = """![Multiple DrillBoxes](static/samples/DrillBoxes.jpg) """ - - ui_group = "Tray" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, - space=3, finger=3, surroundingspaces=1) - self.addSettingsArgs(edges.RoundedTriangleEdgeSettings, outset=1) - self.addSettingsArgs(edges.StackableSettings) - self.addSettingsArgs(edges.MountingSettings) - self.addSettingsArgs(LidSettings) - self.argparser.add_argument( - "--top_edge", action="store", - type=ArgparseEdgeType("eStG"), choices=list("eStG"), - default="e", help="edge type for top edge") - self.buildArgParser(sx="25*3", sy="60*4", sh="5:25:10", - bottom_edge="h") - self.argparser.add_argument( - "--holes", - action="store", - type=int, - default=3, - help="Number of holes for each size", - ) - self.argparser.add_argument( - "--firsthole", - action="store", - type=float, - default=1.0, - help="Smallest hole", - ) - self.argparser.add_argument( - "--holeincrement", - action="store", - type=float, - default=.5, - help="increment between holes", - ) - - def sideholes(self, l): - t = self.thickness - h = -0.5 * t - for d in self.sh[:-1]: - h += d + t - self.fingerHolesAt(0, h, l, angle=0) - - - def drillholes(self, description=False): - y = 0 - d = self.firsthole - for dy in self.sy: - x = 0 - for dx in self.sx: - iy = dy / self.holes - for k in range(self.holes): - self.hole(x + dx / 2, y + (k + 0.5) * iy, d=d + 0.05) - if description: - self.rectangularHole(x + dx / 2, y + dy / 2, dx - 2, dy - 2, color=Color.ETCHING) - self.text( - "%.1f" % d, - x + 2, - y + 2, - 270, - align="right", - fontsize=6, - color=Color.ETCHING, - ) - # TODO: make the fontsize dynamic to make the text fit in all cases - d += self.holeincrement - x += dx - y += dy - - def render(self): - x = sum(self.sx) - y = sum(self.sy) - - h = sum(self.sh) + self.thickness * (len(self.sh)-1) - b = self.bottom_edge - t1, t2, t3, t4 = self.topEdges(self.top_edge) - - self.rectangularWall( - x, h, [b, "f", t1, "F"], - ignore_widths=[1, 6], - callback=[lambda: self.sideholes(x)], move="right") - self.rectangularWall( - y, h, [b, "f", t2, "F"], callback=[lambda: self.sideholes(y)], - ignore_widths=[1, 6], - move="up") - self.rectangularWall( - y, h, [b, "f", t3, "F"], callback=[lambda: self.sideholes(y)], - ignore_widths=[1, 6]) - self.rectangularWall( - x, h, [b, "f", t4, "F"], - ignore_widths=[1, 6], - callback=[lambda: self.sideholes(x)], move="left up") - if b != "e": - self.rectangularWall(x, y, "ffff", move="right") - for d in self.sh[:-2]: - self.rectangularWall( - x, y, "ffff", callback=[self.drillholes], move="right") - self.rectangularWall( - x, y, "ffff", - callback=[lambda: self.drillholes(description=True)], - move="right") - self.lid(x, y, self.top_edge) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/drillstand.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/drillstand.py deleted file mode 100644 index 53ecc16..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/drillstand.py +++ /dev/null @@ -1,233 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import boxes -from boxes import * - - -class DrillStand(Boxes): - """Box for drills with each compartment of a different height""" - - description = """Note: `sh` gives the height of the rows front to back. It though should have the same number of entries as `sy`. These heights are the one on the left side and increase throughout the row. To have each compartment a bit higher than the previous one the steps in `sh` should be a bit bigger than `extra_height`. - -Assembly: - -![Parts](static/samples/DrillStand-drawing.png) - -Start with putting the slots of the inner walls together. Be especially careful with adding the bottom. It is always asymmetrical and flush with the right/lower side while being a little short on the left/higher side to not protrude into the side wall. - -| | | -| ---- | ---- | -| ![Assembly inner walls](static/samples/DrillStand-assembly-1.jpg) | ![Assembly bottom](static/samples/DrillStand-assembly-2.jpg) | -| Then add the front and the back wall. | Add the very left and right walls last. | -| ![Assembly front and back](static/samples/DrillStand-assembly-3.jpg) | ![Assembly side walls](static/samples/DrillStand-assembly-4.jpg) | -""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.StackableSettings, height=1.0, width=3) - self.addSettingsArgs(edges.FingerJointSettings) - - self.buildArgParser(sx="25*6", sy="10:20:30", sh="25:40:60") - self.argparser.add_argument( - "--extra_height", action="store", type=float, default=15.0, - help="height difference left to right") - - def yWall(self, nr, move=None): - t = self.thickness - x, sx, y, sy, sh = self.x, self.sx, self.y, self.sy, self.sh - eh = self.extra_height * (sum(sx[:nr])+ nr*t - t)/x - - tw, th = sum(sy) + t * len(sy) + t, max(sh) + eh - - if self.move(tw, th, move, True): - return - - self.moveTo(t) - self.polyline(y, 90) - self.edges["f"](sh[-1]+eh) - self.corner(90) - for i in range(len(sy)-1, 0, -1): - s1 = max(sh[i]-sh[i-1], 0) + 4*t - s2 = max(sh[i-1]-sh[i], 0) + 4*t - - self.polyline(sy[i], 90, s1, -90, t, -90, s2, 90) - self.polyline(sy[0], 90) - self.edges["f"](sh[0] + eh) - self.corner(90) - - self.move(tw, th, move) - - def sideWall(self, extra_height=0.0, foot_height=0.0, edges="šFf", move=None): - t = self.thickness - x, sx, y, sy, sh = self.x, self.sx, self.y, self.sy, self.sh - eh = extra_height - fh = foot_height - - edges = [self.edges.get(e, e) for e in edges] - - tw = sum(sy) + t * len(sy) + t - th = max(sh) + eh + fh + edges[0].spacing() - - if self.move(tw, th, move, True): - return - - self.moveTo(edges[0].margin()) - - edges[0](y+2*t) - self.edgeCorner(edges[0], "e") - self.edge(fh) - self.step(edges[1].startwidth() - t) - edges[1](sh[-1]+eh) - self.edgeCorner(edges[1], "e") - for i in range(len(sy)-1, 0, -1): - self.edge(sy[i]) - if sh[i] > sh[i-1]: - self.fingerHolesAt(0.5*t, self.burn, sh[i]+eh, 90) - self.polyline(t, 90, sh[i] - sh[i-1], -90) - else: - self.polyline(0, -90, sh[i-1] - sh[i], 90, t) - self.fingerHolesAt(-0.5*t, self.burn, sh[i-1]+eh) - self.polyline(sy[0]) - self.edgeCorner("e", edges[2]) - edges[2](sh[0]+eh) - self.step(t - edges[2].endwidth()) - self.polyline(fh) - self.edgeCorner("e", edges[0]) - - self.move(tw, th, move) - - def xWall(self, nr, move=None): - t = self.thickness - x, sx, y, sy, sh = self.x, self.sx, self.y, self.sy, self.sh - eh = self.extra_height - - tw, th = x + 2*t, sh[nr] + eh + t - - a = math.degrees(math.atan(eh / x)) - fa = 1 / math.cos(math.radians(a)) - - if self.move(tw, th, move, True): - return - - - self.moveTo(t, eh+t, -a) - - for i in range(len(sx)-1): - self.edges["f"](fa*sx[i]) - h = min(sh[nr - 1], sh[nr]) - s1 = h - 3.95*t + self.extra_height * (sum(sx[:i+1]) + i*t)/x - s2 = h - 3.95*t + self.extra_height * (sum(sx[:i+1]) + i*t + t)/x - - self.polyline(0, 90+a, s1, -90, t, -90, s2, 90-a) - self.edges["f"](fa*sx[-1]) - self.polyline(0, 90+a) - self.edges["f"](sh[nr]+eh) - self.polyline(0, 90, x, 90) - self.edges["f"](sh[nr]) - self.polyline(0, 90+a) - - self.move(tw, th, move) - - def xOutsideWall(self, h, edges="fFeF", move=None): - t = self.thickness - x, sx, y, sy, sh = self.x, self.sx, self.y, self.sy, self.sh - - edges = [self.edges.get(e, e) for e in edges] - eh = self.extra_height - - tw = x + edges[1].spacing() + edges[3].spacing() - th = h + eh + edges[0].spacing() + edges[2].spacing() - - a = math.degrees(math.atan(eh / x)) - fa = 1 / math.cos(math.radians(a)) - - if self.move(tw, th, move, True): - return - - - self.moveTo(edges[3].spacing(), eh+edges[0].margin(), -a) - - self.edge(t*math.tan(math.radians(a))) - if isinstance(edges[0], boxes.edges.FingerHoleEdge): - with self.saved_context(): - self.moveTo(0, 0, a) - self.fingerHolesAt( - 0, 1.5*t, x*fa - t*math.tan(math.radians(a)), -a) - self.edge(x*fa - t*math.tan(math.radians(a))) - elif isinstance(edges[0], boxes.edges.FingerJointEdge): - edges[0](x*fa - t*math.tan(math.radians(a))) - else: - raise ValueError("Only edges h and f supported: ") - self.corner(a) - self.edgeCorner(edges[0], "e", 90) - self.corner(-90) - self.edgeCorner("e", edges[1], 90) - edges[1](eh+h) - self.edgeCorner(edges[1], edges[2], 90) - edges[2](x) - self.edgeCorner(edges[2], edges[3], 90) - edges[3](h) - self.edgeCorner(edges[3], "e", 90) - self.corner(-90) - self.edgeCorner("e", edges[0], 90) - - self.moveTo(0, self.burn+edges[0].startwidth(), 0) - - for i in range(1, len(sx)): - posx = sum(sx[:i]) + i*t - 0.5 * t - length = h + self.extra_height * (sum(sx[:i]) + i*t - t)/x - self.fingerHolesAt(posx, h, length, -90) - - self.move(tw, th, move) - - def bottomCB(self): - t = self.thickness - x, sx, y, sy, sh = self.x, self.sx, self.y, self.sy, self.sh - eh = self.extra_height - - a = math.degrees(math.atan(eh / x)) - fa = 1 / math.cos(math.radians(a)) - - posy = -0.5 * t - for i in range(len(sy)-1): - posy += sy[i] + t - posx = -t * math.tan(math.radians(a)) # left side is clipped - for j in range(len(sx)): - self.fingerHolesAt(posx, posy, fa*sx[j], 0) - posx += fa*sx[j] + fa*t - - def render(self): - t = self.thickness - sx, sy, sh = self.sx, self.sy, self.sh - self.x = x = sum(sx) + len(sx)*t - t - self.y = y = sum(sy) + len(sy)*t - t - - bottom_angle = math.atan(self.extra_height / x) # radians - - self.xOutsideWall(sh[0], "hFeF", move="up") - for i in range(1, len(sy)): - self.xWall(i, move="up") - self.xOutsideWall(sh[-1], "hfef", move="up") - - self.rectangularWall(x/math.cos(bottom_angle)-t*math.tan(bottom_angle), y, "fefe", callback=[self.bottomCB], move="up") - - self.sideWall(foot_height=self.extra_height+2*t, move="right") - for i in range(1, len(sx)): - self.yWall(i, move="right") - self.sideWall(self.extra_height, 2*t, move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/edges.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/edges.py deleted file mode 100644 index 663873d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/edges.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Edges(Boxes): - """Print all registered Edge types""" - - webinterface = False - - def __init__(self) -> None: - Boxes.__init__(self) - - def render(self): - self.ctx = None - self._buildObjects() - chars = self.edges.keys() - for c in sorted(chars, key=lambda x:(x.lower(), x.isupper())): - print("%s %s - %s" %(c, self.edges[c].__class__.__name__, - self.edges[c].__doc__)) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/electronicsbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/electronicsbox.py deleted file mode 100644 index ad4f327..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/electronicsbox.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (C) 2013-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class ElectronicsBox(Boxes): - """Closed box with screw on top and mounting holes""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--triangle", action="store", type=float, default=25., - help="Sides of the triangles holding the lid in mm") - self.argparser.add_argument( - "--d1", action="store", type=float, default=2., - help="Diameter of the inner lid screw holes in mm") - self.argparser.add_argument( - "--d2", action="store", type=float, default=3., - help="Diameter of the lid screw holes in mm") - self.argparser.add_argument( - "--d3", action="store", type=float, default=3., - help="Diameter of the mounting screw holes in mm") - self.argparser.add_argument( - "--outsidemounts", action="store", type=boolarg, default=True, - help="Add external mounting points") - self.argparser.add_argument( - "--holedist", action="store", type=float, default=7., - help="Distance of the screw holes from the wall in mm") - - def wallxCB(self): - t = self.thickness - self.fingerHolesAt(0, self.h-1.5*t, self.triangle, 0) - self.fingerHolesAt(self.x, self.h-1.5*t, self.triangle, 180) - - def wallyCB(self): - t = self.thickness - self.fingerHolesAt(0, self.h-1.5*t, self.triangle, 0) - self.fingerHolesAt(self.y, self.h-1.5*t, self.triangle, 180) - - def render(self): - - t = self.thickness - self.h = h = self.h + 2*t # compensate for lid - x, y, h = self.x, self.y, self.h - d1, d2, d3 =self.d1, self.d2, self.d3 - hd = self.holedist - tr = self.triangle - trh = tr / 3. - - if self.outside: - self.x = x = self.adjustSize(x) - self.y = y = self.adjustSize(y) - self.h = h = h - 3*t - - self.rectangularWall(x, h, "fFeF", callback=[self.wallxCB], - move="right", label="Wall 1") - self.rectangularWall(y, h, "ffef", callback=[self.wallyCB], - move="up", label="Wall 2") - self.rectangularWall(y, h, "ffef", callback=[self.wallyCB], - label="Wall 4") - self.rectangularWall(x, h, "fFeF", callback=[self.wallxCB], - move="left up", label="Wall 3") - - if not self.outsidemounts: - self.rectangularWall(x, y, "FFFF", callback=[ - lambda:self.hole(hd, hd, d=d3)] *4, move="right", - label="Bottom") - else: - self.flangedWall(x, y, edges="FFFF", - flanges=[0.0, 2*hd, 0., 2*hd], r=hd, - callback=[ - lambda:self.hole(hd, hd, d=d3)] * 4, move='up', - label="Bottom") - self.rectangularWall(x, y, callback=[ - lambda:self.hole(trh, trh, d=d2)] * 4, move='up', label="Top") - - self.rectangularTriangle(tr, tr, "ffe", num=4, - callback=[None, lambda: self.hole(trh, trh, d=d1)]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/eurorackskiff.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/eurorackskiff.py deleted file mode 100644 index c5490b6..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/eurorackskiff.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) 2013-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class EuroRackSkiff(Boxes): - """3U Height case with adjustable width and height and included rails""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("h") - self.argparser.add_argument( - "--hp", action="store", type=int, default=84, - help="Width of the case in HP") - - - def wallxCB(self, x): - t = self.thickness - - def wallyCB(self, y): - t = self.thickness - self.fingerHolesAt(0, self.h-1.5*t, y, 0) - - def railHoles(self): - for i in range(0, self.hp): - self.hole(i*5.08 + 2.54, 3, d=3.0) - - def render(self): - - t = self.thickness - h = self.h - y = self.hp * 5.08 - x = 128.5 - - - self.rectangularWall(y, 6, "feee", callback=[self.railHoles] , move="up") - self.rectangularWall(y, 6, "feee", callback=[self.railHoles] , move="up") - self.rectangularWall(x, h, "fFeF", callback=[lambda: self.wallxCB(x)], - move="right") - self.rectangularWall(y, h, "ffef", callback=[lambda: self.wallyCB(y)], move="up") - self.rectangularWall(y, h, "ffef", callback=[lambda: self.wallyCB(y)]) - self.rectangularWall(x, h, "fFeF", callback=[lambda: self.wallxCB(x)], - move="left up") - self.rectangularWall(x, y, "FFFF", callback=[], move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/fanhole.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/fanhole.py deleted file mode 100644 index e8ede93..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/fanhole.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FanHole(Boxes): - """Hole pattern for mounting a fan""" - - ui_group = "Holes" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.argparser.add_argument( - "--diameter", action="store", type=float, default=80, - help="diameter of the fan hole") - self.argparser.add_argument( - "--mounting_holes", action="store", type=float, default=3, - help="diameter of the fan mounting holes") - self.argparser.add_argument( - "--mounting_holes_inset", action="store", type=float, default=5, - help="distance of the fan mounting holes from the outside") - self.argparser.add_argument( - "--arms", action="store", type=int, default=10, - help="number of arms") - self.argparser.add_argument( - "--inner_disc", action="store", type=float, default=.2, - help="relative size of the inner disc") - self.argparser.add_argument( - "--style", action="store", type=str, default="CW Swirl", - choices=["CW Swirl", "CCW Swirl", "Hole"], - help="Style of the fan hole") - - - def arc(self, d, a): - r = abs(1/math.cos(math.radians(90-a/2))*d/2) - self.corner(-a/2) - self.corner(a, r) - self.corner(-a/2) - - def swirl(self, r, ri_rel=.1, n=20): - - d = 2*r - #r = d/2 - ri = ri_rel * r - - ai = 90 - ao = 360/n * 0.8 - # angle going in - a1 = math.degrees(math.atan( - ri*math.sin(math.radians(ai)) / - (r - ri*math.cos(math.radians(ai))))) - d1= (ri*math.sin(math.radians(ai))**2 + - (r - ri*math.cos(math.radians(ai)))**2)**.5 - d2= (ri*math.sin(math.radians(ai-ao))**2 + - (r - ri*math.cos(math.radians(ai-ao)))**2)**.5 - - # angle coming out - a_i2 = math.degrees(math.atan( - (r*math.sin(math.radians(ao)) - ri*math.sin(math.radians(ai))) / - (r*math.cos(math.radians(ao)) - ri*math.cos(math.radians(ai))))) - a3 = a1 + a_i2 - a2 = 90 + a_i2 - ao - - self.moveTo(0, -r, 180) - - for i in range(n): - with self.saved_context(): - self.corner(-ao, r) - self.corner(-a2) - self.arc(d2, -90) - self.corner(-180+a3) - self.arc(d1, 85) - self.corner(-90-a1) - - self.moveArc(-360./n, r) - - def render(self): - r_h = self.mounting_holes / 2 - d = self.diameter - inset = self.mounting_holes_inset - - for px in (inset, d-inset): - for py in (inset, d-inset): - self.hole(px, py, r_h) - self.moveTo(d/2, d/2) - print(self.style) - if self.style == "CW Swirl": - self.ctx.scale(-1, 1) - self.swirl(d/2, self.inner_disc, self.arms) - elif self.style == "CCW Swirl": - self.swirl(d/2, self.inner_disc, self.arms) - else: #Hole - self.hole(0, 0, d=d) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/filamentspool.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/filamentspool.py deleted file mode 100644 index 848c5aa..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/filamentspool.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.generators.bayonetbox import BayonetBox - - -class FilamentSpool(BayonetBox): - """A two part spool for 3D printing filament""" - - description = """ -Use small nails to properly align the pieces of the bayonet latch. Glue the parts of the bayonet latch before assembling the "axle". The inner parts go at the side and the outer parts at the inside of the axle. -![opened spool](static/samples/FilamentSpool-2.jpg)""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - - self.buildArgParser(h=48) - self.argparser.add_argument( - "--outer_diameter", action="store", type=float, default=200.0, - help="diameter of the flanges") - self.argparser.add_argument( - "--inner_diameter", action="store", type=float, default=100.0, - help="diameter of the center part") - self.argparser.add_argument( - "--axle_diameter", action="store", type=float, default=50.0, - help="diameter of the axle hole") - self.argparser.add_argument( - "--sides", action="store", type=int, default=8, - help="number of pieces for the center part") - self.argparser.add_argument( - "--alignment_pins", action="store", type=float, default=1.0, - help="diameter of the alignment pins") - - - def leftsideCB(self): - self.hole(0, 0, d=self.axle_diameter) - r, h, side = self.regularPolygon(self.sides, radius=self.inner_diameter/2) - for i in range(self.sides): - self.fingerHolesAt(-side/2, h+0.5*self.thickness, side, 0) - self.moveTo(0, 0, 360/self.sides) - self.outerHolesCB() - - def outerHolesCB(self): - t = self.thickness - for i in range(6): - for j in range(2): - self.rectangularHole( - 0, self.outer_diameter / 2 - 7.0, - self.outer_diameter * math.pi / 360 * 8, 5, r=2.5) - self.moveTo(0, 0, 10) - self.moveTo(0, 0, 360 / 6 - 20) - self.rectangularHole( - (self.outer_diameter + self.inner_diameter) / 4, 0, - (self.outer_diameter - self.inner_diameter) / 2 - 4*t, t, r=t/2) - - - def render(self): - t = self.thickness - - self.inner_diameter -= 2 * t - r, h, side = self.regularPolygon(self.sides, radius=self.inner_diameter/2) - self.diameter = 2*h - self.lugs = self.sides - - self.parts.disc( - self.outer_diameter, callback=self.leftsideCB, move="right") - self.parts.disc( - self.outer_diameter, hole=self.axle_diameter, - callback=lambda:(self.alignmentHoles(True), - self.outerHolesCB()), - move="right") - self.regularPolygonWall( - self.sides, r=self.inner_diameter/2, edges="f", - callback=[self.upperCB], move="right") - self.parts.disc(self.diameter, callback=self.lowerCB, move="right") - - for i in range(self.sides): - self.rectangularWall( - side, self.h - t, "feFe", - callback=[lambda:self.hole(side/2, self.h-2*t, r=t)], - move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/filltest.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/filltest.py deleted file mode 100644 index 8fd29a3..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/filltest.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import time - -from boxes import * - - -class FillTest(Boxes): # Change class name! - """Piece for testing different settings for hole filling""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(fillHolesSettings, fill_pattern="hex") - - self.buildArgParser(x=320, y=220) - - - def xHoles(self): -# border = [(5, 10), (245, 10), (225, 150), (235, 150), (255, 10), (290, 10), (270, 190), (45, 190), (45, 50), (35, 50), (35, 190), (5, 190)] - - x, y = self.x, self.y - - border = [ - ( 5/320*x, 10/220*y), - (245/320*x, 10/220*y), - (225/320*x, 150/220*y), - (235/320*x, 150/220*y), - (255/320*x, 10/220*y), - (290/320*x, 10/220*y), - (270/320*x, 190/220*y), - ( 45/320*x, 190/220*y), - ( 45/320*x, 50/220*y), - ( 35/320*x, 50/220*y), - ( 35/320*x, 190/220*y), - ( 5/320*x, 190/220*y), - ] - - - self.showBorderPoly(border) - self.text("Area to be filled", x/2, 190/220*y, align="bottom center", color=Color.ANNOTATIONS) - - start_time = time.time() - self.fillHoles( - pattern=self.fillHoles_fill_pattern, - border=border, - max_radius=self.fillHoles_hole_max_radius, - hspace=self.fillHoles_space_between_holes, - bspace=self.fillHoles_space_to_border, - min_radius=self.fillHoles_hole_min_radius, - style=self.fillHoles_hole_style, - bar_length=self.fillHoles_bar_length, - max_random=self.fillHoles_max_random - ) - end_time = time.time() - -# print('fillHoles - Execution time:', (end_time-start_time)*1000, 'ms ', self.fillHoles_fill_pattern) - - def render(self): - self.rectangularWall(self.x, self.y, "eeee", callback=[self.xHoles, None, None, None],) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbook.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbook.py deleted file mode 100644 index 4f4d183..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbook.py +++ /dev/null @@ -1,313 +0,0 @@ -# Copyright (C) 2024 Oliver Jensen -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FlexBook(Boxes): - """Box with living hinge styled after a book.""" - - ui_group = "FlexBox" - - description = """ -If you have an enclosure, arrange the living hinge to be as close to your extractor fan as possible. - -![Open](static/samples/FlexBook-2.jpg)""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.FlexSettings) - self.buildArgParser(x=75.0, y=35.0, h=125.0) - self.argparser.add_argument( - "--latchsize", action="store", type=float, default=8, - help="size of latch in multiples of thickness") - self.argparser.add_argument( - "--recess_wall", action="store", type=boolarg, default=False, - help="Whether to recess the inner wall for easier object removal") - - - def flexBookSide(self, h, x, r, callback=None, move=None): - t = self.thickness - - tw, th = h+t, x+2*t+r - if self.move(tw, th, move, True): - return - - self.fingerHolesAt(0, x+1.5*t, h, 0) - - self.edges["F"](h) - self.corner(90, 0) - self.edges["e"](t) - self.edges["f"](x + t) - self.corner(180, r) - self.edges["e"](x + 2*t) - self.corner(90) - - self.move(tw, th, move) - - - def flexBookRecessedWall(self, h, y, include_recess, callback=None, move=None): - t = self.thickness - - tw, th = h, y+2*t - - if self.move(tw, th, move, True): - return - - # TODO: figure out math for gentler angles - cutout_radius = min(h/4, y/8) - cutout_angle = 90 - cutout_predist = y * 0.2 - cutout_angle_dist = h/2 - 2 * cutout_radius - cutout_base_dist = y - (y * .4) - 4 * cutout_radius - - self.moveTo(0, t) - - self.edges["f"](h) - self.corner(90,) - self.edges["e"](y) - self.corner(90) - self.edges["f"](h) - self.corner(90) - if include_recess: - self.polyline( - cutout_predist, - (cutout_angle, cutout_radius), - cutout_angle_dist, - (-cutout_angle, cutout_radius), - cutout_base_dist, - (-cutout_angle, cutout_radius), - cutout_angle_dist, - (cutout_angle, cutout_radius), - cutout_predist) - else : - self.edges["e"](y) - self.corner(90) - - self.move(tw, th, move) - - - def flexBookLatchWall(self, h, y, latchSize, callback=None, move=None): - t = self.thickness - - if self.recess_wall: - x_adjust = 0 - else: - x_adjust = 3 * t - - tw, th = h+t+x_adjust, y+2*t - - if self.move(tw, th, move, True): - return - - self.moveTo(x_adjust, t) - - self.edges["f"](h) - self.corner(90) - self.edges["f"](y) - self.corner(90) - self.edges["f"](h) - self.corner(90) - - self.rectangularHole(y/2, -1.5*t, latchSize - 2*t, t) - - self.polyline( - (y-latchSize) / 2, - -90, - 2.5*t, - (90, t/2), - latchSize - t, - (90, t/2), - 2.5*t, - -90, - (y-latchSize) / 2, - 90 - ) - - self.move(tw, th, move) - - def flexBookCover(self, move=None): - x, y = self.x, self.y - latchSize = self.latchsize - c4 = self.c4 - t = self.thickness - - tw = 2*x + 6*t + 2*c4 + t - th = y + 4*t - - if self.move(tw, th, move, True): - return - - self.moveTo(2*t, 0) - - self.edges["h"](x+t) - self.edges["X"](2*c4 + t, y + 4*t) # extra thickness here to make it fit - self.edges["e"](x+t) - self.corner(90, 2*t) - self.edges["e"](y/2) - - self.rectangularHole(0, 1.5*t, latchSize, t) - self.rectangularHole((latchSize+7*t)/2, 3.5*t, t, t) - self.rectangularHole(-(latchSize+7*t)/2, 3.5*t, t, t) - - self.edges["e"](y/2) - self.corner(90, 2*t) - self.edges["e"](x+t + 2*c4 + t) # corresponding extra thickness - self.edges["h"](x+t) - self.corner(90, 2*t) - self.edges["h"](y) - self.corner(90, 2*t) - - if False: - # debug lines - self.moveTo(0, 2*t) - self.edges["e"](x+t + 2*c4 + x+t + t) - self.corner(90) - self.edges["e"](y) - self.corner(90) - self.edges["e"](x+t + 2*c4 + x+t + t) - self.corner(90) - self.edges["e"](y) - self.corner(90) - - self.edges["e"](x) - self.corner(90) - self.edges["e"](y) - self.corner(90) - self.edges["e"](x) - self.corner(90) - self.edges["e"](y) - self.corner(90) - - self.move(tw, th, move) - - def flexBookLatchBracket(self, isCover, move=None): - t = self.thickness - round = t/3 - - tw, th = 5*t, 5.5*t - if self.move(tw, th, move, True): - return - - if isCover: - self.edge(5*t) - else: - self.edge(t) - self.corner(90) - self.edge(2*t - round) - self.corner(-90, round) - self.edge(1.5*t - round) - self.rectangularHole(0, 1.5 * t, t, t) - self.edge(1.5*t - round) - self.corner(-90, round) - self.edge(2*t - round) - self.corner(90) - self.edge(t) - - self.corner(90) - self.edge(3*t) - self.corner(180, 2.5 * t) - self.edge(3*t) - - if not isCover: - # anchor pin - self.moveTo(-1.5*t, 1.25*t) - self.ctx.stroke() - self.rectangularWall(t, 2*t) - - self.move(tw, th, move) - - def flexBookLatchPin(self, move=None): - t = self.thickness - l = self.latchsize - - tw, th = l + 4*t, 5*t - - if self.move(tw, th, move, True): - return - - round = t/3 - - self.moveTo(2*t, 0) - - self.polyline( - l, - 90, - 2*t, - -90, - 2*t - round, - (90, round), - 2*t - 2*round, - (90, round), - 3*t - round, - -90, - t - round, - (90, round), - l - 2*t - 2*round, - (90, round), - t - round, - -90, - 3*t - round, - (90, round), - 2*t - 2*round, - (90, round), - 2*t - round, - -90, - 2*t, - 90) - self.move(tw, th, move) - - - - - def render(self): - - # I found it easier to conceptualize swapping y and h - y = self.h - self.h = self.y - self.y = y - t = self.thickness - - self.radius = self.h / 2 - self.c4 = c4 = math.pi * self.radius * 0.5 - - self.latchsize *= self.thickness - - self.flexBookCover(move="up") - self.flexBookRecessedWall(self.h, self.y, self.recess_wall, move="mirror right") - self.flexBookLatchWall(self.h, self.y, self.latchsize, move="right") - - with self.saved_context(): - self.flexBookSide(self.h, self.x, self.radius, move="right") - self.flexBookSide(self.h, self.x, self.radius, move="mirror right") - self.flexBookSide(self.h, self.x, self.radius, move="up only") - - with self.saved_context(): - self.flexBookLatchBracket(False, move="up") - self.flexBookLatchBracket(False, move="up") - self.flexBookLatchBracket(False, move="right only") - - with self.saved_context(): - self.flexBookLatchBracket(True, move="up") - self.flexBookLatchBracket(True, move="up") - self.flexBookLatchBracket(False, move="right only") - - l = self.latchsize - self.rectangularWall( - 4*t, l, - callback=[lambda: self.rectangularHole(2*t, l/2, 2.5*t, .8*l, r=2*t)], - move="right") - self.flexBookLatchPin(move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox.py deleted file mode 100644 index e385f5c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import math - -import boxes - - -class FlexBox(boxes.Boxes): - """Box with living hinge and round corners""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - boxes.Boxes.__init__(self) - self.addSettingsArgs(boxes.edges.FingerJointSettings) - self.addSettingsArgs(boxes.edges.FlexSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--radius", action="store", type=float, default=15, - help="Radius of the latch in mm") - self.argparser.add_argument( - "--latchsize", action="store", type=float, default=8, - help="size of latch in multiples of thickness") - - def flexBoxSide(self, x, y, r, callback=None, move=None): - t = self.thickness - - if self.move(x+2*t, y+t, move, True): - return - - self.moveTo(t+r, t) - - for i, l in zip(range(2), (x, y)): - self.cc(callback, i) - self.edges["f"](l - 2 * r) - self.corner(90, r) - - self.cc(callback, 2) - self.edge(x - 2 * r) - self.corner(90, r) - self.cc(callback, 3) - self.latch(self.latchsize) - self.cc(callback, 4) - self.edges["f"](y - 2 * r - self.latchsize) - self.corner(90, r) - - self.move(x+2*t, y+t, move) - - def surroundingWall(self, move=None): - x, y, h, r = self.x, self.y, self.h, self.radius - t = self.thickness - c4 = math.pi * r * 0.5 - - tw = 2*x + 2*y - 8*r + 4*c4 - th = h + 2.5*t - - if self.move(tw, th, move, True): - return - - self.moveTo(0, 0.25*t) - - self.edges["F"](y - 2 * r - self.latchsize, False) - if x - 2 * r < t: - self.edges["X"](2 * c4 + x - 2 * r, h + 2 * t) - else: - self.edges["X"](c4, h + 2 * t) - self.edges["F"](x - 2 * r, False) - self.edges["X"](c4, h + 2 * t) - self.edges["F"](y - 2 * r, False) - if x - 2 * r < t: - self.edges["X"](2 * c4 + x - 2 * r, h + 2 * t) - else: - self.edges["X"](c4, h + 2 * t) - self.edge(x - 2 * r) - self.edges["X"](c4, h + 2 * t) - self.latch(self.latchsize, False) - self.edge(h + 2 * t) - self.latch(self.latchsize, False, True) - self.edge(c4) - self.edge(x - 2 * r) - self.edge(c4) - self.edges["F"](y - 2 * r, False) - self.edge(c4) - self.edges["F"](x - 2 * r, False) - self.edge(c4) - self.edges["F"](y - 2 * r - self.latchsize, False) - self.corner(90) - self.edge(h + 2 * t) - self.corner(90) - - self.move(tw, th, move) - - def render(self): - - if self.outside: - self.x = self.adjustSize(self.x) - self.y = self.adjustSize(self.y) - self.h = self.adjustSize(self.h) - - x, y, h = self.x, self.y, self.h - self.latchsize *= self.thickness - r = self.radius or min(x, y - self.latchsize) / 2.0 - r = min(r, x / 2.0) - self.radius = r = min(r, max(0, (y - self.latchsize) / 2.0)) - - - self.surroundingWall(move="up") - self.flexBoxSide(self.x, self.y, self.radius, move="right") - self.flexBoxSide(self.x, self.y, self.radius, move="mirror") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox2.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox2.py deleted file mode 100644 index 8729888..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox2.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FlexBox2(Boxes): - """Box with living hinge and top corners rounded""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.FlexSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--radius", action="store", type=float, default=15, - help="Radius of the corners in mm") - self.argparser.add_argument( - "--latchsize", action="store", type=float, default=8, - help="size of latch in multiples of thickness") - - def flexBoxSide(self, y, h, r, callback=None, move=None): - t = self.thickness - if self.move(y+2*t, h+t, move, True): - return - - self.moveTo(t, t) - self.cc(callback, 0) - self.edges["f"](y) - self.corner(90, 0) - self.cc(callback, 1) - self.edges["f"](h - r) - self.corner(90, r) - self.cc(callback, 2) - self.edge(y - 2 * r) - self.corner(90, r) - self.cc(callback, 3) - self.latch(self.latchsize) - self.cc(callback, 4) - self.edges["f"](h - r - self.latchsize) - self.corner(90) - - self.move(y+2*t, h+t, move) - - def surroundingWall(self, move=None): - y, h, x, r = self.y, self.h, self.x, self.radius - t = self.thickness - - tw = y + h - 3*r + 2*self.c4 + self.latchsize + t - th = x + 2.5*t - - if self.move(tw, th, move, True): - return - - self.moveTo(t, .25*t) - self.edges["F"](h - r, False) - - if (y - 2 * r < t): - self.edges["X"](2 * self.c4 + y - 2 * r, x + 2 * t) - else: - self.edges["X"](self.c4, x + 2 * t) - self.edge(y - 2 * r) - self.edges["X"](self.c4, x + 2 * t) - - self.latch(self.latchsize, False) - self.edge(x + 2 * t) - self.latch(self.latchsize, False, True) - self.edge(self.c4) - self.edge(y - 2 * r) - self.edge(self.c4) - self.edges["F"](h - r) - self.corner(90) - self.edge(t) - self.edges["f"](x) - self.edge(t) - self.corner(90) - - self.move(tw, th, move) - - def render(self): - - if self.outside: - self.y = self.adjustSize(self.y) - self.h = self.adjustSize(self.h) - self.x = self.adjustSize(self.x) - - self.latchsize *= self.thickness - self.radius = self.radius or min(self.y / 2.0, self.h - self.latchsize) - self.radius = min(self.radius, self.y / 2.0) - self.radius = min(self.radius, max(0, self.h - self.latchsize)) - self.c4 = c4 = math.pi * self.radius * 0.5 - - - self.moveTo(2 * self.thickness, self.thickness) - - with self.saved_context(): - self.surroundingWall(move="right") - self.rectangularWall(self.y, self.x, edges="FFFF") - - self.surroundingWall(move="up only") - - self.flexBoxSide(self.y, self.h, self.radius, move="right") - self.flexBoxSide(self.y, self.h, self.radius, move= "mirror right") - self.rectangularWall(self.x, self.h - self.radius - self.latchsize, edges="fFeF") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox3.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox3.py deleted file mode 100644 index 97b143e..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox3.py +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FlexBox3(Boxes): - """Box with living hinge""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1) - self.addSettingsArgs(edges.FlexSettings) - self.buildArgParser("x", "y", "outside") - self.argparser.add_argument( - "--z", action="store", type=float, default=100.0, - help="height of the box") - self.argparser.add_argument( - "--h", action="store", type=float, default=10.0, - help="height of the lid") - self.argparser.add_argument( - "--radius", action="store", type=float, default=10.0, - help="radius of the lids living hinge") - self.argparser.add_argument( - "--c", action="store", type=float, default=1.0, - dest="d", help="clearance of the lid") - - def flexBoxSide(self, x, y, r, callback=None, move=None): - t = self.thickness - if self.move(x+2*t, y+t, move, True): - return - - self.moveTo(t, t) - self.cc(callback, 0) - self.edges["f"](x) - self.corner(90, 0) - self.cc(callback, 1) - self.edges["f"](y - r) - self.corner(90, r) - self.cc(callback, 2) - self.edge(x - r) - self.corner(90, 0) - self.cc(callback, 3) - self.edges["f"](y) - self.corner(90) - - self.move(x+2*t, y+t, move) - - def surroundingWall(self, move=None): - x, y, z, r, d = self.x, self.y, self.z, self.radius, self.d - t = self.thickness - - tw = x + y - 2*r + self.c4 + 2*t + t - th = z + 4*t + 2*d - - if self.move(tw, th, move, True): - return - - self.moveTo(t, d + t) - - self.edges["F"](y - r, False) - self.edges["X"](self.c4, z + 2 * t) - self.corner(-90) - self.edge(d) - self.corner(90) - self.edges["f"](x - r + t) - self.corner(90) - self.edges["f"](z + 2 * t + 2 * d) - self.corner(90) - self.edges["f"](x - r + t) - self.corner(90) - self.edge(d) - self.corner(-90) - self.edge(self.c4) - self.edges["F"](y - r) - self.corner(90) - self.edge(t) - self.edges["f"](z) - self.edge(t) - self.corner(90) - - self.move(tw, th, move) - - def lidSide(self, move=None): - x, y, z, r, d, h = self.x, self.y, self.z, self.radius, self.d, self.h - t = self.thickness - r2 = r + t if r + t <= h + t else h + t - - if r < h: - r2 = r + t - base_l = x + 2 * t - if self.move(h+t, base_l+t, move, True): - return - - self.edge(h + self.thickness - r2) - self.corner(90, r2) - self.edge(r - r2 + 1 * t) - else: - a = math.acos((r-h)/(r+t)) - ang = math.degrees(a) - base_l = x + (r+t) * math.sin(a) - r + t - if self.move(h+t, base_l+t, move, True): - return - - self.corner(90-ang) - self.corner(ang, r+t) - - self.edges["F"](x - r + t) - self.edgeCorner("F", "f") - self.edges["g"](h) - self.edgeCorner("f", "e") - self.edge(base_l) - self.corner(90) - - self.move(h+t, base_l+t, move) - - def render(self): - if self.outside: - self.x = self.adjustSize(self.x) - self.y = self.adjustSize(self.y) - self.z = self.adjustSize(self.z) - - x, y, z, d, h = self.x, self.y, self.z, self.d, self.h - r = self.radius = self.radius or min(x, y) / 2.0 - thickness = self.thickness - - self.c4 = c4 = math.pi * r * 0.5 * 0.95 - self.latchsize = 8 * thickness - - width = 2 * x + y - 2 * r + c4 + 14 * thickness + 3 * h # lock - height = y + z + 8 * thickness - - - s = edges.FingerJointSettings(self.thickness, finger=1., - space=1., surroundingspaces=1) - s.edgeObjects(self, "gGH") - - with self.saved_context(): - self.surroundingWall(move="right") - self.rectangularWall(x, z, edges="FFFF", move="right") - self.rectangularWall(h, z + 2 * (d + self.thickness), edges="GeGF", move="right") - self.lidSide(move="right") - self.lidSide(move="mirror right") - - self.surroundingWall(move="up only") - - self.flexBoxSide(x, y, r, move="right") - self.flexBoxSide(x, y, r, move="mirror right") - self.rectangularWall(z, y, edges="fFeF") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox4.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox4.py deleted file mode 100644 index 433ee88..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox4.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (C) 2013-2018 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FlexBox4(Boxes): - """Box with living hinge and left corners rounded""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.FlexSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--radius", action="store", type=float, default=15, - help="Radius of the corners in mm") - self.argparser.add_argument( - "--latchsize", action="store", type=float, default=8, - help="size of latch in multiples of thickness") - - def flexBoxSide(self, x, y, r, callback=None, move=None): - t = self.thickness - - if self.move(x+2*t, y+t, move, True): - return - - self.moveTo(t, t) - - self.cc(callback, 0) - self.edges["f"](x) - self.corner(90, 0) - self.cc(callback, 1) - self.edges["f"](y - r) - self.corner(90, r) - self.cc(callback, 2) - self.edge(x - 2 * r) - self.corner(90, r) - self.cc(callback, 3) - self.edges["e"](y - r - self.latchsize) - self.cc(callback, 4) - self.latch(self.latchsize) - self.corner(90) - - self.move(x+2*t, y+t, move) - - def surroundingWall(self, move=None): - x, y, h, r = self.x, self.y, self.h, self.radius - c4 = self.c4 - - t = self.thickness - - tw, th = 2*c4 + 2*y + x - 4*r + 2*t, h + 2.5*t - - if self.move(tw, th, move, True): - return - - self.moveTo(t, 0.25*t) - - self.edges["F"](y - r, False) - if (x - 2 * r < self.thickness): - self.edges["X"](2 * c4 + x - 2 * r, h + 2 * self.thickness) - else: - self.edges["X"](c4, h + 2 * self.thickness) - self.edge(x - 2 * r) - self.edges["X"](c4, h + 2 * self.thickness) - - self.edge(y - r - self.latchsize) - self.latch(self.latchsize, False, extra_length=t) - self.edge(h + 2 * self.thickness) - self.latch(self.latchsize, False, True, extra_length=t) - self.edge(y - r - self.latchsize) - self.edge(c4) - self.edge(x - 2 * r) - self.edge(c4) - self.edges["F"](y - r) - self.corner(90) - self.edge(self.thickness) - self.edges["f"](h) - self.edge(self.thickness) - self.corner(90) - - self.move(tw, th, move) - - def render(self): - if self.outside: - self.x = self.adjustSize(self.x) - self.y = self.adjustSize(self.y) - self.h = self.adjustSize(self.h) - - self.latchsize *= self.thickness - self.radius = self.radius or min(self.x / 2.0, self.y - self.latchsize) - self.radius = min(self.radius, self.x / 2.0) - self.radius = min(self.radius, max(0, self.y - self.latchsize)) - self.c4 = c4 = math.pi * self.radius * 0.5 - - - self.surroundingWall(move="up") - self.flexBoxSide(self.x, self.y, self.radius, move="right") - self.flexBoxSide(self.x, self.y, self.radius, move="mirror right") - self.rectangularWall(self.x, self.h, edges="FeFF") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox5.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox5.py deleted file mode 100644 index f9faf94..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flexbox5.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import math - -import boxes - - -class FlexBox5(boxes.Boxes): - """Box with living hinge and round corners""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - boxes.Boxes.__init__(self) - self.addSettingsArgs(boxes.edges.FingerJointSettings) - self.addSettingsArgs(boxes.edges.FlexSettings) - self.buildArgParser("x", "h", "outside") - self.argparser.add_argument( - "--top_diameter", action="store", type=float, default=60, - help="diameter at the top") - self.argparser.add_argument( - "--bottom_diameter", action="store", type=float, default=60, - help="diameter at the bottom") - self.argparser.add_argument( - "--latchsize", action="store", type=float, default=8, - help="size of latch in multiples of thickness") - - def flexBoxSide(self, callback=None, move=None): - t = self.thickness - - r1, r2 = self.top_diameter/2., self.bottom_diameter/2 - a = self.a - l = self.l - - tw , th = l+r1+r2, 2*max(r1, r2)+2*t - - if self.move(tw, th, move, True): - return - - self.moveTo(r2, t) - - self.cc(callback, 0) - self.edges["f"](l) - self.corner(180+2*a, r1) - self.cc(callback, 1) - self.latch(self.latchsize) - self.cc(callback, 2) - self.edges["f"](l - self.latchsize) - self.corner(180-2*a, r2) - - self.move(tw, th, move) - - def surroundingWall(self, move=None): - t = self.thickness - - r1, r2 = self.top_diameter/2., self.bottom_diameter/2 - h = self.h - a = self.a - l = self.l - - - c1 = math.radians(180+2*a) * r1 - c2 = math.radians(180-2*a) * r2 - - tw = 2*l + c1 + c2 - th = h + 2.5*t - - if self.move(tw, th, move, True): - return - - self.moveTo(0, 0.25*t) - - self.edges["F"](l - self.latchsize, False) - self.edges["X"](c2, h + 2 * t) - self.edges["F"](l, False) - self.edges["X"](c1, h + 2 * t) - self.latch(self.latchsize, False) - self.edge(h + 2 * t) - self.latch(self.latchsize, False, True) - self.edge(c1) - self.edges["F"](l, False) - self.edge(c2) - self.edges["F"](l - self.latchsize, False) - self.corner(90) - self.edge(h + 2 * t) - self.corner(90) - - self.move(tw, th, move) - - def render(self): - - if self.outside: - self.x = self.adjustSize(self.x) - self.h = self.adjustSize(self.h) - self.top_diameter = self.adjustSize(self.top_diameter) - self.bottom_diameter = self.adjustSize(self.bottom_diameter) - - t = self.thickness - self.latchsize *= self.thickness - d_t, d_b = self.top_diameter, self.bottom_diameter - self.x = max(self.x, self.latchsize + 2*t + (d_t + d_b)/2) - - d_c = self.x - d_t/2. - d_b/2. - self.a = math.degrees(math.asin((d_t-d_b)/2 / d_c)) - self.l = d_c * math.cos(math.radians(self.a)) - - self.surroundingWall(move="up") - self.flexBoxSide(move="right") - self.flexBoxSide(move="mirror") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flextest.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flextest.py deleted file mode 100644 index 4e1a718..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flextest.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FlexTest(Boxes): - """Piece for testing different flex settings""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FlexSettings) - self.buildArgParser("x", "y") - - def render(self): - x, y = self.x, self.y - - self.moveTo(5, 5) - self.edge(10) - self.edges["X"](x, y) - self.edge(10) - self.corner(90) - self.edge(y) - self.corner(90) - self.edge(x + 20) - self.corner(90) - self.edge(y) - self.corner(90) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flextest2.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flextest2.py deleted file mode 100644 index 033c049..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/flextest2.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FlexTest2(Boxes): - """Piece for testing 2D flex settings""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser("x", "y") - self.argparser.add_argument( - "--fw", action="store", type=float, default=1, - help="distance of flex cuts in multiples of thickness") - - def render(self): - x, y = self.x, self.y - - self.rectangularWall(x, y, callback=[lambda: self.flex2D(x, y, self.fw)]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/folder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/folder.py deleted file mode 100644 index 020e482..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/folder.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Folder(Boxes): - """Book cover with flex for the spine""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FlexSettings) - self.buildArgParser("x", "y", "h") - self.argparser.add_argument( - "--r", action="store", type=float, default=10.0, - help="radius of the corners") - self.argparser.set_defaults(h=20) - - def render(self): - x, y, r, h = self.x, self.y, self.r, self.h - c2 = math.pi * h - self.moveTo(r + self.thickness, self.thickness) - self.edge(x - r) - self.edges["X"](c2, y) - self.edge(x - r) - self.corner(90, r) - self.edge(y - 2 * r) - self.corner(90, r) - self.edge(2 * x - 2 * r + c2) - self.corner(90, r) - self.edge(y - 2 * r) - self.corner(90, r) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/frontpanel.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/frontpanel.py deleted file mode 100644 index 4b7d58e..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/frontpanel.py +++ /dev/null @@ -1,211 +0,0 @@ -# Copyright (C) 2013-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import io -import shlex - -from boxes import * - - -def str_to_bool(s: str) -> bool: - return s.lower() in ('true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh') - - -class FrontPanel(Boxes): - """Mounting Holes and cutouts for all your holy needs.""" - - description = f""" - - - - -This will help you create font (and side and top) panels for your -boxes that are pre-configured for all the bits and bobs you'd like to -install - - The layout can create several types of holes including rectangles, - circles and mounting holes. The default shows an example layout with all - currently supported objects. - -#### -`rect x y w h [cr=0] [cx=True] [cy=True]` - - x: x position - y: y position - w: width - h: height - cr: optional, Corner radius, default=0 - cx: optional, Center x. the x position denotes the center of the rectangle. - accepts t, T, 1, or other true-like values. - cy: optional, Center y. the y position denotes the center of the rectangle. - -#### outline -`rect w h` - - w: width - h: height - -`outline` has a special meaning: You can create multiple panel outlines with one command. -This has the effect of making it easy to manage all the holes on all the sides of -your boxes. - -#### circle -`circle x y r` - - x: x position - y: y position - r: radius - -#### mountinghole -mountinghole x y d_shaft [d_head=0] [angle=0] - - x: x position - y: y position - d_shaft: diameter of the shaft part of the mounting hole - d_head: optional. diameter of the head - angle: optional. angle of the mounting hole - -#### text -`text x y size "some text" [angle=0] [align=bottom|left]` - - x: x position - y: y position - size: size, in mm - text: text to render. This *must* be in quotation marks - angle: angle (in degrees) - align: string with combinations of (top|middle|bottom) and (left|center|right), - separated by '|'. Default is 'bottom|left' - - - -#### nema -`nema x y size [screwhole_size=0]` - - x: x position (center of shaft) - y: y position (center of shaft) - size: nema size. One of [{', '.join([f'{x}' for x in Boxes.nema_sizes])}] - screw: screw size, in mm. Optional. Default=0, which means the default size - - """ - - ui_group = "Holes" - - def __init__(self) -> None: - Boxes.__init__(self) - self.argparser.add_argument( - "--layout", action="store", type=str, - default=""" -outline 100 100 -rect 50 60 80 30 3 True False -text 50 91 7 "Super Front Panel With Buttons!" 0 bottom|center -circle 10 45 3.5 -circle 30 45 3.5 -circle 50 45 3.5 -circle 70 45 3.5 -circle 90 45 3.5 -text 10 40 3 "BTN_1" 0 top|center -text 35 45 3 "BTN_2" 90 top|center -text 50 50 3 "BTN_3" 180 top|center -text 65 45 3 "BTN_4" 270 top|center -text 90 45 3 "5" 0 middle|center -mountinghole 5 85 3 6 90 -mountinghole 95 85 3 6 90 - -# Start another panel, 30x50 -outline 30 50 -rect 15 25 15 15 1 True True -text 15 25 3 "__Fun!" 0 bottom|left -text 15 25 3 "__Fun!" 45 bottom|left -text 15 25 3 "__Fun!" 90 bottom|left -text 15 25 3 "__Fun!" 135 bottom|left -text 15 25 3 "__Fun!" 180 bottom|left -text 15 25 3 "__Fun!" 225 bottom|left -text 15 25 3 "__Fun!" 270 bottom|left - -text 3 10 2 "Another panel, for fun" 0 top|left - - -# Let's create another panel with a nema motor on it -outline 40 40 -nema 20 20 17 -""") - - def applyOffset(self, x, y): - return (x+self.offset[0], y+self.offset[1]) - - def drawRect(self, x, y, w, h, r=0, center_x="True", center_y="True") -> None: - x, y, w, h, r = (float(i) for i in [x, y, w, h, r]) - x, y = self.applyOffset(x, y) - center_x = str_to_bool(center_x) - center_y = str_to_bool(center_y) - self.rectangularHole(x, y, w, h, r, center_x, center_y) - - def drawCircle(self, x, y, r) -> None: - x, y, r = (float(i) for i in [x, y, r]) - x, y = self.applyOffset(x, y) - self.hole(x, y, r) - - def drawMountingHole(self, x, y, d_shaft, d_head=0.0, angle=0) -> None: - x, y, d_shaft, d_head, angle = (float(i) for i in [x, y, d_shaft, d_head, angle]) - x, y = self.applyOffset(x, y) - self.mountingHole(x, y, d_shaft, d_head, angle) - - def drawOutline(self, w, h): - w, h = (float(i) for i in [w, h]) - if self.outline is not None: - self.offset = self.applyOffset(self.outline[0]+10, 0) - self.outline = (w, h) # store away for next time - x = 0 - y = 0 - x, y = self.applyOffset(x, y) - border = [(x, y), (x+w, y), (x+w, y+h), (x, y+h), (x, y)] - self.showBorderPoly( border ) - - def drawText(self, x, y, size, text, angle=0, align='bottom|left'): - x, y, size, angle = (float(i) for i in [x, y, size, angle]) - x, y = self.applyOffset(x, y) - align = align.replace("|", " ") - self.text(text=text, x=x, y=y, fontsize=size, angle=angle, align=align) - - def drawNema(self, x, y, size, screwhole_size=0): - x, y, size, screwhole_size = (float(i) for i in [x, y, size, screwhole_size]) - if size in self.nema_sizes: - x, y = self.applyOffset(x, y) - self.NEMA(size, x, y, screwholes=screwhole_size) - - def parse_layout(self, layout): - f = io.StringIO(layout) - line = 0 - objects = { - 'outline': self.drawOutline, - 'rect': self.drawRect, - 'circle': self.drawCircle, - 'mountinghole': self.drawMountingHole, - 'text': self.drawText, - 'nema': self.drawNema, - } - - for l in f.readlines(): - line += 1 - l = re.sub('#.*$', '', l) # remove comments - l = l.strip() - la = shlex.split(l, comments=True, posix=True) - if len(la) > 0 and la[0].lower() in objects: - objects[la[0]](*la[1:]) - - def render(self): - self.offset = (0.0, 0.0) - self.outline = None # No outline yet - self.parse_layout(self.layout) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/frontpanel_test.json b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/frontpanel_test.json deleted file mode 100644 index 892bf74..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/frontpanel_test.json +++ /dev/null @@ -1,3 +0,0 @@ -outline 60 60 -squre 10 20 25 34 -circle 10 20 40 diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gear.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gear.py deleted file mode 100644 index f4fdad5..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gear.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Gears(Boxes): - """Gears""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - self.argparser.add_argument( - "--teeth1", action="store", type=int, default=12, - help="number of teeth") - self.argparser.add_argument( - "--shaft1", action="store", type=float, default=6., - help="diameter of the shaft 1") - self.argparser.add_argument( - "--dpercentage1", action="store", type=float, default=75, - help="percent of the D section of shaft 1 (100 for round shaft)") - - self.argparser.add_argument( - "--teeth2", action="store", type=int, default=32, - help="number of teeth in the other size of gears") - self.argparser.add_argument( - "--shaft2", action="store", type=float, default=0.0, - help="diameter of the shaft2 (zero for same as shaft 1)") - self.argparser.add_argument( - "--dpercentage2", action="store", type=float, default=0, - help="percent of the D section of shaft 1 (0 for same as shaft 1)") - - self.argparser.add_argument( - "--modulus", action="store", type=float, default=2, - help="size of teeth (diameter / #teeth) in mm") - self.argparser.add_argument( - "--pressure_angle", action="store", type=float, default=20, - help="angle of the teeth touching (in degrees)") - self.argparser.add_argument( - "--profile_shift", action="store", type=float, default=20, - help="in percent of the modulus") - - def render(self): - # adjust to the variables you want in the local scope - t = self.thickness - - self.teeth1 = max(2, self.teeth1) - self.teeth2 = max(2, self.teeth2) - - if not self.shaft2: - self.shaft2 = self.shaft1 - if not self.dpercentage2: - self.dpercentage2 = self.dpercentage1 - - self.gears(teeth=self.teeth2, dimension=self.modulus, - angle=self.pressure_angle, profile_shift=self.profile_shift, - callback=lambda:self.dHole(0, 0, d=self.shaft2, - rel_w=self.dpercentage2/100.), - move="up") - r2, d2, d2 = self.gears.sizes( - teeth=self.teeth2, dimension=self.modulus, - angle=self.pressure_angle, profile_shift=self.profile_shift) - - self.gears(teeth=self.teeth1, dimension=self.modulus, - angle=self.pressure_angle, profile_shift=self.profile_shift, - callback=lambda:self.dHole(0, 0, d=self.shaft1, - rel_w=self.dpercentage1/100.), - move="up") - r1, d1, d1 = self.gears.sizes( - teeth=self.teeth1, dimension=self.modulus, - angle=self.pressure_angle, profile_shift=self.profile_shift) - r = max(self.shaft1, self.shaft2)/2 - self.hole(t+r, t+r, self.shaft1/2) - self.hole(t+r+r1+r2, t+r, self.shaft2/2) - self.moveTo(0, 2*r+t) - - self.text(f"Pitch radius 1: {r1:.1f}mm\n" - f"Outer diameter 1: {d1:.1f}mm\n" - f"Pitch radius 2: {r2:.1f}mm\n" - f"Outer diameter 2: {d2:.1f}mm\n" - f"Axis distance: {r1 + r2:.1f}mm\n", - align="bottom left") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gearbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gearbox.py deleted file mode 100644 index e93e286..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gearbox.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class GearBox(Boxes): - """Gearbox with multiple identical stages""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.argparser.add_argument( - "--teeth1", action="store", type=int, default=8, - help="number of teeth on ingoing shaft") - self.argparser.add_argument( - "--teeth2", action="store", type=int, default=20, - help="number of teeth on outgoing shaft") - self.argparser.add_argument( - "--modulus", action="store", type=float, default=3, - help="modulus of the teeth in mm") - self.argparser.add_argument( - "--shaft", action="store", type=float, default=6., - help="diameter of the shaft") - self.argparser.add_argument( - "--stages", action="store", type=int, default=4, - help="number of stages in the gear reduction") - - def render(self): - - if self.teeth2 < self.teeth1: - self.teeth2, self.teeth1 = self.teeth1, self.teeth2 - - pitch1, size1, xxx = self.gears.sizes(teeth=self.teeth1, dimension=self.modulus) - pitch2, size2, xxx = self.gears.sizes(teeth=self.teeth2, dimension=self.modulus) - - t = self.thickness - x = 1.1 * t * self.stages - - if self.stages == 1: - y = size1 + size2 - y1 = y / 2 - (pitch1 + pitch2) + pitch1 - y2 = y / 2 + (pitch1 + pitch2) - pitch2 - else: - y = 2 * size2 - y1 = y / 2 - (pitch1 + pitch2) / 2 - y2 = y / 2 + (pitch1 + pitch2) / 2 - - h = max(size1, size2) + t - - b = "F" - t = "e" # prepare for close box - mh = self.shaft - - def sideCB(): - self.hole(y1, h / 2, mh / 2) - self.hole(y2, h / 2, mh / 2) - - self.moveTo(self.thickness, self.thickness) - self.rectangularWall(y, h, [b, "f", t, "f"], callback=[sideCB], move="right") - self.rectangularWall(x, h, [b, "F", t, "F"], move="up") - self.rectangularWall(x, h, [b, "F", t, "F"]) - self.rectangularWall(y, h, [b, "f", t, "f"], callback=[sideCB], move="left") - self.rectangularWall(x, h, [b, "F", t, "F"], move="up only") - - self.rectangularWall(x, y, "ffff", move="up") - - profile_shift = 20 - pressure_angle = 20 - - for i in range(self.stages - 1): - self.gears(teeth=self.teeth2, dimension=self.modulus, angle=pressure_angle, - mount_hole=mh, profile_shift=profile_shift, move="up") - - self.gears(teeth=self.teeth2, dimension=self.modulus, angle=pressure_angle, - mount_hole=mh, profile_shift=profile_shift, move="right") - - for i in range(self.stages): - self.gears(teeth=self.teeth1, dimension=self.modulus, angle=pressure_angle, - mount_hole=mh, profile_shift=profile_shift, move="down") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gridfinitybase.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gridfinitybase.py deleted file mode 100644 index 66f2603..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gridfinitybase.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes import lids - - -class GridfinityBase(Boxes): - """A parameterized Gridfinity base""" - - description = """This is a configurable gridfinity base. This - design is based on -
Zach Freedman's Gridfinity system""" - - ui_group = "Tray" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings, space=4, finger=4) - self.addSettingsArgs(lids.LidSettings) - self.argparser.add_argument("--x", type=int, default=3, help="number of grids in X direction") - self.argparser.add_argument("--y", type=int, default=2, help="number of grids in Y direction") - self.argparser.add_argument("--h", type=float, default=7*3, help="height of sidewalls of the tray (mm)") - self.argparser.add_argument("--m", type=float, default=0.5, help="Extra margin around the gridfinity base to allow it to drop into the carrier (mm)") - self.argparser.add_argument( - "--bottom_edge", action="store", - type=ArgparseEdgeType("Fhse"), choices=list("Fhse"), - default='F', - help="edge type for bottom edge") - self.argparser.add_argument("--pitch", type=int, default=42, help="The Gridfinity pitch, in mm. Should always be 42.") - self.argparser.add_argument("--opening", type=int, default=38, help="The cutout for each grid opening. Typical is 38.") - - def generate_grid(self): - pitch = self.pitch - nx, ny = self.x, self.y - opening = self.opening - for col in range(nx): - for row in range(ny): - lx = col*pitch+pitch/2 - ly = row*pitch+pitch/2 - self.rectangularHole(lx, ly, opening, opening) - - def create_base_plate(self): - pitch = self.pitch - nx, ny = self.x, self.y - opening = self.opening - self.rectangularWall(nx*pitch, ny*pitch, move="up", callback=[self.generate_grid]) - - def create_tray(self): - pitch = self.pitch - nx, ny = self.x, self.y - margin = self.m - x, y, h = nx*pitch, ny*pitch, self.h - t = self.thickness - x += 2*margin - y += 2*margin - t1, t2, t3, t4 = "eeee" - b = self.edges.get(self.bottom_edge, self.edges["F"]) - sideedge = "F" # if self.vertical_edges == "finger joints" else "h" - - self.rectangularWall(x, h, [b, sideedge, t1, sideedge], - ignore_widths=[1, 6], move="right") - self.rectangularWall(y, h, [b, "f", t2, "f"], - ignore_widths=[1, 6], move="up") - self.rectangularWall(y, h, [b, "f", t4, "f"], - ignore_widths=[1, 6], move="") - self.rectangularWall(x, h, [b, sideedge, t3, sideedge], - ignore_widths=[1, 6], move="left up") - - if self.bottom_edge != "e": - self.rectangularWall(x, y, "ffff", move="up") - - def render(self): - self.create_base_plate() - self.create_tray() - self.lid(self.x*self.pitch + 2*self.m, - self.y*self.pitch + 2*self.m) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gridfinitytraylayout.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gridfinitytraylayout.py deleted file mode 100644 index 04c2058..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/gridfinitytraylayout.py +++ /dev/null @@ -1,116 +0,0 @@ -import boxes -from boxes import Boxes, lids, restore -from boxes.Color import Color -from boxes.generators.traylayout import TrayLayout - - -class GridfinityTrayLayout(TrayLayout): - """A Gridfinity Tray Generator based on TrayLayout""" - - description = """ -This is a general purpose gridfinity tray generator. You can create -somewhat arbitrarily shaped trays, or just do nothing for simple grid -shaped trays. - -The dimensions are automatically calculated to fit perfectly into a -gridfinity grid (like the GridfinityBase, or any other Gridfinity -based base). - -Edit the layout text graphics to adjust your tray. -You can replace the hyphens and vertical bars representing the walls -with a space character to remove the walls. You can replace the space -characters representing the floor by a "X" to remove the floor for -this compartment. -""" - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(boxes.edges.FingerJointSettings) - self.addSettingsArgs(lids.LidSettings) - self.buildArgParser(h=50) - self.outside = True # We're *always* outside for gridfinity - self.pitch = 42.0 # gridfinity pitch is defined as 42. - self.opening = 38 - self.opening_margin = 2 - self.argparser.add_argument("--hi", type=float, default=0, help="inner height of inner walls in mm (leave to zero for same as outer walls)") - self.argparser.add_argument("--nx", type=int, default=3, help="number of gridfinity grids in X direction") - self.argparser.add_argument("--ny", type=int, default=2, help="number of gridfinity grids in Y direction") - self.argparser.add_argument("--countx", type=int, default=5, help="split x into this many grid sections. 0 means same as --nx") - self.argparser.add_argument("--county", type=int, default=3, help="split y into this many grid sections. 0 means same as --ny") - self.argparser.add_argument("--margin", type=float, default=0.75, help="Leave this much total margin on the outside, in mm") - self.argparser.add_argument("--layout", type=str, help="You can hand edit this before generating", default="\n"); - - def generate_layout(self): - layout = '' - countx = self.countx - county = self.county - if countx == 0: - countx = self.nx - if county == 0: - county = self.ny - - stepx = self.x / countx - stepy = self.y / county - for i in range(countx): - line = ' |' * i + f" ,> {stepx}mm\n" - layout += line - for i in range(county): - layout += "+-" * countx + f"+\n" - layout += "| " * countx + f"|{stepy}mm\n" - layout += "+-" * countx + "+\n" - return layout - - @restore - def rectangularEtching(self, x, y, dx, dy, r=0, center_x=True, center_y=True): - """ - Draw a rectangular hole - - :param x: position - :param y: position - :param dx: width - :param dy: height - :param r: (Default value = 0) radius of the corners - :param center_x: (Default value = True) if True, x position is the center, else the start - :param center_y: (Default value = True) if True, y position is the center, else the start - """ - r = min(r, dx/2., dy/2.) - x_start = x if center_x else x + dx / 2.0 - y_start = y - dy / 2.0 if center_y else y - self.moveTo(x_start, y_start, 180) - self.edge(dx / 2.0 - r) # start with an edge to allow easier change of inner corners - for d in (dy, dx, dy, dx / 2.0 + r): - self.corner(-90, r) - self.edge(d - 2 * r) - - def baseplate_etching(self): - x = -self.thickness - self.margin / 2 - y = -self.thickness - self.margin / 2 - o = self.opening - p = self.pitch - m = self.opening_margin - self.ctx.stroke() - with self.saved_context(): - for xx in [0, self.nx-1]: - for yy in [0, self.ny-1]: - self.set_source_color(Color.ETCHING) - self.rectangularEtching(x+p/2+xx*p, y+p/2+yy*p, o-m, o-m) - self.ctx.stroke() - - def render(self): - # Create a layout - self.x = self.pitch * self.nx - self.margin - self.y = self.pitch * self.ny - self.margin - self.outer_x = self.x - self.outer_y = self.y - - self.prepare() - self.walls() - with self.saved_context(): - self.base_plate(callback=[self.baseplate_etching], - move="mirror right") - foot = self.opening - self.opening_margin - for i in range(min(self.nx * self.ny, 4)): - self.rectangularWall(foot, foot, move="right") - self.base_plate(callback=[self.baseplate_etching], - move="up only") - self.lid(sum(self.x) + (len(self.x)-1) * self.thickness, - sum(self.y) + (len(self.y)-1) * self.thickness) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/halfbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/halfbox.py deleted file mode 100644 index b5184ed..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/halfbox.py +++ /dev/null @@ -1,155 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class HalfBox(Boxes): - """Configurable half of a box which can be: a bookend, a hanging shelf, an angle clamping jig, ...""" - - description = """This can be used to create: - -* a hanging shelf: -![HalfBox as hanging shelf](static/samples/HalfBox_Shelf_usage.jpg) - -* an angle clamping jig: -![HalfBox as an angle clamping jig](static/samples/HalfBox_AngleJig_usage.jpg) - -* a bookend: -![HalfBox as a bookend](static/samples/HalfBox_Bookend_usage.jpg) - -and many more... - -""" - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, finger=2.0,space=2.0) - self.addSettingsArgs(edges.MountingSettings) - self.buildArgParser(x=100, sy="50:50", h=100) - - self.argparser.add_argument("--Clamping", action="store", type=boolarg, default=False, help="add clamping holes") - self.argparser.add_argument("--ClampingSize", action="store", type=float, default=25.0, help="diameter of clamping holes") - self.argparser.add_argument("--Mounting", action="store", type=boolarg, default=False, help="add mounting holes") - self.argparser.add_argument("--Sturdy", action="store", type=boolarg, default=False, help="create sturdy construction (e.g. shelf, clamping jig, ...)") - - def polygonWallExt(self, borders, edge="f", turtle=False, callback=None, move=None): - # extended polygon wall. - # same as polygonWall, but with extended border parameters - # each border dataset consists of - # length - # turn angle - # radius of turn (without radius correction) - # edge type - - for i in range(0, len(borders), 4): - self.cc(callback, i) - length = borders[i] - next_angle = borders[i+1] - next_radius = borders[i+2] - next_edge = borders[i+3] - - e = self.edges.get(next_edge, next_edge) - if i == 0: - self.moveTo(0,e.margin(),0) - e(length) - if self.debug: - self.hole(0, 0, 1, color=Color.ANNOTATIONS) - self.corner(next_angle, tabs=0, radius=next_radius) - - def xHoles(self): - posy = -0.5 * self.thickness - for y in self.sy[:-1]: - posy += y + self.thickness - self.fingerHolesAt(posy, 0, self.x) - - def hHoles(self): - posy = -0.5 * self.thickness - for y in reversed(self.sy[1:]): - posy += y + self.thickness - self.fingerHolesAt(posy, 0, self.h) - - def render(self): - # adjust to the variables you want in the local scope - - x, h = self.x, self.h - d = self.ClampingSize - t = self.thickness - - # triangle with sides: x (horizontal), h (upwards) and l - # angles: 90° between x & h - # b between h & l - # c between l & x - - l = math.sqrt(x * x + h * h) - b = math.degrees(math.asin(x / l)) - c = math.degrees(math.asin(h / l)) - if x > h: - if 90 + b + c < 179: - b = 180 - b - else: - if 90 + b + c < 179: - c = 180 - c - - # small triangle top: 2*t, h1, l1 - h1 = (2*t)/x*h - l1 = (2*t)/x*l - - # small triangle left: x2, 2*t, l2 - x2 = (2*t)/h*x - l2 = (2*t)/h*l - - # render your parts here - - if self.Sturdy: - width = sum(self.sy) + (len(self.sy) - 1) * t - self.rectangularWall(x, width, "fffe", callback=[None, self.xHoles, None, None], move="right", label="bottom") - self.rectangularWall(h, width, "fGfF" if self.Mounting else "fefF", callback=[None, None, None, self.hHoles], move="up", label="back") - self.rectangularWall(x, width, "fffe", callback=[None, self.xHoles, None, None], move="left only", label="invisible") - - for i in range(2): - self.move(x+x2+2*t + self.edges["f"].margin(), h+h1+2*t + self.edges["f"].margin(), "right", True, label="side " + str(i)) - self.polygonWallExt(borders=[x2, 0, 0, "e", x, 0, 0, "h",2*t, 90, 0, "e", 2*t, 0, 0, "e", h, 0, 0, "h",h1, 180-b, 0, "e", l+l1+l2, 180-c, 0, "e"]) - if self.Clamping: - self.hole(0, 0, 1, color=Color.ANNOTATIONS) - self.rectangularHole(x/2+x2,2*t+d/2,dx=d,dy=d,r=d/8) - self.rectangularHole((x+x2+2*t)-2*t-d/2,h/2+2*t,dx=d,dy=d,r=d/8) - self.move(x+x2+2*t + self.edges["f"].margin(), h+h1+2*t + self.edges["f"].margin(), "right", False, label="side " + str(i)) - - if len(self.sy) > 1: - for i in range(len(self.sy) - 1): - self.move(x + self.edges["f"].margin(), h + self.edges["f"].margin(), "right", True, label="support " + str(i)) - self.polygonWallExt(borders=[x, 90, 0, "f", h, 180-b, 0, "f", l, 180-c, 0, "e"]) - if self.Clamping: - self.rectangularHole(x/2,d/2-t/2,dx=d,dy=d+t,r=d/8) - self.rectangularHole(x-d/2+t/2,h/2,dx=d+t,dy=d,r=d/8) - self.move(x + self.edges["f"].margin(), h + self.edges["f"].margin(), "right", False, label="support " + str(i)) - else: - self.sy.insert(0,0) - self.sy.append(0) - width = sum(self.sy) + (len(self.sy) - 1) * t - self.rectangularWall(x, width, "efee", callback=[None, self.xHoles, None, None], move="right", label="bottom") - self.rectangularWall(h, width, "eGeF" if self.Mounting else "eeeF", callback=[None, None, None, self.hHoles], move="up", label="side") - self.rectangularWall(x, width, "efee", callback=[None, self.xHoles, None, None], move="left only", label="invisible") - - for i in range(len(self.sy) - 1): - self.move(x + self.edges["f"].margin(), h + self.edges["f"].margin(), "right", True, label="support " + str(i)) - self.polygonWallExt(borders=[x, 90, 0, "f", h, 180-b, 0, "f", l, 180-c, 0, "e"]) - if self.Clamping: - self.rectangularHole(x/2,d/2,dx=d,dy=d,r=d/8) - self.rectangularHole(x-d/2,h/2,dx=d,dy=d,r=d/8) - self.move(x + self.edges["f"].margin(), h + self.edges["f"].margin(), "right", False, label="support " + str(i)) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/heart.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/heart.py deleted file mode 100644 index 191e070..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/heart.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class HeartBox(Boxes): - """Box in the form of a heart""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, finger=1.0,space=1.0) - self.addSettingsArgs(edges.FlexSettings) - self.buildArgParser(x=150, h=50) - self.argparser.add_argument( - "--top", action="store", type=str, default="closed", - choices=["closed", "hole", "lid",], - help="style of the top and lid") - - def CB(self): - x = self.x - t = self.thickness - - l = 2/3. * x - t - r = l/2. - t - d = 2 *t - - if self.top == "closed": - return - - for i in range(2): - self.moveTo(t, t) - self.polyline((l, 2), (180, r), (d, 1), -90, - (d, 1), (180, r), (l, 2), 90) - l -= t - r -= t - d += t - if self.top == "hole": - return - - def render(self): - x, h = self.x, self.h - t = self.thickness - - l = 2/3. * x - r = l/2. - 0.5*t - - borders = [l, (180, r), t, -90, t, (180, r), l, 90] - self.polygonWalls(borders, h) - self.rectangularWall(0, h, "FFFF", move="up only") - self.polygonWall(borders, callback=[self.CB], move="right") - self.polygonWall(borders, move="mirror right") - if self.top == "lid": - self.polygonWall([l+t, (180, r+t), 0, -90, 0, (180, r+t), l+t, 90], 'e') diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/hingebox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/hingebox.py deleted file mode 100644 index d25dda4..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/hingebox.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class HingeBox(Boxes): - """Box with lid attached by cabinet hinges""" - - description = """Needs (metal) pins as hinge axles. Pieces of nails will -do fine. They need to be cut to length as they are captured as soon as the -hinges are assembled. - -Assemble the box and the lid separately. Then insert the axle into the hinges. -Then attach the hinges on the inside of the box and then connect them to lid. -""" - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.CabinetHingeSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--lidheight", action="store", type=float, default=20.0, - help="height of lid in mm") - self.argparser.add_argument( - "--splitlid", action="store", type=float, default=0.0, - help="split the lid in y direction (mm)") - - def render(self): - - x, y, h, hl = self.x, self.y, self.h, self.lidheight - s = self.splitlid - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h) - s = self.adjustSize(s, None) # reduce by half of the walls - - if s > x or s < 0.0: s = 0.0 - t = self.thickness - - # bottom walls - if s: - self.rectangularWall(x, h, "FFuF", move="right") - else: - self.rectangularWall(x, h, "FFeF", move="right") - self.rectangularWall(y, h, "Ffef", move="up") - self.rectangularWall(y, h, "Ffef") - self.rectangularWall(x, h, "FFuF", move="left up") - - # lid - self.rectangularWall(x, hl, "UFFF", move="right") - if s: - self.rectangularWall(s, hl, "eeFf", move="right") - self.rectangularWall(y-s, hl, "efFe", move="up") - self.rectangularWall(y-s, hl, "eeFf") - self.rectangularWall(s, hl, "efFe", move="left") - self.rectangularWall(x, hl, "UFFF", move="left up") - else: - self.rectangularWall(y, hl, "efFf", move="up") - self.rectangularWall(y, hl, "efFf") - self.rectangularWall(x, hl, "eFFF", move="left up") - - self.rectangularWall(x, y, "ffff", move="right only") - self.rectangularWall(x, y, "ffff") - if s: - self.rectangularWall(x, s, "ffef", move="left up") - self.rectangularWall(x, y-s, "efff", move="up") - else: - self.rectangularWall(x, y, "ffff", move="left up") - self.edges['u'].parts(move="up") - if s: - self.edges['u'].parts(move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/holepattern.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/holepattern.py deleted file mode 100644 index ac79544..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/holepattern.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright (C) 2013-2022 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class HolePattern(Boxes): - """Generate hole patterns in different simple shapes""" - - ui_group = "Holes" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(fillHolesSettings, fill_pattern="hex") - - self.buildArgParser("x", "y") - self.argparser.add_argument( - "--shape", action="store", type=str, default="rectangle", - choices=["rectangle", "ellipse", "oval", "hexagon", "octagon"], - help="Shape of the hole pattern") - - def render(self): - x, y = self.x, self.y - - if self.shape == "ellipse": - border = [(x * (.5+math.sin(math.radians(a))/2), - y * (.5+math.cos(math.radians(a))/2)) - for a in range(0, 360, 18)] - elif self.shape == "oval": - r = min(x, y) / 2 - dx = max(x-y, 0) - dy = max(y-x, 0) - border = [(r * (.5+math.cos(math.radians(a))/2) + - (dx if q in [0, 3] else 0), - r * (.5+math.sin(math.radians(a))/2) + - (dy if q in [1, 2] else 0)) - for q in range(4) - for a in range(90*q, 90*q+91, 18)] - elif self.shape == "hexagon": - dx = min(y / (3**.5) / 2, x / 2) - border = [(dx, 0), (x-dx, 0), (x, .5*y), - (x-dx, y), (dx, y), (0, .5*y)] - elif self.shape == "octagon": - d = (2**.5/(2+2*2**.5)) - d2 = 1 -d - border = [(d*x, 0), (d2*x, 0), (x, d*y), (x, d2*y), - (d2*x, y), (d*x, y), (0, d2*y), (0, d*y)] - else: # "rectangle" - border = [(0, 0), (x, 0), (x, y), (0, y)] - - self.fillHoles( - pattern=self.fillHoles_fill_pattern, - border=border, - max_radius=self.fillHoles_hole_max_radius, - hspace=self.fillHoles_space_between_holes, - bspace=self.fillHoles_space_to_border, - min_radius=self.fillHoles_hole_min_radius, - style=self.fillHoles_hole_style, - bar_length=self.fillHoles_bar_length, - max_random=self.fillHoles_max_random - ) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/hooks.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/hooks.py deleted file mode 100644 index 393c16a..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/hooks.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright (C) 2013-2018 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Hook(Boxes): - """A hook with a rectangular mouth to mount at the wall""" - - ui_group = "Misc" # see ./__init__.py for names - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=0.5) - self.argparser.add_argument("--width", action="store", - type=float, default=40., - help="width of the hook (back plate is a bit wider)") - self.argparser.add_argument("--height", action="store", - type=float, default=40., - help="inner height of the hook") - self.argparser.add_argument("--depth", action="store", - type=float, default=40., - help="inner depth of the hook") - self.argparser.add_argument("--strength", action="store", - type=float, default=20., - help="width of the hook from the side") - self.argparser.add_argument("--angle", action="store", - type=float, default=45., - help="angle of the support underneath") - - def render(self): - - self.angle = min(self.angle, 80) - t = self.thickness - w = self.width - 2*t # inner width - d, h, s = self.depth, self.height, self.strength - - self.rectangularWall(w + 4*t, self.height_back, 'Eeee', callback=self.back_callback, move='right') - self.sidewall(d, h, s, self.angle, move='right') - self.sidewall(d, h, s, self.angle, move='right') - self.rectangularWall(d, w, 'FFFf', move='right') - self.rectangularWall(h - t, w, 'FFFf', move='right', callback=[ - lambda: self.hole((h - t)/2, w/2, d=17)]) - self.rectangularWall(s-t, w, 'FeFf', move='right') - - - - def back_callback(self, n): - if n != 0: - return - - t = self.thickness - h = self.h_a + self.strength - - self.fingerHolesAt(1.5*t, 0, h) - self.fingerHolesAt(self.width + .5*t, 0, h) - self.fingerHolesAt(2*t, h + t/2, self.width - 2*t, 0) - - x_h = self.width/2 + t - - y1 = h + self.height/2 - y2 = self.strength/2 - y3 = (y1 + y2) / 2 - - self.hole(x_h, y1, d=3) - self.hole(x_h, y2, d=3) - self.hole(x_h, y3, d=3) - - - @property - def height_back(self): - - return self.strength + self.height + self.h_a - - @property - def h_a(self): - return self.depth * math.tan(math.radians(self.angle)) - - def sidewall(self, depth, height, strength, angle=60., move=None): - - t = self.thickness - - h_a = depth * math.tan(math.radians(angle)) - l_a = depth / math.cos(math.radians(angle)) - - f_edge = self.edges['f'] - - x_total = depth + strength + f_edge.margin() - y_total = strength + height + h_a - - if self.move(x_total, y_total, move, before=True): - return - - - self.moveTo(f_edge.margin()) - self.polyline(strength, angle, l_a, 90-angle, height+strength, 90) - - f_edge(strength - t) - self.corner(90) - f_edge(height - t) - - self.polyline(t, -90, t) - - f_edge(depth) - self.corner(90) - f_edge(h_a + strength) - self.corner(90) - - self.move(x_total, y_total, move) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/integratedhingebox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/integratedhingebox.py deleted file mode 100644 index 4288bc5..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/integratedhingebox.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class IntegratedHingeBox(Boxes): - """Box with lid and integraded hinge""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.ChestHingeSettings) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--lidheight", action="store", type=float, default=20.0, - help="height of lid in mm") - - - def render(self): - - x, y, h, hl = self.x, self.y, self.h, self.lidheight - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h) - - t = self.thickness - - hy = self.edges["O"].startwidth() - hy2 = self.edges["P"].startwidth() - - e1 = edges.CompoundEdge(self, "Fe", (h-hy, hy)) - e2 = edges.CompoundEdge(self, "eF", (hy, h-hy)) - e_back = ("F", e1, "e", e2) - - self.rectangularWall(y, h-hy, "FfOf", ignore_widths=[2], move="up") - self.rectangularWall(y, hl-hy2, "pfFf", ignore_widths=[1], move="up") - self.rectangularWall(y, h-hy, "Ffof", ignore_widths=[5], move="up") - self.rectangularWall(y, hl-hy2, "PfFf", ignore_widths=[6], move="up") - self.rectangularWall(x, h, "FFeF", move="up") - self.rectangularWall(x, h, e_back, move="up") - self.rectangularWall(x, hl, "FFeF", move="up") - self.rectangularWall(x, hl-hy2, "FFqF", move="up") - - self.rectangularWall(y, x, "ffff", move="up") - self.rectangularWall(y, x, "ffff") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/jigsaw.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/jigsaw.py deleted file mode 100644 index f47a7ff..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/jigsaw.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class JigsawPuzzle(Boxes): # change class name here and below - """Fractal jigsaw puzzle. Still alpha.""" - - webinterface = False # Change to make visible in web interface - - def __init__(self) -> None: - Boxes.__init__(self) - self.count = 0 - self.argparser.add_argument( - "--size", action="store", type=float, default=100, - help="size of the puzzle in mm") - self.argparser.add_argument( - "--depth", action="store", type=int, default=5, - help="depth of the recursion/level of detail") - - def peano(self, level): - if level == 0: - self.edge(self.size / self.depth) - return - - self.peano(self, level - 1) - self.corner() - - def edge(self, l): - self.count += 1 - Boxes.edge(self, l) - # if (self.count % 2**5) == 0: #level == 3 and parity>0: - # self.corner(-360, 0.25*self.size/2**self.depth) - - def hilbert(self, level, parity=1): - if level == 0: - return - # rotate and draw first subcurve with opposite parity to big curve - self.corner(parity * 90) - self.hilbert(level - 1, -parity) - - # interface to and draw second subcurve with same parity as big curve - self.edge(self.size / 2 ** self.depth) - self.corner(parity * -90) - self.hilbert(level - 1, parity) - - # third subcurve - self.edge(self.size / 2 ** self.depth) - self.hilbert(level - 1, parity) - - # if level == 3: self.corner(-360, 0.4*self.size/2**self.depth) - # fourth subcurve - self.corner(parity * -90) - self.edge(self.size / 2 ** self.depth) - self.hilbert(level - 1, -parity) - # a final turn is needed to make the turtle - # end up facing outward from the large square - self.corner(parity * 90) - # if level == 3 and parity>0: # and random.random() < 100*0.5**(self.depth-2): - # self.corner(-360, 0.4*self.size/2**self.depth) - # with self.savedcontext(): - # self.corner(parity*-90) - # self.edge(self.size/2**self.depth) - - def render(self): - size = self.size - t = self.thickness - self.burn = 0.0 - self.moveTo(10, 10) - self.hilbert(self.depth) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/jointpanel.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/jointpanel.py deleted file mode 100644 index be6e5e6..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/jointpanel.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class JointPanel(Boxes): - """Create pieces larger than your laser cutter by joining them with Dove Tails""" - - description = """This can be used to just create a big panel in a smaller laser cutter. But the actual use is to split large parts into multiple smaller pieces. Copy the outline onto the sheet and then use the pieces to cut it into multiple parts that each can fit your laser cutter. Note that each piece must be cut with the sheet surrounding it to ensure the burn correction (aka kerf) is correct. Depending on your vector graphics software you may need to duplicate your part multiple times and then generate the intersection between one copy and each rectangular part. - -The Boxes.py drawings assume that the laser is cutting in the center of the line and the width of the line represents the material that is cut away. Make sure your changes work the same way and you do not cutting away the kerf. - -Small dove tails make it easier to fit parts in without problems. Lookout for pieces cut loose where the dove tails meet the edge of the parts. Move your part if necessary to avoid dove tails or details of your part colliding in a weird way. - -For plywood this method works well with a very stiff press fit. Aim for needing a hammer to join the pieces together. This way they will feel like they have been welder together. - -""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs( - edges.DoveTailSettings, size=1, depth=.5, radius=.1) - self.buildArgParser(sx="400/2", sy="400/3") - self.argparser.add_argument( - "--separate", action="store", type=boolarg, default=False, - help="draw pieces apart so they can be cut to form a large sheet") - - def render(self): - sx, sy = self.sx, self.sy - t = self.thickness - - for ny, y in enumerate(sy): - t0 = "e" if ny == 0 else "d" - t2 = "e" if ny == len(sy) - 1 else "D" - with self.saved_context(): - for nx, x in enumerate(sx): - t1 = "e" if nx == len(sx) - 1 else "d" - t3 = "e" if nx == 0 else "D" - self.rectangularWall(x, y, [t0, t1, t2, t3]) - if self.separate: - self.rectangularWall(x, y, [t0, t1, t2, t3], - move="right only") - else: - self.moveTo(x) - if self.separate: - self.rectangularWall(x, y, [t0, t1, t2, t3], - move="up only") - else: - self.moveTo(0, y - self.edges["d"].spacing() if ny == 0 else y) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keyboard.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keyboard.py deleted file mode 100644 index f19bd12..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keyboard.py +++ /dev/null @@ -1,284 +0,0 @@ -# Copyright (C) 2021 Guillaume Collic -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import argparse -import re - -from boxes import boolarg - - -class Keyboard: - """ - Code to manage Cherry MX compatible switches and Kailh hotswap socket. - - Reference : - * https://www.cherrymx.de/en/dev.html - * https://cdn.sparkfun.com/datasheets/Components/Switches/MX%20Series.pdf - * https://www.kailhswitch.com/uploads/201815927/PG151101S11.pdf - """ - - STANDARD_KEY_SPACING = 19.05 - SWITCH_CASE_SIZE = 15.6 - FRAME_CUTOUT = 14 - - def __init__(self) -> None: - pass - - def add_common_keyboard_parameters( - self, - add_hotswap_parameter=True, - add_pcb_mount_parameter=True, - add_led_parameter=True, - add_diode_parameter=True, - add_cutout_type_parameter=True, - default_columns_definition=None, - ): - if add_hotswap_parameter: - self.argparser.add_argument( - "--hotswap_enable", - action="store", - type=boolarg, - default=True, - help=("enlarge switches holes for hotswap pcb sockets"), - ) - if add_pcb_mount_parameter: - self.argparser.add_argument( - "--pcb_mount_enable", - action="store", - type=boolarg, - default=True, - help=("adds holes for pcb mount switches"), - ) - if add_led_parameter: - self.argparser.add_argument( - "--led_enable", - action="store", - type=boolarg, - default=False, - help=("adds pin holes under switches for leds"), - ) - if add_diode_parameter: - self.argparser.add_argument( - "--diode_enable", - action="store", - type=boolarg, - default=False, - help=("adds pin holes under switches for diodes"), - ) - if add_cutout_type_parameter: - self.argparser.add_argument( - "--cutout_type", - action="store", - type=str, - default="castle", - help=( - "Shape of the plate cutout: 'castle' allows for modding, and 'simple' is a tighter and simpler square" - ), - ) - if default_columns_definition: - self.argparser.add_argument( - "--columns_definition", - type=self.argparseColumnsDefinition, - default=default_columns_definition, - help=( - "Each column is separated by '/', and is in the form 'nb_rows @ offset x repeat_count'. " - "Nb_rows is the number of rows for this column. " - "The offset is in mm and optional. " - "Repeat_count is optional and repeats this column multiple times. " - "Spaces are not important." - "For example '3x2 / 4@11' means we want 3 columns, the two first with " - "3 rows without offset, and the last with 4 rows starting at 11mm high." - ), - ) - - def argparseColumnsDefinition(self, s): - """ - Parse columns definition parameter - - :param s: string to parse - - Each column is separated by '/', and is in the form 'nb_rows @ offset x repeat_count'. - Nb_rows is the number of rows for this column. - The offset is in mm and optional. - Repeat_count is optional and repeats this column multiple times. - Spaces are not important. - For example '3x2 / 4@11' means we want 3 columns, the two first with - 3 rows without offset, and the last with 4 rows starting at 11mm high - """ - result = [] - try: - for column_string in s.split("/"): - m = re.match(r"^\s*(\d+)\s*@?\s*(\d*\.?\d*)(?:\s*x\s*(\d+))?\s*$", column_string) - keys_count = int(m.group(1)) - offset = float(m.group(2)) if m.group(2) else 0 - n = int(m.group(3)) if m.group(3) else 1 - result.extend([(offset, keys_count)]*n) - except: - raise argparse.ArgumentTypeError("Don't understand columns definition string") - - return result - - def pcb_holes( - self, with_hotswap=True, with_pcb_mount=True, with_led=False, with_diode=False - ): - grid_unit = 1.27 - main_hole_size = 4 - pcb_mount_size = 1.7 - led_hole_size = 1 - if with_hotswap: - pin_hole_size = 2.9 - else: - pin_hole_size = 1.5 - - def grid_hole(x, y, d): - self.hole(grid_unit * x, grid_unit * y, d=d) - - # main hole - grid_hole(0, 0, main_hole_size) - - # switch pins - grid_hole(-3, 2, pin_hole_size) - grid_hole(2, 4, pin_hole_size) - - if with_pcb_mount: - grid_hole(-4, 0, pcb_mount_size) - grid_hole(4, 0, pcb_mount_size) - - if with_led: - grid_hole(-1, -4, led_hole_size) - grid_hole(1, -4, led_hole_size) - - if with_diode: - grid_hole(-3, -4, led_hole_size) - grid_hole(3, -4, led_hole_size) - - def apply_callback_on_columns(self, cb, columns_definition, spacing=None, reverse=False): - if spacing is None: - spacing = self.STANDARD_KEY_SPACING - if reverse: - columns_definition = list(reversed(columns_definition)) - - for offset, nb_keys in columns_definition: - self.moveTo(0, offset) - for _ in range(nb_keys): - cb() - self.moveTo(0, spacing) - self.moveTo(spacing, -nb_keys * spacing) - self.moveTo(0, -offset) - - total_width = len(columns_definition) * spacing - self.moveTo(-1 * total_width) - - def outer_hole(self, radius=2, centered=True): - """ - Draws a rounded square big enough to go around a whole switch (15.6mm) - """ - half_size = Keyboard.SWITCH_CASE_SIZE / 2 - if centered: - self.moveTo(-half_size, -half_size) - - # draw clock wise to work with burn correction - straight_edge = Keyboard.SWITCH_CASE_SIZE - 2 * radius - polyline = [straight_edge, (-90, radius)] * 4 - self.moveTo(self.burn, radius, 90) - self.polyline(*polyline) - self.moveTo(0, 0, 270) - self.moveTo(0, -radius) - self.moveTo(-self.burn) - - if centered: - self.moveTo(half_size, half_size) - - def castle_shaped_plate_cutout(self, centered=True): - """ - This cutout shaped like a castle enables switch modding and rotation. - More information (type 4) on https://geekhack.org/index.php?topic=59837.0 - """ - half_size = Keyboard.SWITCH_CASE_SIZE / 2 - if centered: - self.moveTo(-half_size, -half_size) - - # draw clock wise to work with burn correction - btn_half_side = [0.98, 90, 0.81, -90, 3.5, -90, 0.81, 90, 2.505] - btn_full_side = [*btn_half_side, 0, *btn_half_side[::-1]] - btn = [*btn_full_side, -90] * 4 - - self.moveTo(self.burn+0.81, 0.81, 90) - self.polyline(*btn) - self.moveTo(0, 0, 270) - self.moveTo(-self.burn-0.81, -0.81) - - if centered: - self.moveTo(half_size, half_size) - - def configured_plate_cutout(self, support=False): - """ - Choose which cutout to use based on configured type. - - support: if true, not the main cutout, but one to glue against the first - 1.5mm cutout to strengthen it, without the clipping part. - """ - if self.cutout_type.lower() == "castle": - if support: - self.outer_hole() - else: - self.castle_shaped_plate_cutout() - else: - self.simple_plate_cutout(with_notch=support) - - def simple_plate_cutout(self, radius=0.2, with_notch=False): - """ - A simple plate cutout, a 14mm rectangle, as specified in this reference sheet - https://cdn.sparkfun.com/datasheets/Components/Switches/MX%20Series.pdf - - With_notch should be used for a secondary lower plate, strengthening the first one. - A notch is added to let the hooks grasp the main upper plate. - - Current position should be switch center. - - Radius should be lower or equal to 0.3 mm - """ - size = Keyboard.FRAME_CUTOUT - half_size = size / 2 - - if with_notch: - notch_length = 5 - notch_depth = 1 - straight_part = 0.5 * (size - 2 * radius - 2 * notch_depth - notch_length) - - self.moveTo(-half_size + self.burn, 0, 90) - polyline_quarter = [ - half_size - radius, - (-90, radius), - straight_part, - (90, notch_depth / 2), - 0, - (-90, notch_depth / 2), - notch_length / 2, - ] - polyline = ( - polyline_quarter - + [0] - + list(reversed(polyline_quarter)) - + [0] - + polyline_quarter - + [0] - + list(reversed(polyline_quarter)) - ) - self.polyline(*polyline) - self.moveTo(0, 0, -90) - self.moveTo(half_size - self.burn) - else: - self.rectangularHole(0, 0, size, size, r=radius) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keyholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keyholder.py deleted file mode 100644 index fef6eda..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keyholder.py +++ /dev/null @@ -1,185 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class HangerEdge(edges.BaseEdge): - char = "H" - - def margin(self) -> float: - return self.hook_height * 0.7 - - def __call__(self, l, **kw): - # Radius of the bottom part of the hook - radius_outside = self.hook_height * 0.5 - radius_inside = radius_outside - self.hook_thickness - - # Make corners less sharp - radius_burr = 1.5 - - hookInnerHeight = self.hook_height * 0.7 - hookLength = self.hook_height * 0.7 - - # Correct orientation - self.polyline(0, -90) - - # Line bottom - self.edge(hookLength - radius_outside) - - # Outer corner - self.corner(90, radius_outside) - - # Line right - self.edge(hookInnerHeight - radius_outside - self.hook_thickness / 2) - - # Semicircle at top - self.corner(180, self.hook_thickness / 2) - - # Line left-ish - self.edge( - hookInnerHeight - - self.hook_thickness - - self.hook_thickness / 2 - - radius_inside - ) - - # Inner corner - self.corner(-90, radius_inside) - - # Line bottom - self.edge(hookLength - self.hook_thickness - 2 * radius_burr - radius_inside) - self.corner(-90, radius_burr) - - # Line top - self.edge(self.hook_height - self.hook_thickness - 2 * radius_burr) - self.corner(90, radius_burr) - - # Correct orientation - self.polyline(0, -90) - - -class KeyHolder(Boxes): - """Wall organizer with hooks for keys or similar small items""" - - description = """Example for a KeyHolder with a slightly larger backplate and 8 hooks. This uses 6mm plywood for extra stability. - -Closeup: - -![KeyHolder-2](static/samples/KeyHolder-2.jpg) - -Full picture: -""" - - ui_group = "WallMounted" - - def __init__(self) -> None: - Boxes.__init__(self) - self.argparser.add_argument( - "--num_hooks", action="store", type=int, default=7, help="Number of hooks" - ) - self.argparser.add_argument( - "--hook_distance", - action="store", - type=float, - default=20, - help="Distance between hooks", - ) - self.argparser.add_argument( - "--hook_thickness", - action="store", - type=float, - default=5, - help="Thickness of hook", - ) - self.argparser.add_argument( - "--hook_height", - action="store", - type=float, - default=20, - help="Height of back part of hook", - ) - - # Padding around the hooks to define the size of the back plate - self.argparser.add_argument( - "--padding_top", - action="store", - type=float, - default=10, - help="Padding above hooks", - ) - self.argparser.add_argument( - "--padding_left_right", - action="store", - type=float, - default=5, - help="Padding left/right from hooks", - ) - self.argparser.add_argument( - "--padding_bot", - action="store", - type=float, - default=30, - help="Padding below hooks", - ) - - self.argparser.add_argument( - "--mounting", - action="store", - type=boolarg, - default=False, - help="Add mounting holes", - ) - - self.addSettingsArgs( - edges.FingerJointSettings, surroundingspaces=0.0, finger=1.0, space=1.0 - ) - self.addSettingsArgs(edges.MountingSettings) - - def yHoles(self): - """ - Holes for hooks to attach to - """ - posx = 0.5 * self.thickness - posx += self.padding_left_right - for _ in range(self.num_hooks): - self.fingerHolesAt(posx, self.padding_bot, self.hook_height) - posx += self.hook_distance + self.thickness - - def render(self): - self.addPart(HangerEdge(self, 1)) - - # Total height and width of the backplate - h = self.hook_height + self.padding_bot + self.padding_top - w = ( - (self.padding_left_right * 2) - + self.num_hooks * self.thickness - + (self.num_hooks - 1) * self.hook_distance - ) - - # Back plate - self.rectangularWall( - w, - h, - "eeGe" if self.mounting else "eeee", - callback=[self.yHoles, None, None, None], - move="up", - ) - - # Hooks - for _ in range(self.num_hooks): - self.rectangularWall( - self.hook_thickness, self.hook_height, "eHef", move="right" - ) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keypad.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keypad.py deleted file mode 100644 index 1696356..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/keypad.py +++ /dev/null @@ -1,140 +0,0 @@ -"""Generator for keypads with mechanical switches.""" - -from copy import deepcopy - -from boxes import Boxes, boolarg -from boxes.edges import FingerJointSettings - -from .keyboard import Keyboard - - -class Keypad(Boxes, Keyboard): - """Generator for keypads with mechanical switches.""" - - description = "Note that top layers use a different material thickness according to the top1_thickness and top2_thickness (if enabled)." - - ui_group = 'Box' - btn_size = 15.6 - space_between_btn = 4 - box_padding = 10 - triangle = 25.0 - - def __init__(self) -> None: - super().__init__() - self.argparser.add_argument( - '--h', action='store', type=int, default=30, - help='height of the box' - ) - self.argparser.add_argument( - '--top1_thickness', action='store', type=float, default=1.5, - help=('thickness of the button hold layer, cherry like switches ' - 'need 1.5mm or smaller to snap in') - ) - self.argparser.add_argument( - '--top2_enable', action='store', type=boolarg, default=False, - help=('enables another top layer that can hold CPG151101S11 ' - 'hotswap sockets') - ) - self.argparser.add_argument( - '--top2_thickness', action='store', type=float, default=1.5, - help=('thickness of the hotplug layer, CPG151101S11 hotswap ' - 'sockets need 1.2mm to 1.5mm') - ) - - # Add parameter common with other keyboard projects - self.add_common_keyboard_parameters( - # Hotswap already depends on top2_enable setting, a second parameter - # for it would be useless - add_hotswap_parameter=False, - # By default, 3 columns of 4 rows - default_columns_definition="4x3" - ) - - self.addSettingsArgs(FingerJointSettings, surroundingspaces=1) - - def _get_x_y(self): - """Gets the keypad's size based on the number of buttons.""" - spacing = self.btn_size + self.space_between_btn - border = 2*self.box_padding - self.space_between_btn - x = len(self.columns_definition) * spacing + border - y = max(offset + keys * spacing for (offset, keys) in self.columns_definition) + border - return x, y - - def render(self): - """Renders the keypad.""" - # deeper edge for top to add multiple layers - deep_edge = deepcopy(self.edges['f'].settings) - deep_edge.thickness = self.thickness + self.top1_thickness - if self.top2_enable: - deep_edge.thickness += self.top2_thickness - deep_edge.edgeObjects(self, 'gGH', True) - - d1, d2 = 2., 3. - x, y = self._get_x_y() - h = self.h - - # box sides - self.rectangularWall(x, h, "GFEF", callback=[self.wallx_cb], move="right") - self.rectangularWall(y, h, "GfEf", callback=[self.wally_cb], move="up") - self.rectangularWall(y, h, "GfEf", callback=[self.wally_cb]) - self.rectangularWall(x, h, "GFEF", callback=[self.wallx_cb], move="left up") - - # keypad lids - self.rectangularWall(x, y, "ffff", callback=self.to_grid_callback(self.support_hole), move="right") - self.rectangularWall(x, y, "ffff", callback=self.to_grid_callback(self.key_hole), move="up") - if self.top2_enable: - self.rectangularWall(x, y, "ffff", callback=self.to_grid_callback(self.hotplug)) - - # screwable - tr = self.triangle - trh = tr / 3 - self.rectangularWall( - x, y, - callback=[lambda: self.hole(trh, trh, d=d2)] * 4, - move='left up' - ) - self.rectangularTriangle( - tr, tr, "ffe", num=4, - callback=[None, lambda: self.hole(trh, trh, d=d1)] - ) - - def to_grid_callback(self, inner_callback): - def callback(): - # move to first key center - key_margin = self.box_padding + self.btn_size / 2 - self.moveTo(key_margin, key_margin) - self.apply_callback_on_columns( - inner_callback, self.columns_definition, self.btn_size + self.space_between_btn - ) - - return [callback] - - def hotplug(self): - """Callback for the key stabilizers.""" - self.pcb_holes( - with_pcb_mount=self.pcb_mount_enable, - with_diode=self.diode_enable, - with_led=self.led_enable, - ) - - def support_hole(self): - self.configured_plate_cutout(support=True) - - def key_hole(self): - self.configured_plate_cutout() - - # stolen form electronics-box - def wallx_cb(self): - """Callback for triangle holes on x-side.""" - x, _ = self._get_x_y() - t = self.thickness - self.fingerHolesAt(0, self.h - 1.5 * t, self.triangle, 0) - self.fingerHolesAt(x, self.h - 1.5 * t, self.triangle, 180) - - # stolen form electronics-box - def wally_cb(self): - """Callback for triangle holes on y-side.""" - _, y = self._get_x_y() - t = self.thickness - self.fingerHolesAt(0, self.h - 1.5 * t, self.triangle, 0) - self.fingerHolesAt(y, self.h - 1.5 * t, self.triangle, 180) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/lamp.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/lamp.py deleted file mode 100644 index 03ad9ad..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/lamp.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - -""" -22x7.5x7cm -D=23cm, d=21cm -d = 8" D = 9" -""" - - -class RoundedTriangleSettings(edges.Settings): - absolute_params = { - "angle": 60, - "radius": 30, - "r_hole": 0.0, - } - - -class RoundedTriangle(edges.Edge): - char = "t" - - def __call__(self, length, **kw): - angle = self.settings.angle - r = self.settings.radius - - if self.settings.r_hole: - x = 0.5 * (length - 2 * r) * math.tan(math.radians(angle)) - y = 0.5 * (length) - self.hole(x, y, self.settings.r_hole) - - l = 0.5 * (length - 2 * r) / math.cos(math.radians(angle)) - self.corner(90 - angle, r) - self.edge(l) - self.corner(2 * angle, r) - self.edge(l) - self.corner(90 - angle, r) - - def startAngle(self) -> float: - return 90.0 - - def endAngle(self) -> float: - return 90.0 - - -class Lamp(Boxes): - webinterface = False - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser(x=220, y=75, h=70) - self.argparser.add_argument( - "--radius", action="store", type=float, default="105", - help="radius of the lamp") - self.argparser.add_argument( - "--width", action="store", type=float, default="10", - help="width of the ring") - - def side(self, y, h): - return - self.edges["f"](y) - self.corner(90) - self.edges["f"](h) - self.roundedTriangle(y, 75, 25) - self.edges["f"](h) - self.corner(90) - - def render(self): - """ - r : radius of lamp - w : width of surrounding ring - x : length box - y : width box - h : height box - """ - - - # self.edges["f"].settings = (5, 5) # XXX - - x, y, h = self.x, self.y, self.h - r, w = self.radius, self.width - - s = RoundedTriangleSettings(self.thickness, angle=72, r_hole=2) - self.addPart(RoundedTriangle(self, s)) - - self.flexSettings = (3, 5.0, 20.0) - - self.edges["f"].settings.setValues(self.thickness, finger=5, space=5, relative=False) - d = 2 * (r + w) - - self.roundedPlate(d, d, r, move="right", callback=[ - lambda: self.hole(w, r + w, r), ]) - - # dist = ((2**0.5)*r-r) / (2**0.5) + 4 - # pos = (w-dist, dist) - self.roundedPlate(d, d, r, holesMargin=w / 2.0) # , callback=[ - # lambda: self.hole(pos[0], pos[1], 7),]) - self.roundedPlate(d, d, r, move="only left up") - - hole = lambda: self.hole(w, 70, 2) - self.surroundingWall(d, d, r, 120, top='h', bottom='h', callback=[ - None, hole, None, hole], move="up") - - with self.saved_context(): - self.rectangularWall(x, y, edges="fFfF", holesMargin=5, move="right") - self.rectangularWall(x, y, edges="fFfF", holesMargin=5, move="right") - # sides - self.rectangularWall(y, h, "fftf", move="right") - self.rectangularWall(y, h, "fftf") - - self.rectangularWall(x, y, edges="fFfF", holesMargin=5, - move="up only") - - self.rectangularWall(x, h, edges='hFFF', holesMargin=5, move="right") - self.rectangularWall(x, h, edges='hFFF', holesMargin=5) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laptopstand.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laptopstand.py deleted file mode 100644 index f977970..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laptopstand.py +++ /dev/null @@ -1,200 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from math import * - -from boxes import * - - -class LaptopStand(Boxes): # Change class name! - """A simple X shaped frame to support a laptop on a given angle""" - - ui_group = "Misc" # see ./__init__.py for names - - def __init__(self) -> None: - Boxes.__init__(self) - - self.argparser.add_argument( - "--l_depth", - action="store", - type=float, - default=250, - help="laptop depth - front to back (mm)", - ) - self.argparser.add_argument( - "--l_thickness", - action="store", - type=float, - default=10, - help="laptop thickness (mm)", - ) - self.argparser.add_argument( - "--angle", - action="store", - type=float, - default=15, - help="desired tilt of keyboard (deg)", - ) - self.argparser.add_argument( - "--ground_offset", - action="store", - type=float, - default=10, - help="desired height between bottom of laptop and ground at lowest point (front of laptop stand)", - ) - self.argparser.add_argument( - "--nub_size", - action="store", - type=float, - default=10, - help="desired thickness of the supporting edge", - ) - - def render(self): - calcs = self.perform_calculations() - - self.laptopstand_triangles(calcs, move="up") - - def perform_calculations(self): - # a - angle_rads_a = math.radians(self.angle) - - # h - height = self.l_depth * math.sin(angle_rads_a) - - # y - base = sqrt(2) * self.l_depth * math.cos(angle_rads_a) - - # z - hyp = self.l_depth * sqrt(math.pow(math.cos(angle_rads_a), 2) + 1) - - # b - angle_rads_b = math.atan(math.tan(angle_rads_a) / math.sqrt(2)) - - # g - base_extra = ( - 1 - / math.cos(angle_rads_b) - * (self.nub_size - self.ground_offset * math.sin(angle_rads_b)) - ) - - # x - lip_outer = ( - self.ground_offset / math.cos(angle_rads_b) - + self.l_thickness - - self.nub_size * math.tan(angle_rads_b) - ) - - bottom_slot_depth = (height / 4) + (self.ground_offset / 2) - - top_slot_depth_big = ( - height / 4 + self.ground_offset / 2 + (self.thickness * height) / (2 * base) - ) - - top_slot_depth_small = ( - height / 4 + self.ground_offset / 2 - (self.thickness * height) / (2 * base) - ) - - half_hyp = (hyp * (base - self.thickness)) / (2 * base) - - return dict( - height=height, - base=base, - hyp=hyp, - angle=math.degrees(angle_rads_b), - base_extra=base_extra, - lip_outer=lip_outer, - bottom_slot_depth=bottom_slot_depth, - top_slot_depth_small=top_slot_depth_small, - top_slot_depth_big=top_slot_depth_big, - half_hyp=half_hyp, - ) - - def laptopstand_triangles(self, calcs, move=None): - tw = calcs["base"] + self.spacing + 2 * (calcs["base_extra"] + math.sin(math.radians(calcs["angle"]))*(calcs["lip_outer"]+1)) - th = calcs["height"] + 2 * self.ground_offset + self.spacing - - if self.move(tw, th, move, True): - return - self.moveTo(calcs["base_extra"]+self.spacing + math.sin(math.radians(calcs["angle"]))*(calcs["lip_outer"]+1)) - self.draw_triangle(calcs, top=False) - self.moveTo(calcs["base"] - self.spacing, - th, 180) - self.draw_triangle(calcs, top=True) - - self.move(tw, th, move) - - @restore - def draw_triangle(self, calcs, top): - # Rear end - self.moveTo(0, calcs["height"] + self.ground_offset, -90) - - self.edge(calcs["height"] + self.ground_offset) - self.corner(90) - - foot_length = 10 + self.nub_size - - base_length_without_feet = ( - calcs["base"] - foot_length * 2 - 7 # -7 to account for extra width gained by 45deg angles - ) - - if top: - # Bottom without slot - self.polyline( - foot_length, 45, - 5, -45, - base_length_without_feet, -45, - 5, 45, - foot_length + calcs["base_extra"], 0, - ) - else: - # Bottom with slot - self.polyline( - foot_length, 45, - 5, -45, - (base_length_without_feet - self.thickness) / 2, 90, - calcs["bottom_slot_depth"] - 3.5, -90, - self.thickness, -90, - calcs["bottom_slot_depth"] - 3.5, 90, - (base_length_without_feet - self.thickness) / 2, -45, - 5, 45, - foot_length + calcs["base_extra"], 0, - ) - - # End nub - self.corner(90 - calcs["angle"]) - self.edge(calcs["lip_outer"]) - self.corner(90, 1) - self.edge(self.nub_size - 2) - self.corner(90, 1) - self.edge(self.l_thickness) - self.corner(-90) - - if top: - # Top with slot - self.edge(calcs["half_hyp"]) - self.corner(90 + calcs["angle"]) - self.edge(calcs["top_slot_depth_small"]) - self.corner(-90) - self.edge(self.thickness) - self.corner(-90) - self.edge(calcs["top_slot_depth_big"]) - self.corner(90 - calcs["angle"]) - self.edge(calcs["half_hyp"]) - else: - # Top without slot - self.edge(calcs["hyp"]) - - self.corner(90 + calcs["angle"]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laserclamp.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laserclamp.py deleted file mode 100644 index 5370a4e..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laserclamp.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class LaserClamp(Boxes): - """A clamp to hold down material to a knife table""" - - description = """You need a tension spring of the proper length to make the clamp work. -Increase extraheight to get more space for the spring and to make the -sliding mechanism less likely to bind. You may need to add some wax on the -parts sliding on each other to reduce friction. -""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=0) - self.argparser.add_argument( - "--minheight", action="store", type=float, default=25., - help="minimal clamping height in mm") - self.argparser.add_argument( - "--maxheight", action="store", type=float, default=50., - help="maximal clamping height in mm") - self.argparser.add_argument( - "--extraheight", action="store", type=float, default=0., - help="extra height to make operation smoother in mm") - - def topPart(self, l, move=None): - t = self. thickness - - tw, th = 12*t, l+4*t - - if self.move(tw, th, move, True): - return - - self.moveTo(8*t, 0) - self.rectangularHole(t, 2*t+l/2, 1.05*t, l) - self.polyline(2*t, (90, t), l+1.5*t, (-90, 0.5*t), - 2*t, -90, 0, (180, 0.5*t), 0, - (90, 1.5*t), 9*t, - (180, 4*t), 2*t, (-90, t)) - self.hole(-5*t, -3*t, 2.5*t) - self.polyline(l-5.5*t, (90, t)) - self.move(tw, th, move) - - def bottomPart(self, h_min, h_extra, move=None): - t = self. thickness - - tw, th = 14*t, h_min+4*t - - if self.move(tw, th, move, True): - return - - ls = t/2*(2**.5) - self.moveTo(2*t, 0) - self.fingerHolesAt(3*t, 2*t, h_min+h_extra, 90) - if h_extra: - self.polyline(4*t, (90,t), h_extra-2*t, (-90, t)) - else: - self.polyline(6*t) - self.polyline(4*t, (90, 2*t), 3*t, 135, 2*ls, 45, 1*t, -90, 6*t, -90) - - self.polyline(h_min, (90, t), 2*t, (90, t), - h_min+h_extra-0*t, (-90, t), t, (180, t), - 0, 90, 0, (-180, 0.5*t), 0 , 90) - - self.move(tw, th, move) - - def render(self): - t = self. thickness - h_max, h_min, h_extra = self.maxheight, self.minheight,self.extraheight - - if h_extra and h_extra < 2*t: - h_extra = 2*t - - self.topPart(h_max+h_extra, move="right") - self.bottomPart(h_min, h_extra, move="right") - self.roundedPlate(4*t, h_min+h_extra+4*t, edge="e", r=t, - extend_corners=False, move="right", - callback=[lambda: self.fingerHolesAt(1*t, 2*t, h_min+h_extra)]) - self.rectangularWall(1.1*t, h_min+h_extra, "efef") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laserholdfast.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laserholdfast.py deleted file mode 100644 index cd293a6..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/laserholdfast.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class LaserHoldfast(Boxes): - """A holdfast for honey comb tables of laser cutters""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.buildArgParser(x=25, h=40) - self.argparser.add_argument( - "--hookheight", action="store", type=float, default=5.0, - help="height of the top hook") - self.argparser.add_argument( - "--shaftwidth", action="store", type=float, default=5.0, - help="width of the shaft") - - def render(self): - # adjust to the variables you want in the local scope - x, hh, h, sw = self.x, self.hookheight, self.h, self.shaftwidth - t = self.thickness - - a = 30 - r = x/math.radians(a) - - self.polyline(hh+h, (180, sw/2), h, -90+a/2, 0, (-a, r), 0, (180, hh/2), 0, (a, r+hh), 0 , -a/2, sw-math.sin(math.radians(a/2))*hh , 90) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/lbeam.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/lbeam.py deleted file mode 100644 index d360b3e..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/lbeam.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class LBeam(Boxes): - """Simple L-Beam: two pieces joined with a right angle""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser("x", "y", "h", "outside") - self.addSettingsArgs(edges.FingerJointSettings) - - def render(self): - x, y, h = self.x, self.y, self.h - t = self.thickness - - if self.outside: - x = self.adjustSize(x, False) - y = self.adjustSize(y, False) - - - - self.rectangularWall(x, h, "eFee", move="right") - self.rectangularWall(y, h, "eeef") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/magazinefile.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/magazinefile.py deleted file mode 100644 index 7716901..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/magazinefile.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.lids import _TopEdge - - -class MagazineFile(Boxes): - """Open magazine file""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser(x=100, y=200, h=300, hi=0, outside=False) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.MountingSettings, margin=0, num=1) - self.argparser.add_argument( - "--top_edge", action="store", - type=ArgparseEdgeType("eG"), choices=list("eG"), - default="e", help="edge type for top edge") - - def side(self, w, h, hi, top_edge): - r = min(h - hi, w) / 2.0 - - if (h - hi) > w: - r = w / 2.0 - lx = 0 - ly = (h - hi) - w - else: - r = (h - hi) / 2.0 - lx = (w - 2 * r) / 2.0 - ly = 0 - - top_edge = self.edges.get(top_edge, top_edge) - - e_w = self.edges["F"].startwidth() - self.moveTo(3, 3) - self.edge(e_w) - self.edges["F"](w) - self.edge(e_w) - self.corner(90) - self.edge(e_w) - self.edges["F"](hi) - self.corner(90) - self.edge(e_w) - top_edge(lx) - self.corner(-90, r) - self.edge(ly) - self.corner(90, r) - top_edge(lx) - self.edge(e_w) - self.corner(90) - self.edges["F"](h) - self.edge(e_w) - self.corner(90) - - def render(self): - - if self.outside: - self.x = self.adjustSize(self.x) - self.y = self.adjustSize(self.y) - self.h = self.adjustSize(self.h, e2=False) - - x, y, h, = self.x, self.y, self.h - self.hi = hi = self.hi or (h / 2.0) - t = self.thickness - t1, t2, t3, t4 = _TopEdge.topEdges(self, self.top_edge) - - - with self.saved_context(): - self.rectangularWall(x, h, ["F", "f", t2, "f"], move="up") - self.rectangularWall(x, hi, "Ffef", move="up") - self.rectangularWall(x, y, "ffff") - - self.rectangularWall(x, h, "Ffef", move="right only") - self.side(y, h, hi, t1) - self.moveTo(y + 15, h + hi + 15, 180) - self.side(y, h, hi, t3) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/makitapowersupply.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/makitapowersupply.py deleted file mode 100644 index 949ce06..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/makitapowersupply.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class MakitaPowerSupply(Boxes): - """Bench power supply powered with Maktia 18V battery or laptop power supply""" - - description = """ -Vitamins: DSP5005 (or similar) power supply, two banana sockets, two 4.8mm flat terminals with flat soldering tag - -To allow powering by laptop power supply: flip switch, Lenovo round socket (or adjust right hole for different socket) -""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - - self.argparser.add_argument("--banana_socket_diameter", action="store", - type=float, default=8.0, - help="diameter of the banana socket mounting holes") - - self.argparser.add_argument("--flipswitch_diameter", action="store", - type=float, default=6.3, - help="diameter of the flipswitch mounting hole") - - - def side(self, l, h=14, move=None): - t = self.thickness - tw, th = h+t, l - - if self.move(tw, th, move, True): - return - - self.moveTo(t, 0) - self.polyline(h, 90, l-h/3**0.5, 60, h*2/3**0.5, 120) - self.edges["f"](l) - - self.move(tw, th, move) - - def side2(self, l, h=14, move=None): - t = self.thickness - tw, th = h, l-10 - - if self.move(tw, th, move, True): - return - - if h > 14: - self.polyline(h, 90, l-12, 90, h-14, 90, 50-12, -90, 8, -90) - else: - self.polyline(h, 90, l-50, 90, h-6, -90) - self.polyline(11, 90, 1, -90, 27, (90, 1), - 3, (90, 1), l-12, 90) - - self.move(tw, th, move) - - - def bottom(self): - t = self.thickness - m = self.x / 2 - - self.fingerHolesAt(m-30.5-0.5*t, 10, self.l) - self.fingerHolesAt(m+30.5+0.5*t, 10, self.l) - - self.rectangularHole(m-19, 10+34, 0.8, 6.25) - self.rectangularHole(m+19, 10+34, 0.8, 6.25) - - self.rectangularHole(m, 7.5, 35, 5) - - def front(self): - d_b = self.banana_socket_diameter - d_f = self.flipswitch_diameter - - self.hole(10, self.h/2, d=d_b) - self.hole(30, self.h/2, d=d_b) - self.hole(50, self.h/2, d=d_f) - - self.rectangularHole(76, 6.4, 12.4, 12.4) - - def back(self): - n = int((self.h-2*self.thickness) // 8) - offs = (self.h - n*8.0) / 2 + 4 - for i in range(n): - self.rectangularHole(self.x/2, i*8+offs, self.x-20, 5, r=2.5) - - def regulatorCB(self): - self.rectangularHole(21, 9.5, 35, 5) - self.rectangularHole(5, 33+12, 10, 10) - self.rectangularHole(42-5, 33+12, 10, 10) - - for x in [3.5, 38.5]: - for y in [3.5, 65]: - self.hole(x, y, 1.0) - - def render(self): - # adjust to the variables you want in the local scope - t = self.thickness - - l = self.l = 64 - hm = 15.5 - - self.x, self.y, self.h = x, y, h = 85, 75, 35 - - self.rectangularWall(x, h, "FFFF", callback=[self.front], move="right") - self.rectangularWall(y, h, "FfFf", move="up") - self.rectangularWall(y, h, "FfFf") - self.rectangularWall(x, h, "FFFF", callback=[self.back], move="left up") - - self.rectangularWall(x, y, "ffff", callback=[self.bottom], move="right") - self.rectangularWall(x, y, "ffff", callback=[ - lambda: self.rectangularHole(x/2, y-20-5, 76, 40)], move="") - self.rectangularWall(x, y, "ffff", move="left up only") - - self.side(l, hm, move="right") - self.side(l, hm, move="right mirror") - self.side2(l, hm, move="right") - self.side2(l, hm, move="right mirror") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/microrack.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/microrack.py deleted file mode 100644 index 92cd3f4..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/microrack.py +++ /dev/null @@ -1,199 +0,0 @@ -# Copyright (C) 2019 Gabriel Morell -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import Boxes, boolarg, edges - - -class SBCMicroRack(Boxes): - """Stackable rackable racks for SBC Pi-Style Computers""" - - webinterface = True - ui_group = "Shelf" # see ./__init__.py for names - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.StackableSettings) - - self.buildArgParser(x=56, y=85) - - # count - self.argparser.add_argument( - "--sbcs", action="store", type=int, default=5, - help="how many slots for sbcs", - ) - - # spaces - self.argparser.add_argument( - "--clearance_x", action="store", type=int, default=3, - help="clearance for the board in the box (x) in mm" - ) - self.argparser.add_argument( - "--clearance_y", action="store", type=int, default=3, - help="clearance for the board in the box (y) in mm" - ) - self.argparser.add_argument( - "--clearance_z", action="store", type=int, default=28, - help="SBC Clearance in mm", - ) - - # mounting holes - self.argparser.add_argument( - "--hole_dist_edge", action="store", type=float, default=3.5, - help="hole distance from edge in mm" - ) - self.argparser.add_argument( - "--hole_grid_dimension_x", action="store", type=int, default=58, - help="width of x hole area" - ) - self.argparser.add_argument( - "--hole_grid_dimension_y", action="store", type=int, default=49, - help="width of y hole area" - ) - self.argparser.add_argument( - "--hole_diameter", action="store", type=float, default=2.75, - help="hole diameters" - ) - - # i/o holes - self.argparser.add_argument( - "--netusb_z", action="store", type=int, default=18, - help="height of the net/usb hole mm" - ) - self.argparser.add_argument( - "--netusb_x", action="store", type=int, default=53, - help="width of the net/usb hole in mm" - ) - - # features - self.argparser.add_argument( - "--stable", action='store', type=boolarg, default=False, - help="draw some holes to put a 1/4\" dowel through at the base and top" - ) - self.argparser.add_argument( - "--switch", action='store', type=boolarg, default=False, - help="adds an additional vertical segment to hold the switch in place, works best w/ --stable" - ) - # TODO flesh this idea out better - #self.argparser.add_argument( - # "--fan", action='store', type=int, default=0, required=False, - # help="ensure that the x width is at least this much and as well, draw a snug holder for a fan someplace" - # ) - - - def paint_mounting_holes(self): - cy = self.clearance_y - cx = self.clearance_x - - h2r = self.hole_diameter - hde = self.hole_dist_edge - hgdx = self.hole_grid_dimension_x - hgdy = self.hole_grid_dimension_y - - self.hole( - h2r + cx + hde / 2, - h2r + cy + hde / 2, - h2r / 2 - ) - - self.hole( - h2r + cx + hgdx + hde / 2, - h2r + cy + hde / 2, - h2r / 2 - ) - - self.hole( - h2r + cx + hde / 2, - h2r + cy + hgdy + hde / 2, - h2r / 2 - ) - - self.hole( - h2r + cx + hgdx + hde / 2, - h2r + cy + hgdy + hde / 2, - h2r / 2 - ) - - def paint_stable_features(self): - if self.stable: - self.hole( - 10, 10, d=6.5 - ) - - def paint_netusb_holes(self): - t = self.thickness - x = self.x - w = x + self.hole_dist_edge * 2 - height_per = self.clearance_z + t - usb_height = self.netusb_z - usb_width = self.netusb_x - for i in range(self.sbcs): - self.rectangularHole(w/2, (height_per)*i+15 , usb_width, usb_height, r=1) - - def paint_finger_holes(self): - t = self.thickness - height_per = self.clearance_z + t - for i in range(self.sbcs): - self.fingerHolesAt((height_per) * i + +height_per/2 + 1.5, self.hole_dist_edge, self.x, 90) - - def render(self): - # adjust to the variables you want in the local scope - x, y = self.x, self.y - t = self.thickness - - height_per = self.clearance_z + t - height_total = self.sbcs * height_per - - # render your parts here - - with self.saved_context(): - self.rectangularWall(height_total + height_per/2, - x + self.hole_dist_edge * 2, - "eseS", - callback=[self.paint_finger_holes, - self.paint_netusb_holes], - move="up") - - self.rectangularWall(height_total + height_per/2, - x + self.hole_dist_edge * 2, - "eseS", - callback=[self.paint_finger_holes, - self.paint_stable_features], - move="up") - - if self.switch: - self.rectangularWall(height_total + height_per / 2, - x + self.hole_dist_edge * 2, - "eseS", - callback=[self.paint_stable_features], - move="up") - - self.rectangularWall(height_total + height_per/2, - x + self.hole_dist_edge * 2, - "eseS", - move="right only") - - self.rectangularWall(y + self.hole_dist_edge * 2, - x + self.hole_dist_edge * 2, - "efef", - move="up") - - for i in range(self.sbcs): - self.rectangularWall(y + self.hole_dist_edge * 2, - x + self.hole_dist_edge * 2, - "efef", - callback=[self.paint_mounting_holes], - move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/nemamount.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/nemamount.py deleted file mode 100644 index 6ccc4d2..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/nemamount.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) 2013-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class NemaMount(Boxes): - """Mounting bracket for a Nema motor""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.argparser.add_argument( - "--size", action="store", type=int, default=8, - choices=list(sorted(self.nema_sizes.keys())), - help="Nema size of the motor") - - def render(self): - motor, flange, holes, screws = self.nema_sizes.get( - self.size, self.nema_sizes[8]) - t = self.thickness - - x = y = h = motor + 2*t - - - self.rectangularWall(x, y, "ffef", callback=[ - lambda: self.NEMA(self.size, x/2, y/2)], move="right") - self.rectangularTriangle(x, h, "fFe", num=2, move="right") - self.rectangularWall(x, h, "FFeF", callback=[ - - lambda:self.rectangularHole((x-holes)/2, y/2, screws, holes, - screws/2), - None, - lambda:self.rectangularHole((x-holes)/2, y/2, screws, holes, - screws/2)], - move="right") - self.moveTo(t, 0) - self.fingerHolesAt(0.5*t, t, x, 90) - self.fingerHolesAt(1.5*t+x, t, x, 90) - self.fingerHolesAt(t, 0.5*t, x, 0) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/nemapattern.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/nemapattern.py deleted file mode 100644 index 0976f66..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/nemapattern.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (C) 2013-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class NemaPattern(Boxes): - """Mounting holes for a Nema motor""" - - ui_group = "Holes" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.argparser.add_argument( - "--size", action="store", type=int, default=8, - choices=list(sorted(self.nema_sizes.keys())), - help="Nema size of the motor") - self.argparser.add_argument( - "--screwholes", action="store", type=float, default=0.0, - help="Size of the screw holes in mm - 0 for default size") - - def render(self): - motor, flange, holes, screws = self.nema_sizes.get( - self.size, self.nema_sizes[8]) - - self.NEMA(self.size, motor/2, motor/2, screwholes=self.screwholes) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/notesholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/notesholder.py deleted file mode 100644 index 90c6161..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/notesholder.py +++ /dev/null @@ -1,178 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.edges import CompoundEdge, Edge - - -class USlotEdge(Edge): - - def __init__(self, boxes, settings, edge="f"): - super().__init__(boxes, settings) - self.e = edge - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - l = length - o = self.settings - d = length * (1-o/100) / 2 - r = min(3*self.thickness, (l-2*d)/2) - self.edges[self.e](d) - self.step(-self.edges[self.e].endwidth()) - self.polyline(0, 90, 0, (-90, r), l-2*d-2*r, (-90, r), 0, 90) - self.step(self.edges[self.e].startwidth()) - self.edges[self.e](d) - - def margin(self) -> float: - return self.edges[self.e].margin() - - def startwidth(self): - return self.edges[self.e].startwidth() - -class HalfStackableEdge(edges.StackableEdge): - - char = 'H' - - def __call__(self, length, **kw): - s = self.settings - r = s.height / 2.0 / (1 - math.cos(math.radians(s.angle))) - l = r * math.sin(math.radians(s.angle)) - p = 1 if self.bottom else -1 - - if self.bottom: - self.boxes.fingerHolesAt(0, s.height + self.settings.holedistance + 0.5 * self.boxes.thickness, - length, 0) - - self.boxes.edge(s.width, tabs=1) - self.boxes.corner(p * s.angle, r) - self.boxes.corner(-p * s.angle, r) - self.boxes.edge(length - 1 * s.width - 2 * l) - - def endwidth(self) -> float: - return self.settings.holedistance + self.settings.thickness - -class NotesHolder(Boxes): - """Box for holding a stack of paper, coasters etc""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1) - self.addSettingsArgs(edges.StackableSettings) - self.buildArgParser(sx="78*1", y=78, h=35) - self.argparser.add_argument( - "--bottom_edge", action="store", - type=ArgparseEdgeType("Fhsfe"), choices=list("Fhsfe"), - default="s", - help="edge type for bottom edge") - self.argparser.add_argument( - "--opening", action="store", type=float, default=40, - help="percent of front (or back) that's open") - self.argparser.add_argument( - "--back_openings", action="store", type=boolarg, default=False, - help="have openings on the back side, too") - - def fingerHoleCB(self, lengths, height, posy=0.0): - def CB(): - t = self.thickness - px = -0.5 * t - for x in lengths[:-1]: - px += x + t - self.fingerHolesAt(px, posy, height, 90) - return CB - - def render(self): - sx, y, h = self.sx, self.y, self.h - t = self.thickness - - x = sum(sx) + (len(sx) - 1) * t - - o = max(0, min(self.opening, 100)) - sides = x * (1-o/100) / 2 - - b = self.edges.get(self.bottom_edge, self.edges["F"]) - if self.bottom_edge == "s": - b2 = HalfStackableEdge(self, self.edges["s"].settings, - self.edges["f"].settings) - b3 = self.edges["h"] - else: - b2 = b - b3 = b - - b4 = Edge(self, None) - b4.startwidth = lambda: b3.startwidth() - - - for side in range(2): - with self.saved_context(): - self.rectangularWall(y, h, [b, "F", "e", "F"], - ignore_widths=[1, 6], move="right") - # front walls - if self.opening == 0.0 or (side and not self.back_openings): - self.rectangularWall(x, h, [b, "f", "e", "f"], - ignore_widths=[1, 6], move="right") - else: - self.rectangularWall(sx[0] * (1-o/100) / 2, h, - [b2, "e", "e", "f"], - ignore_widths=[1, 6], move="right") - for ix in range(len(sx)-1): - left = sx[ix] * (1-o/100) / 2 - right = sx[ix+1] * (1-o/100) / 2 - h_e = t - bottom_edge = CompoundEdge( - self, [b3, b4, b3], [left, t, right]) - self.rectangularWall( - left+right+t, h, - [bottom_edge, "e", "e", "e"], - callback=[lambda: self.fingerHolesAt(left+t/2, 0, h, 90)], - move="right") - - self.rectangularWall(sx[-1] * (1-o/100) / 2, h, - [b2, "e", "e", "f"], - ignore_widths=[1, 6], - move="right mirror") - - self.rectangularWall(x, h, [b, "F", "e", "F"], - ignore_widths=[1, 6], move="up only") - # hack to have it reversed in second go and then back to normal - sx = list(reversed(sx)) - - # bottom - if self.bottom_edge != "e": - outer_edge = "h" if self.bottom_edge == "f" else "f" - font_edge = back_edge = outer_edge - u_edge = USlotEdge(self, o, outer_edge) - outer_width = self.edges[outer_edge].startwidth() - if self.opening > 0.0: - front_edge = CompoundEdge( - self, - ([u_edge, edges.OutSetEdge(self, outer_width)]*len(sx))[:-1], - ([l for x in sx for l in (x, t)])[:-1]) - if self.opening > 0.0 and self.back_openings: - back_edge = CompoundEdge( - self, - ([u_edge, edges.OutSetEdge(self, outer_width)]*len(sx))[:-1], - ([l for x in reversed(sx) for l in (x, t)])[:-1]) - - self.rectangularWall( - x, y, - [front_edge, outer_edge, back_edge, outer_edge], - callback=[self.fingerHoleCB(sx, y)], - move="up") - # innner walls - for i in range(len(sx)-1): - self.rectangularWall( - y, h, ("e" if self.bottom_edge=="e" else "f") + "fef", - move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/openbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/openbox.py deleted file mode 100644 index 5fd0c72..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/openbox.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class OpenBox(Boxes): - """Box with top and front open""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--edgetype", action="store", - type=ArgparseEdgeType("Fh"), choices=list("Fh"), - default="F", - help="edge type") - self.addSettingsArgs(edges.FingerJointSettings) - - def render(self): - x, y, h = self.x, self.y, self.h - t = self.thickness - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y, False) - h = self.adjustSize(h, False) - - e = self.edgetype - self.rectangularWall(x, h, [e, e, "e", e], move="right") - self.rectangularWall(y, h, [e, "e", "e", "f"], move="up") - self.rectangularWall(y, h, [e, "e", "e", "f"]) - self.rectangularWall(x, y, "efff", move="left") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/organpipe.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/organpipe.py deleted file mode 100644 index 39e1e2d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/organpipe.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (C) 2013-2018 Florian Festi -# -# Based on pipecalc by Christian F. Coors -# https://github.com/ccoors/pipecalc -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from math import * - -from boxes import * - -pitches = ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#' ,'b'] - -pressure_units = { 'Pa' : 1.0, - 'mBar' : 100., - 'mmHg' : 133.322, - 'mmH2O' : 9.80665, -} - -class OrganPipe(Boxes): # Change class name! - """Rectangular organ pipe based on pipecalc""" - - ui_group = "Unstable" # see ./__init__.py for names - - def getFrequency(self, pitch, octave, base_freq=440): - steps = pitches.index(pitch) + (octave-4)*12 - 9 - return base_freq * 2**(steps/12.) - - def getRadius(self, pitch, octave, intonation): - steps = pitches.index(pitch) + (octave-2)*12 + intonation - return 0.5 * 0.15555 * 0.957458**steps - - def getAirSpeed(self, wind_pressure, air_density=1.2): - return (2.0 * (wind_pressure / air_density))**.5 - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, finger=3.0, space=3.0, - surroundingspaces=1.0) - - """ - air_temperature: f64, -""" - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--pitch", action="store", type=str, default="c", - choices=pitches, - help="pitch") - self.argparser.add_argument( - "--octave", action="store", type=int, default=2, - help="Octave in International Pitch Notation (2 == C)") - self.argparser.add_argument( - "--intonation", action="store", type=float, default=2.0, - help="Intonation Number. 2 for max. efficiency, 3 max.") - self.argparser.add_argument( - "--mouthratio", action="store", type=float, default=0.25, - help="mouth to circumference ratio (0.1 to 0.45). Determines the width to depth ratio") - self.argparser.add_argument( - "--cutup", action="store", type=float, default=0.3, - help="Cutup to mouth ratio") - self.argparser.add_argument( - "--mensur", action="store", type=int, default=0, - help="Distance in halftones in the Normalmensur by Töpfer") - self.argparser.add_argument( - "--windpressure", action="store", type=float, default=588.4, - help="uses unit selected below") - self.argparser.add_argument( - "--windpressure_units", action="store", type=str, default='Pa', - choices=pressure_units.keys(), - help="in Pa") - self.argparser.add_argument( - "--stopped", action="store", type=boolarg, default=False, - help="pipe is closed at the top") - - - def render(self): - t = self.thickness - f = self.getFrequency(self.pitch, self.octave, 440) - - self.windpressure *= pressure_units.get(self.windpressure_units, 1.0) - - speed_of_sound = 343.6 # XXX util::speed_of_sound(self.air_temperature); // in m/s - air_density = 1.2 - air_speed = self.getAirSpeed(self.windpressure, air_density) - - i = self.intonation - radius = self.getRadius(self.pitch, self.octave, i) * 1000 - cross_section = pi * radius**2 - circumference = pi * radius * 2.0 - mouth_width = circumference * self.mouthratio - mouth_height = mouth_width * self.cutup - mouth_area = mouth_height * mouth_width - pipe_depth = cross_section / mouth_width - base_length = max(mouth_width, pipe_depth) - - jet_thickness = (f**2 * i**2 * (.01 * mouth_height)**3) / air_speed**2 - sound_power = (0.001 * pi * (air_density / speed_of_sound) * f**2 - * (1.7 * (jet_thickness * speed_of_sound * f * mouth_area * mouth_area**.5)**.5)**2) - - air_consumption_rate = air_speed * mouth_width * jet_thickness * 1E6 - - wavelength = speed_of_sound / f * 1000 - - if self.stopped: - theoretical_resonator_length = wavelength / 4.0 - resonator_length = (-0.73 * (f * cross_section *1E-6 - 0.342466 * speed_of_sound * mouth_area**.5 * 1E-3) - / (f * mouth_area**.5 * 1E-3)) - else: - theoretical_resonator_length = wavelength / 2.0 - resonator_length = (-0.73 * (f * cross_section * 1E-6 + 0.465753 * f * mouth_area**.5 * cross_section**.5 * 1E-6 - 0.684932 * speed_of_sound * mouth_area**.5 * 1E-3) - / (f * mouth_area**.5 * 1E-3)) * 1E3 - air_hole_diameter = 2.0 * ((mouth_width * jet_thickness * 10.0)**.5 / pi) - - total_length = resonator_length + base_length - - - e = ["f", "e", - edges.CompoundEdge(self, "fef", (resonator_length - mouth_height - 10*t, mouth_height + 10*t, base_length)), "f"] - - self.rectangularWall(total_length, pipe_depth, e, callback=[ - lambda: self.fingerHolesAt(base_length-0.5*t, 0, pipe_depth-jet_thickness)], - move="up") - self.rectangularWall(total_length, pipe_depth, e, callback=[ - lambda: self.fingerHolesAt(base_length-0.5*t, 0, pipe_depth-jet_thickness)], - move="up") - self.rectangularWall(total_length, mouth_width, "FeFF", callback=[ - lambda: self.fingerHolesAt(base_length-0.5*t, 0, mouth_width)], - move="up") - e = [edges.CompoundEdge(self, "EF", (t*10, resonator_length - mouth_height - t*10)), 'e', - edges.CompoundEdge(self, "FE", (resonator_length - mouth_height - t*10, t*10)), 'e'] - self.rectangularWall(resonator_length - mouth_height, mouth_width, e, move="up") - self.rectangularWall(base_length, mouth_width, "FeFF", move="right") - self.rectangularWall(mouth_width, pipe_depth, "fFfF", callback=[ - lambda:self.hole(mouth_width/2, pipe_depth/2, d=air_hole_diameter)], move="right") - self.rectangularWall(mouth_width, pipe_depth - jet_thickness, "ffef", move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottobody.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottobody.py deleted file mode 100644 index 4b15c85..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottobody.py +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -try: - from gettext import gettext as _ -except ImportError: - def _(message: str) -> str: - return message - -from boxes import * - - -class OttoBody(Boxes): - """Otto LC - a laser cut chassis for Otto DIY - body""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.ChestHingeSettings) - - - def bottomCB(self): - self.hole(6, self.y/2, 6) - self.hole(6, self.y/2-6, 3) - self.hole(self.x-6, self.y/2, 6) - self.hole(self.x-6, self.y/2-6, 3) - - #self.rectangularHole(20, self.y/2, 4, 30, 1.5) - #self.rectangularHole(self.x-20, self.y/2, 4, 30, 1.5) - self.rectangularHole(self.x/2, self.y/2, 10, 5, 1.5) - - # switch - self.rectangularHole(self.x-7, self.y-2.8, 7, 4) - - self.moveTo(0, self.y-12) - self.hexHolesCircle(12, HexHolesSettings( - self, diameter=2, distance=2, style='circle')) - - def leftBottomCB(self): - self.hole(7, self.y-7, 6) - - self.hole(6, self.y/2+9, 0.9) - self.rectangularHole(6, self.y/2-5.5, 12, 23) - self.hole(6, self.y/2-20, 0.9) - - def rightBottomCB(self): - self.hole(7, self.y-5, 2) - - self.hole(8, self.y/2+9, 0.9) - self.rectangularHole(8, self.y/2-5.5, 12, 23) - self.hole(8, self.y/2-20, 0.9) - - def eyeCB(self): - self.hole(self.x/2+13,self.hl/2, 8) - self.hole(self.x/2-13,self.hl/2, 8) - - def frontCB(self): - t = self.thickness - self.rectangularHole(0.5*t, 2+t, t, 2.5) - self.rectangularHole(self.x-0.5*t, 2+t, t, 2.5) - - def IOCB(self): - self.rectangularHole(26, 18, 12, 10) - # self.rectangularHole(42.2, 10.2, 9.5, 11.5) - - def buttonCB(self): - px, py = 7.5, 7.5 - - self.rectangularHole(px, py-2.25, 5.2, 2.5) - self.rectangularHole(px, py+2.25, 5.2, 2.5) - - def PCB_Clip(self, x , y, move=None): - - if self.move(x+4, y, move, True): - return - self.moveTo(1.5) - self.polyline(x-1.5, 90, (y, 2), 90, x, 85, (y-2-4, 2), -30, 2, 120, 1, -90, 2, (180, 1.), y-7, -175, y-5) - - self.move(x+4, y, move) - - def PCB_Clamp(self, w, s, h, move=None): - t = self. thickness - f = 2**0.5 - - if self.move(w+4, h+8+t, move, True): - return - self.polyline(w, 90, s, -90, 1, (90, 1), (h-s-1, 2), 90, w-2, 90, - h-8, (-180, 1), h-8+3*t, 135, f*(4), 90, f*2, -45, - (h+t, 2)) - self.move(w+4, h+8+t, move) - - def render(self): - - self.x = x = 60. - self.y = y = 60. - self.h = h = 35. - self.hl = hl = 30. - - t = self.thickness - - hx = self.edges["O"].startwidth() - hx2 = self.edges["P"].startwidth() - - e1 = edges.CompoundEdge(self, "Fe", (h-hx, hx)) - e2 = edges.CompoundEdge(self, "eF", (hx, h-hx)) - e_back = ("F", e1, "e", e2) - - # sides - self.moveTo(hx) - self.rectangularWall(x, h-hx, "FfOf", ignore_widths=[2], move="up", label=_("Left bottom side")) - self.rectangularWall(x, hl-hx2, "pfFf", ignore_widths=[1], move="up", label=_("Left top side")) - self.moveTo(-hx) - self.rectangularWall(x, h-hx, "Ffof", ignore_widths=[5], callback=[ - lambda: self.rectangularHole(y-7.5, h-4-7.5, 6.2, 7.)], - move="up", label=_("Right bottom side")) - self.rectangularWall(x, hl-hx2, "PfFf", ignore_widths=[6], - callback=[None, None, self.IOCB], move="up", - label=_("Right top side")) - - # lower walls - self.rectangularWall(y, h, "FFeF", callback=[ - None, None, self.frontCB], move="up", - label=_("Lower front")) - self.rectangularWall(y, h, e_back, move="up", - label=_("Lower back")) - - # upper walls - self.rectangularWall(y, hl, "FFeF", callback=[self.eyeCB], move="up", label=_("Upper front")) - self.rectangularWall(y, hl-hx2, "FFqF", move="up", label=_("Upper back")) - - # top - self.rectangularWall(x, y, "ffff", move="up", label=_("Top")) - # bottom - self.rectangularWall(x, y, "ffff", callback=[self.bottomCB], move="up", label=_("Bottom")) - # PCB mounts - with self.saved_context(): - self.PCB_Clamp(y-53.5, 4.5, hl, move="right") - self.PCB_Clamp(y-50, 4.5, hl, move="right") - self.PCB_Clip(3.5, hl, move="right") - self.rectangularWall(15, 15, callback=[self.buttonCB]) - self.PCB_Clamp(y-53.5, 4.5, hl, move="up only") - # servo mounts - self.moveTo(0, 50) - self.rectangularWall(y, 14, callback=[None, None, None, - self.leftBottomCB], move="up", - label=_("Servo mount")) - self.rectangularWall(y-5.6, 14, callback=[ - None, None, None, self.rightBottomCB], move="up", - label=_("Servo mount")) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottolegs.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottolegs.py deleted file mode 100644 index 8ab0650..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottolegs.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes import edges - - -class LegEdge(edges.BaseEdge): - - def __call__(self, l, **kw): - d0 = (l - 12.0) /2 - self.hole(l/2, 6, 3.0) - self.polyline(d0, 90, 0, (-180, 6), 0, 90, d0) - -class OttoLegs(Boxes): - """Otto LC - a laser cut chassis for Otto DIY - legs""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, finger=1.0, space=1.0, - surroundingspaces=1.0) - self.argparser.add_argument( - "--anklebolt1", action="store", type=float, default=3.0, - help="diameter for hole for ankle bolts - foot side") - self.argparser.add_argument( - "--anklebolt2", action="store", type=float, default=2.6, - help="diameter for hole for ankle bolts - leg side") - self.argparser.add_argument( - "--length", action="store", type=float, default=34.0, - help="length of legs (34mm min)") - - def foot(self, x, y, ly, l, r=5., move=None): - if self.move(x, y, move, True): - return - - t = self.thickness - w = ly + 5.5 + 2 * t - self.fingerHolesAt(x/2 - w/2, 0, l, 90) - self.fingerHolesAt(x/2 + w/2, 0, l, 90) - self.moveTo(r, 0) - - for l in (x, y, x, y): - self.polyline((l - 2*r, 2), 45, r*2**0.5, 45) - - self.move(x, y, move) - - def ankles(self, x, h, edge="f", callback=None, move=None): - - f = 0.5 - tw = x - th = 2 * h + self.thickness - - if self.move(tw, th, move, True): - return - - self.moveTo(0, self.thickness) - for i in range(2): - self.cc(callback, 0) - self.edges[edge](x) - self.polyline(0, 90) - self.cc(callback, 1) - self.polyline((h, 2), 90, (f*x, 1), 45, ((2**0.5)*(1-f)*x, 1), 45, - (h-(1-f)*x, 1), 90) - self.moveTo(tw, th, 180) - self.ctx.stroke() - self.move(tw, th, move) - - def ankle1(self): - # from vertical edge - self.hole(15, 10, 3.45) # 3.45 for servo arm, 2.3 for knob - - def servoring(self, move=""): - if self.move(20, 20, move, True): - return - self.moveTo(10, 10, 90) - self.moveTo(3.45, 0, -90) - self.polyline(0, (-264, 3.45), 0, 36, 6.55, 108, 0, (330, 9.0, 4), 0, 108, 6.55) - self.move(20, 20, move) - - - def ankle2(self): - # from vertical edge - self.hole(15, 10, self.anklebolt1/2) - - def servoHole(self): - self.hole(6, 6, 11.6/2) - self.hole(6, 12, 5.5/2) - - def render(self): - # adjust to the variables you want in the local scope - t = self.thickness - - ws = 25 - lx, ly, lh = 12.4, 23.5, max(self.length, ws+6+t) - - self.ctx.save() - # Legs - - c1 = edges.CompoundEdge(self, "FE", (ly-7.0, 7.0)) - c2 = edges.CompoundEdge(self, "EF", (7.0, lh-7.0)) - e = [c1, c2, "F", "F"] - - for i in range(2): - # front - self.rectangularWall(lx, lh-7., [LegEdge(self, None), "f", "F", "f"], callback=[None, lambda:self.fingerHolesAt(ws-7., 0, lx)], move="right") - # back - self.rectangularWall(lx, lh, "FfFf", callback=[ - lambda:self.hole(lx/2, 7, self.anklebolt2/2)], move="right") - # sides - self.rectangularWall(ly, lh, e, callback=[None, - lambda:self.fingerHolesAt(ws, 7.0, ly-7.0-3.0)], move="right") - self.rectangularWall(ly, lh, e, callback=[ - lambda:self.rectangularHole(ly/2, ws+3+0.5*t, 12, 6, 3), - lambda:self.fingerHolesAt(ws, 7.0, ly-7.0-3.0)], move="right") - - # top - self.partsMatrix(2, 1, "right", self.rectangularWall, ly, lx, "ffff", - callback=[None, lambda: self.hole(lx/2, ly/2, 2.3)]) - self.partsMatrix(2, 1, "right", self.rectangularWall, lx, ly, "eeee", callback=[lambda: self.hole(lx/2, ly/2, 1.5)]) - # hold servo at the front - self.partsMatrix(2, 1, "right", self.rectangularWall, 4.6, lx, "efee") - # bottom - self.partsMatrix(2, 1, "right", self.rectangularWall, lx, ly-7.0, "efff") - # hold servo inside - self.partsMatrix(2, 1, "right", self.rectangularWall, lx, ly-7.0-3.0, "efef") - - self.ctx.restore() - self.rectangularWall(lx, lh, "ffff", move="up only") - - # feet - self.foot(60, 40, ly, 30, move="right") - self.foot(60, 40, ly, 30, move="right") - self.ankles(30, 25, callback=[None, self.ankle1], move="right") - self.ankles(30, 25, callback=[None, self.ankle2], move="right") - self.partsMatrix(2, 2, "right", self.servoring) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottosoles.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottosoles.py deleted file mode 100644 index 20e6608..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ottosoles.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) 2013-2018 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class OttoSoles(Boxes): - """Foam soles for the OttO bot""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.buildArgParser(x=58., y=38.) - self.argparser.add_argument( - "--width", action="store", type=float, default=4., - help="width of sole stripe") - self.argparser.add_argument( - "--chamfer", action="store", type=float, default=5., - help="chamfer at the corners") - self.argparser.add_argument( - "--num", action="store", type=int, default=2, - help="number of soles") - - - def render(self): - x, y = self.x, self.y - c = self.chamfer - c2 = c * 2**0.5 - w = min(self.width, c2 / 2. / math.tan(math.radians(22.5))) - w = self.width - w2 = w * 2**0.5 - c2 / 2 - d = w * math.tan(math.radians(22.5)) - - - self.edges["d"].settings.setValues(w, size=0.4, depth=0.3, - radius=0.05) - - self.moveTo(0, y, -90) - - for i in range(self.num*2): - if c2 >= 2 * d: - self.polyline((c2, 1), 45, (y-2*c, 1), 45, c2/2., 90) - self.edges["d"](w) - self.polyline(0, 90, c2/2-d, -45, (y-2*c-2*d, 1), -45, - (c2-2*d, 1), -45, - (x-2*c-2*d, 1), -45, c2/2-d, 90) - self.edges["D"](w) - self.polyline(0, 90, c2/2., 45, (x-2*c, 1), 45) - self.moveTo(0, w + c2/2. + 2*2**0.5*self.burn) - else: - self.polyline((c2, 1), 45, (y-2*c, 1), 45, c2/2., 90) - self.edges["d"](w2) - self.polyline(0, 45, (y-2*w, 1), -90, (x-2*w, 1), 45) - self.edges["D"](w2) - self.polyline(0, 90, c2/2., 45, (x-2*c, 3), 45) - self.moveTo(0, w * 2**0.5 + 2*2**0.5*self.burn) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/paintbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/paintbox.py deleted file mode 100644 index 3020d39..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/paintbox.py +++ /dev/null @@ -1,162 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import Boxes, boolarg, edges - - -class PaintStorage(Boxes): - """Stackable storage for hobby paint or other things""" - - webinterface = True - ui_group = "Shelf" # see ./__init__.py for names - - canheight: int - candiameter: int - minspace: int - additional_bottom: int - additional_top: int - hexpattern: bool - drawer: bool - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.StackableSettings) - - self.buildArgParser(x=100, y=300) - - self.argparser.add_argument( - "--canheight", action="store", type=int, default=50, - help="Height of the paintcans") - self.argparser.add_argument( - "--candiameter", action="store", type=int, default=30, - help="Diameter of the paintcans") - self.argparser.add_argument( - "--minspace", action="store", type=int, default=10, - help="Minimum space between the paintcans") - self.argparser.add_argument( - "--additional_bottom", action="store", type=boolarg, default=False, - help="Additional bottom/floor with holes the paintcans go through") - self.argparser.add_argument( - "--additional_top", action="store", type=boolarg, default=False, - help="Additional top/floor with holes the paintcans go through") - self.argparser.add_argument( - "--hexpattern", action="store", type=boolarg, default=False, - help="Use hexagonal arrangement for the holes instead of orthogonal") - self.argparser.add_argument( - "--drawer", action="store", type=boolarg, default=False, - help="Create a stackable drawer instead") - - def paintholes(self): - """Place holes for the paintcans evenly""" - - if self.hexpattern: - self.moveTo(self.minspace / 2, self.minspace / 2) - settings = self.hexHolesSettings - settings.diameter = self.candiameter - settings.distance = self.minspace - settings.style = 'circle' - self.hexHolesRectangle(self.y - 1 * self.minspace, - self.x - 1 * self.minspace, - settings) - return - n_x = int(self.x / (self.candiameter + self.minspace)) - n_y = int(self.y / (self.candiameter + self.minspace)) - - if n_x <= 0 or n_y <= 0: - return - - spacing_x = (self.x - n_x * self.candiameter) / n_x - spacing_y = (self.y - n_y * self.candiameter) / n_y - for i in range(n_y): - for j in range(n_x): - self.hole(i * (self.candiameter + spacing_y) + (self.candiameter + spacing_y) / 2, - j * (self.candiameter + spacing_x) + (self.candiameter + spacing_x) / 2, - self.candiameter / 2) - - def sidesCb(self): - x, y = self.x, self.y - t = self.thickness - - stack = self.edges['s'].settings - h = self.canheight - stack.height - stack.holedistance + t - hx = 1 / 2. * x - hh = h / 4. - hr = min(hx, hh) / 2 - - if not self.drawer: - self.rectangularHole(h / 3, (x / 2.0) - t, hh, hx, r=hr) - self.fingerHolesAt(((self.canheight/3)*2)-t*2, -t, x, 90) - - if self.additional_bottom: - self.fingerHolesAt((self.canheight / 6) - (t / 2), -t, x, 90) - if self.additional_top: - self.fingerHolesAt(self.canheight - ((self.canheight / 6) + t), -t, x, 90) - else: - self.rectangularHole(h / 3, (x / 2.0) - t, hh, hx, r=hr) - - def render(self): - # adjust to the variables you want in the local scope - x, y = self.x, self.y - t = self.thickness - - stack = self.edges['s'].settings - h = self.canheight - stack.height - stack.holedistance + t - - wall_callbacks = [self.sidesCb] - if not self.drawer: - wall_keys = "EsES" - bottom_keys = "EfEf" - else: - wall_keys = "FsFS" - bottom_keys = "FfFf" - - # Walls - self.rectangularWall( - h, x - 2 * t, wall_keys, - ignore_widths=[1, 2, 5, 6], - callback=wall_callbacks, move="up", - ) - self.rectangularWall( - h, x - 2 * t, wall_keys, - ignore_widths=[1, 2, 5, 6], - callback=wall_callbacks, move="right" - ) - - # Plates - self.rectangularWall( - 0.8 * stack.height + stack.holedistance, x, "eeee", move="" - ) - self.rectangularWall( - 0.8 * stack.height + stack.holedistance, x, "eeee", move="down right" - ) - - # Bottom - self.rectangularWall( - y, x - 2 * t, bottom_keys, ignore_widths=[1, 2, 5, 6], move="up" - ) - - if not self.drawer: - # Top - self.rectangularWall(y, x, "efef", callback=[self.paintholes], move="up") - if self.additional_bottom: - self.rectangularWall(y, x, "efef", callback=[self.paintholes], move="up") - if self.additional_top: - self.rectangularWall(y, x, "efef", callback=[self.paintholes], move="up") - else: - # Sides - self.rectangularWall(y, h, "efff", move="up") - self.rectangularWall(y, h, "efff", move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/paperbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/paperbox.py deleted file mode 100644 index a5ea36c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/paperbox.py +++ /dev/null @@ -1,276 +0,0 @@ -# Copyright (C) 2020 Guillaume Collic -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import math - -from boxes import Boxes - - -class PaperBox(Boxes): - """ - Box made of paper, with lid. - """ - - ui_group = "Misc" - - description = """ -This box is made of paper. - -There is marks in the "outside leftover paper" to help see where to fold -(cutting with tabs helps use them). The cut is very precise, and could be too tight if misaligned when glued. A plywood box (such as a simple TypeTray) of the same size is a great guide during folding and gluing. Just fold the box against it. Accurate quick and easy. - -A paper creaser (or bone folder) is also useful. -""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser("x", "y", "h") - - self.argparser.add_argument( - "--design", - action="store", - type=str, - default="automatic", - choices=("automatic", "widebox", "tuckbox"), - help="different design for paper consumption optimization. The tuckbox also has locking cut for its lid.", - ) - - self.argparser.add_argument( - "--lid_height", - type=float, - default=15, - help="Height of the lid (part which goes inside the box)", - ) - self.argparser.add_argument( - "--lid_radius", - type=float, - default=7, - help="Angle, in radius, of the round corner of the lid", - ) - self.argparser.add_argument( - "--lid_sides", - type=float, - default=20, - help="Width of the two sides upon which goes the lid", - ) - self.argparser.add_argument( - "--margin", - type=float, - default=0, - help="Margin for the glued sides", - ) - self.argparser.add_argument( - "--mark_length", - type=float, - default=1.5, - help="Length of the folding outside mark", - ) - self.argparser.add_argument( - "--tab_angle_rad", - type=float, - default=math.atan(2 / 25), - help="Angle (in radian) of the sides which are to be glued inside the box", - ) - - self.argparser.add_argument( - "--finger_hole_diameter", - type=float, - default=15, - help="Diameter of the hole to help catch the lid", - ) - - def render(self): - if self.design == "automatic": - self.design = "tuckbox" if self.h > self.y else "widebox" - - path = ( - self.tuckbox(self.x, self.y, self.h) - if self.design == "tuckbox" - else self.widebox(self.x, self.y, self.h) - ) - - self.polyline(*path) - - def tuckbox(self, width, length, height): - lid_cut_length = min(10, length / 2, width / 5) - half_side = ( - self.mark(self.mark_length) - + [ - 0, - 90, - ] - + self.ear_description(length, lid_cut_length) - + [ - 0, - -90, - length, - 0, - ] - + self.lid_cut(lid_cut_length) - + self.lid_tab(width - 2 * self.thickness) - + [0] - + self.lid_cut(lid_cut_length, reverse=True) - + [ - length, - -90, - ] - + self.ear_description(length, lid_cut_length, reverse=True) - + self.mark(self.mark_length) - ) - return ( - [height, 0] - + half_side - + self.side_with_finger_hole(width, self.finger_hole_diameter) - + self.mark(self.mark_length) - + [ - 0, - 90, - ] - + self.tab_description(length - self.margin - self.thickness, height) - + [ - 0, - 90, - ] - + self.mark(self.mark_length) - + [width] - + list(reversed(half_side)) - ) - - def widebox(self, width, length, height): - half_side = ( - self.mark(self.mark_length) - + [ - 0, - 90, - ] - + self.tab_description(length / 2 - self.margin, height) - + [ - 0, - -90, - height, - 0, - ] - + self.mark(self.mark_length) - + [ - 0, - 90, - ] - + self.tab_description(self.lid_sides, length) - + [ - 0, - 90, - ] - + self.mark(self.mark_length) - + [ - height, - -90, - ] - + self.tab_description(length / 2 - self.margin, height) - + [ - length, - 0, - ] - + self.mark(self.mark_length) - ) - return ( - self.side_with_finger_hole(width, self.finger_hole_diameter) - + half_side - + self.lid_tab(width) - + list(reversed(half_side)) - ) - - def lid_tab(self, width): - return [ - self.lid_height - self.lid_radius, - (90, self.lid_radius), - width - 2 * self.lid_radius, - (90, self.lid_radius), - self.lid_height - self.lid_radius, - ] - - def mark(self, length): - if length == 0: - return [] - return [ - 0, - -90, - length, - 180, - length, - -90, - ] - - def lid_cut(self, length, reverse=False): - path = [ - 90, - length + self.thickness, - -180, - length, - 90, - ] - - return [0] + (list(reversed(path)) if reverse else path) - - def side_with_finger_hole(self, width, finger_hole_diameter): - half_width = (width - finger_hole_diameter) / 2 - - return [ - half_width, - 90, - 0, - (-180, finger_hole_diameter / 2), - 0, - 90, - half_width, - 0, - ] - - def tab_description(self, height, width): - deg = math.degrees(self.tab_angle_rad) - side = height / math.cos(self.tab_angle_rad) - end_width = width - 2 * height * math.tan(self.tab_angle_rad) - return [ - 0, - deg - 90, - side, - 90 - deg, - end_width, - 90 - deg, - side, - deg - 90, - ] - - def ear_description(self, length, lid_cut_length, reverse=False): - ear_depth = max(lid_cut_length, self.lid_height) - radius = min(self.lid_radius, ear_depth - lid_cut_length) - start_margin = self.thickness - end_margin = 2 * self.burn - path = [ - start_margin, - -90, - lid_cut_length, - 90, - 0, - (-90, radius), - 0, - 90, - length - radius - start_margin - end_margin, - 90, - ear_depth, - -90, - end_margin, - ] - - return (list(reversed(path)) if reverse else path) + [0] diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/phoneholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/phoneholder.py deleted file mode 100644 index 3160224..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/phoneholder.py +++ /dev/null @@ -1,305 +0,0 @@ -# Copyright (C) 2021 Guillaume Collic -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import math -from functools import partial - -from boxes import Boxes, edges - - -class PhoneHolder(Boxes): - """ - Smartphone desk holder - """ - - ui_group = "Misc" - - description = """ - This phone stand holds your phone between two tabs, with access to its - bottom, in order to connect a charger, headphones, and also not to obstruct - the mic. - - Default values are currently based on Galaxy S7. -""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.argparser.add_argument( - "--phone_height", - type=float, - default=142, - help="Height of the phone.", - ) - self.argparser.add_argument( - "--phone_width", - type=float, - default=73, - help="Width of the phone.", - ) - self.argparser.add_argument( - "--phone_depth", - type=float, - default=11, - help=( - "Depth of the phone. Used by the bottom support holding the " - "phone, and the side tabs depth as well. Should be at least " - "your material thickness for assembly reasons." - ), - ) - self.argparser.add_argument( - "--angle", - type=float, - default=25, - help="angle at which the phone stands, in degrees. 0° is vertical.", - ) - self.argparser.add_argument( - "--bottom_margin", - type=float, - default=30, - help="Height of the support below the phone", - ) - self.argparser.add_argument( - "--tab_size", - type=float, - default=76, - help="Length of the tabs holding the phone", - ) - self.argparser.add_argument( - "--bottom_support_spacing", - type=float, - default=16, - help=( - "Spacing between the two bottom support. Choose a value big " - "enough for the charging cable, without getting in the way of " - "other ports." - ), - ) - - self.addSettingsArgs(edges.FingerJointSettings) - - def render(self): - self.h = self.phone_height + self.bottom_margin - tab_start = self.bottom_margin - tab_length = self.tab_size - tab_depth = self.phone_depth - support_depth = self.phone_depth - support_spacing = self.bottom_support_spacing - rad = math.radians(self.angle) - self.stand_depth = self.h * math.sin(rad) - self.stand_height = self.h * math.cos(rad) - - self.render_front_plate(tab_start, tab_length, support_spacing, move="right") - - self.render_back_plate(move="right") - - self.render_side_plate(tab_start, tab_length, tab_depth, move="right") - - for move in ["right mirror", "right"]: - self.render_bottom_support(tab_start, support_depth, tab_length, move=move) - - def render_front_plate( - self, - tab_start, - tab_length, - support_spacing, - support_fingers_length=None, - move="right", - ): - if not support_fingers_length: - support_fingers_length = tab_length - - be = BottomEdge(self, tab_start, support_spacing) - se1 = SideEdge(self, tab_start, tab_length) - se2 = SideEdge(self, tab_start, tab_length, reverse=True) - self.rectangularWall( - self.phone_width, - self.h, - [be, se1, "e", se2], - move=move, - callback=[ - partial( - lambda: self.front_plate_holes( - tab_start, support_fingers_length, support_spacing - ) - ) - ], - ) - - def render_back_plate( - self, - move="right", - ): - be = BottomEdge(self, 0, 0) - self.rectangularWall( - self.phone_width, - self.stand_height, - [be, "F", "e", "F"], - move=move, - ) - - def front_plate_holes( - self, support_start_height, support_fingers_length, support_spacing - ): - margin = (self.phone_width - support_spacing - self.thickness) / 2 - self.fingerHolesAt( - margin, - support_start_height, - support_fingers_length, - ) - self.fingerHolesAt( - self.phone_width - margin, - support_start_height, - support_fingers_length, - ) - - def render_side_plate(self, tab_start, tab_length, tab_depth, move): - te = TabbedEdge(self, tab_start, tab_length, tab_depth, reverse=True) - self.rectangularTriangle( - self.stand_depth, - self.stand_height, - ["e", "f", te], - move=move, - num=2, - ) - - def render_bottom_support( - self, support_start_height, support_depth, support_fingers_length, move="right" - ): - full_height = support_start_height + support_fingers_length - rad = math.radians(self.angle) - floor_length = full_height * math.sin(rad) - angled_height = full_height * math.cos(rad) - bottom_radius = min(support_start_height, 3 * self.thickness + support_depth) - smaller_radius = 0.5 - support_hook_height = 5 - full_width = floor_length + (support_depth + 3 * self.thickness) * math.cos(rad) - if self.move(full_width, angled_height, move, True): - return - - self.polyline( - floor_length, - self.angle, - 3 * self.thickness + support_depth - bottom_radius, - (90, bottom_radius), - support_hook_height + support_start_height - bottom_radius, - (180, self.thickness), - support_hook_height - smaller_radius, - (-90, smaller_radius), - self.thickness + support_depth - smaller_radius, - -90, - ) - self.edges["f"](support_fingers_length) - self.polyline( - 0, - 180 - self.angle, - angled_height, - 90, - ) - # Move for next piece - self.move(full_width, angled_height, move) - - -class BottomEdge(edges.BaseEdge): - def __init__(self, boxes, support_start_height, support_spacing) -> None: - super().__init__(boxes, None) - self.support_start_height = support_start_height - self.support_spacing = support_spacing - - def __call__(self, length, **kw): - cable_hole_radius = 2.5 - self.support_spacing = max(self.support_spacing, 2 * cable_hole_radius) - side = (length - self.support_spacing - 2 * self.thickness) / 2 - - half = [ - side, - 90, - self.support_start_height, - -90, - self.thickness, - -90, - self.support_start_height, - 90, - self.support_spacing / 2 - cable_hole_radius, - 90, - 2 * cable_hole_radius, - ] - path = half + [(-180, cable_hole_radius)] + list(reversed(half)) - self.polyline(*path) - - -class SideEdge(edges.BaseEdge): - def __init__(self, boxes, tab_start, tab_length, reverse=False) -> None: - super().__init__(boxes, None) - self.tab_start = tab_start - self.tab_length = tab_length - self.reverse = reverse - - def __call__(self, length, **kw): - tab_start = self.tab_start - tab_end = length - self.tab_start - self.tab_length - - if self.reverse: - tab_start, tab_end = tab_end, tab_start - - self.edges["F"](tab_start) - self.polyline( - 0, - 90, - self.thickness, - -90, - ) - self.edges["f"](self.tab_length) - self.polyline(0, -90, self.thickness, 90) - self.edges["F"](tab_end) - - def startwidth(self) -> float: - return self.boxes.thickness - - -class TabbedEdge(edges.BaseEdge): - def __init__(self, boxes, tab_start, tab_length, tab_depth, reverse=False) -> None: - super().__init__(boxes, None) - self.tab_start = tab_start - self.tab_length = tab_length - self.tab_depth = tab_depth - self.reverse = reverse - - def __call__(self, length, **kw): - tab_start = self.tab_start - tab_end = length - self.tab_start - self.tab_length - - if self.reverse: - tab_start, tab_end = tab_end, tab_start - - self.edges["f"](tab_start) - - self.ctx.save() - self.fingerHolesAt(0, -self.thickness / 2, self.tab_length, 0) - self.ctx.restore() - - self.polyline( - 0, - -90, - self.thickness, - (90, self.tab_depth), - self.tab_length - 2 * self.tab_depth, - (90, self.tab_depth), - self.thickness, - -90, - ) - self.edges["f"](tab_end) - - def margin(self) -> float: - return self.tab_depth + self.thickness diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/piratechest.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/piratechest.py deleted file mode 100644 index c3da958..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/piratechest.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class PirateChest(Boxes): - """Box with polygon lid with chest hinges.""" - - description = """Do not assemble sides before attaching the lid! - Hinge of the lid has to be placed first because it is impossible - to get it in position without removing the side wall. The lid can - be a bit tricky to assemble. Keep track of how the parts fit together. - Part with label "lid back" is placed in the hinges""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings, finger=1.0,space=1.0) - self.addSettingsArgs(edges.HingeSettings) - - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--n", action="store", type=int, default=5, - help="number of sides on the lid. n ≥ 3") - - - def render(self): - # adjust to the variables you want in the local scope - x, y, h = self.x, self.y, self.h - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h, "f", False) - t = self.thickness - n = self.n - - if (n < 3): - raise ValueError("number of sides on the lid must be greater or equal to 3 (got %i)" % n) - - hy = self.edges["O"].startwidth() - h -= hy - if (h < 0): - raise ValueError("box to low to allow for hinge (%i)" % h) - - # create edge for non 90 degree joints in the lid - fingerJointSettings = copy.deepcopy(self.edges["f"].settings) - fingerJointSettings.setValues(self.thickness, angle=180./(n-1)) - fingerJointSettings.edgeObjects(self, chars="gGH") - - # render all parts - self.ctx.save() - - self.rectangularWall(x, y, "FFFF", move="up", label="Bottom") - frontlid, toplids, backlid = self.topside(y, n = n, move="only", bottom='P') - - self.rectangularWall(x, backlid, "qFgF", move="up", label="lid back") - for _ in range(n-2): - self.rectangularWall(x, toplids, "GFgF", move="up", label="lid top") - self.rectangularWall(x, frontlid, "GFeF", move="up", label="lid front") - - self.ctx.restore() - self.rectangularWall(x, y, "FFFF", move="right only") - - with self.saved_context(): - self.rectangularWall(x, h, "fFQF", ignore_widths=[2, 5], move="right", label="front") - self.rectangularWall(y, h, "ffof", ignore_widths=[5], move="right", label="right") - self.rectangularWall(0, h, "eeep", move="right only") - self.rectangularWall(x, h, "fFoF", move="up only") - self.rectangularWall(x, 0, "Peee", move="up only") - - e1 = edges.CompoundEdge(self, "Fe", (h, hy)) - e2 = edges.CompoundEdge(self, "eF", (hy, h)) - e_back = ("f", e1, "e", e2) - - with self.saved_context(): - self.rectangularWall(x, h+hy, e_back, move="right", label="back") # extend back to correct height - self.rectangularWall(0, h, "ePee", move="right only") - self.rectangularWall(y, h, "ffOf", ignore_widths=[2], move="right", label="left") - self.rectangularWall(x, h, "fFOF", move="up only") - self.rectangularWall(x, 0, "peee", move="up only") - - self.topside(y, n = n, move="right", bottom='p', label="lid left") - self.topside(y, n = n, move="right", bottom='P', label="lid right") - - - def topside(self, y, n, bottom, move=None, label=""): - radius, hp, side = self.regularPolygon((n - 1) * 2, h=y/2.0) - - tx = y + 2 * self.edges.get('f').spacing() - lidheight = hp if n % 2 else radius - ty = lidheight + self.edges.get('f').spacing() + self.edges.get(bottom).spacing() - - if self.move(tx, ty, move, before=True): - return side/2 + self.edges.get(bottom).spacing(), side, side/2 - - self.moveTo(self.edges.get('f').margin(), self.edges.get(bottom).margin()) - - self.edges.get(bottom)(y) - - self.corner(90) - if bottom == 'p': - self.edges.get('f')(side/2 + self.edges.get(bottom).spacing()) - else: - self.edges.get('f')(side/2) - - self.corner(180 / (n - 1)) - for _ in range(n-2): - self.edges.get('f')(side) - self.corner(180 / (n - 1)) - - if bottom == 'P': - self.edges.get('f')(side/2 + self.edges.get(bottom).spacing()) - else: - self.edges.get('f')(side/2) - - self.corner(90) - - self.move(tx, ty, move, label=label) - - return side/2 + self.edges.get(bottom).spacing(), side, side/2 diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/pizzashovel.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/pizzashovel.py deleted file mode 100644 index 8038c61..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/pizzashovel.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class PizzaShovel(Boxes): - """Pizza shovel with conveyor belt action""" - - description = """ -You need (permanent) baking paper to create the conveyor. With that you can pick up and put down the pizza by moving the handle attached to the belt. - """ - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.HandleEdgeSettings, outset=0.0, height=40, hole_width="30:30:30") - self.buildArgParser(x=382, y=400) - self.argparser.add_argument( - "--grip_length", action="store", type=float, default=250.0, - help="Length of the grip. Zero for holes for a screw-in handle") - self.argparser.add_argument( - "--grip_height", action="store", type=float, default=30.0, - help="Height of the grip. Distance between the cross beams.") - self.argparser.add_argument( - "--top_holes", action="store", type=float, default=3.0, - help="Diameter of the screw holes in the bottom of the pusher - where the screws pass through") - self.argparser.add_argument( - "--bottom_holes", action="store", type=float, default=2.0, - help="Diameter of the screw holes in the bottom of the pusher - where the screws hold") - self.argparser.add_argument( - "--grip_holes", action="store", type=float, default=3.0, - help="Diameter of the screw holes for zero griplength") - - def holesCB(self, d): - def cb(): - for i in range(5): - self.hole((self.x-3)/5 * (i+0.5), 20, d=d) - return cb - - def gripCB(self, top): - - def cb(): - t = self.thickness - if self.grip_length: - for d in (-t, +t): - self.fingerHolesAt(self.x/2 + d, 0, 40, 90) - else: - for y in ((10, 30) if top else (15, 35, 60)): - self.hole(self.x/2, y, d=self.grip_holes) - return cb - - def render(self): - x, y, h = self.x, self.y, self.grip_height - grip = self.grip_length - t = self.thickness - - ce = edges.CompoundEdge(self, "fe", [y/2, y/2]) - ec = edges.CompoundEdge(self, "ef", [y/2, y/2]) - - self.rectangularWall(x, y, ["e", ce, "e", ec], move="up") - self.rectangularWall(x, 40, "efef", callback=[self.gripCB(top=True)], move="up") - self.rectangularWall(x, 80, "efef", callback=[self.gripCB(top=False)], move="up") - for i in range(2): - a = math.atan((h+2*t) / (y/2 - 30)) - l = (y/2 - 30) / math.cos(a) - a = math.degrees(a) - self.polygonWall((y/2+40, (90, t), h+2*t, (90, t), 70, a, l, -a, 0, (180, t)), "e", - callback=[lambda: (self.fingerHolesAt(0, 1.5*t, y/2, 0), - self.fingerHolesAt(y/2+t, 1.5*t, 40, 0)), - None, - lambda: self.fingerHolesAt(-t, 1.5*t, 80, 0)], - move="up") - - self.rectangularWall(x-3, 40, "eeee", callback=[self.holesCB(self.bottom_holes)], move="up") - self.rectangularWall(x-3, 40, "yeee", callback=[self.holesCB(self.top_holes)], move="up") - - if grip: - ce1 = edges.CompoundEdge(self, "fe", (40, grip-h/2)) - ce2 = edges.CompoundEdge(self, "ef", (grip-h/2, 40)) - self.flangedWall(40+grip-h/2, h, [ce1, "e", ce2, "e"], flanges=[0, h/2], r=h/2, move="up") - self.flangedWall(40+grip-h/2, h, "eeee", flanges=[0, h/2], r=h/2, move="up") - self.flangedWall(40+grip-h/2, h, [ce1, "e", ce2, "e"], flanges=[0, h/2], r=h/2, move="up") - self.flangedWall(30+grip-h/2, h-2*t, "eeee", flanges=[0, h/2-t], r=h/2-t, move="up") - self.flangedWall(30+grip-h/2, h-2*t, "eeee", flanges=[0, h/2-t], r=h/2-t, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/planetary.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/planetary.py deleted file mode 100644 index eb92c3f..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/planetary.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Planetary(Boxes): - """Planetary Gear with possibly multiple identical stages""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - self.argparser.add_argument( - "--sunteeth", action="store", type=int, default=8, - help="number of teeth on sun gear") - self.argparser.add_argument( - "--planetteeth", action="store", type=int, default=20, - help="number of teeth on planets") - self.argparser.add_argument( - "--maxplanets", action="store", type=int, default=0, - help="limit the number of planets (0 for as much as fit)") - self.argparser.add_argument( - "--deltateeth", action="store", type=int, default=0, - help="enable secondary ring with given delta to the ring gear") - self.argparser.add_argument( - "--modulus", action="store", type=float, default=3, - help="modulus of the theeth in mm") - self.argparser.add_argument( - "--shaft", action="store", type=float, default=6., - help="diameter of the shaft") - # self.argparser.add_argument( - # "--stages", action="store", type=int, default=4, - # help="number of stages in the gear reduction") - - def render(self): - - ringteeth = self.sunteeth + 2 * self.planetteeth - spoke_width = 3 * self.shaft - - pitch1, size1, xxx = self.gears.sizes(teeth=self.sunteeth, - dimension=self.modulus) - pitch2, size2, xxx = self.gears.sizes(teeth=self.planetteeth, - dimension=self.modulus) - pitch3, size3, xxx = self.gears.sizes( - teeth=ringteeth, internal_ring=True, spoke_width=spoke_width, - dimension=self.modulus) - - t = self.thickness - planets = int(math.pi / (math.asin(float(self.planetteeth + 2) / (self.planetteeth + self.sunteeth)))) - - if self.maxplanets: - planets = min(self.maxplanets, planets) - - # Make sure the teeth mash - ta = self.sunteeth + ringteeth - # There are sunteeth+ringteeth mashing positions for the planets - if ta % planets: - planetpositions = [round(i * ta / planets) * 360 / ta for i in range(planets)] - else: - planetpositions = planets - - # XXX make configurable? - profile_shift = 20 - pressure_angle = 20 - self.parts.disc(size3, callback=lambda: self.hole(0, 0, self.shaft / 2), move="up") - self.gears(teeth=ringteeth, dimension=self.modulus, - angle=pressure_angle, internal_ring=True, - spoke_width=spoke_width, mount_hole=self.shaft, - profile_shift=profile_shift, move="up") - self.gears.gearCarrier(pitch1 + pitch2, spoke_width, planetpositions, - 2 * spoke_width, self.shaft / 2, move="up") - self.gears(teeth=self.sunteeth, dimension=self.modulus, - angle=pressure_angle, - mount_hole=self.shaft, profile_shift=profile_shift, move="up") - numplanets = planets - - if self.deltateeth: - numplanets += planets - deltamodulus = self.modulus * ringteeth / (ringteeth - self.deltateeth) - self.gears(teeth=ringteeth - self.deltateeth, dimension=deltamodulus, - angle=pressure_angle, internal_ring=True, - spoke_width=spoke_width, mount_hole=self.shaft, - profile_shift=profile_shift, move="up") - - for i in range(numplanets): - self.gears(teeth=self.planetteeth, dimension=self.modulus, - angle=pressure_angle, - mount_hole=self.shaft, profile_shift=profile_shift, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/planetary2.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/planetary2.py deleted file mode 100644 index c6c5928..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/planetary2.py +++ /dev/null @@ -1,208 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Planetary2(Boxes): - """Balanced force Difference Planetary Gear (not yet working properly)""" - - ui_group = "Unstable" - - description = """Still has issues. The middle planetary gears set must not have a mashing sun gear as it can't be a proper gear set.""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser("nema_mount") - self.argparser.add_argument( - "--profile", action="store", type=str, default="GT2_2mm", - choices=pulley.Pulley.getProfiles(), - help="profile of the teeth/belt") - self.argparser.add_argument( - "--sunteeth", action="store", type=int, default=20, - help="number of teeth on sun gear") - self.argparser.add_argument( - "--planetteeth", action="store", type=int, default=20, - help="number of teeth on planets") - self.argparser.add_argument( - "--maxplanets", action="store", type=int, default=0, - help="limit the number of planets (0 for as much as fit)") - self.argparser.add_argument( - "--deltateeth", action="store", type=int, default=1, - help="enable secondary ring with given delta to the ring gear") - self.argparser.add_argument( - "--modulus", action="store", type=float, default=1.0, - help="modulus of the teeth in mm") - self.argparser.add_argument( - "--shaft", action="store", type=float, default=6., - help="diameter of the shaft") - self.argparser.add_argument( - "--screw1", action="store", type=float, default=2.4, - help="diameter of lower part of the screw hole") - self.argparser.add_argument( - "--screw2", action="store", type=float, default=4., - help="diameter of upper part of the screw hole") - self.argparser.add_argument( - "--pinsize", action="store", type=float, default=3.1, - help="diameter of alignment pins") - # self.argparser.add_argument( - # "--stages", action="store", type=int, default=4, - # help="number of stages in the gear reduction") - - def pins(self, r, rh, nr=0, angle=0.0): - self.moveTo(0, 0, angle) - - if nr < 8: - ang = 20 + 10 * nr - else: - ang = 15 + 10 * (nr-8) - - ang = 180 - ang - for a in (0, ang, -ang): - self.moveTo(0, 0, a) - self.hole(r, 0, rh) - self.moveTo(0, 0, -a) - - - def render(self): - - ringteeth = self.sunteeth + 2 * self.planetteeth - t = self.thickness - spoke_width = 4 * t - pinsize = self.pinsize / 2. - - pitch1, size1, xxx = self.gears.sizes(teeth=self.sunteeth, - dimension=self.modulus) - pitch2, size2, xxx = self.gears.sizes(teeth=self.planetteeth, - dimension=self.modulus) - pitch3, size3, xxx = self.gears.sizes( - teeth=ringteeth, internal_ring=True, spoke_width=spoke_width, - dimension=self.modulus) - - planets = int(math.pi / (math.asin(float(self.planetteeth + 2) / (self.planetteeth + self.sunteeth)))) - - if self.maxplanets: - planets = min(self.maxplanets, planets) - - # Make sure the teeth mash - ta = self.sunteeth + ringteeth - # There are sunteeth+ringteeth mashing positions for the planets - planetpositions = [round(i * ta / planets) * 360 / ta for i in range(planets)] - secondary_offsets = [((pos % (360. / (ringteeth - self.deltateeth))) - - (pos % (360. / ringteeth)) * ringteeth / self.planetteeth) - for pos in planetpositions] - - ratio = (1 + (ringteeth / self.sunteeth)) * (-ringteeth/self.deltateeth) - # XXX make configurable? - profile_shift = 20 - pressure_angle = 20 - - screw = self.screw1 / 2 - - # output - # XXX simple guess - belt = self.profile - pulleyteeth = int((size3-2*t) * math.pi / pulley.Pulley.spacing[belt][1]) - numplanets = planets - - deltamodulus = self.modulus * ringteeth / (ringteeth - self.deltateeth) - - def holes(r): - def h(): - self.hole(2*t, 2*t, r) - self.hole(size3-2*t, 2*t, r) - self.hole(2*t, size3-2*t, r) - self.hole(size3-2*t, size3-2*t, r) - return h - - def planets(): - self.moveTo(size3/2, size3/2) - for angle in planetpositions: - angle += 180 # compensate for 3 position in callback - self.moveTo(0, 0, angle) - self.hole((pitch1+pitch2), 0, size2/2) - self.moveTo(0, 0, -angle) - - # Base - self.rectangularWall(size3, size3, callback=[ - lambda: self.NEMA(self.nema_mount, size3 / 2, size3 / 2), - holes(screw), planets], - move="up") - - def gear(): - self.moveTo(size3 / 2, size3 / 2) - self.gears(teeth=ringteeth, dimension=self.modulus, - angle=pressure_angle, internal_ring=True, - spoke_width=spoke_width, teeth_only=True, - profile_shift=profile_shift, move="up") - - # Lower primary ring gear - self.rectangularWall(size3, size3, callback=[gear, holes(screw)], move="up") - tl = 0.5*size3*(2**0.5-1)*2**0.5 - screw = self.screw2 / 2 - self.rectangularTriangle(tl, tl, num=8, callback=[ - None, lambda:self.hole(2*t, 2*t, screw)], move='up') - - # Secondary ring gears - def ring(): - self.gears(teeth=ringteeth - self.deltateeth, - dimension=deltamodulus, - angle=pressure_angle, internal_ring=True, - spoke_width=spoke_width, teeth_only=True, - profile_shift=profile_shift) - for i in range(3): - self.hole((size3-6*t)/2+0.5*pinsize, 0, pinsize) - self.moveTo(0, 0, 120) - - self.pulley(pulleyteeth, belt, callback=ring, move="up") - self.pulley(pulleyteeth, belt, callback=ring, move="up") - - # Upper primary ring gear - self.rectangularWall(size3, size3, callback=[gear, holes(screw)], move="up") - # top cover plate - self.rectangularWall(size3, size3, callback=[holes(screw)], move="up") - - # Sun gear - def sunpins(): - self.hole(0.5*self.shaft+1.5*pinsize ,0, pinsize) - self.hole(-0.5*self.shaft-1.5*pinsize ,0, pinsize) - self.partsMatrix(4, 4, 'up', self.gears, teeth=self.sunteeth, - dimension=self.modulus, callback=sunpins, - angle=pressure_angle, mount_hole=self.shaft, - profile_shift=profile_shift) - - # Planets - for i in range(numplanets): - with self.saved_context(): - self.gears(teeth=self.planetteeth, dimension=self.modulus, - angle=pressure_angle, - callback=lambda:self.pins(0.25*size2, pinsize, i), - profile_shift=profile_shift, move="right") - for j in range(2): - self.gears(teeth=self.planetteeth, dimension=self.modulus, - angle=pressure_angle, - callback=lambda:self.pins(0.25*size2, pinsize, i, - secondary_offsets[i]), - profile_shift=profile_shift, move="right") - self.gears(teeth=self.planetteeth, dimension=self.modulus, - angle=pressure_angle, - callback=lambda:self.pins(0.25*size2, pinsize, i), - profile_shift=profile_shift, move="right") - - self.gears(teeth=self.planetteeth, dimension=self.modulus, - angle=pressure_angle, - profile_shift=profile_shift, move="up only") - - self.text("1:%.1f" % abs(ratio)) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/platonic.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/platonic.py deleted file mode 100644 index 56fd0d0..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/platonic.py +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright (C) 2020 Norbert Szulc -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.edges import FingerJointEdge - - -class UnevenFingerJointEdge(FingerJointEdge): - """Uneven finger joint edge """ - char = 'u' - description = "Uneven Finger Joint" - positive = True - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - # copied from original - - positive = self.positive - - s, f, thickness = self.settings.space, self.settings.finger, self.settings.thickness - - p = 1 if positive else -1 - - fingers, leftover = self.calcFingers(length, bedBolts) - - if not positive: - play = self.settings.play - f += play - s -= play - leftover -= play - - shift = (f + s) / 2 # we shift all fingers to make them un even - if (leftover < shift): - leftover = shift - - self.edge((leftover + shift)/2, tabs=1) # Whole point of this class - - l1,l2 = self.fingerLength(self.settings.angle) - h = l1-l2 - - d = (bedBoltSettings or self.bedBoltSettings)[0] - - for i in range(fingers): - if i != 0: - if not positive and bedBolts and bedBolts.drawBolt(i): - self.hole(0.5 * s, - 0.5 * self.settings.thickness, 0.5 * d) - - if positive and bedBolts and bedBolts.drawBolt(i): - self.bedBoltHole(s, bedBoltSettings) - else: - self.edge(s) - - if positive and self.settings.style == "springs": - self.polyline( - 0, -90 * p, 0.8*h, (90 * p, 0.2*h), - 0.1 * h, 90, 0.9*h, -180, 0.9*h, 90, - f - 0.6*h, - 90, 0.9*h, -180, 0.9*h, 90, 0.1*h, - (90 * p, 0.2 *h), 0.8*h, -90 * p) - else: - self.polyline(0, -90 * p, h, 90 * p, f, 90 * p, h, -90 * p) - - self.edge((leftover - shift)/2, tabs=1) # Whole point of this class - -# Unstable -class UnevenFingerJointEdgeCounterPart(UnevenFingerJointEdge): - """Uneven finger joint edge - other side""" - char = 'U' - description = "Uneven Finger Joint (opposing side)" - positive = False - -class Platonic(Boxes): - """Platonic solids generator""" - - ui_group = "Unstable" # see ./__init__.py for names - description = """![Icosahedron](static/samples/Platonic-Icosahedron.jpg) -""" - - SOLIDS = { - "tetrahedron": (4, 3), - "cube": (6, 4), - "octahedron": (8, 3), - "dodecahedron": (12, 5), - "icosahedro": (20, 3), - } - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=0) - - self.buildArgParser(x=60, outside=True) # x should be treated as edge length, TODO: change that - self.argparser.add_argument( - "--type", action="store", type=str, default=list(self.SOLIDS)[0], - choices=list(self.SOLIDS), - help="type of platonic solid") - - - def render(self): - # adjust to the variables you want in the local scope - e = self.x - t = self.thickness - faces, corners = self.SOLIDS[self.type] - - u = UnevenFingerJointEdge(self, self.edges["f"].settings) - self.addPart(u) - - uc = UnevenFingerJointEdgeCounterPart(self, self.edges["f"].settings) - self.addPart(uc) - - for _ in range(faces): - self.regularPolygonWall(corners, side=e, edges="u", move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/polehook.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/polehook.py deleted file mode 100644 index 3a3c687..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/polehook.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class PoleHook(Boxes): # change class name here and below - """Hook for pole like things to be clamped to another pole""" - - def __init__(self) -> None: - Boxes.__init__(self) - - # Uncomment the settings for the edge types you use - self.addSettingsArgs(edges.FingerJointSettings) - - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--diameter", action="store", type=float, default=50., - help="diameter of the thing to hook") - self.argparser.add_argument( - "--screw", action="store", type=float, default=7.8, - help="diameter of the screw in mm") - self.argparser.add_argument( - "--screwhead", action="store", type=float, default=13., - help="with of the screw head in mm") - self.argparser.add_argument( - "--screwheadheight", action="store", type=float, default=5.5, - help="height of the screw head in mm") - self.argparser.add_argument( - "--pin", action="store", type=float, default=4., - help="diameter of the pin in mm") - - def fork(self, d, w, edge="e", full=True, move=None): - tw = d + 2 * w - th = 2 * d - - if self.move(tw, th, move, True): - return - - e = self.edges.get(edge, edge) - - - self.moveTo(0, e.margin()) - - if e is self.edges["e"]: - self.bedBoltHole(tw) - else: - e(tw, bedBolts=edges.Bolts(1)) - if full: - self.hole(-0.5*w, 2*d, self.pin/2) - self.polyline(0, 90, 2*d, (180, w/2), d, (-180, d/2), - 0.5*d, (180, w/2), 1.5 * d, 90) - else: - self.polyline(0, 90, d, 90, w, 90, 0, (-180, d/2), - 0.5*d, (180, w/2), 1.5 * d, 90) - - self.move(tw, th, move) - - def lock(self, l1, l2, w, move=None): - l1 += w/2 - l2 += w/2 - if self.move(l1, l2, move, True): - return - self.hole(w/2, w/2, self.pin/2) - self.moveTo(w/2, 0) - self.polyline(l2-w, (180, w/2), l2-2*w, (-90, w/2), l1-2*w, (180, w/2), - l1-w, (90, w/2)) - self.move(l1, l2, move) - - def backplate(self): - tw = self.diameter + 2*self.ww - t = self.thickness - b = edges.Bolts(1) - bs = (0.0, ) - self.fingerHolesAt(-tw/2, -2*t, tw, 0, bedBolts=b, bedBoltSettings=bs) - self.fingerHolesAt(-tw/2, 0, tw, 0, bedBolts=b, bedBoltSettings=bs) - self.fingerHolesAt(-tw/2, +2*t, tw, 0, bedBolts=b, bedBoltSettings=bs) - - def clamp(self): - d = self.diameter + 2 * self.ww - self.moveTo(10, -0.5*d, 90) - self.edge(d) - self.moveTo(0, -8, -180) - self.edge(d) - - def render(self): - # adjust to the variables you want in the local scope - d = self.diameter - t = self.thickness - - shh = self.screwheadheight - self.bedBoltSettings = (self.screw, self.screwhead, shh, d/4+shh, d/4) # d, d_nut, h_nut, l, l - self.ww = ww = 4*t - self.fork(d, ww, "f", move="right") - self.fork(d, ww, "f", move="right") - self.fork(d, ww, "f", full=False, move="right") - self.fork(d, ww, full=False, move="right") - self.fork(d, ww, full=False, move="right") - - self.parts.disc(d+2*ww, callback=self.backplate, hole=self.screw, move="right") - self.parts.disc(d+2*ww, hole=self.screw, move="right") - self.parts.disc(d+2*ww, callback=self.clamp, hole=self.screw+0.5*t, move="right") - self.parts.disc(d+2*ww, hole=self.screw+0.5*t, move="right") - self.parts.wavyKnob(50, callback=lambda:self.nutHole(self.screwhead), - move="right") - self.parts.wavyKnob(50, callback=lambda:self.nutHole(self.screwhead), - move="right") - self.parts.wavyKnob(50, hole=self.screw+0.5*t, move="right") - - ll = ((d**2 + (0.5*(d+ww))**2)**0.5) - 0.5 * d - for i in range(3): - self.lock(ll, ll, ww, move="right") - - for i in range(2): - self.parts.disc(ww, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/pulley.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/pulley.py deleted file mode 100644 index e76aabd..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/pulley.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes import pulley - - -class Pulley(Boxes): - """Timing belt pulleys for different profiles""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - # remove cli params you do not need - self.buildArgParser(h=6.) - self.argparser.add_argument( - "--profile", action="store", type=str, default="GT2_2mm", - choices=pulley.Pulley.getProfiles(), - help="profile of the teeth/belt") - self.argparser.add_argument( - "--teeth", action="store", type=int, default=20, - help="number of teeth") - self.argparser.add_argument( - "--axle", action="store", type=float, default=5, - help="diameter of the axle") - self.argparser.add_argument( - "--insideout", action="store", type=BoolArg(), default=False, - help="create a ring gear with the belt being pushed against from within") - self.argparser.add_argument( - "--top", action="store", type=float, default=0, - help="overlap of top rim (zero for none)") - - # Add non default cli params if needed (see argparse std lib) - # self.argparser.add_argument( - # "--XX", action="store", type=float, default=0.5, - # help="DESCRIPTION") - - def disk(self, diameter, hole, callback=None, move=""): - w = diameter + 2 * self.spacing - - if self.move(w, w, move, before=True): - return - - self.moveTo(w / 2, w / 2) - self.cc(callback, None, 0.0, 0.0) - - if hole: - self.hole(0, 0, hole / 2.0) - - self.moveTo(diameter / 2 + self.burn, 0, 90) - self.corner(360, diameter / 2) - self.move(w, w, move) - - def render(self): - # adjust to the variables you want in the local scope - t = self.thickness - - if self.top: - self.disk( - self.pulley.diameter(self.teeth, self.profile) + 2 * self.top, - self.axle, move="right") - - for i in range(int(math.ceil(self.h / self.thickness))): - self.pulley(self.teeth, self.profile, insideout=self.insideout, r_axle=self.axle / 2.0, move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack10box.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack10box.py deleted file mode 100644 index edd864d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack10box.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2018 Sebastian Reichel -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes.generators.rack19box import Rack19Box - - -class Rack10Box(Rack19Box): - """Closed box with screw on top for mounting in a 10" rack.""" - - def render(self): - self._render(type=10) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack19box.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack19box.py deleted file mode 100644 index c4a85ae..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack19box.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright (C) 2013-2018 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Rack19Box(Boxes): - """Closed box with screw on top for mounting in a 19" rack.""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=0.5) - self.argparser.add_argument( - "--depth", action="store", type=float, default=100., - help="inner depth in mm") - self.argparser.add_argument( - "--height", action="store", type=int, default=2, - choices=list(range(1, 17)), - help="height in rack units") - self.argparser.add_argument( - "--triangle", action="store", type=float, default=25., - help="Sides of the triangles holding the lid in mm") - self.argparser.add_argument( - "--d1", action="store", type=float, default=2., - help="Diameter of the inner lid screw holes in mm") - self.argparser.add_argument( - "--d2", action="store", type=float, default=3., - help="Diameter of the lid screw holes in mm") - - def wallxCB(self): - t = self.thickness - self.fingerHolesAt(0, self.h-1.5*t, self.triangle, 0) - self.fingerHolesAt(self.x, self.h-1.5*t, self.triangle, 180) - - def wallxfCB(self): # front - t = self.thickness - for x in (8.5, self.x+2*17.+2*t-8.5): - for y in (6., self.h-6.+t): - self.rectangularHole(x, y, 10, 6.5, r=3.25) - - self.moveTo(t+17., t) - self.wallxCB() - - def wallyCB(self): - t = self.thickness - self.fingerHolesAt(0, self.h-1.5*t, self.triangle, 0) - self.fingerHolesAt(self.y, self.h-1.5*t, self.triangle, 180) - - - def _render(self, type): - - t = self.thickness - self.h = h = self.height * 44.45 - 0.787 - t - if type == 10: - self.x = 219.0 - 2*t - else: - self.x = 448.0 - 2*t - x = self.x - y = self.y = self.depth - - d1, d2 =self.d1, self.d2 - tr = self.triangle - trh = tr / 3. - - self.rectangularWall(y, h, "ffef", callback=[self.wallyCB], - move="right", label="right") - self.flangedWall(x, h, "FFEF", callback=[self.wallxfCB], r=t, - flanges=[0., 17., -t, 17.], move="up", label="front") - self.rectangularWall(x, h, "fFeF", callback=[self.wallxCB], - label="back") - self.rectangularWall(y, h, "ffef", callback=[self.wallyCB], - move="left up", label="left") - - self.rectangularWall(x, y, "fFFF", move="up", label="bottom") - self.rectangularWall(x, y, callback=[ - lambda:self.hole(trh, trh, d=d2)] * 4, move='right', label="lid") - - self.rectangularTriangle(tr, tr, "ffe", num=4, - callback=[None, lambda: self.hole(trh, trh, d=d1)]) - - - def render(self): - self._render(type=19) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack19halfwidth.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack19halfwidth.py deleted file mode 100644 index 214c384..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rack19halfwidth.py +++ /dev/null @@ -1,96 +0,0 @@ -"""Half 19inch rack unit for musical equipment.""" - -from boxes import Boxes - - -class Rack19HalfWidth(Boxes): - """Half width 19inch rack unit for musical equipment.""" - - ui_group = "Box" - - def __init__(self) -> None: - super().__init__() - self.argparser.add_argument( - '--ru_count', action='store', type=float, default=1, - help='number of rack units') - self.argparser.add_argument( - '--holes', action='store', type=str, default="xxmpwx", - help='mounting patterns: x=xlr, m=midi, p=9v-power, w=6.5mm-wire, space=next row') - self.argparser.add_argument( - '--z', action='store', type=float, default=20, - help='depth of the shorter (rackear) side') - self.argparser.add_argument( - '--deepz', action="store", type=float, default=124, - help='depth of the longer (screwed to another half sized thing) side') - - def render(self): - """Render box.""" - # pylint: disable=invalid-name - t = self.thickness - z = self.z - self.x = x = 223 - (2 * t) - self.y = y = (self.ru_count * 44.45) - 4.45 - (2 * t) - deepz = self.deepz - - # front - self.flangedWall(x, y, "FFFF", callback=[self.util_holes, self.rack_holes], r=t, - flanges=[0, 17, 0, 0], move="up") - - # top&bottom - self.trapezoidWall(x, deepz, z, "fFeF", move="up") - self.trapezoidWall(x, deepz, z, "fFeF", move="up") - - # side - self.rectangularWall(deepz, y, "fffe", move="right") - self.rectangularWall(z, y, "fffe", move="up") - - def rack_holes(self): - """Rackmount holes.""" - t = self.thickness # pylint: disable=invalid-name - self.rectangularHole(6 + t, 10, 10, 6.5, r=3.25) - self.rectangularHole(self.y - 6 + t, 10, 10, 6.5, r=3.25) - - def util_holes(self): - """Add holes.""" - self.moveTo(10, (44.45 - 4.45)/2) - for line in self.holes.split(): - with self.saved_context(): - for hole in line: - self.hole_map.get(hole, lambda _: None)(self) - self.moveTo(0, 44.45) - - def hole_xlr(self): - """Hole for a xlr port.""" - self.moveTo(16) - self.hole(-9.5, 12, 1) - self.hole(0, 0, 11.8) - self.hole(9.5, -12, 1) - self.moveTo(16) - - def hole_midi(self): - """Hole for a midi port.""" - self.moveTo(17) - self.hole(-11.1, 0, 1) - self.hole(0, 0, 7.5) - self.hole(11.1, 0, 1) - self.moveTo(17) - - def hole_power(self): - """Hole for a 9v power port.""" - self.moveTo(11) - self.rectangularHole(0, 0, 9, 11) - self.moveTo(11) - - def hole_wire(self): - """Hole for a wire.""" - self.moveTo(3) - self.hole(0, 0, 3.25) - print('hi') - self.moveTo(3) - - hole_map = { - 'm': hole_midi, - 'p': hole_power, - 'w': hole_wire, - 'x': hole_xlr, - } diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rackbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rackbox.py deleted file mode 100644 index a495f7c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rackbox.py +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright (C) 2013-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class RackBox(Boxes): - """Closed box with screw on top and mounting holes""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1.2) - self.buildArgParser("x", "y", "h", "outside") - self.argparser.add_argument( - "--triangle", action="store", type=float, default=25., - help="Sides of the triangles holding the lid in mm") - self.argparser.add_argument( - "--d1", action="store", type=float, default=2., - help="Diameter of the inner lid screw holes in mm") - self.argparser.add_argument( - "--d2", action="store", type=float, default=3., - help="Diameter of the lid screw holes in mm") - self.argparser.add_argument( - "--d3", action="store", type=float, default=4., - help="Diameter of the mounting screw holes in mm") - self.argparser.add_argument( - "--holedist", action="store", type=float, default=7., - help="Distance of the screw holes from the wall in mm") - - def wallxCB(self): - t = self.thickness - self.fingerHolesAt(0, self.h-1.5*t, self.triangle, 0) - self.fingerHolesAt(self.x, self.h-1.5*t, self.triangle, 180) - - def wallxfCB(self): # front - t = self.thickness - hd = self.holedist - for x in (hd, self.x+3*hd+2*t): - for y in (hd, self.h-hd+t): - self.hole(x, y, self.d3/2.) - - self.moveTo(t+2*hd, t) - self.wallxCB() - - def wallyCB(self): - t = self.thickness - self.fingerHolesAt(0, self.h-1.5*t, self.triangle, 0) - self.fingerHolesAt(self.y, self.h-1.5*t, self.triangle, 180) - - - def render(self): - - t = self.thickness - self.h = h = self.h + 2*t # compensate for lid - x, y, h = self.x, self.y, self.h - d1, d2, d3 =self.d1, self.d2, self.d3 - hd = self.holedist - tr = self.triangle - trh = tr / 3. - - if self.outside: - self.x = x = self.adjustSize(x) - self.y = y = self.adjustSize(y) - self.h = h = h - 3*t - - self.rectangularWall(x, h, "fFeF", callback=[self.wallxCB], - move="right") - self.rectangularWall(y, h, "ffef", callback=[self.wallyCB], move="up") - self.flangedWall(x, h, "FFeF", callback=[self.wallxfCB], r=t, - flanges=[0., 2*hd, -t, 2*hd]) - self.rectangularWall(y, h, "ffef", callback=[self.wallyCB], - move="left up") - - self.rectangularWall(x, y, "fFFF", move="right") - self.rectangularWall(x, y, callback=[ - lambda:self.hole(trh, trh, d=d2)] * 4, move='up') - - self.rectangularTriangle(tr, tr, "ffe", num=4, - callback=[None, lambda: self.hole(trh, trh, d=d1)]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rectangularWall.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rectangularWall.py deleted file mode 100644 index 97d425c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rectangularWall.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class RectangularWall(Boxes): - """Simple wall with options for different edges""" - - ui_group = "Part" # see ./__init__.py for names - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.CabinetHingeSettings) - self.addSettingsArgs(edges.ClickSettings) - self.addSettingsArgs(edges.DoveTailSettings) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.GearSettings) - self.addSettingsArgs(edges.GripSettings) - self.addSettingsArgs(edges.HingeSettings) - self.addSettingsArgs(edges.ChestHingeSettings) - self.addSettingsArgs(edges.SlideOnLidSettings) - self.addSettingsArgs(edges.StackableSettings) - - self.buildArgParser(x=100, h=100) - - self.argparser.add_argument( - "--bottom_edge", action="store", - type=ArgparseEdgeType("cCdDeEfFghiIjJkKlLmMnNoOpPqQRsSšŠuUvV"), choices=list("cCdDeEfFghiIjJkKlLmMnNoOpPqQRsSšŠuUvV"), - default="e", help="edge type for bottom edge") - self.argparser.add_argument( - "--right_edge", action="store", - type=ArgparseEdgeType("cCdDeEfFghiIjJkKlLmMnNoOpPqQRsSšŠuUvV"), choices=list("cCdDeEfFghiIjJkKlLmMnNoOpPqQRsSšŠuUvV"), - default="e", help="edge type for right edge") - self.argparser.add_argument( - "--top_edge", action="store", - type=ArgparseEdgeType("cCdDeEfFghiIjJkKlLmMnNoOpPqQRsSšŠuUvV"), choices=list("cCdDeEfFghiIjJkKlLmMnNoOpPqQRsSšŠuUvV"), - default="e", help="edge type for top edge") - self.argparser.add_argument( - "--left_edge", action="store", - type=ArgparseEdgeType("cCdDeEfFghiIjJkKlLmMnNoOpPqQRsSšŠuUvV"), choices=list("cCdDeEfFghiIjJkKlLmMnNoOpPqQRsSšŠuUvV"), - default="e", help="edge type for left edge") - - - def cb(self, nr): - t = self.thickness - if self.edgetypes[nr] == "f": - self.fingerHolesAt(0, -2.5*t, self.h if nr % 2 else self.x, 0) - - def render(self): - # adjust to the variables you want in the local scope - t = self.thickness - - self.edgetypes = [self.bottom_edge, self.right_edge, self.top_edge, self.left_edge] - - self.moveTo(3*t, 3*t) - self.rectangularWall(self.x, self.h, self.edgetypes, callback=self.cb) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/regularbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/regularbox.py deleted file mode 100644 index 0bdce89..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/regularbox.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.generators.bayonetbox import BayonetBox - - -class RegularBox(BayonetBox): - """Box with regular polygon as base""" - - description = """For short side walls that don't fit a connecting finger reduce *surroundingspaces* and *finger* in the Finger Joint Settings. - -The lids needs to be glued. For the bayonet lid all outside rings attach to the bottom, all inside rings to the top. -""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1) - self.buildArgParser("h", "outside") - self.argparser.add_argument( - "--radius_bottom", action="store", type=float, default=50.0, - help="inner radius of the box bottom (at the corners)") - self.argparser.add_argument( - "--radius_top", action="store", type=float, default=50.0, - help="inner radius of the box top (at the corners)") - self.argparser.add_argument( - "--n", action="store", type=int, default=5, - help="number of sides") - self.argparser.add_argument( - "--top", action="store", type=str, default="none", - choices=["none", "hole", "angled hole", "angled lid", "angled lid2", "round lid", "bayonet mount", "closed"], - help="style of the top and lid") - self.argparser.add_argument( - "--alignment_pins", action="store", type=float, default=1.0, - help="diameter of the alignment pins for bayonet lid") - self.argparser.add_argument( - "--bottom", action="store", type=str, default="closed", - choices=["none", "closed", "hole", "angled hole", "angled lid", "angled lid2", "round lid"], - help="style of the bottom and bottom lid") - - self.lugs=6 - - def render(self): - - r0, r1, h, n = self.radius_bottom, self.radius_top, self.h, self.n - - if self.outside: - r0 = r0 - self.thickness / math.cos(math.radians(360/(2*n))) - r1 = r1 - self.thickness / math.cos(math.radians(360/(2*n))) - if self.top == "none": - h = self.adjustSize(h, False) - elif "lid" in self.top and self.top != "angled lid": - h = self.adjustSize(h) - self.thickness - else: - h = self.adjustSize(h) - - t = self.thickness - - - r0, sh0, side0 = self.regularPolygon(n, radius=r0) - r1, sh1, side1 = self.regularPolygon(n, radius=r1) - - # length of side edges - #l = (((side0-side1)/2)**2 + (sh0-sh1)**2 + h**2)**0.5 - l = ((r0-r1)**2 + h**2)**.5 - # angles of sides -90° aka half of top angle of the full pyramid sides - a = math.degrees(math.asin((side1-side0)/2/l)) - # angle between sides (in boxes style change of travel) - phi = 180 - 2 * math.degrees( - math.asin(math.cos(math.pi/n) / math.cos(math.radians(a)))) - - fingerJointSettings = copy.deepcopy(self.edges["f"].settings) - fingerJointSettings.setValues(self.thickness, angle=phi) - fingerJointSettings.edgeObjects(self, chars="gGH") - - beta = math.degrees(math.atan((sh1-sh0)/h)) - angle_bottom = 90 + beta - angle_top = 90 - beta - - fingerJointSettings = copy.deepcopy(self.edges["f"].settings) - fingerJointSettings.setValues(self.thickness, angle=angle_bottom) - fingerJointSettings.edgeObjects(self, chars="yYH") - - fingerJointSettings = copy.deepcopy(self.edges["f"].settings) - fingerJointSettings.setValues(self.thickness, angle=angle_top) - fingerJointSettings.edgeObjects(self, chars="zZH") - - - def drawTop(r, sh, top_type, joint_type): - if top_type == "closed": - self.regularPolygonWall(corners=n, r=r, edges=joint_type[1], move="right") - elif top_type == "angled lid": - self.regularPolygonWall(corners=n, r=r, edges='e', move="right") - self.regularPolygonWall(corners=n, r=r, edges='E', move="right") - elif top_type in ("angled hole", "angled lid2"): - self.regularPolygonWall(corners=n, r=r, edges=joint_type[1], move="right", - callback=[lambda:self.regularPolygonAt( - 0, 0, n, h=sh-t)]) - if top_type == "angled lid2": - self.regularPolygonWall(corners=n, r=r, edges='E', move="right") - elif top_type in ("hole", "round lid"): - self.regularPolygonWall(corners=n, r=r, edges=joint_type[1], move="right", - hole=(sh-t)*2) - if top_type == "round lid": - self.parts.disc(sh*2, move="right") - if self.top == "bayonet mount": - self.diameter = 2*sh - self.parts.disc(sh*2-0.1*t, callback=self.lowerCB, - move="right") - self.regularPolygonWall(corners=n, r=r, edges='F', - callback=[self.upperCB], move="right") - self.parts.disc(sh*2, move="right") - - - with self.saved_context(): - drawTop(r0, sh0, self.bottom, "yY") - drawTop(r1, sh1, self.top, "zZ") - - self.regularPolygonWall(corners=n, r=max(r0, r1), edges='F', move="up only") - - fingers_top = self.top in ("closed", "hole", "angled hole", - "round lid", "angled lid2", "bayonet mount") - fingers_bottom = self.bottom in ("closed", "hole", "angled hole", - "round lid", "angled lid2") - - t_ = self.edges["G"].startwidth() - bottom_edge = ('y' if fingers_bottom else 'e') - top_edge = ('z' if fingers_top else 'e') - d_top = max(0, -t_ * math.sin(math.radians(a))) - d_bottom = max(0.0, t_ * math.sin(math.radians(a))) - l -= (d_top + d_bottom) - - if n % 2: - e = bottom_edge + 'ege' + top_edge + 'eeGee' - borders = [side0, 90-a, d_bottom, 0, l, 0, d_top, 90+a, side1, - 90+a, d_top, -90, t_, 90, l, 90, t_, -90, d_bottom, 90-a] - for i in range(n): - self.polygonWall(borders, edge=e, correct_corners=False, - move="right") - else: - borders0 = [side0, 90-a, - d_bottom, -90, t_, 90, l, 90, t_, -90, d_top, - 90+a, side1, 90+a, - d_top, -90, t_, 90, l, 90, t_, -90, d_bottom, 90-a] - e0 = bottom_edge + 'eeGee' + top_edge + 'eeGee' - borders1 = [side0, 90-a, d_bottom, 0, l, 0, d_top, 90+a, side1, - 90+a, d_top, 0, l, 0, d_bottom, 90-a] - e1 = bottom_edge + 'ege' + top_edge + 'ege' - for i in range(n//2): - self.polygonWall(borders0, edge=e0, correct_corners=False, - move="right") - self.polygonWall(borders1, edge=e1, correct_corners=False, - move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/regularstarbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/regularstarbox.py deleted file mode 100644 index 7ba4b2c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/regularstarbox.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class SlotEdge(edges.Edge): - - def __call__(self, length, **kw): - t, n = self.settings.thickness, self.settings.n - r, h = self.settings.radius, self.settings.h - sh = self.settings.sh # distance side to center - - li = 2 * sh * math.tan(math.radians(90/n)) # side inner 2x polygon - ls2 = t / math.tan(math.radians(180/n)) - ls1 = t / math.cos(math.radians(90-(180/n))) - - lo = (length-li-2*ls1)/2 - - li = li - 2*ls2 # correct for overlap of wall - - d = h/2 - - if li > 0: - poly = [lo-1, (90, 1), d+t-1, -90, ls1+ls2, -90, d-t, (90, t)] - self.polyline(*(poly + [li-2*t] + list(reversed(poly)))) - - def startwidth(self) -> float: - return self.settings.thickness - - -class RegularStarBox(Boxes): - """Regular polygon boxes that form a star when closed""" - - ui_group = "Box" - - - description = """![Open box](static/samples/RegularStarBox-2.jpg)""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser("h", "outside") - self.argparser.add_argument( - "--radius", action="store", type=float, default=50.0, - help="inner radius if the box (center to corners)") - self.argparser.add_argument( - "--n", action="store", type=int, default=5, - choices=(3, 4, 5), - help="number of sides") - - def render(self): - - r, h, n = self.radius, self.h, self.n - - if self.outside: - self.r = r = r - self.thickness / math.cos(math.radians(360/(2*n))) - self.h = h = self.adjustSize(h) - - t = self.thickness - - fingerJointSettings = copy.deepcopy(self.edges["f"].settings) - fingerJointSettings.setValues(self.thickness, angle=360./n) - fingerJointSettings.edgeObjects(self, chars="gGH") - - self.edges["e"] = SlotEdge(self, self) - - r, sh, side = self.regularPolygon(n, radius=r) - self.sh = sh - - with self.saved_context(): - self.regularPolygonWall(corners=n, r=r, edges='F', move="right") - self.regularPolygonWall(corners=n, r=r, edges='F', move="right") - - self.regularPolygonWall(corners=n, r=r, edges='F', move="up only") - - for s in range(2): - with self.saved_context(): - if n % 2: - for i in range(n): - self.rectangularWall(side, h, move="right", - edges="fgeG") - else: - for i in range(n//2): - self.rectangularWall(side, h, move="right", - edges="fGeG") - self.rectangularWall(side, h, move="right", - edges="fgeg") - - self.rectangularWall(side, h, move="up only", - edges="fgeG") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/robotarm.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/robotarm.py deleted file mode 100644 index 9f8ac6d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/robotarm.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes import robot, servos - - -class RobotArm(Boxes): # change class name here and below - """Segments of servo powered robot arm""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - for i in range(1, 6): - ra = robot.RobotArg(True) - sa = servos.ServoArg() - self.argparser.add_argument( - "--type%i" % i, action="store", type=ra, - default="none", choices=ra.choices(), - help="type of arm segment") - self.argparser.add_argument( - "--servo%ia" % i, action="store", type=sa, default="Servo9g", - choices=sa.choices(), help="type of servo to use") - self.argparser.add_argument( - "--servo%ib" % i, action="store", type=sa, default="Servo9g", - choices=sa.choices(), help="type of servo to use on second side (if different is supported)") - self.argparser.add_argument( - "--length%i" % i, action="store", type=float, default=50., - help="length of segment axle to axle") - - def render(self): - - for i in range(5, 0,-1): - armtype = getattr(self, "type%i" % i) - length = getattr(self, "length%i" % i) - servoA = getattr(self, "servo%ia" % i) - servoB = getattr(self, "servo%ib" % i) - armcls = getattr(robot, armtype, None) - if not armcls: - continue - servoClsA = getattr(servos, servoA) - servoClsB = getattr(servos, servoB) - armcls(self, servoClsA(self), servoClsB(self))(length, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rollholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rollholder.py deleted file mode 100644 index 8581f1d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rollholder.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class RollHolder(Boxes): - """Holder for kitchen rolls or other rolls""" - - description = """Needs a dowel or pipe as axle.""" - - ui_group = "WallMounted" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.argparser.add_argument( - "--width", action="store", type=float, default=275, - help="length of the axle in mm") - self.argparser.add_argument( - "--diameter", action="store", type=float, default=120, - help="maximum diameter of the roll in mm (choose generously)") - self.argparser.add_argument( - "--height", action="store", type=float, default=80, - help="height of mounting plate in mm") - self.argparser.add_argument( - "--axle", action="store", type=float, default=25, - help="diameter of the axle in mm including play") - self.argparser.add_argument( - "--screw_holes", action="store", type=float, default=4, - help="diameter of mounting holes in mm") - self.argparser.add_argument( - "--one_piece", action="store", type=boolarg, default=True, - help="have a continuous back plate instead of two separate holders") - - def side(self, move=None): - d = self.diameter - a = self.axle - h = self.height - t = self.thickness - - tw, th = h, (d + a) / 2 + 4 * t - - if self.move(tw, th, move, True): - return - - self.moveTo(0, t) - self.edges["f"](h) - self.fingerHolesAt(-(a/2+3*t), self.burn, d/2, 90) - self.polyline(0, 90, d/2, (90, a/2 + 3*t)) - - r = a/2 + 3*t - a = math.atan2(float(d/2), (h-a-6*t)) - alpha = math.degrees(a) - - self.corner(alpha, r) - self.edge(((h-2*r)**2+(d/2)**2)**0.5) - self.corner(90-alpha, r) - self.corner(90) - - self.move(tw, th, move) - - def backCB(self): - t = self.thickness - a = self.axle - h = self.height - w = self.width - - plate = w + 2*t + h/2 if self.one_piece else h/2 + t - - self.fingerHolesAt(h/4+t/2-3*t, 0, h, 90) - self.fingerHolesAt(h/4-3*t, h-3*t-a/2, h/4, 180) - - if self.one_piece: - self.fingerHolesAt(h/4+t/2+t-3*t+w, 0, h, 90) - self.fingerHolesAt(h/4+2*t-3*t+w, h-3*t-a/2, h/4, 0) - - for x in (0, plate-6*t): - for y in (3*t, h-3*t): - self.hole(x, y, d=self.screw_holes) - - def rings(self): - a = self.axle - r = a/2 - t = self.thickness - - self.moveTo(0, a+1.5*t, -90) - for i in range(2): - self.polyline(r-1.5*t, (180, r+3*t), 0, (180, 1.5*t), 0, - (-180, r), r-1.5*t, (180, 1.5*t)) - self.moveTo(a-t, a+12*t, 180) - - - def render(self): - t = self.thickness - w = self.width - d = self.diameter - a = self.axle - h = self.height - - self.height = h = max(h, a+10*t) - - self.side(move="right") - self.side(move="right") - - self.rectangularTriangle(h/4, d/2, "ffe", num=2, r=3*t, move="right") - - if self.one_piece: - self.roundedPlate(w+h/2+2*t, h, edge="e", r=3*t, - extend_corners=False, - callback=[self.backCB], move="right") - else: - self.roundedPlate(h/2+t, h, edge="e", r=3*t, - extend_corners=False, - callback=[self.backCB], move="right") - self.roundedPlate(h/2+t, h, edge="e", r=3*t, - extend_corners=False, - callback=[self.backCB], move="right mirror") - - self.rings() diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rotary.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rotary.py deleted file mode 100644 index a19e5d2..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/rotary.py +++ /dev/null @@ -1,324 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class MotorEdge(edges.BaseEdge): - # def margin(self) -> float: - # return 30.0 - def __call__(self, l, **kw): - self.polyline( - l - 165, 45, - 25 * 2 ** 0.5, -45, - 60, -45, - 25 * 2 ** 0.5, 45, - 55) - - -class OutsetEdge(edges.OutSetEdge): - def startwidth(self) -> float: - return 20.0 - - -class HangerEdge(edges.BaseEdge): - char = "H" - - def margin(self) -> float: - return 40.0 - - def __call__(self, l, **kw): - self.fingerHolesAt(0, -0.5 * self.thickness, l, angle=0) - w = self.settings - self.polyline(0, -90, - 22 + w, 90, - 70, 135, - 2 ** 0.5 * 12, 45, - 35, -45, - 2 ** 0.5 * 0.5 * w, -90, - 2 ** 0.5 * 0.5 * w, -45, - l - 28, 45, - 2 ** 0.5 * 5, 45, 5, -90) - - -class RollerEdge(edges.BaseEdge): - def margin(self) -> float: - return 20.0 - - def __call__(self, l, **kw): - m = 40 + 100 - self.polyline((l - m) / 2.0, -45, - 2 ** 0.5 * 20, 45, - 100, 45, - 2 ** 0.5 * 20, -45, - (l - m) / 2.0) - - -class RollerEdge2(edges.BaseEdge): - def margin(self) -> float: - return self.thickness - - def __call__(self, l, **kw): - a = 30 - f = 1 / math.cos(math.radians(a)) - self.edges["f"](70) - self.polyline(0, a, f * 25, -a, l - 190, -a, f * 25, a, 0) - self.edges["f"](70) - - -class Rotary(Boxes): - """Rotary Attachment for engraving cylindrical objects in a laser cutter""" - - ui_group = "Unstable" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - - self.argparser.add_argument( - "--diameter", action="store", type=float, default=72., - help="outer diameter of the wheels (including O rings)") - self.argparser.add_argument( - "--rubberthickness", action="store", type=float, default=5., - help="diameter of the strings of the O rings") - self.argparser.add_argument( - "--axle", action="store", type=float, default=6., - help="diameter of the axles") - self.argparser.add_argument( - "--knifethickness", action="store", type=float, default=8., - help="thickness of the knives in mm. Use 0 for use with honey comb table.") - self.argparser.add_argument( - "--beamwidth", action="store", type=float, default=32., - help="width of the (aluminium) profile connecting the parts") - self.argparser.add_argument( - "--beamheight", action="store", type=float, default=7.1, - help="height of the (aluminium) profile connecting the parts") - - def mainPlate(self): - # Motor block outer side - t = self.thickness - d = self.diameter - a = self.axle - bw, bh = self.beamwidth, self.beamheight - hh = 0.5 * d + bh + 2 # hole height - self.hole(1.0 * d, hh, a/2.) - #self.hole(1.0 * d, hh, d/2.) - self.hole(2.0 * d + 5, hh, a/2.) - #self.hole(2.0 * d + 5, hh, d/2.) - # Main beam - self.rectangularHole(1.5*d+2.5, 0.5*bh, bw, bh) - - def frontPlate(self): - # Motor block inner side with motor mount - t = self.thickness - d = self.diameter - a = self.axle - bw, bh = self.beamwidth, self.beamheight - hh = 0.5 * d + bh + 2 # hole height - self.hole(1.0 * d, hh, a/2.) - #self.hole(1.0 * d, hh, d/2.) - self.hole(2.0 * d + 5, hh, a/2.) - #self.hole(2.0 * d + 5, hh, d/2.) - # Main beam - self.rectangularHole(1.5 * d+2.5, 0.5 * bh, bw, bh) - # Motor - mx = 2.7 * d + 20 - self.rectangularHole(mx, hh, 36 + 20, 36, r=36 / 2.0) - - for x in (-1, 1): - for y in (-1,1): - self.rectangularHole(mx+x * 25, hh + y * 25, 20, 4, r=2) - - def link(self, x, y, a, middleHole=False, move=None): - t = self.thickness - overallwidth = x + y - overallheight = y - ra = a / 2.0 - - if self.move(overallwidth, overallheight, move, before=True): - return - - self.moveTo(y / 2.0, 0) - self.hole(0, y / 2., ra) - self.hole(x, y / 2., ra) - - if middleHole: - self.hole(x / 2., y / 2., ra) - - self.edge(10) - self.edges["F"](60) - self.polyline(x - 70, (180, y / 2.), x, (180, y / 2.)) - - self.move(overallwidth, overallheight, move) - - def holderBaseCB(self): - bw, bh = self.beamwidth, self.beamheight - self.hole(20, self.hh - 10, self.a / 2) - self.rectangularHole(self.hl - 70, self.hh - 10, 110, self.a, r=self.a / 2) - self.rectangularHole(self.hl / 2, 0.5 * bh, bw, bh) - - def holderTopCB(self): - self.fingerHolesAt(0, 30 - 0.5 * self.thickness, self.hl, 0) - d = self.diameter / 2.0 + 1 - # XXX - y = -0.5 * self.diameter + self.th + self.hh - self.beamheight - 2. - self.hole(self.hl / 2 + d, y, self.axle / 2.0) - self.hole(self.hl / 2 - d, y, self.axle / 2.0) - self.hole(self.hl / 2 + d, y, self.diameter / 2.0) - self.hole(self.hl / 2 - d, y, self.diameter / 2.0) - - def render(self): - # adjust to the variables you want in the local scope - t = self.thickness - d = self.diameter - a = self.a = self.axle - bw, bh = self.beamwidth, self.beamheight - - # self.spacing = 0.1 * t - - # Change settings of default edges if needed. E.g.: - self.edges["f"].settings.setValues(self.thickness, space=2, finger=2, - surroundingspaces=1) - if self.knifethickness: - self.addPart(HangerEdge(self, self.knifethickness)) - else: - self.edges["H"] = self.edges["F"] - - # Holder - hw = self.hw = 70. - hh = self.hh = 35. + bh - hl = self.hl = 240 - # Base - self.rectangularWall(hl, hh, edges="hfef", callback=[self.holderBaseCB, None, - lambda: self.rectangularHole(hl / 2 + 50, hh - t / 2 - 1, - 60, t + 2)], move="up") - self.rectangularWall(hl, hh, edges="hfef", callback=[self.holderBaseCB], move="up") - self.rectangularWall(hl, hw, edges="ffff", callback=[lambda: self.hole(hl / 2 - 16 - 20, 25, 5)], move="up") - - with self.saved_context(): - self.rectangularWall(hw, hh, edges="hFeF", callback=[ - lambda: self.hole(hw / 2, hh - 20, 4)],move="right") - self.rectangularWall(hw, hh, edges="hFeF", move="right") - # Top - th = self.th = 30 - # sides - - self.rectangularWall(hw + 20, th, edges="fFeF", move="right", - callback=[lambda: self.fingerHolesAt(20 - 0.5 * t, 0, th)]) - self.rectangularWall(hw + 20, th, edges="fFeF", move="right", - callback=[lambda: self.fingerHolesAt(20 - 0.5 * t, 0, th)]) - - self.rectangularWall(hw, hh, edges="hFeF", move="up only") - outset = OutsetEdge(self, None) - roller2 = RollerEdge2(self, None) - self.rectangularWall(hl, th, edges=[roller2, "f", "e", "f"], callback=[ - lambda: self.hole(20, 15, a / 2), None, lambda: self.rectangularHole(50, th - 15, 70, a, r=a / 2)], - move="up") - self.rectangularWall(hl, th, edges=[roller2, "f", "e", "f"], callback=[ - lambda: self.hole(20, 15, a / 2), None, lambda: self.rectangularHole(50, th - 15 - t, 70, a, r=a / 2)], - move="up") - self.rectangularWall(hl, th, edges=[roller2, "f", RollerEdge(self, None), "f"], callback=[ - self.holderTopCB], move="up") - self.rectangularWall(hl, 20 - t, edges="feee", move="up") - tl = 70 - self.rectangularWall(tl, hw + 20, edges="FeFF", move="right", - callback=[None, lambda: self.fingerHolesAt(20 - 0.5 * t, 0, tl)]) - self.rectangularWall(tl, hw + 20, edges="FeFF", move="", - callback=[None, lambda: self.fingerHolesAt(20 - 0.5 * t, 0, tl)]) - self.rectangularWall(tl, hw + 20, edges="FeFF", move="left up only", - callback=[None, lambda: self.fingerHolesAt(20 - 0.5 * t, 0, tl)]) - - # Links - self.link(hl - 40, 25, a, True, move="up") - self.link(hl - 40, 25, a, True, move="up") - self.link(hl - 40, 25, a, True, move="up") - self.link(hl - 40, 25, a, True, move="up") - - with self.saved_context(): - self.rectangularWall(hw - 2 * t - 2, 60, edges="efef", move="right") - self.rectangularWall(hw - 4 * t - 4, 60, edges="efef", move="right") - # Spindle auxiliaries - self.parts.wavyKnob(50, callback=lambda: self.nutHole("M8"), move="right") - self.parts.wavyKnob(50, callback=lambda: self.nutHole("M8"), move="right") - - self.rectangularWall(hw - 2 * t - 4, 60, edges="efef", move="up only") - - with self.saved_context(): - slot = edges.SlottedEdge(self, [(30 - t) / 2, (30 - t) / 2], slots=15) - self.rectangularWall(30, 30, edges=["e", "e", slot, "e"], - callback=[lambda: self.hole(7, 23, self.axle / 2)], move="right") - self.rectangularWall(30, 30, edges=["e", "e", slot, "e"], - callback=[lambda: self.hole(7, 23, self.axle / 2)], move="right") - leftover = (hw - 6 * t - 6 - 20) / 2.0 - slot = edges.SlottedEdge(self, [leftover, 20, leftover], slots=15) - self.rectangularWall(hw - 4 * t - 6, 30, edges=[slot, "e", "e", "e"], - callback=[lambda: self.hole((hw - 4 * t - 6) / 2., 15, 4)], move="right") - for i in range(3): - self.rectangularWall(20, 30, - callback=[lambda: self.nutHole("M8", 10, 15)], move="right") - self.rectangularWall(20, 30, - callback=[lambda: self.hole(10, 15, 4)], move="right") - - self.rectangularWall(30, 30, move="up only") - - self.h = h = bh + 2 + 1.0 * d # height of outer pieces - # Other side - if self.knifethickness: - ow = 10 - self.rectangularWall(3.6 * d, h, edges="hfFf", callback=[ - lambda:self.rectangularHole(1.8 * d, 0.5 * bh, bw, bh)], - move="up") - self.rectangularWall(3.6 * d, h, edges="hfFf", callback=[ - lambda:self.rectangularHole(1.8 * d, 0.5 * bh, bw, bh)], - move="up") - self.rectangularWall(3.6 * d, ow, edges="ffff", move="up") - self.rectangularWall(3.6 * d, ow, edges="ffff", move="up") - with self.saved_context(): - self.rectangularWall(ow, h, edges="hFFH", move="right") - self.rectangularWall(ow, h, edges="hFFH", move="right") - self.rectangularWall(ow, h, edges="hFFH", move="up only") - - # Motor block - mw = 40 - self.rectangularWall(3.6 * d, h, edges=["h", "f", MotorEdge(self, None),"f"], callback=[self.mainPlate], move="up") - self.rectangularWall(3.6 * d, h, edges=["h", "f", MotorEdge(self, None),"f"], callback=[self.frontPlate], move="up") - self.rectangularWall(3.6 * d, mw, edges="ffff", move="up") - with self.saved_context(): - self.rectangularWall(mw, h, edges="hFeH", move="right") - self.rectangularWall(mw, h, edges="hFeH", move="right") - - self.pulley(88, "GT2_2mm", r_axle=a / 2.0, move="right") - self.pulley(88, "GT2_2mm", r_axle=a / 2.0, move="right") - self.rectangularWall(mw, h, edges="hFeH", move="up only") - self.axle = 19 - - for i in range(3): - self.parts.disc(self.diameter - 2 * self.rubberthickness, - hole=self.axle, move="right") - self.parts.disc(self.diameter - 2 * self.rubberthickness, - hole=self.axle, move="up right") - - for i in range(3): - self.parts.disc(self.diameter - 2 * self.rubberthickness, - hole=self.axle, move="left") - self.parts.disc(self.diameter - 2 * self.rubberthickness, - hole=self.axle, move="left up") - - for i in range(3): - self.parts.disc(self.diameter - 2 * self.rubberthickness + 4, - hole=self.axle, move="right") - self.parts.disc(self.diameter - 2 * self.rubberthickness + 4, - hole=self.axle, move="right up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/roundedbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/roundedbox.py deleted file mode 100644 index 429a8c2..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/roundedbox.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import boxes - - -class RoundedBox(boxes.Boxes): - """Box with vertical edges rounded""" - - description = """ -Default: edge_style = f Finger Joint: -![Finger Joint](static/samples/RoundedBox-2.jpg) - -Alternative: edge_style = h Edge (parallel Finger Joint Holes): -![Finger Joint Holes](static/samples/RoundedBox-3.jpg) - -With lid: -""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - boxes.Boxes.__init__(self) - self.addSettingsArgs(boxes.edges.FingerJointSettings) - self.addSettingsArgs(boxes.edges.DoveTailSettings) - self.addSettingsArgs(boxes.edges.FlexSettings) - self.buildArgParser("x", "y", "outside", sh="100.0") - self.argparser.add_argument( - "--radius", action="store", type=float, default=15, - help="Radius of the corners in mm") - self.argparser.add_argument( - "--wallpieces", action="store", type=int, default=1, - choices=[1, 2, 3, 4], help="number of pieces for outer wall") - self.argparser.add_argument( - "--edge_style", action="store", - type=boxes.ArgparseEdgeType("fFh"), choices=list("fFh"), - default="f", - help="edge type for top and bottom edges") - self.argparser.add_argument( - "--top", action="store", type=str, default="none", - choices=["closed", "hole", "lid",], - help="style of the top and lid") - - def hole(self): - t = self.thickness - x, y, r = self.x, self.y, self.radius - - dr = 2*t - if self.edge_style == "h": - dr = t - - if r > dr: - r -= dr - else: - x += dr - 2*r - y += dr - 2*r - self.moveTo(dr-r, 0) - r = 0 - - lx = x - 2*r - 2*dr - ly = y - 2*r - 2*dr - - self.moveTo(0, dr) - for l in (lx, ly, lx, ly): - self.edge(l) - self.corner(90, r) - - def cb(self, nr): - h = 0.5 * self.thickness - - left, l, right = self.surroundingWallPiece(nr, self.x, self.y, self.radius, self.wallpieces) - for dh in self.sh[:-1]: - h += dh - self.fingerHolesAt(0, h, l, 0) - - def render(self): - - x, y, sh, r = self.x, self.y, self.sh, self.radius - - if self.outside: - self.x = x = self.adjustSize(x) - self.y = y = self.adjustSize(y) - self.sh = sh = self.adjustSize(sh) - - r = self.radius = min(r, y / 2.0) - - t = self.thickness - - h = sum(sh) + t * (len(sh) - 1) - es = self.edge_style - - corner_holes = True - if self.edge_style == "f": - pe = "F" - ec = False - elif self.edge_style == "F": - pe = "f" - ec = False - else: # "h" - pe = "f" - corner_holes = True - ec = True - - with self.saved_context(): - self.roundedPlate(x, y, r, es, wallpieces=self.wallpieces, - extend_corners=ec, move="right") - for dh in self.sh[:-1]: - self.roundedPlate(x, y, r, "f", wallpieces=self.wallpieces, - extend_corners=False, move="right") - self.roundedPlate(x, y, r, es, wallpieces=self.wallpieces, - extend_corners=ec, move="right", - callback=[self.hole] if self.top != "closed" else None) - if self.top == "lid": - r_extra = self.edges[self.edge_style].spacing() - self.roundedPlate(x+2*r_extra, - y+2*r_extra, - r+r_extra, - "e", wallpieces=self.wallpieces, - extend_corners=False, move="right") - - self.roundedPlate(x, y, r, es, wallpieces=self.wallpieces, move="up only") - - self.surroundingWall(x, y, r, h, pe, pe, pieces=self.wallpieces, - callback=self.cb) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/royalgame.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/royalgame.py deleted file mode 100644 index a1dfeb7..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/royalgame.py +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class RoyalGame(Boxes): - """The Royal Game of Ur""" - - ui_group = "Misc" - - description = """Most of the blue lines need to be engraved by cutting with high speed and low power. But there are three blue holes that actually need to be cut: The grip hole in the lid and two tiny rectangles on the top and bottom for the lid to grip into. - -![Lid Details](static/samples/RoyalGame-2.jpg) - -![All pieces](static/samples/RoyalGame-3.jpg) - -""" - - def __init__(self) -> None: - Boxes.__init__(self) - - - self.addSettingsArgs(edges.FingerJointSettings) - self.buildArgParser(x=200) - - def dice(self, size, num=1, move=None): - - s = size - r = s / 20.0 - dr = r * 2 - h = s/2*3**0.5 - t = self.thickness - tw, th = (num + 0.5) * size, size - - if self.move(tw, th, move, True): - return - - self.moveTo(r, 0) - for i in range(2*num): - self.polyline((s-t)/2-dr, 90, h/2-r, -90, t, -90, h/2-r, 90, (s-t)/2-dr, (120, r), s-2*dr, (120, r), s-2*dr, (120, r)) - self.ctx.stroke() - if i % 2: - self.moveTo(.5*s - 2*dr, s, 180) - else: - self.moveTo(1.5*s -2*dr, s, 180) - - self.move(tw, th, move) - - def five(self, x, y, s): - self.hole(x, y, 0.05*s) - self.hole(x, y, 0.12*s) - for dx in (-1, 1): - for dy in (-1, 1): - self.hole(x+dx*.25*s, y+dy*.25*s, 0.05*s) - self.hole(x+dx*.25*s, y+dy*.25*s, 0.12*s) - - @restore - @holeCol - def _castle(self, x, y, s): - l = s/7*2**0.5 - self.moveTo(x-s/2 + s/14, y-s/2, 45) - self.polyline(*([l, -90, l, 90]*3 + [l/2, 90])*4) - - def castle(self, x, y, s): - self._castle(x, y, 0.9*s) - self._castle(x, y, 0.5*s) - self.five(x, y, 0.4*s) - - def castles(self, x, y, s): - for dx in (-1, 1): - for dy in (-1, 1): - self._castle(x+dx*0.25*s, y+dy*0.25*s, 0.4*s) - self.five(x+dx*0.25*s, y+dy*0.25*s, 0.3*s) - - @restore - @holeCol - def rosette(self, x, y, s): - self.moveTo(x, y, 22.5) - with self.saved_context(): - self.moveTo(0.1*s, 0, -30) - for i in range(8): - self.polyline(0, (60, 0.35*s), 0, 120, 0, (60, 0.35*s), 0, - -120, 0, (45, 0.1*s), 0, -120) - self.moveTo(0, 0, -22.5) - self.moveTo(0.175*s, 0) - for i in range(8): - self.polyline(0, (67.5, 0.32*s), 0, 90, 0, (67.5, 0.32*s), 0, -180) - - @holeCol - def eyes(self, x, y, s): - for dx in (-1, 1): - for dy in (-1, 1): - posx = x+dx*0.3*s - posy = y+dy*0.25*s - self.rectangularHole(posx, posy, 0.4*s, 0.5*s) - self.hole(posx, posy, 0.05*s) - with self.saved_context(): - self.moveTo(posx, posy-0.2*s, 60) - self.corner(60, 0.4*s) - self.corner(120) - self.corner(60, 0.4*s) - self.corner(120) - self.moveTo(0, 0, -60) - self.moveTo(0, -0.05*s, 60) - self.corner(60, 0.5*s) - self.corner(120) - self.corner(60, 0.5*s) - - for i in range(4): - self.rectangularHole(x, y + (i-1.5)*s*0.25, 0.12*s, 0.12*s) - - def race(self, x, y, s): - for dx in range(4): - for dy in range(4): - posx = (dx-1.5) * s / 4.5 + x - posy = (dy-1.5) * s / 4.5 + y - self.rectangularHole(posx, posy, s/5, s/5) - if dx in (1, 2) and dy in (0,3): - continue - self.hole(posx, posy, s/20) - - def top(self): - - patterns = [ - [self.castle, self.rosette, None, None, self.eyes, self.five, self.eyes, self.rosette], - [self.five, self.eyes, self.castles, self.five, self.rosette, self.castles, self.five, self.race]] - - s = self.size - for x in range(8): - for y in range(3): - if x in [2, 3] and y != 1: - continue - posx = (0.5+x) * s - posy = (0.5+y) * s - self.rectangularHole(posx, posy, 0.9*s, 0.9*s) - pattern = patterns[y % 2][x] - if pattern: - pattern(posx, posy, 0.9*s) - - def player1(self): - for i in range(3): - self.hole(0, 0, r=self.size * (i+2) / 12) - - def player2(self, x=0, y=0): - s = self.size - self.hole(x, y, 0.07*s) - for dx in (-1, 1): - for dy in (-1, 1): - self.hole(x+dx*.2*s, y+dy*.2*s, 0.07*s) - - def render(self): - - x = self.x - t = self.thickness - self.size = size = x / 8.0 - h = size/2 * 3**0.5 - y = 3 * size - - self.rectangularWall(x, h, "FLFF", move="right") - self.rectangularWall(y, h, "nlmE", callback=[ - lambda:self.hole(y/2, h/2, d=0.6*h)], move="up") - self.rectangularWall(y, h, "FfFf") - self.rectangularWall(x, h, "FeFF", move="left up") - - self.rectangularWall(x, y, "fMff", move="up") - self.rectangularWall(x, y, "fNff", callback=[self.top,], move="up") - - - self.partsMatrix(7, 7, "up", self.parts.disc, 0.8*size, callback=self.player1) - self.partsMatrix(7, 7, "up", self.parts.disc, 0.8*size, callback=self.player2) - - self.dice(size, 4, move="up") - self.dice(size, 4, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sevensegment.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sevensegment.py deleted file mode 100644 index fa4033a..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sevensegment.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class SevenSegmentPattern(Boxes): - """Holepatterns and walls for a seven segment digit""" - - description = """This pattern is indented to be used with a LED stripe that is wound through all segments in an S pattern while the stripe being upright on its side. It can also be used with small pieces of LED stripes connected with short wires for large enough sizes. -""" - - ui_group = "Holes" - - def __init__(self): - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.argparser.add_argument( - "--digit", action="store", type=float, default=100.0, - help="height of the digit (without walls) in mm") - self.argparser.add_argument( - "--h", action="store", type=float, default=20.0, - help="height separation walls in mm") - - @restore - @holeCol - def segment(self, l, w): - w2 = w * 2**0.5 - self.moveTo(0, 0, 45) - self.polyline(w2, -45, l-2*w, -45, w2, -90, w2, -45, - l-2*w, -45, w2, -90) - - @restore - def seven_segments(self, x): - t = self.thickness - l = 0.4 * x - w = 0.05 * x - d = 0.05 * x - width = l + 2*w + d # 0.55 * x - - #self.rectangularHole(width/2, x/2, width, x) - - for px in [w/2 + d/2 , w/2 + l + 1.5*d]: - for py in [w + d/2, w + l + 1.5*d]: - with self.saved_context(): - self.moveTo(px, py, 90) - self.segment(l, w) - for i in range(3): - with self.saved_context(): - self.moveTo(w/2 + d, w + i*(l+d)) - self.segment(l, w) - - def seven_segment_holes(self, x): - t = self.thickness - l = 0.4 * x - w = 0.05 * x - d = 0.05 * x - width = l + 2*w + d - - for i in range(2): - self.fingerHolesAt(t/4*2**.5, x/2+w-t/4*2**.5, - 2**0.5*(width-t) - t/2, -45) - self.fingerHolesAt(t, t, 2**0.5* (.55*x/2 - t) - t/2, 45) - self.fingerHolesAt(width/2 + t/2**.5/2, - width/2 + t/2**.5/2, - 2**0.5*(l/2+d/2) - 1.5*t, 45) - self.fingerHolesAt(-t/2, x/2 + 0.25*t, x/2 - 0.25*t, 90) - self.fingerHolesAt(-t/2, 0, x/2 - 0.25*t, 90) - self.fingerHolesAt(-t, -t/2, l + 2*w + d + 2*t, 0) - self.moveTo(width, x, 180) - - def seven_segment_separators(self, x, h, n=1): - t = self.thickness - l = 0.4 * x - w = 0.05 * x - d = 0.05 * x - width = l + 2*w + d # 0.55 * x - for length in ( - 2**0.5*(width-t) - t/2, - 2**0.5* x/4 - t, - 2**0.5*(l/2+d/2) - 1.5*t, - x/2 - 0.25*t, - x/2 - 0.25*t, - l + 2*w + d + 2*t,): - self.partsMatrix(2*n, 1, "right", - self.rectangularWall, length, h, "feee") - - def render(self): - digit, h = self.digit, self.h - t = self.thickness - - self.seven_segments(digit) - self.moveTo(0.55*digit+self.spacing+t, t) - #self.seven_segments(digit) - self.seven_segment_holes(digit) - self.moveTo(0.55*digit+self.spacing+t, -t) - self.seven_segment_separators(digit, h) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sevensegmentclock.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sevensegmentclock.py deleted file mode 100644 index dcbc183..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sevensegmentclock.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - -from .sevensegment import SevenSegmentPattern - - -class SevenSegmentClock(SevenSegmentPattern): - """Seven segment clock build with LED stripe""" - - description = """You need a LED stripe that is wound through all segments in an S pattern and then continuing to the next digit while the stripe being upright on its side. Selecting *debug* gives a better idea how things fit together. - -Adding a diffuser on top or at the bottom of the segment holes will probably enhance the visuals. Just using paper may be enough. - -There is currently not a lot of space for electronics and this generator is still untested. Good luck! -""" - - ui_group = "Misc" - ui_group = "Unstable" - - def __init__(self): - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.argparser.add_argument( - "--height", action="store", type=float, default=100.0, - help="height of the front panel (with walls if outside is selected) in mm") - self.argparser.add_argument( - "--h", action="store", type=float, default=20.0, - help="depth (with walls if outside is selected) in mm") - self.buildArgParser(outside=False) - - def frontCB(self): - x = self.height - self.hole(1.27*x, 0.4*x, 0.05*x) - self.hole(1.27*x, 0.6*x, 0.05*x) - self.moveTo(0.1*x, 0.1*x) - for i in range(2): - for j in range(2): - self.seven_segments(.8 * x) - #self.seven_holes(.8 * x) - self.moveTo(.6 * x) - self.moveTo(0.1 * x) - - def backCB(self): - x = self.height - self.moveTo(0.1*x, 0.1*x) - for i in range(2): - for j in range(2): - self.seven_segment_holes(.8 * x) - self.moveTo(.6 * x) - self.moveTo(0.1 * x) - - - def render(self): - height, h = self.height, self.h - - if self.outside: - height = self.height = self.adjustSize(height) - h = self.h = self.adjustSize(h) - - t = self.thickness - y = (3*0.60 + 0.1 + 0.2) * height + 0.55 * 0.8 * height - - self.rectangularWall(height, h, "FFFF", move="right") - self.rectangularWall(y, h, "FfFf", move="up") - self.rectangularWall(y, h, "FfFf") - self.rectangularWall(height, h, "FFFF", move="left up") - - with self.saved_context(): - self.rectangularWall(y, height, "ffff", callback=[self.frontCB], move="right") - self.rectangularWall(y, height, "ffff", callback=[self.backCB], move="right") - self.rectangularWall(y, height, "ffff", move="up only") - self.seven_segment_separators(0.8*height, h, 4) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shadowbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shadowbox.py deleted file mode 100644 index e985c88..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shadowbox.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright (C) 2024 Oliver Jensen -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Shadowbox(Boxes): - """The frame and spacers necessary to display a shadowbox / lightbox.""" - - description = """ -The frame needed to build a shadowbox from paper cutouts. -The cutout used in the photographs can be downloaded [here](https://3axis.co/laser-cut-my-neighbor-totoro-3d-lightbox-lamp-cdr-file/eoxldrxo/). - -See the diagram below for dimensions. - -![diagram](static/samples/Shadowbox-diagram.jpg) - -![backlit](static/samples/Shadowbox-backlit.jpg) -""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.DoveTailSettings, angle=10, depth=1.5, radius=0.1, size=1) - self.buildArgParser(x=200, y=260) - self.argparser.add_argument( - "--layers", action="store", type=int, default=7, - help="the number of paper layers; don't forget the back (blank) layer!") - self.argparser.add_argument( - "--framewidth", action="store", type=float, default=10, - help="the width of the paper layer frames") - self.argparser.add_argument( - "--frameheight", action="store", type=float, default=10, - help="the height of the paper layer frames") - self.argparser.add_argument( - "--extraheight", action="store", type=float, default=20, - help="cumulative height of your paper layers, play between frames, the LED strip, battery/wiring, anything else you want to fit in the case") - self.argparser.add_argument( - "--casejoinery", action="store", type=boolarg, default=True, - help="whether or not to join sides to front plate (disable if doing manual joins on fancy wood)") - - def render(self): - x, y = self.x, self.y - t = self.thickness - extraheight = self.extraheight - frameheight = self.frameheight - framewidth = self.framewidth - casejoinery = self.casejoinery - layers = self.layers - height = layers * t + extraheight - - # inner frames horizontal bars - for _ in range(2*layers): - self.polygonWall([ - x, 90, - frameheight, 90, - framewidth, 0, x - framewidth*2, 0, framewidth, 90, - frameheight, 90], - "eeDeDe", move="up") - - # inner frames vertical bars - for _ in range(2*layers): - self.rectangularWall(y - frameheight*2, framewidth, "eded", move="up") - - # faceplate - hypotenuse = math.sqrt((frameheight+t)**2 + (framewidth+t)**2) - angle = math.degrees(math.acos((framewidth+t) / hypotenuse)) - edgetypes = 'eFeeee' if casejoinery else 'eeeeee' - - vframe_poly = [ - t, 0, y, 0, t, 90+angle, - hypotenuse, 90-angle, - y - frameheight*2, 90-angle, - hypotenuse, 90+angle] - hframe_poly = [ - t, 0, x, 0, t, 90+angle, - hypotenuse, 90-angle, - x - framewidth*2, 90-angle, - hypotenuse, 90+angle] - - self.polygonWall(vframe_poly, edgetypes, move="up") - self.polygonWall(vframe_poly, edgetypes, move="up") - - angle = 90 - angle - self.polygonWall(hframe_poly, edgetypes, move="up") - self.polygonWall(hframe_poly, edgetypes, move="up") - - # case sides - if casejoinery: - top_edge = 'f' - else: - top_edge = 'e' - self.rectangularWall(x, height, f"ef{top_edge}f", move="up") - self.rectangularWall(x, height, f"ef{top_edge}f", move="up") - self.rectangularWall(y, height, f"eF{top_edge}F", move="up") - self.rectangularWall(y, height, f"eF{top_edge}F", move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shoe.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shoe.py deleted file mode 100644 index db79656..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shoe.py +++ /dev/null @@ -1,146 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Shoe(Boxes): - """Shoe shaped box""" - - description = """Shoe shaped box with flat sides and rounded top. - Works best if flex if under slight compression. - Make sure that the following conditions are met: - y > tophole + r + fronttop; - height > frontheight.""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.FlexSettings) - - self.argparser.add_argument( - "--width", action="store", type=float, default=65, - help="width of the shoe") - self.argparser.add_argument( - "--length", action="store", type=float, default=175, - help="length front to back") - self.argparser.add_argument( - "--height", action="store", type=float, default=100, - help="height at the back of the shoe") - self.argparser.add_argument( - "--frontheight", action="store", type=float, default=35, - help="height at the front of the shoe") - self.argparser.add_argument( - "--fronttop", action="store", type=float, default=20, - help="length of the flat part at the front of the shoe") - self.argparser.add_argument( - "--tophole", action="store", type=float, default=75, - help="length of the opening at the top") - self.argparser.add_argument( - "--radius", action="store", type=float, default=30, - help="radius of the bend") - - - def render(self): - x, y, h = self.width, self.length, self.height - t = self.thickness - - hf = self.frontheight - yg = self.tophole - tf = self.fronttop - r=self.radius - - if (hf > h): - # Give an error because the result will be wrong with possible unconnected paths - raise ValueError("Height at front of shoe must be less than height at back of shoe.") - - stretch = (self.edges["X"].settings.stretch) - - self.ctx.save() - self.rectangularWall(y, x, "FFFF", move="up", label="Bottom") - lf,a=self.shoeside(y,h,hf,yg,tf,r, move="up", label="Side") - self.shoeside(y,h,hf,yg,tf,r, move="mirror up", label="Side") - self.ctx.restore() - self.rectangularWall(y, x, "FFFF", move="right only") - self.rectangularWall(x, h, "ffef", move="up", label="Back") - self.rectangularWall(x, hf, "ffff", move="up", label="front") - dr = a*(r-t)/stretch - self.shoelip(x, tf, dr, lf, label="top") - - - def shoelip(self, x, tf, dr, lf, move=None, label=""): - - w = self.edges["F"].spacing() - - th = tf + dr + lf + self.edges["F"].spacing() + self.edges["e"].spacing() - tw = x + 2*w - if self.move(tw, th, move, True, label=label): - return - - self.moveTo(self.edges["F"].spacing(), self.edges["e"].spacing()) - - self.edges["F"](x) - self.edgeCorner("F", "F") - self.edges["F"](tf) - self.edges["X"](dr, h=x+2*w) - self.edges["F"](lf) - self.edgeCorner("F", "e") - self.edges["e"](x) - self.edgeCorner("e", "F") - self.edges["F"](lf) - self.edges["E"](dr) - self.edges["F"](tf) - self.edgeCorner("F", "F") - - self.move(tw, th, move, label=label) - - def shoeside(self, y, h, hf, yg, tf, r, move=None, label=""): - import math - - tx = y + 2 * self.edges.get('F').spacing() - ty = h + self.edges.get('f').spacing() + self.edges.get("e").spacing() - - if self.move(tx, ty, move, before=True): - return - - lf = math.sqrt((h-hf)**2+(y-yg-tf)**2) - af = 90-math.degrees(math.atan((h-hf)/(y-yg-tf))) - - atemp = math.degrees(math.atan((h-hf-r)/(y-yg-tf))) - dtemp = math.sqrt((h-hf-r)**2+(y-yg-tf)**2) - lf = math.sqrt(dtemp**2-r**2) - af = 90-atemp-math.degrees(math.atan(r/lf)) - - self.moveTo(self.edges.get('f').margin(), self.edges.get("f").margin()) - - self.edges.get('f')(y) - self.edgeCorner(self.edges["f"],self.edges["F"],90) - self.edges.get('F')(hf) - self.edgeCorner(self.edges["F"],self.edges["f"],90) - self.edges.get('f')(tf) - self.corner(af-90,r) - self.edges.get('f')(lf) - self.edgeCorner(self.edges["f"],self.edges["e"],90-af) - self.edges.get('e')(yg) - self.edgeCorner(self.edges["e"],self.edges["F"],90) - self.edges.get('F')(h) - self.edgeCorner(self.edges["F"],self.edges["f"],90) - - self.move(tx, ty, move, label=label) - - return lf,math.radians(90-af) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shutterbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shutterbox.py deleted file mode 100644 index 55a9f00..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/shutterbox.py +++ /dev/null @@ -1,231 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class ShutterBox(Boxes): - """Box with a rolling shutter made of flex""" - - ui_group = "FlexBox" - - description = """Beware of the rolling shutter effect! Use wax on sliding surfaces. - -![Inside](static/samples/ShutterBox-3.jpg) - -![Detail](static/samples/ShutterBox-2.jpg) -""" - - def side(self, l, h, r, style, move=None): - t = self.thickness - - if self.move(l+2*t, h+2*t, move, True): - return - - self.moveTo(t, t) - - self.ctx.save() - - n = self.n - a = 90. / n - ls = 2*math.sin(math.radians(a/2)) * (r-2.5*t) - - #self.hole(l-r, r, r-2.5*t) - if style == "double": - #self.hole(r, r, r-2.5*t) - self.ctx.save() - self.fingerHolesAt(r, 2*t, l-2*r, 0) - self.moveTo(r, 2.5*t, 180 - a/2) - for i in range(n): - self.fingerHolesAt(0, 0.5*t, ls, 0) - self.moveTo(ls, 0, -a) - if h - 2*r > 2*t: - self.moveTo(0, 0, a/2) - self.fingerHolesAt(0, 0.5*t, h - 2*r, 0) - self.ctx.restore() - else: - self.fingerHolesAt(0, 2*t, l-r, 0) - self.moveTo(l-r, 2.5*t, a/2) - for i in range(n): - self.fingerHolesAt(0, -0.5*t, ls, 0) - self.moveTo(ls, 0, a) - if h - 2*r > 2*t: - self.moveTo(0, 0, -a/2) - self.fingerHolesAt(0, -0.5*t, h - 2*r, 0) - self.ctx.restore() - - self.edges["f"](l) - self.corner(90) - self.edges["f"](h-r) - self.polyline(0, -90, t, 90, 0, (90, r+t)) - if style == "single": - self.polyline(l-r, 90, t) - self.edges["f"](h) - else: - self.polyline(l-2*r, (90, r+t), 0, 90, t, -90) - self.edges["f"](h-r) - - self.move(l+2*t, h+2*t, move) - - def cornerRadius(self, r, two=False, move=None): - s = self.spacing - if self.move(r, r+s, move, True): - return - for i in range(2 if two else 1): - self.polyline(r, 90, r, 180, 0, (-90, r), 0 ,-180) - self.moveTo(r, r+s, 180) - self.move(r, r+s, move) - - def rails(self, l, r, move=None): - t = self.thickness - s = self.spacing - tw, th = l+2.5*t+3*s, r+1.5*t+3*s - - if self.move(tw, th, move, True): - return - - self.moveTo(2.5*t+s, 0) - self.polyline(l-r, (90, r+t), 0, 90, t, 90, 0, (-90, r), l-r, 90, t, 90) - self.moveTo(-t-s, t+s) - self.polyline(l-r, (90, r+t), 0, 90, t, 90, 0, (-90, r), l-r, 90, t, 90) - self.moveTo(0.5*t, t+s) - self.polyline(l-r, (90, r-1.5*t), 0, 90, t, 90, 0, (-90, r-2.5*t), l-r, 90, t, 90) - self.moveTo(-t-s, t+s) - self.polyline(l-r, (90, r-1.5*t), 0, 90, t, 90, 0, (-90, r-2.5*t), l-r, 90, t, 90) - - self.move(tw, th, move) - - def rails2(self, l, r, move=None): - t = self.thickness - s = self.spacing - tw, th = l+2.5*t+3*s, 2*r+t - - if self.move(tw, th, move, True): - return - - self.moveTo(r+t, 0) - for i in range(2): - self.polyline(l-2*r, (90, r+t), 0, 90, t, 90, 0, (-90, r), l-2*r, - (-90, r), 0, 90, t, 90, 0, (90, r+t)) - self.moveTo(0, 1.5*t) - self.polyline(l-2*r, (90, r-1.5*t), 0, 90, t, 90, 0, (-90, r-2.5*t), l-2*r, - (-90, r-2.5*t), 0, 90, t, 90, 0, (90, r-1.5*t)) - self.moveTo(0, r) - - self.move(tw, th, move) - - - def door(self, l, h, move=None): - t = self.thickness - if self.move(l, h, move, True): - return - self.fingerHolesAt(t, t, h-2*t) - self.edge(2*t) - self.edges["X"](l-2*t, h) - self.polyline(0, 90, h, 90, l, 90, h, 90) - self.move(l, h, move) - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=0.5) - self.addSettingsArgs(edges.FlexSettings, distance=.75, connection=2.) - - self.buildArgParser(x=150, y=100, h=100) - self.argparser.add_argument( - "--radius", action="store", type=float, default=40.0, - help="radius of the corners") - self.argparser.add_argument( - "--style", action="store", type=str, default="single", - choices=["single", "double"], - help="Number of rounded top corners") - - - def render(self): - x, y, h, r = self.x, self.y, self.h, self.radius - style = self.style - - self.n = n = 3 - - if not r: - self.radius = r = h / 2 - self.radius = r = min(r, h/2) - - t = self.thickness - self.ctx.save() - self.side(x, h, r, style, move="right") - self.side(x, h, r, style, move="right") - if style == "single": - self.rectangularWall(y, h, "fFEF", move="right") - else: - self.rectangularWall(y, h-r, "fFeF", move="right") - self.rectangularWall(y, h-r, "fFeF", move="right") - - if style == "double": - self.cornerRadius(r, two=True, move="right") - - self.cornerRadius(r, two=True, move="right") - if style == "single": - self.rails(x, r, move="right") - else: - self.rails2(x, r, move="right") - - self.ctx.restore() - self.side(x, h, r, style, move="up only") - - self.rectangularWall(x, y, "FFFF", move="right") - - if style == "single": - self.door(x-r+0.5*math.pi*r + 3*t, y-0.2*t, move="right") - else: - self.door(x-2*r+math.pi*r + 3*t, y-0.2*t, move="right") - - self.rectangularWall(2*t, y-2.2*t, edges="eeef", move="right") - - - a = 90. / n - ls = 2*math.sin(math.radians(a/2)) * (r-2.5*t) - - edges.FingerJointSettings(t, angle=a).edgeObjects(self, chars="aA") - edges.FingerJointSettings(t, angle=a/2).edgeObjects(self, chars="bB") - - - if style == "double": - if h - 2*r > 2*t: - self.rectangularWall(h - 2*r, y, "fBfe", move="right") - self.rectangularWall(ls, y, "fAfb", move="right") - else: - self.rectangularWall(ls, y, "fAfe", move="right") - - for i in range(n-2): - self.rectangularWall(ls, y, "fAfa", move="right") - - self.rectangularWall(ls, y, "fBfa", move="right") - - self.rectangularWall(x-2*r, y, "fbfb", move="right") - else: - self.rectangularWall(x-r, y, "fbfe", move="right") - - self.rectangularWall(ls, y, "fafB", move="right") - - for i in range(n-2): - self.rectangularWall(ls, y, "fafA", move="right") - - - if h - 2*r > 2*t: - self.rectangularWall(ls, y, "fbfA", move="right") - self.rectangularWall(h - 2*r, y, "fefB", move="right") - else: - self.rectangularWall(ls, y, "fefA", move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sidedoorhousing.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sidedoorhousing.py deleted file mode 100644 index 1cbc666..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/sidedoorhousing.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (C) 2013-2020 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.generators.console2 import Console2 - - -class SideDoorHousing(Console2): - """Box with service hatches on either one or both of the sides that are locked with latches""" - - ui_group = "Box" - - description = """ -This box is designed as a housing for electronic projects but could be used for other purposes. It has hatches that can be re-opened with simple tools. If built from thin enough material, it intentionally cannot be opened with bare hands. - -The hatches are on the x sides. - -#### Assembly instructions -The main body is easy to assemble: -1. Starting with the floor and then add the four walls (for any removable sides, the wall will just be a small part on the base ) -2. Add the top piece - -For the removable walls: -1. Add the lips to the removable walls -2. Sit the latches in place (it is importand to make sure the springs on the latches point inwards and the angled ends point to the side walls. See image below) -3. Glue the U-shaped clamps in place (it is important **not** to glue the latches) - -![Wall details](static/samples/SideDoorHousing.jpg) - - -#### Re-Opening - -The latches lock in place when closed. To open them they need to be pressed in and can then be moved aside. - -![Closed Box](static/samples/SideDoorHousing-2.jpg) - -""" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=.5) - self.addSettingsArgs(edges.StackableSettings) - - self.buildArgParser(x=100, y=100, h=100, bottom_edge="s") - self.argparser.add_argument( - "--double_door", action="store", type=boolarg, default=True, - help="allow removing the backwall, too") - - - def render(self): - x, y, h = self.x, self.y, self.h - t = self.thickness - bottom = self.edges.get(self.bottom_edge) - - self.latchpos = latchpos = 3*t - - - self.rectangularWall(x, y, "ffff", move="right") # floor - if self.double_door: # top - self.rectangularWall(x, y, "EFEF", move="right") - else: - self.rectangularWall(x, y, "EFFF", move="right") - - for move in ("right", "mirror right"): - re = edges.CompoundEdge(self, ("f", "e"), - (bottom.endwidth()+t, h-t)) - if self.double_door: - le = edges.CompoundEdge(self, ("e", "f"), - (h-t, bottom.endwidth()+t)) - else: - le = "f" - self.rectangularWall( # side - y, h, (bottom, re, "f", le), ignore_widths=[1, 6], - callback=[ - None, None, lambda: - (self.rectangularHole(1.55*t, latchpos, 1.1*t, 1.1*t), - self.double_door and - self.rectangularHole(y-1.55*t, latchpos, 1.1*t, 1.1*t))], - move=move) - - - for i in range(2 if self.double_door else 1): - self.rectangularWall(x, t, (bottom, "F", "e", "F"), - ignore_widths=[1, 6], move="up") - self.rectangularWall( # back wall - x, h-1.1*t, "eEeE", - callback=[ - lambda: self.fingerHolesAt(.5*t, 0, h-4.05*t-latchpos), - lambda:self.latch_hole(h-1.2*t-latchpos), - lambda: self.fingerHolesAt(.5*t, 3.05*t+latchpos, h-4.05*t-latchpos), - lambda:self.latch_hole(latchpos)], - move="right") - self.rectangularWall(x, t, (bottom, "F", "e", "F"), - ignore_widths=[1, 6], move="down only") - if not self.double_door: - self.rectangularWall(x, h, (bottom, "F", "f", "F"), - ignore_widths=[1, 6], move="right") - - # hardware for back wall - if self.double_door: - latches = 4 - else: - latches = 2 - - self.partsMatrix(latches, 0, "right", - self.rectangularWall, 2*t, h-4.05*t-latchpos, "EeEf") - self.partsMatrix(latches, 2, "up", self.latch) - self.partsMatrix(2*latches, 2, "up", self.latch_clamp) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/silverwarebox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/silverwarebox.py deleted file mode 100644 index 32287c2..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/silverwarebox.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import Boxes, restore - - -class Silverware(Boxes): - """ - Cuttlery stand with carrying grip - using flex for rounded corners - """ - - ui_group = "Unstable" - - - def __init__(self) -> None: - Boxes.__init__(self) - - self.buildArgParser(x=250, y=154, h=120) - - self.argparser.add_argument( - "--cornerradius", action="store", type=int, default=30, - help="Radius of the corners") - self.argparser.add_argument( - "--handleheight", action="store", type=int, default=150, - help="Height of the handle") - self.argparser.add_argument( - "--handlewidth", action="store", type=int, default=120, - help="Width of the handle") - - - #################################################################### - ### Parts - #################################################################### - - def basePlate(self, x, y, r): - self.roundedPlate(x, y, r, extend_corners=False, callback=[ - lambda: self.fingerHolesAt(x / 3.0 - r, 0, 0.5 * (y - self.thickness)), - lambda: self.fingerHolesAt(x / 6.0, 0, 0.5 * (y - self.thickness)), - lambda: self.fingerHolesAt(y / 2.0 - r, 0, x), - lambda: self.fingerHolesAt(x / 2.0 - r, 0, 0.5 * (y - self.thickness)) - ]) - - def wall(self, x=100, y=100, h=100, r=0): - self.surroundingWall(x, y, r, h, top="E", bottom='h', callback={ - 0: lambda: self.fingerHolesAt(x / 6.0, 0, h - 10), - 4: lambda: self.fingerHolesAt(x / 3.0 - r, 0, h - 10), - 1: lambda: self.fingerHolesAt(y / 2.0 - r, 0, h - 10), - 3: lambda: self.fingerHolesAt(y / 2.0 - r, 0, h - 10), - 2: lambda: self.fingerHolesAt(x / 2.0 - r, 0, h - 10), - }, - move="up") - - @restore - def centerWall(self, x, h): - self.moveTo(self.edges["f"].spacing(), self.edges["f"].spacing()) - for i in range(2, 5): - self.fingerHolesAt(i * x / 6.0, 0, h - 10) - - self.edges["f"](x) - self.corner(90) - self.edges["f"](h - 10) - self.corner(90) - - self.handle(x, self.handleheight, self.handlewidth) - - self.corner(90) - self.edges["f"](h - 10) - self.corner(90) - self.ctx.stroke() - - ################################################## - ### main - ################################################## - - def render(self): - x = self.x - y = self.y - h = self.h - r = self.cornerradius - - t = self.thickness - b = self.burn - - self.wall(x, y, h, r) - self.centerWall(x, h) - self.moveTo(x + 2 * self.edges["f"].spacing()) - - l = (y - t) / 2.0 - - for _ in range(3): - self.rectangularWall(l, h - 10, edges="ffef", move="right") - - self.moveTo(-3.0 * (l + 2 * t + 8 * b), h - 10 + 2 * t + 8 * b) - self.basePlate(x, y, r) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/skadis.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/skadis.py deleted file mode 100644 index 593dc89..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/skadis.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class SkadisBoard(Boxes): - """Customizable Ikea like pegboard""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.argparser.add_argument( - "--columns", action="store", type=int, default=17, - help="Number of holes left to right counting both even and odd rows") - self.argparser.add_argument( - "--rows", action="store", type=int, default=27, - help="Number of rows of holes top to bottom") - - - def CB(self): - for r in range(self.rows): - for c in range(self.columns): - if (r+c) % 2 == 0: - continue - self.rectangularHole((c+1)*20 - 8, (r+1)*20, 5, 15, r=2.5) - - def render(self): - self.roundedPlate((self.columns+1) * 20, (self.rows+1)*20, edge="e", r=8, - extend_corners=False, callback=[self.CB]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/slantedtray.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/slantedtray.py deleted file mode 100644 index 2aee928..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/slantedtray.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright (C) 2013-2023 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from functools import partial - -from boxes import * - - -class SlantedTray(Boxes): - """One row tray with high back wall and low front wall""" - - ui_group = "Tray" - - description = """Can be used as a display or for cards or gaming tokens. Lay on the side to get piles to draw from. - ![Example Use](static/samples/SlantedTray-2.jpg)""" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - # self.addSettingsArgs(edges.StackableSettings) - - self.buildArgParser(sx="40*3", y=40.0, h=40.0, outside=False) - self.argparser.add_argument( - "--front_height", action="store", type=float, default=0.3, - help="height of the front as fraction of the total height") - - def finger_holes_CB(self, sx, h): - t = self.thickness - pos = -0.5 * t - for x in sx[:-1]: - pos += x + t - self.fingerHolesAt(pos, 0, h) - - def render(self): - # adjust to the variables you want in the local scope - sx, y, h = self.sx, self.y, self.h - t = self.thickness - - if self.outside: - self.sx = sx = self.adjustSize(sx) - self.y = y = self.adjustSize(y) - self.h = h = self.adjustSize(h, False) - - front_height = h * self.front_height - x = sum(sx) + t * (len(sx) - 1) - - self.rectangularWall( - x, - h, - "eFfF", - move="up", - callback=[partial(self.finger_holes_CB, sx, h)], - ) - - self.rectangularWall( - x, - y, - "FFfF", - move="up", - callback=[partial(self.finger_holes_CB, sx, y)], - ) - - self.rectangularWall( - x, - front_height, - "FFeF", - move="up", - callback=[ - partial(self.finger_holes_CB, sx, front_height) - ], - ) - - for _ in range(len(sx) + 1): - self.trapezoidWall(y, h, front_height, "ffef", move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/slidingdrawer.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/slidingdrawer.py deleted file mode 100644 index 559e667..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/slidingdrawer.py +++ /dev/null @@ -1,50 +0,0 @@ -from boxes import * - - -class SlidingDrawer(Boxes): - """Sliding drawer box""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser(x=60, y=100, h=30, outside='true') - self.addSettingsArgs(edges.FingerJointSettings, finger=2.0, space=2.0) - self.addSettingsArgs(edges.GroovedSettings, width=0.4) - - self.argparser.add_argument( - "--play", action="store", type=float, default=0.15, - help="play between the two parts as multiple of the wall thickness") - - def render(self): - - x, y, h = self.x, self.y, self.h - x = self.adjustSize(x) - y = self.adjustSize(y) - h = self.adjustSize(h) - - t = self.thickness - p = self.play * t - - y = y + t - if not self.outside: - x = x + 4*t+ 2*p - y = y + 3*t+ 2*p - h = h + 3*t+ 2*p - - x2 = x - (2*t + 2*p) - y2 = y - (2*t + 2*p) - h2 = h - (t + 2*p) - - self.rectangularWall(x2, h2, "FFzF", label="in box wall", move="right") - self.rectangularWall(y2, h2, "ffef", label="in box wall", move="up") - self.rectangularWall(y2, h2, "ffef", label="in box wall") - self.rectangularWall(x2, h2, "FFeF", label="in box wall", move="left up") - self.rectangularWall(y2, x2, "FfFf", label="in box bottom", move="up") - - self.rectangularWall(y, x, "FFFe", label="out box bottom", move="right") - self.rectangularWall(y, x, "FFFe", label="out box top", move="up") - self.rectangularWall(y, h, "fffe", label="out box wall") - self.rectangularWall(y, h, "fffe", label="out box wall", move="up left") - - self.rectangularWall(x, h, "fFfF", label="out box wall") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/smallpartstray.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/smallpartstray.py deleted file mode 100644 index bca0fa6..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/smallpartstray.py +++ /dev/null @@ -1,255 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes import lids -from boxes.edges import CompoundEdge - - -class SmallPartsTray(Boxes): - """Tray with slants to easier get out game tokens or screws""" - - ui_group = "Tray" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - # self.addSettingsArgs(edges.StackableSettings) - self.addSettingsArgs(lids.LidSettings) - - self.buildArgParser(sx="50*3", y=100, h=30, outside=True) - self.argparser.add_argument( - "--angle", action="store", type=float, default=45., - help="angle of the ramps") - self.argparser.add_argument( - "--rampheight", action="store", type=float, default=.5, - help="height of the ramps relative to to total height") - self.argparser.add_argument( - "--two_sided", action="store", type=boolarg, default=True, - help="have ramps on both sides. Enables sliding dividers") - self.argparser.add_argument( - "--front_panel", action="store", type=boolarg, default=True, - help="have a vertical wall at the ramp") - - - def innerWall(self, h, y, ramp_h, ramp_y, two_ramps, front=True, - move=None): - a = math.degrees(math.atan(ramp_h/ramp_y)) - l = (ramp_h**2 + ramp_y**2)**.5 - if two_ramps: - self.polygonWall( - [y-2*ramp_y, a, l, 90-a, h-ramp_h, 90, y, - 90, h-ramp_h, 90-a, l, a], - "fffeff" if front else "ffeeef", move=move) - else: - self.polygonWall( - [y-ramp_y, 90, h, 90, y, 90, h-ramp_h, 90-a, l, a], - "ffeff" if front else "ffeef", move=move) - - def outerWall(self, h, y, ramp_h, ramp_y, two_ramps, front=True, - move=None): - a = math.degrees(math.atan(ramp_h/ramp_y)) - l = (ramp_h**2 + ramp_y**2)**.5 - t = self.thickness - - def cb(): - with self.saved_context(): - self.moveTo(ramp_y, 0, 180-a) - self.fingerHolesAt(0, 0.5*t, l, 0) - if two_ramps: - self.moveTo(y-ramp_y, 0, a) - self.fingerHolesAt(0, -0.5*t, l, 0) - - if two_ramps: - self.rectangularWall( - y, h, - [CompoundEdge(self, "EFE", (ramp_y, y-2*ramp_y, ramp_y)), - CompoundEdge(self, "EF", (ramp_h, h-ramp_h)) if front else "e", - "e", - CompoundEdge(self, "FE", (h-ramp_h, ramp_h)) if front else "e"], - callback=[cb], move=move) - else: - self.rectangularWall( - y, h, [ - CompoundEdge(self, "EF", (ramp_y, y-ramp_y)) if front else "e", - "F", - "e", - CompoundEdge(self, "FE", (h-ramp_h, ramp_h))], - callback=[cb], move=move) - - - def holeCB(self, sections, height): - def CB(): - pos = -0.5 * self.thickness - for l in sections[:-1]: - pos += l + self.thickness - self.fingerHolesAt(pos, 0, height) - return CB - - def render_simple_tray_divider(self, width, height, move): - """ - Simple movable divider. A wall with small feet for a little more stability. - """ - - if self.move(width, height, move, True): - return - - t = self.thickness - self.moveTo(t) - self.polyline( - width - 2 * t, - 90, - t, - -90, - t, - 90, - height - t, - 90, - width, - 90, - height - t, - 90, - t, - -90, - t, - 90, - ) - - self.move(width, height, move) - - def render_simple_tray_divider_feet(self, move=None): - sqr2 = math.sqrt(2) - t = self.thickness - divider_foot_width = 2 * t - full_width = t + 2 * divider_foot_width - move_length = full_width / sqr2 + 2 * self.burn - move_width = full_width / sqr2 + 2 * self.burn - - if self.move(move_width, move_length, move, True): - return - - self.moveTo(self.burn) - self.ctx.save() - self.polyline( - sqr2 * divider_foot_width, - 135, - t, - -90, - t, - -90, - t, - 135, - sqr2 * divider_foot_width, - 135, - full_width, - 135, - ) - self.ctx.restore() - - self.moveTo(-self.burn / sqr2, self.burn * (1 + 1 / sqr2), 45) - self.moveTo(full_width) - - self.polyline( - 0, - 135, - sqr2 * divider_foot_width, - 135, - t, - -90, - t, - -90, - t, - 135, - sqr2 * divider_foot_width, - 135, - ) - - self.move(move_width, move_length, move) - - - def render(self): - # adjust to the variables you want in the local scope - sx, y, h = self.sx, self.y, self.h - t = self.thickness - a = self.angle - b = "e" - - if self.outside: - self.sx = sx = self.adjustSize(sx) - self.h = h = self.adjustSize(h, False) - dy = t if self.front_panel else t / 2**0.5 - self.y = y = self.adjustSize(y, dy, dy) - - x = sum(sx) + (len(sx)-1) * t - - ramp_h = h * self.rampheight - ramp_y = ramp_h / math.tan(math.radians(a)) - - if self.two_sided and (2*ramp_y + 3*t > y): - ramp_y = (y - 3*t) / 2 - ramp_h = ramp_y * math.tan(math.radians(a)) - elif ramp_y > y - t: - ramp_y = y - t - ramp_h = ramp_y * math.tan(math.radians(a)) - - ramp_l = (ramp_h**2 + ramp_y**2)**.5 - - with self.saved_context(): - self.outerWall(h, y, ramp_h, ramp_y, - self.two_sided, self.front_panel, move="up") - self.outerWall(h, y, ramp_h, ramp_y, - self.two_sided, self.front_panel, move="mirror up") - for i in range(len(sx)-1): - self.innerWall(h, y, ramp_h, ramp_y, - self.two_sided, self.front_panel, move="up") - self.innerWall(h, y, ramp_h, ramp_y, - self.two_sided, self.front_panel, move="right only") - - if self.front_panel: - self.rectangularWall( - x, h-ramp_h, "efef", - callback=[self.holeCB(sx, h-ramp_h)], move="up") - self.rectangularWall(x, ramp_l, "efef", - callback=[self.holeCB(sx, ramp_l)], move="up") - if self.two_sided: - self.rectangularWall( - x, y-2*ramp_y, "efef", - callback=[self.holeCB(sx, y-2*ramp_y)], move="up") - self.rectangularWall( - x, ramp_l, "efef", - callback=[self.holeCB(sx, ramp_l)], move="up") - if self.front_panel: - self.rectangularWall( - x, h-ramp_h, "efef", - callback=[self.holeCB(sx, h-ramp_h)], move="up") - else: - self.rectangularWall( - x, y-ramp_y, "efff", - callback=[self.holeCB(sx, y-ramp_y)], move="up") - self.rectangularWall( - x, h, "Ffef", - callback=[self.holeCB(sx, h)], move="up") - - - if self.two_sided: - with self.saved_context(): - for l in self.sx: - self.render_simple_tray_divider(l, h, move="right") - - self.partsMatrix(len(self.sx), 0, "right", self.render_simple_tray_divider_feet) - self.render_simple_tray_divider(l, h, move="up only") - - self.lid(x, y) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/smallpartstray2.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/smallpartstray2.py deleted file mode 100644 index ed767fa..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/smallpartstray2.py +++ /dev/null @@ -1,233 +0,0 @@ -# Copyright (C) 2013-2023 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.lids import LidSettings, _TopEdge - - -class TopEdge(edges.BaseEdge): - - def __init__(self, boxes, lengths, h): - super().__init__(boxes, None) - self.lengths = lengths - self.h = h - - def __call__(self, length, **kw): - h = self.h - t = self.boxes.thickness - t2 = t * 2**.5 - slot = h/2**.5 + t/2 - self.polyline( - 0, 90, t2, -45, - slot-t, -90, t, -90, slot, 135, - self.lengths[0] - t2/2) - - for l in self.lengths[1:]: - self.polyline( - 0, 45, t, 45, h/2-t2/2, -90, t, -90, h/2-t2, 135, - slot-t, -90, t, -90, slot, 135, - l - t2/2 - ) - self.polyline(t2/2) - -class SmallPartsTray2(_TopEdge): - """A Type Tray variant with slopes toward the front""" - - description = """Assemble inside out. If there are inner front to back walls start with attaching the floor boards to them. Then add the vertical inner left to right walls. After sliding in the slopes attach the outer wall to fix everything in place. - -If there are no inner front to back walls just add everything to one side wall and then add the other one after that. Possibly saving the front and back as last step.""" - - ui_group = "Tray" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addTopEdgeSettings(fingerjoint={"surroundingspaces": 1.0}, - roundedtriangle={"outset" : 1}) - self.addSettingsArgs(LidSettings) - self.buildArgParser("sx", "sy", "hi", "outside", h=30) - # "bottom_edge", "top_edge") - self.argparser.add_argument( - "--back_height", action="store", type=float, default=0.0, - help="additional height of the back wall - e top edge only") - self.argparser.add_argument( - "--radius", action="store", type=float, default=0.0, - help="radius for strengthening side walls with back_height") - self.argparser.add_argument( - "--handle", type=boolarg, default=False, help="add handle to the bottom (changes bottom edge in the front)", - ) - - def fingerHolesCB(self, sections, height): - - def CB(): - posx = -0.5 * self.thickness - for x in sections[:-1]: - posx += x + self.thickness - self.fingerHolesAt(posx, 0, height) - return CB - - - def fingerHoleLineCB(self, posx, posy, sections): - def CB(): - self.moveTo(posx, posy, 90) - for l in sections: - self.fingerHolesAt(0, 0, l, 0) - self.moveTo(l+self.thickness) - return CB - - - def xHoles(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - self.fingerHolesAt(posx, 0, self.hi) - - def yHoles(self): - t = self.thickness - posy = -0.5 * self.thickness - for y in self.sy[:-1]: - posy += y + self.thickness - self.fingerHolesAt(posy, 0, self.hi-t*2**.5) - with self.saved_context(): - self.moveTo(posy-0.5*t, self.hi, 135) - self.fingerHolesAt(-0.5*t, 0, self.hi*2**.5+t/2) - - self.moveTo(posy+self.sy[-1]+0.5*t, self.hi, 135) - self.fingerHolesAt(-0.5*t, 0, self.hi*2**.5+t/2) - - def render(self): - - # tmp settings - self.top_edge = "e" - self.bottom_edge = "F" - - if self.outside: - self.sx = self.adjustSize(self.sx) - self.sy = self.adjustSize(self.sy) - self.h = self.adjustSize(self.h, e2=False) - if self.hi: - self.hi = self.adjustSize(self.hi, e2=False) - - x = sum(self.sx) + self.thickness * (len(self.sx) - 1) - y = sum(self.sy) + self.thickness * (len(self.sy) - 1) - h = self.h - sameh = not self.hi - hi = self.hi = self.hi or h - t = self.thickness - - # outer walls - b = self.bottom_edge - tl, tb, tr, tf = self.topEdges(self.top_edge) - self.closedtop = self.top_edge in "fFhŠ" - - bh = self.back_height if self.top_edge == "e" else 0.0 - - # x sides - - self.ctx.save() - - # outer walls - front/back - if bh: - self.rectangularWall(x, h+bh, [b, "f", tb, "f"], - callback=[self.xHoles], - #ignore_widths=[], - move="up", label="back") - self.rectangularWall(x, h, ["f" if self.handle else b, "f", "e", "f"], - callback=[self.fingerHolesCB(self.sx[::-1], h),], - move="up", label="front") - else: - self.rectangularWall(x, h, [b, "F", tb, "F"], - callback=[self.xHoles], - #ignore_widths=[1, 6], - move="up", label="back") - self.rectangularWall(x, hi-t*2**.5, ["f" if self.handle else b, "F", "e", "F"], - callback=[self.fingerHolesCB(self.sx[::-1], hi-t*2**.5),], - #ignore_widths=[] if self.handle else [1, 6], - move="up", label="front") - - - # floor boards - - t2 = t * 2**.5 - dy = hi + t2/2 - slot = t + t2/2 # 1.5*t - floors = [self.sy[0]- hi - slot + t2, slot] - self.rectangularWall( - x, floors[0], "ffef", - callback=[self.fingerHolesCB(self.sx, self.sy[0]-dy)], - move="up", label="floor back side") - for y_ in self.sy[1:]: - self.rectangularWall( - x, y_ - slot + t, "efef", - callback=[self.fingerHolesCB(self.sx, y_ - slot + t), - self.fingerHoleLineCB(hi-t2+t/2, 0, self.sx[::-1])], - move="up", label="floor") - floors.extend([y_ - slot + t, slot]) - self.rectangularWall( - x, hi-t2, "efYf" if self.handle else "efff", - callback=[self.fingerHolesCB(self.sx, hi-t2)], - move="up", label="floor front side") - floors.append(hi-t2) - - # Inner walls - - be = "f" if b != "e" else "e" - - for i in range(len(self.sy) - 1): - e = [edges.SlottedEdge(self, self.sx, be, slots=0.5 * hi), "f", - edges.SlottedEdge(self, self.sx[::-1], "e"), "f"] - self.rectangularWall(x, hi-t2, e, move="up", label=f"inner x {i+1}") - # slopes - for i in self.sy: - self.rectangularWall( - x, hi*2**.5 + t/2, - [edges.SlottedEdge(self, self.sx, "e", slots=hi/2**.5), "f", - edges.SlottedEdge(self, self.sx[::-1], "e"), "f"], - move="up", label="slope") - - # top / lid - self.drawLid(x, y, self.top_edge) # XXX deal with front - self.lid(x, y, self.top_edge) - - self.ctx.restore() - self.rectangularWall(x, hi, "ffff", move="right only") - - # y walls - - # outer walls - left/right - - for move in ("up", "up mirror"): - if bh: - self.trapezoidSideWall( - y, h+bh, hi-t*2**.5, - [edges.CompoundEdge(self, ("FE"*len(self.sy))+"F", floors), - "h", "e", "h"], - radius=self.radius, callback=[self.yHoles, ], - move=move, label="side") - else: - self.rectangularWall( - y, h, - [edges.CompoundEdge(self, ("FE"*len(self.sy))+"F", floors), - edges.CompoundEdge(self, "fE", (hi-t*2**.5, h-hi+t*2**.5)), - tl, "f"], - callback=[self.yHoles, ], - #ignore_widths=[6] if self.handle else [1, 6], - move=move, label="side") - - # inner walls - for i in range(len(self.sx) - 1): - e = [edges.CompoundEdge(self, ("fE"*len(self.sy))+"f", floors), - edges.CompoundEdge(self, "fe", (hi-t*2**.5, t*2**.5)), - TopEdge(self, self.sy[::-1], hi), "f"] - self.rectangularWall(y, hi, e, move="up", label=f"inner y {i+1}") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/spicesrack.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/spicesrack.py deleted file mode 100644 index f954e54..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/spicesrack.py +++ /dev/null @@ -1,173 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class FrontEdge(edges.Edge): - - def __call__(self, length, **kw): - with self.saved_context(): - a = 90 - r = (self.diameter +self.space) / 2 - self.ctx.scale(1, self.edge_width/r) - for i in range(self.numx): - self.corner(-a) - self.corner(180, r) - self.corner(-a) - self.moveTo(length) - - def margin(self) -> float: - return self.edge_width - -class SpicesRack(Boxes): - """Rack for cans of spices""" - - ui_group = "Shelf" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1.0) - - self.argparser.add_argument( - "--diameter", action="store", type=float, default=55., - help="diameter of spice cans") - - self.argparser.add_argument( - "--height", action="store", type=float, default=60., - help="height of the cans that needs to be supported") - self.argparser.add_argument( - "--space", action="store", type=float, default=10., - help="space between cans") - self.argparser.add_argument( - "--numx", action="store", type=int, default=5, - help="number of cans in a row") - self.argparser.add_argument( - "--numy", action="store", type=int, default=6, - help="number of cans in a column") - self.argparser.add_argument( - "--in_place_supports", action="store", type=boolarg, default=False, - help="place supports pieces in holes (check for fit yourself)") - self.argparser.add_argument( - "--feet", action="store", type=boolarg, default=False, - help="add feet so the rack can stand on the ground") - - - def support(self, width, height, move=None): - t = self.thickness - tw = width + t - th = height - - r = min(width - 2*t, height - 2*t) - - if self.move(tw, th, move, True): - return - - self.polyline(width-r, 90, 0, (-90, r), 0, 90, height-r, 90, width, 90) - self.edges["f"](height) - - self.move(tw, th, move) - - def foot(self, width, height, move=None): - t = self.thickness - tw, th = height, width + t - - if self.move(tw, th, move, True): - return - - self.moveTo(0, t) - self.edges["f"](height) - self.polyline(0, 90, width, 90, 0, (90, height), width-height, 90) - - self.move(tw, th, move) - - def holes(self): - w = 2* self.base_r - r = self.diameter / 2 - a = self.base_angle - l = self.hole_length - self.moveTo(0, self.hole_distance) - - with self.saved_context(): - self.ctx.scale(1, l/self.base_h) - self.moveTo(self.space/2, 0, 90) - for i in range(self.numx): - self.polyline(0, -a, 0, (-180+2*a, r), 0, -90-a, w, -90) - self.moveTo(0, -(self.diameter+self.space)) - self.ctx.stroke() - if self.feet and not self.feet_done: - self.feet_done = True - return - - if not self.in_place_supports: - return - inner_width = self.hole_distance + self.hole_length/3 - t = self.thickness - for i in range(self.numx-1): - with self.saved_context(): - self.moveTo((self.diameter+self.space)*(i+0.5)- (inner_width+t)/2, self.spacing) - self.support(inner_width, (self.h-t)/2) - - def backCB(self): - t = self.thickness - dy = self.h/2 - t/2 - for i in range(self.numy): - self.fingerHolesAt(0, (i+1)*self.h-0.5*self.thickness-dy, self.x, 0) - for j in range(1, self.numx): - self.fingerHolesAt( - j*(self.diameter+self.space), - (i+1)*self.h-t-dy, (self.h-t)/2, -90) - - def render(self): - self.feet_done = False - t = self.thickness - self.x = x = self.numx * (self.diameter+self.space) - d = self.diameter - - self.base_angle = 10 - self.base_r = self.diameter/2 * math.cos(math.radians(self.base_angle)) - self.base_h = self.diameter/2 * (1-math.sin(math.radians(self.base_angle))) - self.angle = math.degrees(math.atan(self.base_r/self.height)) - self.hole_length = (self.base_h**2+self.height**2)**0.5 - self.hole_distance = (self.diameter-self.base_r) * math.sin(math.radians(self.angle)) - - self.h = (self.space + d) / math.cos(math.radians(self.angle)) - h = self.numy * self.h - self.h / 2 + 6*t - - width = self.hole_distance + self.hole_length + self.space/2 - inner_width = self.hole_distance + self.hole_length/3 - - self.edge_width = width - inner_width - - for i in range(self.numy): - self.rectangularWall(x, inner_width,[ - "f", "e", FrontEdge(self, self), "e"], - callback=[self.holes], move="up") - - self.rectangularWall(x, h, - callback=[self.backCB, - None, - lambda:self.hole(3*t, 3*t, 1.5), - lambda:self.hole(3*t, 3*t, 1.5), - ], move="up") - - - if not self.in_place_supports: - self.partsMatrix((self.numx-1)*self.numy, self.numx-1, "up", - self.support, inner_width, (self.h-t)/2) - if self.feet: - self.partsMatrix(self.numx-1, self.numx-1, "up", - self.foot, width, (self.h-t)/2) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/spool.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/spool.py deleted file mode 100644 index 52f22ae..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/spool.py +++ /dev/null @@ -1,99 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Spool(Boxes): - """A simple spool""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - - self.buildArgParser(h=100) - self.argparser.add_argument( - "--outer_diameter", action="store", type=float, default=200.0, - help="diameter of the flanges") - self.argparser.add_argument( - "--inner_diameter", action="store", type=float, default=80.0, - help="diameter of the center part") - self.argparser.add_argument( - "--axle_diameter", action="store", type=float, default=40.0, - help="diameter of the axle hole (axle not part of drawing)") - self.argparser.add_argument( - "--sides", action="store", type=int, default=8, - help="number of pieces for the center part") - self.argparser.add_argument( - "--reinforcements", action="store", type=int, default=8, - help="number of reinforcement ribs per side") - self.argparser.add_argument( - "--reinforcement_height", action="store", type=float, default=0.0, - help="height of reinforcement ribs on the flanges") - - def sideCB(self): - self.hole(0, 0, d=self.axle_diameter) - r, h, side = self.regularPolygon(self.sides, radius=self.inner_diameter/2) - t = self.thickness - for i in range(self.sides): - self.fingerHolesAt(-side/2, h+0.5*self.thickness, side, 0) - self.moveTo(0, 0, 360 / self.sides) - - if self.reinforcement_height: - for i in range(self.reinforcements): - self.fingerHolesAt( - self.axle_diameter / 2, 0, h-self.axle_diameter / 2, 0) - self.fingerHolesAt( - r + t, 0, self.outer_diameter / 2 - r - t, 0) - self.moveTo(0, 0, 360 / self.reinforcements) - - def reinforcementCB(self): - for i in range(self.reinforcements): - self.fingerHolesAt( - self.axle_diameter / 2, 0, - (self.inner_diameter - self.axle_diameter) / 2 + self.thickness, 0) - self.moveTo(0, 0, 360 / self.reinforcements) - - - def render(self): - t = self.thickness - r, h, side = self.regularPolygon(self.sides, radius=self.inner_diameter/2) - for i in range(2): - self.parts.disc( - self.outer_diameter, callback=self.sideCB, move="right") - for i in range(self.sides): - self.rectangularWall(side, self.h, "fefe", move="right") - if self.reinforcement_height: - for i in range(self.reinforcements*2): - edge = edges.CompoundEdge( - self, "fef", - [self.outer_diameter / 2 - r - t, - r - h + t, - h - self.axle_diameter / 2]) - self.trapezoidWall( - self.reinforcement_height - t, - (self.outer_diameter - self.axle_diameter) / 2, - (self.inner_diameter - self.axle_diameter) / 2 + t, - ["e", "f", "e", edge], - move="right") - for i in range(2): - self.parts.disc( - self.inner_diameter + 2*t, - hole=self.axle_diameter, - callback=self.reinforcementCB, - move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/stachel.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/stachel.py deleted file mode 100644 index cb3538b..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/stachel.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Stachel(Boxes): - """Bass Recorder Endpin""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.argparser.add_argument( - "--flutediameter", action="store", type=float, default=115.0, - help="diameter of the flutes bottom in mm") - self.argparser.add_argument( - "--polediameter", action="store", type=float, default=25., - help="diameter if the pin in mm") - self.argparser.add_argument( - "--wall", action="store", type=float, default=7., - help="width of the surrounding wall in mm") - - def layer(self, ri, ro, rp, holes=False, move=""): - - r = 2.5 # radius - l = 25 # depth of clamp - w = 20 # width of clamp - - wp = rp+8 # width pole - - tw = 2*ro + 2*rp - th = 2*ro + l - - if self.move(tw, th, move, True): - return - - self.moveTo(ro, r, 90) - - a1 = math.degrees(math.asin(w / ro)) - a2 = math.degrees(math.asin(wp / ro)) - l1 = ro*(1-math.cos(math.radians(a1))) - a3 = math.degrees(math.asin(1./rp)) - self.polyline(ro-ri+l-r, 90, 0, (-355, ri), 0, 90, ro-ri+l-r, # inside - (90, r), w-2*r, (90, r)) - if holes: # right side main clamp - poly1 = [(l+l1-2)/2-r, 90, w-2, -90, 2, -90, w-2, 90, - (l+l1-2)/2] - self.polyline(*poly1) - else: - self.polyline(l+l1-r) - self.polyline(0, -90+a1, 0 , (90-a1-a2, ro), 0, -90+a2) - if holes: - poly2 = [2*rp+15, 90, wp-2, -90, 2, -90, wp-2, 90, 10-2-r] - self.polyline(*poly2) - else: - self.polyline(25+2*rp-r) - self.polyline(0, (90, r), wp-1-r, 90, 20, 90-a3, 0, (-360+2*a3, rp), 0, 90-a3, 20, 90, wp-1-r, (90, r)) - if holes: - self.polyline(*list(reversed(poly2))) - else: - self.polyline(25+2*rp-r) - self.polyline(0, -90+a2, 0, (270-a2-a1-5, ro), 0, (-90+a1)) - if holes: # left sidemain clamp - self.polyline(*list(reversed(poly1))) - else: - self.polyline(l+l1-r) - self.polyline(0, (90, r), w-2*r, (90, r)) - - self.move(tw, th, move) - - - - def render(self): - - ri = self.flutediameter / 2.0 - ro = ri + self.wall - rp = self.polediameter / 2.0 - w = self.wall - self.layer(ri-20, ro, rp, move="up") - self.layer(ri, ro, rp, True, move="up") - self.layer(ri, ro, rp, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/storagerack.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/storagerack.py deleted file mode 100644 index 89e5576..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/storagerack.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class StorageRack(Boxes): - """StorageRack to store boxes and trays which have their own floor""" - - ui_group = "Shelf" - - description = """ - -Drawers are not included: - -![Inside](static/samples/StorageRack-2.jpg) -![Back wall details](static/samples/StorageRack-3.jpg) - -""" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.StackableSettings) - - self.argparser.add_argument( - "--depth", action="store", type=float, default=200, - help="depth of the rack") - self.argparser.add_argument( - "--rail", action="store", type=float, default=30, - help="depth of the rack") - self.buildArgParser("x", "sh", "outside", "bottom_edge") - self.argparser.add_argument( - "--top_edge", action="store", - type=ArgparseEdgeType("FheSŠ"), choices=list("FheSŠ"), - default="F", - help="edge type for top edge") - - def hHoles(self): - posh = -0.5 * self.thickness - for h in self.sh[:-1]: - posh += h + self.thickness - self.fingerHolesAt(posh, 0, self.depth) - - def backHoles(self): - posh = -0.5 * self.thickness - for nr, h in enumerate(self.sh[:-1]): - posh += h + self.thickness - if ((self.bottom_edge == "e" and nr == 0) or - (self.top_edge == "e" and nr == len(self.sh) - 2)): - self.fingerHolesAt(0, posh, self.x, 0) - else: - self.fingerHolesAt(0, posh, self.rail, 0) - self.fingerHolesAt(self.x, posh, self.rail, 180) - - def render(self): - if self.outside: - self.depth = self.adjustSize(self.depth, e2=False) - self.sh = self.adjustSize(self.sh, self.top_edge, self.bottom_edge) - self.x = self.adjustSize(self.x) - - h = sum(self.sh) + self.thickness * (len(self.sh) - 1) - x = self.x - d = self.depth - t = self.thickness - - - # outer walls - b = self.bottom_edge - t = self.top_edge - self.closedtop = self.top_edge in "fFhŠ" - - # sides - - self.ctx.save() - - # side walls - self.rectangularWall(d, h, [b, "F", t, "E"], callback=[None, self.hHoles, ], move="up") - self.rectangularWall(d, h, [b, "E", t, "F"], callback=[None, self.hHoles, ], move="up") - - # full floors - self.rectangularWall(d, x, "fffE", move="up") - self.rectangularWall(d, x, "fffE", move="up") - - num = len(self.sh)-1 - if b == "e": - num -= 1 - if t == "e": - num -= 1 - - for i in range(num): - self.rectangularWall(d, self.rail, "ffee", move="up") - self.rectangularWall(d, self.rail, "feef", move="up") - - self.ctx.restore() - self.rectangularWall(d, h, "ffff", move="right only") - - # back wall - self.rectangularWall(x, h, [b, "f", t, "f"], callback=[self.backHoles], move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/storageshelf.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/storageshelf.py deleted file mode 100644 index fc6beab..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/storageshelf.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.lids import _TopEdge - - -class StorageShelf(_TopEdge): - """StorageShelf can be used to store Typetray""" - - ui_group = "Shelf" - description = "This is a simple shelf box." - - def __init__(self) -> None: - Boxes.__init__(self) - self.addTopEdgeSettings(fingerjoint={"surroundingspaces": 0.5}, - roundedtriangle={"outset" : 1}) - self.buildArgParser("x", "sy", "sh", "outside", "bottom_edge", - "top_edge") - self.argparser.add_argument( - "--retainer", action="store", type=float, default=0.0, - help="height of retaining wall at the front edges") - self.argparser.add_argument( - "--retainer_hole_edge", action="store", type=boolarg, default=False, - help="use finger hole edge for retainer walls") - - - - def ySlots(self): - posy = -0.5 * self.thickness - h = sum(self.sh) + self.thickness * (len(self.sh) - 1) - for y in self.sy[:-1]: - posy += y + self.thickness - self.fingerHolesAt(posy, 0, h, 90) - - def hSlots(self): - posh = -0.5 * self.thickness - for h in self.sh[:-1]: - posh += h + self.thickness - posy = 0 - for y in reversed(self.sy): - self.fingerHolesAt(posh, posy, y) - posy += y + self.thickness - - def yHoles(self): - posy = -0.5 * self.thickness - for y in self.sy[:-1]: - posy += y + self.thickness - self.fingerHolesAt(posy, 0, self.x) - - def hHoles(self): - posh = -0.5 * self.thickness - for h in self.sh[:-1]: - posh += h + self.thickness - self.fingerHolesAt(posh, 0, self.x) - - def render(self): - if self.outside: - self.sy = self.adjustSize(self.sy) - self.sh = self.adjustSize(self.sh, self.top_edge, self.bottom_edge) - self.x = self.adjustSize(self.x, e2=False) - - y = sum(self.sy) + self.thickness * (len(self.sy) - 1) - h = sum(self.sh) + self.thickness * (len(self.sh) - 1) - x = self.x - t = self.thickness - - - # outer walls - b = self.bottom_edge - t1, t2, t3, t4 = self.topEdges(self.top_edge) - #if top_edge is t put the handle on the x walls - if(self.top_edge=='t'): - t1,t2,t3,t4=(t2,t1,t4,t3) - self.closedtop = self.top_edge in "fFhŠY" - - # x sides - - self.ctx.save() - - # outer walls - # XXX retainer - self.rectangularWall(x, h, [b, "F", t1, "e"], callback=[None, self.hHoles, ], move="up", label="left") - self.rectangularWall(x, h, [b, "e", t3, "F"], callback=[None, self.hHoles, ], move="up", label="right") - - # floor - if b != "e": - e = "fffe" - if self.retainer: - e = "ffff" - self.rectangularWall(x, y, e, callback=[None, self.yHoles], move="up", label="bottom") - - # inner walls - - be = "f" if b != "e" else "e" - - for i in range(len(self.sh) - 1): - e = ["f", edges.SlottedEdge(self, self.sy[::-1], "f", slots=0.5 * x), "f", "e"] - if self.retainer: - e[3] = "f" - - self.rectangularWall(x, y, e, move="up", label="inner horizontal " + str(i+1)) - - # top / lid - if self.closedtop: - e = "FFFe" if self.top_edge == "f" else "fffe" - self.rectangularWall(x, y, e, callback=[None, self.yHoles, ], move="up", label="top") - else: - self.drawLid(x, y, self.top_edge) - - self.ctx.restore() - self.rectangularWall(x, h, "ffff", move="right only", label="invisible") - - # y walls - - # outer walls - self.rectangularWall(y, h, [b, "f", t2, "f"], callback=[self.ySlots, self.hSlots,], move="up", label="back") - - # inner walls - for i in range(len(self.sy) - 1): - # XXX retainer - e = [be, edges.SlottedEdge(self, self.sh, "e", slots=0.5 * x), - "e", "f"] - if self.closedtop: - e = [be, edges.SlottedEdge(self, self.sh, "e", slots=0.5 * x),"f", "f"] - self.rectangularWall(x, h, e, move="up", label="inner vertical " + str(i+1)) - - - if self.retainer: - for i in range(len(self.sh)): - # XXX finger holes, F edges, left and right - e = "FEeE" - if self.retainer_hole_edge or (i == 0 and b == "h"): - e = "hEeE" - self.rectangularWall(y, self.retainer, e, move="up", label="retainer " + str(i+1)) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/tetris.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/tetris.py deleted file mode 100644 index ab463d9..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/tetris.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class Tetris(Boxes): - """3D Tetris shapes""" - - ui_group = "Misc" - - def __init__(self): - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - - self.argparser.add_argument( - "--blocksize", action="store", type=float, default=40., - help="size of a square") - self.argparser.add_argument( - "--shape", action="store", type=str, default="L", - choices=['I', 'L', 'O', 'S', 'T'], - help="shape of the piece") - - def cb(self, nr): - t = self.thickness - s = self.blocksize - self.ctx.stroke() - self.set_source_color(Color.ETCHING) - - if nr == 0: - if self.shape in "LT": - for i in range(1, 3): - with self.saved_context(): - self.moveTo(s*i - t, 0, 90) - self.edge(s - 2*t) - if self.shape == "L": - self.moveTo(s*2, s - t, 0) - else: # "T" - self.moveTo(s, s - t, 0) - self.edge(s - 2*t) - if self.shape == "I": - for i in range(1, 4): - with self.saved_context(): - self.moveTo(s*i - t, 0, 90) - self.edge(s - 2*t) - if self.shape == "S" and nr in (0, 1, 4, 5): - self.moveTo(s - t, 0, 90) - self.edge(s - 2*t) - if self.shape == "O": - self.moveTo(s - t, 0, 90) - self.edge(s - t) - - - self.ctx.stroke() - - def render(self): - # adjust to the variables you want in the local scope - t = self.thickness - s = self.blocksize - - if self.shape == "L": - borders = [3*s - 2*t, 90, 2*s - 2*t, 90, s - 2*t, 90, - s, -90, 2*s, 90, s - 2*t, 90] - elif self.shape == "I": - borders = [4*s - 2*t, 90, s - 2*t, 90 ] * 2 - elif self.shape == "S": - borders = [2 * s - 2 * t, 90, s, -90, s, 90, s - 2 * t, 90] *2 - elif self.shape == "O": - borders = [2*s - 2*t, 90] * 4 - elif self.shape == "T": - borders = [90, s - 2*t, 90, s, -90, s, 90] - borders = [3*s - 2*t] + borders + [s - 2*t] + list(reversed(borders)) - self.polygonWall(borders=borders, callback=self.cb, move="right") - self.polygonWall(borders=borders, callback=self.cb, - move="mirror right") - - self.polygonWalls(borders=borders, h=s - 2 * t) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trafficlight.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trafficlight.py deleted file mode 100644 index 5c47cd4..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trafficlight.py +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class ShadyEdge(edges.BaseEdge): - char = "s" - - def __call__(self, length, **kw): - s = self.shades - h = self.h - a = math.atan(s/h) - angle = math.degrees(a) - for i in range(self.n): - self.polyline(0, -angle, h / math.cos(a), angle+90) - self.edges["f"](s) - self.corner(-90) - if i < self.n-1: - self.edge(self.thickness) - - def margin(self) -> float: - return self.shades - -class TrafficLight(Boxes): # change class name here and below - """Traffic light""" - description = """The traffic light was created to visualize the status of a Icinga monitored system. - -When turned by 90°, it can be also used to create a bottle holder.""" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings) - - # remove cli params you do not need - self.buildArgParser("h", "hole_dD") - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--depth", action="store", type=float, default=100, - help="inner depth not including the shades") - self.argparser.add_argument( - "--shades", action="store", type=float, default=50, - help="depth of the shaders") - self.argparser.add_argument( - "--n", action="store", type=int, default=3, - help="number of lights") - self.argparser.add_argument( - "--upright", action="store", type=boolarg, default=True, - help="stack lights upright (or side by side)") - - def backCB(self): - t = self.thickness - for i in range(1, self.n): - self.fingerHolesAt(i*(self.h+t)-0.5*t, 0, self.h) - - def sideCB(self): - t = self.thickness - for i in range(1, self.n): - self.fingerHolesAt(i*(self.h+t)-0.5*t, 0, self.depth) - for i in range(self.n): - self.fingerHolesAt(i*(self.h+t), self.depth-2*t, self.h, 0) - - def topCB(self): - t = self.thickness - for i in range(1, self.n): - self.fingerHolesAt(i*(self.h+t)-0.5*t, 0, self.depth + self.shades) - for i in range(self.n): - self.fingerHolesAt(i*(self.h+t), self.depth-2*t, self.h, 0) - - def frontCB(self): - self.hole(self.h/2, self.h/2, self.h/2-self.thickness) - - def wall(self, h1, h2, w, edges="ffef", callback=None, move="", label=""): - edges = [self.edges.get(e, e) for e in edges] - edges += edges # append for wrapping around - overallwidth = w + edges[-1].spacing() + edges[1].spacing() - overallheight = max(h1, h2) + edges[0].spacing() + edges[2].spacing() - - if self.move(overallwidth, overallheight, move, before=True, label=label): - return - - a = math.atan((h2-h1)/float(w)) - angle = math.degrees(a) - - self.moveTo(edges[-1].spacing(), edges[0].margin()) - for i, l in [(0, w), (1, h2)]: - self.cc(callback, i, y=edges[i].startwidth() + self.burn) - edges[i](l) - self.edgeCorner(edges[i], edges[i + 1], 90) - - self.corner(angle) - self.cc(callback, i, y=edges[2].startwidth() + self.burn) - edges[2](w / math.cos(a)) - self.corner(-angle) - self.edgeCorner(edges[2], edges[2 + 1], 90) - self.cc(callback, i, y=edges[3].startwidth() + self.burn) - edges[3](h1) - self.edgeCorner(edges[3], edges[3 + 1], 90) - - self.move(overallwidth, overallheight, move, label=label) - - def addMountH(self, width, height): - ds = self.hole_dD[0] - - if len(self.hole_dD) < 2: # if no head diameter is given - dh = 0 # only a round hole is generated - y = height - max (self.thickness * 1.25, self.thickness * 1.0 + ds) # and we assume that a typical screw head diameter is twice the shaft diameter - else: - dh = self.hole_dD[1] # use given head diameter - y = height - max (self.thickness * 1.25, self.thickness * 1.0 + dh / 2) # and offset the hole to have enough space for the head - - dx = width - x1 = dx * 0.125 - x2 = dx * 0.875 - - self.mountingHole(x1, y, ds, dh, 90) - self.mountingHole(x2, y, ds, dh, 90) - - def addMountV(self, width, height): - if self.hole_dD[0] < 2 * self.burn: - return # no hole if no diameter is given - - ds = self.hole_dD[0] - - if len(self.hole_dD) < 2: # if no head diameter is given - dh = 0 # only a round hole is generated - x = max (self.thickness * 2.75, self.thickness * 2.25 + ds) # and we assume that a typical screw head diameter is twice the shaft diameter - else: - dh = self.hole_dD[1] # use given head diameter - x = max (self.thickness * 2.75, self.thickness * 2.25 + dh / 2) # and offset the hole to have enough space for the head - - dy = height - - y1 = self.thickness * 0.75 + dy * 0.125 - y2 = self.thickness * 0.75 + dy * 0.875 - - self.mountingHole(x, y1, ds, dh, 180) - self.mountingHole(x, y2, ds, dh, 180) - - def render(self): - # adjust to the variables you want in the local scope - d, h, n = self.depth, self.h, self.n - s = self.shades - t = self.thickness - - th = n * (h + t) - t - - - self.addPart(ShadyEdge(self, None)) - - # back - if self.upright: - self.rectangularWall(th, h, "FFFF", callback=[self.backCB, self.addMountV(th, h)], move="up", label="back") - else: - self.rectangularWall(th, h, "FFFF", callback=[self.backCB, self.addMountH(th, h)], move="up", label="back") - - if self.upright: - # sides - self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up", label="left") - self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up", label="right") - - # horizontal Walls / blinds tops - e = edges.CompoundEdge(self, "fF", (d, s)) - e2 = edges.CompoundEdge(self, "Ff", (s, d)) - for i in range(n): - self.rectangularWall(h, d+s, ['f', e, 'e', e2], - move="right" if i. - -from boxes import * - - -class TrayInsert(Boxes): - """Tray insert without floor and outer walls - allows only continuous walls""" - - ui_group = "Tray" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser("sx", "sy", "h", "outside") - - def render(self): - - if self.outside: - self.sx = self.adjustSize(self.sx, False, False) - self.sy = self.adjustSize(self.sy, False, False) - - x = sum(self.sx) + self.thickness * (len(self.sx) - 1) - y = sum(self.sy) + self.thickness * (len(self.sy) - 1) - h = self.h - t = self.thickness - - - # Inner walls - for i in range(len(self.sx) - 1): - e = [edges.SlottedEdge(self, self.sy, slots=0.5 * h), "e", "e", "e"] - self.rectangularWall(y, h, e, move="up") - - for i in range(len(self.sy) - 1): - e = ["e", "e", edges.SlottedEdge(self, self.sx[::-1], "e", slots=0.5 * h), "e"] - self.rectangularWall(x, h, e, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/traylayout.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/traylayout.py deleted file mode 100644 index b433a0c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/traylayout.py +++ /dev/null @@ -1,472 +0,0 @@ -# Copyright (C) 2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -from __future__ import annotations - -import boxes -from boxes import * -from boxes import lids - - -class TrayLayoutFile(Boxes): - """Generate a layout file for a typetray.""" - # This class generates the skeleton text file that can then be edited - # to describe the actual box - - description = """This is a two step process. This is step 1. -The layout is based on a grid of sizes in x and y direction. -Choose how many distances you need in both directions. -The actual sizes and all other settings can be entered in the second step.""" - - webinterface = False - - ui_group = "Tray" - - sx: list[float] = [] # arg input - sy: list[float] = [] # arg input - hwalls: list[list[bool]] = [] - vwalls: list[list[bool]] = [] - floors: list[list[bool]] = [] - - def __init__(self, input=None, webargs=False) -> None: - Boxes.__init__(self) - self.argparser = argparse.ArgumentParser() - self.buildArgParser("sx", "sy") - self.argparser.add_argument( - "--output", action="store", type=str, default="traylayout.txt", - help="Name of the layout text file.") - - def open(self) -> None: - # Use empty open and close methods to avoid initializing the whole drawing infrastructure. - pass - - def close(self) -> None: - # Use empty open and close methods to avoid initializing the whole drawing infrastructure. - pass - - def fillDefault(self, sx: list[float], sy: list[float]) -> None: - self.sx = sx - self.sy = sy - x = len(sx) - y = len(sy) - self.hwalls = [[True for _ in range(x)] for _ in range(y + 1)] - self.vwalls = [[True for _ in range(x + 1)] for _ in range(y)] - self.floors = [[True for _ in range(x)] for _ in range(y)] - - def __str__(self) -> str: - r = [] - - for i, x in enumerate(self.sx): - r.append(" |" * i + " ,> %.1fmm\n" % x) - - for hwalls, vwalls, floors, y in zip(self.hwalls, self.vwalls, self.floors, self.sy): - r.append("".join("+" + " -"[h] for h in hwalls) + "+\n") - r.append("".join((" |"[v] + "X "[f] for v, f in zip(vwalls, floors))) + " |"[vwalls[-1]] + " %.1fmm\n" % y) - r.append("".join("+" + " -"[h] for h in self.hwalls[-1]) + "+\n") - - return "".join(r) - - def render(self) -> None: - self.fillDefault(self.sx, self.sy) - with open(self.output, 'w') as f: - f.write(str(self)) - - -class TrayLayout(Boxes): - """Generate a typetray from a layout file.""" - - # This class reads in the layout either from a file (with --input) or - # as string (with --layout) and turns it into a drawing for a box. - - ui_group = "Tray" - - description = """This is a two step process. This is step 2. -Edit the layout text graphics to adjust your tray. -Put in the sizes for each column and row. You can replace the hyphens and -vertical bars representing the walls with a space character to remove the walls. -You can replace the space characters representing the floor by a "X" to remove the floor for this compartment. -""" - - def __init__(self) -> None: - super().__init__() - self.addSettingsArgs(boxes.edges.FingerJointSettings) - self.addSettingsArgs(lids.LidSettings) - self.buildArgParser("h", "hi", "outside", "sx", "sy") - if self.UI == "web": - self.argparser.add_argument( - "--layout", action="store", type=str, default="\n") - else: - self.argparser.add_argument( - "--input", action="store", type=argparse.FileType('r'), - default="traylayout.txt", - help="layout file") - self.layout = None - - def vWalls(self, x: int, y: int) -> int: - """Number of vertical walls at a crossing.""" - result = 0 - if y > 0 and self.vwalls[y - 1][x]: - result += 1 - if y < len(self.y) and self.vwalls[y][x]: - result += 1 - return result - - def hWalls(self, x: int, y: int) -> int: - """Number of horizontal walls at a crossing.""" - result = 0 - if x > 0 and self.hwalls[y][x - 1]: - result += 1 - if x < len(self.x) and self.hwalls[y][x]: - result += 1 - return result - - def vFloor(self, x: int, y: int) -> bool: - """Is there floor under vertical wall.""" - if y >= len(self.y): - return False - - return (x > 0 and self.floors[y][x - 1]) or (x < len(self.x) and self.floors[y][x]) - - def hFloor(self, x: int, y: int) -> bool: - """Is there floor under horizontal wall.""" - if x >= len(self.x): - return False - return (y > 0 and self.floors[y - 1][x]) or (y < len(self.y) and self.floors[y][x]) - - @restore - def edgeAt(self, edge, x, y, length, angle=0): - self.moveTo(x, y, angle) - edge = self.edges.get(edge, edge) - edge(length) - - def prepare(self): - if self.layout: - self.parse(self.layout.split('\n')) - else: - self.parse(self.input) - - if self.outside: - self.x = self.adjustSize(self.x) - self.y = self.adjustSize(self.y) - self.h = self.adjustSize(self.h, e2=False) - - if self.hi: - self.hi = self.adjustSize(self.hi, e2=False) - - self.hi = self.hi or self.h - self.edges["s"] = boxes.edges.Slot(self, self.hi / 2.0) - self.edges["C"] = boxes.edges.CrossingFingerHoleEdge(self, self.hi) - self.edges["D"] = boxes.edges.CrossingFingerHoleEdge(self, self.hi, outset=self.thickness) - - def walls(self, move=None): - lx = len(self.x) - ly = len(self.y) - # t = self.thickness - # b = self.burn - # t2 = self.thickness / 2.0 - - self.ctx.save() - - # Horizontal Walls - for y in range(ly + 1): - if y == 0 or y == ly: - h = self.h - else: - h = self.hi - - start = 0 - end = 0 - - while end < lx: - lengths = [] - edges = [] - - while start < lx and not self.hwalls[y][start]: - start += 1 - - if start == lx: - break - - end = start - - while end < lx and self.hwalls[y][end]: - if self.hFloor(end, y): - edges.append("f") - else: - edges.append("E") - - lengths.append(self.x[end]) - if self.hFloor(end, y) == 0 and self.hFloor(end + 1, y) == 0: - edges.append("EDs"[self.vWalls(end + 1, y)]) - else: - edges.append("eCs"[self.vWalls(end + 1, y)]) - lengths.append(self.thickness) - end += 1 - - # remove last "slot" - lengths.pop() - edges.pop() - self.rectangularWall(sum(lengths), h, [ - boxes.edges.CompoundEdge(self, edges, lengths), - "f" if self.vWalls(end, y) else "e", - "e", - "f" if self.vWalls(start, y) else "e"], - move="right") - start = end - - self.ctx.restore() - self.rectangularWall(10, h, "ffef", move="up only") - self.ctx.save() - - # Vertical Walls - for x in range(lx + 1): - if x == 0 or x == lx: - h = self.h - else: - h = self.hi - start = 0 - end = 0 - - while end < ly: - lengths = [] - edges = [] - while start < ly and not self.vwalls[start][x]: - start += 1 - - if start == ly: - break - - end = start - - while end < ly and self.vwalls[end][x]: - if self.vFloor(x, end): - edges.append("f") - else: - edges.append("E") - - lengths.append(self.y[end]) - if self.vFloor(x, end) == 0 and self.vFloor(x, end + 1) == 0: - edges.append("EDs"[self.hWalls(x, end + 1)]) - else: - edges.append("eCs"[self.hWalls(x, end + 1)]) - lengths.append(self.thickness) - end += 1 - # remove last "slot" - lengths.pop() - edges.pop() - - upper = [{"f": "e", - "s": "s", - "e": "e", - "E": "e", - "C": "e", - "D": "e"}[e] for e in reversed(edges)] - edges = ["e" if e == "s" else e for e in edges] - self.rectangularWall(sum(lengths), h, [ - boxes.edges.CompoundEdge(self, edges, lengths), - "eFf"[self.hWalls(x, end)], - boxes.edges.CompoundEdge(self, upper, list(reversed(lengths))), - "eFf"[self.hWalls(x, start)]], - move="right") - start = end - - self.ctx.restore() - self.rectangularWall(10, h, "ffef", move="up only") - - def base_plate(self, callback=None, move=None): - lx = len(self.x) - ly = len(self.y) - t = self.thickness - w = self.edges["F"].startwidth() - b = self.burn - t2 = self.thickness / 2.0 - - tw = sum(self.x) + (lx - 1) * t + 2 * w - th = sum(self.y) + (ly - 1) * t + 2 * w - - if self.move(tw, th, move, True): - return - - for i, (x, y, a) in enumerate(( - (w, w + b, 0), - (tw - w, w + b, 90), - (tw - w, th - w + b, 180), - (w, th - w + b, 270))): - self.cc(callback, i, x, y, a) - - # Horizontal lines - posy = w - t - for y in range(ly, -1, -1): - posx = w - for x in range(lx): - if self.hwalls[y][x]: - e = "F" - else: - e = "e" - - if y < ly and self.floors[y][x]: - if y > 0 and self.floors[y - 1][x]: - # Inside Wall - if self.hwalls[y][x]: - self.fingerHolesAt(posx, posy + t2, self.x[x], angle=0) - else: - # Top edge - self.edgeAt(e, posx + self.x[x], - posy + w + b, self.x[x], - -180) - if x == 0 or not self.floors[y][x - 1]: - self.edgeAt("e", posx - w, posy + w + b, w, 0) - elif y == 0 or not self.floors[y - 1][x - 1]: - self.edgeAt("e", posx - t, posy + w + b, t, 0) - if x == lx - 1 or not self.floors[y][x + 1]: - self.edgeAt("e", posx + self.x[x], posy + w + b, w, 0) - elif y > 0 and self.floors[y - 1][x]: - # Bottom Edge - self.edgeAt(e, posx, posy - b + t - w, self.x[x]) - if x == 0 or not self.floors[y-1][x - 1]: - self.edgeAt("e", posx - w, posy + t - w - b, w) - elif x == 0 or y == ly or not self.floors[y][x - 1]: - self.edgeAt("e", posx - t, posy + t - w - b, t) - if x == lx - 1 or y == 0 or not self.floors[y-1][x + 1]: - self.edgeAt("e", posx + self.x[x], posy + t -w - b, w) - posx += self.x[x] + self.thickness - posy += self.y[y - 1] + self.thickness - - posx = w - t - for x in range(lx + 1): - posy = w - for y in range(ly - 1, -1, -1): - if self.vwalls[y][x]: - e = "F" - else: - e = "e" - if x > 0 and self.floors[y][x - 1]: - if x < lx and self.floors[y][x]: - # Inside wall - if self.vwalls[y][x]: - self.fingerHolesAt(posx + t2, posy, self.y[y]) - else: - # Right edge - self.edgeAt(e, posx + w + b, posy, self.y[y], 90) - if y == 0 or not self.floors[y-1][x-1]: - self.edgeAt("e", posx + w + b, posy + self.y[y], w, 90) - elif x == lx or y == 0 or not self.floors[y - 1][x]: - self.edgeAt("e", posx + w + b, posy + self.y[y], t, 90) - if y == ly - 1 or not self.floors[y+1][x-1]: - self.edgeAt("e", posx + w + b, posy - w, w, 90) - elif x < lx and self.floors[y][x]: - # Left edge - self.edgeAt(e, posx + t - w - b, posy + self.y[y], self.y[y], -90) - if y == 0 or not self.floors[y - 1][x]: - self.edgeAt("e", posx + t - w - b, - posy + self.y[y] + w, w, -90) - elif x == 0 or y == 0 or not self.floors[y - 1][x - 1]: - self.edgeAt("e", posx + t - w - b, - posy + self.y[y] + t, t, -90) - if y == ly - 1 or not self.floors[y + 1][x]: - self.edgeAt("e", posx + t - w - b, posy, w, -90) - posy += self.y[y] + self.thickness - if x < lx: - posx += self.x[x] + self.thickness - - self.move(tw, th, move) - - def parse(self, input): - x = [] - y = [] - hwalls = [] - vwalls = [] - floors = [] - for nr, line in enumerate(input): - if not line or line[0] == "#": - continue - m = re.match(r"( \|)* ,>\s*(\d*\.?\d+)\s*mm\s*", line) - if m: - x.append(float(m.group(2))) - continue - if line[0] == '+': - w = [] - for n, c in enumerate(line[:len(x) * 2 + 1]): - if n % 2: - if c == ' ': - w.append(False) - elif c == '-': - w.append(True) - else: - pass - # raise ValueError(line) - else: - if c != '+': - pass - # raise ValueError(line) - - hwalls.append(w) - if line[0] in " |": - w = [] - f = [] - for n, c in enumerate(line[:len(x) * 2 + 1]): - if n % 2: - if c in 'xX': - f.append(False) - elif c == ' ': - f.append(True) - else: - raise ValueError("""Can't parse line %i in layout: expected " ", "x" or "X" for char #%i""" % (nr + 1, n + 1)) - else: - if c == ' ': - w.append(False) - elif c == '|': - w.append(True) - else: - raise ValueError("""Can't parse line %i in layout: expected " ", or "|" for char #%i""" % (nr + 1, n + 1)) - - floors.append(f) - vwalls.append(w) - m = re.match(r"([ |][ xX])+[ |]\s*(\d*\.?\d+)\s*mm\s*", line) - if not m: - raise ValueError("""Can't parse line %i in layout: Can read height of the row""" % (nr + 1)) - else: - y.append(float(m.group(2))) - - # check sizes - lx = len(x) - ly = len(y) - - if lx == 0: - raise ValueError("Need more than one wall in x direction") - if ly == 0: - raise ValueError("Need more than one wall in y direction") - if len(hwalls) != ly + 1: - raise ValueError("Wrong number of horizontal wall lines: %i (%i expected)" % (len(hwalls), ly + 1)) - for nr, walls in enumerate(hwalls): - if len(walls) != lx: - raise ValueError("Wrong number of horizontal walls in line %i: %i (%i expected)" % (nr, len(walls), lx)) - if len(vwalls) != ly: - raise ValueError("Wrong number of vertical wall lines: %i (%i expected)" % (len(vwalls), ly)) - for nr, walls in enumerate(vwalls): - if len(walls) != lx + 1: - raise ValueError("Wrong number of vertical walls in line %i: %i (%i expected)" % (nr, len(walls), lx + 1)) - - self.x = x - self.y = y - self.hwalls = hwalls - self.vwalls = vwalls - self.floors = floors - - def render(self) -> None: - self.prepare() - self.walls() - self.base_plate(move="up") - self.lid(sum(self.x) + (len(self.x)-1) * self.thickness, - sum(self.y) + (len(self.y)-1) * self.thickness) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trianglelamp.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trianglelamp.py deleted file mode 100644 index c36d713..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/trianglelamp.py +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class CornerEdge(edges.Edge): - char = "C" - - def startwidth(self) -> float: - return self.boxes.thickness * math.tan(math.radians(90-22.5)) - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - with self.saved_context(): - self.ctx.stroke() - self.set_source_color(Color.RED) - self.moveTo(0, self.startwidth()) - self.edge(length) - self.ctx.stroke() - self.set_source_color(Color.BLACK) - super().__call__(length, bedBolts=None, bedBoltSettings=None, **kw) - - -class TriangleLamp(Boxes): - """Triangle LED Lamp""" - - ui_group = "Misc" - - def __init__(self) -> None: - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, finger=3.0,space=3.0, - surroundingspaces=0.5) - self.buildArgParser(x=250, h=40) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--cornersize", action="store", type=float, default=30, - help="short side of the corner triangles") - self.argparser.add_argument( - "--screenholesize", action="store", type=float, default=4, - help="diameter of the holes in the screen") - self.argparser.add_argument( - "--screwholesize", action="store", type=float, default=2, - help="diameter of the holes in the wood") - self.argparser.add_argument( - "--sharpcorners", action="store", type=boolarg, default=False, - help="extend walls for 45° corners. Requires grinding a 22.5° bevel.") - - def CB(self, l, size): - - def f(): - t = self.thickness - self.fingerHolesAt(0, self.h-1.5*t, size, 0) - self.fingerHolesAt(l, self.h-1.5*t, size, 180) - - return f - - def render(self): - # adjust to the variables you want in the local scope - x, h = self.x, self.h - l = (x**2+x**2)**.5 - c = self.cornersize - t = self.thickness - - r1 = self.screwholesize / 2 - r2 = self.screenholesize / 2 - - self.addPart(CornerEdge(self, None)) - - self.rectangularTriangle(x, x, num=2, move="up", callback=[ - lambda: self.hole(2/3.*c, 1/4.*c, r2), - lambda: (self.hole(1/3.*c, 1/3.*c, r2), - self.hole(x-2/3.*c, 1/4.*c, r2)), - ]) - self.rectangularTriangle(x, x, "fff", num=2, move="up") - - C = 'e' - if self.sharpcorners: - C = 'C' - - self.rectangularWall(x, h, "Ffe"+C, callback=[self.CB(x, c)], - move="up") - self.rectangularWall(x, h, "Ffe"+C, callback=[self.CB(x, c)], - move="up") - - self.rectangularWall(x, h, "F"+C+"eF", callback=[self.CB(x, c)], - move="up") - self.rectangularWall(x, h, "F"+C+"eF", callback=[self.CB(x, c)], - move="up") - - self.rectangularWall(l, h, "F"+C+"e" + C, - callback=[self.CB(l, c*2**.5)], move="up") - self.rectangularWall(l, h, "F"+C+"e" + C, - callback=[self.CB(l, c*2**.5)], move="up") - - - self.rectangularTriangle(c, c, "ffe", num=2, move="right", callback=[ - lambda:self.hole(2/3.*c,1/3.*c, r1)]) - self.rectangularTriangle(c, c, "fef", num=4, move="up", callback=[ - lambda: self.hole(2/3.*c, 1/4.*c, r1)]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/two_piece.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/two_piece.py deleted file mode 100644 index 8ceffa8..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/two_piece.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (C) 2013-2018 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class TwoPiece(Boxes): - """A two piece box where top slips over the bottom half to form - the enclosure. - """ - - description = """ -Set *hi* larger than *h* to leave gap between the inner and outer shell. This can be used to make opening the box easier. Set *hi* smaller to only have a small inner ridge that will allow the content to be more visible after opening. - -![Bottom view](static/samples/TwoPiece2.jpg) -""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.buildArgParser("x", "y", "h", "hi", "outside") - self.addSettingsArgs(edges.FingerJointSettings, finger=2.0, space=2.0) - - self.argparser.add_argument( - "--play", action="store", type=float, default=0.15, - help="play between the two parts as multiple of the wall thickness") - - def render(self): - # adjust to the variables you want in the local scope - x, y, h = self.x, self.y, self.h - hi = self.hi or self.h - t = self.thickness - p = self.play * t - - if self.outside: - x -= 4*t + 2*p - y -= 4*t + 2*p - h -= 2 * t - hi -= 2 * t - - # Adjust h edge with play - self.edges["f"].settings.setValues(t, False, edge_width=self.edges["f"].settings.edge_width + p) - - for i in range(2): - d = i * 2 * (t+p) - height = [hi, h][i] - with self.saved_context(): - self.rectangularWall(x+d, height, "fFeF", move="right") - self.rectangularWall(y+d, height, "ffef", move="right") - self.rectangularWall(x+d, height, "fFeF", move="right") - self.rectangularWall(y+d, height, "ffef", move="right") - self.rectangularWall(y, height, "ffef", move="up only") - - self.rectangularWall(x, y, "hhhh", bedBolts=None, move="right") - self.rectangularWall(x+d, y+d, "FFFF", bedBolts=None, move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/typetray.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/typetray.py deleted file mode 100644 index e520de5..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/typetray.py +++ /dev/null @@ -1,355 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes import Color, edges -from boxes.lids import LidSettings, _TopEdge - - -class FingerHoleEdgeSettings(edges.Settings): - """Settings for FingerHoleEdge -Values: -* absolute_params - - * radius : 10.0 : maximal radius (in mm) - * absolute_depth : 0.0 : depth of the hole in mm (in addition to the relative) - * absolute_width : 0.0 : width of the hole in mm (in addition to the relative) - * relative_depth : 0.0 : depth of the hole as fraction of the wall - * relative_width : 0.3 : width of the hole as fraction of the wall width - -""" - absolute_params = { - "radius": 10., - "absolute_depth": 0.0, - "relative_depth" : 0.9, - "absolute_width" : 0.0, - "relative_width" : 0.3, - } - - wallheight = 0.0 - -class FingerHoleEdge(edges.BaseEdge): - """An edge with room to get your fingers around cards""" - - char = "A" - - def __call__(self, length, **kw): - - width = min(self.settings.absolute_width + length * self.settings.relative_width, length) - depth = min(self.settings.absolute_depth + self.settings.wallheight * self.settings.relative_depth, self.settings.wallheight) - - r = min(width/2, depth, self.settings.radius) - - if depth < 1e-9 or width < 1e-9: - self.boxes.edge(length, tabs=2) - return - poly = (((length - width) / 2, 1), 90, depth-r, (-90, r)) - self.polyline(*poly, (width - 2*r, 1), *reversed(poly)) - - -class TypeTray(_TopEdge): - """Type tray - allows only continuous walls""" - - ui_group = "Tray" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addTopEdgeSettings(fingerjoint={"surroundingspaces": 0.5}, - roundedtriangle={"outset" : 1}) - self.addSettingsArgs(LidSettings) - self.buildArgParser("sx", "sy", "h", "hi", "outside", "bottom_edge", - "top_edge") - self.argparser.add_argument( - "--back_height", action="store", type=float, default=0.0, - help="additional height of the back wall - e top edge only") - self.argparser.add_argument( - "--radius", action="store", type=float, default=0.0, - help="radius for strengthening side walls with back_height") - self.argparser.add_argument( - "--gripheight", action="store", type=float, default=30, - dest="gh", help="height of the grip hole in mm") - self.argparser.add_argument( - "--gripwidth", action="store", type=float, default=70, - dest="gw", help="width of th grip hole in mm (zero for no hole)") - self.argparser.add_argument( - "--handle", type=boolarg, default=False, help="add handle to the bottom (changes bottom edge in the front)") - self.argparser.add_argument( - "--fingerholes", action="store", type=str, default="none", - choices=["none", "inside-only", "front", "back", "front-and-back"], - help="Decide which outer walls should have finger hole, too") - - label_group = self.argparser.add_argument_group("Compartment Labels") - label_group.add_argument( - "--text_size", action="store", type=int, default=12, - help="Textsize in mm for the traycontent") - label_group.add_argument( - "--text_alignment", action="store", type=str, default="left", - choices=['left', 'center', 'right'], - help="Text Alignment") - label_group.add_argument( - "--text_distance_x", action="store", type=float, default=2.0, - help="Distance in X from edge of tray in mm. Has no effect when text is centered.") - label_group.add_argument( - "--text_distance_y", action="store", type=float, default=2.0, - help="Distance in Y from edge of tray in mm.") - label_group.add_argument( - "--text_at_front", action="store", type=boolarg, default=False, - help="Start compartement labels on the front") - if self.UI == "web": - label_group.add_argument( - "--label_text", action="store", type=str, default="\n", - help="Every line is the text for one compartment. Beginning with front left") - else: - label_group.add_argument( - "--label_file", action="store", type=argparse.FileType('r'), - default="labels.txt", - help="file with compartment labels. One line per compartment") - - self.addSettingsArgs(FingerHoleEdgeSettings) - - @property - def fingerholedepth(self): - if self.fingerhole == 'custom': - return self.fingerhole_depth - elif self.fingerhole == 'regular': - a = self.h/4 - if a < 35: - return a - else: - return 35 - elif self.fingerhole == 'deep': - return self.h-self.thickness-10 - elif self.fingerhole == 'none': - return 0 - - def xSlots(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - posy = 0 - for y in self.sy: - self.fingerHolesAt(posx, posy, y) - posy += y + self.thickness - - def ySlots(self): - posy = -0.5 * self.thickness - for y in self.sy[:-1]: - posy += y + self.thickness - posx = 0 - for x in reversed(self.sx): - self.fingerHolesAt(posy, posx, x) - posx += x + self.thickness - - def xHoles(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - self.fingerHolesAt(posx, 0, self.hi) - - def yHoles(self): - posy = -0.5 * self.thickness - for y in self.sy[:-1]: - posy += y + self.thickness - self.fingerHolesAt(posy, 0, self.hi) - - def gripHole(self): - if not self.gw: - return - - x = sum(self.sx) + self.thickness * (len(self.sx) - 1) - r = min(self.gw, self.gh) / 2.0 - self.rectangularHole(x / 2.0, self.gh * 1.5, self.gw, self.gh, r) - - def textCB(self): - ## declare text-variables - textsize = self.text_size - texty = self.hi - textsize - self.text_distance_y - if self.text_alignment == 'center': - texty -= self.fingerholedepth - textdistance = self.sx[0] + self.thickness - - ## Generate text-fields for each tray - for n in range(len(self.sx)): - # Break for-loop if further list is empty - if self.textnumber >= len(self.textcontent): - break - - textx = n * (self.sx[0] + self.thickness) - # Calculate textposition - if self.text_alignment == 'left': - textx += self.text_distance_x - elif self.text_alignment == 'center': - textx += self.sx[0] / 2 - elif self.text_alignment == 'right': - textx += self.sx[0] - self.text_distance_x - - # Generate text - self.text( - "%s" % self.textcontent[self.textnumber], - textx, - texty, - 0, - align=self.text_alignment, - fontsize=textsize, - color=Color.ETCHING) - self.textnumber +=1 - - def render(self): - if self.outside: - self.sx = self.adjustSize(self.sx) - self.sy = self.adjustSize(self.sy) - self.h = self.adjustSize(self.h, e2=False) - if self.hi: - self.hi = self.adjustSize(self.hi, e2=False) - - x = sum(self.sx) + self.thickness * (len(self.sx) - 1) - y = sum(self.sy) + self.thickness * (len(self.sy) - 1) - h = self.h - sameh = not self.hi - hi = self.hi = self.hi or h - t = self.thickness - - s = FingerHoleEdgeSettings(self.thickness, True, - **self.edgesettings.get("FingerHoleEdge", {})) - s.wallheight = 0 if self.fingerholes == "none" else self.hi - p = FingerHoleEdge(self, s) - self.addPart(p) - - # outer walls - b = self.bottom_edge - tl, tb, tr, tf = self.topEdges(self.top_edge) - self.closedtop = self.top_edge in "fFhŠ" - - bh = self.back_height if self.top_edge == "e" else 0.0 - - if hasattr(self, "label_text"): - self.textcontent = self.label_text.split("\r\n") - else: - self.textcontent = self.label_file.readlines() - self.textnumber = 0 - - # x sides - - self.ctx.save() - - # floor - if b != "e": - if self.handle: - self.rectangularWall(x, y, "ffYf", callback=[self.xSlots, self.ySlots], move="up", label="bottom") - else: - self.rectangularWall(x, y, "ffff", callback=[self.xSlots, self.ySlots], move="up", label="bottom") - - # front - if self.text_at_front: - frontCBs = [lambda:(self.textCB(), self.mirrorX(self.xHoles, x)()), - None, self.gripHole] - else: - frontCBs = [self.mirrorX(self.xHoles, x), None, self.gripHole] - - # finger holes at front wall - if not self.closedtop and \ - self.fingerholes in ("front", "front-and-back"): - tf = edges.SlottedEdge(self, self.sx[::-1], "A") - - if bh: - self.rectangularWall( - x, h, ["f" if self.handle else b, "f", tf, "f"], - callback=frontCBs, move="up", label="front") - else: - self.rectangularWall( - x, h, ["f" if self.handle else b, "F", tf, "F"], - callback=frontCBs, ignore_widths=[] if self.handle else [1, 6], - move="up", label="front") - - - # Inner walls - - be = "f" if b != "e" else "e" - - ###### - for i in range(len(self.sy) - 1): - - e = [edges.SlottedEdge(self, self.sx, be), "f", - edges.SlottedEdge(self, self.sx[::-1], "A", slots=0.5 * hi), "f"] - - if self.closedtop and sameh: - e = [edges.SlottedEdge(self, self.sx, be), "f", - edges.SlottedEdge(self, self.sx[::-1], "f", slots=0.5 * hi), "f"] - - self.rectangularWall(x, hi, e, move="up", callback=[self.textCB], - label=f"inner x {i+1}") - - # back - - # finger holes at back wall - if not self.closedtop and \ - self.fingerholes in ("back", "front-and-back"): - tb = edges.SlottedEdge(self, self.sx, "A") - - if bh: - self.rectangularWall(x, h+bh, [b, "f", tb, "f"], - callback=[self.xHoles], - ignore_widths=[], - move="up", label="back") - else: - self.rectangularWall(x, h, [b, "F", tb, "F"], - callback=[self.xHoles], - ignore_widths=[1, 6], - move="up", label="back") - - # top / lid - if self.closedtop and sameh: - e = "FFFF" if self.top_edge == "f" else "ffff" - self.rectangularWall(x, y, e, callback=[ - self.xSlots, self.ySlots], move="up", label="top") - else: - self.drawLid(x, y, self.top_edge) - self.lid(x, y, self.top_edge) - - self.ctx.restore() - self.rectangularWall(x, hi, "ffff", move="right only") - - # y walls - - # outer walls - left/right - - if bh: - self.trapezoidSideWall( - y, h, h+bh, [b, "h", "e", "h"], - radius=self.radius, callback=[self.yHoles, ], - move="up", label="left side") - self.trapezoidSideWall( - y, h+bh, h, [b, "h", "e", "h"], radius=self.radius, - callback=[self.mirrorX(self.yHoles, y), ], - move="up", label="right side") - else: - self.rectangularWall( - y, h, [b, "f", tl, "f"], callback=[self.yHoles, ], - ignore_widths=[6] if self.handle else [1, 6], - move="up", label="left side") - self.rectangularWall( - y, h, [b, "f", tr, "f"], - callback=[self.mirrorX(self.yHoles, y), ], - ignore_widths=[1] if self.handle else [1, 6], - move="up", label="right side") - - # inner walls - for i in range(len(self.sx) - 1): - e = [edges.SlottedEdge(self, self.sy, be, slots=0.5 * hi), - "f", "e", "f"] - if self.closedtop and sameh: - e = [edges.SlottedEdge(self, self.sy, be, slots=0.5 * hi),"f", - edges.SlottedEdge(self, self.sy[::-1], "f"), "f"] - self.rectangularWall(y, hi, e, move="up", label=f"inner y {i+1}") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ubox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ubox.py deleted file mode 100644 index 05f7e8f..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/ubox.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright (C) 2013-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.lids import LidSettings, _TopEdge - - -class UBox(_TopEdge): - """Box various options for different stypes and lids""" - - ui_group = "FlexBox" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addTopEdgeSettings() - self.addSettingsArgs(edges.FlexSettings) - self.addSettingsArgs(LidSettings) - self.buildArgParser("top_edge", "x", "y", "h") - self.argparser.add_argument( - "--radius", action="store", type=float, default=30.0, - help="radius of bottom corners") - self.angle = 0 - - def U(self, x, y, r, edge="e", move=None, label=""): - - e = self.edges.get(edge, edge) - - w = self.edges["f"].spacing() - tw = x+2*w - th = y+w+e.spacing() - if self.move(tw, th, move, True, label=label): - return - - self.moveTo(w+r, w) - self.edges["f"](x-2*r) - self.corner(90, r) - self.edges["f"](y-r) - self.edgeCorner("f", e) - e(x) - self.edgeCorner(e, "f") - self.edges["f"](y-r) - self.corner(90, r) - - self.move(tw, th, move, label=label) - - def Uwall(self, x, y, h, r, edges="ee", move=None, label=""): - - e = [self.edges.get(edge, edge) for edge in edges] - - w = self.edges["F"].spacing() - cl = r*math.pi/2 - - tw = 2*y + x - 4*(cl-r) + e[0].spacing() + e[1].spacing() - th = h + 2*w - if self.move(tw, th, move, True, label=label): - return - - self.moveTo(e[0].spacing()) - - for nr, flex in enumerate("XE"): - self.edges["F"](y-r) - if x-2*r > 0.1 * self.thickness: - self.edges[flex](cl, h=th) - self.edges["F"](x-2*r) - self.edges[flex](cl, h=th) - else: - self.edges[flex](2*cl+x-2*r, h=th) - self.edges["F"](y-r) - self.edgeCorner("F", e[nr]) - e[nr](h) - self.edgeCorner(e[nr], "F") - - self.move(tw, th, move, label=label) - - def render(self): - x, y, h, r = self.x, self.y, self.h, self.radius - - self.radius = r = min(r, x/2.0, y) - - _ = self.translations.gettext - t1, t2, t3, t4 = self.topEdges(self.top_edge) - - self.U(x, y, r, t1, move="right", label=_("left")) - self.U(x, y, r, t3, move="up", label=_("right")) - self.U(x, y, r, t3, move="left only") - self.Uwall(x, y, h, r, [t2, t4], move="up", label=_("wall")) - - self.drawLid(x, h, self.top_edge) - self.lid(x, h, self.top_edge) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/unevenheightbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/unevenheightbox.py deleted file mode 100644 index b6318fa..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/unevenheightbox.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright (C) 2013-2018 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class UnevenHeightBox(Boxes): - """Box with different height in each corner""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(edges.GroovedSettings) - self.buildArgParser("x", "y", "outside", bottom_edge="F") - self.argparser.add_argument( - "--height0", action="store", type=float, default=50, - help="height of the front left corner in mm") - self.argparser.add_argument( - "--height1", action="store", type=float, default=50, - help="height of the front right corner in mm") - self.argparser.add_argument( - "--height2", action="store", type=float, default=100, - help="height of the right back corner in mm") - self.argparser.add_argument( - "--height3", action="store", type=float, default=100, - help="height of the left back corner in mm") - self.argparser.add_argument( - "--lid", action="store", type=boolarg, default=False, - help="add a lid (works best with high corners opposing each other)") - self.argparser.add_argument( - "--lid_height", action="store", type=float, default=0, - help="additional height of the lid") - self.argparser.add_argument( - "--edge_types", action="store", type=str, default="eeee", - help="which edges are flat (e) or grooved (z,Z), counter-clockwise from the front") - - def render(self): - - x, y = self.x, self.y - heights = [self.height0, self.height1, self.height2, self.height3] - - edge_types = self.edge_types - if len(edge_types) != 4 or any(et not in "ezZ" for et in edge_types): - raise ValueError("Wrong edge_types style: %s)" % edge_types) - - if self.outside: - x = self.adjustSize(x) - y = self.adjustSize(y) - for i in range(4): - heights[i] = self.adjustSize(heights[i], self.bottom_edge, - self.lid) - - t = self.thickness - h0, h1, h2, h3 = heights - b = self.bottom_edge - - self.trapezoidWall(x, h0, h1, [b, "F", edge_types[0], "F"], move="right") - self.trapezoidWall(y, h1, h2, [b, "f", edge_types[1], "f"], move="right") - self.trapezoidWall(x, h2, h3, [b, "F", edge_types[2], "F"], move="right") - self.trapezoidWall(y, h3, h0, [b, "f", edge_types[3], "f"], move="right") - - with self.saved_context(): - if b != "e": - self.rectangularWall(x, y, "ffff", move="up") - - if self.lid: - maxh = max(heights) - lidheights = [maxh-h+self.lid_height for h in heights] - h0, h1, h2, h3 = lidheights - lidheights += lidheights - edges = ["E" if (lidheights[i] == 0.0 and lidheights[i+1] == 0.0) else "f" for i in range(4)] - self.rectangularWall(x, y, edges, move="up") - - if self.lid: - self.moveTo(0, maxh+self.lid_height+self.edges["F"].spacing()+self.edges[b].spacing()+1*self.spacing, 180) - edge_inverse = {"e": "e", "z": "Z", "Z": "z"} - edge_types = [edge_inverse[et] for et in edge_types] - - self.trapezoidWall(y, h0, h3, "Ff" + edge_types[3] + "f", move="right" + - (" only" if h0 == h3 == 0.0 else "")) - self.trapezoidWall(x, h3, h2, "FF" + edge_types[2] + "F", move="right" + - (" only" if h3 == h2 == 0.0 else "")) - self.trapezoidWall(y, h2, h1, "Ff" + edge_types[1] + "f", move="right" + - (" only" if h2 == h1 == 0.0 else "")) - self.trapezoidWall(x, h1, h0, "FF" + edge_types[0] + "F", move="right" + - (" only" if h1 == h0 == 0.0 else "")) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/universalbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/universalbox.py deleted file mode 100644 index 9f1f6cf..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/universalbox.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes import lids -from boxes.edges import Bolts -from boxes.lids import _TopEdge - - -class UniversalBox(_TopEdge): - """Box with various options for different styles and lids""" - - ui_group = "Box" - - def __init__(self) -> None: - Boxes.__init__(self) - self.addTopEdgeSettings(roundedtriangle={"outset" : 1}, - hinge={"outset" : True}) - self.addSettingsArgs(edges.FlexSettings) - self.addSettingsArgs(lids.LidSettings) - self.buildArgParser("top_edge", "bottom_edge", - "x", "y", "h", "outside") - self.argparser.add_argument( - "--vertical_edges", action="store", type=str, - default="finger joints", - choices=("finger joints", "finger holes"), - help="connections used for the vertical edges") - - def top_hole(self, x, y, top_edge): - t = self.thickness - - if top_edge == "f": - edge = self.edges["F"] - self.moveTo(2*t+self.burn, 2*t, 90) - elif top_edge == "F": - edge = self.edges["f"] - self.moveTo(t+self.burn, 2*t, 90) - else: - raise ValueError("Only f and F supported") - - for l in (y, x, y, x): - edge(l) - if top_edge == "F": self.edge(t) - self.corner(-90) - if top_edge == "F": self.edge(t) - - def render(self): - x, y, h = self.x, self.y, self.h - t = self.thickness - - tl, tb, tr, tf = self.topEdges(self.top_edge) - b = self.edges.get(self.bottom_edge, self.edges["F"]) - - d2 = Bolts(2) - d3 = Bolts(3) - - d2 = d3 = None - - sideedge = "F" if self.vertical_edges == "finger joints" else "h" - - if self.outside: - self.x = x = self.adjustSize(x, sideedge, sideedge) - self.y = y = self.adjustSize(y) - self.h = h = self.adjustSize(h, b, self.top_edge) - - with self.saved_context(): - self.rectangularWall(x, h, [b, sideedge, tf, sideedge], - ignore_widths=[1, 6], - bedBolts=[d2], move="up", label="front") - self.rectangularWall(x, h, [b, sideedge, tb, sideedge], - ignore_widths=[1, 6], - bedBolts=[d2], move="up", label="back") - - if self.bottom_edge != "e": - self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], move="up", label="bottom") - if self.top_edge in "fF": - self.set_source_color(Color.MAGENTA) # I don't know why this part has a different color, but RED is not a good choice because RED is used for annotations - self.rectangularWall(x+4*t, y+4*t, callback=[ - lambda:self.top_hole(x, y, self.top_edge)], move="up", label="top hole") - self.set_source_color(Color.BLACK) - self.drawLid(x, y, self.top_edge, [d2, d3]) - self.lid(x, y, self.top_edge) - - self.rectangularWall(x, h, [b, sideedge, tf, sideedge], - ignore_widths=[1, 6], - bedBolts=[d2], move="right only", label="invisible") - self.rectangularWall(y, h, [b, "f", tl, "f"], - ignore_widths=[1, 6], - bedBolts=[d3], move="up", label="left") - self.rectangularWall(y, h, [b, "f", tr, "f"], - ignore_widths=[1, 6], - bedBolts=[d3], move="up", label="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallcaliperholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallcaliperholder.py deleted file mode 100644 index fe98af4..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallcaliperholder.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes.walledges import _WallMountedBox - - -class WallCaliper(_WallMountedBox): - """Holds a single caliper to a wall""" - - def __init__(self) -> None: - super().__init__() - - # remove cli params you do not need - self.buildArgParser(h=100) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--width", action="store", type=float, default=18.0, - help="width of the long end") - self.argparser.add_argument( - "--height", action="store", type=float, default=6.0, - help="height of the body") - - def side(self, move=None): - t = self.thickness - h = self.h - hc = self.height - - tw = self.edges["b"].spacing() + hc + 8*t - - if self.move(tw, h, move, True): - return - - self.moveTo(self.edges["b"].startwidth()) - self.polyline(5*t+hc, (90, 2*t), h/2-2*t, (180, 1.5*t), 0.25*h, - -90, hc, -90, 0.75*h-2*t, (90, 2*t), 2*t, 90) - - self.edges["b"](h) - - self.move(tw, h, move) - - def render(self): - self.generateWallEdges() - - t = self.thickness - h = self.h - - self.side(move="right") - self.side(move="right") - w = self.width - self.flangedWall(w, h, flanges=[0, 2*t, 0, 2*t], edges="eeee", - r=2*t, - callback=[lambda:(self.wallHolesAt(1.5*t, 0, h, 90), self.wallHolesAt(w+2.5*t, 0, h, 90))]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallchiselholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallchiselholder.py deleted file mode 100644 index 848aab4..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallchiselholder.py +++ /dev/null @@ -1,125 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.walledges import _WallMountedBox - - -class FrontEdge(edges.Edge): - - def __call__(self, length, **kw): - td = self.tooldiameter - rh = self.holediameter / 2.0 - r = self.radius - sw = self.slot_width - - a = math.degrees(math.asin((r+sw/2)/(r+rh))) - l = (td - sw - 2*r) / 2 - - for i in range(self.number): - self.polyline(l, (180-a, r), 0, (-360+2*a, rh), 0, (180-a, r), l) - - - -class WallChiselHolder(_WallMountedBox): - """Wall tool holder for chisels, files and similar tools""" - - def __init__(self) -> None: - super().__init__() - - self.buildArgParser(h=120) - - self.argparser.add_argument( - "--tooldiameter", action="store", type=float, default=30., - help="diameter of the tool including space to grab") - self.argparser.add_argument( - "--holediameter", action="store", type=float, default=30., - help="diameter of the hole for the tool (handle should not fit through)") - self.argparser.add_argument( - "--slot_width", action="store", type=float, default=5., - help="width of slots") - #self.argparser.add_argument( - # "--angle", action="store", type=float, default=0., - # help="angle of the top - positive for leaning backwards") - self.argparser.add_argument( - "--radius", action="store", type=float, default=5., - help="radius at the slots") - self.argparser.add_argument( - "--number", action="store", type=int, default=6, - help="number of tools/slots") - self.argparser.add_argument( - "--hooks", action="store", type=str, default="all", - choices=("all", "odds", "everythird"), - help="amount of hooks / braces") - - def brace(self, i): - n = self.number - if i in (0, n): - return True - # fold for symmetry - #if i > n//2: - # i = n - i - if self.hooks == "all": - return True - elif self.hooks == "odds": - return not (i % 2) - elif self.hooks == "everythird": - return not (i % 3) - - def braces(self): - return sum(self.brace(i) for i in range(self.number+1)) - - def backCB(self): - n = self.number - rt = self.holediameter - wt = self.tooldiameter - t = self.thickness - - d = min(2*t, (wt-rt)/4.) - self.wallHolesAt(d, 0, self.h, 90) - self.wallHolesAt(n*wt-d, 0, self.h, 90) - - for i in range(1, n): - if self.brace(i): - self.wallHolesAt(i*wt, 0, self.h, 90) - - def topCB(self): - n = self.number - rt = self.holediameter - wt = self.tooldiameter - t = self.thickness - l = self.depth - - d = min(2*t, (wt-rt)/4.) - self.fingerHolesAt(d, 0, l, 90) - self.fingerHolesAt(n*wt-d, 0, l, 90) - - for i in range(1, n): - if self.brace(i): - self.fingerHolesAt(i*wt, 0, l, 90) - - def render(self): - self.generateWallEdges() - - t = self.thickness - wt = self.tooldiameter - n = self.number - - self.depth = depth = wt + 4*t - - self.rectangularWall(n*wt, self.h, "eeee", callback=[self.backCB], move="up") - self.rectangularWall(n*wt, depth, [FrontEdge(self, None), "e","e","e"], callback=[self.topCB], move="up") - self.moveTo(0, t) - self.rectangularTriangle(depth, self.h, "fbe", r=3*t, num=self.braces()) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallconsole.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallconsole.py deleted file mode 100644 index 6b769c1..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallconsole.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes.walledges import _WallMountedBox - - -class WallConsole(_WallMountedBox): - """Outset and angled plate to mount stuff to""" - - def __init__(self) -> None: - super().__init__() - - self.buildArgParser(sx=100, h=100, outside=True) - - self.argparser.add_argument( - "--top_depth", action="store", type=float, default=50, - help="depth at the top") - self.argparser.add_argument( - "--bottom_depth", action="store", type=float, default=35, - help="depth at the bottom") - - def backHoles(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - self.wallHolesAt(posx, 0, self.h, 90) - - def frontHoles(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - self.fingerHolesAt(posx, 0, self.front, 90) - - def render(self): - - self.generateWallEdges() - - if self.outside: - self.sx = self.adjustSize(self.sx) - self.h = self.adjustSize(self.h) - - x = sum(self.sx) + self.thickness * (len(self.sx) - 1) - h = self.h - td = self.top_depth - bd = self.bottom_depth - - self.front = (h**2 + (td-bd)**2)**0.5 - - self.rectangularWall(x, h, "eCec", callback=[self.backHoles], - move="up") - self.rectangularWall(x, self.front, "eFeF", - callback=[self.frontHoles], move="up") - - for i in range(len(self.sx)+1): - self.trapezoidWall(h, td, bd, "befe", move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walldrillbox.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walldrillbox.py deleted file mode 100644 index 1789126..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walldrillbox.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.walledges import _WallMountedBox - -from .drillstand import DrillStand - - -class WallDrillBox(DrillStand, _WallMountedBox): - """Box for drills with each compartment with a different height""" - ui_group = "WallMounted" - - def __init__(self) -> None: - _WallMountedBox.__init__(self) # don't call DrillStand.__init__ - - self.addSettingsArgs(edges.StackableSettings, height=1.0, width=3) - self.buildArgParser(sx="25*6", sy="10:20:30", sh="25:40:60") - self.argparser.add_argument( - "--extra_height", action="store", type=float, default=15.0, - help="height difference left to right") - - def render(self): - self.generateWallEdges() - - t = self.thickness - sx, sy, sh = self.sx, self.sy, self.sh - self.x = x = sum(sx) + len(sx)*t - t - self.y = y = sum(sy) + len(sy)*t - t - - bottom_angle = math.atan(self.extra_height / x) # radians - - self.xOutsideWall(sh[0], "hFeF", move="up") - for i in range(1, len(sy)): - self.xWall(i, move="up") - self.xOutsideWall(sh[-1], "hCec", move="up") - - self.rectangularWall(x/math.cos(bottom_angle)-t*math.tan(bottom_angle), y, "fefe", callback=[self.bottomCB], move="up") - - self.sideWall(edges="eBf", foot_height=2*t, move="right") - for i in range(1, len(sx)): - self.yWall(i, move="right") - self.sideWall(self.extra_height, foot_height=2*t, edges="eBf", move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walledges.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walledges.py deleted file mode 100644 index 71c5978..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walledges.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes.walledges import _WallMountedBox - - -class WallEdges(_WallMountedBox): - """Shows the different edge types for wall systems""" - - def __init__(self) -> None: - super().__init__() - self.buildArgParser(h=120) - - def render(self): - self.generateWallEdges() - - h = self.h - - self.moveTo(0, 25) - self.rectangularWall( - 40, h, "eAea", move="right", - callback=[lambda : (self.text("a", 0, -20), - self.text("A", 30, -20))]) - self.rectangularWall( - 40, h, "eBeb", move="right", - callback=[lambda : (self.text("b", 0, -20), - self.text("B", 30, -20))]) - self.rectangularWall(40, h, "eCec", - callback=[lambda : (self.text("c", 0, -20), - self.text("C", 30, -20), - self.text("wallHolesAt", -5, -30), - self.wallHolesAt(20, 0, h, 90))], move="right") - self.moveTo(10) - self.rectangularWall( - 40, h, "eDed", move="right", - callback=[lambda : (self.text("d", 0, -20), - self.text("D", 30, -20))]) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallpinrow.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallpinrow.py deleted file mode 100644 index 18ff72e..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallpinrow.py +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.walledges import _WallMountedBox - - -class PinEdge(edges.BaseEdge): - def __call__(self, length, **kw): - w2 = self.settings.pinwidth/2 - l = self.settings.pinlength - s = self.settings.pinspacing - inc = self.settings.pinspacing_increment - t = self.settings.thickness - - pin = [0, -90, l+t-w2, (180, w2), l+t-w2, -90] - - self.edge(s/2-w2) - s += inc/2 - for i in range(self.pins-1): - self.polyline(*pin, s-2*w2) - s+=inc - self.polyline(*pin, s/2-w2-inc/4) - - def margin(self) -> float: - return self.settings.thickness+self.settings.pinlength - -class WallPinRow(_WallMountedBox): - """Outset and angled plate to mount stuff to""" - - def __init__(self) -> None: - super().__init__() - - self.argparser.add_argument( - "--pins", action="store", type=int, default=8, - help="number of pins") - self.argparser.add_argument( - "--pinlength", action="store", type=float, default=35, - help="length of pins (in mm)") - self.argparser.add_argument( - "--pinwidth", action="store", type=float, default=10, - help="width of pins (in mm)") - self.argparser.add_argument( - "--pinspacing", action="store", type=float, default=35, - help="space from middle to middle of pins (in mm)") - self.argparser.add_argument( - "--pinspacing_increment", action="store", type=float, default=0.0, - help="increase spacing from left to right (in mm)") - self.argparser.add_argument( - "--angle", action="store", type=float, default=20.0, - help="angle of the pins pointing up (in degrees)") - - self.argparser.add_argument( - "--hooks", action="store", type=int, default=3, - help="number of hooks into the wall") - self.argparser.add_argument( - "--h", action="store", type=float, default=50.0, - help="height of the front plate (in mm) - needs to be at least 7 time the thickness") - - def frontCB(self): - s = self.pinspacing - inc = self.pinspacing_increment - t = self.thickness - - pos = s/2 - s += 0.5*inc - for i in range(self.pins): - self.rectangularHole(pos, 2*t, self.pinwidth, t) - pos += s - s+=inc - - for i in range(1, self.hooks-1): - self.fingerHolesAt(i*self.x/(self.hooks-1), self.h/2, self.h/2) - - - def backCB(self): - t = self.thickness - self.fingerHolesAt(0, 2*t, self.x, 0) - if self.angle < 0.001: - return - for i in range(1, self.hooks-1): - self.fingerHolesAt(i*self.x/(self.hooks-1), 3*t, self.h/2-3*t) - - def sideWall(self, move=None): - a = self.angle - ar = math.radians(a) - h = self.h - t = self.thickness - - sh = math.sin(ar)*6*t + math.cos(ar)*h - - tw = self.edges["a"].margin() + math.sin(ar)*h + math.cos(ar)*6*t - th = sh + 6 - if self.move(tw, th, move, True): - return - - self.moveTo(self.edges["a"].margin()) - - self.polyline(math.sin(ar)*h, a, 4*t) - self.fingerHolesAt(-3.5*t, 0, h/2, 90) - self.edgeCorner("e", "h") - self.edges["h"](h) - self.polyline(0, 90-a, math.cos(ar)*6*t, 90) - self.edges["a"](sh) - self.corner(90) - - self.move(tw, th, move) - - - def supportWall(self, move=None): - a = self.angle - ar = math.radians(a) - h = self.h - t = self.thickness - - sh = math.sin(ar)*6*t + math.cos(ar)*h - - tw = self.edges["a"].margin() + max( - math.sin(ar)*h/2 + math.cos(ar)*5*t, - math.sin(ar)*h) - th = sh + 6 - if self.move(tw, th, move, True): - return - - self.moveTo(self.edges["a"].margin()) - - if a > 0.001: - self.polyline(math.sin(ar)*h, a+90, 3*t) - self.edges["f"](h/2-3*t) - self.polyline(0, -90) - self.polyline(4*t, 90) - self.edges["f"](h/2) - self.polyline(math.sin(ar)*2*t, 90-a, - math.cos(ar)*4*t - math.sin(ar)**2*2*t, 90) - if a > 0.001: - self.edges["a"](sh) - else: - self.edges["a"](h/2) - self.corner(90) - - self.move(tw, th, move) - - - def render(self): - self.generateWallEdges() - - p = PinEdge(self, self) - n = self.pins - t = self.thickness - - if self.h < 7*t: - self.h = 7*t - - self.x = x = n*self.pinspacing + (n)*(n-1)/2 *self.pinspacing_increment - - - self.rectangularWall(x, 3*t, [p, "e", "f", "e"], move="up") - self.rectangularWall(x, self.h, "efef", callback=[self.frontCB], - move="up") - self.rectangularWall(x, self.h/2, "efef", callback=[self.backCB], - move="up") - self.sideWall(move="right") - for i in range(self.hooks-2): - self.supportWall(move="right") - self.sideWall(move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallplaneholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallplaneholder.py deleted file mode 100644 index e4e9aca..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallplaneholder.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes.walledges import _WallMountedBox - - -class WallPlaneHolder(_WallMountedBox): - """Hold a plane to a wall""" - - def __init__(self) -> None: - super().__init__() - - self.argparser.add_argument( - "--width", action="store", type=float, default=80, - help="width of the plane") - self.argparser.add_argument( - "--length", action="store", type=float, default=250, - help="length of the plane") - self.argparser.add_argument( - "--hold_length", action="store", type=float, default=30, - help="length of the part holding the plane over the front") - self.argparser.add_argument( - "--height", action="store", type=float, default=80, - help="height of the front of plane") - - def side(self): - l, w, h = self.length, self.width, self.height - hl = self.hold_length - t = self.thickness - self.fingerHolesAt(1.5*t, 2*t, 0.25*l, 90) - self.fingerHolesAt(1.5*t, 2*t+0.75*l, 0.25*l, 90) - self.fingerHolesAt(2.5*t+h, 2*t+l-hl, hl, 90) - self.fingerHolesAt(2*t, 1.5*t, h+2*t, 0) - - def render(self): - self.generateWallEdges() - - l, w, h = self.length, self.width, self.height - t = self.thickness - self.rectangularWall(h+4*t, l+2*t, "eeea", callback=[self.side], - move="right") - self.rectangularWall(h+4*t, l+2*t, "eeea", callback=[self.side], - move="right") - self.rectangularWall(w, h+2*t, "efFf", move="up") - self.rectangularWall(w, 0.25*l, "ffef", move="up") - self.rectangularWall(w, 0.25*l, "efef", move="up") - self.rectangularWall(w, self.hold_length, "efef", move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallpliersholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallpliersholder.py deleted file mode 100644 index 40a62f3..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallpliersholder.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.walledges import _WallMountedBox - - -class WallPliersHolder(_WallMountedBox): - """Bar to hang pliers on""" - - def __init__(self) -> None: - super().__init__() - - self.buildArgParser(sx="100*3", y=50, h=50, outside=True) - - self.argparser.add_argument( - "--angle", action="store", type=float, default=45, - help="bracing angle - less for more bracing") - - def brace(self, h, d, a, outside=False, move=None): - t = self.thickness - - tw = d + self.edges["b"].spacing() + self.edges["f"].spacing() - th = self.h_t - - if self.move(tw, th, move, True): - return - - self.moveTo(self.edges["b"].spacing()) - - r = d / 4 - l = (d + t - r) / math.sin(math.radians(a)) - - if outside: - self.polyline(t, (90-a, r), l, (a, r)) - self.edges["h"](h) - self.polyline(0, 90, d + 2*t, 90) - else: - self.polyline(0, (90-a, r), l, (a, r), 0, 90, t, -90) - self.edges["f"](h) - self.polyline(0, 90, d, 90) - self.edges["b"](h + (d+t-r) * math.tan(math.radians(90-a)) + r) - self.polyline(0, 90) - - self.move(tw, th, move) - - def frontCB(self): - t = self.thickness - posx = -t - for dx in self.sx[:-1]: - posx += dx + t - self.fingerHolesAt(posx, 0, self.h, 90) - - def backCB(self): - t = self.thickness - posx = -t - for dx in self.sx[:-1]: - posx += dx + t - self.wallHolesAt(posx, 0, self.h_t, 90) - - def render(self): - self.generateWallEdges() - - if self.outside: - self.sx = self.adjustSize(self.sx) - - sx, y, h = self.sx, self.y, self.h - t = self.thickness - - r = y / 4 - self.h_t = h + (y+t-r) * math.tan(math.radians(90-self.angle)) + r - - self.rectangularWall(sum(sx) + (len(sx)-1) * t, h, "efef", callback=[self.frontCB], move="up") - self.rectangularWall(sum(sx) + (len(sx)-1) * t, self.h_t, "eCec", callback=[self.backCB], move="up") - for i in range(len(sx)+1): - self.brace(h, y, self.angle, i<2, move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallrack.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallrack.py deleted file mode 100644 index d28b7f8..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallrack.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright (C) 2013-2023 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from functools import partial - -from boxes import * - - -class WallRack(Boxes): - """Wall mountable rack for spices or other items""" - - ui_group = "WallMounted" - - def __init__(self): - Boxes.__init__(self) - - self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1.0) - self.addSettingsArgs(edges.MountingSettings) - self.addSettingsArgs(edges.HandleEdgeSettings) - - self.buildArgParser(x=200, y=50, sh="100*3", outside=False) - self.argparser.add_argument( - "--top_edge", action="store", - type=ArgparseEdgeType("eEGy"), choices=list("eEGy"), - default="G", help="edge type for top edge") - self.argparser.add_argument("--full_height_top", type=boolarg, default=True, help="Add full height of topmost rack to the back panel") - self.argparser.add_argument( - "--wall_height", action="store", type=float, default=20.0, - help="height of walls") - self.argparser.add_argument( - "--back_height", action="store", type=float, default=1.5, - help="height of the back as fraction of the front height") - self.argparser.add_argument( - "--side_edges", action="store", - type=ArgparseEdgeType("Fh"), choices=list("Fh"), - default="h", help="edge type holding the shelfs together") - self.argparser.add_argument( - "--flat_bottom", type=boolarg, default=False, help="Make bottom Flat, so that the rack can also stand") - - def generate_shelves(self, x, y, front_height, back_height): - se = self.side_edges - for i in range(len(self.sh)): - self.rectangularWall(x, y, "ffff", move="up", label=f"shelf {i+1}") - self.rectangularWall(x, front_height, se + "fef", move="up", label=f"front lip {i+1}") - self.trapezoidWall(y, front_height, back_height, se + "fe" + se, move="right", label=f"right lip {i+1}") - self.trapezoidWall(y, front_height, back_height, se + "fe" + se, move="up", label=f"left lip {i+1}") - self.move(y + self.thickness*2, back_height, "left", before=True) - - #Generate finger holes for back part - def generate_finger_holes(self, x, back_height): - t = self.thickness - pos_y = 0 - for h in self.sh: - self.fingerHolesAt(t*0.5, pos_y + 0.5*t, x, 0) - self.fingerHolesAt(0, pos_y + t, back_height, 90) - self.fingerHolesAt(x+t, pos_y + t, back_height, 90) - pos_y += h - - def render(self): - x, y, front_height = self.x, self.y, self.wall_height - back_height = front_height * self.back_height - t = self.thickness - if self.outside: - x = self.adjustSize(x, "h", "f") - y = self.adjustSize(y) - front_height = self.adjustSize(front_height) - back_height = self.adjustSize(back_height) - - if self.full_height_top: - total_height = sum(self.sh) - else: - total_height = sum(self.sh[:-1]) + back_height - - be = "e" if self.flat_bottom and self.side_edges == "F" else "E" - if be == "E" and self.full_height_top: - total_height -= t - - self.rectangularWall(x+self.thickness, total_height, be + "E" + self.top_edge + "E", - callback=[partial(self.generate_finger_holes, x, back_height)], label="back wall", move="right") - self.generate_shelves(x, y, front_height, back_height) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallrollholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallrollholder.py deleted file mode 100644 index 579c0c4..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallrollholder.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.walledges import _WallMountedBox - - -class WallRollHolder(_WallMountedBox): - """Holder for kitchen rolls or other rolls""" - - description = """Needs a dowel or pipe as axle.""" - - ui_group = "WallMounted" - - def __init__(self) -> None: - super().__init__() - - self.argparser.add_argument( - "--width", action="store", type=float, default=275, - help="length of the axle in mm") - self.argparser.add_argument( - "--diameter", action="store", type=float, default=120, - help="maximum diameter of the roll in mm (choose generously)") - self.argparser.add_argument( - "--height", action="store", type=float, default=80, - help="height of mounting plate in mm") - self.argparser.add_argument( - "--axle", action="store", type=float, default=25, - help="diameter of the axle in mm including play") - - def side(self, move=None): - d = self.diameter - a = self.axle - h = self.height - t = self.thickness - - tw, th = h, (d + a) / 2 + 3 * t + self.edges["B"].spacing() - - if self.move(tw, th, move, True): - return - - self.moveTo(0, self.edges["B"].margin()) - self.edges["B"](h) - self.fingerHolesAt(-(a/2+3*t), self.burn+self.edges["B"].endwidth(), d/2, 90) - self.polyline(0, 90, self.edges["B"].endwidth() + d/2, - (90, a/2 + 3*t)) - - r = a/2 + 3*t - a = math.atan2(float(d/2), (h-a-6*t)) - alpha = math.degrees(a) - - self.corner(alpha, r) - self.edge(((h-2*r)**2+(d/2)**2)**0.5) - self.corner(90-alpha, r) - self.edge(self.edges["B"].startwidth()) - self.corner(90) - - self.move(tw, th, move) - - def backCB(self): - t = self.thickness - a = self.axle - h = self.height - w = self.width - - plate = w + 2*t + h/2 - - self.wallHolesAt(h/4+t/2-3*t, 0, h, 90) - self.fingerHolesAt(h/4-3*t, h-3*t-a/2, h/4, 180) - - self.wallHolesAt(h/4+t/2+t-3*t+w, 0, h, 90) - self.fingerHolesAt(h/4+2*t-3*t+w, h-3*t-a/2, h/4, 0) - - def rings(self): - a = self.axle - r = a/2 - t = self.thickness - - self.moveTo(0, a+1.5*t, -90) - for i in range(2): - self.polyline(r-1.5*t, (180, r+3*t), 0, (180, 1.5*t), 0, - (-180, r), r-1.5*t, (180, 1.5*t)) - self.moveTo(a-t, a+12*t, 180) - - - def render(self): - - self.generateWallEdges() - - t = self.thickness - w = self.width - d = self.diameter - a = self.axle - h = self.height - - self.height = h = max(h, a+10*t) - - self.side(move="right") - self.side(move="right") - - self.rectangularTriangle(h/4, d/2, "ffe", num=2, r=3*t, move="right") - - self.roundedPlate(w+h/2+2*t, h, edge="e", r=3*t, - extend_corners=False, - callback=[self.backCB], move="right") - self.rings() diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallslottedholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallslottedholder.py deleted file mode 100644 index 61bf43d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallslottedholder.py +++ /dev/null @@ -1,125 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.walledges import _WallMountedBox - - -class FrontEdge(edges.Edge): - - def __call__(self, length, **kw): - ws = self.slot_width - wt = self.tool_width - ds = self.slot_depth - r1 = min(self.radius, ds/2, (wt-ws)/2) - r2 = min(self.radius, ws/2) - w = (wt-ws)/2 - r1 - for i in range(self.number): - self.polyline(w, (90, r1), ds-r1-r2, (-90, r2), ws-2*r2, - (-90, r2), ds-r1-r2, (90, r1), w) - -class WallSlottedHolder(_WallMountedBox): - """Wall tool holder with slots""" - - def __init__(self) -> None: - super().__init__() - - self.buildArgParser(h=120) - - self.argparser.add_argument( - "--slot_depth", action="store", type=float, default=50., - help="depth of slots from the front") - self.argparser.add_argument( - "--additional_depth", action="store", type=float, default=50., - help="depth behind the lots") - self.argparser.add_argument( - "--slot_width", action="store", type=float, default=5., - help="width of slots") - self.argparser.add_argument( - "--tool_width", action="store", type=float, default=35., - help="overall width for the tools") - #self.argparser.add_argument( - # "--angle", action="store", type=float, default=0., - # help="angle of the top - positive for leaning backwards") - self.argparser.add_argument( - "--radius", action="store", type=float, default=5., - help="radius of the slots at the front") - self.argparser.add_argument( - "--number", action="store", type=int, default=6, - help="number of tools/slots") - self.argparser.add_argument( - "--hooks", action="store", type=str, default="all", - choices=("all", "odds", "everythird"), - help="amount of hooks / braces") - - def brace(self, i): - n = self.number - if i in (0, n): - return True - # fold for symmetry - #if i > n//2: - # i = n - i - if self.hooks == "all": - return True - elif self.hooks == "odds": - return not (i % 2) - elif self.hooks == "everythird": - return not (i % 3) - - def braces(self): - return sum(self.brace(i) for i in range(self.number+1)) - - def backCB(self): - n = self.number - ws = self.slot_width - wt = self.tool_width - t = self.thickness - - d = min(2*t, (wt-ws)/4.) - self.wallHolesAt(d, 0, self.h, 90) - self.wallHolesAt(n*wt-d, 0, self.h, 90) - - for i in range(1, n): - if self.brace(i): - self.wallHolesAt(i*wt, 0, self.h, 90) - - def topCB(self): - n = self.number - ws = self.slot_width - wt = self.tool_width - t = self.thickness - l = self.additional_depth + self.slot_depth - - d = min(2*t, (wt-ws)/4.) - self.fingerHolesAt(d, 0, l, 90) - self.fingerHolesAt(n*wt-d, 0, l, 90) - - for i in range(1, n): - if self.brace(i): - self.fingerHolesAt(i*wt, 0, l, 90) - - def render(self): - self.generateWallEdges() - - t = self.thickness - l1, l2 = self.additional_depth, self.slot_depth - ws = self.slot_width - wt = self.tool_width - n = self.number - - self.rectangularWall(n*wt, self.h, "eeee", callback=[self.backCB], move="up") - self.rectangularWall(n*wt, l1+l2, [FrontEdge(self, None), "e","e","e"], callback=[self.topCB], move="up") - self.moveTo(0, t) - self.rectangularTriangle(l1+l2, self.h, "fbe", r=3*t, num=self.braces()) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallstairs.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallstairs.py deleted file mode 100644 index f67518e..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallstairs.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes.walledges import _WallMountedBox - - -class WallStairs(_WallMountedBox): - """Platforms in different heights e.g. for screw drivers""" - - description = """You are supposed to add holes or slots to the stair tops yourself using Inkscape or another vector drawing or CAD program. - -sh gives height of the stairs from front to back. Note that the overall width and height is bigger than the nominal values as walls and the protrusions are not included in the measurements. -""" - def __init__(self) -> None: - super().__init__() - - self.buildArgParser(sx="250/3", sy="40*3", sh="30:100:180") - self.argparser.add_argument( - "--braceheight", action="store", type=float, default=30, - help="height of the brace at the bottom back (in mm). Zero for none") - - def yWall(self, move=None): - t = self.thickness - x, sx, y, sy, sh = self.x, self.sx, self.y, self.sy, self.sh - - tw, th = sum(sy), max(sh) + t - - if self.move(tw, th, move, True): - return - - self.polyline(y-t, 90) - self.edges["f"](self.braceheight) - self.step(t) - self.edges["A"](sh[-1] - self.braceheight) - self.corner(90) - for i in range(len(sy)-1, 0, -1): - self.edges["f"](sy[i]) - self.step(sh[i-1]-sh[i]) - self.edges["f"](sy[0]) - self.polyline(0, 90, sh[0], 90) - - self.move(tw, th, move) - - def yCB(self, width): - t = self.thickness - posx = -0.5 * t - for dx in self.sx[:-1]: - posx += dx + t - self.fingerHolesAt(posx, 0, width, 90) - - - def render(self): - self.generateWallEdges() - - self.extra_height = 20 - t = self.thickness - sx, sy, sh = self.sx, self.sy, self.sh - self.x = x = sum(sx) + len(sx)*t - t - self.y = y = sum(sy) - - for w in sy: - self.rectangularWall( - x, w, "eheh", callback=[lambda:self.yCB(w)], move="up") - if self.braceheight: - self.rectangularWall( - x, self.braceheight, "eheh", - callback=[lambda:self.yCB(self.braceheight)], move="up") - - for i in range(len(sx) + 1): - self.yWall(move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walltypetray.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walltypetray.py deleted file mode 100644 index 3d84fb9..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/walltypetray.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.lids import _TopEdge -from boxes.walledges import _WallMountedBox - - -class WallTypeTray(_WallMountedBox, _TopEdge): - """Type tray - allows only continuous walls""" - - def __init__(self) -> None: - super().__init__() - self.addSettingsArgs(edges.StackableSettings) - self.buildArgParser("sx", "sy", "h", "hi", "outside", "bottom_edge") - self.argparser.add_argument( - "--back_height", action="store", type=float, default=0.0, - help="additional height of the back wall") - self.argparser.add_argument( - "--radius", action="store", type=float, default=0.0, - help="radius for strengthening walls with the hooks") - - - def xSlots(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - posy = 0 - for y in self.sy: - self.fingerHolesAt(posx, posy, y) - posy += y + self.thickness - - def ySlots(self): - posy = -0.5 * self.thickness - for y in self.sy[:-1]: - posy += y + self.thickness - posx = 0 - for x in reversed(self.sx): - self.fingerHolesAt(posy, posx, x) - posx += x + self.thickness - - def xHoles(self): - posx = -0.5 * self.thickness - for x in self.sx[:-1]: - posx += x + self.thickness - self.fingerHolesAt(posx, 0, self.hi) - - def yHoles(self): - posy = -0.5 * self.thickness - for y in self.sy[:-1]: - posy += y + self.thickness - self.fingerHolesAt(posy, 0, self.hi) - - def render(self): - - self.generateWallEdges() - b = self.bottom_edge - - if self.outside: - self.sx = self.adjustSize(self.sx) - self.sy = self.adjustSize(self.sy) - self.h = self.adjustSize(self.h, b, e2=False) - if self.hi: - self.hi = self.adjustSize(self.hi, b, e2=False) - - x = sum(self.sx) + self.thickness * (len(self.sx) - 1) - y = sum(self.sy) + self.thickness * (len(self.sy) - 1) - h = self.h - bh = self.back_height - sameh = not self.hi - hi = self.hi = self.hi or h - t = self.thickness - - - # outer walls - # x sides - - self.ctx.save() - - # outer walls - self.rectangularWall(x, h, [b, "f", "e", "f"], callback=[self.xHoles], move="up") - self.rectangularWall(x, h+bh, [b, "C", "e", "c"], callback=[self.mirrorX(self.xHoles, x), ], move="up") - - # floor - if b != "e": - self.rectangularWall(x, y, "ffff", callback=[ - self.xSlots, self.ySlots], move="up") - - # Inner walls - - be = "f" if b != "e" else "e" - - for i in range(len(self.sy) - 1): - e = [edges.SlottedEdge(self, self.sx, be), "f", - edges.SlottedEdge(self, self.sx[::-1], "e", slots=0.5 * hi), "f"] - - self.rectangularWall(x, hi, e, move="up") - - # y walls - - # outer walls - self.trapezoidSideWall(y, h, h+bh, [b, "B", "e", "h"], radius=self.radius, callback=[self.yHoles, ], move="up") - self.moveTo(0, 8) - self.trapezoidSideWall(y, h+bh, h, [b, "h", "e", "b"], radius=self.radius, callback=[self.mirrorX(self.yHoles, y), ], move="up") - self.moveTo(0, 8) - - # inner walls - for i in range(len(self.sx) - 1): - e = [edges.SlottedEdge(self, self.sy, be, slots=0.5 * hi), - "f", "e", "f"] - self.rectangularWall(y, hi, e, move="up") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallwrenchholder.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallwrenchholder.py deleted file mode 100644 index 6d22c2d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wallwrenchholder.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (C) 2013-2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * -from boxes.walledges import _WallMountedBox - - -class SlottedEdge(edges.Edge): - - def __call__(self, length, **kw): - - n = self.number - t = self.thickness - - self.polyline(t, 45) - - l = t - - for i in range(n): - w = self.min_width * ((n-i)/n) + self.max_width * (i / n) - s = self.min_strength * ((n-i)/n) + self.max_strength * (i / n) - if i == n-1: - self.polyline(w-s/2+2*s, (-180, s/2), w - 0.5*s, - (180, s/2)) - l += s *2 * 2**0.5 - else: - self.polyline(w-s/2+2*s, (-180, s/2), w - 0.5*s, - (135, s/2), self.extra_distance, (45, s/2)) - l += s *2 * 2**0.5 + self.extra_distance - self.polyline(0, -45) - self.edge(length-l) - -class WallWrenchHolder(_WallMountedBox): - """Hold a set of wrenches at a wall""" - - - def __init__(self) -> None: - super().__init__() - - # remove cli params you do not need - self.buildArgParser(x=100) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--depth", action="store", type=float, default=30.0, - help="depth of the sides (in mm)") - self.argparser.add_argument( - "--number", action="store", type=int, default=11, - help="number of wrenches (in mm)") - self.argparser.add_argument( - "--min_width", action="store", type=float, default=8.0, - help="width of smallest wrench (in mm)") - self.argparser.add_argument( - "--max_width", action="store", type=float, default=25.0, - help="width of largest wrench (in mm)") - self.argparser.add_argument( - "--min_strength", action="store", type=float, default=3.0, - help="strength of smallest wrench (in mm)") - self.argparser.add_argument( - "--max_strength", action="store", type=float, default=5.0, - help="strength of largest wrench (in mm)") - self.argparser.add_argument( - "--extra_distance", action="store", type=float, default=0.0, - help="additional distance between wrenches (in mm)") - - - def render(self): - self.generateWallEdges() - - h = ((self.min_strength + self.max_strength) * self.number * 2**0.5 - + self.extra_distance * (self.number - 1) - + self.max_width) - t = self.thickness - x = self.x-2*t - - self.rectangularWall(self.depth, h, - ["e", "B", "e", SlottedEdge(self, None)], - move="right") - self.rectangularWall(self.depth, h, - ["e", "B", "e", SlottedEdge(self, None)], - move="right") - self.rectangularWall(x, h, "eDed", - # callback=[lambda:self.fingerHolesAt(x/2, 0, h, 90)], - move="right") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wavyknob.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wavyknob.py deleted file mode 100644 index e20883d..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/wavyknob.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class WavyKnob(Boxes): - """Round knob serrated outside for better gripping""" - - ui_group = "Part" - - def __init__(self) -> None: - Boxes.__init__(self) - - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--diameter", action="store", type=float, default=50., - help="Diameter of the knob (mm)") - self.argparser.add_argument( - "--serrations", action="store", type=int, default=20, - help="Number of serrations") - self.argparser.add_argument( - "--serrationangle", action="store", type=float, default=45., - help="higher values for deeper serrations (degrees)") - self.argparser.add_argument( - "--bolthole", action="store", type=float, default=6., - help="Diameter of the bolt hole (mm)") - self.argparser.add_argument( - "--dhole", action="store", type=float, default=1., - help="D-Flat in fraction of the diameter") - self.argparser.add_argument( - "--hexhead", action="store", type=float, default=10., - help="Width of the hex bolt head (mm)") - - def render(self): - t = self.thickness - angle = self.serrationangle - self.parts.wavyKnob(self.diameter, self.serrations, angle, - callback=lambda:self.dHole(0, 0, d=self.bolthole, - rel_w=self.dhole), - move="right") - self.parts.wavyKnob(self.diameter, self.serrations, angle, - callback=lambda: self.nutHole(self.hexhead), - move="right") - self.parts.wavyKnob(self.diameter, self.serrations, angle) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/winerack.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/winerack.py deleted file mode 100644 index de89971..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/generators/winerack.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright (C) 2013-2016 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from boxes import * - - -class WineRack(Boxes): - """Honey Comb Style Wine Rack""" - - ui_group = "Shelf" - - def __init__(self) -> None: - Boxes.__init__(self) - - # Uncomment the settings for the edge types you use - self.addSettingsArgs(edges.FingerJointSettings) - - # remove cli params you do not need - self.buildArgParser(x=400, y=300, h=210) - # Add non default cli params if needed (see argparse std lib) - self.argparser.add_argument( - "--radius", action="store", type=float, default=46., - help="Radius of comb") - self.argparser.add_argument( - "--walls", action="store", type=str, default="all", - choices=("minimal", "no_verticals", "all"), - help="which of the honey comb walls to add") - - def hexFingerHoles(self, x, y, l, angle=90): - with self.saved_context(): - self.moveTo(x, y, angle) - self.moveTo(self.delta, 0, 0) - self.fingerHolesAt(0, 0, l-2*self.delta, 0) - - def wallCB(self, frontwall=False, backwall=False): - r = self.r - x, y, h = self.x, self.y, self.h - dx, dy = self.dx, self.dy - cx, cy = self.cx, self.cy - t = self.thickness - - if cy % 2: - ty = cy // 2 * (2*dy + 2*r) + 2*dy + r - else: - ty = cy // 2 * (2*dy + 2*r) + dy - - self.moveTo((x-dx*2*cx)/2, (y-ty) / 2) - - wmin = self.walls == "minimal" - - for i in range(cy//2 + cy % 2): - if not frontwall and self.walls == "all": - self.hexFingerHoles(0, (2*r+2*dy)*i+dy, r, 90) - for j in range(cx): - if not backwall: - self.hole(j*2*dx+dx, (2*r+2*dy)*i + r, dx-t) - if frontwall: - continue - self.hexFingerHoles(j*2*dx+dx, (2*r+2*dy)*i, r, 150) - self.hexFingerHoles(j*2*dx+dx, (2*r+2*dy)*i, r, 30) - if self.walls == "all": - self.hexFingerHoles(j*2*dx+2*dx, (2*r+2*dy)*i+dy, r, 90) - if wmin and i == cy//2: # top row - continue - if j>0 or not wmin: - self.hexFingerHoles(j*2*dx+dx, (2*r+2*dy)*i+r+2*dy, r, -150) - if j 0: - self.hexFingerHoles(j*2*dx+dx, (2*r+2*dy)*i, r, 150) - if j < cx -1: - self.hexFingerHoles(j*2*dx+dx, (2*r+2*dy)*i, r, 30) - - - def render(self): - x, y, h, radius = self.x, self.y, self.h, self.radius - - t = self.thickness - r = self.r = 2 * (radius + t) * math.tan(math.pi/6) - - self.dx = dx = r * math.cos(math.pi/6) - self.dy = dy = r * math.sin(math.pi/6) - self.cx = cx = int((x-2*t) // (2*dx)) - self.cy = cy = int((y-dy-t) // (r+dy)) - self.delta = 3**0.5/6.*t - - self.rectangularWall(x, y, callback=[self.wallCB], move="up") - self.rectangularWall(x, y, callback=[lambda:self.wallCB(backwall=True)], move="up") - self.rectangularWall(x, y, callback=[lambda:self.wallCB(frontwall=True)], move="up") - if self.walls == "all": - tc = (cy//2 + cy % 2) * (6 * cx + 1) - else: - tc = (cy//2 + cy % 2) * (4 * cx) - - if self.walls == "minimal": - tc -= 2 * (cy//2) # roofs of outer cells - - if cy % 2: - if self.walls == "all": - tc -= cx - else: - if self.walls != "minimal": - tc += 2 * cx - 2 # very top row - - self.partsMatrix(tc, cx, "up", self.rectangularWall, r-2*self.delta, h, "fefe") diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/lids.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/lids.py deleted file mode 100644 index 6a8b878..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/lids.py +++ /dev/null @@ -1,337 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -from __future__ import annotations - -import math -from typing import Any, Callable - -import boxes -from boxes import Boxes, edges - - -class LidSettings(edges.Settings): - """Settings for the Lid -Values: -* absolute - - * style : "none" : type of lid to create - * handle : "none" : type of handle - -* relative (in multiples of thickness) - - * height : 4.0 : height of the brim (if any) - * play : 0.1 : play when sliding the lid on (if applicable) - * handle_height : 8.0 : height of the handle (if applicable) - """ - absolute_params = { - "style": ("none", "flat", "chest", "overthetop", "ontop"), - "handle": ("none", "long_rounded", "long_trapezoid", "long_doublerounded", "knob"), - } - - relative_params = { - "height": 4.0, - "play": 0.1, - "handle_height": 8.0, - } - - -class Lid: - def __init__(self, boxes, settings: LidSettings) -> None: - self.boxes = boxes - self.settings = settings - - def __getattr__(self, name: str) -> Any: - """Hack for using unaltered code form Boxes class""" - if hasattr(self.settings, name): - return getattr(self.settings, name) - return getattr(self.boxes, name) - - def __call__(self, x: float, y: float, edge=None) -> bool: - t = self.thickness - style = self.settings.style - height = self.height - if style == "flat": - self.rectangularWall(x, y, "eeee", - callback=[self.handleCB(x, y)], - move="up", label="lid bottom") - self.rectangularWall(x, y, "EEEE", - callback=[self.handleCB(x, y)], - move="up", label="lid top") - elif style == "chest": - self.chestSide(x, move="right", label="lid right") - self.chestSide(x, move="up", label="lid left") - self.chestSide(x, move="left only", label="invisible") - self.chestTop(x, y, - callback=[None, self.handleCB(x, 3*t)], - move="up", label="lid top") - elif style in ("overthetop", "ontop"): - x2 = x - y2 = y - b = { - "Š": "š", - "S": "š", - }.get(edge, "e") - if style == "overthetop": - x2 += 2*t + self.play - y2 += 2*t + self.play - self.rectangularWall(x2, y2, "ffff", - callback=[self.handleCB(x2, y2)], - move="up") - self.rectangularWall(x2, self.height, b +"FFF", - ignore_widths=[1, 2, 5, 6], move="up") - self.rectangularWall(x2, self.height, b + "FFF", - ignore_widths=[1, 2, 5, 6], move="up") - self.rectangularWall(y2, self.height, b + "fFf", - ignore_widths=[1, 2, 5, 6], move="up") - self.rectangularWall(y2, self.height, b + "fFf", - ignore_widths=[1, 2, 5, 6], move="up") - if style == "ontop": - self.rectangularWall(y - self.play, height + 2*t, "eeee", - move="up") - self.rectangularWall(y - self.play, height + 2*t, "eeee", - move="up") - else: - return False - - self.handleParts(x, y) - return True - - ###################################################################### - ### Handles - ###################################################################### - - def handleCB(self, x: float, y: float) -> Callable: - t = self.thickness - - def cb() -> None: - if self.handle.startswith("long"): - self.rectangularHole(x/2, y/2, x/2, t) - elif self.handle.startswith("knob"): - h = v = 3 * t # adjust for different styles - self.moveTo((x - t) / 2 + self.burn, (y - t) / 2 + self.burn, 180) - self.ctx.stroke() - with self.saved_context(): - self.set_source_color(boxes.Color.INNER_CUT) - for l in (h, v, h, v): - self.polyline(l, -90, t, -90, l, 90) - self.ctx.stroke() - - return cb - - def longHandle(self, x:float, y: float, style="long_rounded", move=None) -> None: - t = self.settings.thickness - hh = self.handle_height - tw, th = x/2 + 2*t, self.handle_height + 2*t - - if self.move(tw, th, move, True): - return - - self.moveTo(0.5*t) - - poly = [(90, t/2), t/2, 90, t, -90] - - if style == "long_rounded": - r = min(hh/2, x/4) - poly += [t + hh - r, (90, r)] - l = x/2 - 2*r - elif style == "long_trapezoid": - poly += [t, (45, t), (hh - t) * 2**.5, (45, t)] - l = x/2 - 2 * hh - elif style == "long_doublerounded": - poly += [t, 90, 0, (-90, hh /2), 0, (90, hh/2)] - l = x/2 - 2*hh - - poly = [x/2+t] + poly + [l] + list(reversed(poly)) - self.polyline(*poly) - - self.move(tw, th, move) - - def knobHandle(self, x: float, y: float, style, move=None) -> None: - t = self.settings.thickness - hh = self.handle_height - tw, th = 2 * 7 * t + self.spacing, self.handle_height + 2*t - - if self.move(tw, th, move, True): - return - - poly = [(90, t/2), t/2, 90, t/2, -90] - - poly += [hh - 2*t, (90, 3*t)] - - for bottom, top in (([3*t, 90, 2*t + hh/2, -90, t, -90, hh/2 + 2*t, 90, 3*t], [t]), - ([7*t], [0, 90, hh/2, -90, t, -90, hh/2, 90, 0])) : - self.moveTo(0.5*t) - p = bottom + poly + top + list(reversed(poly)) - self.polyline(*p) - self.moveTo(tw/2 + self.spacing) - - self.move(tw, th, move) - - def handleParts(self, x: float, y: float) -> None: - if self.handle.startswith("long"): - self.longHandle(x, y, self.handle, move="up") - elif self.handle.startswith("knob"): - self.knobHandle(x, y, self.handle, move="up") - - ###################################################################### - ### Chest Lid - ###################################################################### - - def getChestR(self, x: float, angle: float = 0) -> float: - t = self.thickness - d = x - 2*math.sin(math.radians(angle)) * (3*t) - - r = d / 2.0 / math.cos(math.radians(angle)) - return r - - def chestSide(self, x: float, angle: float = 0, move="", label: str = "") -> None: - if "a" not in self.edges: - s = edges.FingerJointSettings(self.thickness, True, - finger=1.0, space=1.0) - s.edgeObjects(self, "aA.") - - t = self.thickness - r = self.getChestR(x, angle) - if self.move(x+2*t, 0.5*x+3*t, move, True, label=label): - return - - self.moveTo(t, 0) - self.edge(x) - self.corner(90+angle) - self.edges["a"](3*t) - self.corner(180-2*angle, r) - self.edges["a"](3*t) - self.corner(90+angle) - - self.move(x+2*t, 0.5*x+3*t, move, False, label=label) - - def chestTop(self, x: float, y: float, angle: float = 0, callback=None, move=None, label: str = "") -> None: - if "a" not in self.edges: - s = edges.FingerJointSettings(self.thickness, True, finger=1.0, space=1.0) - s.edgeObjects(self, "aA.") - - t = self.thickness - l = math.radians(180-2*angle) * self.getChestR(x, angle) - - tw = l + 6*t - th = y+2*t - - if self.move(tw, th, move, True, label=label): - return - - self.cc(callback, 0, self.edges["A"].startwidth()+self.burn) - self.edges["A"](3*t) - self.edges["X"](l, y+2*t) - self.edges["A"](3*t) - self.corner(90) - self.cc(callback, 1) - self.edge(y+2*t) - self.corner(90) - self.cc(callback, 2, self.edges["A"].startwidth()+self.burn) - self.edges["A"](3*t) - self.edge(l) - self.edges["A"](3*t) - self.corner(90) - self.cc(callback, 3) - self.edge(y+2*t) - self.corner(90) - - self.move(tw, th, move, label=label) - - -class _TopEdge(Boxes): - def addTopEdgeSettings(self, fingerjoint={}, stackable={}, hinge={}, - cabinethinge={}, slideonlid={}, click={}, - roundedtriangle={}, mounting={}, handle={}): - self.addSettingsArgs(edges.FingerJointSettings, **fingerjoint) - self.addSettingsArgs(edges.StackableSettings, **stackable) - self.addSettingsArgs(edges.HingeSettings, **hinge) - self.addSettingsArgs(edges.CabinetHingeSettings, **cabinethinge) - self.addSettingsArgs(edges.SlideOnLidSettings, **slideonlid) - self.addSettingsArgs(edges.ClickSettings, **click) - self.addSettingsArgs(edges.RoundedTriangleEdgeSettings, **roundedtriangle) - self.addSettingsArgs(edges.MountingSettings, **mounting) - self.addSettingsArgs(edges.HandleEdgeSettings, **handle) - - def topEdges(self, top_edge): - """Return top edges belonging to given main edge type - as a list containing edge for left, back, right, front. - """ - tl = tb = tr = tf = self.edges.get(top_edge, self.edges["e"]) - - if tl.char == "i": - tb = tf = "e" - tl = "j" - elif tl.char == "k": - tl = tr = "e" - elif tl.char == "L": - tl = "M" - tf = "e" - tr = "N" - elif tl.char == "v": - tl = tr = tf = "e" - elif tl.char == "t": - tf = tb = "e" - elif tl.char == "G": - tl = tb = tr = tf = "e" - if self.edges["G"].settings.side == edges.MountingSettings.PARAM_LEFT: - tl = "G" - elif self.edges["G"].settings.side == edges.MountingSettings.PARAM_RIGHT: - tr = "G" - elif self.edges["G"].settings.side == edges.MountingSettings.PARAM_FRONT: - tf = "G" - else: #PARAM_BACK - tb = "G" - elif tl.char == "y": - tl = tb = tr = tf = "e" - if self.edges["y"].settings.on_sides == True: - tl = tr = "y" - else: - tb = tf = "y" - elif tl.char == "Y": - tl = tb = tr = tf = "h" - if self.edges["Y"].settings.on_sides == True: - tl = tr = "Y" - else: - tb = tf = "Y" - return [tl, tb, tr, tf] - - def drawLid(self, x: float, y: float, top_edge, bedBolts=[None, None]) -> bool: - d2, d3 = bedBolts - if top_edge == "c": - self.rectangularWall(x, y, "CCCC", bedBolts=[d2, d3, d2, d3], move="up", label="top") - elif top_edge == "f": - self.rectangularWall(x, y, "FFFF", move="up", label="top") - elif top_edge in "FhŠY": - self.rectangularWall(x, y, "ffff", move="up", label="top") - elif top_edge == "L": - self.rectangularWall(x, y, "Enlm", move="up", label="lid top") - elif top_edge == "i": - self.rectangularWall(x, y, "EJeI", move="up", label="lid top") - elif top_edge == "k": - outset = self.edges["k"].settings.outset - self.edges["k"].settings.setValues(self.thickness, outset=True) - lx = x/2.0-0.1*self.thickness - self.edges['k'].settings.setValues(self.thickness, grip_length=5) - self.rectangularWall(lx, y, "IeJe", move="right", label="lid top left") - self.rectangularWall(lx, y, "IeJe", move="mirror up", label="lid top right") - self.rectangularWall(lx, y, "IeJe", move="left only", label="invisible") - self.edges["k"].settings.setValues(self.thickness, outset=outset) - elif top_edge == "v": - self.rectangularWall(x, y, "VEEE", move="up", label="lid top") - self.edges["v"].parts(move="up") - else: - return False - return True diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/parts.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/parts.py deleted file mode 100644 index fa3a035..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/parts.py +++ /dev/null @@ -1,169 +0,0 @@ -from __future__ import annotations - -from math import * -from typing import Any, Callable - -from boxes import vectors - - -def arcOnCircle(spanning_angle: float, outgoing_angle: float, r: float = 1.0) -> tuple[float, float]: - angle = spanning_angle + 2 * outgoing_angle - radius = r * sin(radians(0.5 * spanning_angle)) / sin(radians(180 - outgoing_angle - 0.5 * spanning_angle)) - return angle, abs(radius) - - -class Parts: - def __init__(self, boxes) -> None: - self.boxes = boxes - - """ - def roundKnob(self, diameter: float, n: int = 20, callback: Callable | None = None, move: str = ""): - size = diameter+diameter/n - if self.move(size, size, move, before=True): - return - self.moveTo(size/2, size/2) - self.cc(callback, None, 0, 0) - - self.move(size, size, move) - """ - - def __getattr__(self, name: str) -> Any: - return getattr(self.boxes, name) - - def disc(self, diameter: float, hole: float = 0, dwidth: float = 1.0, callback: Callable | None = None, move: str = "", label: str = "") -> None: - """Simple disc - - :param diameter: diameter of the disc - :param hole: (Default value = 0) - :param callback: (Default value = None) called in the center - :param dwidth: (Default value = 1) flatten on right side to given ratio - :param move: (Default value = "") - :param label: (Default value = "") - """ - size = diameter - r = diameter / 2.0 - - if self.move(size*dwidth, size, move, before=True, label=label): - return - - self.moveTo(size / 2, size / 2) - - if hole: - self.hole(0, 0, hole / 2) - - self.cc(callback, None, 0, 0) - if dwidth == 1.0: - self.moveTo(r + self.burn, 0, 90) - self.corner(360, r, tabs=6) - else: - w = (2.0 * dwidth - 1) * r - a = degrees(acos(w / r)) - self.moveTo(0, 0, -a) - self.moveTo(r, 0, -90) - self.corner(-360+2*a, r) - self.corner(-a) - self.edge(2*r*sin(radians(a))) - self.move(size*dwidth, size, move, label=label) - - def wavyKnob(self, diameter: float, n: int = 20, angle: float = 45, hole: float = 0, callback: Callable | None = None, move: str = "") -> None: - """Disc with a wavy edge to be easier to be gripped - - :param diameter: diameter of the knob - :param n: (Default value = 20) number of waves - :param angle: (Default value = 45) maximum angle of the wave - :param hole: (Default value = 0) - :param callback: (Default value = None) called in the center - :param move: (Default value = "") - """ - - if n < 2: - return - - size = diameter + pi * diameter / n - - if self.move(size, size, move, before=True): - return - - self.moveTo(size / 2, size / 2) - self.cc(callback, None, 0, 0) - - if hole: - self.hole(0, 0, hole / 2) - - self.moveTo(diameter / 2, 0, 90-angle) - a, r = arcOnCircle(360. / n / 2, angle, diameter / 2) - a2, r2 = arcOnCircle(360. / n / 2, -angle, diameter / 2) - - for i in range(n): - self.boxes.corner(a, r, tabs=(i % max(1, (n+1) // 6) == 0)) - self.boxes.corner(a2, r2) - - self.move(size, size, move) - - def concaveKnob(self, diameter: float, n: int = 3, rounded: float = 0.2, angle: float = 70, hole: float = 0, - callback: Callable | None = None, move: str = "") -> None: - """Knob with dents to be easier to be gripped - - :param diameter: diameter of the knob - :param n: (Default value = 3) number of dents - :param rounded: (Default value = 0.2) proportion of circumference remaining - :param angle: (Default value = 70) angle the dents meet the circumference - :param hole: (Default value = 0) - :param callback: (Default value = None) called in the center - :param move: (Default value = "") - """ - size = diameter - - if n < 2: - return - - if self.move(size, size, move, before=True): - return - - self.moveTo(size / 2, size / 2) - - if hole: - self.hole(0, 0, hole / 2) - - self.cc(callback, None, 0, 0) - self.moveTo(diameter / 2, 0, 90 + angle) - a, r = arcOnCircle(360. / n * (1 - rounded), -angle, diameter / 2) - - if abs(a) < 0.01: # avoid trying to make a straight line as an arc - a, r = arcOnCircle(360. / n * (1 - rounded), -angle - 0.01, diameter / 2) - - for i in range(n): - self.boxes.corner(a, r) - self.corner(angle) - self.corner(360. / n * rounded, diameter / 2, tabs=(i % max(1, (n+1) // 6) == 0)) - self.corner(angle) - - self.move(size, size, move) - - def ringSegment(self, r_outside: float, r_inside: float, angle: float, n: int = 1, move: str = "") -> None: - """Ring Segment - - :param r_outside: outer radius - :param r_inside: inner radius - :param angle: angle the segment is spanning - :param n: (Default value = 1) number of segments - :param move: (Default value = "") - """ - space = 360 * self.spacing / r_inside / 2 / pi - nc = int(min(n, 360 / (angle+space))) - - while n > 0: - if self.move(2*r_outside, 2*r_outside, move, True): - return - self.moveTo(0, r_outside, -90) - for i in range(nc): - self.polyline( - 0, (angle, r_outside), 0, 90, (r_outside-r_inside, 2), - 90, 0, (-angle, r_inside), 0, 90, (r_outside-r_inside, 2), - 90) - x, y = vectors.circlepoint(r_outside, radians(angle+space)) - self.moveTo(y, r_outside-x, angle+space) - n -=1 - if n == 0: - break - self.move(2*r_outside, 2*r_outside, move) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/pulley.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/pulley.py deleted file mode 100644 index c13f7d9..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/pulley.py +++ /dev/null @@ -1,141 +0,0 @@ -""" -// Parametric Pulley with multiple belt profiles -// by droftarts January 2012 - -// Based on pulleys by: -// https://www.thingiverse.com/thing:11256 by me! -// https://github.com/prusajr/PrusaMendel by Josef Prusa -// https://www.thingiverse.com/thing:3104 by GilesBathgate -// https://www.thingiverse.com/thing:2079 by nophead - -// dxf tooth data from http://oem.cadregister.com/asp/PPOW_Entry.asp?company=915217&elementID=07807803/METRIC/URETH/WV0025/F -// pulley diameter checked and modelled from data at https://www.sdp-si.com/D265/HTML/D265T016.html -""" -from math import * - -from boxes.vectors import * - - -def tooth_spaceing_curvefit(teeth, b, c, d): - return ((c * teeth ** d) / (b + teeth ** d)) * teeth - - -def tooth_spacing(teeth, tooth_pitch, pitch_line_offset): - return (2 * ((teeth * tooth_pitch) / (3.14159265 * 2) - pitch_line_offset)) - - -def mirrorx(points): - return [[-x, y] for x, y in points] - -class Pulley: - - spacing = { - "MXL": (False, 2.032, 0.254), - "40DP": (False, 2.07264, 0.1778), - "XL": (False, 5.08, 0.254), - "H": (False, 9.525, 0.381), - "T2_5": (True, 0.7467, 0.796, 1.026), - "T5": (True, 0.6523, 1.591, 1.064), - "T10": (False, 10, 0.93), - "AT5": (True, 0.6523, 1.591, 1.064), - "HTD_3mm": (False, 3, 0.381), - "HTD_5mm": (False, 5, 0.5715), - "HTD_8mm": (False, 8, 0.6858), - "GT2_2mm": (False, 2, 0.254), - "GT2_3mm": (False, 3, 0.381), - "GT2_5mm": (False, 5, 0.5715), - } - - profile_data = { - "MXL": (0.508, 1.321), - "40DP": (0.457, 1.226), - "XL": (1.27, 3.051), - "H": (1.905, 5.359), - "T2_5": (0.7, 1.678), - "T5": (1.19, 3.264), - "T10": (2.5, 6.13), - "AT5": (1.19, 4.268), - "HTD_3mm": (1.289, 2.27), - "HTD_5mm": (2.199, 3.781), - "HTD_8mm": (3.607, 6.603), - "GT2_2mm": (0.764, 1.494), - "GT2_3mm": (1.169, 2.31), - "GT2_5mm": (1.969, 3.952), - } - - teeth = { "MXL" : [[-0.660421,-0.5],[-0.660421,0],[-0.621898,0.006033],[-0.587714,0.023037],[-0.560056,0.049424],[-0.541182,0.083609],[-0.417357,0.424392],[-0.398413,0.458752],[-0.370649,0.48514],[-0.336324,0.502074],[-0.297744,0.508035],[0.297744,0.508035],[0.336268,0.502074],[0.370452,0.48514],[0.39811,0.458752],[0.416983,0.424392],[0.540808,0.083609],[0.559752,0.049424],[0.587516,0.023037],[0.621841,0.006033],[0.660421,0],[0.660421,-0.5]], - "40DP" : [[-0.612775,-0.5],[-0.612775,0],[-0.574719,0.010187],[-0.546453,0.0381],[-0.355953,0.3683],[-0.327604,0.405408],[-0.291086,0.433388],[-0.248548,0.451049],[-0.202142,0.4572],[0.202494,0.4572],[0.248653,0.451049],[0.291042,0.433388],[0.327609,0.405408],[0.356306,0.3683],[0.546806,0.0381],[0.574499,0.010187],[0.612775,0],[0.612775,-0.5]], - "XL" : [[-1.525411,-1],[-1.525411,0],[-1.41777,0.015495],[-1.320712,0.059664],[-1.239661,0.129034],[-1.180042,0.220133],[-0.793044,1.050219],[-0.733574,1.141021],[-0.652507,1.210425],[-0.555366,1.254759],[-0.447675,1.270353],[0.447675,1.270353],[0.555366,1.254759],[0.652507,1.210425],[0.733574,1.141021],[0.793044,1.050219],[1.180042,0.220133],[1.239711,0.129034],[1.320844,0.059664],[1.417919,0.015495],[1.525411,0],[1.525411,-1]], - "H" : [[-2.6797,-1],[-2.6797,0],[-2.600907,0.006138],[-2.525342,0.024024],[-2.45412,0.052881],[-2.388351,0.091909],[-2.329145,0.140328],[-2.277614,0.197358],[-2.234875,0.262205],[-2.202032,0.334091],[-1.75224,1.57093],[-1.719538,1.642815],[-1.676883,1.707663],[-1.62542,1.764693],[-1.566256,1.813112],[-1.500512,1.85214],[-1.4293,1.880997],[-1.353742,1.898883],[-1.274949,1.905021],[1.275281,1.905021],[1.354056,1.898883],[1.429576,1.880997],[1.500731,1.85214],[1.566411,1.813112],[1.625508,1.764693],[1.676919,1.707663],[1.719531,1.642815],[1.752233,1.57093],[2.20273,0.334091],[2.235433,0.262205],[2.278045,0.197358],[2.329455,0.140328],[2.388553,0.091909],[2.454233,0.052881],[2.525384,0.024024],[2.600904,0.006138],[2.6797,0],[2.6797,-1]], - "T2_5" : [[-0.839258,-0.5],[-0.839258,0],[-0.770246,0.021652],[-0.726369,0.079022],[-0.529167,0.620889],[-0.485025,0.67826],[-0.416278,0.699911],[0.416278,0.699911],[0.484849,0.67826],[0.528814,0.620889],[0.726369,0.079022],[0.770114,0.021652],[0.839258,0],[0.839258,-0.5]], - "T5" : [[-1.632126,-0.5],[-1.632126,0],[-1.568549,0.004939],[-1.507539,0.019367],[-1.450023,0.042686],[-1.396912,0.074224],[-1.349125,0.113379],[-1.307581,0.159508],[-1.273186,0.211991],[-1.246868,0.270192],[-1.009802,0.920362],[-0.983414,0.978433],[-0.949018,1.030788],[-0.907524,1.076798],[-0.859829,1.115847],[-0.80682,1.147314],[-0.749402,1.170562],[-0.688471,1.184956],[-0.624921,1.189895],[0.624971,1.189895],[0.688622,1.184956],[0.749607,1.170562],[0.807043,1.147314],[0.860055,1.115847],[0.907754,1.076798],[0.949269,1.030788],[0.9837,0.978433],[1.010193,0.920362],[1.246907,0.270192],[1.273295,0.211991],[1.307726,0.159508],[1.349276,0.113379],[1.397039,0.074224],[1.450111,0.042686],[1.507589,0.019367],[1.568563,0.004939],[1.632126,0],[1.632126,-0.5]], - "T10" : [[-3.06511,-1],[-3.06511,0],[-2.971998,0.007239],[-2.882718,0.028344],[-2.79859,0.062396],[-2.720931,0.108479],[-2.651061,0.165675],[-2.590298,0.233065],[-2.539962,0.309732],[-2.501371,0.394759],[-1.879071,2.105025],[-1.840363,2.190052],[-1.789939,2.266719],[-1.729114,2.334109],[-1.659202,2.391304],[-1.581518,2.437387],[-1.497376,2.47144],[-1.408092,2.492545],[-1.314979,2.499784],[1.314979,2.499784],[1.408091,2.492545],[1.497371,2.47144],[1.581499,2.437387],[1.659158,2.391304],[1.729028,2.334109],[1.789791,2.266719],[1.840127,2.190052],[1.878718,2.105025],[2.501018,0.394759],[2.539726,0.309732],[2.59015,0.233065],[2.650975,0.165675],[2.720887,0.108479],[2.798571,0.062396],[2.882713,0.028344],[2.971997,0.007239],[3.06511,0],[3.06511,-1]], - "AT5" : [[-2.134129,-0.75],[-2.134129,0],[-2.058023,0.005488],[-1.984595,0.021547],[-1.914806,0.047569],[-1.849614,0.082947],[-1.789978,0.127073],[-1.736857,0.179338],[-1.691211,0.239136],[-1.653999,0.305859],[-1.349199,0.959203],[-1.286933,1.054635],[-1.201914,1.127346],[-1.099961,1.173664],[-0.986896,1.18992],[0.986543,1.18992],[1.099614,1.173664],[1.201605,1.127346],[1.286729,1.054635],[1.349199,0.959203],[1.653646,0.305859],[1.690859,0.239136],[1.73651,0.179338],[1.789644,0.127073],[1.849305,0.082947],[1.914539,0.047569],[1.984392,0.021547],[2.057906,0.005488],[2.134129,0],[2.134129,-0.75]], - "HTD_3mm" : [[-1.135062,-0.5],[-1.135062,0],[-1.048323,0.015484],[-0.974284,0.058517],[-0.919162,0.123974],[-0.889176,0.206728],[-0.81721,0.579614],[-0.800806,0.653232],[-0.778384,0.72416],[-0.750244,0.792137],[-0.716685,0.856903],[-0.678005,0.918199],[-0.634505,0.975764],[-0.586483,1.029338],[-0.534238,1.078662],[-0.47807,1.123476],[-0.418278,1.16352],[-0.355162,1.198533],[-0.289019,1.228257],[-0.22015,1.25243],[-0.148854,1.270793],[-0.07543,1.283087],[-0.000176,1.28905],[0.075081,1.283145],[0.148515,1.270895],[0.219827,1.252561],[0.288716,1.228406],[0.354879,1.19869],[0.418018,1.163675],[0.477831,1.123623],[0.534017,1.078795],[0.586276,1.029452],[0.634307,0.975857],[0.677809,0.91827],[0.716481,0.856953],[0.750022,0.792167],[0.778133,0.724174],[0.800511,0.653236],[0.816857,0.579614],[0.888471,0.206728],[0.919014,0.123974],[0.974328,0.058517],[1.048362,0.015484],[1.135062,0],[1.135062,-0.5]], - "HTD_5mm" : [[-1.89036,-0.75],[-1.89036,0],[-1.741168,0.02669],[-1.61387,0.100806],[-1.518984,0.21342],[-1.467026,0.3556],[-1.427162,0.960967],[-1.398568,1.089602],[-1.359437,1.213531],[-1.310296,1.332296],[-1.251672,1.445441],[-1.184092,1.552509],[-1.108081,1.653042],[-1.024167,1.746585],[-0.932877,1.832681],[-0.834736,1.910872],[-0.730271,1.980701],[-0.62001,2.041713],[-0.504478,2.09345],[-0.384202,2.135455],[-0.259708,2.167271],[-0.131524,2.188443],[-0.000176,2.198511],[0.131296,2.188504],[0.259588,2.167387],[0.384174,2.135616],[0.504527,2.093648],[0.620123,2.04194],[0.730433,1.980949],[0.834934,1.911132],[0.933097,1.832945],[1.024398,1.746846],[1.108311,1.653291],[1.184308,1.552736],[1.251865,1.445639],[1.310455,1.332457],[1.359552,1.213647],[1.39863,1.089664],[1.427162,0.960967],[1.467026,0.3556],[1.518984,0.21342],[1.61387,0.100806],[1.741168,0.02669],[1.89036,0],[1.89036,-0.75]], - "HTD_8mm" : [[-3.301471,-1],[-3.301471,0],[-3.16611,0.012093],[-3.038062,0.047068],[-2.919646,0.10297],[-2.813182,0.177844],[-2.720989,0.269734],[-2.645387,0.376684],[-2.588694,0.496739],[-2.553229,0.627944],[-2.460801,1.470025],[-2.411413,1.691917],[-2.343887,1.905691],[-2.259126,2.110563],[-2.158035,2.30575],[-2.041518,2.490467],[-1.910478,2.66393],[-1.76582,2.825356],[-1.608446,2.973961],[-1.439261,3.10896],[-1.259169,3.22957],[-1.069074,3.335006],[-0.869878,3.424485],[-0.662487,3.497224],[-0.447804,3.552437],[-0.226732,3.589341],[-0.000176,3.607153],[0.226511,3.589461],[0.447712,3.552654],[0.66252,3.497516],[0.870027,3.424833],[1.069329,3.33539],[1.259517,3.229973],[1.439687,3.109367],[1.608931,2.974358],[1.766344,2.825731],[1.911018,2.664271],[2.042047,2.490765],[2.158526,2.305998],[2.259547,2.110755],[2.344204,1.905821],[2.411591,1.691983],[2.460801,1.470025],[2.553229,0.627944],[2.588592,0.496739],[2.645238,0.376684],[2.720834,0.269734],[2.81305,0.177844],[2.919553,0.10297],[3.038012,0.047068],[3.166095,0.012093],[3.301471,0],[3.301471,-1]], - "GT2_2mm" : mirrorx([[0.747183,-0.5],[0.747183,0],[0.647876,0.037218],[0.598311,0.130528],[0.578556,0.238423],[0.547158,0.343077],[0.504649,0.443762],[0.451556,0.53975],[0.358229,0.636924],[0.2484,0.707276],[0.127259,0.750044],[0,0.76447],[-0.127259,0.750044],[-0.2484,0.707276],[-0.358229,0.636924],[-0.451556,0.53975],[-0.504797,0.443762],[-0.547291,0.343077],[-0.578605,0.238423],[-0.598311,0.130528],[-0.648009,0.037218],[-0.747183,0],[-0.747183,-0.5]]), - "GT2_3mm" : [[-1.155171,-0.5],[-1.155171,0],[-1.065317,0.016448],[-0.989057,0.062001],[-0.93297,0.130969],[-0.90364,0.217664],[-0.863705,0.408181],[-0.800056,0.591388],[-0.713587,0.765004],[-0.60519,0.926747],[-0.469751,1.032548],[-0.320719,1.108119],[-0.162625,1.153462],[0,1.168577],[0.162625,1.153462],[0.320719,1.108119],[0.469751,1.032548],[0.60519,0.926747],[0.713587,0.765004],[0.800056,0.591388],[0.863705,0.408181],[0.90364,0.217664],[0.932921,0.130969],[0.988924,0.062001],[1.065168,0.016448],[1.155171,0],[1.155171,-0.5]], - "GT2_5mm" : [[-1.975908,-0.75],[-1.975908,0],[-1.797959,0.03212],[-1.646634,0.121224],[-1.534534,0.256431],[-1.474258,0.426861],[-1.446911,0.570808],[-1.411774,0.712722],[-1.368964,0.852287],[-1.318597,0.989189],[-1.260788,1.123115],[-1.195654,1.25375],[-1.12331,1.380781],[-1.043869,1.503892],[-0.935264,1.612278],[-0.817959,1.706414],[-0.693181,1.786237],[-0.562151,1.851687],[-0.426095,1.9027],[-0.286235,1.939214],[-0.143795,1.961168],[0,1.9685],[0.143796,1.961168],[0.286235,1.939214],[0.426095,1.9027],[0.562151,1.851687],[0.693181,1.786237],[0.817959,1.706414],[0.935263,1.612278],[1.043869,1.503892],[1.123207,1.380781],[1.195509,1.25375],[1.26065,1.123115],[1.318507,0.989189],[1.368956,0.852287],[1.411872,0.712722],[1.447132,0.570808],[1.474611,0.426861],[1.534583,0.256431],[1.646678,0.121223],[1.798064,0.03212],[1.975908,0],[1.975908,-0.75]], - } - - def __init__(self, boxes) -> None: - self.boxes = boxes - - @classmethod - def getProfiles(cls): - return list(sorted(cls.teeth.keys())) - - def diameter(self, teeth, profile): - if self.spacing[profile][0]: - return tooth_spaceing_curvefit(teeth, *self.spacing[profile][1:]) - - return tooth_spacing(teeth, *self.spacing[profile][1:]) - - def __call__(self, teeth, profile, insideout=False, r_axle=None, - callback=None, move=""): - - # ******************************** - # ** Scaling tooth for good fit ** - # ******************************** - # To improve fit of belt to pulley, set the following constant. Decrease or increase by 0.1mm at a time. We are modelling the *BELT* tooth here, not the tooth on the pulley. Increasing the number will *decrease* the pulley tooth size. Increasing the tooth width will also scale proportionately the tooth depth, to maintain the shape of the tooth, and increase how far into the pulley the tooth is indented. Can be negative - - additional_tooth_width = 0.2 # mm - - # If you need more tooth depth than this provides, adjust the following constant. However, this will cause the shape of the tooth to change. - additional_tooth_depth = 0 # mm - - pulley_OD = self.diameter(teeth, profile) - - tooth_depth, tooth_width = self.profile_data[profile] - tooth_distance_from_centre = ((pulley_OD / 2) ** 2 - ((tooth_width + additional_tooth_width) / 2) ** 2) ** 0.5 - tooth_width_scale = (tooth_width + additional_tooth_width) / tooth_width - tooth_depth_scale = ((tooth_depth + additional_tooth_depth) / tooth_depth) - - if insideout: - pulley_OD += 2*tooth_depth * tooth_depth_scale - tooth_depth_scale *= -1 - - total_width = max(pulley_OD, 2*(r_axle or 0.0)) - - if self.boxes.move(total_width, total_width, move, before=True): - return - - self.boxes.moveTo(total_width / 2, total_width / 2) - self.boxes.cc(callback, None, 0.0, 0.0) - - if r_axle: - if insideout: - self.boxes.circle(0, 0, r_axle) - else: - self.boxes.hole(0, 0, r_axle) - - points = [] - for i in range(teeth): - m = [[tooth_width_scale, 0, 0], - [0, tooth_depth_scale, -tooth_distance_from_centre]] - m = mmul(m, rotm(i * 2 * pi / teeth)) - points.extend(vtransl(pt, m) for pt in self.teeth[profile][1:-1]) - - self.boxes.drawPoints(points, kerfdir=-1 if insideout else 1) - self.boxes.move(total_width, total_width, move) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/qrcode_factory.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/qrcode_factory.py deleted file mode 100644 index 8760f42..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/qrcode_factory.py +++ /dev/null @@ -1,63 +0,0 @@ -from decimal import Decimal - -import qrcode.image.base -import qrcode.image.svg - - -class BoxesQrCodeFactory(qrcode.image.base.BaseImage): - """ - SVG image builder - Creates a QR-code image as a SVG document fragment. - """ - _SVG_namespace = "http://www.w3.org/2000/svg" - kind = "SVG" - allowed_kinds = ("SVG",) - - def __init__(self, *args, ctx=None, x=0, y=0, **kwargs): - super().__init__(*args, **kwargs) - self.ctx = ctx - self.x, self.y = x, y - # Save the unit size, for example the default box_size of 10 is '1mm'. - self.unit_size = self.units(self.box_size) - - def drawrect(self, row, col): - self.ctx.rectangle(*self._rect(row, col)) - self._img.append(self._rect(row, col)) - - def units(self, pixels, text=True): - """ - A box_size of 10 (default) equals 1mm. - """ - units = Decimal(pixels) / 10 - if not text: - return units - return '%smm' % units - - def save(self, stream, kind=None): - self.check_kind(kind=kind) - self._write(stream) - - def to_string(self): - return f"".join(self._img) - - def new_image(self, **kwargs): - self._img = [] - return self._img - - def _rect(self, row, col): - size = self.box_size / 10 - x = self.x + (row + self.border) * size - y = self.y + (col + self.border) * size - return x, y, size, size - - def _write(self, stream): - stream.write("".join(self._img)) - -if __name__=="__main__": - import qrcode - import qrcode.image - q = qrcode.QRCode(image_factory=BoxesQrCodeFactory, box_size=10) - q.add_data('hello') - ctx = "a context" - img = q.make_image(ctx="a context") - print(img.to_string()) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/robot.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/robot.py deleted file mode 100644 index fcaa4b0..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/robot.py +++ /dev/null @@ -1,185 +0,0 @@ -__all__ = [ - "RobotArg", - "RobotArmMM", - "RobotArmMm", - "RobotArmUU", - "RobotArmUu", - "RobotArmMu", -] - -class RobotArg: - - def __init__(self, includenone=False) -> None: - self.robotarms = [ - (name, globals()[name].__doc__[23:]) for name in __all__ - if name.startswith("RobotArm")] - if includenone: - self.robotarms[0:0] = [("none", "")] - - def __call__(self, arg): - return str(arg) - - def choices(self): - return [name for name, descr in self.robotarms] - - def html(self, name, default, translate): - options = "\n".join( - ("""""" % - (name, ' selected="selected"' if name == default else "", - name, descr) for name, descr in self.robotarms)) - return f"""\n""" - - -class _RobotArm: - - def __init__(self, boxes, servo, servo2=None) -> None: - self.boxes = boxes - self.servo = servo - self.servo2 = servo2 or servo - - def __getattr__(self, name): - """Hack for easy access of Boxes methods""" - return getattr(self.boxes, name) - -class RobotArmMM(_RobotArm): - """Robot arm segment with two parallel servos""" - def __call__(self, length, move=None): - t = self.thickness - w = self.servo.height - l = max(self.servo.length * 2, length + 2*self.servo.axle_pos) - - th = max(2 * t + l, 2*w + 4*t + self.spacing) - tw = 5 * (w + 2*self.thickness + self.spacing) - - if self.move(tw, th, move, True): - return - - self.rectangularWall(w, l, "FfFf", callback=[ - lambda:self.servo.top(w/2), None, - lambda:self.servo.top(w/2)], move="right") - self.rectangularWall(w, l, "FfFf", callback=[ - lambda:self.servo.bottom(w/2), None, - lambda:self.servo.bottom(w/2)], move="right") - self.rectangularWall(w, l, "FFFF", move="right") - self.rectangularWall(w, l, "FFFF", move="right") - self.rectangularWall(w, w, "ffff", callback=[ - lambda:self.servo.front(w/2)], move="up") - self.rectangularWall(w, w, "ffff", callback=[ - lambda:self.servo.front(w/2)], move="") - - self.move(tw, th, move) - -class RobotArmMm(_RobotArm): - """Robot arm segment with two orthogonal servos""" - def __call__(self, length, move=None): - t = self.thickness - w = self.servo.height - w2 = self.servo2.height - l = max(self.servo.length * 2, length + 2*self.servo.axle_pos) - - th = max(2 * self.thickness + l, w + w2 + 4*t + self.spacing) - tw = 5 * (max(w, w2) + 2*self.thickness + self.spacing) - - if self.move(tw, th, move, True): - return - - self.rectangularWall(w2, l, "FfFf", callback=[ - lambda:self.servo.top(w2/2)], move="right") - self.rectangularWall(w2, l, "FfFf", callback=[ - lambda:self.servo.bottom(w2/2)], move="right") - self.rectangularWall(w, l, "FFFF", callback=[ - None, None, lambda:self.servo2.top(w/2)], move="right") - self.rectangularWall(w, l, "FFFF", callback=[ - None, None, lambda:self.servo2.bottom(w/2)], move="right") - self.rectangularWall(w2, w, "ffff", callback=[ - lambda:self.servo.front(w2/2)], move="up") - self.rectangularWall(w, w2, "ffff", callback=[ - lambda:self.servo2.front(w/2)], move="") - - self.move(tw, th, move) - -class RobotArmUU(_RobotArm): - """Robot arm segment with two parallel sets of hinge knuckles""" - def __call__(self, length, move=None): - t = self.thickness - w = self.servo.hinge_width() - l = max(4*self.thickness, length - 2*t - 2*self.servo.height) - - th = max(2 * self.servo._edges["m"].spacing() + l, - 2*w + 4*t + self.spacing) - tw = 5 * (w + 2*self.thickness + self.spacing) - - if self.move(tw, th, move, True): - return - - iw = (0, 3, 4, 7) - e = self.servo.edges - self.rectangularWall(w, l, e("mFmF"), ignore_widths=iw, move="right") - self.rectangularWall(w, l, e("MFMF"), ignore_widths=iw, move="right") - self.rectangularWall(w, l, "FfFf", move="right") - self.rectangularWall(w, l, "FfFf", move="right") - self.rectangularWall(w, w, "ffff", callback=[ - lambda: self.hole(w/2, w/2, 6)], move="up") - self.rectangularWall(w, w, "ffff", callback=[ - lambda: self.hole(w/2, w/2, 6)], move="") - - self.move(tw, th, move) - -class RobotArmUu(_RobotArm): - """Robot arm segment with two orthogonal sets of hinge knuckles""" - def __call__(self, length, move=None): - t = self.thickness - w = self.servo.hinge_width() - w2 = self.servo2.hinge_width() - l = max(4*self.thickness, length - 2*t - 2*self.servo.height) - - th = max(self.thickness + self.servo._edges["m"].spacing() + l, - 2*w + self.thickness + 4 * self.edges["f"].spacing()) - tw = 5 * (w + 2*self.thickness + self.spacing) - - if self.move(tw, th, move, True): - return - iw = (3, 4) - e = self.servo.edges - self.rectangularWall(w2, l, e("nfFf"), move="right") - self.rectangularWall(w2, l, e("NfFf"), move="right") - self.rectangularWall(w, l, e("FFmF"), ignore_widths=iw, move="right") - self.rectangularWall(w, l, e("FFMF"), ignore_widths=iw, move="right") - self.rectangularWall(w2, w, "ffff", callback=[ - lambda: self.hole(w2/2, w/2, 6)], move="up") - self.rectangularWall(w2, w, "ffff", callback=[ - lambda: self.hole(w2/2, w/2, 6)], move="") - - self.move(tw, th, move) - -class RobotArmMu(_RobotArm): - """Robot arm segment with a servo and an orthogonal sets of hinge knuckles""" - def __call__(self, length, move=None): - t = self.thickness - w = self.servo.height - w2 = self.servo2.hinge_width() - l = max(self.servo.length, length + self.servo.axle_pos - self.servo.height - t) - - th = max(t + l + self.servo2._edges["m"].spacing(), - w + w2 + self.thickness + 4 * self.edges["f"].spacing()) - tw = 5 * (w + 2*self.thickness + self.spacing) - - if self.move(tw, th, move, True): - return - - e = self.servo2.edges - iw = (3, 4) - self.rectangularWall(w2, l, "FfFf", callback=[ - lambda:self.servo.top(w2/2)], move="right") - self.rectangularWall(w2, l, "FfFf", callback=[ - lambda:self.servo.bottom(w2/2)], move="right") - self.rectangularWall(w, l, e("FFmF"), ignore_widths=iw, move="right") - self.rectangularWall(w, l, e("FFMF"), ignore_widths=iw, move="right") - self.rectangularWall(w2, w, "ffff", callback=[ - lambda:self.servo.front(w2/2)], move="up") - self.rectangularWall(w2, w, "ffff", callback=[ - lambda: self.hole(w2/2, w/2, 6)], move="") - - self.move(tw, th, move) - -# class RobotArmMU(_RobotArm): diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/servos.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/servos.py deleted file mode 100644 index 08d1c77..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/servos.py +++ /dev/null @@ -1,121 +0,0 @@ -from __future__ import annotations - -import math - -import boxes.vectors - - -class EyeEdge(boxes.edges.FingerHoleEdge): - char = "m" - - def __init__(self, boxes, servo, fingerHoles=None, driven: bool = False, outset: bool = False, **kw) -> None: - self.servo = servo - self.outset = outset - self.driven = driven - super().__init__(boxes, fingerHoles, **kw) - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - t = self.fingerHoles.settings.thickness - dist = self.fingerHoles.settings.edge_width - - pos_axle = self.servo.hinge_depth() - self.ctx.save() - self.hole(length / 2.0, - -pos_axle, - self.servo.axle / 2.0 if self.driven else self.servo.servo_axle / 2.0) - if self.outset: - self.fingerHoles(t, self.thickness / 2, length - 2 * t, 0) - else: - self.fingerHoles(0, self.thickness / 2, length, 0) - self.ctx.restore() - r = self.servo.servo_axle * 2 - a, l = boxes.vectors.tangent(length / 2, pos_axle, r) - angle = math.degrees(a) - self.polyline(0, -angle, l, (2 * angle, r), l, -angle, 0) - - def startwidth(self) -> float: - return self.fingerHoles.settings.thickness - - def margin(self) -> float: - return self.servo.hinge_depth() + self.fingerHoles.settings.thickness + self.servo.servo_axle * 2 - - -def buildEdges(boxes, servo, chars: str = "mMnN"): - result = {} - for n, char in enumerate(chars): - e = EyeEdge(boxes, servo, outset=(n < 2), driven=((n % 2) == 1)) - e.char = char - result[char] = e - return result - - -class ServoArg: - def __init__(self, includeNone: bool = False) -> None: - self.servos = ["Servo9g"] - if includeNone: - self.servos[0:0] = ["none"] - - def __call__(self, arg) -> str: - return str(arg) - - def choices(self) -> list[str]: - return [name for name in self.servos] - - def html(self, name: str, default: str, translate) -> str: - options = "\n".join("""""".format(name, ' selected="selected"' if name == default else "", name) for name in self.servos) - return f"""\n""" - - -class Servo: - def __init__(self, boxes, axle: float = 3) -> None: - self.boxes = boxes - self.axle = axle - self._edges = buildEdges(boxes, self) - - def edges(self, edges): - return [self._edges.get(e, e) for e in edges] - - -class Servo9g(Servo): - height: float = 22.5 - length: float = 28.0 # one tab in the wall - width: float = 12.0 - axle_pos: float = 6.0 - servo_axle: float = 4.6 # 6.9 for servo arm - - def top(self, x: float = 0.0, y: float = 0.0, angle: float = 90.0) -> None: - self.boxes.moveTo(x, y, angle) - self.boxes.hole(6, 0, 6) - self.boxes.hole(12, 0, 3) - - def bottom(self, x: float = 0.0, y: float = 0.0, angle: float = 90.0) -> None: - self.boxes.moveTo(x, y, angle) - self.boxes.hole(6, 0, self.axle / 2.0) - - def front(self, x: float = 0.0, y: float = 0.0, angle: float = 90.0) -> None: - self.boxes.moveTo(x, y, angle) - self.boxes.rectangularHole(5.4, 0, 2.4, 12) - self.boxes.rectangularHole(17, 0, 4, 16) - - def hinge_width(self) -> float: - return self.height + self.boxes.thickness + 4.5 - - def hinge_depth(self) -> float: - return self.height # XXX - - -class Servo9gt(Servo9g): - height = 35 - - def top(self, x: float = 0.0, y: float = 0.0, angle: float = 90.0) -> None: - self.boxes.moveTo(x, y, angle) - self.boxes.hole(6, 0, 6) - self.boxes.hole(12, 0, 5) - - def bottom(self, x: float = 0.0, y: float = 0.0, angle: float = 90.0) -> None: - self.boxes.moveTo(x, y, angle) - self.boxes.hole(6, 0, self.axle) - - def front(self, x: float = 0.0, y: float = 0.0, angle: float = 90.0) -> None: - self.boxes.moveTo(x, y, angle) - self.boxes.rectangularHole(5.4, 0, 2.4, 12) diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/vectors.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/vectors.py deleted file mode 100644 index 7fe19e6..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/vectors.py +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (C) 2013-2014 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -import math - - -def normalize(v): - """set length of vector to one""" - l = (v[0] ** 2 + v[1] ** 2) ** 0.5 - if l == 0.0: - return (0.0, 0.0) - return (v[0] / l, v[1] / l) - - -def vlength(v): - return (v[0] ** 2 + v[1] ** 2) ** 0.5 - - -def vclip(v, length): - l = vlength(v) - if l > length: - return vscalmul(v, length / l) - return v - - -def vdiff(p1, p2): - """vector from point1 to point2""" - return (p2[0] - p1[0], p2[1] - p1[1]) - - -def vadd(v1, v2): - """Sum of two vectors""" - return (v1[0] + v2[0], v1[1] + v2[1]) - - -def vorthogonal(v): - """Orthogonal vector""" - return (-v[1], v[0]) - - -def vscalmul(v, a): - """scale vector by a""" - return (a * v[0], a * v[1]) - - -def dotproduct(v1, v2): - """Dot product""" - return v1[0] * v2[0] + v1[1] * v2[1] - -def circlepoint(r, a): - return (r * math.cos(a), r * math.sin(a)) - -def tangent(x, y, r): - """angle and length of a tangent to a circle at x,y with radius r""" - l1 = vlength((x, y)) - a1 = math.atan2(y, x) - a2 = math.asin(r / l1) - l2 = math.cos(a2) * l1 - - return (a1+a2, l2) - -def rotm(angle): - """Rotation matrix""" - return [[math.cos(angle), -math.sin(angle), 0], - [math.sin(angle), math.cos(angle), 0]] - - -def vtransl(v, m): - m0, m1 = m - return [m0[0] * v[0] + m0[1] * v[1] + m0[2], - m1[0] * v[0] + m1[1] * v[1] + m1[2]] - - -def mmul(m0, m1): - result = [[0, ] * len(m0[0]) for i in range(len(m0))] - for i in range(len(m0[0])): - for j in range(len(m0)): - for k in range(len(m0)): - result[j][i] += m0[k][i] * m1[j][k] - return result - - -def kerf(points, k, closed=True): - """Outset points by k - Assumes a closed loop of points - """ - result = [] - lp = len(points) - - for i in range(len(points)): - # get normalized orthogonals of both segments - v1 = vorthogonal(normalize(vdiff(points[i - 1], points[i]))) - v2 = vorthogonal(normalize(vdiff(points[i], points[(i + 1) % lp]))) - - if not closed: - if i == 0: - v1 = v2 - if i == lp-1: - v2 = v1 - # direction the point has to move - d = normalize(vadd(v1, v2)) - # cos of the half the angle between the segments - cos_alpha = dotproduct(v1, d) - result.append(vadd(points[i], vscalmul(d, -k / cos_alpha))) - - return result diff --git a/extensions/fablabchemnitz/boxes.py/boxes/boxes/walledges.py b/extensions/fablabchemnitz/boxes.py/boxes/boxes/walledges.py deleted file mode 100644 index 4fb5c71..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/boxes/walledges.py +++ /dev/null @@ -1,447 +0,0 @@ -from __future__ import annotations - -import math -from typing import Any - -from boxes import Boxes, edges - -from .edges import BaseEdge, Settings - - -class _WallMountedBox(Boxes): - ui_group = "WallMounted" - - def __init__(self) -> None: - super().__init__() - self.addWallSettingsArgs() - - def addWallSettingsArgs(self): - self.addSettingsArgs(edges.FingerJointSettings) - self.addSettingsArgs(WallSettings) - self.addSettingsArgs(SlatWallSettings) - self.addSettingsArgs(DinRailSettings) - self.addSettingsArgs(FrenchCleatSettings) - self.argparser.add_argument( - "--walltype", action="store", type=str, default="plain", - choices=["plain", "plain reinforced", "slatwall", "dinrail", - "french cleat"], - help="Type of wall system to attach to") - - def generateWallEdges(self): - if self.walltype.startswith("plain"): - s = WallSettings( - self.thickness, True, - **self.edgesettings.get("Wall", {})) - elif self.walltype == "slatwall": - s = SlatWallSettings( - self.thickness, True, - **self.edgesettings.get("SlatWall", {})) - elif self.walltype == "dinrail": - s = DinRailSettings( - self.thickness, True, - **self.edgesettings.get("DinRail", {})) - elif self.walltype == "french cleat": - s = FrenchCleatSettings( - self.thickness, True, - **self.edgesettings.get("FrenchCleat", {})) - - s.edgeObjects(self) - self.wallHolesAt = self.edges["|"] - if self.walltype.endswith("reinforced"): - self.edges["c"] = self.edges["d"] - self.edges["C"] = self.edges["D"] - -############################################################################# -#### Straight Edge / Base class -############################################################################# - -class WallEdge(BaseEdge): - - _reversed = False - - def lengths(self, length): - return [length] - - def _joint(self, length): - self.edge(length) - - def _section(self, nr, length): - self.edge(length) - - def __call__(self, length, **kw): - lengths = list(enumerate(self.lengths(length))) - if self._reversed: - lengths = list(reversed(lengths)) - - for nr, l in lengths: - if l == 0.0: - continue - if nr % 2: - self._section(nr // 2, l) - else: - self._joint(l) - -class WallJoinedEdge(WallEdge): - char = "b" - - def _joint(self, length): - t = self.settings.thickness - self.step(-t) - self.edges["f"](length) - self.step(t) - - def startwidth(self) -> float: - return self.settings.thickness - -class WallBackEdge(WallEdge): - - def _section(self, nr, length): - self.edge(length) - - def _joint(self, length): - t = self.settings.thickness - self.step(t) - self.edges["F"](length) - self.step(-t) - - def margin(self) -> float: - return self.settings.thickness - -class WallHoles(WallEdge): - - def _section(self, nr, length): - self.rectangularHole(length/2, 0, length, self.settings.thickness) - self.moveTo(length, 0) - - def _joint(self, length): - self.fingerHolesAt(0, 0, length, 0) - self.moveTo(length, 0) - - def __call__(self, x, y, length, angle, **kw): - """ - Draw holes for a matching WallJoinedEdge - - :param x: position - :param y: position - :param length: length of matching edge - :param angle: (Default value = 90) - """ - with self.boxes.saved_context(): - self.boxes.moveTo(x, y, angle) - b = self.boxes.burn - t = self.settings.thickness - - if self.boxes.debug: # XXX - width = self.settings.thickness - self.ctx.rectangle(b, -width / 2 + b, - length - 2 * b, width - 2 * b) - - self.boxes.moveTo(length, 0, 180) - super().__call__(length) - -class WallHoleEdge(WallHoles): - """Edge with holes for a parallel finger joint""" - description = "Edge (parallel slot wall Holes)" - - def __init__(self, boxes, wallHoles, **kw) -> None: - super().__init__(boxes, wallHoles.settings, **kw) - self.wallHoles = wallHoles - - def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw): - dist = self.wallHoles.settings.edge_width + self.settings.thickness / 2 - with self.saved_context(): - px, angle = (0, 0) if self._reversed else (length, 180) - self.wallHoles( - px, dist, length, angle) - self.edge(length, tabs=2) - - def startwidth(self) -> float: - """ """ - return self.wallHoles.settings.edge_width + self.settings.thickness - - def margin(self) -> float: - return 0.0 - -class WallSettings(Settings): - """Settings for plain WallEdges -Values: - -* relative (in multiples of thickness) - - * edge_width : 1.0 : space below holes of FingerHoleEdge (multiples of thickness) - -""" - - absolute_params: dict[str, Any] = { - } - - relative_params = { - "edge_width": 1.0, - } - - base_class = WallEdge - - def edgeObjects(self, boxes, chars="aAbBcCdD|", add=True): - bc = self.base_class - bn = bc.__name__ - wallholes = type(bn+"Hole", (WallHoles, bc), {})(boxes, self) - - edges = [bc(boxes, self), - type(bn+"Reversed", (bc,), {'_reversed' : True})(boxes, self), - type(bn+"Joined", (WallJoinedEdge, bc), {})(boxes, self), - type(bn+"JoinedReversed", (WallJoinedEdge, bc), {'_reversed' : True})(boxes, self), - type(bn+"Back", (WallBackEdge, bc), {})(boxes, self), - type(bn+"BackReversed", (WallBackEdge, bc), {'_reversed' : True})(boxes, self), - type(bn+"Hole", (WallHoleEdge, bc), {})(boxes, wallholes), - type(bn+"HoleReversed", (WallHoleEdge, bc), {'_reversed' : True})(boxes, wallholes), - wallholes, - ] - return self._edgeObjects(edges, boxes, chars, add) - -############################################################################# -#### Slat wall -############################################################################# - - -class SlatWallEdge(WallEdge): - - def lengths(self, length): - pitch = self.settings.pitch - h = self.settings.hook_height - he = self.settings.hook_extra_height - - lengths = [] - if length < h + he: - return [length] - lengths = [0, h + he] - length -= h + he - if length > pitch: - lengths.extend([(length // pitch) * pitch - h - 2 - 2*he, - h + 2 + 2*he, - length % pitch]) - else: - lengths.append(length) - return lengths - - def _section(self, nr, length): - w = self.settings.hook_height # vertical width of hook - hd = self.settings.hook_depth - hdist = self.settings.hook_distance - hh = self.settings.hook_overall_height - ro = w # outer radius - ri = min(w/2, hd/2) # inner radius - rt = min(1, hd/2) # top radius - slot = self.settings.hook_height + 2 # XXX - if nr == 0: - poly = [0, -90, hdist-ri, (-90, ri), hh-ri-w-rt, (90, rt), - hd-2*rt, (90, rt), hh-ro-rt, (90, ro), hdist+hd-ro, -90, - length-6] - elif nr == 1: - if self.settings.bottom_hook == "spring": - r_plug = slot*.4 - slotslot = slot - r_plug * 2**0.5 - poly = [self.settings.hook_extra_height, -90, - 5.0, -45, 0, (135, r_plug), - 0, 90, 10, -90, slotslot, -90, 10, 90, 0, - (135, r_plug), 0, -45, 5, -90, - self.settings.hook_extra_height] - elif self.settings.bottom_hook == "hook": - d = 2 - poly = [self.settings.hook_extra_height + d - 1, -90, - 4.5+hd, (90,1), slot-2, (90, 1), hd-1, 90, d, - -90, 5.5, -90, self.settings.hook_extra_height + 1] - elif self.settings.bottom_hook == "stud": - poly = [self.settings.hook_extra_height, -90, - 6, (90, 1) , slot-2, (90, 1), 6, -90, - self.settings.hook_extra_height] - else: - poly = [2*self.settings.hook_extra_height + slot] - - if self._reversed: - poly = reversed(poly) - self.polyline(*poly) - - def margin(self) -> float: - return self.settings.hook_depth + self.settings.hook_distance - -class SlatWallSettings(WallSettings): - """Settings for SlatWallEdges -Values: - -* absolute_params - - * bottom_hook : "hook" : "spring", "stud" or "none" - * pitch : 101.6 : vertical spacing of slots middle to middle (in mm) - * hook_depth : 4.0 : horizontal width of the hook - * hook_distance : 5.5 : horizontal space to the hook - * hook_height : 6.0 : height of the horizontal bar of the hook - * hook_overall_height : 12.0 : height of the hook top to bottom - -* relative (in multiples of thickness) - - * hook_extra_height : 2.0 : space surrounding connectors (multiples of thickness) - * edge_width : 1.0 : space below holes of FingerHoleEdge (multiples of thickness) - -""" - - absolute_params = { - "bottom_hook" : ("hook", "spring", "stud", "none"), - "pitch" : 101.6, - "hook_depth" : 4.0, - "hook_distance" : 5.5, - "hook_height" : 6.0, - "hook_overall_height" : 12.0, - } - - relative_params = { - "hook_extra_height" : 2.0, - "edge_width": 1.0, - } - - base_class = SlatWallEdge - - -############################################################################# -#### DIN rail -############################################################################# - -class DinRailEdge(WallEdge): - - def lengths(self, length): - if length < 20: - return [length] - if length > 50 and self.settings.bottom == "stud": - return [0, 20, length - 40, 20] - return [0, 20, - length - 20] - - def _section(self, nr, length): - d = self.settings.depth - - if nr == 0: - r = 1. - poly = [0, -90, d-0.5-r, (90, r), 15+3-2*r, (90, r), - d-4-r, 45, - 4*2**.5, -45, .5, -90, 6] - elif nr == 1: - slot = 20 - if self.settings.bottom == "stud": - r = 1. - poly = [0, -90, 7.5-r, (90, r), - slot - 2*r, - (90, r), 7.5-r, -90, 0] - else: - poly = [slot] - if self._reversed: - poly = reversed(poly) - self.polyline(*poly) - - def margin(self) -> float: - return self.settings.depth - -class DinRailSettings(WallSettings): - """Settings for DinRailEdges -Values: - -* absolute_params - - * bottom : "stud" : "stud" or "none" - * depth : 4.0 : horizontal width of the hook - -* relative (in multiples of thickness) - - * edge_width : 1.0 : space below holes of FingerHoleEdge (multiples of thickness) - -""" - - absolute_params = { - "bottom" : ("stud", "none"), - "depth" : 8.0, - } - - relative_params = { - "edge_width": 1.0, - } - - base_class = DinRailEdge - -############################################################################# -#### French Cleats -############################################################################# - -class FrenchCleatEdge(WallEdge): - - def lengths(self, length): - d = self.settings.depth - t = self.settings.thickness - s = self.settings.spacing - h = d * math.tan(math.radians(self.settings.angle)) - # make small enough to not have finger holes - top = 0.5*t - bottom = 0.5 * t - if length < top + bottom + 1.5*d + h: - return [length] - if length > top + bottom + 2*t + 1.5*d + h and \ - self.settings.bottom == "stud": - return [top, 1.5*d + h, length - top - bottom - 2.5*d - h, - d, bottom] - if length > top + bottom + 2.5*d + s and \ - self.settings.bottom == "hook": - dist = ((length - top - t - 1.5*d - h) // s ) * s - 1.5*d - h - return [top, 1.5*d + h, dist, 1.5*d + h, length-dist-top-3*d-2*h] - return [top, 2.5*d, length-top-2.5*d] - - def _section(self, nr, length): - d = self.settings.depth - t = self.settings.thickness - r = min(0.5*t, 0.1*d) - a = self.settings.angle - h = d * math.tan(math.radians(a)) - l = d / math.cos(math.radians(a)) - - if nr == 0 or self.settings.bottom == "hook": - poly = [0, -90, 0, (90, d), .5*d+h, 90+a, l, -90-a, length-1.5*d] - elif nr == 1: - if self.settings.bottom == "stud": - r = min(t, length/4, d) - poly = [0, -90, d-r, (90, r), - length - 2*r, - (90, r), d-r, -90, 0] - else: - poly = [length] - if self._reversed: - poly = reversed(poly) - self.polyline(*poly) - - def margin(self) -> float: - return self.settings.depth - -class FrenchCleatSettings(WallSettings): - """Settings for FrenchCleatEdges -Values: - -* absolute_params - - * bottom : "stud" : "stud", "hook" or "none" - * depth : 18.0 : horizontal width of the hook in mm - * angle : 45.0 : angle of the cut (0 for horizontal) - * spacing : 200.0 : distance of the cleats in mm (for bottom hook) - -* relative (in multiples of thickness) - - * edge_width : 1.0 : space below holes of FingerHoleEdge (multiples of thickness) - -""" - - absolute_params = { - "bottom" : ("stud", "hook", "none"), - "depth" : 18.0, - "spacing" : 200.0, - "angle" : 45.0, - } - - relative_params = { - "edge_width": 1.0, - } - - base_class = FrenchCleatEdge diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxes.1 b/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxes.1 deleted file mode 100644 index fa88c02..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxes.1 +++ /dev/null @@ -1,63 +0,0 @@ -'\" t -.\" Title: Boxes -.\" Author: Georges Khaznadar -.\" Generator: DocBook XSL Stylesheets v1.79.1 -.\" Date: 10/26/2019 -.\" Manual: boxes User Manual -.\" Source: boxes -.\" Language: English -.\" -.TH "BOXES" "1" "10/26/2019" "boxes" "boxes User Manual" -.\" ----------------------------------------------------------------- -.\" * Define some portability stuff -.\" ----------------------------------------------------------------- -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" http://bugs.debian.org/507673 -.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.\" ----------------------------------------------------------------- -.\" * set default formatting -.\" ----------------------------------------------------------------- -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.\" ----------------------------------------------------------------- -.\" * MAIN CONTENT STARTS HERE * -.\" ----------------------------------------------------------------- -.SH "NAME" -boxes \- program design boxes -.SH "DESCRIPTION" -.PP -\fBboxes\fR -is a program that generates SVG images that can be viewed directly in a web browser but also postscript and \- with pstoedit as external helper \- other vector formats including dxf, plt (aka hpgl) and gcode\&. -.PP -Of course the library and the generators allow selecting the "thickness" of the material used and automatically adjusts lengths and width of joining fingers and other elements\&. -.PP -The "burn" parameter compensates for the material removed by the laser\&. This allows fine tuning the gaps between joins up to the point where plywood can be press fitted even without any glue\&. -.PP -inger Joints are the work horse of the library\&. They allow 90\(de edges and T connections\&. Their size is scaled up with the material "thickness" to maintain the same appearance\&. The library also allows putting holes and slots for screws (bed bolts) into finger joints, although this is currently not supported for the included generators\&. -.PP -Dovetail joints can be used to join pieces in the same plane\&. -.PP -Flex cuts allows bending and stretching the material in one direction\&. This is used for rounded edges and living hinges\&. -.SH "AUTHOR" -.PP -\fBGeorges Khaznadar\fR <\&georgesk@debian\&.org\&> -.RS 4 -Wrote this manpage for the Debian system\&. -.RE -.SH "COPYRIGHT" -.br -Copyright \(co 2019 Georges Khaznadar -.br -.PP -This manual page was written for the Debian system (and may be used by others)\&. -.PP -Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or (at your option) any later version published by the Free Software Foundation\&. -.PP -On Debian systems, the complete text of the GNU General Public License can be found in -/usr/share/common\-licenses/GPL\&. -.sp diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxes.xml b/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxes.xml deleted file mode 100644 index 10253f5..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxes.xml +++ /dev/null @@ -1,135 +0,0 @@ - -.

will be generated. You may view the -manual page with: nroff -man .
| less'. A typical entry -in a Makefile or Makefile.am is: - -DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/docbook-xsl/manpages/docbook.xsl -XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0" - -manpage.1: manpage.xml - $(XP) $(DB2MAN) $< - -The xsltproc binary is found in the xsltproc package. The XSL files are in -docbook-xsl. A description of the parameters you can use can be found in the -docbook-xsl-doc-* packages. Please remember that if you create the nroff -version in one of the debian/rules file targets (such as build), you will need -to include xsltproc and docbook-xsl in your Build-Depends control field. -Alternatively use the xmlto command/package. That will also automatically -pull in xsltproc and docbook-xsl. - -Notes for using docbook2x: docbook2x-man does not automatically create the -AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as - ... . - -To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections -read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be -found in the docbook-xsl-doc-html package. - -Validation can be done using: `xmllint -''-noout -''-valid manpage.xml` - -General documentation about man-pages and man-page-formatting: -man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/ - ---> - - - - - - - - - - - - - -]> - - - - &dhtitle; - &dhpackage; - - - &dhfirstname; - &dhsurname; - Wrote this manpage for the Debian system. -
- &dhemail; -
-
-
- - 2019 - &dhusername; - - - This manual page was written for the Debian system - (and may be used by others). - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU General Public License, - Version 2 or (at your option) any later version published by - the Free Software Foundation. - On Debian systems, the complete text of the GNU General Public - License can be found in - /usr/share/common-licenses/GPL. - -
- - &dhucpackage; - &dhsection; - - - &dhpackage; - program design boxes - - - DESCRIPTION - - &dhpackage; is a program that generates - SVG images that can be viewed directly in a web browser but also - postscript and - with pstoedit as external helper - - other vector formats including dxf, plt (aka hpgl) and gcode. - - - Of course the library and the generators allow selecting the - "thickness" of the material used and automatically adjusts lengths and - width of joining fingers and other elements. - - - The "burn" parameter compensates for the material removed by the - laser. This allows fine tuning the gaps between joins up to the point - where plywood can be press fitted even without any glue. - - - inger Joints are the work horse of the library. They allow 90° - edges and T connections. Their size is scaled up with the material - "thickness" to maintain the same appearance. The library also allows - putting holes and slots for screws (bed bolts) into finger joints, - although this is currently not supported for the included generators. - - - Dovetail joints can be used to join pieces in the same plane. - - - Flex cuts allows bending and stretching the material in one - direction. This is used for rounded edges and living hinges. - - -
diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxesserver.1 b/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxesserver.1 deleted file mode 100644 index a55ea92..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxesserver.1 +++ /dev/null @@ -1,64 +0,0 @@ -'\" t -.\" Title: BoxesServer -.\" Author: Georges Khaznadar -.\" Generator: DocBook XSL Stylesheets v1.79.1 -.\" Date: 10/31/2019 -.\" Manual: boxesserver User Manual -.\" Source: boxesserver -.\" Language: English -.\" -.TH "BOXESSERVER" "1" "10/31/2019" "boxesserver" "boxesserver User Manual" -.\" ----------------------------------------------------------------- -.\" * Define some portability stuff -.\" ----------------------------------------------------------------- -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" http://bugs.debian.org/507673 -.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.\" ----------------------------------------------------------------- -.\" * set default formatting -.\" ----------------------------------------------------------------- -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.\" ----------------------------------------------------------------- -.\" * MAIN CONTENT STARTS HERE * -.\" ----------------------------------------------------------------- -.SH "NAME" -boxesserver \- a web server to make boxes\&. -.SH "SYNOPSIS" -.HP \w'\fBboxesserver\fR\ 'u -\fBboxesserver\fR [\fB\fIport_number\fR\fR] -.SH "DESCRIPTION" -.PP -\fBboxesserver\fR -is a web server which allows one to compute sketches to cut materials with a laser and make various types of boxes\&. -.SH "OPTIONS" -.PP -\fB\fIport_number\fR\fR -.RS 4 -If this optional parameter is set, the web service will be done using this port number\&. By default, the port number is 8000\&. -.sp -Please notice that port numbers lesser than 1024 are privileged, and can be used only by root\&. -.RE -.SH "AUTHOR" -.PP -\fBGeorges Khaznadar\fR <\&georgesk@debian\&.org\&> -.RS 4 -Wrote this manpage for the Debian system\&. -.RE -.SH "COPYRIGHT" -.br -Copyright \(co 2019 Georges Khaznadar -.br -.PP -This manual page was written for the Debian system (and may be used by others)\&. -.PP -Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or (at your option) any later version published by the Free Software Foundation\&. -.PP -On Debian systems, the complete text of the GNU General Public License can be found in -/usr/share/common\-licenses/GPL\&. -.sp diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxesserver.xml b/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxesserver.xml deleted file mode 100644 index d6d17a2..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/boxesserver.xml +++ /dev/null @@ -1,132 +0,0 @@ - -.
will be generated. You may view the -manual page with: nroff -man .
| less'. A typical entry -in a Makefile or Makefile.am is: - -DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/docbook-xsl/manpages/docbook.xsl -XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0" - -manpage.1: manpage.xml - $(XP) $(DB2MAN) $< - -The xsltproc binary is found in the xsltproc package. The XSL files are in -docbook-xsl. A description of the parameters you can use can be found in the -docbook-xsl-doc-* packages. Please remember that if you create the nroff -version in one of the debian/rules file targets (such as build), you will need -to include xsltproc and docbook-xsl in your Build-Depends control field. -Alternatively use the xmlto command/package. That will also automatically -pull in xsltproc and docbook-xsl. - -Notes for using docbook2x: docbook2x-man does not automatically create the -AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as - ... . - -To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections -read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be -found in the docbook-xsl-doc-html package. - -Validation can be done using: `xmllint -''-noout -''-valid manpage.xml` - -General documentation about man-pages and man-page-formatting: -man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/ - ---> - - - - - - - - - - - - - -]> - - - - &dhtitle; - &dhpackage; - - - &dhfirstname; - &dhsurname; - Wrote this manpage for the Debian system. -
- &dhemail; -
-
-
- - 2019 - &dhusername; - - - This manual page was written for the Debian system - (and may be used by others). - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU General Public License, - Version 2 or (at your option) any later version published by - the Free Software Foundation. - On Debian systems, the complete text of the GNU General Public - License can be found in - /usr/share/common-licenses/GPL. - -
- - &dhucpackage; - &dhsection; - - - &dhpackage; - a web server to make boxes. - - - - &dhpackage; - - - - - DESCRIPTION - &dhpackage; is a web server which allows - one to compute sketches to - cut materials with a laser and make various types of boxes. - - - OPTIONS - - - - - If this optional parameter is set, the web service - will be done using this port number. By default, the port number - is 8000. - - - Please notice that port numbers lesser than 1024 are privileged, - and can be used only by root. - - - - - -
diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/presentation.odp b/extensions/fablabchemnitz/boxes.py/boxes/documentation/presentation.odp deleted file mode 100644 index 0fd25d39b4e1e8c7b67b2176e6fe8b472e765f05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 882188 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 z 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%0DapJd+Dwx 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

}^jNiI%_Z693Pa>|aLd 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


t(imf!jTDPC5! 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 z zAmNh(<9ET`t9>)F#6)4+@vCI3I#I@FU>)d<-AyDxP2WHwf5+46FE={Qb2koY7W|4G_A?pk~C0d%|bqS4VHYM;f11epyxZ+FeBwy!Ht! z^>aK0<7q#0%6Bvky!i|Xy-1}hbxwreBL?}FNuGQW2@7_t0jm~-?$UH?iJbM@ybxoN zsJWb3vH2->e&S2Q)X^2z`5ZE4l01*blGJPoV|^A0TbxX^i=|K%kK~Dpjg-jPHwxTA z-@Gc8kPd5txqF!n*w@rBxVxQmrVq=58xboRXaq7Ao{^Nfv#}pSVg(u*G(Y10Ks)!3 zMt~P~>&nl_qFV+5jRfTXt&yJv_cXF3431%viU$w3w_K zG1;+<#0Zs!^gP&%McQGjV;>}byK44KRV>Z5^+Re-f<*|g*(X)8DcYOcDR%FuX=;*y zcmY~4f~aKpL`-e|c*+biloc>4uJ-k(CLwvmc6P2hxBb z<1S(a{`|LnA<|@K0cn1Q0BLAP{+1?T^qw^CKh0{Q->bsC*D5wnY0Hjh+|}2~j;3*{ zmnF1TcU$<1bKclIDiYRjzuv#8^i~mZcT3xUJ7;n0Z5By?g4V{%33oGHk_1AF)m^>z z6dML~nnPm^(Bxh-oghncGab z4Ht~C_!54E{&My^Xpeb4qhH8UjwK)6Sv>7R*pA`e$9?7oqUba3Qe0;1(>Ps75gsbL zEmY#12V-UFH}|#0GI!Hs43M>Fn=$Ubp%dAZIqc@*?$Q1E$&qn)N?qi@snb_yQG^W0 zvh^0_3hv2h6ISyTH99xL=Y22^r5Js#1-sJMxh&4agY}$uD$@l);*@bT-0(H?`^@dS z+6rwrEQ{4rh7ZoJ!4O6)7?NSy#3NF@{FM%G?{mG2LHwAO-t4$5%-@4|9PJoJGjJb6dSZ?5Eu55K z<3#4ZJYTJ{z>h@6Md~3e4eyB)b+m1!FV&9T9%+vH4rw7i`RSj`696u`4m{{4G}n8ob!b&%TQU?ZIMUAetOiI;}2bsOG{!P^m% zjeD8;hkGDf3)=lih^tO?vUe3)A}a9ca+dXH)(n4BnNK z;QpkJzjW5n0CYyeN%Z~w-T5N*I{VhjhGHIp+)V&h9)`Bv=hJ1aR3?jzp}1S5A_5!Y zhW25Jd5)c2nO!D_C#kTvSV~-O$WC~QxQi1t&_vyyTp1UBj$sxU)`Bc8=K}U+ysng~ zQ;S|U-D>Y@-xJi!n3kt%N)yPXe!Imwy_9@6ao6U7viqLeqqJdr?OI*q2m9@u!>0TD zgG!lSv)U}SUMEwZju$z(r^=`F-QIE?h_K%OpsxUn*m`$1NW|0^D_!Cezn6RI2C_nNZu%HjhfseyMb|?~T9boR~ccrK) zSW4SrAFEqp3|vKVq!L)_2$^FqXti_en*@nYy!p)DLf>1l#93)1gQ9^d4`_>9|PB z#`?`pHqT~gt#wJRk$%Zx(H?>@B8IHE^a`SLf?Z3nrbO|ap$ zSo8?W@hW%$Orlfoq~pUlQNzU-N*_Yu@lehz?#*LToP*;0vV~kvs5b%;_7IYtHmG-dQgq_A`?m-jOjU2lv)eH*L+`SCo;K-NZLV z&LyN&d?TJsXkWcR?ELeG@mhER9OV}?KQ~c?*W0&}0@K5&I)hyfrMoQpJP(WdX=pI~okuaZg2=A@sIndf~uwle6zIZS9je04YT6ZHWz;mx{UevYON z{#1#dC;mjgltwW6Q5XM_lJ-QEkJQLGl!#ig$MRzwb4C^NMFP$7gFzirzAsK}m9j}UgOM0@T zLA+>}>oi}C6ZAzEE-8(RPwN~=RS_yiiI)!PCM~oa&suVuyOzV-Oy$~f6hWSQ`G0AZ zP&NXNyzqW^N<9d}Zdo<{MBHH+H>2);fTZ_pWVbmzV%~g9adS(DP209?`%fWILEu~N z_eT8H$_=LLZQLq1b0w9?*{c;yv^I|-$(QaBX6@V*F1p16hb&IIQ$Os|-)G>zkcI|P z;=-;XTXNuN7tXns8()zoGBj6~_Dt7oZa%tRt_a!aM%8RvrE)%Ul%=2Vd3kF`FrA&X zv=*JV9L)fw)Q=Y_iM_YUxzU>4b|ymD?d)9Jw~8!Y*RFgZI|6LotB0j66YKKjuD@bP z<8bybmmk6bFT!pb)6`5P7xzAFR2)qnbl+wkYqWCoe4)U9W8W5ke{R~N&|!t z82Y!;$S{Os%dLk|iYK>yOYjW8_8#?h1V^dpw46z!tUg)OP09P#gd{q;BQ;u^9nPn{ zaMk?mZtIh!y{VvjHU|rDu7{ARM|E>IZ8+;S$^9S;&#<;{l&e`9z;mc4!0;gXU?T=8wofP*m5K5e7JZ?HwnD zoae=?)vjN3S?VD@w>k+tTcC|Z5yTEOvsS2o|2u*qgc8s?HP*2~lHAEtJpb0+@508G z@4&Ce_zs?c(B}Jz8|tCq2*T|g@Hvc@dl&~QMC_}=zlR0~&w9o0o`?~ok~00a6}r=* zo!54SXspvm?Gc`)%VY#jM+9@r+XPz5w~bQA>$*51qd~ZRr9zFXLvF(G)_aK$MFpfb8}E z5y6T_8`L=wL^~XGadhs@>^=AC`u2ePR258|hKk=yKi7h$FhMY47KpV0h2|CAufhQ* zO`ylNLdLr?CtbuGV8+zB6Fwm@(7lVXAF$bRl&>ifuz4)hNVdf4QJY188CnS*e1AAGly$M2SIwbw1xi*%bC2L8pXKr{Lmd3P-VX-(9ucqKG5 zn1zMiIR4DAwFH`#%GE4FW@9zD(-#C^FY8Q*R~{@HYO6WX4y}s^iQ<7q zvwdHXy1MAqZqlp();kmt3G96eUMh28;V>SAAtedr_i~?ijI=}rL8vk>kr>vnL|(DY zBT)NENrCo7cqz=qgu{4G24f`T-m9Q*8)Ov=25fb)b1Tkm?X$Drha5LRL zD{~_lzGf1b@Y)yBZ?S8pQUpDG3wxxnK)g_7$OK)`xqlqG$~aP(;Mv!*o8J~1g=aH1YC%D8gn;$YmKSb}~kq#6>1xb0ECpqa6Hkm8b2jguLX3YlU0TPC+Sj^_%(zc)}KZ~m-vQw&PD6}EqpQINtEC1Ce zCxHTKW-0-WO8eA8_}qp-omP^;>yx+GHk#dL-u2sTTuCp}GnC$A^Datxq@e4uP)Uaf zDt4*j1BErfK&M2rj79)*tF$5Qldr;*iUD*epp@tYbVy%BlvfPn@KPv@7kjL4!3ipXAcTOHvoYP~QhN^NG?_sCjT|lF_yXXaf42KAATV(B=$c#tX2dtf1K1lG1^d)f+@Z7= zf$ks?a))^oHFFB{LW4YB%=BEN`WZU05E)U%gT8o|+#z6K8CVBiA!#3}EamZeEX4~o zkpgo=Aqs&`-1ckXAf=Yib;!DXAKWZ+xV5oIkpWXKj6njQO$q30jF^p2&MLKe1&22tlxjpgZKxBf$Qqjqf*90Wse+Or<7;8Q_wVR> z&8m>XTCiv#KuSs$m$oojB%u_cPN(E2_|?$aKFB%WV(O4J|Nmp#0zLYY`6B0Z0qqQb zw*!Ins$tds7i7ceLpfoAp-mCQAn~O_C~fe2J`Yc*DW%pDGV?&uqkupL`sh7vQ-))J zz4%Lbz_PRhudvZHY%p{ZR3_I}D5Y`|F{eO<|4ur9?F^iBoV>zJuVBL-dYyorCfg@AvoUVdz5oWNM8}m!;VncR zzc*(E(b${cvY2HVKHh2^?m6!lhej#d%|)K&H?$MoLW{~^TZ-_Wn+XVqxr)+aNL>C@ z`TP@_a+t=UeE|mSEzqoWCDbtl!3nf81x|%}+`ewEvO!)(pHIHAu0?v{e%tad1?!rYU3nlJn_krj;@r1`=lkS`JXf_`!J| zJ_5s`2;G)_Fs3l9odg|UNHkgG%fLx*8>S+Np$?p7 zO{(o=nQy%n5eCQD&sA|+tjYQ)H?k3wJ7(Y{7u*oYj`RT>EROcvD|QkQ+UG4!QM#WJ zK#!uYp3fkJLSFiCfzA;cH8hucE7dmc8cT`Xa`Ol#* ztTDi$!j_Yr(=fwwK3L1#TXkpXIPg{8)d==Y^}Np*KCpKc&K=?S&fs@WzLUn{9TM~E zde@2F-Uw2tke(G5VRP#1dSkU3eOEmlD5{Dm`hqeiZs*MFt>VSZ=2lh($1BXNc4=nJ zU~MTnjN#)z?z~==#r zM4tDfTP1S@^B}eWo&$q!!2>S6b67kS<#-Le05;&}#qWi}9_H0=GkxVvQ)9%@iEp1q zqKTlO3M9wv!OzKYDsb+W!UdA!R2)x%mV~WK_ptG-y`HBxWsi3rqmEmxd}U?5??Pmm z^F#sT&UoI9mRhFd*KT&s-ll7I&kt|;`@La6d^Yov>U;zU90&U(YKjUoramWgBV(Zg z>LJe;fv%vqj+A*F;2stWs2t;y>{Bn-x_KOaC-Lec)0ACfbeO9h2BlO^>jYmG;0 zg*Xi~0RtN`*FjZ7=Tk^=G|OUuqD12gf%vV#?tu}`w86BAqzrUE5U;f1F93OHO!;6YR?}H3Scxphxk!HBPNEMIX5Vus{g&?-1E+Z9f%2 zlsK^Z$Y2))Z>`nO2g1|D7-Cd!aG4J1^qW8wBWqr{{Vv*P6uFSY}y>qTMe5WUizhgLX z4CzJ^h7Ph45!YbnMhN1$k=`LM!q@ryEWp3Rg(oTEa}>~E2XET;b_7n_xp1%Tgtqh_ z*%9*y-T9*QTOf|N7L?DZLZuf_|7|_mL9TNd)_cIj+^ER$3P!vt* z4;>hcz9H~E+mN=xnGh$wiEyD+xywol%%5@C-`-U0_jwG=K!u`WsTCIl@#NN^9gj;) zC{`#E&5mBf!v*mc3@SOsddQF^TSk5vzU0PT{`i5OX}w~8 z%PqX-DYklrjCVZdiqR`cc@XrF%8M{B?D)}?rG()8PYH77oO9&Z1jRl%8GZ@Wlrd)V z5;g-(p{{eAkX8T6j&lCWjt~=Ig%g4)qs%met%1nHr(M~Wq{ECzOubTnb;^b{B z%d41-x4>6g`+&3u4@i3|fP=`v$9_n|zjCu{aBijo&dre7gMkmkv`bCIv{y5A0mlXV zG+KltD~JR?TJsVPZ=j(K)R+{I9he9iW`pu;jW%d!8$pocxt}K|zSaw;T{g7sBb0Be zDjpbE+|C>cPrQ?+((Dy;hZgF@)I0ir@*{!reeullyeuPD*Cj~mui(3<__e#_5BNUMI8^vt=q;gF$Hbl|LKQq3&K+(bx3@Jvjx9rOQ6klHMf%CVFc zm*EP3XNVe()A=l~?9;(2pp^wdQa-fW(33U&Ax}IlRxy^gSmBZ9eU~-bN%M&B2{oKAd#4#+2`< zo&q08(P>AM<)ccd^NMitZ(sykzK*X8+ysvrD|;;Ve#td=V*VuXma>YL^Jn}GR$52b z7xo-1%qC>6K2tZ#z&9Z5(Zv@5?(uOwDT~%ZSXj}Z<2>s;fo@oZCIpa_em7GmvR{fH z-Kg0ow4pR=74W}?936dg*7&`VZ&eao6b7~N}fNh3U_*P{3(f|%C zy>1>WM_+41JxK-G>QEmm49zIf(!$5{SEuPtuoFK%=U20JF^%I_rm!>`q$xHiRH26= z4@fZ+br8W@6l1-wsrUmkBNxUT;TtVOBK(Jx_jbd0TJ3VUuo0-fQr(J^_F=#y0_})+ zolwr#BCr$1LM1+?Ig={LY-xW~?zCecA`hZ5H@?rHP?ilT0gR#EjoN@_jvJjuAr_Lu z+de))3Z5e4!VLJ%IbV7mY#ALjNF^4dsV@P=QLF1kIcs7Dd&`zM3w@^;j zfD|K92LZf0eQ3el47$3)IAjg<&-essEVki4>hM)my4Wn4*fpU4o;T1CbdiS=4SNxZ zJ@G~JG`<3@l=*{oillYVHlk}!ZNumcmw%;QZn4u3+u#zm01lPsj$NNSR!T^areGU> z^YaUd^bng26FUJkEk=44=HR_PvJpQ{O{4tDxSvEo3RXT0dPB9^X|frz{*Q7y5rNJF z2$A=kFP0{vg1|g?C{Lz0lD`Dv@N2n&pSQtAxr7^Bh95=wv+XlK{DFlZ7q7=1 z@CN-djTXF2?F9-|w4;!H>OBk%h{m}b6x@a%1NpV_pT`GH*@wMTgVK)>WfJvv%h1~H z3*xhh>a{p>$=tiTmpUw%*bMe9CeI5S!NA_O&F@v&j?L;}Z(g||cXVB33LC*B_D$S6 z5Wv(Vd$ApyuP35d9eWgKI?C!nosXUyhdGU`D&d6q8j`jsuz{uxQ%Er`)JNO5C@3o= ztHjGh%s+AU9b|}%8D$fG%jYxTC>~Il&pgb8hd>*uhEdK$hC~liwj#FmV-Lm`VE;S< zY}cv!$OVAwx=@QoG_bVA2q}gH`b1!;>lI{~@A;g4dpmTT>06!Kg}DzT&OV5*>1pc% zf4A!j1-FY3#Rh4@r81%z1fijHaZx6GGr@aDJ@J}kRWTW5qZSL%8zfTjp^na=utGv< zQqIdr_Ux|hI@6aTuNw0fxL@$e%@Rfuq?`l~FBT9=rV4Et(YHG&U3tzwowBlF=0;xM zq9Xb67ODPc`i-%y(u6-kd|_$(Ht=O+1+^@FeSeu*f9cd+CovIJj(&V5O6;TR4_O&I z=nZ4#Rb;tNI(i=ww4{{PvP8-0{i@)ye+2R}k;S`d*dj1781XZF(KAgE31t^kU6}}k zNeQ$yQ`FzViC~ue#-VYm+~7#gTG&7067t6le%NAYNUpSzl;Ov2`DRWWyk^Kc97Ihn z_72MEDbtc z$vg?N>GBIZV6#XLA}x^he;WWe34*vTshoO=gFS2zf#2;^9DcC>o2HfC`E? zvg`XozA9EX_dx5(K|Cdkrr$dYvuB&aM*9wLRS z_)3Q&O4phONZMZNO*GhUiBcHJU!4Xd;@IaU$VvcB#{f0l?{+{A3)ffYmwyZsOQQHm zz~EW9(74*P@8|)kbvW)x&F*pMCU8jZo7c5}i%?!F{#BkdhL#z#ia^>x1q2i7yK({L z*f<>3y9g@NoV+>AR)XQ-q*DWuRJV+6%VSIpOsub>#T`|gVyo&Alzh@4e`}O-3I*T> zke*=|4xTy|aK|*1(-fZ(VPK3bfvCh&F%l<RSa?Eng8+bs)YAC0%08 zjagC)o0H%GvM!0%a#*Pxpq;vKXiQ#ho*)!`zH@HX4qrNor1Ng_7k!y1%E&;EbtGxQ=z9(!+6t=sLOb#xo2zJ|y#M}w$?oaNGV;wDIHOLW6M zHqEY@dX;Wb>N-eV>UwUBVbx;Y`4vy~+pIFB7@*nY`_|PM`&JU!L)G{QvAVXBz=0{0C|k*5 z4gz1=h2+&2$G336`!tJdMl;b>^)hvX``P;9eFknrX9t@v81*Q8I1<#DKq#R;tAo>? zi^(JMs%c`AX2~8B#cjbaprlo>50Hc5%gq2s*f1X}gfI0})WTJ3*J)rFjlc+pF3bWU z?;{y;C>Iu*?g<6>3=i6xDU{>XAg<2g!#Hsyn3feHVnKCM3WE*TNzBr>q^Pi#Lp66B3uEE@P!-?Lm7CvVuqjsrna!yy0goY=o}zA`BcxlSYi(a37*)!MF`YcW z6jkO>$;zL@|E#}q{efAB469tUq@&(RtX(^Ta;>NkQncN+UjYOi<~xj`=^3q#x9nPi zf&qu>41GpiWLwe_DY@38T4(T`pg6b;kuZV;ArXsKnv>l!`i(pDY5u%=wC~C*6C#># z7C9P<3&#@e+JsVl)4z}+g~K={Sgrky#*=5ZGcr4ZyRXW`C8PO zKP9P*4v7N|a5`fe+^BM3;pPwv7H*?6S5{1jI1p#tAY_QRJd|9fvk`9Hn(5hZDYeY= zEjN$h)4MdXOFj>jkm4hudi5w~2baXreI^v3X(<{Dy={aN&erY72^vshBw3ABbFaoS zANhF`-Tu4NS*ZrHhSgZeCKB11>G;5uPj(aem2qL>*A!C(R)Naa4}GS#$83=V-Ih68 znG45~7&=j}4~quGes`&Y8g(pL+*}baOk3wA!p(gd<~OTJYhGkU-LSwc`G?NY9m4&b zSLPV~YK*Y)!B{57ovYoY-bMxSVR4^}t(uXRGq1$_0J*V)p>7#P8F9&I*)UwV7(}*+ zF{K8@X#!jvznhs#Q8PY1I;vaGSXOz75nT!pV*2*R0=%@<^Ih@8BWR@?Tms|`O2$+q zfS?r)zZJo@ny)gG9ArMj{E}eOp<>+N3!F`P{ zjuN7YpvuQ(sgyLGi+S$|6(IIKfLtt|5(tH_CEUx;3v9Q!KLQ z?-ge9oOSTGASpTQgE(<|wQu1#o|~4^xnvEjB0JitJmJX3A1-a6ymMd(gp#3A|bpBqIvyM1n@1jqwmjQJarq zg02dtkV#nDKa6Y|c|T&ut@>Mm{rbBeZ>uPv+B_1+9jmd1UuxT&USB5>n-(=_EVJ<^ zJ?83XJd5f{#fB;}|JDyCcr*i}SsK2YydvDH??O%r3l+H}%Z-%P>4Jo>$y*4ltgsHl z`})fI@x?+QtAk%#TDW5k8B=5Ed_moY^_7AW&B2A#kL+_R4^XUk_@lGs*9Saeso^X& z49)M^e5E~@i;n7=JY7^oo?Vw%M9ymVy0EbN6bvYO~quuE$MrPj>pGqvM6 zc1aKt5O+0LC^|@4rc6V!ZP(wydJGRU3&+KYRvFY>isNhb(3V=v2R4fOQTjJ30aJ;> zbFZENPbItgc`ALtR5WbJ!ha{fxV$BACGz$pHzR2Z{B zy%SUM+_YbDQ_Nk=MRtf8GA>Xw*RQHpghn%h^7CG$aCbX1kFsitC>ar^;qr@E9$IG= z5tr$W05TC8wZ(mMRtxXAvPre9dRmJKeoT7oi5dfm06~M|F--B*o=<}Jw|C2r=kiat zf{!;gPuFPP*S&%d4>sO6Pmhagj*BF9z25c3Pe+2gy5mjZ=*Lz$_eW31>5oxQ2d(#m z>5q?s-Vb}rPt&?j_rOm{y>Iq(pRVPf?&ZB7N1kr4S|84y9=4vYpB^_`pB}s)Pfi{A zeOezk(;x4FQJK8&%brG-pRD(vZns+R$4Q?~n7p6PmIby+pDw*0r@ftTmY+H=y`LWO zZbzO@^PVmfTc64VRhkb3fpMmuj-sXqy&pTvo*vP>)xI=)21ltP9XuI6UMxLrH7-Km zS(jgx@jtMs1j0l*ZccB$DciGYgIFxv6JPb2k}o`AOU}GAUL3TPj3QmpTw!nPy=<#M!?& zFg|G+b0JM{;1o&6TnMVAH{xK>30DOLZ^ogyUfE`*ro=dDa&*-jss(1vTaQ#TQeCiz zxC`}4zRi6>N!NGhP2$a&?OKHnKdI5Z`-74e*BcILA<{E%0~>u-!L~)%T>7dN$}_@a z{==fEJD0okz17DT>C=wu1)+2wHLpr;&(OBZTOpPqD+J4xm;Pz~)Q2xFQ`L^MUn1`Uc_a>G9^n1GnlB>eEP{J6e_C7MyCEXOf*}?m8mgQwx8> z1HtST!uI-;{62%sBV0XUdz>+D(*`hS@fgnsbg$+$M7$NlWGZb4s7C(0yiy;ZNLcn2 z%~vS!`-U>IcPFLw#Khd>N71Fa(er_HD=hm-iM@6(e4M?Es@f0`o;=4d-I3nILH?=b zT_LE_SY+8N<48I^pQw?iMuGTA=Zf4}8|uFl(b5~`OjnQS3B!!zn*-;*3!3i=A_)0S8`AN*hg*_9Ld!pWlQY# zDV^SIRDKUzuH((6jTb^JdxOw|(n#a$<)LqI@1OqtXU5S1P4WrU@dLg#{ZCT)IhvsxB>EBYf<*f3taU-5}wDWkhdx(_?cmoZ7$*SNu1+G z-^i{wC^hryGWKTk!edhP_L1)P_JmWg!GwF?ed)FCYhPl9=bkBjNw@?pz-s;iRx{ND zcG^~x46K{(*QGGanR}1hNNIxw_lJ;{h(bCD63)quPl??XjrKuHn&m5}Yio1s*wc>w z3UnJNNu+h3%3|9hbMK*-VHe|s1Z$aDF0uKqHmI(bDq-ljTTg}Yw>=-;rD{3UU%A}A zmNA%&0c-*!4ap}{*pEgPW>~X<++5c?!dP}^KNiSZ+c$lqV(|+lX__OADXuN@>vO-c zLV_*KERXFYvSy=Kmo5vTOCD^;b;Qkrx>0#Ws8B~t%Sn>OjbKIWO8I<}<+xcjwks|L z6!G|ZX|Fb)#&Ei+6t2`U6IpK&WzjPe+KGLW>Y8&q7y7m$Fr=bvyMYR?M34uDyfg^O`7nGx#Q{fEb1Q1Ab-h9eHUqO7k+)Ql;e#AH&s`El!oz z1CH%^>P3lT=KR-!GW3z+TwX#)3@cT_xSs83ruQG+c{5Ow%A&d-;P*}Y)f^<}j9 z#t^kF5FX}XwN=}twJD&InB<>O@Oa!#q1=%i#F4$|_2r8FQwRYIV>tWhs!ej$BvVV8 zw-r`LPspjuRF|}<#_{d#ve@M37ieMTr=2}(YAA2s9Wg-H2v6rR##Y3)6eBg7A6#l) zoO;}_BJ7*?gTE`8^uQoIBL=D7Mz5Hza52Z3lb(8R(R<=snx07~m9K8jYlHqqp9rrCX z#(MeL-i}{RY#tC;Z28JY6)~B=n`}*Axm#wphekh2wDak)p*n9k)IWUP;J5c<#VNT2 z?)dwsPMVcvPL~o7Z^lx-wu|>>ZprWbco&aIya-7w8t#l!)lTN|zvgaT(*<;r7<=e^ z{e^VB*g2-TVp>X@*q((x^W*Zn=whv7L#;7qqUpR)y5Ve5zp5$zO~5OS6=yW@ai46n zLV61{ScC)RR(EcV+RZ-_Z&-{6YdKagYCHw7{P|zpG|7K>?v!=KG?_NB;jd0B?VtxG z+AR_hdB<{gr=EucJ>1aT)>ZptrR)7Pb-?hjW@ z32fPA}|69FGdO6+~W#w7qxf5a!-q>$cW_4A6{6<8Q|m9w)MiH_-M z*51I{Pi)g+lO7O&TIOJhtln?3s$oIS&wAD6&tJ|!>*j9Hy+~i54o&iOaVJIdPB8;d zTpKE~w4kyHm^k755l+O{gPR|B2OkTpTFFaDRbuh?eSa87N}~Ytb_h|oEoCVfib4M^ zBl}eH6@NoY;+#huy8VSAz5`m4DtV#7*m~U4d1@*t~J*^WfPgZDVX8M)$v#$7IkGt?yS3 zu;fm#NqMAGawEO``8Z&UV_z{%p&iuXrl=o(0M=@r%IVhSYiSKi>ryYv?h>Q*oAH~| z;3C=WtD}`M-qkTaRg-u0WC(}FfOehc*0Ij*z8%|`*ghn9YsGdP-`w6z(Y3$<{Wgp< zay!o{*A9N>&h$TW4*T$Q8L;cXqwVZ2b>ZaM6<9~5l(%<*6aKc<8*b#$*W^i=I9-&Y zJ?#R}$5W4NP;|#Iovr_L&gf<|MbJp%^uyOUq=!dhzAx}!wUr&epv1mx9Df9^H5;}x z(xc9D>WwwGc489OaE!Dq7}^QX@0^b@?)#)&GNUVl z-}C=LkH8l4aE3|v@$MawM8ZbSqmysl^}(WEpSUoLP_PtxG1N8TJWq?$&x9Pb_@Q$n z;IJAzO_js3+35!l2J4gAz4L}Zd*<1W%E6C=78w62?ZVe2-Lt)q45-(3y4LSw@IDC2 z;~E0Cn(9fWUX5@2dGmHg+3A?rYmQCt-45+xfrS{CMBF-Xv+z&6HkZycTu0e%-&*C!0_H+^)w)0%RHg&C zjjW_TyOT)Z`ddO}dRK7PZ8R4m83Y)$@FsWPxZ{)W=ki&FNPr_DGE^DA(WI3ol9Ze} z3IHF(XXrHn00L@g$Pf+~_#jTttSKqN1dte*b%99$oCOT5A*Zj$ouWxIb}r&z3Q6j$ z{Li>jxx=3_a$x=i`OoBszsVE;|AO54%L4^G;UrUfmnAwvdE;!m+}a1GmjcKE0mDJ| z)s@}k6loST9MGxMx5&L=e$4jpy_?Lt_)!AQ&iJ}TVu(_&C)VLN-@X48S0B{fANic`S zh5GfWW>Yr6Wr@Nu;c^|~0wjU+1FHn!tbB^70yrzS7_XfGoXij4y1go$FZy7Y@4FSi z#{f*}M9l>-zW?ztuEy_X<-UH4T1#9{zIzq(j7V{Pv;@#4G65kdOwWjvPMpf*RF{>x z)CfJ2-;j-cVNReEKCG8F3`=9cNWNZuq6|n#5Hf!=KydT)DMV&v#@FMp?VH{_}f%@ zf$PlyFMHO6B8Q*^z}f+PP49^o;7*TriZUDZ&&C|7IOsK%{6X>Fp2!PF1hd2m=(jlG z0HD)^h<15(@-zaRk$r8a*s3k9wD-F*fU$7_-L?%{15O)aK-SsK3vQvT?-XkYm3_O( zt;d{10fzZ-H!;uugOhW@t;KrRj}TS*L;W)twUf?3(klZ*yMN$*xKY{f)J+`3P6q9Q zP0%H)=YW2NOu=UV8VBPJWpDdK*xl%q>FcdL#9yhP3T|IknWNeO_vcKuVLZdAnS6K1$u7Sokxy;f^m?l0FyQV zen)3i_CFaJm(deryr>~gn}c>q)o&=C!6Fil09eG^!{47M=ou`+%;(lSyXg03UGq=Q z#@On=i625&+r;9<-%mHWLl=oK`P={)$r`_#v!7r~`&-n`>1KdtQcK!g{q{lUH~Xa zkthHKxn3uH26X_}(mGkr7aiD{O^Kpd05$|bckJn8{Yw;VK0uVv^?^j-T;m`EU{D+Y zK*{Md28ENmPw%=BxW=Ur-EvWl)>|^803%%h>?j?xiRX3{wG= zuc{$>^beRyF;|%A-Y$c#uq%ENUaF8^6w1DHxF~>IiRR#=)?+eStV6w!Ue2;=3L17~ z(oLVPNfz?EA6;(qLeZ)|fF>0@$Az0k0`p@Yq*@lTm!s;|T?btRm$J5ojs5PG#@f8z z=vt4w6!0RVMx7Jv%x`#GDRO+UQZjBgUYveTtL?Mvd*$IdqO}8!sPVJ}jmv*37Dkr|=(M+36uSSZohX&LSWpF|n z1#r^O{1Hk39I2?Jvg;btwrdsxutwHgGlT@uRwowtilM{>;U_YzKa)bnhz1S}fMFjH z8K?k`ghDmzZvFkx4}X>8^LJXryCmIETAvi%+=}iessQ>(tR|TB0p$XaKHQ4>U3pLw zyiQBs0<;lFs&vHobPiX8-j~kAyNox!{UTRe*vStrr5Fi(bT=;@yw6iN^cDCi)ERd% z`rCFP`e7Yy)^?_Z1f$}nCivVC-w965WgJG3n#J=5{-%%EJ<~_D?6aZ{^z}Y$Rp`6i zMsJ`xep<8J=%nTk)AHJt+-Tcyhasdxqjokk#wn)7yBC+Vs#Qi#r^)(BbYLgm&TsKlXYeWIUf~NVD?5h zcl*Zl89kzw62-<7`>R}@>L(u0kL(-Y0%AL_&+Q{){Jq~2c~Zzc*gv6!Lc2X$eXk(zuI znA1;}6KDIF8gU8ro_CF&*FW8GBT|w{w^!exyCmZXRhierhqwhR*d2^kS#?Coce?Is ze{t3MXs&|_L+>SESq?E7#cg_Q7$JwxcR!BrAG90Lo}R&j`AL}IKDF0H#{Gsz&WhgY zH{B!lm0j+iV)eUn>~p0;BcRjFT^JyU4O421{VM!S1U(tSy*R(JrFUTXQ<}I{dx4Q> z>W(Vk`dY%qg9iNw%vM=%A{=$^`^wzbJ$24`RLmdi?4gehr>!zkDYp02=^@nsY#$UVX}y! z%_UCLN*#`o-2CGZ()ky7Ke7P7w2dR(Gl#gQrkJQvGJ)kDzWFb>(#w1iDbv#osYwa( zw|gzRsiYs>faki-eYs_h3<<$1Z6o)xFZKN8~U z)+e6$NY&eY5hG_xOcd9to$WQj0%HXJuD*vB1^;%rmE=st;RhH1@(dqoQCokgVQHmb z?P(OzYFK`)D|c10c46Qh*zhti)Exx8U<-`<8#+)%8W`ovShpWFy7rjbyS!p}N!5PF z)8pAPI}p)paj(66_(uq;4buWr=p?d4_p&+9pXFyL$V z^(T#}hx3H*PON4>q(4N{1264j{Vvo3$_tGO6uZT);7M&r#m-_-She;OjfdE?+VZt( zN1CSBvAyW)P7?X?wQ{X)^)X<;Gu|kAMUXse-KMB35Ik0=Oy%JnpcmI{6oz~j=#th$ zx@Hw(Gjrf{Q>m4EAKA?J$*&hvw=%J0cVCc4e=G{B#*db!M8-x_WYSPN4tVD~TwFpY z`!M(&G*FYOhFuyPL7JZ9I4AJs*V&w5N$q2%V4k?k_1sk4AeJ?hn92WBoPM%BU!#qO z9U5@M@yN4f5u8>RRj?JO+cND+vbeYuoL7;(?RXcV41$n-p@x}HTfzKX%t0wFN(dz; zv@yjHgG|2K!US_v0l7FG?%;)@YjbycN`kv+r5p4^x>yw=n*~Nw7*sQ5fZl?ojv^Wl zR6~a6C8aOA^)nNY+!ZoU|BCX2xEbo+yJ#unFf`_>Wbp5NAaH^LSMCQF{x0>}tH>F2 z59sk9@kJBFl@G!=Sx5|C?cko)E2h`EdGPRz4BWB^fjM-FY125zNZ)}RexdfeN(@{a zvkk6Lw;SqPDES5y($7wZm3_XO6QE9{Y%T1qATh)yNF2AIb5manlhixU)wAFZ)vz2U z?P;5w?^epmN`oT*aJ7vC3Yx9czRWSCUjvHw2T~mZ-L)@a%;=v=2V3lA>yW~Fi1M+O zB@bMZ1vq;ZE@m)u7(SS^0pDBPQBe(YEYi~z34$4Ksarlob&K*?Ow6r-{>peq;1miJ z5Nyi;@4tglDN9_`wcz*XIcrJ6-yi0Fh@iv*=p$d70%tt4pBlHgF4+&lCVDXquO|2T z_i;=if%jTLA%So40Ky7`I_(@@dAjOsaXGLUwM^6x`jy164g0MTGl{Occ`a*MU#?&d zI!Sk6e=o+xV)pZDpfP}2#wWO$4F<}r1C8-euB_hNga$rV+dS1dFU=?4wa7$poP3fxQ0fs5TD0K^ zRj;Qlbi{tilGlZ<*ZR=gnL^Z77su0j)ILgnuZ043V~AQ5aI5>iz%NO9? z<4*n2cl+-ZI*)W$y+-FPAR?|88%zK{>F@aWKl%voi&83KpKgyus^Y4q58gPIHgb5p zcA6(m5rVtDo!-JD2X#3Wn|T?`!^ntsv}EPEwJ&X<8E7UfC~V;1_%72W{|{q-9aVML zH2&iPf&zz>?o_%{q*J=P4h>S$Ehrq22I=kw>F$Goba#jn(n>eq_d&1gxu4H-ul4)= zA>XJ-ht6jW1bFTvsQ1TZAk^%8c|r-0yFo z+RTSWmX|OgIdh^&{%Mb;I4c$F1+9WvXZN33@6|&S zcVFFgAF6?tg|2!>RwQA22~kN=5644?^q)NeAc7ayU4?DEME=BQ)bpdOU#XLE8bm>YOflQUr(Hnk?+Fi z@*?VqYt$`#5CPi2|89KV^-=bSK&E~6O}{{?`@CP{WZMi)-fF*Uy&!&*U(MVIF{mc~ zJ4s+q0Psms%rIUL+rd1`a_9gXRf6xhM}$(8xzBrp$qy>VMxlm3CcO9G%nUMvo`i4W zFg^T2;a^%)NyL*M2kTSJRiK*Wwu91s?LnnP-!}d&{Bv0sy_6NxpY4Hdo9KjW_5Fx% zqVy%}q%H2|XrLOVKwD=z!gVTrN_+yCOa3}#;vMN^`&V+|?}4ndzS%^m-+%7}ih{j@ zfZo;Q_vP6ovdp0FWUAfl`~i0wA{Y%ut6>75!FU>J_1d_noOA!A?x^o$RO1$NkyW`P(D7Tm>Jc}mf zfKm@Bv8j6!z=l*o6v}|RPvRKqV%K+dDtz#UPr8|fHu3rmQRWBSNfP(e#Qpdn>9iWm zLK#B0KyiAcJRLYzqlQaALU*mwg;yoZ4UXOHjM3tGS*j|C0&VCq0QrDQ@m0-w%#S#< z$3mzy_zXZxqA*=gDFu8oKnzi#j#0%G7*~vb02T1m&|rTDn%x8mwX&4~zDJK(7~kKf zxU5*1Tx8UP99s=d?6){v2|(_n@&K~)L-QPMB@8X{I6e;6Jm)qAY;o?Y$+R&S1!WXl zIuvh}`B68?{KZ;PsG^hY5OKJ%={2gJ?SFgdNtNJ`qncOH5$%6A$biaV*|mfK7%lpk zqo&+HM~W&aG~%aBMDJGPHxnhQ8VT&>I6~atX4;6N8ffxB8{nn}M!?V;Mv9`(MD%L{ z#cHH6<80z=M(@_yE)!^~w?C^*q=%Q`6fwM)1fWK@C3M;H_DVgIrYaKCioWZxc2k<@ zP6-CELaJDW+L^|qDIo+YC4UtW6>IamUx+1SVRRaHAV+O3e32lkfD2mP*ES2dV(COW z+e(R#PxjugDXGw#-#H?d5QRMt<=LU8C#ro+o!yJRnvl0+e3hQqsO zu*v3zQBAnjfnQet8kJ=A3p*U?ePRf0F3`5;%n`d(7=aXC07I4hp=In;g-qaOu~Ts5 zz%T_e2001-K#ScV&|-J>pI8l}zgP|bry&n*wk{uakCM;wW7CMVKPqY90HBTp|J;K3 znY}d>i8c%gY)OI381#sU1miO^36}Ymn2}n>$NY6Kgy1vJnkubcXXhB<)axkg`T&3h=$?tVdK$DDL1j#%K7w6L!(oTA1`tS& z)FlJPv5kL!&S}R52qg4C+gwcEqEy6uK4=|iunYO)s$Bn^iGdq1 zs=6SaO34BN=G(E>&xqkq;S-8z!>o-$0RGFye}%Pl>WsNo@fyCXN#CP8x#W)cL}DbX zQxR6Oczc%ie1p9!4RN|()}w?fX%o-u){AL3O-rNI4!6*Je93s^{a^e6>I033UXCla zua=mGm%AD}xnrk7-tFtW38v7ZIKgtHN+x5qP zD`+hZEQFn+|G-CpQ}hpf#7y)7KGF`rN4|iJ80xpP;}2a_M4n-WLl_vUhJeZxXfzE4 zcIX&HG{g7fBF(A*TnECQ$0JyOlny%~5ty(v{xsI^%v*2b#gQ>{r^4gfr0# zQ`$%A4`2^K@DEb!F9D?g{X=LQ&^OVrLy1%YlES6pe{}K#J=cFa`KeGJny7v9*EMlC z(e`^PO$%T1nM^7*ON^U{ZQOMlyCbOqYr+0Ne{M0aC(H z2Vf*Z%Yt)cVdoYwsn*B20WSGdfTX32-NKgv_XYb-E3|)s6T7ghMDK_H-(GT1$_@h< zi@*YzyvGu4pEzHOq_f}yW+l$J3d3UX!n)nd&nN))iiY^ZT8_N0coXz{q>XkI#{eI- zVXKuC#mIVa%bb)yYF15y=~=(EGTJMXj46bP9{@g(EnKP9!+$ zVkO2e=HDtGW9jyM)y;`gFG#28K$aa*n|a@aoaOjA)XL1h1x_wP;sGjx^^jF><+!ki zYKbNIxT|wA9=Hp5?hH9G4=B(42UrNoL$>q)*VSMnI?tk6|RA4BfNXWy%c7Pp0!?lm3qj;&A ztOTo|{r?@88=G6*)wcq{?M=<=b&Zk@t^K{$4k-HHF-Ame+Uf|@H9BXXu{^3@u`ZuU~Jej>91#R~p?%)fUo zNj%^JO!em=I!ZJQ&;;I^C}*~-a37s|;j$4SFd=J9>xPM5sKS~>=oa`f!LY&6XxQ=- zYJpg&Rx|zT{}5i466&xB=L1ST$;7j#5l>?9AHwFTniH}ugga0`u-+sK7#s-*rN620 zH?7Sc(i&g|($*2qsCNR+_f;{WriZI0w2mILT@wGjI+w4EH@Z5=no6% zs9m%Q1|O-eI_;bv|ArX)7(N+W&I2GC`~*CJ?5Y9Vt{#`jGW`$G0Q2{FYs2I4KooOX z#!G->QC8R+i=qK+8U!%(LA$p)s5=p;A&Vx`3wi@&q93-61o}D&J}BY$47aNH*#NUh z_a77y;Xf!Mu{=*k5CIkqCv75*rMCEY0Kh`LQ{rzy@u#!qU-V0WbKYp*>`^OI)b9e1 z?7>-QL*j3olCyUAN3HE-80P$4Y1F`36#VBby4DqjY!!~;_}b$-@MhAZY?9CyO#vvk z2Iss7l-rmDwT@zo=#CmSBdM$;_#w`7xMpDFsy{@kk(h@#7kd_A#=nnLtfV}V{ojaG zi~OoEgxqVZoEWCUWr|b!RR+=rSO`F~`WM;*35~GdkWqMAne=H~0vyC|hghtHR^~#7 z7-VgcEtwYjw5)jlF^Oo5>M7AzVBE+tDnl%VlbDU#XL&-RuY&=W$@wFk|A7PN_aFF(;J@&Z$Org{8RrHn|H!X=s!TH7d1ZV= zF1RkMqCZW^`rMii;mtqs5Z;{m2{=Hv?88Eo03;ml{{!J!mwABj3;_(9G=M>)6hTY; z2kh~m5FQu-gv1&K*NRP!l?w$3Ain`r1{x4poS1(?up6LO{^3hGikY%DD`4!XyqySpo0|5v)H&szTI2QDK(UrJJ z=e(tG$^(!-L^2k#%=9CUke)(=GTWkkr0|(Xe-LDjNcCg@Akyyt4=-Jv;XI&<_$Oef zA~Q~3@`I4K5KbB)!P@F<1_m}S7zk|I1_K@p(*LtneIwca%N|jR5gc=U*21*AaR6is z^WMv&BZ?875VbszKzB9{V}A|&N{9WAba^4QlRC}R*+ID%$?*IVC=7NQm6N-e#h3nK zX&x3|sr%@OpZeg*u&5W{;hlZ>kK0KA>~`|Fm@uF_-PYnYO%FYzj5kMxST=)J(hH!} zqW=R@d>sFP3h{YBh5YYZQNSOh$UnED2RYzY1RzBifLqpT9PaunR2p;!OVqIcbt`%p z7q}GxY*QS{$i5g*&$YqJEIoK%instiymMNtXv=Eoqs z9-Z7G*Q%XQ3nCi^_7N-Sn^Uv zNMRpUTuJ&>e;5+0@oS2JkLukiJOEl}uk=xoFAJMD{J)TlQ|;Ok8&iL1PSc~8%C9N> zK5E9MxCJQ}N@-qA(xQgXBSJHCR0nR>P}I5c@^S2@q*b}B;N--DSnCGLk^ti2IB_k%xPc@kfgPeJ^@ERPjiz zQ)N>2fpE9-BquH>{YECZR|-|zn}aHGZ&}820r!2{!ZY#!rE4GK`B*W@4h9?Y!S$+* zAef)pObdl_vcV{o?*HdrglO^41+o=aSzXZWvWdqQ&5?!61D64rhIw3;Zn7eJb*dl5 ztJy4o{eNAI;{INYa^BNsJ0-}_##pO8b>N7ND`bGTkn{i25qhPmJWO7IqlO__Y){O6 zM2$t%>YpDFPHXbfbOA3mm7|g>gQvOE7Uf^`%e3iu3Ge`h^6G|C_TOS&GgsZ|+w}bmO2LDdYk}^v>`POxMd8HIjz^l zW%K(_B>o^u(x2dxi?F}2rjH2ZfMOh_zDM=~C^vuP)Hzyi{fnfiU?`LHrw?*(=p%Xn zIqbBvikyrGP{{ua9vKJ>RRn)mSW!h`OeVC5UOO2>@h+juvcT7#qW{>FvScXo4CkZ9 zVWCZ-m?V;NEu$m7uLLI)RW|jasj1I9i73GKfO@8Rniw=@(r*#dQs0 z&R6|9RJkr2K6$6{ZBh#VXTqa|$I}v}079~h#G+xAS)IB7n7m=05dtthQUl|SeO$% zEK6@(5>p8%&qnVO{Je2M-afCcUwzq;7nK*(kJ0?%WfS{$_)c zDlwUC3WX+=i;4+50f|%keUm03qfH;uE_ObX3h*b^BV{U%XJujgA3-rwObG7t*ex#G|H zex-x52e0c?g?Gtd)%SQ8C!ayZ0&_S~UNa))AiViylP+4;rl)dg6kT;lWxp2DQ0mxV z{s8_tP&*j^jaj6t|NIq=9c3r)By|$nqKAhVrBO}`KwdUQF z8I~||k-)Q$B{7roDx)tdQ^dhs1aGLqad6bXiam-5&@R)^3|(;bU(S0Te(_bbEk#Dt zF5M#hrAQNxt|S%?=o*0$@v%lVridwpCV>vU%`DtmLJHgW7f)R6sdTtKQ`mQ&Y%Exj zXee{wNfFS~(Z$9;B0{L@?w3_*L9d*g3d9oTFN%8hwPa&5T*aNPazSQ|hX9rO{|xV2 z_%OUdx{M}TmPNRiq_qiGe77ANo|HB{MNw=JOsRHh8D`ytdW- zxzeaulHy;mJyTJqK|^y132oB-O6fF{ohp4d`8sR3E zglXM`__qw)nYNvse(HEDl)9Q_D+<@JDLb3eT=sa&K7Y*@Z!K~<<#joRsH}TU%z`@& zSj!TpH)5n&b}-EsY+ks2n(`i)wo%K!^w*?+yP4D3Ps}ky6S8Tu(T5tBK|C|RbJb5x zcpApxz@6AEw8}nKsgFtEDGq6RJgyyagW0qTIc;hdI+BsP%^lJkE;vx- zDp>e#1(wtoV~poh``9?7OEp9-vw2!tE&i>Xzp6o7`#q6Zgc#;aQ7ENu8GChfkYr=6I*{~_dj@IFh4!3x2Tl@-w zZgx)$Dm=AA|F2YH?BQw4t-abqBmolxGRM3eAvKHg0`+ql(lQ`z3cfMjxw}p7z@UG&56$_ zutKxz30|&diF)Ovg26DU2`x#@JJ77*A_7|rWogKgG*Pe}K|q|yIZe8k>`tR-yXkiJ zn*q`sJ2K`gHb$8eHcu z45!&i@3*O)RxeF7M0WGP=$=kcF;L(pQ@5b*J?M!jYg~M?3Yt%A*(E& z3B;1dwkp+Vwkpl%wkrLiTQ|+XKp93IPJ@HHEels3pbK8lFEYTGGkVh~<8vlh%Gs zQ8Ez(uZvKpUD^ud3|zCl0=`wAf4d%SX}jLl`*uAhjn(q^*e36c&Hal8G~lgJYf%{K zzwG6YBI&D1k`NXlY8B@oCe~*mY7sCu{vwJt$C5$`Ez!^RZYte`(y-_~8({7G+X?PnTSwFI^1CnqozxSg@s|Dw+bx3@S9ESg1bf z*7YPuP;okMvt?!xmBvs~x!+b=7|cpn*p5|%4UJd45z02eFCDKKMDf>cgNaf*{{%!+ zO5-0y+y96*0isQSsB>cJbkkse))ZW%Ehb^Ic<|-pY3&FQR?}{9-LGaLC-V=_4b3W^ z8`dBzwCa~VH+=lO&gmm3p`^ukN+@6|(;ritf!-&;RAE+ZY2nZFfqsT%Qo^jaPwH$w zauQ2QZH|G3M7gyX#U&1|z!7Z~QTp>)b@<7-b+bNVZ&(d9-mo%0vN^?;<_QTO%7*&9 zx2e#CgfAUKy?ky%Q}h#8e;#ebH#ht2R~s6%>zA<@8P0xK2x{Z2*uy2zI#UKGo{fc1 z_hSUK*lV|Z9;DXdu(^<2vAW>?H1;cO+Ug?zHcOM~?epAz8IqSn&p&ROZ1fQ`3i6g6 z&u+vp5}w>qy*;^0QTTbAU%Ydhf1jnv{MPJ4e?LsNXw$~Lzh6+e40-M}hLN}yj@r2v zE>+12Vbi7#j+2AV)t{PJ;_vJZ+vy*sciZ_eJ?bQPl3eOJTQO-i{8DOyfY;^v-{qxZ zl0Ev_60-=yV#wj$mn&z!o$v~5JYl%wnP2i_mmg$1cCBtYH(A)^7uF3q(`VmB>z%N= z)R1Sh#dzscCVu5IPv|s2S?JsyX5LlCubo6MIc9$~Ln5!!69Y$NAJ35DY>i6f88m)` z`Wa3K-+!OOS#Xg>e$i*5h#j{G&t|L^o|NA3GWJ$?p)&G#BdXQWIBy|DF z1z_|GR4AMd$^RYw^~2~~D?o~F11WmaEme01OVKBMu_EgEsED;lHdT0@^fsdi4$ta8 zKRJ>?7;cayh-l`L7Hrcl*))2L7zqEpUraQf<*blbAApfwf0(phbb~Ad{8_&1l zLP{#J!q+#q5WjT#F09jElM0-dQz=7C^%INMnR`NQy@GIs!S<*>9(BP!h9|{kn5On* zLbdLG!cUnIud!Ox%nY4$^O?FcH;2S}2Kfxr-WIrf05PJWpV+Q>6FbEVsFXUxL9&GF z1Bfv(ye>&{$`R8t$^qUM9xau{)LJY%Z5xD@M6Q6^Q>Qvzf6rc!O&z>6OXyH-K2$!| zipjzc1;}b*hypBCj+wEgODpCBdx2DW#s*830O~)f!ULoVwYYx$$<40>@FXm){eWC8 z19G(v$W^2vAXh~z{wG(5LAXG!@}i}}aurYCED~aH{Cc@fzf8&)ma75O$xnw`^I_YH z;XIWv;z9G89n`H&rXozvW$pV*9Kn`N?3X^C%jCnIwMJt$wBhPFcv{<-;KY;Yp=lYV zS*QVL>)Sbbs=j4(?zL{3+P#H%K_VaP;*#$G#6v+dQ!_Qy!quVhI5@IAGVXDU*7Svcw5Z4ZiIqY;;n2!7?GW zSdkp~+^9@SoDKeyZh2=+7}aral1tKS?BOr{7!BiI_8!-jUxD1V`Xc$=YKc2_Y*S8c z8e9Hev|RVw08&g0ze|#W^6+#&W{kI=2SU~A0fH8fRj=fx)iQVH*iXO)6u^cZ3ax+l zm@*4U=+Y@vH)L|&{tAy|K!8}}JZd|szH6m7Rncv7V$!gec<3s)PL;XqDRR;B>%J&o z!Ng?NAH&Sl*4s`;cCG$1f=okcR5q->Z^$4_6a9~t8)F!V+`%YbK6R?YohYwEV*O>? zO{i4tl+?1+llUd446kN*KstFba957h8nt`fI4FNvVl|$?L z>2uB|8X(|)stC|n0C91S4t_z_XRWhhI07Mr9GWaj^8XQits<~pqd`#eNL;wtfm-Es zyBo{p#3oz!9d3-W_a}&3k9xvFIz*(94LdX`eW?63L5hrc`+_~S0@u%O%#$M|$w^iw zBnfsAT0{1D+WJCj?9lvvy7y$@}Ml3#r<2{V104S{#P6c>02$Z%1R3|CN%4XYAubMfNIayQ%2bB!T^4?6aw`0J z_^$-xP-@NRKg%^Hta|c=e=dB{<-VX|qJQ%^{1r|jzg!^y<1avu3Qm({5HErnX_cy| zR(Z7)DhsJtN5xD|U1INtYT3?y@wYLY5=r99L(~0=G2WUU#B9@8jJPM03~#trCn#NZ zfNjl-5D$kaB>u^FD$5YI;4FgDKl3$ac3Sd9e~y1qtvjY-pbvW- z&V`dmAB=ST#H%W)iQaMasl#nPpNaW>JuIT(~`vzGrms|>sHNJM`fgtdu@x?%$ zZBw&B+X!6C)Q4MIk)CWw@>N!JSd7o=h8QesXD7%` zzS}S_xNX0rlY<$IPcI%wNYkYszT^n}UQA%ag(^uEhv?_BSSeFxG%{=|!{OZp#{Kr{ zZC}UD_H~EP_3rt*+l@luyI-Ti_eX$thuRl2_@?6?6`++Mp^-(M|`cHCWTWp>=3Tr0f0x$U@tu7UtA%EtZ8e$7b(Fa-I# zySvZAQmscyewX~W!orcz)%#!jnRge^UA^0}k&YU}&tjVnTEVBY%fq7Ed-TRaTQ>w} zo@8!a;WO;h&vQ=*>!TuPC=K@F6r*`P;1mh%f3!(go`6;T-k#6b`vi&T-5$;oHytr= zwjh+nI!*HXj->61AHDm$Kyz2~(}Vlocln<5yD*~73<~**48qVsC*$fS*$$dcWBQuV z@OF+KRt^6~n$$J6puPJyM7oBEWvQO}2Bqx%w=J|ofw?S} zCTTT5>wraxjTDzl7%FH$jbKr`{t0zY?gaP(e%27LTPpVAN_|j$-%WykQjIYfu`# z&_8An;O-WX4Ubg%Y=Pq@mIavPY$(JC(q`5i$7UJPS^y$r^C zJkRUf+EDG35Ore}nVeMLv{(8uM7OLJcrIm{Qrw?cE1uF76B9Nw{sKI!-f8SArUx;a z_`;dtp2YK&zx;=7p9o~J{eTaNLwCltx1J*E{%{Zb)3rpyi>e=Xdi`EQ4qxLljq-KZ zr46Dko46eZ?suPGb|jiF{N8f-$piBO+p4jvs2)UP0`XYj*8oNtHVMY{@u=fsJ@UId zLT0)4oQZacs9RDGxROV`_NFF_i!Ebk>RGf}e&IZ6$7EYYnaSa5SBgF|cZcQ~(l?jH z|BtCbC@$aP$=7N56wbCX*Xr$CLH%^;uN3C+)_((|n>c0uJfm@IwL{g3x@2w|IBr=> zJL9t~A4Tr7PU?GtTPc4Gq3)bF@JDZbssdklJ{`p~BN=;=jUwn3PanNB+PD~_{4=5b zH@?*Hrou*$_Ch)nOZ&?csxKRfU3~>}H@`W!dU3VGD!gUPmy}4K5k~yr@B8=$Zmppjg5S<%@Xp|gsp2kyP4 zJM*;#d8$O?8JJ61@CBQ8fn!;vC%3fIhVUx$KGWD+?$P%Pv_93r%x!qFpgr@N9CadF zEBV`Nmx^~2D$(){+XNm-X7!-!0cekQT%I_qD$bX0rfRl#9)v`>49v~47^{wHeF0D! zqk%|o`)@7O=Fu!_JJ~J{mV3nmFul0B4Xg{=cdyAyC$c>YxhKtQbIg)P;ymA~%=vXQ&&j`-)Jn^)uJr%>uiX3OEC`PSCBmQRx0fHx&2K|(xVHlq@=*+VCC zN?$RK-lhtmNBI;B6nxs`d&MC`9{dCY!&FIQWlgfbguwT}wzv04=}J2uy={PE+KYsk zmEF)lH@M>H7m~Z|{SP1cu;n+jlfyIaUbmSQ!{?f_VBtjRxL;gK$4vPfEPL83NLg`@ zjeLFLldA#+dn~*3u3nt796#fSdamyJZb}D0OU|bI@ZUBCr;bdYSqiNA3ZJDDal9Jk z-PZzI!Ep4_N%#_gm&xRjaL)(naql_R@ZQdZ}v%ei!r=ii*cEY zrsY+@WjyZML4csFro+vq9Ap&laPiVsi`LA8%(9|m3I+C+=i#xG72!ef!5aI3elt&a zbN-2~%tWRi^rVTXIB|NvChdb$U_;wF{aHiS=l?zt&L zRc}b81g3zw*}6WHTE^5m5c@M3&4yP4HG5lo=7TOJ#}brTOD|bEPFeC{Hcm4Y#mlR# zl>#=pv^P)fXdJS!zHv?~|56UF{lNrv9$hUMW4PEcElp(G32LmyMIq6w`z%!NRnGro zzwF&rWS@&v$d9rW>kM9j5!k@o&+2n1IhNx8PR0JT{badg-NOhn9a#e!wIgxc!Sw+Q zS0Hc|*Ka~aL@!;?BG+54k3C}Zoaay|ykd;3@$&W}RM>_Z8rX27+R&=0Uz7}!;-!CP zsq>m{0UBQJYrb5+LU&6u_o(>sQl%8|%55trn-V)NzU7C%e#x}h44>3-b51i)!vK?5 zo+h|iuLaHc19qn%>y2X)9?1UV7cYcY`}?kg9+|yg0Q)9Yd>7t6hs`#XZ3oimg#UN8 z&7}Mr<|J*l$&riA-}p+;yJox4xw-(u=L5@aLqN{?onWl%9aTo%Hp}+m8hqv-f~#bC z??ICqrzTHQVasOKO-J;7K<{tFgt~2pZ@IYcXbkdoJ$s_p7SPV(R*4M6LCJGl4RNzZ z#(&&$K)k=WLSh$mSjUd56_%Va=`!~l>FVme-tSHo!QS34Y%W~2C4RnLx3U5a^DM`$ zwS(k0@2p+POcB0`b;bF0s``+Y%K;2Cfr3tVp)>hyQBE#cI>fbFm`_ zp7ceRnb9uw#kb|cd5(%($)lv72GkF7N9@eCKfATuFo77s2;# zbkqA_@$N0?nrq3_(>onb>38HY!JtxFp8CjJ8m14WyBQ;0c;8QDdKEXeDye=p`+&A@ zTvm&|P4~?UqeSKd$VT=6qy^RysM0j|R&=F@(De644Y6 zGu8982p00gclnlob0LU%_7oDfFgtdPHWok!>Zn7Tagg69UM-slKHNo@P`EH)c7TTj zR55=&X1*O!M^977nm$gRQ`r*C4&PEE4YB#9&!CS5I;{Piea*C!o{b0mSs`sD{<=45 zDYB%B9s-zk-@aC)ArqW^sizsWJ`hl2_5h1%envKtGY|;mGW_I15!$sIQz^+dG}#Wx zV2nYR;P*JSsx)k}UTy6DB&5&lMlsO!M#}RU8z|iFbw=qI_X4MH%^5|8T78jkFG;%{ zU*C@?qv($WQ+IXq*jfKC21W3KWMA`;mW>j#fw3QMI^bW6LLWly9+qa|O(3%MCHBgae&= zcSyVYZgxZs8~My*rB76lR(>YZ!$F(o64sl(+>fXu3B^&Cj*6Se3GyOa`;bir&>?1i z31of`&N$;fc@+d0{y}L3G*hU#;O>!O|Jo=^3nPcb$ME?-OOm&jUQFUs_F9viu{YuO z347ey$4voo=3iW#Ovrfc)^g&b&O_)Dv=?*p#=h&NcEMZYl~agbrxXlb!Nb+G#vb^K zv9F?%SCbjKdLLC^$r~ne|K2m475<6*Qv~P3?W5)!l%mqwx!JKv>f=9T`wSL#KXJ=TBjf@eTFW2E)u)K+GLj4{oYDqkLM zb2S89iW(h(`?B@Xc#H(3s{6H?zy#jD3>v+f|F(k{aYlQ!WtpQ-LY!uwGZFi!$^8{R=9#JTgq5sh;0TP<@@Se=# zk9TqhqEOSYyGqM3MX@K;Yfnryy}a0*8SB;cQo|rX$4)C^XRDd!foC5thQ68vbuP{4S1R+vFdX}sO_STnVYsycXu;|*^Kzs z-8D5;Gx+5hrH9bowvWvrB3+}Iv{%{^`n|?S84Eb~Su@L}1wNXn(U{XXzT`8p?|%-P zE^KWHS%{h**47gOl2)wQD6}`d3-_v^7%**&G2(>Sc1Q2Qiz9|D9I?ha?arL@thnX}wcD8z^{}z}LWcfKj z@vTxJO^n?F8id3ume4~Nj5_#G#l@lfLQtO&GkQW$UkH3GukpW}`+i_1WcU*(3^hPb z-HsCayL782J45jqMiLWC(&v>=lzkfn?WMxiTKU)?LDmGLb{TLh^*lx+5riJT-Z5-mXAH&)~bXr4Ucfxwg8kG3O#`%ERD@|$U&#kt1zzIXY_Y1Zg4 zT;!F0Oe{@oFtkF7aG1mQ1_FvO%%cktCFUTJMze+V(#eFG^gF(Kn-r(hLE8~=9;uE5 z-vE`Gj+l?m?h1>RWFMe}R#)A864J~U&&2D!)y6QoR?MvLbzRd2`fwKUuSK{wb3Z74 zzMrf+G=&84TWHtTe}K@Ip94FDFj|?n=a2oxtTk0X?=nKJCB;-1u1!;jBJ0>WB{bNn zx6*cXgaEJjkQ0JdpVBc(fH$~64>hqDFeex*1QFYsduMWhhUlRsU0a~iCAX2W;^{rR zkxH*kXUL*8XJoI>z!*K_nULv)awI{*@*)cqFFvP-k-91HqgQ@~8y$1WHIbi{){ zl$#ui1IC$YbC-=$TkW6$l^5f}brSegA;#R1)BJ*soWo_Hx-E)8DDD}={MxO%QpPuv z&9*Xr-?zI`dj>Gld65w6FJwAr%(%E14ptr^&_v#SQV1$t2ySbhl0D-w*JchYs;(#G z@JSjbATn!Oc>y9HfP+@M3m9vgwPO(Q%nh6h8Ed!NNQ1&k_d~!U+1J_E-HLVi~^%uXe?RU{CCb7!TEwy<4h2kcI0B1GBoW=6stY(q8~B z<@P3L1r7b~E&<Yvt-DA~CFpO)g(NzuXJQS1cV}ijV1HzW0+6 zF!X@Bwf^cYjlf?~@ooL3IW~g-JoCKavfFpyHW3&L4VWPDwa*&q^cJcf#!Y?C{fJBl z>I6DLr1RaEaJNoJCf=RZCm`ZG5W&GD&p8rEE>WM;s4<>C$*tXSXcV+?*}Xs1(LFzc zU%(oEY}fg#|2rVA=Yv78`2_5M0NLhnw0i>DRg$>$2b&MG8UHCeMSrLxK*aB8B{NxH zC1hWQY>zKod6Re_|BfYo3skDTTd0TRclB`MZ1M!{<8rmh>^M`=;Q7U1P*}fPe`P>o ztZgu;MpDRBJN$$YDw4)-OJOrPLVz?C4xZ;}H^@g{T_6pquBC=dC;K0<)^i6^Lh*8_ zge>R^_@UM1ql9>#`)ObVm1wsSHh~|ekS{{yoS;B{=&COtLg7iY1xIRJN6LB+LUloDJXCsMtFi)+d(Q3GbthH~BUjwFa*-|h} zC=ww}R|KH#@DRo0fvGhvbE2Gr(^v& zSOC{11M|Tip32VZMIUSza??JkGYv+Q;9jVL+D0gm;@$h~uwfRW69Ya_3x?x%)vhPy zbJ3oDC?O}%N&hjW7iJ3Ahv4@qub8eE*1<8e@?hbc z5lWpjojlU`2$s|w8@EJ5b^y|E(>iKIGGU4j66EH5)3MR zcldU;J2$ZqGAA3-HcFszzmS{YyzElo@O+PU)pY49`t9kVpnX#s|7c-L8-y>kdV8D9 zf%3=Bs`pavI=e9QB6p9Dn62S!(LbZz^)!Jr>n29hM>2zNQ3v`%zr{F{yWXiL4GmAk z`D7NkWs%~cj7d~H88Rb_I-Lt8@AAsUdr8F=vrEaDPIe{KI&zF^lZ~76(I6_-w-!6W zqVL2~Siwj+tQ=Ee&+Ausm@h;4sfb>}DXL8sObR30wI&KuMP}FM<|BHGz#_&~wF|CA zJFpd8AK8qOm@;9Mc;@|?oUTT?IC%M$!#|4nxHAt-1y9acvm`bBpF0VrrHq~zlX>-3 z`iU~vi*c>KIQ6#?S}*kar7-y$vFC8H7)X^rG{Y2%%-KN4HEQiVJP93o0}9jVZ8Cimx`NZ*M1r=ZyTFo=sc?G;CoDZhuY>lvbUcRphzLC6 z=;2+|e0OQ89|}(c59~Bul@O6=wtW_A2hCzsczV}A8&UGsoK$9^8&p&O2|L_bos2(M zQ$fMjj@qZdbBB!**W`!f5s_rQs}fULKVse>;50a|iC z-KW`dB^v(@gB)k#Bfjv=`J2>*|j^#k#XQGGADr48CVJ?&Gi>CX8^$0J|Do^`eZ z%Uwc1!TDX_>1*II$e>BkXPqz+c({AhzRHAr`rO5{>HYe{!`%zpd~q{ECghP4*gF=0 zeA;V27-nz4n}xjPLf%jjZLcj@f|U;g$a))?gmmn}3- z&uS5E`0vw| zDyYHVh1t<0yZ!uQoW!}#Ijglwn#d+tv>grfuqqD|`Hxju$g08^X4hH}ID1=VT2UL2 z=d3QU33~{vdse?d$w88U6s&Owynwmohgp0TesMeh-FIpKr21?pj`y`p1*}+b>DGKH zkxb-78?mq#E?c^Xo|euHG-LKdX24rgI{eXLc)*c{TVb zhoZP~adlwu1r6cJDPqG_fF2y7ft1>7@zR4?{2Ql?|?h==%_6yVFNCou+@4nE|;UxR2o zMmErplu3aVJKxU(%ixo*XT~dSjnf4C?~%g0=_|fMyuxgQx2q@F z2Tv@-bCV4G_$}Fq{k)%2R_c}L43f1UDq&3iA`w&>aMH?J>NeSP;`JWVqKY2xq%%)6 z8qpbmtfH%iEEU)$R1fZ^-}fZu3bGwP3vfB*xD3$Acos(-Q_y2QRSg^89P03l^0A*d zPuTp%`KNHOjgX%(W9DI^7`<1)uKGJ8`amwWlKG89XU&?mhF~134*JyTy`!seE0Rrf z>(FF!(v4N)a|F&w?sVoB^baZnWbL4u=tzg_EI36uw!t~*c})dasP8Ok$cHR(IqIv^ z3!jnmb&A{ol`k+)g`#yV=VB5n%$J!Y&K8FJs2sBNmftK4yLKD$lTWaWw3ZWoPD~WE zcQnW^H~(u<;%UHY^stHB<*mAlc4V92bI!~{^E1=xSK1*IwA3{0AKK#Y5Q`hKg^@iXdSn?m^upcOlFC*=!I|j3aa>->%+L*yIFP&H*KE(vi1w8yy#nvb;0KCzE0tb z--6AXn4K#|MQ`Zd5&?<^`Ah#@C>yuS<;6tH`TByCXXN*Egq+|b%WK{ zRms~t%%8|p(f*r}Oyq^Gwo$_qcHAJpQ{WVjX#G7|`EShmPEnK=Kg8Vhxaq={6^f4G zecIV?D95B-hPyD+-;jreoXFFF>1ZJ2E(QIfN3I*rDw)v6tjT`_6@(GDB+hmJ8*gN) zAvXmN@s?P#)v!|wEYFscZH-YMj_zu-iENq_;5nxe8=e~;EU|CAW;K8lMvK=i_xHj4 zc+W>xJXn}jU5%(6fnrwXHWm=+k@$AE}vWrHW$y0hPjcF z*pC?4m58c!fauGxoT(8;x%SCW%&Z|#5dVE$yZDhgToty0Uu-Y-DTDeQ24E}L{Ep2` zaKX~h++~liU=m|czTqTj^PSdz^JDYk>l=ZSV|x<*n+Z;6c`FMG7oXR_9PqLu`?GeT zcNq$PDtYQvd&e@`NGk43v6;%$$It9WVv!W zKFEeL`^|=kHn2@OtohXH7OV01-0jtR&0T`tT|Ou*by%>k3%wCZ$Q&j*FawCv^c(a` z&Np8)Uw`VW;s0jCcyxdtL1^E{{!6?XthC$=Yz58Sjm=WXYpfeNjt2VggxGo0c$u{} zEHMk;a_PUcfPiZdDgu-?V3GsejSEP~NBB-EO)TvP#r{?F`uq2*w^x-*lKk#1$Fr4% zj6f)GxWw+}N&UYI993{5u70eCX_L&7voo zH_9w9EKUV5EZtLgdOX+N?^o2bleHtmSXzFiUi|I?-(|PtUa~h(1C##OJxIvaz@!^k zDn4r^FBtZZdRNz4dkr~e^0YY5vemJ<{W2#Adh=_Nhwj0RPJkQ9{ZbNZ_`eUZ&XsT3 zO6zYsCr54l^vPHwo}#`%2O`4>tvz#9?)^=WzIsL2=WAM7g&#jGeKC|KzbDNLefBFH zNhT9>`DLDzxE7gteU~kw^%Zka?iX46Kxyh`)Bc;i@zT5Mxx1Oki>d<4I{5$r*Z`ar({2R4-CRe=2)@x%_Ygd0(42-gDN(MP%h}Il3+y zWtf*l^;Y)9H;hscXfX|Fi$x_K=A{I6L2B~4hS?A#OCMW2RmF;|}Pj; zimrl{noZqWIGbU|zH!!Hv)$w#66)y0QicV(2Yzs7X;Fcof;IAzs7wvAz*~TokD(Sx z`v1}O)^SyRPq?rsAR!&nNOz~Cba!`mcZYzKga`+u8xBaPG|~;y90Wup4k6Nw?>_jg zd++c4Px-7p>shnbteH9cnc30r7b7fu3$F%TRcGQQIhHTc)o?Q9XxdA~a)UT{u6OF~ zW__YFT(NoDv7S9`1cV?qK2gJ&KqDSgl7V>n(gqZ>!rnMxW#Xg5elQ5odBQ<=i>`)| zc|hAQ^}8Fwm&l3FC<8^~K3`ko9|#J$xF&VJswR_^+plC_S9(*pV`@)c#hi}O9AzEIt-fzjV1wjnknQS@KByd76W*0 z-v*)ew}DnE7|jp+DBIVh&-ULoYYSiRJL$sYWY+W$e|A;9A@W~+J@*=nyk=xw)5)WF zGqBuWgyF)n_X?O^7k_mp$ZFkm-+_Kr>m1$hjDJ1b>G0j$&8M}ibG!Xu3&Wka7b8+c zzB()FtOFcIX4%ZP??_z z_M)Kq{C1lXYkrkYW2O7eh2$v=wt<4fLBl_m!Hxas~ zo+g^*RAhB;gP`H3F_ekXi=+HOM9wr@-$1~lH(80D8?)rMBKRx4=;TdQzX=Zu@9mo^ z_YJxP$W;1wI>DMULRO`)XU&R_qoX_GOx6sstNPZvWb&VFCY{#h+ z8GWi8Y}6IVpH>lIJ*4NUTR`N-GI}_i=Yq%Si=X(3VF#6prnHH zy2;8snHWLe{AiHmHMs`dfKo2{hNei^{9O@)-GXOCE?qlQuE(bGQz85YedKZbYhe1Q0OXKV8Wvc%BiT!m&#ReP~#i+m00%} z4=2Xnhf7MJ7N3y8p6%xL)&`n=j>#0$m@~Id!e!K#0*@H{IYB{Kg~aV0%bBP9FB}yy zrfBvbGK#cBZJ7+yF^xmAY5_~zUkW>Xuq7*~oBZDoChu3~piSI1kuLbpM<+KN*MsdY z+<1}^Dqr-xBj-p0d-G`&0jtECI2K%5tABrJBiSc!UTqUt-|08{%v^xS5IStELgAL7 zZ+%&E>pIkf?CxM%rla_SFf)@zJ*Id_Ml7IZ+w5D5kGo_A$%OxLGvz{I4vq6I(L{3d zm8bilnD=b`#5glzgFBK$aGzyCZCg5JcKeWqbSz|4M3i~Wzf``jb&F^>{lz_FNq(TR zQfUxr?%7vt8+QiRrJ&|&i&uYEXjo|P)0PENuF{fj<=wZ+UE6X!pU8}Mb23qWR;ocx zuF*lX_B5DO#X@){>zk1JP(phN#ju3qzf|}GE{l_oW#UKm?!&6Nzt|uGx9ciI6$zr&5tr0sLOPv0w)JK zGYR-_D*;-qq>JXa$=yBk4{8biP&ez6D=~M z(mjbrl$Mc?!fXv{IhsSpul8xflxP-JUCdXPV}r!==mFc!jxbqEeHle^VkA8b7pPgP z@Y<6#MJ6M~p!MD2ZX=J8Ecv5B-pvH_imcIjF2_eq{jzItqUae~yHQnX(^UdfLDh|4zC>^WovnAbk<9<75;h%Ak})Xq?F1 zdL=4Gf*U=#^A%CL^^b{xqTp?lem(K6QMVSR2u7qx&wh>A#SG_Hv8n5p^y?)dd&1@h(9`(KJGY6Dg`3(%NG*~sAr~g^^AukM;P&~-oTOSI z1=yIJNEeA&OvxkgW3(%1iU>5zCs;OahVbA?gC)dWX{PLLrBQ4sTJErAMKt}XjG{Hs zO(xTHY@@8an&8#;GWh1^C5Gvcip{BA?p=*g+HqM5TjF@~DY;z8{h3rnw!&B-3wmL{ zF18vt@xzeDO(xy+NMllRSSOvyn&xTnwFJ@eg1`S@ICa+}+mC63*2DUfgmi)<^Zw2+ zv*H*cSHy~qIg(1w`4q$%Qz>Z>4lHxm`gwdNB4j0g8&96@D+YYsm0Pd-#9$yC(ty+C z_K_|FN3`KHFx^h#hcWJR;OfG2NJ=U2KAyZ#ZJzMMvZHpLo$2i76y7ELzH9OsI#ZLS z2w~X!v`{|*%B?eHj)kq!vixow&u&wnrWl-kd*U=(?~y7=gq(Fo?b1&%!)qxeA#q~fe$X2P|!F(zR!kXY<}wA{ zFdXC(^^1;HNcixcthSk;ja4d1NpgR4yh?%bG1|edgJ!~RXc6%jMh0+#{36qUc(nXA zjw;aJz@H*sx6F{zl+EGXSRK<=R>!4KUGq70hiVtKwzLTiWh@|lsw#R!Eno(%3|ER5 z2)y_N*~^f)8$R}`y)1wJ-WlwG%~aT?j`dj=SvuZRm)fXD4!&7&~J0u`N? zkWyf;3CT*EsCD#Ja?RX6n!m^wAUoqphZVBU%rj423JYhBTHF8X~dAnp*q?) zqM#N)rW;a%{6rgjH&C*5_dT~mLH>JI>1~=j{00aTQxsCHWn&j1RizScEw zlT_obdO=mERa!(?SS4Q-f3F~oSM(TGG$^ZsGDcL^uMboJ3u9F1%tXL3A)mcE76QI8 zK2CI|?e64hc3h-26$?}gQ!>t=Ay~)5>KoN(bDqxE+VzBjA_ORss#p|ec!>`_*<0o|>y{TMO_Jrypc^MV({s1;wB!W8KzPLTR7$Fe zqB|~0n^{U51>(`&%BS=kK&wMtr}eb>Wudb|ReYzSBtpY95>-s}h^NGBJ*vibOHJcg z$Vs<9|3TO@-38~}_&%weYkB~%;jw@~E7w0L3@_wg8&N8-EHJVe*_{j3C@a?^68NAM z$Y9TdbEm6P3eNz=CDQ&^achD|e{1f{BZJj+6SLzz(3t?V^;Vy~ zn@@x0+!+RxRVo7g`LWnBz3~l2rs;ltAh(qK)EJ=vHMQV4_m8CnMK3C3jOXCO6OGKt zm%-0@$}!F6#DKmGltr5|hl3krB!3Y6*SJI;j4N0DW%&tUTrwJ(9a+D0;y{?7^Jp+h zBj3t9`3lVkGhBWcDWg-Yu6aW4c!L}nkr8Hw9nbr}q%$lqyi^CZmxxn<( zb9!aCbK!Davz5T~bHMbA#M})`1@5z}+!Bm`-4}?eu=~QkS~J1EuZY-w30KR3?iSC2 zMzUC#l2PVBiLVHo2?V=YoQ(2PBuRF^n3i#WiIbC=ZALyU=)xg;TT4`sZ-ND)<1MAZ z9BGtC788UTFo9bhGwaM+AnVK~+Esylk{xnsRS?kz?xaAk#VK{1TsmbL=P4Pa4hT)} z@=8#38Nj31E#*`*fod1D3(~oC1&{TuB9bH}ty=TDE0Xjpq+rK1R4KniL6ZSIhdo@* z0yLvQrJFBbO7=$8w~I&;mz1hgHyw~=S&-I8fpBySNGRdgs7FUC{3u^lJdp~@G9)I= zeZ~k7pXJ5Wl0M>oV57iSNCJhOlhmB6&LC8f%zDN+&gI!nfYXy53J-9A+kzW*TX3$Z znoh{F%u}*S9r&3F7tlV_l>?t(L(3IrD%4~E02j%TsQPX&tU!UW={x{{@nLBEpP_I# z&~m+*ikMF2RsyuVQ-djcstOWH`uB79)^QE)m387%2~Xx(>~%`JTNAX1X{&t-t!7x` z=T?UsRmkbt62h0}+*FOon5e4~8#|0%DEzH7mcj?6Vd1ot+W|@o2Y}$EIHUei+P^@) zChqulcdE_Ml;h6E$5_s_*bRV3lWCR+uPT|0;JBxW$17Gnyh4{04_ z0){Hw!kZyZsQK=3C@8FeQip-vM4Z`0fdOb9@Y0mD2!QYs%$CfzRuDClrPf8aAZN`bpN(@Wf~J^`bYX5(AAF5UJRwOq4vs4o;|jVc6+N@CWGW?CmaXN?kib)m z3ka_whXz;)UL8-c$c(x846K?vQsGG@z`W41Y?-VkWUio$WNu83uV7C@bv(a@?*pE= z=5%i8h^pWWs$HMF6#-m;UVVH@m?Vu6T86w@W!9;dxKFHxz8+ftRnt(T9M50I2hsD)Xd+7AM(06#!xtYk4D za|Dp-DWQ~GV2}Q$>vIKm!892bs1W7@V?ZMul;_9R#0+>b@@@LuAd6G?>1RAaJx#Xg zZ#q6#U=~mqVS&sYmDq}~P(k^Rz3ZBI)o)avr(W(%0p_;}nBR5Zh%LHQx9L}6?mni1 z_p_@FRFdB_pT68>Do^{=n3O@@b19-}LEFhc*Jrm@Yk%3N-xx_*o~I-Em#^SPv~SUd zG6L1;4pcm5K*Nd3bXgszENdmt!0CQlwBj|m4&I&-iZDvO1D63=rUgbl_yc}Zr=nnU zT!NQi4xFX(7{Ic6fxUE~FGS=<0Gy3lQWfq89`(14vN|x2NnD1EBaLl8_QTJX+bx5~ z{_+RJ7Hw0`;T2l~`}=6HBH#ZSEZJ)Ro!epdS4^WlTJbtu2ha-R!4tDP6s0ZQy+huBD8;9L8q&Zi)hmotF_w{Wphv^l>Bo}B z#==|ZP&Z8*QXg%U*U`xUe0Th81=f~Pxb1iZkNrji)8@`)(c3RX@?B5-ogzRI@KSY< zwL{Vf?JBK0B#2u#L{=${-936sk@};E@`;piuHg-L6z5j2V}Ke>-aA>Xil`dB4VSgtvDi)7H)kBLhd}| zN80GIv5pdl|x zSk)^6TP3i5i7o0n-VBNM7#TMmNiKUdSmZ2qFb>eFs}()R5@e{4!gYtIF&IxDQFh8Y z6+;7TEIvP$egGRu9%!5zR?AcQPFBs5083D>{xz;YJdI&?y1c4zR)hFTPQfn9o0iW& z|8L~PPdZd zvGW7bE5Ua>RXKB)YdGNd2_dXgVZS|sVw!>)Nuv)nlBAi|F|C3v=XOu5rlQ;e#D;Yw zsmoW!aT)scEz7~#rmBxr#sO)CerA!A+MBZK13+Brapz3Amo8mscy8 zBCiCb8Ua!T0IB|>gxoJKo`QlAqzbT2OCo?sup9+4yw)mNCXb5@KEN(3mjX_mAYj}Z zbOk8-dXhELDj!#_zAj?vF|>J=B#Z|ZWG1UdT`(PBYg zHeeB$0k;uFF4U9xH;Im%Mhmkzizh)uz(8vIib?rE-2-L zIOnmom|_%n$lzy0K^l?(1p`0q&80>??R5*x()nC&L{uAPP z0wEqK9_Eku=;XF$~x?1 zqWky~-+$K8WOLg?Z7bFEf&lfO%Z@MAw#Gz zXT%47NZ)FJ^lbo0-`tW}rK9LzSqQu|Iu`D*eFzZLxA4}P!=fy-T{`KW5wSbakaouh z>$q!Pzz&57wcepbBt^ioLcnR@JAj@S0O^ghDh^@=^{mP8$<$6i;J2Cq2eUq$tS!c* z48!op!~EZafqVKba8JA7ILxif^&(XAzfS)*D3msCSKje8UCDb0AbYW)(p)7k3p`KF~kZ7zB8Tglq$gD;;(uANJ&X^xDBUbaXtWf(?9u}wDG6ueb@umXzV|UB%^35 z)c8t_7-TkRjpEQ%u32mwk>mcvr@@CW8r+>M`}0VjRuIp6!ZAhd)JoRb4|1E#wgS;< zBAo@|#<^Hhs5qsTlS@;CIj8L3Kq{BJ>~-P zPC?oHZXhnKif{LAE8BSO6`sKkWY72VMIVh7>!pJ-8#n}nU|A;}`+L>Db6=+){jda% zc=jQI^U?(pxPb?a6a$+AByca{{!QRC^(cS@&O3ZdVZux|D*yHv>(_Cu%O3Y}W5Lx3 zD~lnWxAo&XniPjzYe4P2_hK^$9-ZmB!7c|ezNw)Mh`i4&48UM)^*-mHj?Z}H`tpsP z(quJAGpu7WUbgVIieQ1>Nj)gYJ^l_FTNKMkC$(QPNv1X0?2l%add%D zpXi+zY$Vuy?%q>My_VA*5PI$SoJXlIU$hl?g>cO~j@#%v-MxcQJQvEWU|O7)C$Dug zlcE~?CJF2D`FopfupA}&)$XWdf&DtS#_R!b2JvIT5vnhMd{wi>J|u&(tYAbAs|{Ko zGs}$?72Ie`so~|3!DN36uN_6-foN&;m?{dX+^|v9C`q#-E(^Cdv-2!DgMK3kPM;@< z`C0(@{U8(w3h|5ALMxO^H}msGo<9cKF1b5V59A3yuV|cIp-2c%w%>tov~vv(W*8SlNiMW?Ge)PD6XLl(+~{txB7%Ob^5U4a$TjCHwnS6fW8K zE$4FRVgVw$hh?Z#Iz(Tl0kQXhSRFvDK^X#K@iVs~ppTv&<5;e0T=58+SevviaXAx} z4w?N=%ZXihuc%pGpcPziN|Icq>gRMtcxy<056OGW3N7zwNMnzHx)D(ewpuP-vbF}; zpa@;PO1r)+9mBpDWx|q@eL5AT9zeibCox-vH=ngTJp_u*0J;eZNUjv@(DH~D9?rHu zZInllVa0kbrw|V7WJ27+VLOSmr*XDt>TbmK5pK4ss?cDTt$$7*P#LXe8^QC2k4H~8 z+zr*-gjtcj#aKIZKh9z{?u9p2v~s!^=S!^>&$nK6>V|QK(MS>;}<}19p!in_@V0M?7s=}I|*&P`I zMF~h9SerJ0S|xVHfDVLJBSS^n;BShwkGT$1&CumI=NSbh5A=_En}KE~(1ou16PK>v zSBavxS1M~Ezpp|7my45`=CpLrUiACU=d$`pF=Tn0w_^0RS@bsQ_vzvNhROZuok{22 z*-h8|@eFwg(C8%OYID#e-XNpTF8xy=-tZi%d6bZ-=m4WgO{Nu!S`pSA-6Lo z!GMVSJHe%pyMt|$klT~VwUFz(64Cp6llyg-$dKPr$07IUde_Uq6p5lhzZG&S<14zZ z+pPOs^1=1PkjrzGkXs6^TMLD<&CHpr5Lq4SwJMi@d-5nN{81-ta;T)|1fRA@lhtq~)E0W0Pcg8}n6O3;6E0pn(BUgB)r|9s zFawT`z9x!T8r}sYwx!)g&WMvpK{(@rhCTsuF6f1Rb5H_=d6F4OR2+{NQo_!N6h5jw3d`lv@ zd~mJh;DJ&3YjTB?I}!DGzE!Z_}Qf)MF(4Aa&FUnD>(9xvM+;(rmLkEH8$cV9H z)VuvW9AG^lTFEG<|Qi4josqOgxga1(!!NMfPf(EZPC>!;Z;PPluI_Djjg zuIX9l_nE@2;)f z938OYw*Q-q?nhuQN3J!lmUbj^sQFIq`nQ2{`F|<|_;C5l^?}E{M$;TeTj#>Nk9>b< zvoa3-bcRX}&%$(^BGI~?%=9l+Y;}-}b23b{A&jq(Qh0^W}!8$OW{!6ou zB$T6Owttm8q_M@!APi5Dcn~HAFgDo@p_l&u5$0`_{nJafK8*U3`v`W7?K39|zIYHQ zV8%pBIch5RPrU>G*bM~GP2v>?7|>zrfcXflF5(aKf4%z8{_QV>N=*1q1UbQY=?O~- zZQ>_;5eMB*f`UF*27l9jC7t#~^A88UD{K3<^v)5zyJyf-xTWR2~4Wdy`G7XL2V;4WBEJwJ6OV94#1{~u8 z6Lj1+b&ehqv)crbP~GcYi6~v=P|bexMoZyq*t)t7yHO&)I=dRU`1;II99w8R-*8FX zdkUcKcjj~dNY{i}%-yHKtK4s`H`Ig^1*gJ}7u6NN5?n68V#*RQ4)__OQO`{vx7HZn z&vOCC?!`^Ao6Fl`VSy}ZJQyjJk@vOau~ylx5oE2J zV<`u)aUbZW3;+rK4;y!kwc5uWXKeytmizc#KqQ8CmJaQF6TZpB%z&+79Qg77a{mOGbmZWe2Clp(-qZ-f!G9RPZ<1WM9c%DB0=U(it2r9jhD>)^}w!|mM=hRvi? zfAnBeUhaR$|Nn5sZ}P8da%?ol;nSn;dVO2H`QpU(q93E4FC@4|9Y15x z#!t8D7lT!<$%NWSst$&d?4?tk+L%bSFq4IVOjbs3-D%yv4Pn2<>HbBq(9@&BKB&gH zNLN;22FqWy7hvn$HDUg%#DbTssJSyTIS6cMg3!3PgI1{j)KeHBk-BFV=#8>gcPLr3 zK3>eEsy`JX?d9P8QolUddBFOg8VL*vcy9?_how!Q>iKtTQ?s+2Coi+zFO&2H+7hhl zsp?;=jluZmAO6EXUts;janaHwW8LZHUc}@n$~h{W?vZ;t3xhjkz5M06tYAxC?tj$&&xsEZrwJ0cO0Kyvnjhu9KC{V( zj!io=H2sg_2!R`}REB7v+N4Usd8=`8>EOrS4sd<2z)%_0J{`JNm@=Bmj^&%5YLp&Es~{OHI2G42fLI_IT_>> zUaEcPwuhaLdBBSPfw|{Qt2Y5ungmge0x}7mm-&AccABZszzRqNct2&xAg^<67DO8v zT0g}R$-IHTQXX}?)^oC67IE>W=lxY?{M;l`tqoCUrs&m{Jk!X0;lfH=Bl9?xE~MeO zfyOQJC3$cW-#&vrY*+)L&L};_Sg|2)<=fF0cGrh9)kYΞ*55_<8}px)4Ndp}W)( zMlWCbn<)>F>P>tGe{ga~88{^f-Gy=X9uVyFn)T+4z&PWee>md+5j+l`E|44Jg956e zKv%tJ%(I!_pO%m2yZ_;<8->F!F*Sk>5{-SrkK1{l8XicA$n+YxT{H-Wp#}UyRp*ii zIOER&c0H$E&MywWr-q$c?#js~0V$p7W*PgT4&OAIVYGi|w5ldC7`Gc2;C2Tvo1Sm$ zefddyYDrcvk{(RoVcTee<$gYb_wDVRUiSpm>GcMNrICK*py z*WiYmtqww&lsINCNwS&|qyC|`|HbG3#9DPY^8s={q|#|E!QUGsv|nQUzx3FiPQAVr z$ho%9zaZ57`P0(MQf~0efbw~ue!_mM;rh*rmE(@&XMvhdEh~Fs3em%u>5>hO-XI7@ zuq2=2-CI&%`&x)@8=lFFFUq&j>pV}pnEBdOZiO()$34MOHQ-BreAb^PZ_F> z7p{J6U%1(nK!U#*H-4S8a1UDklwR8^DLt}S*>eb2Gqq4#1FBuG(pK{g9dMAO537Ew z#$JUE4O?Rf;3~WAo2rN{)VCXR+nV3pO{_0|UE*?`0u~r4lQsVuZJ(@=^nFZO61t_B zlc^-HouQ<+y>6dwT&yR3tYxoA#Knj4dcFZSvLxQE6Lc+d<;w`Mu=TYxX4GEN+0XR|Jg_Tq{>=8N>9rSyEOa$OjBe|%nZ7u7(b08JD-T{!g~4!nwyw0X{7t2 zrRyTL>efmCQFQt@pJ?+%625g|vAg|PxjmU|CD$$qyzt&-phc8!sS}#8#WHEMx$D@)v

kPv%Ra@Se@`G0h1-t--YoGF*j?P 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

`#`LrPSnyGvqA=aznF5#HBz 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. - -import os.path -import sys - -try: - import boxes.generators -except ImportError: - sys.path.append(os.path.dirname(__file__) + "/../..") - import boxes.generators - - -class Boxes2rst: - def __init__(self) -> None: - self.boxes = {b.__name__: b() for b in boxes.generators.getAllBoxGenerators().values() if b.webinterface} - self.groups = boxes.generators.ui_groups - self.groups_by_name = boxes.generators.ui_groups_by_name - - for name, box in self.boxes.items(): - self.groups_by_name.get(box.ui_group, self.groups_by_name["Misc"]).add(box) - - def write(self, targetFile: str) -> None: - with open(targetFile, "w") as f: - for name, group in self.groups_by_name.items(): - f.write(f"{name}\n----------------\n\n") - for box in group.generators: - f.write(box.__class__.__name__) - f.write("\n..........................................\n\n") - f.write(f"\n\n.. autoclass:: {box.__class__.__module__}.{box.__class__.__name__}") - f.write("\n\n") - if os.path.exists(f"../../static/samples/{box.__class__.__name__}.jpg"): - f.write(f".. image:: ../../static/samples/{box.__class__.__name__}.jpg\n\n") - - -def main() -> None: - if len(sys.argv) != 2: - print("Usage: boxes2rst.py TARGETFILE") - return - b = Boxes2rst() - b.write(sys.argv[1]) - - -if __name__ == "__main__": - main() diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/burn.svg b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/burn.svg deleted file mode 100644 index 44a3633..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/burn.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/burn2.svg b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/burn2.svg deleted file mode 100644 index ed1298c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/burn2.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - RoundedBox - - - - FlexBox - RoundedBox - 2021-04-25 18:47:19 - http://localhost:8000/RoundedBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=1&FingerJoint_edge_width=1.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&Flex_stretch=1.05&Flex_connection=1.0&Flex_distance=0.5&Flex_width=5.0&x=50&y=50&h=50&outside=0&radius=5&wallpieces=1&edge_style=f&top=closed&thickness=3.0&format=svg&tabs=0.0&debug=0&reference=100&burn=1&render=1 - Box with vertical edges rounded - -Created with Boxes.py (https://festi.info/boxes.py) -Command line: boxes RoundedBox --FingerJoint_angle=90.0 --FingerJoint_style=rectangular --FingerJoint_surroundingspaces=1 --FingerJoint_edge_width=1.0 --FingerJoint_finger=2.0 --FingerJoint_play=0.0 --FingerJoint_space=2.0 --FingerJoint_width=1.0 --Flex_stretch=1.05 --Flex_connection=1.0 --Flex_distance=0.5 --Flex_width=5.0 --x=50 --y=50 --h=50 --outside=0 --radius=5 --wallpieces=1 --edge_style=f --top=closed --thickness=3.0 --format=svg --tabs=0.0 --debug=0 --reference=100 --burn=1 -Url: http://localhost:8000/RoundedBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=1&FingerJoint_edge_width=1.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&Flex_stretch=1.05&Flex_connection=1.0&Flex_distance=0.5&Flex_width=5.0&x=50&y=50&h=50&outside=0&radius=5&wallpieces=1&edge_style=f&top=closed&thickness=3.0&format=svg&tabs=0.0&debug=0&reference=100&burn=1&render=1 -SettingsUrl: http://localhost:8000/RoundedBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=1&FingerJoint_edge_width=1.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&Flex_stretch=1.05&Flex_connection=1.0&Flex_distance=0.5&Flex_width=5.0&x=50&y=50&h=50&outside=0&radius=5&wallpieces=1&edge_style=f&top=closed&thickness=3.0&format=svg&tabs=0.0&debug=0&reference=100&burn=1 - - image/svg+xml - - - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/conf.py b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/conf.py deleted file mode 100644 index 304b482..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/conf.py +++ /dev/null @@ -1,94 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# For the full list of built-in configuration values, see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -import os -import sys -from datetime import datetime - -sys.path.append(os.path.abspath('../..')) - -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information - -project = 'boxes.py' -project_copyright = datetime.now().year.__str__() + ', Florian Festi' -author = 'Florian Festi' - -# -- General configuration --------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration - -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.coverage', - 'sphinx.ext.ifconfig', - 'sphinx.ext.viewcode', - 'sphinx.ext.githubpages', -] - -templates_path = ['_templates'] -#exclude_patterns = [] -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The root toctree document. -root_doc = 'index' - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# -- Options for HTML output ------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output - -html_theme = 'nature' -html_static_path = ['_static'] - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -html_logo = "../../static/boxes-logo.svg" - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -html_favicon = "../../static/favicon.ico" - -# Output file base name for HTML help builder. -htmlhelp_basename = 'boxespydoc' - -# If this is not None, a ‘Last updated on:’ timestamp is inserted at every page bottom. -html_last_updated_fmt = '' - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = {} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ('index', 'boxespy.tex', 'boxes.py Documentation', - 'Florian Festi', 'manual'), -] - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'boxespy', 'boxes.py Documentation', - ['Florian Festi'], 1) -] - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'boxespy', 'boxes.py Documentation', - 'Florian Festi', 'boxespy', 'One line description of project.', - 'Miscellaneous'), -] diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/faq.rst b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/faq.rst deleted file mode 100644 index 93320aa..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/faq.rst +++ /dev/null @@ -1,54 +0,0 @@ -========================== -Frequently Asked Questions -========================== - -.. toctree:: - :maxdepth: 1 - -Can I sell boxes I created with Boxes.py ----------------------------------------- - -Yes. Boxes.py is under the GPLv3 license (see https://www.gnu.org/licenses/gpl-3.0.html). This license grants you far reaching rights on what you can do with the software including using it and the drawings it produces to any means. The license also puts some obligations on you. But those are about changing and distributing the software itself. The resulting drawings do not fall under the GPL license. - -Why do my parts not fit together? ---------------------------------- - -Well, this could be a bug in Boxes.py but there are a few more likely causes to check for: - -* The material you use does not have the thickness you think. Measure it with at least a caliper. Even a few hundredth of a millimeter will make the difference between a loose fit, a light or a heavy pressfit or no fit at all. - -* You might have chosen the "burn" value too big. As it compensates for the material cut away by the laser smaller values make a looser fit, bigger values make a tighter fit. The right value may be different for different materials and different thicknesses. - -Why is my box a bit too big? ----------------------------- - -By default all sizes are inner sizes. So on the outside the box is bigger as the walls need to go somewhere. Some generators offer an "outside" param that includes the walls in the measurements. In general you should check the generated parts for plausibility before hitting the start button on your laser cutter. - -Why is my box a bit too small? ------------------------------- - -See above. - -Why are my parts in the totally wrong size? -------------------------------------------- - -Unfortunately some formats do not save the units of measurement or don't do so properly. DXF and SVG fall into this category. So different tools may see the same file in different sizes. You can use the "reference" param to get a rectangle of a defined size to check if the size is still right at the end of your tool chain. - -Why are there tiny, weird loops in the corners? ------------------------------------------------ - -These are called dog bones and make sure the corner is completely cut out. As lasers and milling tools are round they can't cut sharp inner corners. Have a look at :doc:`burn correction details ` for details. - -I really don't want those weird, tiny loops? --------------------------------------------- - -You can set the ``inner_corners`` default setting to ``corner`` - -What settings were used to generate a drawing? ----------------------------------------------- - -If you do have a SVG or PostScript you can look into the meta data of the file. Most document viewers will have a ``Document properties`` window. You can also just open the file with a text editor and find the details at the first few lines. - -Note that you can just use the URL in there to get back to the settings page to change some values. The difference between the settings and the rendered drawing is just ``render=0`` or ``render=1`` at the end of the URL. - -For other formats you are currently out of luck. diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/generators.rst b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/generators.rst deleted file mode 100644 index c6e1348..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/generators.rst +++ /dev/null @@ -1,9 +0,0 @@ -All Box Generators -================== - -Generators are organized in several Groups - -.. contents:: - :local: - -.. include:: generators.inc diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/index.html b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/index.html deleted file mode 100644 index bab73b0..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - Page Redirection - - - If you are not redirected automatically, follow this link. - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/index.rst b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/index.rst deleted file mode 100644 index 3cf232b..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/index.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. boxes.py documentation master file, created by - sphinx-quickstart on Sun Mar 27 12:04:59 2016. - -Boxes.py -======== - -Create boxes and more with a laser cutter! - -Contents: - -.. toctree:: - :maxdepth: 1 - - README - faq - install - usermanual - CONTRIBUTING.rst - apidoc - generators - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install.rst b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install.rst deleted file mode 100644 index 6966fad..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install.rst +++ /dev/null @@ -1,112 +0,0 @@ -Installation -============ - -Boxes.py is a pure Python project that does support the regular setuptools -method of shipping with :code:`setup.py`. :code:`setup.py --help-commands` and -:code:`setup.py CMD --help` provide the necessary documentation for building, -installing or building binary formats. - -Requirements ------------- - -Affine -........ -:code:`Affine` (package name may be :code:`python-affine` or -:code:`python3-affine`) is used for vector calculation. - -Shapely -....... -:code:`shapely` (package name may be :code:`python-shapely` or -:code:`python3-shapely`) is used for filling shapes (with holes). - - -Markdown -........ -:code:`Markdown` (package name may be :code:`python-markdown` or -:code:`python3-markdown`) is used to format the description texts. - - -setuptools -.......... - -Setup.py uses the :code:`setuptools` library (package name may be -:code:`python*-setuptools`). You only need it if you want to build the -package. - -pstoedit -........ - -While not a hard requirement Boxes.py uses :code:`pstoedit` (sometimes :code:`ps2edit`) to offer formats -that are not supported by Cairo: DXF, gcode, PLT. Currently the location -Boxes.py looks for :code:`pstoedit` is hard coded to :code:`/usr/bin/pstoedit` -in the :code:`boxes.formats.Formats` class. - -Python -...... - -Boxes.py is implemented in Python 3. For supported minor version see :code:`setup.py`. - -Sphinx -...... - -For building the documentation locally you need the *Sphinx* documentation -generator (package name may be python-sphinx or python3-sphinx). It is -not needed for anything else. Boxes.py can be run and changed just -fine without. - -Running from working dir ------------------------- - -Due to lazy developer(s) Boxes.py can also run from the Git checkout. -The scripts in :code:`scripts/` are all supposed to just work right -after :code:`git clone`. The Inkscape needs a bit manual work to get -running. See below. - -Inkscape --------- - -**As binary** - -Boxes.py can be used as a set of Inkscape plugins. The package does -install the necessary .inx files to :code:`/usr/share/inkscape/extensions` -on unix operating systems. The .inx files assume that the :code:`boxes` -executable is available in the path (which it is when installing the -binary package) - -**git repository easy way** - -After cloning it may be most convenient to generate the .inx files -right in place by executing :code:`scripts/boxes2inkscape` with the target -path as only parameter. - -- global: :code:`scripts/boxes2inkscape /usr/share/inkscape/extensions/` -- userspace: :code:`scripts/boxes2inkscape ~/.config/inkscape/extensions/` - -On non unix operating the target directories may differ. You can look -up the directories *"User extensions"* and *"Inkscape extensions"* within -the Inkscape preferences *Edit -> Preferences... -> System*. - -**git repository manual way** - -:code:`setup.py build` creates the :code:`*.inx` files in the :code:`inkex/` directory. - -They then have to be copied in either the global or the per user -extension directory of Inkscape. These are -:code:`/usr/share/inkscape/extensions/` and -:code:`~/.config/inkscape/extensions/` on a unix operating system. -On non unix operating the target directories may differ. You can look -up the directories *"User extensions"* and *"Inkscape extensions"* within -the Inkscape preferences *Edit -> Preferences... -> System*. - -As an alternative you can create a symlink to the :code:`inkex/` directory -within the desired inkscape extension directory. - - -Platform specific instructions ------------------------------- - -.. toctree:: - :maxdepth: 2 - :glob: - - install/* diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/log-wsl-win11.txt b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/log-wsl-win11.txt deleted file mode 100644 index d1c474b..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/log-wsl-win11.txt +++ /dev/null @@ -1,173 +0,0 @@ -usuario@Soporte-3:~$ git clone https://github.com/florianfesti/boxes.git -Cloning into 'boxes'... -remote: Enumerating objects: 7867, done. -remote: Counting objects: 100% (545/545), done. -remote: Compressing objects: 100% (328/328), done. -remote: Total 7867 (delta 234), reused 514 (delta 216), pack-reused 7322 -Receiving objects: 100% (7867/7867), 64.82 MiB | 5.45 MiB/s, done. -Resolving deltas: 100% (5330/5330), done. -usuario@Soporte-3:~$ cd boxes -usuario@Soporte-3:~/boxes$ ls -boxes documentation LICENSE.txt po scripts -CODE_OF_CONDUCT.md examples locale README.rst setup.py -CONTRIBUTING.rst inkex MANIFEST.in requirements.txt static -usuario@Soporte-3:~/boxes$ python3 -m pip install -r requirements.txt -Collecting affine - Downloading affine-2.3.1-py2.py3-none-any.whl (16 kB) -Collecting markdown - Downloading Markdown-3.4.1-py3-none-any.whl (93 kB) - |████████████████████████████████| 93 kB 1.7 MB/s -Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from -r requirements.txt (line 3)) (52.0.0) -Collecting sphinx - Downloading sphinx-5.2.3-py3-none-any.whl (3.2 MB) - |████████████████████████████████| 3.2 MB 8.2 MB/s -Collecting shapely - Downloading Shapely-1.8.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.1 MB) - |████████████████████████████████| 2.1 MB 5.4 MB/s -Collecting importlib-metadata>=4.4 - Downloading importlib_metadata-5.0.0-py3-none-any.whl (21 kB) -Collecting zipp>=0.5 - Downloading zipp-3.9.0-py3-none-any.whl (5.8 kB) -Collecting docutils<0.20,>=0.14 - Downloading docutils-0.19-py3-none-any.whl (570 kB) - |████████████████████████████████| 570 kB 5.2 MB/s -Collecting snowballstemmer>=2.0 - Downloading snowballstemmer-2.2.0-py2.py3-none-any.whl (93 kB) - |████████████████████████████████| 93 kB 1.2 MB/s -Collecting Pygments>=2.12 - Downloading Pygments-2.13.0-py3-none-any.whl (1.1 MB) - |████████████████████████████████| 1.1 MB 4.4 MB/s -Collecting sphinxcontrib-serializinghtml>=1.1.5 - Downloading sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl (94 kB) - |████████████████████████████████| 94 kB 3.6 MB/s -Collecting packaging>=21.0 - Downloading packaging-21.3-py3-none-any.whl (40 kB) - |████████████████████████████████| 40 kB 4.4 MB/s -Collecting sphinxcontrib-devhelp - Downloading sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl (84 kB) - |████████████████████████████████| 84 kB 4.6 MB/s -Collecting sphinxcontrib-htmlhelp>=2.0.0 - Downloading sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl (100 kB) - |████████████████████████████████| 100 kB 6.5 MB/s -Collecting requests>=2.5.0 - Downloading requests-2.28.1-py3-none-any.whl (62 kB) - |████████████████████████████████| 62 kB 1.1 MB/s -Collecting Jinja2>=3.0 - Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB) - |████████████████████████████████| 133 kB 8.4 MB/s -Collecting sphinxcontrib-jsmath - Downloading sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB) -Collecting imagesize>=1.3 - Downloading imagesize-1.4.1-py2.py3-none-any.whl (8.8 kB) -Collecting alabaster<0.8,>=0.7 - Downloading alabaster-0.7.12-py2.py3-none-any.whl (14 kB) -Collecting babel>=2.9 - Downloading Babel-2.10.3-py3-none-any.whl (9.5 MB) - |████████████████████████████████| 9.5 MB 9.2 MB/s -Collecting sphinxcontrib-applehelp - Downloading sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl (121 kB) - |████████████████████████████████| 121 kB 9.5 MB/s -Collecting sphinxcontrib-qthelp - Downloading sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl (90 kB) - |████████████████████████████████| 90 kB 7.2 MB/s -Collecting pytz>=2015.7 - Downloading pytz-2022.4-py2.py3-none-any.whl (500 kB) - |████████████████████████████████| 500 kB 10.4 MB/s -Collecting MarkupSafe>=2.0 - Downloading MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25 kB) -Collecting pyparsing!=3.0.5,>=2.0.2 - Downloading pyparsing-3.0.9-py3-none-any.whl (98 kB) - |████████████████████████████████| 98 kB 6.0 MB/s -Collecting charset-normalizer<3,>=2 - Downloading charset_normalizer-2.1.1-py3-none-any.whl (39 kB) -Collecting idna<4,>=2.5 - Downloading idna-3.4-py3-none-any.whl (61 kB) - |████████████████████████████████| 61 kB 206 kB/s -Collecting certifi>=2017.4.17 - Downloading certifi-2022.9.24-py3-none-any.whl (161 kB) - |████████████████████████████████| 161 kB 9.3 MB/s -Collecting urllib3<1.27,>=1.21.1 - Downloading urllib3-1.26.12-py2.py3-none-any.whl (140 kB) - |████████████████████████████████| 140 kB 8.0 MB/s -Installing collected packages: zipp, urllib3, pytz, pyparsing, MarkupSafe, idna, charset-normalizer, certifi, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, snowballstemmer, requests, Pygments, packaging, Jinja2, importlib-metadata, imagesize, docutils, babel, alabaster, sphinx, shapely, markdown, affine - WARNING: The script normalizer is installed in '/home/usuario/.local/bin' which is not on PATH. - Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. - WARNING: The script pygmentize is installed in '/home/usuario/.local/bin' which is not on PATH. - Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. - WARNING: The script docutils is installed in '/home/usuario/.local/bin' which is not on PATH. - Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. - WARNING: The script pybabel is installed in '/home/usuario/.local/bin' which is not on PATH. - Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. - WARNING: The scripts sphinx-apidoc, sphinx-autogen, sphinx-build and sphinx-quickstart are installed in '/home/usuario/.local/bin' which is not on PATH. - Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. - WARNING: The script markdown_py is installed in '/home/usuario/.local/bin' which is not on PATH. - Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. -Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Pygments-2.13.0 affine-2.3.1 alabaster-0.7.12 babel-2.10.3 certifi-2022.9.24 charset-normalizer-2.1.1 docutils-0.19 idna-3.4 imagesize-1.4.1 importlib-metadata-5.0.0 markdown-3.4.1 packaging-21.3 pyparsing-3.0.9 pytz-2022.4 requests-2.28.1 shapely-1.8.5 snowballstemmer-2.2.0 sphinx-5.2.3 sphinxcontrib-applehelp-1.0.2 sphinxcontrib-devhelp-1.0.2 sphinxcontrib-htmlhelp-2.0.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-1.0.3 sphinxcontrib-serializinghtml-1.1.5 urllib3-1.26.12 zipp-3.9.0 -usuario@Soporte-3:~/boxes$ ls -boxes documentation LICENSE.txt po scripts -CODE_OF_CONDUCT.md examples locale README.rst setup.py -CONTRIBUTING.rst inkex MANIFEST.in requirements.txt static -usuario@Soporte-3:~/boxes$ ls scripts -boxes boxes2inkscape boxes2pot boxes_example.ipynb boxesserver Dockerfile gen_thumbnails.sh -usuario@Soporte-3:~/boxes$ python3 scripts/boxesserver -BoxesServer serving on host:port :8000... -127.0.0.1 - - [13/Oct/2022 10:53:34] "GET / HTTP/1.1" 200 32493 -127.0.0.1 - - [13/Oct/2022 10:53:34] "GET /static/self.css HTTP/1.1" 200 2357 -127.0.0.1 - - [13/Oct/2022 10:53:34] "GET /static/fonts.css HTTP/1.1" 200 1592 -127.0.0.1 - - [13/Oct/2022 10:53:35] "GET /static/normalize.css HTTP/1.1" 200 4693 -127.0.0.1 - - [13/Oct/2022 10:53:35] "GET /static/boxes-logo.svg HTTP/1.1" 200 12702 -127.0.0.1 - - [13/Oct/2022 10:53:35] "GET /static/nothing.png HTTP/1.1" 200 89 -127.0.0.1 - - [13/Oct/2022 10:53:35] "GET /static/fonts/bungeeshade/v3/DtVkJxarWL0t2KdzK3oI_jkc6SjT.woff2 HTTP/1.1" 200 42432 -127.0.0.1 - - [13/Oct/2022 10:53:35] "GET /static/nothing.png HTTP/1.1" 200 89 -127.0.0.1 - - [13/Oct/2022 10:53:35] "GET /static/favicon.ico HTTP/1.1" 200 16958 -127.0.0.1 - - [13/Oct/2022 10:53:36] "GET /static/samples/TrafficLight-thumb.jpg HTTP/1.1" 200 4100 -127.0.0.1 - - [13/Oct/2022 10:53:37] "GET /static/samples/BurnTest-thumb.jpg HTTP/1.1" 200 3422 -127.0.0.1 - - [13/Oct/2022 10:53:37] "GET /static/samples/ HTTP/1.1" 404 9 -127.0.0.1 - - [13/Oct/2022 10:53:38] "GET /static/samples/UniversalBox-thumb.jpg HTTP/1.1" 200 5133 -127.0.0.1 - - [13/Oct/2022 10:53:38] "GET /static/samples/RoundedBox-thumb.jpg HTTP/1.1" 200 2803 -127.0.0.1 - - [13/Oct/2022 10:53:38] "GET /static/samples/TypeTray-thumb.jpg HTTP/1.1" 200 3553 -127.0.0.1 - - [13/Oct/2022 10:53:38] "GET /static/samples/DisplayShelf-thumb.jpg HTTP/1.1" 200 4419 -127.0.0.1 - - [13/Oct/2022 10:53:38] "GET /static/samples/WallTypeTray-thumb.jpg HTTP/1.1" 200 4143 -127.0.0.1 - - [13/Oct/2022 10:53:41] "GET /static/samples/ HTTP/1.1" 404 9 -127.0.0.1 - - [13/Oct/2022 10:53:42] "GET /static/samples/ HTTP/1.1" 404 9 -127.0.0.1 - - [13/Oct/2022 10:53:42] "GET /static/samples/Atreus21-thumb.jpg HTTP/1.1" 200 6502 -127.0.0.1 - - [13/Oct/2022 10:53:42] "GET /static/samples/BottleTag-thumb.jpg HTTP/1.1" 200 6969 -127.0.0.1 - - [13/Oct/2022 10:53:42] "GET /static/samples/CanStorage-thumb.jpg HTTP/1.1" 200 5444 -127.0.0.1 - - [13/Oct/2022 10:53:43] "GET /static/samples/CoinDisplay-thumb.jpg HTTP/1.1" 200 4469 -127.0.0.1 - - [13/Oct/2022 10:53:43] "GET /static/samples/CoffeeCapsuleHolder-thumb.jpg HTTP/1.1" 200 4235 -127.0.0.1 - - [13/Oct/2022 10:53:47] "GET /static/samples/BottleStack-thumb.jpg HTTP/1.1" 200 89 -127.0.0.1 - - [13/Oct/2022 10:53:50] "GET /static/samples/Arcade-thumb.jpg HTTP/1.1" 200 89 -127.0.0.1 - - [13/Oct/2022 10:53:53] "GET /BottleTag?language=en HTTP/1.1" 200 7965 -127.0.0.1 - - [13/Oct/2022 10:53:53] "GET /static/self.css HTTP/1.1" 200 2357 -127.0.0.1 - - [13/Oct/2022 10:53:54] "GET /static/fonts.css HTTP/1.1" 200 1592 -127.0.0.1 - - [13/Oct/2022 10:53:54] "GET /static/normalize.css HTTP/1.1" 200 4693 -127.0.0.1 - - [13/Oct/2022 10:53:54] "GET /static/boxes-logo.svg HTTP/1.1" 200 12702 -127.0.0.1 - - [13/Oct/2022 10:53:54] "GET /static/samples/BottleTag.jpg HTTP/1.1" 200 82889 -127.0.0.1 - - [13/Oct/2022 10:53:54] "GET /static/fonts/bungeeshade/v3/DtVkJxarWL0t2KdzK3oI_jkc6SjT.woff2 HTTP/1.1" 200 42432 -127.0.0.1 - - [13/Oct/2022 10:53:54] "GET /static/fonts/luckiestguy/v8/_gP_1RrxsjcxVyin9l9n_j2hTd52.woff2 HTTP/1.1" 200 17024 -127.0.0.1 - - [13/Oct/2022 10:53:57] "GET /BottleTag?width=72&height=98&min_diameter=24&max_diameter=50&radius=15&segment_width=3&thickness=3.0&format=svg&tabs=0.0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&render=1 HTTP/1.1" 200 6346 -127.0.0.1 - - [13/Oct/2022 10:53:57] "GET /favicon.ico HTTP/1.1" 200 32493 -127.0.0.1 - - [13/Oct/2022 10:55:22] "GET /BottleTag?width=70&height=90&min_diameter=44&max_diameter=60&radius=8&segment_width=3&thickness=3.0&format=svg&tabs=0.0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&render=1 HTTP/1.1" 200 7988 -127.0.0.1 - - [13/Oct/2022 10:55:22] "GET /favicon.ico HTTP/1.1" 200 32493 -127.0.0.1 - - [13/Oct/2022 12:04:45] "GET / HTTP/1.1" 200 32493 -127.0.0.1 - - [13/Oct/2022 12:04:45] "GET /static/self.css HTTP/1.1" 200 2357 -127.0.0.1 - - [13/Oct/2022 12:04:45] "GET /static/fonts.css HTTP/1.1" 200 1592 -127.0.0.1 - - [13/Oct/2022 12:04:45] "GET /static/normalize.css HTTP/1.1" 200 4693 -127.0.0.1 - - [13/Oct/2022 12:04:45] "GET /static/boxes-logo.svg HTTP/1.1" 200 12702 -127.0.0.1 - - [13/Oct/2022 12:04:45] "GET /static/nothing.png HTTP/1.1" 200 89 -127.0.0.1 - - [13/Oct/2022 12:04:46] "GET /static/fonts/bungeeshade/v3/DtVkJxarWL0t2KdzK3oI_jkc6SjT.woff2 HTTP/1.1" 200 42432 -127.0.0.1 - - [13/Oct/2022 12:04:46] "GET /static/samples/RoundedBox-thumb.jpg HTTP/1.1" 200 2803 -127.0.0.1 - - [13/Oct/2022 12:04:53] "GET /static/samples/RoundedBox-thumb.jpg HTTP/1.1" 200 2803 -127.0.0.1 - - [13/Oct/2022 12:04:54] "GET /static/samples/UniversalBox-thumb.jpg HTTP/1.1" 200 5133 -127.0.0.1 - - [13/Oct/2022 12:04:54] "GET /static/samples/ HTTP/1.1" 404 9 -127.0.0.1 - - [13/Oct/2022 12:04:54] "GET /static/samples/BurnTest-thumb.jpg HTTP/1.1" 200 3422 -127.0.0.1 - - [13/Oct/2022 12:04:55] "GET /static/samples/TrafficLight-thumb.jpg HTTP/1.1" 200 4100 -127.0.0.1 - - [13/Oct/2022 12:04:55] "GET /static/samples/ HTTP/1.1" 404 9 -127.0.0.1 - - [13/Oct/2022 12:04:55] "GET /static/samples/TypeTray-thumb.jpg HTTP/1.1" 200 3553 -127.0.0.1 - - [13/Oct/2022 12:04:57] "GET /static/samples/ HTTP/1.1" 404 9 -127.0.0.1 - - [13/Oct/2022 12:07:01] "GET /static/samples/RoundedBox-thumb.jpg HTTP/1.1" 200 2803 -127.0.0.1 - - [13/Oct/2022 12:07:01] "GET /static/samples/UniversalBox-thumb.jpg HTTP/1.1" 200 5133 -127.0.0.1 - - [13/Oct/2022 12:07:03] "GET /static/samples/TypeTray-thumb.jpg HTTP/1.1" 200 3553 -127.0.0.1 - - [13/Oct/2022 12:07:03] "GET /static/samples/TrafficLight-thumb.jpg HTTP/1.1" 200 4100 -127.0.0.1 - - [13/Oct/2022 12:07:05] "GET /static/samples/ HTTP/1.1" 404 9 -^CBoxesServer stops. diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/macos.rst b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/macos.rst deleted file mode 100644 index f385d15..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/macos.rst +++ /dev/null @@ -1,124 +0,0 @@ -macOS -===== - -It is recommended to use Homebrew to install the dependencies for Boxes.py. -See `brew.sh `__ on how to install Homebrew. - -General -------- - -1. Install Python 3 and other dependencies: - - .. code:: - - brew install python3 git - - Optional: - - .. code:: - - brew install pstoedit - - -2. Install cairio: - - .. code:: - - brew install pkg-config - - -3. Install required Python modules: - - .. code:: - - pip3 install Markdown affine shapely - -4. Download Boxes.py via Git: - - .. code:: - - git clone https://github.com/florianfesti/boxes.git - -5. Run Boxes.py: - - Local web server on port 8000: - - .. code:: - - ./scripts/boxesserver - - Command line variant (CLI): - - .. code:: - - ./scripts/boxes - - -System-wide with Inkscape extension ------------------------------------ - -To install Boxes.py system-wide with the Inkscape extension, following steps -are required: - -1. Install Inkscape with Homebrew Cask - (requires `XQuartz `__): - - .. code:: - - brew install inkscape - -2. From the root directory of the repository, run: - - .. code:: - - ./setup.py install - -3. Now :code:`boxes` and :code:`boxesserver` can be executed like other commands - and the Inkscape extension should be available. - - -Troubleshooting -............... - -When using the Inkscape extension something like the following error -might occur: - -:: - - Traceback (most recent call last): - File "/Users/martin/.config/inkscape/extensions/boxes", line 107, in - main() - File "/Users/martin/.config/inkscape/extensions/boxes", line 47, in main - run_generator(name, sys.argv[2:]) - File "/Users/martin/.config/inkscape/extensions/boxes", line 73, in run_generator - box.close() - File "/usr/local/lib/python3.7/site-packages/boxes-0.1-py3.7.egg/boxes/__init__.py", line 594, in close - svgutil.svgMerge(self.output, self.inkscapefile, out) - File "/usr/local/lib/python3.7/site-packages/boxes-0.1-py3.7.egg/boxes/svgutil.py", line 144, in svgMerge - from lxml import etree as et - ImportError: dlopen(/Applications/Inkscape.app/Contents/Resources/lib/python2.7/site-packages/lxml/etree.so, 2): Symbol not found: _PyBaseString_Type - Referenced from: /Applications/Inkscape.app/Contents/Resources/lib/python2.7/site-packages/lxml/etree.so - Expected in: flat namespace - -This is because Inkscape on macOS ships its own version of Python 2.7 where -:code:`lxml` and other dependencies are missing. - -A workaround is to edit the file at -:code:`/Applications/Inkscape.app/Contents/Resources/bin/inkscape`. -At line 79 there should be following code: - -.. code:: - - export PYTHONPATH="$TOP/lib/python$PYTHON_VERS/site-packages/" - -which needs to be changed to - -.. code:: - - #export PYTHONPATH="$TOP/lib/python$PYTHON_VERS/site-packages/" - -This forces Inkscape to use the Python version installed by Homebrew which -has all the necessary dependencies installed. - -Note: This might break other extensions. In this case simply change the line -back and restart Inkscape. diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/win11-wsl-boxesserver-localhost.png b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/win11-wsl-boxesserver-localhost.png deleted file mode 100644 index 83c00a6d212fd01297c546d0f948e73b318ac072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245452 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 z 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�TM`xD}xeU#Qd`g{-_ z_0%Usxa$6r{MpIj=tke_UE&Xb-$1PiG~4L})S7Cnu7juBW0-hNthfusOPVbC2z1=U zJP{QmCprNQHOU~5p(Y%8D#UJ@6nU-9jRAHlJerW;6psFQ3lT5eU0~Y7$Ki}AU#CZZ zn{CWvwF}%7cO`Ct(E+t6X`mKmT*X1oFS-_|*7B6Q%toL_XPRw=@y>&p&TicTC7`T? z^zANACn7wHOyGNFUU&UPs$R^xLA6I1xb^GSbqdOugQ;icOV9(W;Z3_&T&E*4o)V|Y zEaM)g#5P|d%P#kYV_Ub}LruF!XT1u1o-v%Eq~?tTp1|AKpQFo+O!kEL#ND@dfD)XZ z)^@#&iE2GiOQUmhBQApWznMa}D%DPfd3AD)TORi3BhF{~=-DfvtsQg<>T~%9!go5F z5JfhFygpCZP$5glwb|ZD+C@OsZt#r9GHtqJddp+juj$y!uREu>c!@N%12XvWsIaDN zqQP*Hje(a3TaoMW6sTB!r3gQO_j^_i*8yyG@^+!#{J*2Ooa^R>%Khx#q!Rt|rC$$u zp+1&I>y;@Ni^}eIx)+}nnK#10*#Ew5dCKGpWKDf9W!uMdOIoDdJa zs;Og^L98_>$fo6vV^zs&tmj@tz=$Znv>KrhLMi+Xp;Rv`$@+vPI5FQu3-`!BldHr^~Mx> z%cn~}F!%f;dU{y-7E{A%G@1n!I{NMaXmG?AA9V(Ur*=}{sEvMIYI$jQ^WpPG*VuKI zZ0F`0=Zy*};Vdd-Ehbe0({TEER2me@AAB;3qyV-Ug;7G@I*ptUF|nu)I73w=rl5{* zvtEQZ%NZ&T(DbD%4rME(!y2Z!)B|khfW6X~zI(UuSB{>X@{4K-jQ=XfRa z_I}|-z38l4hTfi*C`N2MR8cdH)p`3j{>0S8T(HT^2K_lmL^Ne(^+K5)NlR{)3RL&N{q~?^^0j-(vY`n@)|n`?WU|R%)#_`_||i_ zIY7JgFML!681WJiZW|*^Z@dlBX4HE zr{l!!EFsNZG`D%bVAHc?T%K4oQIsialoN&#a{DHN(2*wXPHui6qp3e@9&_VxvgK&! zs_&B`$!pMU8c zNGa{e>G7+bTUg|;tK!a4=Z$W&Cj~Yux9C%%YfR5SzZAck92=B4e6!8^-JyV+OZT1xL1bOx_2n9~}L#jiMYN>ch_`cI$h&_4&?~UljyZ{q*Q7 zpXg;Ew**s7F3(hf;whNvJef_^)a@z2E#bCcn>(3ZhQGo8A+q7|07Xe($RzUw`cziK zdGRa_lM;=m$!z7QehMMIvKd&GRHd<2D6!%{{ajL@SrS= z&ytsSf`@4d_B|B(_&0qs@5w4#9b(0<8p3;#@`-6vhhNKTB=z_F=JP(Fvp;s6@?d4I^vWlW8>{-gg-jx|*dul!_nYzf_`d5;4o8~P zA%iQg9ti@rKmWfXGjq11u~V~Yqc>vu`S^Ky`rb7>si-H@1{6Fx8k?}pugh3T{wp#k z=!lX6;u)`kl?vM{pMbl?cwe1+MP@;@-7aMx6T$v#m%!PAzV!1_REYJx|D_bv{sPsQ zS^6%%q3at1b2wfZ9R;ePYQ8N18? z0k{>6uKfpK z6|G1H@!7K;odqC0)gC7D3X_RO_wJa?CJnAkV66V%7*mj{_i~8Z?1piXk9Oy6g8k#| zRzcxrdOrp9Cm0}`_n$W+se#8+Fmlu#!5$Gp}x7Im+34TAsT1T)msRXPzSM7VUrGWw%4KBBi}*opadq?hD^oC3?JnCJo){ zefHlk%tbT*_tBfuiZ!h^%){j}u`Ni*@lV+K>;=Ggvxs>%cw(mNup%J*RA7wD!u&71 z=?cZ~@s(!J{tB64AuiUdcnqOU!}S+iD>5U9sSQAf1!tb%iq(*+?&o1 zXpdp1dAI&%+;jn)ZPMnA6OWu!7mo<4*szWwLsk;Feq>^Bkx zW2S&#=S*vn0;8+O=$FmE(zx~5#P>j3S9(tlO{}pQ2rQekEnw4%L{teoijJC+0<U`d$UgdXixxJBZ)`y zVqmn#r1>Nd3XJ&-%2VrqG*B6B^jy9PknpT@!9h(y;N0Y$)Lwtc7g!NEJ$ z!xqM(m721kK!Mu>CvJ4;)Mf3TL`m6z-pxX=;~n$yXqK4|YqGM0mgJWYKOH66kc(!v zo!M=S3^GlXtm(?ivbzP&%18ztN<%M$uK(lv>B$COkrm^&zI+>cW^6rS1HEE}x~aP$KWAD*9HEQELSoz~mmRA+F8*WCScR;B^o z4>^rd+H^@EErNS{C^@umUp4#8w;1};s8Xt!Z(X2THUm03uSQm9<&Nv8sa+^NEv|ce zx}P!9;x=V(_`M$JP{)>qAG=H{rl+_grze1WbvSabhiU{G{ixFE1H9FDnCIZ?&KhwQ zk(U(qS-~V&F+$fMCPg6fTKA|=F>Q0j27{O(kJZ~x*Fyf_VXZTOWt%QG-IIEUd4e6oPr?f ziF|m1aO+s8khJ3guZ9J7d((4b&b!SYDOM>KakD`!$#nD}$GL-Cc-yCkR%b2JK6-&Y zTVAFnYdg_fcZ*pyMdI++s*@M2EK$zO&r9rA;o{@kz3b#)yRPsp+=7|vCv=ZDf7-%!c)?}Mvg^j zgxtbmAVWf(QClff8|TSk-ji$e`cvAVN$1m0*fc0y$F9#_$+rdQC$+(ra;b`(^i zGzJVN7%UX7G<`jw+5YE6kUM+n`Hiiy6X5lic&#~diWaZ)S+)?+-f^C3y<%H7o{3NIb5*{ z#Cy2u>u(Kp;c_C1>nDbHdk|!XFCD1)i$BvPfpa=~i%<&bwjU%yT2)CGDjZRX#1HDR zzv{r5qQWdeP&0J?{Ej7Y}r?V+^8 z1MC@N)s9gYI^u$#^0yF8k)AqBG_m!kez8}sT<$B$J$(&X$4pPe<{=>%s?TlPoF4_F zmY;f7<#^`C5v~5fg9(838Ts6j;N2Aq^NoF;D7^yXfGTy5)98~Ta(BXME!)#9Wv7zD zVks#(p{9;c1}ZnP9uZlPK5E6lWNX8?oScK7k$iV{j081);^3}iDOM$G^>ORgn`<#m zo{>YutMjY*^Wmh;6k_VB-Rj@>AnzbU?Z~n?Mh4NGMychzH}*}Yi@ISa*jol9k1lyj zroNSW)|X^1r!qWgOBfi>PQ7Y$Xk1}3BiN!*{LrI%1h55N7`#il6<*`NHt#r7^KvXu zU|wy|@gP0BQOKCaucKGp@}kag86#+WF?PI_6Rln0J(_^*!hnGX+~m#~K=TM%Uv0Zd?7OUb!L$U>f~r z&|~+@!7>wIMoE*`#P6U3cL-Gw(gOJgpyBMbw#Po%OT{QPg&Y3t)h)ZM|0>$NMk0C^ zEbL_9#D4ovvIHo6C`uG3rea?m>{JNeouBFPtYO(S&9M(c)_K7`Ltvbkd`TqVmpM%tgEJGwu{Uzw*6;S#JE=YNb1FDLl%J**gY6sSaT~2x+6w!8 ztbj{h6#KYyl?QsdBl6~g&Cy|=Fe3LM#j)vmMx^A}dXyN6NSBa?Xks-BM%RYu_ zm(jbRQWETIUVfYml^XwuO|`XuXOS1zxAP)*90YT84}f5%@U&NA@4CYXT=+Em+hS^XuWJZ0fxn(cD?n-A-w3r&WdTB-TZP}-nwKk>=W zz+mFo_KQIC1gtroE3o2i-Zs5kCCb#$T5MS=&EJzrkPJ1Si)0Yt%AyWaF#K56Tsj~o zO3_aZAMjj19>41>liv9w&f00WFCEcu;kGYGF|d|T-1)nbV$nbAO_s+%ebnrrl59g^ zabcS}&*XY4sdvffL^O}4mNAi9>vbuFn5)vW=`(TAdb9NWjtzRM%vZeV<5*KY2mYa^ zK2874bpnr*NV{LTfgAoB-w2`sd@4kesf@>CEB{GrCNH=Y-g3sZOrO!}n`#|WkV&LR zHQcP3jm>)>oQ%kv7++*gtYIxwx}HFdeBtAjQB7fK0OP1!k?XdR*OVmp|7!qmajR5A9~Y@-%gomd?^S z^F8~ZNXRKfCqevFHcirH{v(W!5#@U$7Z?uvPa4_pPP$6A*ns{}aG2J7p}VqSs=B-<&b27+fpXyLppnTQ`lzo@MxKE;2R)U*G~d& zZWV4dv9BV1@_&~%rP#-`N0~#EWH3&x)1TRx+K%LwSW03Q+X3OJ^IZRkBa+P8Iz;{q zws@HI#OPB%#FK#Ro>VQpNowuJIFW;EAlH>;RPQbt!PRB1q!5`eHzGMh+7ilBCce=a zf_;9k=jf;e$k_H)7Esv+o|jvUZ|ocG$P}Ykn##*kpVjxP)^4gsIndWNebbI!sg`sn z-+DD2N*Ca~3@t{}!<~cLZXPC^jpLX4@BlaVbKi_rTRY($_xT09wnX;@mil2&BNOho ztJ9VD=GOzflgI}$fd$T@umGh6UUyMix(kRU$c4mY#h}I;^E|&hgw)=L zPqf~#2wRCTSQS6;kB&x>4Z~q$&su)a+HtERQ?w3JBBKL7;v?3}{jO!G0+*IPEYYD7 zwQuvTgg8;>#Dp4;mol9!Cs~NqC&$+MT3RiK0hrr-+_1I6yNy_POj}gJiADIY zG07Z@F8AY75476_zQNRuHL%%)qs3R{2*v5A$J3t?koRM$&Lg1E1d6R+9UnuYg+&}@ zbt?FqT@unQhal9svk%zDseND;y~5l9aAhBbo~W2ereb)LfOBu4(IhepbGV@jE-9?G zvbUHn@)wS;gpB%PI-SsIu=X=#>@>r4w2_+J6zo?QsI=ompy}QDaRpipzBmL@7EXS?M_)XR?h@t3E~6J3!-6!>n1kp?Gva z=eFZ&in5;RrmbN;t5`yV9$eeK+<>!VB42o2|E6NMMcs15wwMXIx>OeKTvz426Go`= zS$Qx;Yah4ptndv4Cf1C<<%N$B`lYvwaV$J zH2?uEJnNw}l_oN*|-r4>v@(w)|@`#~z%J zg55HoE*YPhL?!njADzClmP~{xJUC%YN#GJ2rtnO3+re;TRun^S=(S{xV?b*_a!lV#l|r9Mu|Rp-wnIk}lt&1U@aU?U&Ay(w zT2&`P!U&L1du}E^!}SehT7Wth>@`4!p29FU#G3vX1owI z0D4o-7^>SA_-6jxUbmD)UB-AFEsBB<0B$)9*LBrR_!xpl68+>QNDJRfm};>K40K?>Qpx^j-W@DT>?iDXU2= zjeNFhpGz~9z$iPUh48QP*kNKDek_7spPQGm@7wwc3kwkyZG5kOMR zz}>8F7B}9k(EuE%{kQ}5oI;-2>YYeVuaH2a&)J%UkeCErat8j%7pAklx+KOS@hiBA z)_AGh3kY4od1t&0QVd^aGtwer{kr3%3zZ_j z?)F58&rGH>XHyk`IC~n^F_9zY9epX2ks4%n5Tc2*aX0P0Y50*<)oia9{id|wFUJD8 z9{J*4WU@tKFig=ajZi)+9{KC{s<+anG;0gBUhqiC{q{^kyN6r%Ied+Z%4{dyA^DRp z9=O5QW1V;n>~ui=CpC>>lZ40d-nwO9pr3ZrCU)+OOOq^xAV;hUD!pW+ol87Z(_}zS z6OhW&OumU{&7uc~KRq_NmrXTlKvB&{L`k52!@|Ew zBUi(B@KjsD=vhM{tl(=kQ6RO0KrJ~N<^ym?c>Myufi?zB~&y?z0sA}WU3bm4C1z6_XuQM$e`@50U`LFTtqDwT0hWf^B^h0 zK6IwYgIW(|!27Tk?y}Y|k0bk>;*WHtN;C?lv{)?%3infsDOitzjoC0X9csGTedG1+X zVp8E;WwmDl?!9A>gUTmbF1ODDXtH!i3DJiF1^K1EDS{e#NK!PW2>K~U3z=$`iB~3km_2QskJyyN z3HH@GluV|Qjv3E_0_XCL$b{Wue+=$?^=V|)JGam_N*d2FbO+y*BdZ9hCK@^v7hcNi z4=ze~#w(Z(jebIXrcnH=CO*fNhs{K`TVD;5rM)CMIk572x9#MS+4D_|TIs7vlqjkj zJe#m3+11mcd*7BA@~^9u@Fuydj-)P+t+fs-S}=tka=$iWD%JB%jOUuW7Y}lrl0Bze zeR;)iTe|QIn65b|9-#C`GsAtXs+x&Ofxxpvg7AbrJ`lsWcbw=n>2tz$RL(~`9F)MY zh!ku1nyaB6Fiyqr!?%$BMKQ@|?b=1y1FU762>Sl}U?L`i zo*N%cZ0c9Wvh2TlVO$Z&^KMSC;vi3bdW&h12uj3cGJsxR+t#h2p z!FuxrEcVCNgqF+p?Pq}O4Ukttod*s2lT7L=bo^Q1uGsvumM*s~YTLH+;8?9%rP5)> zNnKqko{6PE^urxmiZAAo4QDnPCr)mYGrOzn>y%*oU7gudWNF-oLAB)!m3Ml-xWG*S{>C^5rRd*?vZ9zEgO9m-==sY(ZSn1L

ijZ}-(^f5(0=1IyMtMB)|9u0~C{Rmn>Y?FB_F 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 *hzU4B`{NhAu<)$< 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

6w}ZR}C6dRS!bPsv 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 diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows.rst b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows.rst deleted file mode 100644 index ce6a3ed..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows.rst +++ /dev/null @@ -1,93 +0,0 @@ -Windows -======= - -Getting the Inkscape plugins to run will likely need manual -installation (see above). Note that Inkscape may come with its own -Python. If you run into trouble or have better installation -instructions please open a ticket on GitHub. - -Native ------- - -Following steps are known to work under Windows 10/11 (64-bit): - -1. Go to https://www.python.org/downloads/windows/ - and download the current stable "Windows x86-64 executable installer" - for Python 3. - When this guide was written, Python 3.7 was the current version. - - .. figure:: windows_browser_download_python.png - :scale: 50% - :alt: Screenshot of python.org with download of Python 3.7 (64-bit) - :align: center - -2. Install Python 3 and make sure to check "Add Python 3.X to PATH" - while doing so - - .. figure:: windows_install_python_path.png - :scale: 50% - :alt: Screenshot of Python 3.7 (64-bit) installer with PATH checked - :align: center - -3. Run the command :code:`pip install Markdown affine shapely qrcode` - (Note: If the command pip is not found, you probably forgot to add the - Python installation to the PATH environment variable in step 2) - -4. Download Boxes.py as ZIP archive from GitHub - - .. figure:: windows_browser_download_boxespy.png - :scale: 50% - :alt: Screenshot of download from Boxes.py project on GitHub - :align: center - -5. Extract the ZIP archive - (e.g. via the built-in Windows feature or other tools like 7-Zip) - - .. figure:: windows_boxespy_zip_extract.png - :scale: 50% - :alt: Screenshot of Windows tools to extract the ZIP archive - :align: center - -6. Change into the folder for Boxes.py, - e.g. with the command :code:`cd \\Users\\[USERNAME]\\Downloads\\boxes-master` -7. Run the development server with the command - :code:`python scripts\\boxesserver` - Note: You likely will be notified by your firewall that it blocked network - access. If you want to use boxesserver you need to allow connections. - - .. figure:: windows_cmd_python_boxesserver_firewall.png - :scale: 50% - :alt: Screenshot of command for running boxesserver and firewall notice - :align: center - -8. Open the address http://localhost:8000/ in your browser and have fun :) - - .. figure:: windows_browser_boxespy.png - :scale: 50% - :alt: Screenshot of a browser window running Boxes.py locally - :align: center - - -Additionally the command line version of Boxes.py can be used with -the command :code:`python scripts\\boxes`. - -Windows Subsystem for Linux ---------------------------- - -Another way of installing Boxes.py on Windows is to use the Windows Subsystem -for Linux (WSL). This requires newer versions of Windows 10. Once it is -installed (e.g. via the Ubuntu App from the Microsoft Store), the installation -is identical to the installation on Linux systems. - -Once wsl is installed, run it and enter the following commands: - -- :code:`cd ~` -- :code:`git clone https://github.com/florianfesti/boxes.git` -- :code:`cd ~/boxes` -- :code:`python3 -m pip install -r ~/boxes/requirements.txt` -- :code:`python3 ~/boxes/scripts/boxesserver` - -.. figure:: win11-wsl-boxesserver-localhost.png - :scale: 50% - :alt: Screenshot of a browser window running Boxes.py locally on WSL - :align: center diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_boxespy_zip_extract.png b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_boxespy_zip_extract.png deleted file mode 100644 index 2c45312fe6446f361e1194fd1813dd1ac591a756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43195 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 BJ6`|* diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_browser_boxespy.png b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_browser_boxespy.png deleted file mode 100644 index 5adeed889bd3c49d69c011fe51af2248b9b912ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38916 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%0DkGSgfUP_xKr~8%(=8S!Tx!mRHW(Hea9uWuLDo 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 UcEYTC0qCWpc~_%U-9F;~0g*w2UH||9 diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_cmd_python_boxesserver_firewall.png b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/install/windows_cmd_python_boxesserver_firewall.png deleted file mode 100644 index b3f8e76a6590f9d43dabae29b85f406434a501ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50085 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�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

9Xbg$`MHy!Flr*v&W4AfWHH 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 hhkG0Rcf*H${~x+5NNUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/modules.rst b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/modules.rst deleted file mode 100644 index 8a714cb..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/modules.rst +++ /dev/null @@ -1,9 +0,0 @@ -:orphan: - -boxes -===== - -.. toctree:: - :maxdepth: 4 - - boxes diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/overcuts.svg b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/overcuts.svg deleted file mode 100644 index 39e6a8e..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/overcuts.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/static b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/static deleted file mode 120000 index 1bf4a07..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/static +++ /dev/null @@ -1 +0,0 @@ -../../static/ diff --git a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/usermanual.rst b/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/usermanual.rst deleted file mode 100644 index 4428a7c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/documentation/src/usermanual.rst +++ /dev/null @@ -1,253 +0,0 @@ -============== -Using Boxes.py -============== - -.. toctree:: - :maxdepth: 2 - -Boxes.py is made of a library that is not visible to the user and -multiple generators -- each having its own set of parameters and -creating a drawing for it own type of object. These generators are -divided up into different groups to make it easier to find them: - -* Boxes -* Boxes with flex -* Trays and Drawer Inserts -* Shelves -* Parts and Samples -* Misc -* Unstable - -The parameters for each generators also come in groups. - -Units of measurements ---------------------- - -In general all measurements are in Millimeters (mm). There is no -option to change the units of measurement and there is no plan to add -such a option. - -A second way to define lengths is as multiple of the material -thickness which is one of the standard parameters described -below. This allows features to retain their proportions even if some -parts depend on the material thickness. - -The description texts should state the unit of each argument - -please open a ticket if the units are missing somewhere. - -.. _default-args: - -Default arguments ------------------ -In the web interface this is the bottom group right before the -``Render`` button. These are basically all technical settings that -have little to do with the object being rendered but more with the -material used and the way the drawing and the material is processed. - -The settings are - -thickness -......... - -The thickness of the material used. This value is used at many places -to define the sizes of features like finger joints, hinges, ... It is -very important to get the value right - especially if there are -fingers that need to fit into some holes. Be aware that many materials -may differ from their nominal value. You should **always measure the -thickness** for every sheet unless you have a very reliable supply -that is known to stick very closely to specifications. For (ply) wood -even a 100th of a millimeter makes a notable difference in how stiff -the fit is. Harder more brittle materials may be even more picky. - -burn -.... - -The burn correction aka kerf is the distance the laser has to keep -from the edge of the parts. If the laser would cut right on the edge -it would cut away the outside perimeter of the part. So the burn value is -basically the radius of the laser - or half the width of the laser cut. - -The value of the burn parameter depends on your laser cutter, the -material cut and the thickness of the material. In addition it depends -on whether you want the parts to be over or under sized. Materials -that are spongy like wood can be cut oversized (larger burn value) so -they can be press fitted with some force and may be assembled without -glue. Brittle materials (like Acrylic) need to be cut undersized to -leave a gap for the glue. - -**Note:** The way the burn param works is a bit counter intuitive. Bigger -burn values make a tighter fit. Smaller values make a looser fit. - -Small changes in the burn param can make a notable difference. Typical -steps for adjustment are 0.01 or even 0.005mm to choose between -different amounts of force needed to press plywood together. - -To find the right burn value cut out a rectangle and then measure how -much smaller it is than its nominal size. The burn value should be -around half of the difference. To test the fit for several values at -once you can use the **BurnTest** generator in the "Parts and Samples" section. - -format -...... - -Boxes.py is able to create multiple formats. For most of them it -requires ``pstoedit``. Without ``pstoedit`` only ``SVG`` -and ``postscript`` (ps) is supported. Otherwise you can also -select - -* dxf -* gcode -* pdf -* plt - -Other formats supported by ``pstoedit`` can be added easily. Please -open a ticket on GitHub if you need one. - -tabs -.... - -Tabs are small bridges between the parts and surrounding material that -keep the part from falling out. In theory their width should be -affected by the burn parameter. But it is more practical to have both -independent so you can tune them separately. Most parts and generators -support this features but there may be some that don't. - -For plywood values of 0.2 to 0.3mm still allow getting the parts out -by hand (Depending on you laser cutter and the exact material). With -little more you will need a knife to cut them loose. - -inner_corners -............. - -How to handle inner corners. Inner corners are an issue as a round -tool like a laser or mill cannot create sharp inner corners. There are -different options: - -* ``loop`` create a loop that fills the corner -* ``corner`` just a simple sharp corner in the path that will leave a - radius untouched. -* ``backarc`` naive implementation with inverted arcs connection the - straight lines. - -See also :doc:`burn correction details ` - -debug -..... - -Most regular users won't need this option. - -It adds some construction lines that are helpful for -developing new generators. Only few pieces actually support the -parameter. The most notable being finger holes that show the border of -the piece they belong to. This helps checking whether the finger holes -are placed correctly. - -reference -......... - -Converting vector graphics is error prone. Many formats have very -weird ideas how their internal units translates to real world -dimensions. If reference is set to non zero Boxes.py renders a rectangle of -the given length. It can be used to check if the drawing is still at -the right scale or may give clues on how to scale it back to the right -proportions. - -Common Parameters and Types ---------------------------- - -Section parameters -.................. - -Some generators support an arbitrary number of sections. This can be used for rows or columns of compartments, staggered heights or otherwise dividing some length in multiple sub sections. The standard parameter making use of this are ``sx``, ``sy`` and ``sh`` (instead of ``x``, ``y`` and ``h``). - -Most generators will add walls between the comparments, so the total size might be larger depending on the number of compartments (and additional walls). - -The sizes of the sections are divided by a colon (``:``) e.g. ``30:25.5:70``. Instead of repeating the same value they can be replaced by ``value*numberofsections`` e.g. ``50*3`` meaning the same as ``50:50:50``. To equally divide a length into several sections ``overallwidth/numberofsections`` can be used - e.g. ``120/4`` being the same as ``30:30:30:30``. All these formats can be freely mixed. - -mounting_holes -.................. -Some generators provide the option to create pear shaped mounting holes. To generate the right size holes, the shaft and the head diameter of the mounting screw must be configured. The format is "shaft:head", both diameters given in mm (e.g ``3.5:6.5``). If only the shaft diameter is given (e.g. ``3.5``), a round mounting hole is generated. Setting the mounting hole diameter parameter to ``0`` disables the creation of mounting holes. - -outside -....... - -Most measurements are internal sizes. If a generator offers this parameter it will re-calculate the inner sizes to fit walls and outside features within the given dimensions. This can be a bit surprising for edge types that have protrusions like hinge eyes, handles, feet, etc as those are typically also taken into account. If the dimensions are not sufficient to accommodate these features the box may not work properly. Most generators do not have checks for such issues (like negative height) and it is left in the responsibility of the user to check if the result still is sane. - -For generators offering multiple compartments this will also fit-in the inner walls. It will sum up all sections then subtract the space needed for the walls and then scale all compartments so they will fill the remaining space. - - -Edge Type parameters --------------------- - -All but the simplest edge types have a number of settings controlling -how exactly they should look. Generators are encouraged to offer these -settings to the user. In the web interface they are folded up. In the -command line interface they are grouped together. Users should be -aware that not all settings are practical to change. For now Boxes.py -does not allow hiding some settings. - -Finger Joint Settings -..................... - -.. glossary:: - - finger - width of the fingers in multiples of the thickness - - space - width of the spaces between fingers in multiples of the thickness - - surroundingspaces - amount of space before the first and after the last finger. This is in multiples of regular space between fingers. The actual space is larger when needed but can be smaller for very short edges. - - style - how finger joints should look like. There may be more styles to choose from in the future. Note that snap fingers will only be drawn for fingers of width 1.9 and above. - - extra_length - Make the outset part of the finger joint longer to allow grinding off burn marks. Note that this may not be great for non 90° joints where the corner is butted against the opposing cutout. - - bottom_lip - Generate pieces to be glued on the inside of finger hole edges. This allows stacking boxes on top of each other. Note that finger hole edges that are used elsewhere may not have use of these pieces and you should probably just delete them before cutting. - -Stackable Edge Settings -....................... - -For boxes to actually stack they need to be the same width and depth and ``angle``, ``width`` and ``height`` of the feet need to be the same. - -.. glossary:: - - angle - inside angle of the feet. - - height - height of the feet - - holedistance - distance from finger holes to bottom edge. May be reduced to save height by sacrificing stability of the connection to the bottom of the box. - - width - width of the feet - - bottom_stabilizers - generate pieces to be glued inside of the bottom edges to stack more securely. Use a value a bit less than ``height`` ( + ``holedistance`` ) to leave some of the feet sticking out. - -Colors ------- -The generated files uses the following color conventions: - -.. glossary:: - - Black - The outer edges of a part - - Blue - Inner edges of a part - - Red - Comments or help lines that are not meant to be cut or etched - - Green - Etchings - -Normally you will cut things in the order: Green, Blue, Black. If other -colors are present, the meaning should hopefully be obvious. diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/box2.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/box2.svg deleted file mode 100644 index f667722..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/box2.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/box3.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/box3.svg deleted file mode 100644 index 386cef5..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/box3.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/castle.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/castle.svg deleted file mode 100644 index be58646..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/castle.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/drillbox.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/drillbox.svg deleted file mode 100644 index 4fb65b4..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/drillbox.svg +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox.svg deleted file mode 100644 index 467a1d2..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox2.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox2.svg deleted file mode 100644 index 6c01d2a..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox2.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox3.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox3.svg deleted file mode 100644 index e277c8b..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/flexbox3.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/folder.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/folder.svg deleted file mode 100644 index 419b438..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/folder.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/generate.sh b/extensions/fablabchemnitz/boxes.py/boxes/examples/generate.sh deleted file mode 100755 index 73e7110..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/generate.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -BOXES=../scripts/boxes - -set -x -$BOXES closedbox --x=50 --y=50 --h=70 --output=closedbox.svg -$BOXES hingebox --x=50 --y=50 --h=70 --output=hingebox.svg -$BOXES castle --output=castle.svg -$BOXES drillbox --output=drillbox.svg -$BOXES flexbox --x=70 --y=100 --h=50 --radius=20 --output=flexbox.svg -$BOXES flexbox2 --x=70 --y=100 --h=50 --radius=20 --output=flexbox2.svg -$BOXES flexbox3 --x=70 --y=100 --z=50 --h=8 --radius=30 --output=flexbox3.svg -$BOXES folder --x=165 --y=240 --h=20 --r=10 --output=folder.svg -#$BOXES lamp --x=50 --y=50 --r=10 --output=lamp.svg -$BOXES magazinefile --output=magazinefile.svg -#$BOXES printer --output=printer.svg -#$BOXES Silverwaree --output=silverwarebox.svg -#$BOXES traylayout --x=4 --y=4 --output=traylayout.txt -$BOXES traylayout2 --input=traylayout.txt --h=50 --hi=40 --output=traylayout.svg -$BOXES trayinsert --sx=70:100:70 --sy=100*3 --h=50 --output=trayinsert.svg -$BOXES typetray --sx=70:100:70 --sy=100*3 --h=60 --hi=50 --output=typetray.svg diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/lamp.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/lamp.svg deleted file mode 100644 index 061e2eb..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/lamp.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/magazinefile.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/magazinefile.svg deleted file mode 100644 index 0930a13..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/magazinefile.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/silverwarebox.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/silverwarebox.svg deleted file mode 100644 index 26cf5a0..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/silverwarebox.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/trayinsert.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/trayinsert.svg deleted file mode 100644 index d861588..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/trayinsert.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/traylayout.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/traylayout.svg deleted file mode 100644 index 4e24fcc..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/traylayout.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/traylayout.txt b/extensions/fablabchemnitz/boxes.py/boxes/examples/traylayout.txt deleted file mode 100644 index bd05b85..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/traylayout.txt +++ /dev/null @@ -1,13 +0,0 @@ - ,> 40.0mm - | ,> 50.0mm - | | ,> 50.0mm - | | | ,> 40.0mm -+-+-+-+-+ -| | | 60.0mm -+-+-+-+-+ -| | | | 50.0mm -+ +-+-+ + -| | | | 50.0mm -+-+-+-+-+ -| | | 40.0mm -+ + + + + diff --git a/extensions/fablabchemnitz/boxes.py/boxes/examples/typetray.svg b/extensions/fablabchemnitz/boxes.py/boxes/examples/typetray.svg deleted file mode 100644 index 2c01f77..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/examples/typetray.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/locale/de/LC_MESSAGES/boxes.py.mo b/extensions/fablabchemnitz/boxes.py/boxes/locale/de/LC_MESSAGES/boxes.py.mo deleted file mode 100644 index e409ac44442779156c80f8dfec18dc87fc9a70ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57153 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

{p)>DdRX_MDzV5wv!MHw?TZ6i*0BeNMSf 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 PSE8ZEJCsp467>H8Q?95x diff --git a/extensions/fablabchemnitz/boxes.py/boxes/locale/en/LC_MESSAGES/boxes.py.mo b/extensions/fablabchemnitz/boxes.py/boxes/locale/en/LC_MESSAGES/boxes.py.mo deleted file mode 100644 index 78e21f2476254bc46508993a2fad3588f4d264df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54196 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 hBPivs5S70|GW2_#`tj6E|wGoAEwkG&)r+)zM4 z@wp%fE(oqHf+C0@3P=!e0~Apd74Rtv_*9hVzWjgRsdJZ}nE>y-f5V;c)?Rh$)TvXa z>Q;WX%a)f${MxsOqW!@0_l}}hZ5c(s>5^|0{d#^B-M(2AJp-PM`x6TY1OEW-3O=zg ziuM8j2<{B-uqcZ50ArABq9ee0;4xqa_!e*`cq7;i{v135oV+-Ss6uouX!QV za4Ya(a02)PQ0;yS+y;Ceqkfoj)3K(%X2I$Lzw9aQ}NK;=IToDMDqj|4Y3-UM!o z`&m$Qe*xSM+e&0jk_VQ1n{^s@!*j;-4$QJ;5)62Y}xJ4+DP#!lKb$ z%cJNJunSbaXMplQ58NO8C@B8C15`U70>wX%fokWo;7;HlK-F`LQ$js=1Ye2!U{G}L z1ZRPZ!0F%{LG{mPLFM}(xHI@eQ0;jJ+yQ(JRQ>-3svf(X8p00+Rel?&@@Ig`XD+xi zc%r*s2~@ltR)u(bf}OahfRabA2E`xi96#dz_kfa1 zKLxi3e-0i2{vK5Q+D;2}n+l3<$AUA!GeL#F6PyNK?C#qg?*K)QuY#h-Mo{DJd!Xw7 zQ&8!j2PG%|2#U}C4DJqYd3tEaKA`G94Lk^31ggGk!9Rk-U<~#lG}XTsfO~+KgX;Is zx&Q4TSx4Un#oq^=8R$11)cELjcMqs~tp~;5BcSrV7F0id1ysM^3o8FdJ^Tq!^!|h6 z!Dog3I1N<4t#%9|1Q99|c91$3W5Lm!R7JcTo98uMYBJ z7f|VEgUWX`csN)BmH$?}4ug{IDFVG+?`d{tgH#^?x_zlPJJ3axbJsCGOBsvZ9X_W}1@9r&vYlzTa-`mO~P?@i!D@Pl9s-VQ3> zj~)LT+zxDcJOjg?YIwAJH88QocUBM+_T2?4zn_50?|D%Cv14zT?+yW#UpJ`yR)LCN1r`5%P;~e>sCd_bdxCd> zYS$y6;y(et3VZ?7xSG`$%9#sJ#eF)s1^6~_OYrUB=HRU~Tx^!u5h z(l9Q1n~_svph+#XlE= zZQzyef4}=b3~q-1&q0;<3sCiW22}t38B~5-4}|)~pz7BSD*yT5vEUL=`MeVp|6dG> z|1WdA7F7Rz1w0UZ7*zV-gR0+OLD6lyLHx;R2T=L#SqlDpgU8_B51a&^2}&-!5j+fh z7pQ*x5~zG00M#$w0#*Nqz^%YvgKF1rLDl15U>kVAnn1@zpy;~7-LG}`8pkFmI-Luu zeiwkE|2sVV5^!7GSAuHaHK5|(XK&5{Y zRDGWV=YoF$m2OTslz%*^^5;1&a9r$o5~%nmgX*u9pz`f?{|YF+Xn^X!3qkSM6`;oH z=Rno#JD~XF=k9(16n||y6!PB>6ul>bYTsd?@|_2^gQtPh!1F=LgPTCf&2NF~|EEEf zvtuQce=v9u?m3{^{aR3bbQO32csrDom397%g9S;4zE4Ur*iQo=kJE(RY15N=KfYZS$sDAnw_)758jyHqi`@2E$$GxEH zc^@eG_9Uow`~?)9c7A>6k2dfK+%w(17L0MP180CA1lz#}K(*sfpvv8?=Jf?tZab)Y zcY-Sac+mI*RDBnK2ZKvMjf>ZV;*WLU_TU>q#d{~HdcF@-yz4;G>vN#!@EE9co7Y4B z+kh%>J9lpnDtsqUdw9RH)hoxx#n7w~Q1A>gH;=7T%HL&3*D(e>Y;>brk4q?-pS z{z_1McMhm=e1+rHj@LTg1gf65gDUTC_kRRbdmjhYA5Vko&u2jO*PiP_xaRON(f8LL{wyfI{5`026V?Ygz8|Re zF9!Dnhrnsz1z->O1yFpk`-Z>|9pGWOPX{%g&jZ!|E5W_MPl4*+J3+Po0Z{dL#PLy3 z?f;>>p9U5G*Pz<{2Y3G&oQZq0kwDkkpvqYcsvXNf^-l>@|6J(!UdPKFuX4Nw)Oh(k zsPb+ByTCg^(fN5$_52s8dPL_0|E)m9-^Fo1P<(SJC_SYcR6EZHRloOu%I`8z=|16j z1E_j_2~_&KK-K@Jp!)Y8p!#vEH-z%H0~LQKQ1Wgs$64Sq+{;0gdljg9U+?Z4K$U+R zsCIlERJ*?ks(ufGdw`FE>i6G(2Z1}kG0=53xD)PWp!no0 zzX8VJ3*ba>_csOpI0D=k_o?9SU+#6gDP6F3}D(Bsx@_i3@GJnWEKv3C2bJ$yQ006ERDWC#itlf8ydOLk_YXjgr`^sC zp{u48RrG;0oAS#fQt7CQ03j|c&p=`j`uk} z==cN2pE*A5_*=(6fwRc(U*P88%=1Hi4+mBMW8FR9@kGZ{z%2UbvzGL zKffK^61)&pzV8NK0bb(xAyEB&H7NeO9-I&U2o(SC|BjIV5unD;JW%B>1C?%t`=1S} zerv!vVBOs}f{OnoQ0=(`6hA)%z6$&WsCpfIVZf=5GaL_hJO)&I=7C#--Js~Q#Qlq) z+BpCkzkF9TIx6;%2QK*`fvz=Od1LDBa)_x}qhzTECzq1|nc zQyr&)-4LV$+?S58U(6bq`0x1->Vy9;LDBoq?+JXi-FrhlCxcV)KMEARdO`K~Ah-bh zEGRkr2XG}g?R_ENw}R@&AA*y?$H5c9E#4pKb}}e_J{w#Jj)1EF-QYCvr=aLJ;gV2~ z1Hp;7J3+~r6`T1}gtYK=u1y!6U(4E(_^S0!6PnI0O7B*a<%97=19*rwg2m z|7oDgyWHJ(yLDV`u}U7=?T zz8APV{u3RK07a*zp!(-R$45ZX<$wGr`%o&jzQ1mw>9@Mo{#62HYR~8>sf|b!8}TA5ijOI;e72 zf(l;;iXS(CN`E1^Gk684c-Oo8JMMnM-J5+Z&|z0l@n?aGzYtVDgP`g$0`3BS5LEfs zf#QRQzzN{r!9BrOTow4>0I(nT(V+O`egKTY--4TgJAOQrv$NygjuXKH2%iFqPZxvxfvZ5Zrv_@AUjR-7zW|C~ zz7MKi&w{T4cltzdF9(muy$j(<1$cub_%HU{h;c7A$TD8VNmh!0Ji|Y3Tk|O4cr%e7!;j<15N^? zPY3=z2$Z}!7CeLux`nvcd?vL2z2F{-4sH*A6%_w|3mgWY29@vW*MxLyLDlDdpz3=Q zsCwN8iccN@Ri76?)o-V3L%$pdD*xj^<-Y_x790SN13v|-oL_*d|6f4y<-XSizMKY% z?@x61S>R0E8$gx+S#WdkMo|2H6DWSz2yO}f98|r21!_EQaea_OM}gbnZh(uxb3u*k z2SC;LDNyzO9Vj|Y_-qT!o9F9gLOHBj+C1&ZD`gKE#0LDla;$A`ff_xHdV;2+(6 z@D0Je093kl;6dO!L6v(WsP=yy6yH7yY8*ZXc7R*l7}9ltO1BUc|EvK;&o_bFgI9rS z&yC;&@EeZbcYMO}S;zkd)t=~cj7?x`Q1v?lRJ+UIj^M{Y@x|xBZNY~?)$d23+W$Og z?FF~SeemZ)e@p`><6aC-1&2Y&p$~(Hg13We|C6BP@t?sd;LbM%Ivx$GKVJiiuip=< zy|;m)!{gvq;J-oDcdIXib{`3w}9fWAA+LOb~lIe_W)Ji3~(o~ zA3Pdd56%Q{26qO31x^J23U+||-V*XZ5mdQngW}IOfeQZ!*am(JJRE!hl>9pEi-9hS zL6uhrMW6G*UBQooF?g%Hf9US#K+*q|w+4Pa7*zTbK&3wmR6lG0cLUD_H9jr{cL#3* z4+ifCC5L|lD&E2`1-iZ(R6o20lsvi?)Hu5V)HwVCD0+SogoUC9K=IxB+d}&HgGb`N z6;wNZ=eWh~fo^+(%I_#}HFzAjCwL{Odfn>o$HDDz{}ELE{_Xy|eL2LR28zGB!85=z zsQ&pnDEj{p6o38+6n*{z#^APhg#Mlis-4}S+EW3=A8!S>0Y3>Y25$f@A8<$9e*x8h z+k7RYI|SSV_mN;bxC~T#-UN!zF9k)nuYgO*=q`6}e`gp^JAtnud>?QcxE|aa{3Iy; zy%SXZ{sAhV9q$VC+XYmA?+I!g%mzj8qd}Fw4Ai(809EgId-z8|;{#Ciy5I3fp!)kc zQ04s2{r}*&<=r9v9^ejyw}I-%BS6vX7*PHTK+$_8sQxQDz8;jEdJ`!Aco(R8-wP`J zH^G(QBcSNr_O(Etsi4x$0+ru9Q2C$ixEhpP8V2_Q&jBUZE^+@4x&J5K|Er+J{k@>* z@(_3e_ynl>Ot~k}VLGUIGr`Tl;~eKYc7uw)2o&9yf{I^oEQ6x&dQkm$5jY9_2-pVR z1&XhK4T^vM39A0PZ4B;qP~*58RQr~IihmlY^45ZL!MA`5z^{S(f?MAk#?e8b=CQ?~ z`n%!yPH+G>fAF+Sl#=t3c6bHMlw03(f`mLB+cU6y0wJw+HVA)sGK? z>ZhNAs{hYHjnfw#w|+2`w-2cCGYM2b9|?AXbHO9PIw<;H52{~o05y(p21U1TgA2fC zK&6}hP~gu3I1l%E;N{?bpy;&v;h;CX8C3WU;6(8EpxUv^cLRO*2DisO3!DJX167Zu zj?2KEaG&Dt9x%q;2P&Tn!0o_`!P(&D;LhNKpxXH)cqsS`sCj0m?}c(Y9FKDBc3kFo z7N~wKg6iigC_X(ORC#xSs^_;r(f>Q3;(yP>f8zLSQ0;yJTnO&*NNDfbpz6OCRJt0d zeBbDJq5FRTRQfAH(e-Xnbb10*`e#A)*YocFGbs7_FHrJipYJ2f!A@{T@Dfn<{sgFe zJ_U+ip9huCJ)rpT0Z{pW8`M1f2-pEW2ObLU^JtK(bHN>OzuIvPsQgC2UBGvNUEr0V z%Kt9d4n768fjj;n;E|x(Spb#)d7#GMb?*OlQ0adKs{VflRlmQ28c)#=!?@W7+zsb; z;L%_VD&A{AwYL{k{VJgHKNox@_+e1|aSf>Y-3O|i7eLYDPvAoEZ{RWD+{Xf6z8O^h z?{W8KpvwOYDE|8jsQ&mmsCqsHieArv%J(mz^8JUq=l>}5+agf$UJI(eL*Od#E#PeM zQBdV>_v4_i?*gjaE>QAg5vcl~=(q$_{F6cT^D0pN^J=gYtbqG~SAi<`4p8*|Cb&EJ zV{i`mdr*=(GS-y-#pl2CCmyfs!9RpvoHtp8?+h&IgM>4f^l3pxW~XQ1LeZS?Hhb z9rtiN(6P<2({YaDe8(k@s~leoo=Cm}py>YvP~-ZGpz3`WsP=u`@jIaC@TlWYz!|vz z6I8$K_C%=fWKeu`1b7g5Jg9Vi;4E-0*a2Pz?gKsq9s@oLs=UchhWU6psC>@^mA(uf z0M@qP>L3cdgy2yXLK=$AH7{W=>||8;|+ z`(jY^S>bpZxEby z|M}ol@DlgG6IA=|234Q?K-KdxP~|@Xsy}}Ls{OnEBG7eTa3b!bL5;Js-CYCKj~@U} z18)XJj|smFa$*uV6ZaXQ%DWiU__`826ubpI4tyL`|Lya1;G;R9>ahyc_&pyy1iaMU zcYxxjZ-X)T1gLgLzY4gy`h$?tpq z@)yGNJD=yTy#I=PO5ia(@8(&~Go7#>g1_VW1J9PknZ+~2J1i8P!21C2r|?|B`|dnf z@_do!4?LeC&hg+}o^`y>2TvsK6+E}|Jc-|j@w<`dZMgez>sRKPM*WY*ubpQu&yRVI z;E~+E5j=!6*YSKA_uj-^fM1jMZ-U8hG2z?ud@Av9oJX8nc;4@E@5KKD#5)pv5Wn|$ zyg%c2AkXOEX~b!x%+=t5Jpbm=?9QU7je>2aq#Q6@m0KZp)vqAli z02hJ3$4|f4;ocg&)m+#sz>negQI9Y0h5p{*X)eP3N^jGSxwehqe;DpFNV64jf6H^8 zr+Jm<@eabOy#K)c@8|vVDuiDdzrXVwj-O;| zxF>_7e>c0wpTIW48$4(7zAt&6#QT4f?p#kdhxaYKtP^?HuMfQ2!!P6g)4X5cZiTPm zIUDy7_&xXknF9DdPyDxne=}G3^G`tY^;*In=F#uhAj^*EjXWRrJYo-1_~Y((N6t_F z@4^4qdhy?8)cro*2Z^_uXC2S=JZ~W0Li`UU{1V*yU5wu$JkxN$5lnus#=Qo2mFH33 ze+F&~KIaiWoJ0gaLYTg9{UE5{*~H8Lp2i`auzb?m1dHBcf1Wto zgL~or0r(G3^CgAhcRTJ^@_d8mINbW};Bhtw-;VnbXixyp!o45woxHCj?lIt}J?_<> zb}hIDznzKq2Czh&V>}M8=})@mO~jQBd>7c~=@sGI#NUeN4&E2=9OmgK66aKZe=YA@ z^L!5X0hE>ecI4$`{GR~-P1x(feR#Gd&Mvqg;r(KssXY1L&q?zX;m7ivqX+jYp0DwI zf@c`NcY*pX3lL4k?>wG4?q9)wn5V|m@Hm3+6HYYyy^6p8h2v{r5B{$PZ{hh3?|bmn zdF~^8Z}4dR^_$OgJkM)AlkI8CCwTu2e#vho@%3AR|CzjB$omg@KNmaz_pTm(Iquaw zU*Ne1zshXJJcklq zoE!T&Y9ugC8m9{uhDC*XG!&v$u$2lxS=hk5k-5q@{`RB-q5Jixnte+&@) z8T^XB3%*30_k(A7`XuO4+*jh*EAaq#r%uW5F~TR|exIlN6Xo1a;3YhDp8vvsBYsWr zUtl-SHoPz9iAi@L&$hfji@$y+@O}}`M|l4R&)ePqPx$?cN58uJ?FANbe-eBhVMl`3 zgXe;6`0v286Z!Ap>AsD7Kc1<$_jf;>Q5W&`y9(SJdY?*#sy=jR^xblyMY322V}p7by|cIA1k`SNE%?7w3Q z@nEgkf9#~eMq{`>XZrNPLhsr_Uty%9RGmIttF9^bHl}yZIDFPo?LE~E#rp8bq~qr4 zrDJ&HnCXS%;!-^>RN^t&tY5#rW1!OPsMZFimrK3HO1)U0J}_KvpV={^qgd$}Yz&nr z9k*<_Scz9uo3-AeWkwP4K(SJ+6&lrAyuMayG>A~zME=7gjlpWgikNiVa&st`j`)N| z++Qp-nzdp*?x{8g8dKuF>bhd1P%6i3s-;S!J}vGq7dOPcO}!3Q z%hXAc>*Z>rZu!@HYsK{nQ%>MOu}}kso8@wGBt#x+_728F)mpJ5^xXVrqfsu_M&f!y zd95$e#@<4$HllhC)JntFzs=CH;0GIBh%u>`fA)$sPJE0ulBAjs!8&j)p6v|5G55F zaidrxyFwX)s#fM#ua^6YHC3ij7??0&Wi>98%hmNEb9wiS#O1HIG=f*V#c;Gw6n26t3s;_OY4;ECRYL5ndJziI=HA=nIZX~W0H&{c8 z1$dCbRIE|3I^9UY_}UP!$CFCYeRVnv>X6)uWbierL-Amt+^_1ug+p;7dQ_!irMFzI zGfq1KH_lx-JDS_q7gJ=h1`~w_sFK4rmK0cOl&T7<4;Oli@!H~W0~$Bh7ZDW7QmqMt zMlJ}U3esJ2sp-+&a(O`?11)`tR}>o!%D^Yki`c!TT5og6_=iHQ12u%;3x-c+9pf2E z(jY}8F4k&GxLU!tUXM>LB2O6I@q$XygJED1| z%1Xv#f;p;a;Pe`wTCGwcDK@Foj$)*q;0dy%R?q*ycsM? z6s3tZlvOQcWy3)hfKHmNnHG8rJ#4tH`L46xHx}$zDwKht^(9Xv^0LK}Y8Jwa14fuU1mhy{5`xC72JFiRT@& zu`(YfWwr@0+8ePT1;KLEq+l~zG#{z1{!3bADvpL|(sUEF)`3!pUOc`8ZyF!YLU_!W zWU{>Df1L2B)`Zqxt1EB0rUglTQl;7x&ClL*5o)NH2zeu{x>CAXA_&TbIut>qGqfj0 zh-s$&Fc;ImXtt#)YvS(qh0>O2PCv7fMr#$+u|{a!J(lsao0kb@pE~3 z>C^6f>7s@U2#ekVHyCu6Bo9p<_m@X(4x+xr0*uT|++C{oB7+0%L|3bJz4uhj`3lra zj%cO2a#M)qn(6@V0k?~S7O3|zDOU^@%l%0VbF@T37h@Ww8q$3lsFSAVNqC=(5>zNN zbD;M~!mZqR>oAIjvI>cOhR%})Nik%SU&AYDTonz4`9}=JpnwUrVCgQBu4Gd{)U8=d zES|h%HCzxaC^LPcb(VVTiqh)LMKtZkS4tYNht#pkFJx*^D#t9kdvqlsU1Ne~CP6dD z1kFlLmA!BVQpq{b#r9~y?0gqNiZIOCbZ@^?R%M6H2^C4)Z2o4o0O$rWcGgFfS zVNj*}n`N5FoE{ebTAnN_H5NB}Fvl)l*=;Qrs>MQY81n4S7WdB;KCY7q5 zu(6h-fvF1>Tl-l|&h(!UG&s6ErP5fhtRTWzw3(zjxjEERtaZd)Hu{DN8#<)RmwHPy z8xzA!SZ6~Arw~}_c#O5w2mz-RkeN{=0L7EpG|M5ICDD?3#lledn-#o7vF588QTCbz zFO8O-u_Rhr7$}?rofe9}^Nw7^!deU^%cbnBFk=YuM)~9-V{RI1B4lidnqQq}%(av$ zDOy@ZYPr1cDL2&xnkj4qh4E6XpeL`R;nIasDMSiWwgy>aP=LmoWPfT->4@hsQej8N zrp9Lj^B$UtG7mF)V^ECM+hBOw>OORDkXdu$l}JMwkbkMLh~>zTsdh}D%?JxMqo-EDf@FPMh)*sK70{ws`$Q)%SUMLjKgSj! z?xoPgOT}g0mR+Re_LgYvK(W)B+Vbrl) zS0FL8GFdKrpV2`RoY=Oj+g8T(pIeQ_M#H7AD=JzRz6J&egs zPvBXyRD`EqU0J3%WoJ1QG{K*|l&iE?!;PhSsR=Pg zrC=5G5(#Qm=?u(*rGBVu7Hx;D9;Za7Mw*~HXNY~%w=9Br9hC;^tu-(S8Wo^At8o}> zddN3%szJ$c9M{(s?A9>Yi;>6xMH|89mD*a_;J^$s%6_F_^1cLKo6hT0L%%Ol>WZ7cmEmHZoPW zhJ-qqkh0h1Y~HlSaB{BH9t29$*eq7S%;Lvj2X85N1v7SW{MN0I^->!T@i^&BY_v%e zq1Mb@Q_K<-g;jD`9tW#awI*wHFhVw>$n?3BI6Ni(Arw9uGE`LPvfM5=3|H#4n#rM85jzM@pdwkAU~>5|uc zUYaK2CGFBZ=VaR=b=&--eb#7pXKZuIN+KUiW2(P;!W4I=s%qKl0E=i0V#BEy%cvj{ zpkYq(O*xB7E5}W0<=Nh%MKGzOm?~|4STa~Z&Yf#b64AG8_DLsQB}?Pjh8_C7h_Uno@0}&V6RpyouKt41ZnXdn@GEX zw)v36Pdvs(J>8akqq5I?=8~9cyc}sTVu5N62&2>17$`utjX*?0&7t}Ce8Mz>)F-9O zTQ+3|VCQ47#OyaH9hLD>vVHI{c9Tqfq=(W**~7dJ!53Se7RI)xmX;^lsHA9R=Zpxe z$Lxrmz?FYuGO)|KikZM1yQNXGKf2wFfP zKA{)UqE$wvq(&lyMo{yIIwnjweNelHO*SiRp>@=ZdpiWY1-*m{B(A&}Rwe7DhGm-$czWD>I1j>zjNVxCPl{cVksZYXgM z!=yk2KV=P1TuW@X$%D+1buPZplt0vixiM^3nJGtd*Cr8Mh#biS?GXUg^)#U(dl!4s zrAkwqN)~JxonZOoURw)WVwNHc4zFGL_tv;Us&&^2(mO-G^=Re#swvdzOD+ve686_$ zs-DTv8$0AyMXNL~=uejMs!DNPu@cNc7TW60M=UWL)C*=+T~)~(`6#fQcIUM*Iau6K zU<*iwFcy1E|EY>4-h^|I>~u_{SU^GINI{JQEf$|I5>79a){WQ}MEaJMa(bzc%>LEh$&%$Omx}~54*** z%2xNmyhTPxhNjkhXuVp6W3nhjg@YpHgx-s0(57~=sV5CFv&AI)fz@FaavIQCu2Yma zIk(^h@V@KOa!aEtAB93jIXPPddFs&5sW-gZ^dF7WeD16JI1e!x6-tq18P>uSHHg`- z9#5Ceg^lqjC?fV(ed$VA>b7pc$^}1S*~QWUHI=Iw9=+lXc|mthCaJM)$hkiDbc@A0 z^$E5*@ptlWO$y$;cHzCYTogBUX0P~eAVp6kqO1;dih5A2amG??mftHT;_$9 zV947q(JV)@mF8}dOtBRviX`v8ycKcOme9`jz+j@gajAz!b`*%ewTk`GQc`DcG&)Sy z$89~O0V(?H3K-pdk3qeLSAVH7g+r*l2Sv;*Y3+FT7HTBtUPEKycb!Cu9FyZb$r4t! z;s!U+vliE$Q}&jOQjtDvT|`LqN~kNZ+M4&4r*oPe2pULD5@H0KmwJjK%rGaWm?1Gc zNoa))4h;Z~ePEkx4)Z---$7AdXG910&5ZhrJpLj{Rn1XL3AQmTU-tDilQdL1wn(>Ro z#;i6faw$v&EWTXhNV9bt$pvs-9qMYY^{@vQ&Ru#;Q@L z(ne=&J2aZ{OoWXI)jG1oxw>XJ3uRjnL}nYIrzI=oI}&M=JrBER#wSU=Hxs1hk}0Ps zLJ&e_g4Qdi?O&%aVLbZzSoKoaRSFzoqBuzs<{;D)q)5=1eGAiRkrq*HO0(*t;+!bf zo+f0^90;8a{hSfEnXw^dQA5aC&*_=m;%H~})`r{1fBbS_rRBvR)XT%}J3 z=1hc|S}=fqs96z#r|uGarSdgG>-qf-#*K zXI=erL6;<`aj-j8wM;LQt`@f7>O)8yc8Gj*m|o_aRn*g#0L*#oOj}j$YK3Gr&Z%%w zaRgG26zi+WceRv&BHy9*9~6Zi2R1NQv{p|0Kw4Z-HEB}yNXLWu!@Q!utl)eQMf4m8 zUme6BoaGi%FbioZL_o6^<&Vyw{v{2zbA7IwF*C67Vf#ExKk-nhj~!p-$ALXr>+GPm z8jY;c(bh0^^snbr_<@6>f!-<-8LfsHs}`ptS$sh6dd-w5$td)Cp~spBp-sDV zUP#Pm=(ooGwA{Ge6N@1NETAPT1gX1eW`Rl2Wy>{FMEb(*6G;gIMWa%SY>7FLffum3CbB!Rb#`jowuz- zgC+hS(D=`(sC~sE9GlyfjN4Lu-Ujz-rYBqIk(jX#cNnCem_ZW$w<%eF(%~E&=&8wz zsj4=C>CfsGAtN8M=V(R0&K<)U=}=|%DVp@ zVdA#-BWFkqA30+R-<3jE_67MnjPkC-Iq-@~8mjg+5l4jRG+a<2Ll=zkiQAeLTZ3vo zqzGuIGgZYt^3SD~5|hoxDgy;T3S~Z$mu>_J{?0a5_DhzO@mNS4tT``{wv8o&Bw#fY zY>A3Oi)g*&k~AhOLQTk3G%O)vS3nuV4F90}hJnF)&?{v&iC5|w19*#|N&B)FhVVqcKdicdz0o9NdhPH>K=_q1yNDUHH>_lWxK~L`!)j@69GQ z;+0|pZ*L-!i91dt*?7$2gc%{$JYoVl3o%Q5zD(J_wI0u+D6bZ`Rt))YJHsf#iagc@ zW~r0qB^NE27P4%Eoyt=Mtv5MHq&)H^gs5i68DRfb-hxinkJZ?x%JX(+c+4wjrk99guT)R+4oPuQq*vK^WNq5H@)HjBw8SGpr+AQQ(KboV<_7 zV+7k;_Tid+QWwr2Nl1q?ydsZ;fhe6#V8i7`q!XJ-Uq&b~b$vz`CdJgb+ANtknGab& zC7-j&Tp4Vfxn-))NWokou~VvRVGAiNHMtvsG%T3o5mM@Mv#g^RHaSj66^LsaRS71Y zX3d^1Lt+xLI-Cd^u5-mkEn@jdYa%yBxga5lw7@( zEi<|{HgX?0wdNMAolc)1r*jd~!-h$&w$qBx5)WzFoHU8>QaREYu0#PyStJUJLi-yO zqcA$8Z`d1Of7O~j%q|&I)+1ZBguk5ux&qhtDvT12pztk%HtA+7JEa+6OWc}L8t zGo6bwYYsL6zEpPEVL$&Z6o-sw&Y06RyJPm8BWC0(9;{l78%Z-bVQ8p>y|iN7-d^`lR)Rqz zEx2X*{o*P7oM;%#;XoC09`x3srp|(6PrxpBce#6}yJxz4mb+)Ud$zl0%WeB|!6a-; zLn#8@^73FgXU+ml%*e6Pr)4Ca}g*1!U_Cf3<7D`cb3Y##%UgwHT*tC25=>ePzUY(c#&8 zj@y@&o=Ki4ZsX9W5zMEl5Fb6-l^r!FgR<-Ej4Kgj1VSf!Nwz<0F*NAHzH5XU%>W6? z6kn7FV?y{|pY^9JWK$GP3v`ZhVB;lmvPMr{B=Pu8oH$s?OovG0D5#Du4c%J8G>7T? zc>eHJLHKKOl!k=E9GRbZL&Lz%rK|G#Iz$_YIa(P>sp2}wux?=W@@l2Jwi?wpMD-DF zKVk>H9)&daw=+1pqDBl|KxlGfvk61}F=GDIM3*qPbh68okcrX$lgNOFx0jzhpH zZc7*{7NC|{V6`3~N>I?CEY!7GFG_5|5voIE_HH_l(~hyPDN{ca6dKF4Zd^~9WRXl* zuwBn&HJ_LYDOp3`c7tWxP(kzuf9VeX&a}U??C)%D#B{cdD64LEL~;&xkuWH^m{Zla zKS9m1*E)YuV8cNp+M#CV`XJ2nG=ZJ;C`bhRtKJU-G7R<*Cf`vEp2iM>By)~p_ACHl z5i??Ra6a`EW43acX>19fnN&lQmCYw5S!||$yCY#rE~nfwG0T1sxz=KJY|)CXiTOOB z(aW~A<_cjdm0`8jM+2GVP>bh40dqZ#Q)g&zrZrT`7Q5XNNsKa1-`fGF9%LGs6lE^^;GdhoI@0`)zbwu3N zHD~sbhs|JNGJ$WF8tp6f4Iu=s*5>fJ00+()SSJk@&Z+Q4TrECkAb71kp8a+Xv+6#a z<4DL|Aj|^oEA3$FLX+~TFE^{yCM-Q+>4L1{ogFhK%*V8jEwp_l!HZ1J%T3mX?F&(P(AFx$=Byvvbu@gU zkYn2_@x)`}&M8Mvh?46-#$F-xKfQ@aGnSUt8?UWwyjFS}s;*|m>c$(j75)F|ilU9z z@_lUsGuHSSZu(B5a;)Q0d>2op>MgZoor#_~wDDRt+R$_Bsx@)@n(VaDo?|doWuPGWfmA?htCpbOlxY^+NBgTyT_r)-In0sNki+ZJ&pE5C4EU&+ z1B0F$-}F`OV@9hb3?Jf%ohqe`*HF*kK`_^fSh5~I1Qefeea8fSYNta;)R$5@CfD2$ zGfVUu8MqQ=fSy(xIPqVT&NHFO*QhL9S?;PTy;yOWRavr}`|@?mr6kZf=;s0VL7D)!lq47W>yCp zi&?h7oV6s}lhnpZILi_eahp_9GD@RZkh7%>5_Nvdy-3aMUL?szsH%&RFlsczJxDb= zXS|D%D(FeZO)LsFUZWe5=#(;_yTV0KenW%8N>sQQ?n+w4l!A;=B))j&=(UKXv7r&$ zLr(`1st+v(O+vkVi9%D9^Ex^>A`jLm@R>DD%OV>9oc^=I3Qgrn73?&oS0~|KX?f)W zX_QNEO)Tm~26}R+jlKF{CSk&X36vQJhqWz2&O=zGNtqq#v^uD|`bdURD_%qTSqoV_ zF{s2My&JF1u2u?XL37u9C&P zS_w?bZgm*g6tBUeJi&$}Ms_6=l^6NM2vnm!S@VI5QN~VkF;iCkBnOJ&LMO6<2YA;V zO}f~Lb*on;;TkSd5ji2BUF-t$wYCX@dkj9d)73AEF+WI4dNZuwTc|KPFkIo0%hmYG zeNV6VSgXsS<8 zWSh;6x`QWSpU@|g5*AYf(sy8td^Roz3k=pKeVh~2y1mEw?Ess$$HJ}G^_qPdiA zL1jd9mE*g(fPojG_(|8@=iwq5IiNMxFl6FkkTAeqNOy_ok=z` zKv^^k30uwlEm?=M=_)E`13lG1G@&v$q(E&t1+3PzHdt?^XjAl>|eJjERnvwx?ydCcVIv2%)5?rF>!i zjYx!XEFTTQFg@q1(q|t^(4d5GOmwK*5H9qG@lYT^#zHNf;S#@!Doh{Rr6w7DQf^DC zpI&yQ;o`##2Eg2w@04(fDK}qvRmD9_D&#glT!oc=3^9LjUjR1+hlyA|3A(BnvMy^Cy4Xov1(L{1% z4m7AlkOt{wy0hBA$LB3MOIQA%<~SxBTG&#)@dLv$;jZx#4D0q*zFY?Tc~^8wDK zeUmv1=XV+8v$iG6cyTsfgqE!3sxln*M%t2bRPxC$60&> z(HX^`du z76n^mu@>2z1PHSt&pl2QbHFiWsF;kve*JyV7SbUpPPvkFWk z9T_RCRSfGmEzRIgw|*6LEw*(M=SjGZO~-r+M%iYa#b1Z$)7u=D8OV$UejS^ZXfJsm zo97*QX&K{4htO`ta-$=uguG2n_KygIcagxzI{yg zhS*(Xd7VYpVqv^F$@>>VXS(?)d6!jcRIC%U;}A@P>Jf}wGEQ>82TDR8$0ry(S|ww< zpaX*-#wd{u>xFy+5%e++qG%XM3$0~yBzhvp785I{aj6&{24TiGCcp+m!?e3%`|smt zkQBoruur8>qs%&_49Aw4%~Qme7E$CHKgyta6*i+W|Mr+qG(T9!a)SvxuiO1W`6Dz`d&nVr^>;$*i=PG*tk z7trbEIjgbVI>$~tgNX5AM_MtI&NTa;oXsI!L$_Rw>o*gi@o1|#CkP5PCJ}I{ZfbYZ zbt4S>Xe4C4=lXlDT5``-_uP>uWiuW(#tMvB8evw?V5n>vMdO5ro9vcju`RYI7lY+X zLJ?{WYq8b@GfXbNl{{V)w+|*qZ4ox=Lw$|eZL2)4*^}}vp=LaxPY>yP?ANxf;HDPR z=w3S}2iU_*0~rOyCj@HqVV!m!n6*%2=mPTK6I8S5^cFiX9ija&7Dx0g5BUV;NCjyZ zBQxt@r!m7yyzx5K)jNuDC4)LyDxJn!u#8KKV#~`G6sZzU`C%Gm4zNj+E0&W(bT(#^ z#V@H@I=3b^Qr4-ggnUucAD@(S`)`H&YBMF4qVEQxA{4G}v<8mE)IY+#2KqO_oz=pKUy4139RDs$QphqqA$;Y?dDSa2`8igUibm zG{Zdk2Ov;B6Y5(l+y;}av9ggpuUzeI*J+*6tkxoevslUa4Hg~dudtUR1wspGZs1Gy z9c&T8?jkdDdYztxS#ourZJQ+b>ane5H|h0Nr=-$Xec>1CX-<_gl!&C@%Ga65S&ft6 zmCX_M24t-q7_A()2ATe4SLo5

Wfc76lCnVMHc2=0krhTe)&s9PZy^>gUAd|2FlS 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 Rlx1x><@Hj}B;4!${{T}yGQ9u* diff --git a/extensions/fablabchemnitz/boxes.py/boxes/locale/zh_CN/LC_MESSAGES/boxes.py.mo b/extensions/fablabchemnitz/boxes.py/boxes/locale/zh_CN/LC_MESSAGES/boxes.py.mo deleted file mode 100644 index 636db547259d007c886fd655b8706768119ecd7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62142 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, YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-16 21:47+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#. e edge description -#: boxes/edges.py -msgid "Straight Edge" -msgstr "" - -#. e edge description -#: boxes/edges.py -msgid "e Straight Edge" -msgstr "" - -#. E edge description -#: boxes/edges.py -msgid "Straight Edge (outset by thickness)" -msgstr "" - -#. E edge description -#: boxes/edges.py -msgid "E Straight Edge (outset by thickness)" -msgstr "" - -#. G edge description -#: boxes/edges.py -msgid "Edge with pear shaped mounting holes" -msgstr "" - -#. G edge description -#: boxes/edges.py -msgid "G Edge with pear shaped mounting holes" -msgstr "" - -#. z edge description -#: boxes/edges.py -msgid "Edge with grooves" -msgstr "" - -#. z edge description -#: boxes/edges.py -msgid "z Edge with grooves" -msgstr "" - -#. Z edge description -#: boxes/edges.py -msgid "Edge with grooves (opposing side)" -msgstr "" - -#. Z edge description -#: boxes/edges.py -msgid "Z Edge with grooves (opposing side)" -msgstr "" - -#. g edge description -#: boxes/edges.py -msgid "Corrugated edge useful as an gipping area" -msgstr "" - -#. g edge description -#: boxes/edges.py -msgid "g Corrugated edge useful as an gipping area" -msgstr "" - -#. f edge description -#: boxes/edges.py -msgid "Finger Joint" -msgstr "" - -#. f edge description -#: boxes/edges.py -msgid "f Finger Joint" -msgstr "" - -#. F edge description -#: boxes/edges.py -msgid "Finger Joint (opposing side)" -msgstr "" - -#. F edge description -#: boxes/edges.py -msgid "F Finger Joint (opposing side)" -msgstr "" - -#. h edge description -#: boxes/edges.py -msgid "Edge (parallel Finger Joint Holes)" -msgstr "" - -#. h edge description -#: boxes/edges.py -msgid "h Edge (parallel Finger Joint Holes)" -msgstr "" - -#. | edge description -#: boxes/edges.py -msgid "Edge (orthogonal Finger Joint Holes)" -msgstr "" - -#. | edge description -#: boxes/edges.py -msgid "| Edge (orthogonal Finger Joint Holes)" -msgstr "" - -#. s edge description -#: boxes/edges.py -msgid "Stackable (bottom, finger joint holes)" -msgstr "" - -#. s edge description -#: boxes/edges.py -msgid "s Stackable (bottom, finger joint holes)" -msgstr "" - -#. S edge description -#: boxes/edges.py -msgid "Stackable (top)" -msgstr "" - -#. S edge description -#: boxes/edges.py -msgid "S Stackable (top)" -msgstr "" - -#. š edge description -#: boxes/edges.py -msgid "Stackable feet (bottom)" -msgstr "" - -#. š edge description -#: boxes/edges.py -msgid "š Stackable feet (bottom)" -msgstr "" - -#. Š edge description -#: boxes/edges.py -msgid "Stackable edge with finger holes (top)" -msgstr "" - -#. Š edge description -#: boxes/edges.py -msgid "Š Stackable edge with finger holes (top)" -msgstr "" - -#. i edge description -#: boxes/edges.py -msgid "Straight edge with hinge eye" -msgstr "" - -#. i edge description -#: boxes/edges.py -msgid "i Straight edge with hinge eye" -msgstr "" - -#. I edge description -#: boxes/edges.py -msgid "Edge with hinge pin" -msgstr "" - -#. I edge description -#: boxes/edges.py -msgid "I Edge with hinge pin" -msgstr "" - -#. o edge description -#: boxes/edges.py -msgid "Edge with chest hinge" -msgstr "" - -#. o edge description -#: boxes/edges.py -msgid "o Edge with chest hinge" -msgstr "" - -#. p edge description -#: boxes/edges.py -msgid "p Edge with chest hinge" -msgstr "" - -#. q edge description -#: boxes/edges.py -msgid "Edge with pins for an chest hinge" -msgstr "" - -#. q edge description -#: boxes/edges.py -msgid "q Edge with pins for an chest hinge" -msgstr "" - -#. Q edge description -#: boxes/edges.py -msgid "Edge opposing a chest hinge" -msgstr "" - -#. Q edge description -#: boxes/edges.py -msgid "Q Edge opposing a chest hinge" -msgstr "" - -#. u edge description -#: boxes/edges.py -msgid "Edge with cabinet hinges" -msgstr "" - -#. u edge description -#: boxes/edges.py -msgid "u Edge with cabinet hinges" -msgstr "" - -#. l edge description -#: boxes/edges.py -msgid "Edge for slide on lid (back)" -msgstr "" - -#. l edge description -#: boxes/edges.py -msgid "l Edge for slide on lid (back)" -msgstr "" - -#. L edge description -#: boxes/edges.py -msgid "Edge for slide on lid (box back)" -msgstr "" - -#. L edge description -#: boxes/edges.py -msgid "L Edge for slide on lid (box back)" -msgstr "" - -#. n edge description -#: boxes/edges.py -msgid "Edge for slide on lid (right)" -msgstr "" - -#. n edge description -#: boxes/edges.py -msgid "n Edge for slide on lid (right)" -msgstr "" - -#. m edge description -#: boxes/edges.py -msgid "Edge for slide on lid (left)" -msgstr "" - -#. m edge description -#: boxes/edges.py -msgid "m Edge for slide on lid (left)" -msgstr "" - -#. N edge description -#: boxes/edges.py -msgid "Edge for slide on lid (box right)" -msgstr "" - -#. N edge description -#: boxes/edges.py -msgid "N Edge for slide on lid (box right)" -msgstr "" - -#. M edge description -#: boxes/edges.py -msgid "Edge for slide on lid (box left)" -msgstr "" - -#. M edge description -#: boxes/edges.py -msgid "M Edge for slide on lid (box left)" -msgstr "" - -#. c edge description -#: boxes/edges.py -msgid "Click on (bottom side)" -msgstr "" - -#. c edge description -#: boxes/edges.py -msgid "c Click on (bottom side)" -msgstr "" - -#. C edge description -#: boxes/edges.py -msgid "Click on (top)" -msgstr "" - -#. C edge description -#: boxes/edges.py -msgid "C Click on (top)" -msgstr "" - -#. d edge description -#: boxes/edges.py -msgid "Dove Tail Joint" -msgstr "" - -#. d edge description -#: boxes/edges.py -msgid "d Dove Tail Joint" -msgstr "" - -#. D edge description -#: boxes/edges.py -msgid "Dove Tail Joint (opposing side)" -msgstr "" - -#. D edge description -#: boxes/edges.py -msgid "D Dove Tail Joint (opposing side)" -msgstr "" - -#. X edge description -#: boxes/edges.py -msgid "Flex cut" -msgstr "" - -#. X edge description -#: boxes/edges.py -msgid "X Flex cut" -msgstr "" - -#. R edge description -#: boxes/edges.py -msgid "Rack (and pinion) Edge" -msgstr "" - -#. R edge description -#: boxes/edges.py -msgid "R Rack (and pinion) Edge" -msgstr "" - -#. t edge description -#: boxes/edges.py -msgid "Triangle for handle" -msgstr "" - -#. t edge description -#: boxes/edges.py -msgid "t Triangle for handle" -msgstr "" - -#. T edge description -#: boxes/edges.py -msgid "T Triangle for handle" -msgstr "" - -#. y edge description -#: boxes/edges.py -msgid "Handle for e.g. a drawer" -msgstr "" - -#. y edge description -#: boxes/edges.py -msgid "y Handle for e.g. a drawer" -msgstr "" - -#. Y edge description -#: boxes/edges.py -msgid "Handle with holes for parallel finger joint" -msgstr "" - -#. Y edge description -#: boxes/edges.py -msgid "Y Handle with holes for parallel finger joint" -msgstr "" - -#. j edge description -#: boxes/edges.py -msgid "Straight edge with hinge eye (other end)" -msgstr "" - -#. j edge description -#: boxes/edges.py -msgid "j Straight edge with hinge eye (other end)" -msgstr "" - -#. J edge description -#: boxes/edges.py -msgid "Edge with hinge pin (other end)" -msgstr "" - -#. J edge description -#: boxes/edges.py -msgid "J Edge with hinge pin (other end)" -msgstr "" - -#. k edge description -#: boxes/edges.py -msgid "Straight edge with hinge eye (both ends)" -msgstr "" - -#. k edge description -#: boxes/edges.py -msgid "k Straight edge with hinge eye (both ends)" -msgstr "" - -#. K edge description -#: boxes/edges.py -msgid "Edge with hinge pin (both ends)" -msgstr "" - -#. K edge description -#: boxes/edges.py -msgid "K Edge with hinge pin (both ends)" -msgstr "" - -#. O edge description -#: boxes/edges.py -msgid "Edge with chest hinge (other end)" -msgstr "" - -#. O edge description -#: boxes/edges.py -msgid "O Edge with chest hinge (other end)" -msgstr "" - -#. P edge description -#: boxes/edges.py -msgid "P Edge with chest hinge (other end)" -msgstr "" - -#. U edge description -#: boxes/edges.py -msgid "Edge with cabinet hinges top side" -msgstr "" - -#. U edge description -#: boxes/edges.py -msgid "U Edge with cabinet hinges top side" -msgstr "" - -#. v edge description -#: boxes/edges.py -msgid "Edge with cabinet hinges for 90° lid" -msgstr "" - -#. v edge description -#: boxes/edges.py -msgid "v Edge with cabinet hinges for 90° lid" -msgstr "" - -#. V edge description -#: boxes/edges.py -msgid "Edge with cabinet hinges 90° lid" -msgstr "" - -#. V edge description -#: boxes/edges.py -msgid "V Edge with cabinet hinges 90° lid" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "Box" -msgstr "" - -#. title of group Box -#: boxes/generators/__init__.py -msgid "Boxes" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "FlexBox" -msgstr "" - -#. title of group FlexBox -#: boxes/generators/__init__.py -msgid "Boxes with flex" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "Tray" -msgstr "" - -#. title of group Tray -#: boxes/generators/__init__.py -msgid "Trays and Drawer Inserts" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "Shelf" -msgstr "" - -#. title of group Shelf -#: boxes/generators/__init__.py -msgid "Shelves" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "WallMounted" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "Holes" -msgstr "" - -#. title of group Holes -#: boxes/generators/__init__.py -msgid "Hole patterns" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "Part" -msgstr "" - -#. title of group Part -#: boxes/generators/__init__.py -msgid "Parts and Samples" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "Misc" -msgstr "" - -#. name of generator group -#: boxes/generators/__init__.py -msgid "Unstable" -msgstr "" - -#. description of group Unstable -#: boxes/generators/__init__.py -msgid "Generators are still untested or need manual adjustment to be useful." -msgstr "" - -msgid "DefaultParams Settings" -msgstr "" - -#. parameter name -msgid "x" -msgstr "" - -#. help for parameter x -msgid "inner width in mm (unless outside selected)" -msgstr "" - -#. parameter name -msgid "y" -msgstr "" - -#. help for parameter y -msgid "inner depth in mm (unless outside selected)" -msgstr "" - -#. parameter name -msgid "h" -msgstr "" - -#. help for parameter h -msgid "inner height in mm (unless outside selected)" -msgstr "" - -#. parameter name -msgid "hi" -msgstr "" - -#. help for parameter hi -msgid "" -"inner height of inner walls in mm (unless outside selected)(leave to zero " -"for same as outer walls)" -msgstr "" - -#. parameter name -msgid "sx" -msgstr "" - -#. help for parameter sx -msgid "" -"sections left to right in mm [🛈](https://florianfesti.github.io/boxes/html/" -"usermanual.html#section-parameters)" -msgstr "" - -#. parameter name -msgid "sy" -msgstr "" - -#. help for parameter sy -msgid "" -"sections back to front in mm [🛈](https://florianfesti.github.io/boxes/html/" -"usermanual.html#section-parameters)" -msgstr "" - -#. parameter name -msgid "sh" -msgstr "" - -#. help for parameter sh -msgid "" -"sections bottom to top in mm [🛈](https://florianfesti.github.io/boxes/html/" -"usermanual.html#section-parameters)" -msgstr "" - -#. parameter name -msgid "bottom_edge" -msgstr "" - -#. help for parameter bottom_edge -msgid "edge type for bottom edge" -msgstr "" - -#. possible choice for bottom_edge -msgid "F" -msgstr "" - -#. possible choice for bottom_edge -msgid "s" -msgstr "" - -#. possible choice for bottom_edge -msgid "e" -msgstr "" - -#. parameter name -msgid "top_edge" -msgstr "" - -#. help for parameter top_edge -msgid "edge type for top edge" -msgstr "" - -#. possible choice for top_edge -msgid "f" -msgstr "" - -#. possible choice for top_edge -msgid "c" -msgstr "" - -#. possible choice for top_edge -msgid "E" -msgstr "" - -#. possible choice for top_edge -msgid "S" -msgstr "" - -#. possible choice for top_edge -msgid "Š" -msgstr "" - -#. possible choice for top_edge -msgid "i" -msgstr "" - -#. possible choice for top_edge -msgid "k" -msgstr "" - -#. possible choice for top_edge -msgid "v" -msgstr "" - -#. possible choice for top_edge -msgid "L" -msgstr "" - -#. possible choice for top_edge -msgid "t" -msgstr "" - -#. possible choice for top_edge -msgid "G" -msgstr "" - -#. possible choice for top_edge -msgid "Y" -msgstr "" - -#. parameter name -msgid "outside" -msgstr "" - -#. help for parameter outside -msgid "" -"treat sizes as outside measurements [🛈](https://florianfesti.github.io/boxes/" -"html/usermanual.html#outside)" -msgstr "" - -#. parameter name -msgid "nema_mount" -msgstr "" - -#. help for parameter nema_mount -msgid "NEMA size of motor" -msgstr "" - -msgid "Default Settings" -msgstr "" - -#. parameter name -msgid "thickness" -msgstr "" - -#. help for parameter thickness -msgid "" -"thickness of the material (in mm) [🛈](https://florianfesti.github.io/boxes/" -"html/usermanual.html#thickness)" -msgstr "" - -#. parameter name -msgid "format" -msgstr "" - -#. help for parameter format -msgid "" -"format of resulting file [🛈](https://florianfesti.github.io/boxes/html/" -"usermanual.html#format)" -msgstr "" - -#. possible choice for format -msgid "dxf" -msgstr "" - -#. possible choice for format -msgid "gcode" -msgstr "" - -#. possible choice for format -msgid "lbrn2" -msgstr "" - -#. possible choice for format -msgid "pdf" -msgstr "" - -#. possible choice for format -msgid "plt" -msgstr "" - -#. possible choice for format -msgid "ps" -msgstr "" - -#. possible choice for format -msgid "svg" -msgstr "" - -#. possible choice for format -msgid "svg_Ponoko" -msgstr "" - -#. parameter name -msgid "tabs" -msgstr "" - -#. help for parameter tabs -msgid "" -"width of tabs holding the parts in place (in mm)(not supported everywhere) " -"[🛈](https://florianfesti.github.io/boxes/html/usermanual.html#tabs)" -msgstr "" - -#. parameter name -msgid "qr_code" -msgstr "" - -#. help for parameter qr_code -msgid "Add a QR Code with link or command line to the generated output" -msgstr "" - -#. parameter name -msgid "debug" -msgstr "" - -#. help for parameter debug -msgid "" -"print surrounding boxes for some structures [🛈](https://florianfesti.github." -"io/boxes/html/usermanual.html#debug)" -msgstr "" - -#. parameter name -msgid "labels" -msgstr "" - -#. help for parameter labels -msgid "label the parts (where available)" -msgstr "" - -#. parameter name -msgid "reference" -msgstr "" - -#. help for parameter reference -msgid "" -"print reference rectangle with given length (in mm)(zero to disable) [🛈]" -"(https://florianfesti.github.io/boxes/html/usermanual.html#reference)" -msgstr "" - -#. parameter name -msgid "inner_corners" -msgstr "" - -#. help for parameter inner_corners -msgid "" -"style for inner corners [🛈](https://florianfesti.github.io/boxes/html/" -"usermanual.html#inner-corners)" -msgstr "" - -#. possible choice for inner_corners -msgid "loop" -msgstr "" - -#. possible choice for inner_corners -msgid "corner" -msgstr "" - -#. possible choice for inner_corners -msgid "backarc" -msgstr "" - -#. parameter name -msgid "burn" -msgstr "" - -#. help for parameter burn -msgid "" -"burn correction (in mm)(bigger values for tighter fit) [🛈](https://" -"florianfesti.github.io/boxes/html/usermanual.html#burn)" -msgstr "" - -msgid "Settings for Finger Joints" -msgstr "" - -#. parameter name for FingerJoint -msgid "angle" -msgstr "" - -#. parameter name for FingerJoint -msgid "style" -msgstr "" - -#. help for parameter style -msgid "style of the fingers" -msgstr "" - -#. possible choice for style -msgid "rectangular" -msgstr "" - -#. possible choice for style -msgid "springs" -msgstr "" - -#. possible choice for style -msgid "barbs" -msgstr "" - -#. possible choice for style -msgid "snap" -msgstr "" - -#. parameter name for FingerJoint -msgid "surroundingspaces" -msgstr "" - -#. help for parameter surroundingspaces -msgid "space at the start and end in multiple of normal spaces" -msgstr "" - -#. parameter name for FingerJoint -msgid "bottom_lip" -msgstr "" - -#. help for parameter bottom_lip -msgid "" -"height of the bottom lips sticking out (multiples of thickness) " -"FingerHoleEdge only!" -msgstr "" - -#. parameter name for FingerJoint -msgid "edge_width" -msgstr "" - -#. help for parameter edge_width -msgid "space below holes of FingerHoleEdge (multiples of thickness)" -msgstr "" - -#. parameter name for FingerJoint -msgid "extra_length" -msgstr "" - -#. help for parameter extra_length -msgid "extra material to grind away burn marks (multiples of thickness)" -msgstr "" - -#. parameter name for FingerJoint -msgid "finger" -msgstr "" - -#. help for parameter finger -msgid "width of the fingers (multiples of thickness)" -msgstr "" - -#. parameter name for FingerJoint -msgid "play" -msgstr "" - -#. help for parameter play -msgid "extra space to allow finger move in and out (multiples of thickness)" -msgstr "" - -#. parameter name for FingerJoint -msgid "space" -msgstr "" - -#. help for parameter space -msgid "space between fingers (multiples of thickness)" -msgstr "" - -#. parameter name for FingerJoint -msgid "width" -msgstr "" - -#. help for parameter width -msgid "width of finger holes (multiples of thickness)" -msgstr "" - -msgid "Settings for Stackable Edges" -msgstr "" - -#. help for parameter angle -msgid "inside angle of the feet" -msgstr "" - -#. parameter name for Stackable -msgid "bottom_stabilizers" -msgstr "" - -#. help for parameter bottom_stabilizers -msgid "" -"height of strips to be glued to the inside of bottom edges (multiples of " -"thickness)" -msgstr "" - -#. parameter name for Stackable -msgid "height" -msgstr "" - -#. help for parameter height -msgid "height of the feet (multiples of thickness)" -msgstr "" - -#. parameter name for Stackable -msgid "holedistance" -msgstr "" - -#. help for parameter holedistance -msgid "distance from finger holes to bottom edge (multiples of thickness)" -msgstr "" - -#. help for parameter width -msgid "width of the feet (multiples of thickness)" -msgstr "" - -msgid "Settings for Hinges and HingePins" -msgstr "" - -#. parameter name for Hinge -msgid "grip_percentage" -msgstr "" - -#. parameter name for Hinge -msgid "outset" -msgstr "" - -#. help for parameter outset -msgid "have lid overlap at the sides (similar to OutSetEdge)" -msgstr "" - -#. parameter name for Hinge -msgid "pinwidth" -msgstr "" - -#. help for parameter pinwidth -msgid "set to lower value to get disks surrounding the pins" -msgstr "" - -#. help for parameter style -msgid "\"outset\" or \"flush\"" -msgstr "" - -#. possible choice for style -msgid "flush" -msgstr "" - -#. parameter name for Hinge -msgid "axle" -msgstr "" - -#. help for parameter axle -msgid "diameter of the pin hole (multiples of thickness)" -msgstr "" - -#. parameter name for Hinge -msgid "grip_length" -msgstr "" - -#. help for parameter grip_length -msgid "fixed length of the grips on he lids (multiples of thickness)" -msgstr "" - -#. parameter name for Hinge -msgid "hingestrength" -msgstr "" - -#. help for parameter hingestrength -msgid "thickness of the arc holding the pin in place (multiples of thickness)" -msgstr "" - -msgid "Settings for Slide-on Lids" -msgstr "" - -#. parameter name for SlideOnLid -msgid "hole_width" -msgstr "" - -#. help for parameter hole_width -msgid "width of the \"finger hole\" in mm" -msgstr "" - -#. parameter name for SlideOnLid -msgid "second_pin" -msgstr "" - -#. help for parameter second_pin -msgid "additional pin for better positioning" -msgstr "" - -#. parameter name for SlideOnLid -msgid "spring" -msgstr "" - -#. help for parameter spring -msgid "position(s) of the extra locking springs in the lid" -msgstr "" - -#. possible choice for spring -msgid "both" -msgstr "" - -#. possible choice for spring -msgid "none" -msgstr "" - -#. possible choice for spring -msgid "left" -msgstr "" - -#. possible choice for spring -msgid "right" -msgstr "" - -msgid "Settings for Click-on Lids" -msgstr "" - -#. help for parameter angle -msgid "angle of the hooks bending outward" -msgstr "" - -#. parameter name for Click -msgid "bottom_radius" -msgstr "" - -#. help for parameter bottom_radius -msgid "radius at the bottom (multiples of thickness)" -msgstr "" - -#. parameter name for Click -msgid "depth" -msgstr "" - -#. help for parameter depth -msgid "length of the hooks (multiples of thickness)" -msgstr "" - -msgid "Settings for Flex" -msgstr "" - -#. parameter name for Flex -msgid "stretch" -msgstr "" - -#. help for parameter stretch -msgid "Hint of how much the flex part should be shortened" -msgstr "" - -#. parameter name for Flex -msgid "connection" -msgstr "" - -#. help for parameter connection -msgid "width of the gaps in the cuts (multiples of thickness)" -msgstr "" - -#. parameter name for Flex -msgid "distance" -msgstr "" - -#. help for parameter distance -msgid "width of the pattern perpendicular to the cuts (multiples of thickness)" -msgstr "" - -#. help for parameter width -msgid "width of the pattern in direction of the cuts (multiples of thickness)" -msgstr "" - -msgid "Settings for the Lid" -msgstr "" - -#. parameter name for Lid -msgid "handle" -msgstr "" - -#. help for parameter handle -msgid "type of handle" -msgstr "" - -#. possible choice for handle -msgid "long_rounded" -msgstr "" - -#. possible choice for handle -msgid "long_trapezoid" -msgstr "" - -#. possible choice for handle -msgid "long_doublerounded" -msgstr "" - -#. possible choice for handle -msgid "knob" -msgstr "" - -#. help for parameter style -msgid "type of lid to create" -msgstr "" - -#. possible choice for style -msgid "flat" -msgstr "" - -#. possible choice for style -msgid "chest" -msgstr "" - -#. possible choice for style -msgid "overthetop" -msgstr "" - -#. possible choice for style -msgid "ontop" -msgstr "" - -#. parameter name for Lid -msgid "handle_height" -msgstr "" - -#. help for parameter handle_height -msgid "height of the handle (if applicable)" -msgstr "" - -#. help for parameter height -msgid "height of the brim (if any)" -msgstr "" - -#. help for parameter play -msgid "play when sliding the lid on (if applicable)" -msgstr "" - -#. name of box generator -#: boxes/generators/abox.py -msgid "ABox" -msgstr "" - -#. description of ABox -#: boxes/generators/abox.py -msgid "A simple Box" -msgstr "" - -#. long description of ABox in markdown -#: boxes/generators/abox.py -msgid "" -"This box is kept simple on purpose. If you need more features have a look at " -"the UniversalBox." -msgstr "" - -msgid "ABox Settings" -msgstr "" - -#. name of box generator -#: boxes/generators/agricolainsert.py -msgid "AgricolaInsert" -msgstr "" - -#. description of AgricolaInsert -#: boxes/generators/agricolainsert.py -msgid "" -"\n" -" Agricola Revised Edition game box insert, including some expansions.\n" -" " -msgstr "" - -#. long description of AgricolaInsert in markdown -#: boxes/generators/agricolainsert.py -msgid "" -"\n" -"This insert was designed with 3 mm plywood in mind, and should work fine " -"with\n" -"materials around this thickness.\n" -"\n" -"This is an insert for the [Agricola Revised Edition](https://boardgamegeek." -"com/boardgame/200680/agricola-revised-edition)\n" -"board game. It is specifically designed around the [Farmers Of The Moor " -"expansion](https://boardgamegeek.com/boardgameexpansion/257344/agricola-" -"farmers-moor),\n" -"and should also store the [5-6 players expansion](https://boardgamegeek.com/" -"boardgameexpansion/210625/agricola-expansion-5-and-6-players)\n" -"(not tested, but I tried to take everything into account for it, please " -"inform\n" -"us if you tested it).\n" -"\n" -"It can be stored inside the original game box, including the 2 expansions,\n" -"with the lid slightly raised.\n" -"\n" -"The parts of a given element are mostly generated next to each other " -"vertically.\n" -"It should be straightforward to match them.\n" -"\n" -"Here are the different elements, from left to right in the generated file.\n" -"\n" -"#### Card tray\n" -"\n" -"The cards are all kept in a tray, with paper dividers to sort them easily. " -"When\n" -"the tray is not full of cards, wood dividers slides in slots in order to " -"keep\n" -"the cards from falling into the empty space.\n" -"\n" -"There should be enough space for the main game, Farmers Of The Moor, and the " -"5-6\n" -"player expansion, but not much more than that.\n" -"\n" -"To keep a lower profile, the cards are at a slight angle, and the paper " -"dividers\n" -"tabs are horizontal instead of vertical.\n" -"A small wall keeps the card against one side while the tabs protrude on the\n" -"other side, above the small wall.\n" -"\n" -"The wall with the big hole is the sloped one. It goes between the two\n" -"\"comb-like\" walls first, with its two small holes at the bottom. Then " -"there is a\n" -"low-height long wall with a sloped edge which should go from the sloped wall " -"to\n" -"the other side. You can finish the tray with the last wall at the end.\n" -"\n" -"#### Upper level trays\n" -"\n" -"4 trays with movable walls are used to store resources. They were designed " -"to\n" -"store them in this order:\n" -"\n" -"* Stone / Vegetable / Pig / Cow\n" -"* Reed / Grain / Sheep\n" -"* Wood / Clay\n" -"* Food / Fire\n" -"\n" -"The wall would probably be better if fixed instead of movable, but I would " -"like\n" -"to test with the 5-6 player expansion to be sure their positions are " -"correct\n" -"with it too.\n" -"\n" -"The little feet of the movable wall should be glued. The triangles are put\n" -"horizontally, with their bases towards the sides.\n" -"\n" -"#### Lower level tray\n" -"\n" -"The lower level tray is used to store the horses.\n" -"\n" -"#### Room/Field tiles\n" -"\n" -"Two boxes are generated to store the room/field tiles. One for the wood/" -"field,\n" -"the other for the clay/stone. They are stored with the main opening upside, " -"but\n" -"I prefer to use them during play with this face on the side.\n" -"\n" -"#### Moor/Forest and miscellaneous tiles\n" -"\n" -"A box is generated to store the Moor/Forest tiles, and some other tiles such " -"as\n" -"the \"multiple resources\" cardboard tokens.\n" -"\n" -"The Moor/Forest tiles are at the same height as the Room/Field, and the " -"upper\n" -"level trays are directly on them. The horse box and player box are slightly\n" -"lower. This Moor/Forest box have a lowered corner (the one for the " -"miscellaneous\n" -"tiles). Two cardboard pieces can be stored between the smaller boxes and " -"the\n" -"upper level trays (as seen on the picture).\n" -"\n" -"Be sure to match the pieces so that the walls with smaller heights are next " -"to\n" -"each other.\n" -"\n" -"#### Players bit boxes\n" -"\n" -"Each player has its own box where the bits of his color are stored.\n" -"The cardboard bed from Farmers Of The Moor is central to this box.\n" -"\n" -"* The fences are stored inside the bed\n" -"* The bed is placed in the box, with holes to keep it there (and to take " -"less\n" -" height)\n" -"* The stables are stored in the two corners\n" -"* The five farmers are stored between the bed and the three walls, " -"alternatively\n" -" head up and head down.\n" -"\n" -"During assembly, the small bars are put in the middle holes. The two bigger\n" -"holes at the ends are used for the bed feet. The bar keeps the bed from\n" -"protruding underneath.\n" -"\n" -msgstr "" - -msgid "AgricolaInsert Settings" -msgstr "" - -#. name of box generator -#: boxes/generators/alledges.py -msgid "AllEdges" -msgstr "" - -#. description of AllEdges -#: boxes/generators/alledges.py -msgid "Showing all edge types" -msgstr "" - -msgid "AllEdges Settings" -msgstr "" - -#. help for parameter x -#: boxes/generators/alledges.py -msgid "inner width in mm" -msgstr "" - -msgid "Settings for HandleEdge" -msgstr "" - -#. help for parameter height -#: boxes/generators/alledges.py -msgid "height above the wall in mm" -msgstr "" - -#. parameter name for HandleEdge -#: boxes/generators/alledges.py -msgid "hole_height" -msgstr "" - -#. help for parameter hole_height -#: boxes/generators/alledges.py -msgid "" -"height of hole(s) in percentage of maximum hole height (handle height - 2 * " -"material thickness)" -msgstr "" - -#. help for parameter hole_width -#: boxes/generators/alledges.py -msgid "" -"width of hole(s) in percentage of maximum hole width (width of edge - (n+1) " -"* material thickness)" -msgstr "" - -#. parameter name for HandleEdge -#: boxes/generators/alledges.py -msgid "on_sides" -msgstr "" - -#. help for parameter on_sides -#: boxes/generators/alledges.py -msgid "" -"added to side panels if checked, to front and back otherwise (only used with " -"top_edge parameter)" -msgstr "" - -#. parameter name for HandleEdge -#: boxes/generators/alledges.py -msgid "radius" -msgstr "" - -#. help for parameter radius -#: boxes/generators/alledges.py -msgid "radius of corners in mm" -msgstr "" - -#. help for parameter outset -#: boxes/generators/alledges.py -msgid "extend the handle along the length of the edge (multiples of thickness)" -msgstr "" - -#. name of box generator -#: boxes/generators/angledbox.py -msgid "AngledBox" -msgstr "" - -#. description of AngledBox -#: boxes/generators/angledbox.py -msgid "Box with both ends cornered" -msgstr "" - -msgid "AngledBox Settings" -msgstr "" - -#. parameter name -#: boxes/generators/angledbox.py -msgid "n" -msgstr "" - -#. help for parameter n -#: boxes/generators/angledbox.py -msgid "number of walls at one side (1+)" -msgstr "" - -#. parameter name -#: boxes/generators/angledbox.py -msgid "top" -msgstr "" - -#. help for parameter top -#: boxes/generators/angledbox.py -msgid "style of the top and lid" -msgstr "" - -#. possible choice for top -#: boxes/generators/angledbox.py -msgid "angled hole" -msgstr "" - -#. possible choice for top -#: boxes/generators/angledbox.py -msgid "angled lid" -msgstr "" - -#. possible choice for top -#: boxes/generators/angledbox.py -msgid "angled lid2" -msgstr "" - -#. name of box generator -#: boxes/generators/angledcutjig.py -msgid "AngledCutJig" -msgstr "" - -#. description of AngledCutJig -#: boxes/generators/angledcutjig.py -msgid "Jig for making angled cuts in a laser cutter" -msgstr "" - -msgid "AngledCutJig Settings" -msgstr "" - -#. help for parameter y -#: boxes/generators/angledcutjig.py -msgid "inner depth in mm" -msgstr "" - -#. help for parameter angle -#: boxes/generators/angledcutjig.py -msgid "Angle of the cut" -msgstr "" - -#. name of box generator -#: boxes/generators/arcade.py -msgid "Arcade" -msgstr "" - -#. description of Arcade -#: boxes/generators/arcade.py -msgid "Desktop Arcade Machine" -msgstr "" - -msgid "Arcade Settings" -msgstr "" - -#. help for parameter width -#: boxes/generators/arcade.py -msgid "inner width of the console" -msgstr "" - -#. parameter name -#: boxes/generators/arcade.py -msgid "monitor_height" -msgstr "" - -#. parameter name -#: boxes/generators/arcade.py -msgid "keyboard_depth" -msgstr "" - -#. name of box generator -#: boxes/generators/atreus21.py -msgid "Atreus21" -msgstr "" - -#. description of Atreus21 -#: boxes/generators/atreus21.py -msgid "Generator for a split atreus keyboard." -msgstr "" - -msgid "Atreus21 Settings" -msgstr "" - -#. parameter name -#: boxes/generators/atreus21.py -msgid "hotswap_enable" -msgstr "" - -#. help for parameter hotswap_enable -#: boxes/generators/atreus21.py -msgid "enlarge switches holes for hotswap pcb sockets" -msgstr "" - -#. parameter name -#: boxes/generators/atreus21.py -msgid "pcb_mount_enable" -msgstr "" - -#. help for parameter pcb_mount_enable -#: boxes/generators/atreus21.py -msgid "adds holes for pcb mount switches" -msgstr "" - -#. parameter name -#: boxes/generators/atreus21.py -msgid "led_enable" -msgstr "" - -#. help for parameter led_enable -#: boxes/generators/atreus21.py -msgid "adds pin holes under switches for leds" -msgstr "" - -#. parameter name -#: boxes/generators/atreus21.py -msgid "diode_enable" -msgstr "" - -#. help for parameter diode_enable -#: boxes/generators/atreus21.py -msgid "adds pin holes under switches for diodes" -msgstr "" - -#. parameter name -#: boxes/generators/atreus21.py -msgid "cutout_type" -msgstr "" - -#. help for parameter cutout_type -#: boxes/generators/atreus21.py -msgid "" -"Shape of the plate cutout: 'castle' allows for modding, and 'simple' is a " -"tighter and simpler square" -msgstr "" - -#. parameter name -#: boxes/generators/atreus21.py -msgid "columns_definition" -msgstr "" - -#. help for parameter columns_definition -#: boxes/generators/atreus21.py -msgid "" -"Each column is separated by '/', and is in the form 'nb_rows @ offset x " -"repeat_count'. Nb_rows is the number of rows for this column. The offset is " -"in mm and optional. Repeat_count is optional and repeats this column " -"multiple times. Spaces are not important.For example '3x2 / 4@11' means we " -"want 3 columns, the two first with 3 rows without offset, and the last with " -"4 rows starting at 11mm high." -msgstr "" - -#. name of box generator -#: boxes/generators/basedbox.py -msgid "BasedBox" -msgstr "" - -#. description of BasedBox -#: boxes/generators/basedbox.py -msgid "Fully closed box on a base" -msgstr "" - -#. long description of BasedBox in markdown -#: boxes/generators/basedbox.py -msgid "" -"This box is more of a building block than a finished item.\n" -"Use a vector graphics program (like Inkscape) to add holes or adjust the " -"base\n" -"plate. The width of the \"brim\" can also be adjusted with the " -"**edge_width**\n" -" parameter in the **Finger Joints Settings**.\n" -" \n" -"See ClosedBox for variant without a base.\n" -msgstr "" - -msgid "BasedBox Settings" -msgstr "" - -#. name of box generator -#: boxes/generators/bayonetbox.py -msgid "BayonetBox" -msgstr "" - -#. description of BayonetBox -#: boxes/generators/bayonetbox.py -msgid "Round box made from layers with twist on top" -msgstr "" - -#. long description of BayonetBox in markdown -#: boxes/generators/bayonetbox.py -msgid "" -"Glue together - all outside rings to the bottom, all inside rings to the top." -msgstr "" - -msgid "BayonetBox Settings" -msgstr "" - -#. parameter name -#: boxes/generators/bayonetbox.py -msgid "diameter" -msgstr "" - -#. help for parameter diameter -#: boxes/generators/bayonetbox.py -msgid "Diameter of the box in mm" -msgstr "" - -#. parameter name -#: boxes/generators/bayonetbox.py -msgid "lugs" -msgstr "" - -#. help for parameter lugs -#: boxes/generators/bayonetbox.py -msgid "number of locking lugs" -msgstr "" - -#. parameter name -#: boxes/generators/bayonetbox.py -msgid "alignment_pins" -msgstr "" - -#. help for parameter alignment_pins -#: boxes/generators/bayonetbox.py -msgid "diameter of the alignment pins" -msgstr "" - -#. name of box generator -#: boxes/generators/bintray.py -msgid "BinTray" -msgstr "" - -#. description of BinTray -#: boxes/generators/bintray.py -msgid "A Type tray variant to be used up right with sloped walls in front" -msgstr "" - -msgid "BinTray Settings" -msgstr "" - -#. parameter name -#: boxes/generators/bintray.py -msgid "hole_dD" -msgstr "" - -#. help for parameter hole_dD -#: boxes/generators/bintray.py -msgid "" -"mounting hole diameter (shaft:head) in mm [🛈](https://florianfesti.github.io/" -"boxes/html/usermanual.html#mounting-holes)" -msgstr "" - -#. parameter name -#: boxes/generators/bintray.py -msgid "front" -msgstr "" - -#. help for parameter front -#: boxes/generators/bintray.py -msgid "fraction of bin height covert with slope" -msgstr "" - -#. name of box generator -#: boxes/generators/birdhouse.py -msgid "BirdHouse" -msgstr "" - -#. description of BirdHouse -#: boxes/generators/birdhouse.py -msgid "Simple Bird House" -msgstr "" - -msgid "BirdHouse Settings" -msgstr "" - -#. help for parameter h -#: boxes/generators/birdhouse.py -msgid "inner height in mm" -msgstr "" - -#. parameter name -#: boxes/generators/birdhouse.py -msgid "roof_overhang" -msgstr "" - -#. help for parameter roof_overhang -#: boxes/generators/birdhouse.py -msgid "overhang as fraction of the roof length" -msgstr "" - -#. name of box generator -#: boxes/generators/bottlestack.py -msgid "BottleStack" -msgstr "" - -#. description of BottleStack -#: boxes/generators/bottlestack.py -msgid "Stack bottles in a fridge" -msgstr "" - -#. long description of BottleStack in markdown -#: boxes/generators/bottlestack.py -msgid "" -"When rendered with the \"double\" option the parts with the double slots get " -"connected the shorter beams in the asymmetrical slots.\n" -"\n" -"Without the \"double\" option the stand is a bit more narrow.\n" -msgstr "" - -msgid "BottleStack Settings" -msgstr "" - -#. help for parameter diameter -#: boxes/generators/bottlestack.py -msgid "diameter of the bottles in mm" -msgstr "" - -#. parameter name -#: boxes/generators/bottlestack.py -msgid "number" -msgstr "" - -#. help for parameter number -#: boxes/generators/bottlestack.py -msgid "number of bottles to hold in the bottom row" -msgstr "" - -#. help for parameter depth -#: boxes/generators/bottlestack.py -msgid "depth of the stand along the base of the bottles" -msgstr "" - -#. parameter name -#: boxes/generators/bottlestack.py -msgid "double" -msgstr "" - -#. help for parameter double -#: boxes/generators/bottlestack.py -msgid "two pieces that can be combined to up to double the width" -msgstr "" - -#. name of box generator -#: boxes/generators/bottletag.py -msgid "BottleTag" -msgstr "" - -#. description of BottleTag -#: boxes/generators/bottletag.py -msgid "Paper slip over bottle tag" -msgstr "" - -msgid "BottleTag Settings" -msgstr "" - -#. help for parameter width -#: boxes/generators/bottletag.py -msgid "width of neck tag" -msgstr "" - -#. help for parameter height -#: boxes/generators/bottletag.py -msgid "height of neck tag" -msgstr "" - -#. parameter name -#: boxes/generators/bottletag.py -msgid "min_diameter" -msgstr "" - -#. help for parameter min_diameter -#: boxes/generators/bottletag.py -msgid "inner diameter of bottle neck hole" -msgstr "" - -#. parameter name -#: boxes/generators/bottletag.py -msgid "max_diameter" -msgstr "" - -#. help for parameter max_diameter -#: boxes/generators/bottletag.py -msgid "outer diameter of bottle neck hole" -msgstr "" - -#. help for parameter radius -#: boxes/generators/bottletag.py -msgid "corner radius of bottom tag" -msgstr "" - -#. parameter name -#: boxes/generators/bottletag.py -msgid "segment_width" -msgstr "" - -#. help for parameter segment_width -#: boxes/generators/bottletag.py -msgid "inner segment width" -msgstr "" - -#. name of box generator -#: boxes/generators/breadbox.py -msgid "BreadBox" -msgstr "" - -#. description of BreadBox -#: boxes/generators/breadbox.py -msgid "A BreadBox with a gliding door" -msgstr "" - -#. long description of BreadBox in markdown -#: boxes/generators/breadbox.py -msgid "Beware of the rolling shutter effect! Use wax on sliding surfaces.\n" -msgstr "" - -msgid "BreadBox Settings" -msgstr "" - -#. help for parameter radius -#: boxes/generators/breadbox.py -msgid "radius of the corners" -msgstr "" - -#. name of box generator -#: boxes/generators/burntest.py -msgid "BurnTest" -msgstr "" - -#. description of BurnTest -#: boxes/generators/burntest.py -msgid "Test different burn values" -msgstr "" - -#. long description of BurnTest in markdown -#: boxes/generators/burntest.py -msgid "" -"This generator will make shapes that you can use to select\n" -"optimal value for burn parameter for other generators. After burning try to\n" -"attach sides with the same value and use best fitting one on real projects.\n" -"In this generator set burn in the Default Settings to the lowest value\n" -"to be tested. To get an idea cut a rectangle with known nominal size and\n" -"measure the shrinkage due to the width of the laser cut. Now you can\n" -"measure the burn value that you should use in other generators. It is half\n" -"the difference of the overall size as shrinkage is occurring on both\n" -"sides. You can use the reference rectangle as it is rendered without burn\n" -"correction.\n" -"\n" -"See also LBeam that can serve as compact BurnTest and FlexTest for testing " -"flex settings.\n" -msgstr "" - -msgid "BurnTest Settings" -msgstr "" - -#. parameter name -#: boxes/generators/burntest.py -msgid "step" -msgstr "" - -#. help for parameter step -#: boxes/generators/burntest.py -msgid "increases in burn value between the sides" -msgstr "" - -#. parameter name -#: boxes/generators/burntest.py -msgid "pairs" -msgstr "" - -#. help for parameter pairs -#: boxes/generators/burntest.py -msgid "number of pairs (each testing four burn values)" -msgstr "" - -#. name of box generator -#: boxes/generators/can_storage.py -msgid "CanStorage" -msgstr "" - -#. description of CanStorage -#: boxes/generators/can_storage.py -msgid "Storage box for round containers" -msgstr "" - -#. long description of CanStorage in markdown -#: boxes/generators/can_storage.py -msgid "" -"\n" -"for AA batteries:\n" -"\n" -"![CanStorage for AA batteries](static/samples/CanStorageAA.jpg)\n" -"\n" -"for canned tomatoes:\n" -msgstr "" - -msgid "CanStorage Settings" -msgstr "" - -#. possible choice for bottom_edge -#: boxes/generators/can_storage.py -msgid "š" -msgstr "" - -#. parameter name -#: boxes/generators/can_storage.py -msgid "canDiameter" -msgstr "" - -#. help for parameter canDiameter -#: boxes/generators/can_storage.py -msgid "outer diameter of the cans to be stored (in mm)" -msgstr "" - -#. parameter name -#: boxes/generators/can_storage.py -msgid "canHeight" -msgstr "" - -#. help for parameter canHeight -#: boxes/generators/can_storage.py -msgid "height of the cans to be stored (in mm)" -msgstr "" - -#. parameter name -#: boxes/generators/can_storage.py -msgid "canNum" -msgstr "" - -#. help for parameter canNum -#: boxes/generators/can_storage.py -msgid "number of cans to be stored" -msgstr "" - -#. parameter name -#: boxes/generators/can_storage.py -msgid "chuteAngle" -msgstr "" - -#. help for parameter chuteAngle -#: boxes/generators/can_storage.py -msgid "slope angle of the chutes" -msgstr "" - -msgid "Settings for Hole filling" -msgstr "" - -#. parameter name for fillHoles -#: boxes/generators/can_storage.py -msgid "bar_length" -msgstr "" - -#. help for parameter bar_length -#: boxes/generators/can_storage.py -msgid "maximum length of bars" -msgstr "" - -#. parameter name for fillHoles -#: boxes/generators/can_storage.py -msgid "fill_pattern" -msgstr "" - -#. help for parameter fill_pattern -#: boxes/generators/can_storage.py -msgid "style of hole pattern" -msgstr "" - -#. possible choice for fill_pattern -#: boxes/generators/can_storage.py -msgid "no fill" -msgstr "" - -#. possible choice for fill_pattern -#: boxes/generators/can_storage.py -msgid "hex" -msgstr "" - -#. possible choice for fill_pattern -#: boxes/generators/can_storage.py -msgid "square" -msgstr "" - -#. possible choice for fill_pattern -#: boxes/generators/can_storage.py -msgid "random" -msgstr "" - -#. possible choice for fill_pattern -#: boxes/generators/can_storage.py -msgid "hbar" -msgstr "" - -#. possible choice for fill_pattern -#: boxes/generators/can_storage.py -msgid "vbar" -msgstr "" - -#. parameter name for fillHoles -#: boxes/generators/can_storage.py -msgid "hole_max_radius" -msgstr "" - -#. help for parameter hole_max_radius -#: boxes/generators/can_storage.py -msgid "maximum radius of generated holes (in mm)" -msgstr "" - -#. parameter name for fillHoles -#: boxes/generators/can_storage.py -msgid "hole_min_radius" -msgstr "" - -#. help for parameter hole_min_radius -#: boxes/generators/can_storage.py -msgid "minimum radius of generated holes (in mm)" -msgstr "" - -#. parameter name for fillHoles -#: boxes/generators/can_storage.py -msgid "hole_style" -msgstr "" - -#. help for parameter hole_style -#: boxes/generators/can_storage.py -msgid "style of holes (does not apply to fill patterns 'vbar' and 'hbar')" -msgstr "" - -#. possible choice for hole_style -#: boxes/generators/can_storage.py -msgid "round" -msgstr "" - -#. possible choice for hole_style -#: boxes/generators/can_storage.py -msgid "triangle" -msgstr "" - -#. possible choice for hole_style -#: boxes/generators/can_storage.py -msgid "hexagon" -msgstr "" - -#. possible choice for hole_style -#: boxes/generators/can_storage.py -msgid "octagon" -msgstr "" - -#. parameter name for fillHoles -#: boxes/generators/can_storage.py -msgid "max_random" -msgstr "" - -#. help for parameter max_random -#: boxes/generators/can_storage.py -msgid "maximum number of random holes" -msgstr "" - -#. parameter name for fillHoles -#: boxes/generators/can_storage.py -msgid "space_between_holes" -msgstr "" - -#. help for parameter space_between_holes -#: boxes/generators/can_storage.py -msgid "hole to hole spacing (in mm)" -msgstr "" - -#. parameter name for fillHoles -#: boxes/generators/can_storage.py -msgid "space_to_border" -msgstr "" - -#. help for parameter space_to_border -#: boxes/generators/can_storage.py -msgid "hole to border spacing (in mm)" -msgstr "" - -#. name of box generator -#: boxes/generators/cardbox.py -msgid "CardBox" -msgstr "" - -#. description of CardBox -#: boxes/generators/cardbox.py -msgid "Box for storage of playing cards, with versatile options" -msgstr "" - -#. long description of CardBox in markdown -#: boxes/generators/cardbox.py -msgid "" -"\n" -"### Description\n" -"Versatile Box for Storage of playing cards. Multiple different styles of " -"storage are supportet, e.g. a flat storage or a trading card deck box style " -"storage. See images for ideas.\n" -"\n" -"#### Building instructions\n" -"Place inner walls on floor first (if any). Then add the outer walls. Glue " -"the two walls without finger joins to the inside of the side walls. Make " -"sure there is no squeeze out on top, as this is going to form the rail for " -"the lid.\n" -"\n" -"Add the top of the rails to the sides (front open) or to the back and front " -"(right side open) and the grip rail to the lid.\n" -"Details of the lid and rails\n" -"![Details](static/samples/CardBox-detail.jpg)\n" -"Whole box (early version still missing grip rail on the lid):\n" -msgstr "" - -msgid "CardBox Settings" -msgstr "" - -#. parameter name -#: boxes/generators/cardbox.py -msgid "openingdirection" -msgstr "" - -#. help for parameter openingdirection -#: boxes/generators/cardbox.py -msgid "" -"Direction in which the lid slides open. Lid length > Lid width recommended." -msgstr "" - -#. parameter name -#: boxes/generators/cardbox.py -msgid "fingerhole" -msgstr "" - -#. help for parameter fingerhole -#: boxes/generators/cardbox.py -msgid "Depth of cutout to grab the cards" -msgstr "" - -#. possible choice for fingerhole -#: boxes/generators/cardbox.py -msgid "regular" -msgstr "" - -#. possible choice for fingerhole -#: boxes/generators/cardbox.py -msgid "deep" -msgstr "" - -#. possible choice for fingerhole -#: boxes/generators/cardbox.py -msgid "custom" -msgstr "" - -#. parameter name -#: boxes/generators/cardbox.py -msgid "fingerhole_depth" -msgstr "" - -#. help for parameter fingerhole_depth -#: boxes/generators/cardbox.py -msgid "Depth of cutout if fingerhole is set to 'custom'. Disabled otherwise." -msgstr "" - -#. parameter name -#: boxes/generators/cardbox.py -msgid "add_lidtopper" -msgstr "" - -#. help for parameter add_lidtopper -#: boxes/generators/cardbox.py -msgid "Add an additional lid topper for optical reasons and customisation" -msgstr "" - -#. name of box generator -#: boxes/generators/cardholder.py -msgid "CardHolder" -msgstr "" - -#. description of CardHolder -#: boxes/generators/cardholder.py -msgid "Shelf for holding (multiple) piles of playing cards / notes" -msgstr "" - -msgid "CardHolder Settings" -msgstr "" - -#. help for parameter angle -#: boxes/generators/cardholder.py -msgid "backward angle of floor" -msgstr "" - -#. parameter name -#: boxes/generators/cardholder.py -msgid "stackable" -msgstr "" - -#. help for parameter stackable -#: boxes/generators/cardholder.py -msgid "make holders stackable" -msgstr "" - -msgid "Settings for Grooved Edge" -msgstr "" - -#. parameter name for Grooved -#: boxes/generators/cardholder.py -msgid "arc_angle" -msgstr "" - -#. help for parameter arc_angle -#: boxes/generators/cardholder.py -msgid "the angle of arc cuts" -msgstr "" - -#. parameter name for Grooved -#: boxes/generators/cardholder.py -msgid "gap" -msgstr "" - -#. help for parameter gap -#: boxes/generators/cardholder.py -msgid "the gap between grooves (fraction of the edge length)" -msgstr "" - -#. parameter name for Grooved -#: boxes/generators/cardholder.py -msgid "interleave" -msgstr "" - -#. help for parameter interleave -#: boxes/generators/cardholder.py -msgid "alternate the direction of grooves" -msgstr "" - -#. parameter name for Grooved -#: boxes/generators/cardholder.py -msgid "inverse" -msgstr "" - -#. help for parameter inverse -#: boxes/generators/cardholder.py -msgid "invert the groove directions" -msgstr "" - -#. parameter name for Grooved -#: boxes/generators/cardholder.py -msgid "margin" -msgstr "" - -#. help for parameter margin -#: boxes/generators/cardholder.py -msgid "" -"minimum space left and right without grooves (fraction of the edge length)" -msgstr "" - -#. help for parameter style -#: boxes/generators/cardholder.py -msgid "the style of grooves" -msgstr "" - -#. possible choice for style -#: boxes/generators/cardholder.py -msgid "arc" -msgstr "" - -#. possible choice for style -#: boxes/generators/cardholder.py -msgid "softarc" -msgstr "" - -#. parameter name for Grooved -#: boxes/generators/cardholder.py -msgid "tri_angle" -msgstr "" - -#. help for parameter tri_angle -#: boxes/generators/cardholder.py -msgid "the angle of triangular cuts" -msgstr "" - -#. help for parameter width -#: boxes/generators/cardholder.py -msgid "the width of each groove (fraction of the edge length)" -msgstr "" - -#. name of box generator -#: boxes/generators/castle.py -msgid "Castle" -msgstr "" - -#. description of Castle -#: boxes/generators/castle.py -msgid "Castle tower with two walls" -msgstr "" - -#. long description of Castle in markdown -#: boxes/generators/castle.py -msgid "" -"This was done as a table decoration. May be at some point in the future " -"someone will create a proper castle\n" -"with towers and gates and walls that can be attached in multiple " -"configurations." -msgstr "" - -msgid "Castle Settings" -msgstr "" - -#. name of box generator -#: boxes/generators/closedbox.py -msgid "ClosedBox" -msgstr "" - -#. description of ClosedBox -#: boxes/generators/closedbox.py -msgid "Fully closed box" -msgstr "" - -#. long description of ClosedBox in markdown -#: boxes/generators/closedbox.py -msgid "" -"This box is more of a building block than a finished item.\n" -"Use a vector graphics program (like Inkscape) to add holes or adjust the " -"base\n" -"plate.\n" -"\n" -"See BasedBox for variant with a base." -msgstr "" - -msgid "ClosedBox Settings" -msgstr "" - -#. name of box generator -#: boxes/generators/coffeecapsulesholder.py -msgid "CoffeeCapsuleHolder" -msgstr "" - -#. description of CoffeeCapsuleHolder -#: boxes/generators/coffeecapsulesholder.py -msgid "" -"\n" -" Coffee capsule holder\n" -" " -msgstr "" - -#. long description of CoffeeCapsuleHolder in markdown -#: boxes/generators/coffeecapsulesholder.py -msgid "" -"\n" -" You can store your coffee capsule near your espresso machine with this. " -"It works both vertically, or upside down under a shelf.\n" -msgstr "" - -msgid "CoffeeCapsuleHolder Settings" -msgstr "" - -#. parameter name -#: boxes/generators/coffeecapsulesholder.py -msgid "columns" -msgstr "" - -#. help for parameter columns -#: boxes/generators/coffeecapsulesholder.py -msgid "Number of columns of capsules." -msgstr "" - -#. parameter name -#: boxes/generators/coffeecapsulesholder.py -msgid "rows" -msgstr "" - -#. help for parameter rows -#: boxes/generators/coffeecapsulesholder.py -msgid "Number of capsules by columns." -msgstr "" - -#. parameter name -#: boxes/generators/coffeecapsulesholder.py -msgid "backplate" -msgstr "" - -#. help for parameter backplate -#: boxes/generators/coffeecapsulesholder.py -msgid "True if a backplate should be generated." -msgstr "" - -#. name of box generator -#: boxes/generators/coindisplay.py -msgid "CoinDisplay" -msgstr "" - -#. description of CoinDisplay -#: boxes/generators/coindisplay.py -msgid "A showcase for a single coin" -msgstr "" - -msgid "CoinDisplay Settings" -msgstr "" - -#. parameter name -#: boxes/generators/coindisplay.py -msgid "coin_d" -msgstr "" - -#. help for parameter coin_d -#: boxes/generators/coindisplay.py -msgid "The diameter of the coin in mm" -msgstr "" - -#. parameter name -#: boxes/generators/coindisplay.py -msgid "coin_plate" -msgstr "" - -#. help for parameter coin_plate -#: boxes/generators/coindisplay.py -msgid "The size of the coin plate" -msgstr "" - -#. parameter name -#: boxes/generators/coindisplay.py -msgid "coin_showcase_h" -msgstr "" - -#. help for parameter coin_showcase_h -#: boxes/generators/coindisplay.py -msgid "The height of the coin showcase piece" -msgstr "" - -#. help for parameter angle -#: boxes/generators/coindisplay.py -msgid "The angle that the coin will tilt as" -msgstr "" - -#. name of box generator -#: boxes/generators/concaveknob.py -msgid "ConcaveKnob" -msgstr "" - -#. description of ConcaveKnob -#: boxes/generators/concaveknob.py -msgid "Round knob serrated outside for better gripping" -msgstr "" - -msgid "ConcaveKnob Settings" -msgstr "" - -#. help for parameter diameter -#: boxes/generators/concaveknob.py -msgid "Diameter of the knob (mm)" -msgstr "" - -#. parameter name -#: boxes/generators/concaveknob.py -msgid "serrations" -msgstr "" - -#. help for parameter serrations -#: boxes/generators/concaveknob.py -msgid "Number of serrations" -msgstr "" - -#. parameter name -#: boxes/generators/concaveknob.py -msgid "rounded" -msgstr "" - -#. help for parameter rounded -#: boxes/generators/concaveknob.py -msgid "Amount of circumference used for non convex parts" -msgstr "" - -#. help for parameter angle -#: boxes/generators/concaveknob.py -msgid "Angle between convex and concave parts" -msgstr "" - -#. parameter name -#: boxes/generators/concaveknob.py -msgid "bolthole" -msgstr "" - -#. help for parameter bolthole -#: boxes/generators/concaveknob.py -msgid "Diameter of the bolt hole (mm)" -msgstr "" - -#. parameter name -#: boxes/generators/concaveknob.py -msgid "dhole" -msgstr "" - -#. help for parameter dhole -#: boxes/generators/concaveknob.py -msgid "D-Flat in fraction of the diameter" -msgstr "" - -#. parameter name -#: boxes/generators/concaveknob.py -msgid "hexhead" -msgstr "" - -#. help for parameter hexhead -#: boxes/generators/concaveknob.py -msgid "Width of the hex bolt head (mm)" -msgstr "" - -#. name of box generator -#: boxes/generators/console.py -msgid "Console" -msgstr "" - -#. description of Console -#: boxes/generators/console.py -msgid "Console with slanted panel" -msgstr "" - -#. long description of Console in markdown -#: boxes/generators/console.py -msgid "" -"\n" -"\n" -"Console Arcade Stick\n" -"\n" -"![Front](static/samples/ConsoleArcadeStickFront.jpg)\n" -"![Back](static/samples/ConsoleArcadeStickBack.jpg)\n" -"![Inside](static/samples/ConsoleArcadeStickInside.jpg)\n" -"\n" -"Keyboard enclosure:\n" -msgstr "" - -msgid "Console Settings" -msgstr "" - -#. parameter name -#: boxes/generators/console.py -msgid "front_height" -msgstr "" - -#. help for parameter front_height -#: boxes/generators/console.py -msgid "height of the front below the panel (in mm)" -msgstr "" - -#. help for parameter angle -#: boxes/generators/console.py -msgid "angle of the front panel (90°=upright)" -msgstr "" - -#. name of box generator -#: boxes/generators/console2.py -msgid "Console2" -msgstr "" - -#. description of Console2 -#: boxes/generators/console2.py -msgid "Console with slanted panel and service hatches" -msgstr "" - -#. long description of Console2 in markdown -#: boxes/generators/console2.py -msgid "" -"\n" -"This box is designed as a housing for electronic projects. It has hatches " -"that can be re-opened with simple tools. It intentionally cannot be opened " -"with bare hands - if build with thin enough material.\n" -"\n" -"#### Caution\n" -"There is a chance that the latches of the back wall or the back wall itself " -"interfere with the front panel or it's mounting frame/lips. The generator " -"does not check for this. So depending on the variant chosen you might need " -"to make the box deeper (increase y parameter) or the panel angle steeper " -"(increase angle parameter) until there is enough room.\n" -"\n" -"It's also possible that the frame of the panel interferes with the floor if " -"the hi parameter is too small.\n" -"\n" -"#### Assembly instructions\n" -"The main body is easy to assemble by starting with the floor and then adding " -"the four walls and (if present) the top piece.\n" -"\n" -"If the back wall is removable you need to add the lips and latches. The U-" -"shaped clamps holding the latches in place need to be clued in place without " -"also gluing the latches themselves. Make sure the springs on the latches " -"point inwards and the angled ends point to the side walls as shown here:\n" -"\n" -"![Back wall details](static/samples/Console2-backwall-detail.jpg)\n" -"\n" -"If the panel is removable you need to add the springs with the tabs to the " -"side lips. This photo shows the variant which has the panel glued to the " -"frame:\n" -"\n" -"![Back wall details](static/samples/Console2-panel-detail.jpg)\n" -"\n" -"If space is tight you may consider not gluing the cross pieces in place and " -"remove them after the glue-up. This may prevent the latches of the back wall " -"and the panel from interfering with each other.\n" -"\n" -"The variant using finger joints only has the two side lips without the cross " -"bars.\n" -"\n" -"#### Re-Opening\n" -"\n" -"The latches at the back wall lock in place when closed. To open them they " -"need to be pressed in and can then be moved aside.\n" -"\n" -"To remove the panel you have to press in the four tabs at the side. It is " -"easiest to push them in and then pull the panel up a little bit so the tabs " -"stay in.\n" -msgstr "" - -msgid "Console2 Settings" -msgstr "" - -#. parameter name -#: boxes/generators/console2.py -msgid "removable_backwall" -msgstr "" - -#. help for parameter removable_backwall -#: boxes/generators/console2.py -msgid "have latches at the backwall" -msgstr "" - -#. parameter name -#: boxes/generators/console2.py -msgid "removable_panel" -msgstr "" - -#. help for parameter removable_panel -#: boxes/generators/console2.py -msgid "The panel is held by tabs and can be removed" -msgstr "" - -#. parameter name -#: boxes/generators/console2.py -msgid "glued_panel" -msgstr "" - -#. help for parameter glued_panel -#: boxes/generators/console2.py -msgid "the panel is glued and not held by finger joints" -msgstr "" - -#. name of box generator -#: boxes/generators/crypticfont.py -msgid "CrypticFont" -msgstr "" - -#. description of CrypticFont -#: boxes/generators/crypticfont.py -msgid "DESCRIPTION" -msgstr "" - -msgid "CrypticFont Settings" -msgstr "" - -#. parameter name -#: boxes/generators/crypticfont.py -msgid "ctext" -msgstr "" - -#. help for parameter ctext -#: boxes/generators/crypticfont.py -msgid "text to render" -msgstr "" - -msgid "Settings for the Cryptic Font" -msgstr "" - -#. parameter name for CrypticFont -#: boxes/generators/crypticfont.py -msgid "ratio" -msgstr "" - -#. help for parameter ratio -#: boxes/generators/crypticfont.py -msgid "ratio of height to width" -msgstr "" - -#. parameter name for CrypticFont -#: boxes/generators/crypticfont.py -msgid "spacing" -msgstr "" - -#. help for parameter width -#: boxes/generators/crypticfont.py -msgid "width of the glphys in mm" -msgstr "" - -#. name of box generator -#: boxes/generators/desksign.py -msgid "Desksign" -msgstr "" - -#. description of Desksign -#: boxes/generators/desksign.py -msgid "Simple diagonal plate with stands to show name or mesage" -msgstr "" - -#. long description of Desksign in markdown -#: boxes/generators/desksign.py -msgid "" -"Text to be engraved can be genarated by inputing the label and fontsize " -"fields.\n" -" height represents the area that can be used for writing " -"text, does not match the actual\n" -" height when standing. Generated text is put in the center. " -"Currently only a single\n" -" line of text is supported." -msgstr "" - -msgid "Desksign Settings" -msgstr "" - -#. help for parameter width -#: boxes/generators/desksign.py -msgid "plate width in mm (excluding holes)" -msgstr "" - -#. help for parameter height -#: boxes/generators/desksign.py -msgid "plate height in mm" -msgstr "" - -#. help for parameter angle -#: boxes/generators/desksign.py -msgid "plate angle in degrees (90 is vertical)" -msgstr "" - -#. parameter name -#: boxes/generators/desksign.py -msgid "label" -msgstr "" - -#. help for parameter label -#: boxes/generators/desksign.py -msgid "optional text to engrave (leave blank to omit)" -msgstr "" - -#. parameter name -#: boxes/generators/desksign.py -msgid "fontsize" -msgstr "" - -#. help for parameter fontsize -#: boxes/generators/desksign.py -msgid "height of text" -msgstr "" - -#. parameter name -#: boxes/generators/desksign.py -msgid "feet" -msgstr "" - -#. help for parameter feet -#: boxes/generators/desksign.py -msgid "add raised feet" -msgstr "" - -#. parameter name -#: boxes/generators/desksign.py -msgid "mirror" -msgstr "" - -#. help for parameter mirror -#: boxes/generators/desksign.py -msgid "" -"mirrors one of the stand so the same side of the material can be placed on " -"the outside" -msgstr "" - -#. name of box generator -#: boxes/generators/dicebox.py -msgid "DiceBox" -msgstr "" - -#. description of DiceBox -#: boxes/generators/dicebox.py -msgid "Box with lid and integraded hinge for storing dice" -msgstr "" - -msgid "DiceBox Settings" -msgstr "" - -#. parameter name -#: boxes/generators/dicebox.py -msgid "lidheight" -msgstr "" - -#. help for parameter lidheight -#: boxes/generators/dicebox.py -msgid "height of lid in mm" -msgstr "" - -#. parameter name -#: boxes/generators/dicebox.py -msgid "hex_hole_corner_radius" -msgstr "" - -#. help for parameter hex_hole_corner_radius -#: boxes/generators/dicebox.py -msgid "The corner radius of the hexagonal dice holes, in mm" -msgstr "" - -#. parameter name -#: boxes/generators/dicebox.py -msgid "magnet_diameter" -msgstr "" - -#. help for parameter magnet_diameter -#: boxes/generators/dicebox.py -msgid "The diameter of magnets for holding the box closed, in mm" -msgstr "" - -msgid "Settings for Chest Hinges" -msgstr "" - -#. parameter name for ChestHinge -#: boxes/generators/dicebox.py -msgid "finger_joints_on_box" -msgstr "" - -#. help for parameter finger_joints_on_box -#: boxes/generators/dicebox.py -msgid "whether to include finger joints on the edge with the box" -msgstr "" - -#. parameter name for ChestHinge -#: boxes/generators/dicebox.py -msgid "finger_joints_on_lid" -msgstr "" - -#. help for parameter finger_joints_on_lid -#: boxes/generators/dicebox.py -msgid "whether to include finger joints on the edge with the lid" -msgstr "" - -#. parameter name for ChestHinge -#: boxes/generators/dicebox.py -msgid "hinge_strength" -msgstr "" - -#. parameter name for ChestHinge -#: boxes/generators/dicebox.py -msgid "pin_height" -msgstr "" - -#. help for parameter pin_height -#: boxes/generators/dicebox.py -msgid "radius of the disc rotating in the hinge (multiples of thickness)" -msgstr "" - -#. name of box generator -#: boxes/generators/dinrailbox.py -msgid "DinRailBox" -msgstr "" - -#. description of DinRailBox -#: boxes/generators/dinrailbox.py -msgid "Box for DIN rail used in electrical junction boxes" -msgstr "" - -msgid "DinRailBox Settings" -msgstr "" - -#. parameter name -#: boxes/generators/dinrailbox.py -msgid "rail_width" -msgstr "" - -#. help for parameter rail_width -#: boxes/generators/dinrailbox.py -msgid "width of the rail (typically 35 or 15mm)" -msgstr "" - -#. parameter name -#: boxes/generators/dinrailbox.py -msgid "rail_offset" -msgstr "" - -#. help for parameter rail_offset -#: boxes/generators/dinrailbox.py -msgid "offset of the rail from the middle of the box (in mm)" -msgstr "" - -#. name of box generator -#: boxes/generators/discrack.py -msgid "DiscRack" -msgstr "" - -#. description of DiscRack -#: boxes/generators/discrack.py -msgid "A rack for storing disk-shaped objects vertically next to each other" -msgstr "" - -msgid "DiscRack Settings" -msgstr "" - -#. parameter name -#: boxes/generators/discrack.py -msgid "disc_diameter" -msgstr "" - -#. help for parameter disc_diameter -#: boxes/generators/discrack.py -msgid "Disc diameter in mm" -msgstr "" - -#. parameter name -#: boxes/generators/discrack.py -msgid "disc_thickness" -msgstr "" - -#. help for parameter disc_thickness -#: boxes/generators/discrack.py -msgid "Thickness of the discs in mm" -msgstr "" - -#. parameter name -#: boxes/generators/discrack.py -msgid "lower_factor" -msgstr "" - -#. help for parameter lower_factor -#: boxes/generators/discrack.py -msgid "Position of the lower rack grids along the radius" -msgstr "" - -#. parameter name -#: boxes/generators/discrack.py -msgid "rear_factor" -msgstr "" - -#. help for parameter rear_factor -#: boxes/generators/discrack.py -msgid "Position of the rear rack grids along the radius" -msgstr "" - -#. parameter name -#: boxes/generators/discrack.py -msgid "disc_outset" -msgstr "" - -#. help for parameter disc_outset -#: boxes/generators/discrack.py -msgid "Additional space kept between the disks and the outbox of the rack" -msgstr "" - -#. help for parameter angle -#: boxes/generators/discrack.py -msgid "Backwards slant of the rack" -msgstr "" - -#. name of box generator -#: boxes/generators/dispenser.py -msgid "Dispenser" -msgstr "" - -#. description of Dispenser -#: boxes/generators/dispenser.py -msgid "Dispenser for stackable (flat) items of same size" -msgstr "" - -#. long description of Dispenser in markdown -#: boxes/generators/dispenser.py -msgid "" -"Set *bottomheight* to 0 for a wall mounting variant.\n" -"Please add mounting holes yourself." -msgstr "" - -msgid "Dispenser Settings" -msgstr "" - -#. parameter name -#: boxes/generators/dispenser.py -msgid "slotheight" -msgstr "" - -#. help for parameter slotheight -#: boxes/generators/dispenser.py -msgid "height of the dispenser slot / items (in mm)" -msgstr "" - -#. parameter name -#: boxes/generators/dispenser.py -msgid "bottomheight" -msgstr "" - -#. help for parameter bottomheight -#: boxes/generators/dispenser.py -msgid "height underneath the dispenser (in mm)" -msgstr "" - -#. parameter name -#: boxes/generators/dispenser.py -msgid "sideedges" -msgstr "" - -#. help for parameter sideedges -#: boxes/generators/dispenser.py -msgid "edges used for holding the front panels and back" -msgstr "" - -#. name of box generator -#: boxes/generators/display.py -msgid "Display" -msgstr "" - -#. description of Display -#: boxes/generators/display.py -msgid "Display for flyers or leaflets" -msgstr "" - -msgid "Display Settings" -msgstr "" - -#. help for parameter radius -#: boxes/generators/display.py -msgid "radius of the corners in mm" -msgstr "" - -#. help for parameter angle -#: boxes/generators/display.py -msgid "greater zero for top wider as bottom" -msgstr "" - -#. name of box generator -#: boxes/generators/displaycase.py -msgid "DisplayCase" -msgstr "" - -#. description of DisplayCase -#: boxes/generators/displaycase.py -msgid "" -"Fully closed box intended to be cut from transparent acrylics and to serve " -"as a display case." -msgstr "" - -msgid "DisplayCase Settings" -msgstr "" - -#. parameter name -#: boxes/generators/displaycase.py -msgid "overhang" -msgstr "" - -#. help for parameter overhang -#: boxes/generators/displaycase.py -msgid "overhang for joints in mm" -msgstr "" - -#. name of box generator -#: boxes/generators/displayshelf.py -msgid "DisplayShelf" -msgstr "" - -#. description of DisplayShelf -#: boxes/generators/displayshelf.py -msgid "Shelf with slanted floors" -msgstr "" - -msgid "DisplayShelf Settings" -msgstr "" - -#. parameter name -#: boxes/generators/displayshelf.py -msgid "num" -msgstr "" - -#. help for parameter num -#: boxes/generators/displayshelf.py -msgid "number of shelves" -msgstr "" - -#. parameter name -#: boxes/generators/displayshelf.py -msgid "front_wall_height" -msgstr "" - -#. help for parameter front_wall_height -#: boxes/generators/displayshelf.py -msgid "height of front walls" -msgstr "" - -#. help for parameter angle -#: boxes/generators/displayshelf.py -msgid "angle of floors (negative values for slanting backwards)" -msgstr "" - -#. parameter name -#: boxes/generators/displayshelf.py -msgid "include_back" -msgstr "" - -#. help for parameter include_back -#: boxes/generators/displayshelf.py -msgid "Include panel on the back of the shelf" -msgstr "" - -#. parameter name -#: boxes/generators/displayshelf.py -msgid "slope_top" -msgstr "" - -#. help for parameter slope_top -#: boxes/generators/displayshelf.py -msgid "Slope the sides and the top by front wall height" -msgstr "" - -#. parameter name -#: boxes/generators/displayshelf.py -msgid "divider_wall_height" -msgstr "" - -#. help for parameter divider_wall_height -#: boxes/generators/displayshelf.py -msgid "height of divider walls" -msgstr "" - -#. name of box generator -#: boxes/generators/dividertray.py -msgid "DividerTray" -msgstr "" - -#. description of DividerTray -#: boxes/generators/dividertray.py -msgid "Divider tray - rows and dividers" -msgstr "" - -#. long description of DividerTray in markdown -#: boxes/generators/dividertray.py -msgid "" -"\n" -"Adding '0:' at the start of the sy parameter adds a slot at the very back. " -"Adding ':0' at the end of sy adds a slot meeting the bottom at the very " -"front. This is especially useful if slot angle is set above zero.\n" -"\n" -"There are 4 different sets of dividers rendered:\n" -"\n" -"* With asymmetric tabs so the tabs fit on top of each other\n" -"* With tabs of half wall thickness that can go side by side\n" -"* With tabs of a full wall thickness\n" -"* One single divider spanning across all columns\n" -"\n" -"You will likely need to cut each of the dividers you want multiple times.\n" -msgstr "" - -msgid "DividerTray Settings" -msgstr "" - -#. parameter name -#: boxes/generators/dividertray.py -msgid "notches_in_wall" -msgstr "" - -#. help for parameter notches_in_wall -#: boxes/generators/dividertray.py -msgid "generate the same notches on the walls that are on the dividers" -msgstr "" - -#. parameter name -#: boxes/generators/dividertray.py -msgid "left_wall" -msgstr "" - -#. help for parameter left_wall -#: boxes/generators/dividertray.py -msgid "generate wall on the left side" -msgstr "" - -#. parameter name -#: boxes/generators/dividertray.py -msgid "right_wall" -msgstr "" - -#. help for parameter right_wall -#: boxes/generators/dividertray.py -msgid "generate wall on the right side" -msgstr "" - -#. parameter name -#: boxes/generators/dividertray.py -msgid "bottom" -msgstr "" - -#. help for parameter bottom -#: boxes/generators/dividertray.py -msgid "generate wall on the bottom" -msgstr "" - -#. help for parameter handle -#: boxes/generators/dividertray.py -msgid "add handle to the bottom" -msgstr "" - -msgid "Settings for Divider Slots" -msgstr "" - -#. help for parameter angle -#: boxes/generators/dividertray.py -msgid "angle at which slots are generated, in degrees. 0° is vertical." -msgstr "" - -#. help for parameter depth -#: boxes/generators/dividertray.py -msgid "depth of the slot in mm" -msgstr "" - -#. parameter name for Slot -#: boxes/generators/dividertray.py -msgid "extra_slack" -msgstr "" - -#. help for parameter extra_slack -#: boxes/generators/dividertray.py -msgid "" -"extra slack (in addition to thickness and kerf) to help insert dividers in mm" -msgstr "" - -#. help for parameter radius -#: boxes/generators/dividertray.py -msgid "radius of the slot entrance in mm" -msgstr "" - -msgid "Settings for Notches on the Dividers" -msgstr "" - -#. parameter name for Notch -#: boxes/generators/dividertray.py -msgid "lower_radius" -msgstr "" - -#. parameter name for Notch -#: boxes/generators/dividertray.py -msgid "upper_radius" -msgstr "" - -msgid "Settings for Dividers" -msgstr "" - -#. parameter name for Divider -#: boxes/generators/dividertray.py -msgid "bottom_margin" -msgstr "" - -#. help for parameter bottom_margin -#: boxes/generators/dividertray.py -msgid "margin between box's bottom and divider's in mm" -msgstr "" - -#. help for parameter play -#: boxes/generators/dividertray.py -msgid "play to avoid them clamping onto the walls (in multiples of thickness)" -msgstr "" - -#. name of box generator -#: boxes/generators/doubleflexdoorbox.py -msgid "DoubleFlexDoorBox" -msgstr "" - -#. description of DoubleFlexDoorBox -#: boxes/generators/doubleflexdoorbox.py -msgid "Box with two part lid with living hinges and round corners" -msgstr "" - -msgid "DoubleFlexDoorBox Settings" -msgstr "" - -#. help for parameter radius -#: boxes/generators/doubleflexdoorbox.py -msgid "Radius of the latch in mm" -msgstr "" - -#. parameter name -#: boxes/generators/doubleflexdoorbox.py -msgid "latchsize" -msgstr "" - -#. help for parameter latchsize -#: boxes/generators/doubleflexdoorbox.py -msgid "size of latch in multiples of thickness" -msgstr "" - -#. name of box generator -#: boxes/generators/drillbox.py -msgid "DrillBox" -msgstr "" - -#. description of DrillBox -#: boxes/generators/drillbox.py -msgid "A parametrized box for drills" -msgstr "" - -#. long description of DrillBox in markdown -#: boxes/generators/drillbox.py -msgid "![Multiple DrillBoxes](static/samples/DrillBoxes.jpg) " -msgstr "" - -msgid "DrillBox Settings" -msgstr "" - -#. parameter name -#: boxes/generators/drillbox.py -msgid "holes" -msgstr "" - -#. help for parameter holes -#: boxes/generators/drillbox.py -msgid "Number of holes for each size" -msgstr "" - -#. parameter name -#: boxes/generators/drillbox.py -msgid "firsthole" -msgstr "" - -#. help for parameter firsthole -#: boxes/generators/drillbox.py -msgid "Smallest hole" -msgstr "" - -#. parameter name -#: boxes/generators/drillbox.py -msgid "holeincrement" -msgstr "" - -#. help for parameter holeincrement -#: boxes/generators/drillbox.py -msgid "increment between holes" -msgstr "" - -msgid "Settings for RoundedTriangleEdge" -msgstr "" - -#. help for parameter height -#: boxes/generators/drillbox.py -msgid "height above the wall" -msgstr "" - -#. parameter name for RoundedTriangleEdge -#: boxes/generators/drillbox.py -msgid "r_hole" -msgstr "" - -#. help for parameter r_hole -#: boxes/generators/drillbox.py -msgid "radius of hole" -msgstr "" - -#. help for parameter radius -#: boxes/generators/drillbox.py -msgid "radius of top corner" -msgstr "" - -#. help for parameter outset -#: boxes/generators/drillbox.py -msgid "" -"extend the triangle along the length of the edge (multiples of thickness)" -msgstr "" - -msgid "Settings for Mounting Edge" -msgstr "" - -#. parameter name for Mounting -#: boxes/generators/drillbox.py -msgid "d_head" -msgstr "" - -#. help for parameter d_head -#: boxes/generators/drillbox.py -msgid "head diameter of mounting screw (in mm)" -msgstr "" - -#. parameter name for Mounting -#: boxes/generators/drillbox.py -msgid "d_shaft" -msgstr "" - -#. help for parameter d_shaft -#: boxes/generators/drillbox.py -msgid "shaft diameter of mounting screw (in mm)" -msgstr "" - -#. help for parameter margin -#: boxes/generators/drillbox.py -msgid "" -"minimum space left and right without holes (fraction of the edge length)" -msgstr "" - -#. help for parameter num -#: boxes/generators/drillbox.py -msgid "number of mounting holes (integer)" -msgstr "" - -#. parameter name for Mounting -#: boxes/generators/drillbox.py -msgid "side" -msgstr "" - -#. help for parameter side -#: boxes/generators/drillbox.py -msgid "side of box (not all valid configurations make sense...)" -msgstr "" - -#. possible choice for side -#: boxes/generators/drillbox.py -msgid "back" -msgstr "" - -#. help for parameter style -#: boxes/generators/drillbox.py -msgid "edge style" -msgstr "" - -#. possible choice for style -#: boxes/generators/drillbox.py -msgid "straight edge, within" -msgstr "" - -#. possible choice for style -#: boxes/generators/drillbox.py -msgid "straight edge, extended" -msgstr "" - -#. possible choice for style -#: boxes/generators/drillbox.py -msgid "mounting tab" -msgstr "" - -#. name of box generator -#: boxes/generators/drillstand.py -msgid "DrillStand" -msgstr "" - -#. description of DrillStand -#: boxes/generators/drillstand.py -msgid "Box for drills with each compartment of a different height" -msgstr "" - -#. long description of DrillStand in markdown -#: boxes/generators/drillstand.py -msgid "" -"Note: `sh` gives the hight of the rows front to back. It though should have " -"the same number of entries as `sy`. These heights are the one on the left " -"side and increase throughout the row. To have each compartment a bit higher " -"than the previous one the steps in `sh` should be a bit bigger than " -"`extra_height`.\n" -"\n" -"Assembly:\n" -"\n" -"![Parts](static/samples/DrillStand-drawing.png)\n" -"\n" -"Start with putting the slots of the inner walls together. Be especially " -"careful with adding the bottom. It is always asymmetrical and flush with the " -"right/lower side while being a little short on the left/higher side to not " -"protrude into the side wall.\n" -"\n" -"| | |\n" -"| ---- | ---- |\n" -"| ![Assembly inner walls](static/samples/DrillStand-assembly-1.jpg) | !" -"[Assembly bottom](static/samples/DrillStand-assembly-2.jpg) |\n" -"| Then add the front and the back wall. | Add the very left and right walls " -"last. |\n" -"| ![Assembly front and back](static/samples/DrillStand-assembly-3.jpg) | !" -"[Assembly side walls](static/samples/DrillStand-assembly-4.jpg) |\n" -msgstr "" - -msgid "DrillStand Settings" -msgstr "" - -#. parameter name -#: boxes/generators/drillstand.py -msgid "extra_height" -msgstr "" - -#. help for parameter extra_height -#: boxes/generators/drillstand.py -msgid "height difference left to right" -msgstr "" - -#. name of box generator -#: boxes/generators/electronicsbox.py -msgid "ElectronicsBox" -msgstr "" - -#. description of ElectronicsBox -#: boxes/generators/electronicsbox.py -msgid "Closed box with screw on top and mounting holes" -msgstr "" - -msgid "ElectronicsBox Settings" -msgstr "" - -#. help for parameter triangle -#: boxes/generators/electronicsbox.py -msgid "Sides of the triangles holding the lid in mm" -msgstr "" - -#. parameter name -#: boxes/generators/electronicsbox.py -msgid "d1" -msgstr "" - -#. help for parameter d1 -#: boxes/generators/electronicsbox.py -msgid "Diameter of the inner lid screw holes in mm" -msgstr "" - -#. parameter name -#: boxes/generators/electronicsbox.py -msgid "d2" -msgstr "" - -#. help for parameter d2 -#: boxes/generators/electronicsbox.py -msgid "Diameter of the lid screw holes in mm" -msgstr "" - -#. parameter name -#: boxes/generators/electronicsbox.py -msgid "d3" -msgstr "" - -#. help for parameter d3 -#: boxes/generators/electronicsbox.py -msgid "Diameter of the mounting screw holes in mm" -msgstr "" - -#. parameter name -#: boxes/generators/electronicsbox.py -msgid "outsidemounts" -msgstr "" - -#. help for parameter outsidemounts -#: boxes/generators/electronicsbox.py -msgid "Add external mounting points" -msgstr "" - -#. parameter name -#: boxes/generators/electronicsbox.py -msgid "holedist" -msgstr "" - -#. help for parameter holedist -#: boxes/generators/electronicsbox.py -msgid "Distance of the screw holes from the wall in mm" -msgstr "" - -#. name of box generator -#: boxes/generators/eurorackskiff.py -msgid "EuroRackSkiff" -msgstr "" - -#. description of EuroRackSkiff -#: boxes/generators/eurorackskiff.py -msgid "3U Height case with adjustable width and height and included rails" -msgstr "" - -msgid "EuroRackSkiff Settings" -msgstr "" - -#. parameter name -#: boxes/generators/eurorackskiff.py -msgid "hp" -msgstr "" - -#. help for parameter hp -#: boxes/generators/eurorackskiff.py -msgid "Width of the case in HP" -msgstr "" - -#. name of box generator -#: boxes/generators/fanhole.py -msgid "FanHole" -msgstr "" - -#. description of FanHole -#: boxes/generators/fanhole.py -msgid "Hole pattern for mounting a fan" -msgstr "" - -msgid "FanHole Settings" -msgstr "" - -#. help for parameter diameter -#: boxes/generators/fanhole.py -msgid "diameter of the fan hole" -msgstr "" - -#. parameter name -#: boxes/generators/fanhole.py -msgid "mounting_holes" -msgstr "" - -#. help for parameter mounting_holes -#: boxes/generators/fanhole.py -msgid "diameter of the fan mounting holes" -msgstr "" - -#. parameter name -#: boxes/generators/fanhole.py -msgid "mounting_holes_inset" -msgstr "" - -#. help for parameter mounting_holes_inset -#: boxes/generators/fanhole.py -msgid "distance of the fan mounting holes from the outside" -msgstr "" - -#. parameter name -#: boxes/generators/fanhole.py -msgid "arms" -msgstr "" - -#. help for parameter arms -#: boxes/generators/fanhole.py -msgid "number of arms" -msgstr "" - -#. parameter name -#: boxes/generators/fanhole.py -msgid "inner_disc" -msgstr "" - -#. help for parameter inner_disc -#: boxes/generators/fanhole.py -msgid "relative size of the inner disc" -msgstr "" - -#. help for parameter style -#: boxes/generators/fanhole.py -msgid "Style of the fan hole" -msgstr "" - -#. possible choice for style -#: boxes/generators/fanhole.py -msgid "CW Swirl" -msgstr "" - -#. possible choice for style -#: boxes/generators/fanhole.py -msgid "CCW Swirl" -msgstr "" - -#. possible choice for style -#: boxes/generators/fanhole.py -msgid "Hole" -msgstr "" - -#. name of box generator -#: boxes/generators/filamentspool.py -msgid "FilamentSpool" -msgstr "" - -#. description of FilamentSpool -#: boxes/generators/filamentspool.py -msgid "A two part spool for 3D printing filament" -msgstr "" - -#. long description of FilamentSpool in markdown -#: boxes/generators/filamentspool.py -msgid "" -"\n" -"Use small nails to properly align the pieces of the bayonet latch. Glue the " -"parts of the bayonet latch before assembling the \"axle\". The inner parts " -"go at the side and the outer parts at the inside of the axle.\n" -"![opened spool](static/samples/FilamentSpool-2.jpg)" -msgstr "" - -msgid "FilamentSpool Settings" -msgstr "" - -#. parameter name -#: boxes/generators/filamentspool.py -msgid "outer_diameter" -msgstr "" - -#. help for parameter outer_diameter -#: boxes/generators/filamentspool.py -msgid "diameter of the flanges" -msgstr "" - -#. parameter name -#: boxes/generators/filamentspool.py -msgid "inner_diameter" -msgstr "" - -#. help for parameter inner_diameter -#: boxes/generators/filamentspool.py -msgid "diameter of the center part" -msgstr "" - -#. parameter name -#: boxes/generators/filamentspool.py -msgid "axle_diameter" -msgstr "" - -#. help for parameter axle_diameter -#: boxes/generators/filamentspool.py -msgid "diameter of the axle hole" -msgstr "" - -#. parameter name -#: boxes/generators/filamentspool.py -msgid "sides" -msgstr "" - -#. help for parameter sides -#: boxes/generators/filamentspool.py -msgid "number of pieces for the center part" -msgstr "" - -#. name of box generator -#: boxes/generators/filltest.py -msgid "FillTest" -msgstr "" - -#. description of FillTest -#: boxes/generators/filltest.py -msgid "Piece for testing different settings for hole filling" -msgstr "" - -msgid "FillTest Settings" -msgstr "" - -#. description of FlexBox -#: boxes/generators/flexbox.py -msgid "Box with living hinge and round corners" -msgstr "" - -msgid "FlexBox Settings" -msgstr "" - -#. name of box generator -#: boxes/generators/flexbox2.py -msgid "FlexBox2" -msgstr "" - -#. description of FlexBox2 -#: boxes/generators/flexbox2.py -msgid "Box with living hinge and top corners rounded" -msgstr "" - -msgid "FlexBox2 Settings" -msgstr "" - -#. help for parameter radius -#: boxes/generators/flexbox2.py -msgid "Radius of the corners in mm" -msgstr "" - -#. name of box generator -#: boxes/generators/flexbox3.py -msgid "FlexBox3" -msgstr "" - -#. description of FlexBox3 -#: boxes/generators/flexbox3.py -msgid "Box with living hinge" -msgstr "" - -msgid "FlexBox3 Settings" -msgstr "" - -#. parameter name -#: boxes/generators/flexbox3.py -msgid "z" -msgstr "" - -#. help for parameter z -#: boxes/generators/flexbox3.py -msgid "height of the box" -msgstr "" - -#. help for parameter h -#: boxes/generators/flexbox3.py -msgid "height of the lid" -msgstr "" - -#. help for parameter radius -#: boxes/generators/flexbox3.py -msgid "radius of the lids living hinge" -msgstr "" - -#. help for parameter c -#: boxes/generators/flexbox3.py -msgid "clearance of the lid" -msgstr "" - -#. name of box generator -#: boxes/generators/flexbox4.py -msgid "FlexBox4" -msgstr "" - -#. description of FlexBox4 -#: boxes/generators/flexbox4.py -msgid "Box with living hinge and left corners rounded" -msgstr "" - -msgid "FlexBox4 Settings" -msgstr "" - -#. name of box generator -#: boxes/generators/flexbox5.py -msgid "FlexBox5" -msgstr "" - -msgid "FlexBox5 Settings" -msgstr "" - -#. parameter name -#: boxes/generators/flexbox5.py -msgid "top_diameter" -msgstr "" - -#. help for parameter top_diameter -#: boxes/generators/flexbox5.py -msgid "diameter at the top" -msgstr "" - -#. parameter name -#: boxes/generators/flexbox5.py -msgid "bottom_diameter" -msgstr "" - -#. help for parameter bottom_diameter -#: boxes/generators/flexbox5.py -msgid "diameter at the bottom" -msgstr "" - -#. name of box generator -#: boxes/generators/flextest.py -msgid "FlexTest" -msgstr "" - -#. description of FlexTest -#: boxes/generators/flextest.py -msgid "Piece for testing different flex settings" -msgstr "" - -msgid "FlexTest Settings" -msgstr "" - -#. name of box generator -#: boxes/generators/flextest2.py -msgid "FlexTest2" -msgstr "" - -#. description of FlexTest2 -#: boxes/generators/flextest2.py -msgid "Piece for testing 2D flex settings" -msgstr "" - -msgid "FlexTest2 Settings" -msgstr "" - -#. parameter name -#: boxes/generators/flextest2.py -msgid "fw" -msgstr "" - -#. help for parameter fw -#: boxes/generators/flextest2.py -msgid "distance of flex cuts in multiples of thickness" -msgstr "" - -#. name of box generator -#: boxes/generators/folder.py -msgid "Folder" -msgstr "" - -#. description of Folder -#: boxes/generators/folder.py -msgid "Book cover with flex for the spine" -msgstr "" - -msgid "Folder Settings" -msgstr "" - -#. parameter name -#: boxes/generators/folder.py -msgid "r" -msgstr "" - -#. name of box generator -#: boxes/generators/frontpanel.py -msgid "FrontPanel" -msgstr "" - -#. description of FrontPanel -#: boxes/generators/frontpanel.py -msgid "Mounting Holes and cutouts for all your holy needs." -msgstr "" - -#. long description of FrontPanel in markdown -#: boxes/generators/frontpanel.py -msgid "" -"\n" -" -""") - return b''.join(s.encode("utf-8") for s in result) - - def writeINX(self, name, box, path): - with open(os.path.join(path, "boxes.py." + name + '.inx'), "wb") as f: - f.write(self.generator2inx(name, box)) - - def writeAllINX(self, path): - for name, box in self.boxes.items(): - if name.startswith("TrayLayout"): - # The two stage thing does not work (yet?) - continue - self.writeINX(name, box, path) - - -def main() -> None: - if len(sys.argv) != 2: - print("Usage: boxes2inkscape TARGETPATH") - return - b = Boxes2INX() - b.writeAllINX(sys.argv[1]) - - -if __name__ == "__main__": - main() diff --git a/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes2pot b/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes2pot deleted file mode 100755 index 9159969..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes2pot +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (C) 2019 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -from __future__ import annotations - -import argparse -import os.path -import sys -from typing import Any - -try: - import boxes.generators -except ImportError: - sys.path.append(os.path.dirname(__file__) + "/..") - import boxes.generators -from boxes import edges, lids - - -class DefaultParams(boxes.Boxes): - - def __init__(self) -> None: - boxes.Boxes.__init__(self) - self.buildArgParser("x", "y", "h", "hi", "sx", "sy", "sh", - "bottom_edge", "top_edge", "outside", "nema_mount") - self.addSettingsArgs(edges.FingerJointSettings, finger=1.0, space=1.0) - self.addSettingsArgs(edges.StackableSettings) - self.addSettingsArgs(edges.HingeSettings) - self.addSettingsArgs(edges.SlideOnLidSettings) - self.addSettingsArgs(edges.ClickSettings) - self.addSettingsArgs(edges.FlexSettings) - self.addSettingsArgs(lids.LidSettings) - - -class Boxes2pot: - def __init__(self) -> None: - self.messages: list[Any] = [] - self.message_set: set[Any] = set() - self.boxes = {b.__name__: b() for b in boxes.generators.getAllBoxGenerators().values() if b.webinterface} - self.groups = boxes.generators.ui_groups - self.groups_by_name = boxes.generators.ui_groups_by_name - self._readEdgeDescriptions() - - def add(self, msg, comment=None, reference=None): - if not msg or msg in self.message_set: - return - self.message_set.add(msg) - self.messages.append((msg, comment, reference)) - - def filename_from_module(self, modulename): - modulenames = modulename.split(".") - return "/".join(modulenames) + ".py" - - def _readEdgeDescriptions(self): - for char, descr in edges.getDescriptions().items(): - self.add(descr, f"{char} edge description", "boxes/edges.py") - self.add(f"{char} {descr}", f"{char} edge description", "boxes/edges.py") - - def addBoxParams(self, name, box, location=None): - for group in box.argparser._action_groups: - if not group._group_actions: - continue - self.add(group.title) - for a in group._group_actions: - if a.dest in ("input", "output"): - continue - if isinstance(a, argparse._HelpAction): - continue - prefix = getattr(group, "prefix", "") - name = a.option_strings[0].replace("-", "") - if prefix and name.startswith(prefix + '_'): - name = name[len(prefix) + 1:] - self.add(name, "parameter name for " + prefix, location) - else: - self.add(name, "parameter name", location) - if a.help: - self.add(a.help, "help for parameter " + name, location) - for c in a.choices or []: - if isinstance(c, (float, int)): - continue - self.add(c, "possible choice for " + name, location) - - def readBoxes(self): - for group in self.groups: - location = "boxes/generators/__init__.py" - self.add(group.name, "name of generator group", location) - self.add(group.title, "title of group " + group.name, location) - self.add(group.description, "description of group " + group.name, location) - self.addBoxParams(None, DefaultParams()) - for name, box in self.boxes.items(): - location = self.filename_from_module(box.__module__) - self.add(name, "name of box generator", location) - if box.__doc__: - self.add(box.__doc__, "description of " + name, location) - if box.description: - self.add(box.description, "long description of " + name + " in markdown", location) - self.addBoxParams(name, box, location) - - def writePOT(self, fn): - with open(fn, encoding="utf-8", mode="w") as f: - f.write(r"""msgid "" -msgstr "" -"Project-Id-Version: boxes.py VERSION\n" -"PO-Revision-Date: 2019-04-20 14:53+0200\n" -"Last-Translator: Florian Festi \n" -"Language-Team: English\n" -"Language: en_US\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -""") - - for msg, comment, reference in self.messages: - f.write("\n") - if comment: - f.write("#. %s\n" % comment) - if reference: - f.write("#: %s\n" % reference) - msg = msg.split("\n") - for i in range(len(msg) - 1): - msg[i] += "\\n" - f.write('msgid ') - for m in msg: - f.write(' "%s"\n' % m.replace('"', '\\"')) - f.write('msgstr ""\n') - - -def main() -> None: - if len(sys.argv) != 2: - print("Usage: boxes2pot TARGETPATH") - return - b = Boxes2pot() - b.readBoxes() - b.writePOT(sys.argv[1]) - - -if __name__ == "__main__": - main() diff --git a/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes_example.ipynb b/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes_example.ipynb deleted file mode 100644 index e451b80..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes_example.ipynb +++ /dev/null @@ -1,176 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Boxes.py example\n", - "\n", - "This notebook is an interactive example of a Boxes.py generator. Feel free to play around and see how the result changes.\n", - "\n", - "Check out http://florianfesti.github.io/boxes/html/index.html for documentation." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import SVG, display\n", - "\n", - "import sys\n", - "# sys.path.append('..') # uncomments and adjust if your Boxes.py copy in not in the Python path\n", - "from boxes import *" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "Example\n", - "\n", - "\n", - "Shelves - Example\n", - "2024-02-11 17:45:59\n", - "boxes Example --reference=0 --debug=0\n", - "Example: Single Shelve to screw to the wall\n", - "\n", - "Created with Boxes.py (https://festi.info/boxes.py)\n", - "Command line: boxes Example --reference=0 --debug=0\n", - "Command line short: boxes Example --reference=0\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "class Example(Boxes): # Adjust class name and call below\n", - " \"\"\"Example: Single Shelve to screw to the wall\"\"\"\n", - "\n", - " ui_group = \"Shelves\" # change for generators belonging in another group\n", - " \n", - " def __init__(self):\n", - " Boxes.__init__(self)\n", - " # arguments\n", - " self.addSettingsArgs(edges.FingerJointSettings, finger=3.0) # arguments for finger joints\n", - " self.buildArgParser(x=150, y=70, h=50)\n", - " self.argparser.add_argument(\n", - " \"--hole_dist\", action=\"store\", type=float, default=10.,\n", - " help=\"distance of the mounting holes to the boards\")\n", - " self.argparser.add_argument(\n", - " \"--hole_dia\", action=\"store\", type=float, default=3., # can't use \"hole\" as param name as it is a method\n", - " help=\"diameter of the mounting holes\")\n", - " \n", - " def render(self):\n", - " x, y, h = self.x, self.y, self.h\n", - " t = self.thickness\n", - " \n", - " # render-magic goes here\n", - " \n", - " hole = lambda: self.hole(self.hole_dist, self.hole_dist, d=self.hole_dia) # use lambda as a callback\n", - " # holes are placed relative to the inner rectangle of the back wall. The top part with the finger holes and \n", - " # the finges at the sides do not count.\n", - " # Callbacks start in the bottom left corner. Place holes in the third and forth corners only. \n", - " self.rectangularWall(x, h, \"eFhF\", move=\"up\", callback=[None, None, hole, hole]) # back board\n", - "\n", - " self.rectangularWall(x, y, \"ehfh\", move=\"up\") # top board\n", - " self.rectangularTriangle(y, h, \"ff\", num=2) # braces \n", - " \n", - "\n", - "b = Example()\n", - "b.parseArgs(['--reference=0', '--debug=0'])\n", - "b.open()\n", - "b.render()\n", - "data = b.close()\n", - "\n", - "display(SVG(data=data.getvalue()))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.1" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes_proxy.py b/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes_proxy.py deleted file mode 100755 index 0800ab3..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes_proxy.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 - -""" -Extension for InkScape 1.0+ - -boxes.py wrapper script to make it work on Windows and Linux systems without duplicating .inx files - -Author: Mario Voigt / FabLab Chemnitz -Mail: mario.voigt@stadtfabrikanten.org -Date: 27.04.2021 -Last patch: 27.04.2021 -License: GNU GPL v3 - -""" -pass -import subprocess -import sys - -pass -from shlex import quote - -from inkex.extensions import GenerateExtension -from lxml import etree - -import inkex - - -class boxesPyWrapper(GenerateExtension): - def add_arguments(self, pars): - args = sys.argv[1:] - for arg in args: - key = arg.split("=")[0] - if key == "--id": - continue - if len(arg.split("=")) == 2: - value = arg.split("=")[1] - pars.add_argument(key, default=key) - - def generate(self): - cmd = "boxes" # boxes.exe in this local dir (or if present in %PATH%), or boxes from $PATH in linux - for arg in vars(self.options): - if arg in ( - "output", "id", "ids", "selected_nodes", - "input_file", "tab"): - continue - # fix behaviour of "original" arg which does not correctly gets - # interpreted if set to false - if arg == "original" and str(getattr(self.options, arg)) == "false": - continue - cmd += f" --{arg} {quote(str(getattr(self.options, arg)))}" - cmd += f" --output -" - cmd = cmd.replace("boxes --generator", "boxes") - - # run boxes with the parameters provided - result = subprocess.run(cmd.split(), capture_output=True) - - if result.returncode: - inkex.utils.debug("Generating box svg failed. Cannot continue. Command was:") - inkex.utils.debug(str(cmd)) - inkex.utils.debug(str(result.stderr)) - exit(1) - - # write the generated SVG into Inkscape's canvas - p = etree.XMLParser(huge_tree=True) - doc = etree.fromstring(result.stdout, parser=etree.XMLParser(huge_tree=True)) - group = inkex.Group(id="boxes.py") - for element in doc: - group.append(element) - return group - - -def main() -> None: - boxesPyWrapper().run() - - -if __name__ == '__main__': - main() diff --git a/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxesserver b/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxesserver deleted file mode 100755 index ef4e862..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxesserver +++ /dev/null @@ -1,711 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (C) 2016-2017 Florian Festi -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -from __future__ import annotations - -import argparse -import gettext -import glob -import html -import io -import mimetypes -import os.path -import re -import sys -import threading -import time -import traceback -from typing import Any, NoReturn -from urllib.parse import quote, unquote_plus -from wsgiref.simple_server import make_server - -import markdown -import qrcode - -try: - import boxes.generators -except ImportError: - sys.path.append(os.path.join(os.path.dirname(__file__), "..")) - import boxes.generators - - -class FileChecker(threading.Thread): - def __init__(self, files=[], checkmodules: bool = True) -> None: - super().__init__() - self.checkmodules = checkmodules - self.timestamps = {} - self._stopped = False - for path in files: - self.timestamps[path] = os.stat(path).st_mtime - if checkmodules: - self._addModules() - - def _addModules(self) -> None: - for name, module in sys.modules.items(): - path = getattr(module, "__file__", None) - if not path: - continue - if path not in self.timestamps: - self.timestamps[path] = os.stat(path).st_mtime - - def filesOK(self) -> bool: - if self.checkmodules: - self._addModules() - for path, timestamp in self.timestamps.items(): - try: - if os.stat(path).st_mtime != timestamp: - return False - except FileNotFoundError: - return False - return True - - def run(self) -> None: - while not self._stopped: - if not self.filesOK(): - os.execv(__file__, sys.argv) - time.sleep(1) - - def stop(self) -> None: - self._stopped = True - - -def filter_url(url, non_default_args): - if len(url) == 0: - return '' - try: - base, args = url.split('?') - except ValueError: - return '' - args = args.split('&') - new_args = [] - args_to_ignore = ["qr_code", "format"] - for arg in args: - a, b = arg.split('=') - if a.strip() in args_to_ignore: - continue - if a in non_default_args: - new_args.append(arg) - if len(new_args): - return f"{base}?{'&'.join(new_args)}" - else: - return f"{base}" - - -class ArgumentParserError(Exception): pass - - -class ThrowingArgumentParser(argparse.ArgumentParser): - def error(self, message) -> NoReturn: - raise ArgumentParserError(message) - - -# Evil hack -boxes.ArgumentParser = ThrowingArgumentParser # type: ignore - - -class BServer: - lang_re = re.compile(r"([a-z]{2,3}(-[-a-zA-Z0-9]*)?)\s*(;\s*q=(\d\.?\d*))?") - - def __init__(self, url_prefix="", static_url="static") -> None: - self.boxes = {b.__name__: b for b in boxes.generators.getAllBoxGenerators().values() if b.webinterface} - self.groups = boxes.generators.ui_groups - self.groups_by_name = boxes.generators.ui_groups_by_name - - for name, box in self.boxes.items(): - box.UI = "web" - self.groups_by_name.get(box.ui_group, - self.groups_by_name["Misc"]).add(box) - - self.staticdir = os.path.join(os.path.dirname(__file__), '../static/') - self._languages = None - self._cache: dict[Any, Any] = {} - self.url_prefix = url_prefix - self.static_url = static_url - - def getLanguages(self, domain=None, localedir=None): - if self._languages is not None: - return self._languages - self._languages = [] - domain = "boxes.py" - for localedir in ["locale", gettext._default_localedir]: - files = glob.glob(os.path.join(localedir, '*', 'LC_MESSAGES', '%s.mo' % domain)) - self._languages.extend([file.split(os.path.sep)[-3] for file in files]) - self._languages.sort() - return self._languages - - def getLanguage(self, args, accept_language): - lang = None - langs = [] - - for i, arg in enumerate(args): - if arg.startswith("language="): - lang = arg[len("language="):] - del args[i] - break - if lang: - try: - return gettext.translation('boxes.py', localedir='locale', languages=[lang]) - except OSError: - pass - try: - return gettext.translation('boxes.py', languages=[lang]) - except OSError: - pass - - # selected language not found try browser default - languages = accept_language.split(",") - for l in languages: - m = self.lang_re.match(l.strip()) - if m: - langs.append((float(m.group(4) or 1.0), m.group(1))) - - langs.sort(reverse=True) - langs = [l[1].replace("-", "_") for l in langs] - - try: - return gettext.translation('boxes.py', localedir='locale', languages=langs) - except OSError: - return gettext.translation('boxes.py', languages=langs, fallback=True) - - def arg2html(self, a, prefix, defaults={}, _=lambda s: s): - name = a.option_strings[0].replace("-", "") - if isinstance(a, argparse._HelpAction): - return "" - viewname = name - if prefix and name.startswith(prefix + '_'): - viewname = name[len(prefix) + 1:] - - default = defaults.get(name, None) - row = """%%s%s\n""" % \ - (name + "_id", name, _(viewname), name + "_description", "" if not a.help else markdown.markdown(_(a.help))) - if (isinstance(a, argparse._StoreAction) and - hasattr(a.type, "html")): - input = a.type.html(name, default or a.default, _) - elif a.type == str and "\n" in a.default: - val = (default or a.default).split("\n") - input = """""" % \ - (name, name, name + "_id", name + "_description", max(len(l) for l in val) + 10, len(val) + 1, default or a.default) - elif a.choices: - options = "\n".join( - """""" % - (e, ' selected="selected"' if (e == (default or a.default)) or (str(e) == str(default or a.default)) else "", - _(e)) for e in a.choices) - input = """\n""".format(name, name, name + "_id", name + "_description", options) - else: - input = """""" % \ - (name, name, name + "_id", name + "_description", default or a.default) - - return row % input - - def args2html_cached(self, name, box, lang, action="", defaults={}): - if defaults == {}: - key = (name, lang.info().get('language', None), action) - if key not in self._cache: - self._cache[key] = list(self.args2html(name, box, lang, action, defaults)) - return self._cache[key] - - return self.args2html(name, box, lang, action, defaults) - - def args2html(self, name, box, lang, action="", defaults={}): - _ = lang.gettext - lang_name = lang.info().get('language', None) - - langparam = "" - if lang_name: - langparam = "?language=" + lang_name - - result = [f"""{self.genHTMLStart(lang)} - - {_("%s - Boxes") % _(name)} - {self.genHTMLMeta()} - {self.genHTMLMetaLanguageLink()} - {self.genHTMLCSS()} - {self.genHTMLJS()} - - - -

- -
-self-Logo -
-
-
-
-

{_(name)}

-

{_(box.__doc__) if box.__doc__ else ""}

-
- """] - groupid = 0 - for group in box.argparser._action_groups[3:] + box.argparser._action_groups[:3]: - if not group._group_actions: - continue - if len(group._group_actions) == 1 and isinstance(group._group_actions[0], argparse._HelpAction): - continue - prefix = getattr(group, "prefix", None) - result.append(f'''

{_(group.title)}

\n\n''') - - for a in group._group_actions: - if a.dest in ("input", "output"): - continue - result.append(self.arg2html(a, prefix, defaults, _)) - result.append("") - groupid += 1 - - result.append(f""" - - -

- - - - -

-
-
- -
-
-
-""") - no_img_msg = _('There is no image yet. Please donate an image of your project on GitHub!') - - if box.description: - result.append( - markdown.markdown(_(box.description), extensions=["extra"]) - .replace('src="static/', f'src="{self.static_url}/')) - - result.append(f'''
-Picture of box. -
-
-
-{self.genPagePartFooter(lang)} - - - ''') - return (s.encode("utf-8") for s in result) - - def genPageMenu(self, lang): - _ = lang.gettext - lang_name = lang.info().get('language', None) - - langparam = "" - if lang_name: - langparam = "?language=" + lang_name - - result = [f"""{self.genHTMLStart(lang)} - - {_("Boxes.py")} - {self.genHTMLMeta()} - {self.genHTMLMetaLanguageLink()} - {self.genHTMLCSS()} - {self.genHTMLJS()} - - -
-
-{self.genPagePartHeader(lang)} - -
-{_("Gallery")} -{_("Menu")} -
-
- - -
-
-
-
-
-{self.genPagePartFooter(lang)} - - -""") - return (s.encode("utf-8") for s in result) - - def genHTMLStart(self, lang) -> str: - lang_attr = lang.info().get("language", "") - - if lang_attr != "": - return f"""""" - - return "" - - def genHTMLMeta(self) -> str: - return f''' - - - - - - ''' - - def genHTMLMetaLanguageLink(self) -> str: - """Generates meta language list for search engines.""" - languages = self.getLanguages() - - s = "" - for language in languages: - s += f'\n' - return s - - def genHTMLCSS(self) -> str: - return f'' - - def genHTMLJS(self) -> str: - return f'' - - def genHTMLLanguageSelection(self, lang) -> str: - """Generates a dropdown selection for the language change.""" - current_language = lang.info().get('language', '') - languages = self.getLanguages() - - if len(languages) < 2: - return "" - - html_option = "" - for language in languages: - html_option += f"\n" - - return """ -
- -
- """ - - def genPagePartHeader(self, lang) -> str: - _ = lang.gettext - lang_name = lang.info().get('language', None) - - langparam = "" - if lang_name: - langparam = "?language=" + lang_name - - return f""" -

{_("Boxes.py")}

-

{_("Create boxes and more with a laser cutter!")}

-

-{_(''' - Boxes.py is an Open Source box generator written in Python. It features both finished parametrized generators as well as a Python API for writing your own. It features finger and (flat) dovetail joints, flex cuts, holes and slots for screws, hinges, gears, pulleys and much more.''')} -

- - -
-self-Logo -
- -
- -
- -""" - - def genPagePartFooter(self, lang) -> str: - _ = lang.gettext - - return """ - -""" - - def genPageError(self, name, e, lang) -> list[bytes]: - """Generates a error page.""" - _ = lang.gettext - - h = f"""{self.genHTMLStart(lang)} - - {_("Error generating %s") % _(name)} - {self.genHTMLMeta()} - - - -

{_("An error occurred!")}

-""" - for s in str(e).split("\n"): - h += f"

{html.escape(s)}

\n" - h += "" - return [h.encode("utf-8")] - - def serveStatic(self, environ, start_response): - filename = environ["PATH_INFO"][len("/static/"):] - path = os.path.join(self.staticdir, filename) - if (not re.match(r"[a-zA-Z0-9_/-]+\.[a-zA-Z0-9]+", filename) or - not os.path.exists(path)): - if re.match(r"samples/.*-thumb.jpg", filename): - path = os.path.join(self.staticdir, "nothing.png") - else: - start_response("404 Not Found", [('Content-type', 'text/plain')]) - return [b"Not found"] - - type_, encoding = mimetypes.guess_type(filename) - if encoding is None: - encoding = "utf-8" - - # Images do not have charset. Just bytes. Except text based svg. - # Todo: fallback if type_ is None? - if type_ is not None and "image" in type_ and type_ != "image/svg+xml": - start_response("200 OK", [('Content-type', "%s" % type_)]) - else: - start_response("200 OK", [('Content-type', f"{type_}; charset={encoding}")]) - - f = open(path, 'rb') - return environ['wsgi.file_wrapper'](f, 512 * 1024) - - def getURL(self, environ) -> str: - url = environ['wsgi.url_scheme'] + '://' - - if environ.get('HTTP_HOST'): - url += environ['HTTP_HOST'] - else: - url += environ['SERVER_NAME'] - - if environ['wsgi.url_scheme'] == 'https': - if environ['SERVER_PORT'] != '443': - url += ':' + environ['SERVER_PORT'] - else: - if environ['SERVER_PORT'] != '80': - url += ':' + environ['SERVER_PORT'] - url += quote(self.url_prefix) - url += quote(environ.get('SCRIPT_NAME', '')) - url += quote(environ.get('PATH_INFO', '')) - if environ.get('QUERY_STRING'): - url += '?' + environ['QUERY_STRING'] - - return url - - def serveGallery(self, environ, start_response, lang): - _ = lang.gettext - lang_name = lang.info().get('language', None) - - start_response("200 OK", [('Content-type', "text/html; charset=utf-8")]) - - if ("Gallery", lang_name) in self._cache: - return self._cache[("Gallery", lang_name)] - - langparam = "" - if lang_name: - langparam = "?language=" + lang_name - - result = [f""" -{self.genHTMLStart(lang)} - - {_("Gallery")} - {_("Boxes.py")} - {self.genHTMLMeta()} - {self.genHTMLMetaLanguageLink()} - {self.genHTMLCSS()} - {self.genHTMLJS()} - - -
-
-{self.genPagePartHeader(lang)} -
-{_("Gallery")} -{_("Menu")} -
-"""] - for nr, group in enumerate(self.groups): - result.append(f"

{_(group.title)}

\n") - for box in group.generators: - name = box.__name__ - fn = f"samples/{name}-thumb.jpg" - thumbnail = f"{self.static_url}/{fn}" - static_filename = os.path.join(self.staticdir, fn) - alt = f"{_(name)}" - href = f"{name}{langparam}" - if not os.path.exists(static_filename): - result.append(f""" {_(name)}

{_(box.__doc__)}
\n""") - else: - result.append(f""" {alt}\n""") - - result.append(f""" -
-

-{self.genPagePartFooter(lang)} - - -""" - ) - self._cache[("Gallery", lang_name)] = [s.encode("utf-8") for s in result] - return self._cache[("Gallery", lang_name)] - - def serve(self, environ, start_response): - # serve favicon from static for generated SVGs - if environ["PATH_INFO"] == "favicon.ico": - environ["PATH_INFO"] = "/static/favicon.ico" - if environ["PATH_INFO"].startswith("/static/"): - return self.serveStatic(environ, start_response) - - status = '200 OK' - headers = [('Content-type', 'text/html; charset=utf-8'), ('X-XSS-Protection', '1; mode=block'), ('X-Content-Type-Options', 'nosniff'), ('x-frame-options', 'SAMEORIGIN'), ('Referrer-Policy', 'no-referrer')] - - name = environ["PATH_INFO"][1:] - args = [unquote_plus(arg) for arg in environ.get('QUERY_STRING', '').split("&")] - render = "0" - for arg in args: - if arg.startswith("render="): - render = arg[len("render="):] - - lang = self.getLanguage(args, environ.get("HTTP_ACCEPT_LANGUAGE", "")) - _ = lang.gettext - - if not name or name == "Gallery": - return self.serveGallery(environ, start_response, lang) - - box_cls = self.boxes.get(name, None) - if not box_cls: - start_response(status, headers) - - lang_name = lang.info().get('language', None) - if lang_name not in self._cache: - self._cache[lang_name] = list(self.genPageMenu(lang)) - return self._cache[lang_name] - - box = box_cls() - - box.translations = lang - - if render == "0": - defaults = {} - for a in args: - kv = a.split('=') - if len(kv) == 2: - k, v = kv - defaults[k] = html.escape(v, True) - start_response(status, headers) - return self.args2html_cached(name, box, lang, "./" + name, defaults=defaults) - - args = ["--" + arg for arg in args if not arg.startswith("render=")] - try: - box.parseArgs(args) - except ArgumentParserError as e: - start_response(status, headers) - return self.genPageError(name, e, lang) - - try: - box.metadata["url"] = self.getURL(environ) - box.metadata["url_short"] = filter_url(box.metadata["url"], - box.non_default_args) - box.open() - box.render() - data = box.close() - except Exception as e: - if not isinstance(e, ValueError): - print("Exception during rendering:") - traceback.print_exc() - start_response("500 Internal Server Error", headers) - return self.genPageError(name, e, lang) - - http_headers = box.formats.http_headers.get(box.format, [('Content-type', 'application/unknown; charset=utf-8')])[:] - # Prevent crawlers. - http_headers.append(('X-Robots-Tag', 'noindex,nofollow')) - - if render == "3": - http_headers = [('Content-type', 'image/png')] - http_headers.append(('X-Robots-Tag', 'noindex,nofollow')) - qr_format = "png" - fn = box.__class__.__name__ - start_response(status, http_headers) - qrcode = get_qrcode(box.metadata["url_short"], qr_format) - return (qrcode,) - - if box.format != "svg" or render == "2": - extension = box.format - if extension == "svg_Ponoko": - extension = "svg" - http_headers.append(('Content-Disposition', f'attachment; filename="{box.__class__.__name__}.{extension}"')) - start_response(status, http_headers) - return environ['wsgi.file_wrapper'](data, 512 * 1024) - - -def get_qrcode(url, format): - if url is None: - url = "no url" - img = qrcode.make(url) - image_bytes = io.BytesIO() - img.save(image_bytes, format=format) - return image_bytes.getvalue() - - -def main() -> None: - parser = argparse.ArgumentParser() - - parser.add_argument("--host", default="") - parser.add_argument("--port", type=int, default=8000) - parser.add_argument("--url_prefix", default="", - help="URL path to Boxes.py instance") - parser.add_argument("--static_url", default="static", - help="URL of static content") - args = parser.parse_args() - - boxserver = BServer(url_prefix=args.url_prefix, static_url=args.static_url) - - fc = FileChecker() - fc.start() - - httpd = make_server(args.host, args.port, boxserver.serve) - print(f"BoxesServer serving on {args.host}:{args.port}...") - try: - httpd.serve_forever() - except KeyboardInterrupt: - fc.stop() - httpd.server_close() - print("BoxesServer stops.") - - -if __name__ == "__main__": - main() -else: - boxserver = BServer(url_prefix='/boxes.py', static_url="https://florianfesti.github.io/boxes/static") - application = boxserver.serve diff --git a/extensions/fablabchemnitz/boxes.py/boxes/scripts/gen_thumbnails.sh b/extensions/fablabchemnitz/boxes.py/boxes/scripts/gen_thumbnails.sh deleted file mode 100755 index 15d12a4..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/scripts/gen_thumbnails.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -set -e - -STATIC_DIR=../static/samples/ -THUMB_WIDTH=200 -THUMB_HEIGHT=10000 # height: auto; - -thumbnail() { - echo "convert \"$1\" -thumbnail ${THUMB_WIDTH}x${THUMB_HEIGHT} \"${1%.*}-thumb.jpg\"" - convert "$1" -thumbnail ${THUMB_WIDTH}x${THUMB_HEIGHT} "${1%.*}-thumb.jpg" -} - -[ ! -f "$STATIC_DIR"samples.sha256 ] && touch "$STATIC_DIR"samples.sha256 - -find "$STATIC_DIR" -name '*.jpg' ! -name '*-thumb.jpg' -type f | while read -r f -do - f_=$(echo "$f" | sed -E -e 's@([.])@\\\1@g') - checksum=$(grep "$f_" "$STATIC_DIR"samples.sha256 || /bin/true) - if [ -n "$checksum" ] - then - echo "$checksum" | sha256sum -c --status || { - echo "File $f changed" - sed -i "/$f_/ c\\ -$(sha256sum "$f") -" "$STATIC_DIR"samples.sha256 - thumbnail "$f" - } - else - echo "New file $f" - sha256sum "$f" >> "$STATIC_DIR"samples.sha256 - thumbnail "$f" - fi -done diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/boxes-logo.svg b/extensions/fablabchemnitz/boxes.py/boxes/static/boxes-logo.svg deleted file mode 100644 index dd5dd8a..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/static/boxes-logo.svg +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/favicon.ico b/extensions/fablabchemnitz/boxes.py/boxes/static/favicon.ico deleted file mode 100644 index 2e76dba53a0bdc7074547b553967a40e21a1cb68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/fonts.css b/extensions/fablabchemnitz/boxes.py/boxes/static/fonts.css deleted file mode 100644 index 7747f4c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/static/fonts.css +++ /dev/null @@ -1,41 +0,0 @@ -/*https://github.com/fontsource/fontsource/tree/main/fonts/google/bungee-shade#readme*/ -/*Font version (provided by source): v11.*/ -/* bungee-shade-vietnamese-400-normal*/ -@font-face { - font-family: 'Bungee Shade'; - font-style: normal; - font-display: swap; - font-weight: 400; - src: url('./fonts/bungeeshade/bungee-shade-vietnamese-400-normal.woff2') format('woff2'); - unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB; -} -/* bungee-shade-latin-ext-400-normal*/ -@font-face { - font-family: 'Bungee Shade'; - font-style: normal; - font-display: swap; - font-weight: 400; - src: url('./fonts/bungeeshade/bungee-shade-latin-ext-400-normal.woff2') format('woff2'); - unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF; -} -/* bungee-shade-latin-400-normal*/ -@font-face { - font-family: 'Bungee Shade'; - font-style: normal; - font-display: swap; - font-weight: 400; - src: url('./fonts/bungeeshade/bungee-shade-latin-400-normal.woff2') format('woff2'); - unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD; -} - -/*https://github.com/fontsource/fontsource/tree/main/fonts/google/luckiest-guy*/ -/*Font version (provided by source): v18*/ -/* luckiest-guy-latin-400-normal*/ -@font-face { - font-family: 'Luckiest Guy'; - font-style: normal; - font-display: swap; - font-weight: 400; - src: url('./fonts/luckiestguy/luckiest-guy-latin-400-normal.woff2') format('woff2'); - unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD; -} diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/fonts/bungeeshade/bungee-shade-latin-400-normal.woff2 b/extensions/fablabchemnitz/boxes.py/boxes/static/fonts/bungeeshade/bungee-shade-latin-400-normal.woff2 deleted file mode 100644 index 72bd6c67ae1335710c5f6097be6220a93891aaf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43456 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 UeSCwxa9IHlwe&U1G^~RD2cOnKUH||9 diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/normalize.css b/extensions/fablabchemnitz/boxes.py/boxes/static/normalize.css deleted file mode 100644 index ad3b58c..0000000 --- a/extensions/fablabchemnitz/boxes.py/boxes/static/normalize.css +++ /dev/null @@ -1,298 +0,0 @@ -/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */ - -/* -Document -======== -*/ - -/** -Use a better box model (opinionated). -*/ - -*, -::before, -::after { - box-sizing: border-box; -} - -/** -Use a more readable tab size (opinionated). -*/ - -html { - -moz-tab-size: 4; - tab-size: 4; -} - -/** -1. Correct the line height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -*/ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* -Sections -======== -*/ - -/** -Remove the margin in all browsers. -*/ - -body { - margin: 0; -} - -/** -Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) -*/ - -body { - font-family: - system-ui, - -apple-system, /* Firefox supports this but not yet `system-ui` */ - 'Segoe UI', - Roboto, - Helvetica, - Arial, - sans-serif, - 'Apple Color Emoji', - 'Segoe UI Emoji'; -} - -/* -Grouping content -================ -*/ - -/** -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -*/ - -hr { - height: 0; /* 1 */ - color: inherit; /* 2 */ -} - -/* -Text-level semantics -==================== -*/ - -/** -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr[title] { - text-decoration: underline dotted; -} - -/** -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/** -1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) -2. Correct the odd 'em' font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: - ui-monospace, - SFMono-Regular, - Consolas, - 'Liberation Mono', - Menlo, - monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/** -Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -Tabular data -============ -*/ - -/** -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -*/ - -table { - text-indent: 0; /* 1 */ - border-color: inherit; /* 2 */ -} - -/* -Forms -===== -*/ - -/** -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** -Remove the inheritance of text transform in Edge and Firefox. -1. Remove the inheritance of text transform in Firefox. -*/ - -button, -select { /* 1 */ - text-transform: none; -} - -/** -Correct the inability to style clickable types in iOS and Safari. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; -} - -/** -Remove the inner border and padding in Firefox. -*/ - -::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** -Restore the focus styles unset by the previous rule. -*/ - -:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** -Remove the additional ':invalid' styles in Firefox. -See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737 -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/** -Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers. -*/ - -legend { - padding: 0; -} - -/** -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/** -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/** -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to 'inherit' in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* -Interactive -=========== -*/ - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/nothing.png b/extensions/fablabchemnitz/boxes.py/boxes/static/nothing.png deleted file mode 100644 index 56cd9eb9309219771ca16fd3fbbd300365ccc04f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl&H|6fVg?3oVGw3ym^DWND9G*U h;uyklJvo7aiGhKYf$@ujJfgQu&X%Q~loCICU@4)_27 diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/samples/ABox-thumb.jpg b/extensions/fablabchemnitz/boxes.py/boxes/static/samples/ABox-thumb.jpg deleted file mode 100644 index 00055085668705b7776cddac574cf24829b619a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4233 zcmb7FcTm$^v;HL^BnAjcq!?--QRyOtUQB>M2%-i7X$k=q=~YApgn(3$B1pRwF`~3k zM8Np^qI49HB1j1;MHEnJf`|w=&NuhY+&}N0nVmCdpM9R)opa{wjqQB|P&9K(a{vSa z01$5hdy{}EfPlf^Fn$Ca4i`Wm1ds<%NFgDlw5S;R0ABVWL0(o~?vS$1kwc0^MLBtO z@=>Cmfw8giK{Yc=Q$wnbk+H#F5)eW_04ao&LZPG#6yy~Q{@=Fu0zkuoZlD_iLIYql z2!aOfwF8m>0EU46mixa30z>%tp)g+12nB%n04Nv?gYrY6e*qvK8qEjA$Q|XUlNqr6 z@ph}`R+ZY=t6_Zb=;;EvzR0S53 zfJ=hw*bE=0N<@=vU{r)P_zro9gUA|CBqB)ZA~814;Bkm_B~m#>>6F<`lT-3&IvIoV zw@Z&1;vu8iu`DnMh^8n*+T}{$4(>A6$@^7I^CZ_zsRp9)0h*o1xFTFFn&CMKPq8k; z0Q^ff)H>g(0*y!<;)}6Kwk^$o%O@tmS+RafJ<%~0h|?a-H`~MduU4BA1GjvM8SQHW zEqo;l&=%uKHA zmq6vRlH-AhI|5w)>+I?aH zx9Qqn48Ef(E?d{@UTZUbK_!IBCeNw<9I{$_Jdqq0gJBZBR$UNVW4^3UmHx{7DmStZ z#z{55WpH*M(N~5ZHsI6)HB``SRIGiok?S~@)Yfskv{KuM`>ckOrZO~s_&_7lS^e?) zCr2NheP=H^E}T&<%FCT*wLaUP{MNMLly@{DOrP7L|60?2@x|=D{5{~+yMVP%KE93~ zUI;nfm6A6RswlOM87g7P>MT0E)=!a$kaC*l!De#;%%#;${B|ksO(GW^Lv?2$9mdad zVw(ThI13yM8jp9_k$S+!H{+R{zVn}ZukK)km9!9>WN}dsLaPpqa`(Q4S!xV9R4@cD z8Jw>@D3#s)OYyU#Tsno`dm-c~rzOzCy zuF3~y-K|t`L7XKuZq>%c6eJ-j6CB!-a{6ZG$R6N!OTD?kAWHGc22GGadFy0M^RMbu zy(26Y;A6!)`_jz{R)8JU_1#-5AH0`b%n9Gsx2{C&!$noHjdU+ujSRi%GWb9w!&xkk zhyeky@k0d^_ajz53+uwM*jGbzZBE73;-2Gvs>@H|&w8EBAnQ zMnwK{$K};OA!~}Q>FVk+Zz}mz-cNLu4XDOl@lM6_59@|0+8j>a16Z?vEXB$s{YsgM z@l~cDu0xuh+goP`JYV>bFVN%Vb_{i&N-UJH_{ovq>Z)hv5U=%V^>-8IV{veU8p_k_ zZfP1F3lc?}U6t*ldqA#pN0*VowsVMCoQWL8*U1zFA+_RDm*@^(^_H>QqOXmocFyXB z{CsIND(yaARrj!uRwXQ|S=mmIDz-B`c`IHw-(_n91{k(3%m%Lo$72rbz#!*_-f3l# zZ8o_JY_zZVM3%R59QXU-Sm#o;!UiW{SQ?X3uF)VlCWoCyp3lq)>5Dve&`~(>?c(FwEMcBq@@LiB}3Pq z|FnBDup@3MrSXjY#2%4lOSSd3!${#!)WF0!&UnJ;G+__0O8EHnm-Ig;tRhXj+5UqO z)gm9RWjpKxjY22xXZ0>`w)eB8U<0ZVo`2*&?<0qV18EhhY8U(X!ZC4Y_LH*P!wXmv z4?OFST${o@(*1Hdwh6{T>2W+C*BX|}DZ_6GOMvJ;)q@(pqr3%jUyRBc4Jbrygu%_j zZ+Gp^Fm;=It3tyl>$HAM*QCBDT-``3hw-BNK-jJrr@!d>T z%}rgzpX~hwP7RKSyCR1+n|Gb$y>OgOgGgKN!zJS074>8?i|HP?3dzRxL0q;vRxFZP zC+rtPEc(#m`dsa?Y)YEYhTp$k7euuslXuX3e%vg)p>NGUI`yZ>Z|)v{Efk*!UU=Z6 zBi;k@!8QhSA~&@YXMJEo0Ce!PMq-RDL6SG`XwpE)l>3xpgxYT24f(p_6Gg^c=U)%{ zxW|tmeK^@3xH;{envbzri}1pfem)KA$4=Sv!UDjqRrr*-MghlB44ZqYV82kU&WX>L zCGMOy6>hk|);dvBk+MIe0b`*1ZJa;h!#LLhClg^SVzL-_EY>-SHl$RoJEeUodb#vb z#J~8C*md}k@Wywy7nRfvwk%|<=;E5=@H)%QqUl!rjpLv0?;pipFKkZTUTS0bIMfw8 zN8Y=9wYwyVlJ?yFWsDU)#d&`Tt6Px6h-%t5?g*g-eaNj z*5YgU9?+0cbuv`96cBJ&>vuU@{^IyoTbZXXh_BS1*6=+x*9j^+bUi@4Zth0ZCkZ`l zc&goO%kT!71&qbdC&#LYaa9e1hgmxamR@;%Lh23z7eWq+Q2Yd~_az(JD5+jdJP%23 zpcb6{oqm;)sMYv${}g)gnvqAHv|UR2pI#zP=pV~H;N~!VcCJPCl+Rsm<|ptedC^!W zeiRWbtXwWxd9dJB+K8udL0c1eZCuh%TQw;Ai`~(GBpX+4Z*95GdG7(VzB5Ng{G*gb z#Uu_Sg^HcnaElIDb#A-uvOYB<7kzW=xJXbp5bh_T!#Ow6l{g~l9pd7+BVsqyaE^^o z8knNrz1=~+i*xB>`u8cB1&NG4i?Uu_F}a6tD*|Ti`|YyV_We-0#J!S9P5*{xKwQxHDmgovVA*;0mt#=^-IpSP6n$PM2#1LEy^m zX5);A0I_!nTv;RSSG*4Nx40w`qx&V( z=MT+&pNc%n6eS?i5$V8#pn0!?j;Yf(3%=1c$Za*2-`PoFL+`JwT=p+zr+Y)*oVOd4 zWPBI7ui~dda8)~&Tq^8e3VHhY+@%BpgGCG{meiYbNrjs%*QCZq_Ln$?hTp9!r<1bU zMA8gSDPq}gN(m8q1c@HC%=eb-%4KSL2EK;(zBw~k@&qu5*9q-7}2@(XCeAYS`SS*Ot}pdzGM7Ffsd5$+1KEu_xY z#6CVFqG9Z(ylvsPyZLi`82nbyDg{_?nu4MgDlMLO*PW0X%(-+uT6}g2^Nd>t?lts- z#NQkim#Qpj^Y&9Um&x+4tx%!w<9|TXCi9x$6Q#b`Ot({>KTFTjROpjU@$ts~G>UPl z&ktMu)ZB$tV_aq;UuTEizM{j3)sLvrckqyK2_K_7<-`Yg%Z2A3>Yf@qALJ#2Pq9tK z+2;gYc(O*fr~2=M5mn@iq$g2VE4Ch)$@!$rrOq;DDx_w^kjo}_CRt798}%^!;!%&6 zkRx7kJ)z2(%;viE9=v#@?bo@!-?*weuG8D{F#yu_d{pKQ|ijk9y;HKTtKPA8^z+nY5~!o50ic}|fjTJ!mqVO^T5 zTMsiNLpAM)w`q@$uYIX~el&kRTu#uzQep@=a%WuDj_}}>&xu&2AKu-HTenDz>UNVi zz17zyCuP<`7d86tzT!P>6|<;b0m|am|C%Uf=4R!6vFt&%XT(;=H}Hr2QeK{;RgJ zSJ4FzR>p7sTE`k@j_baslM}Henl8g)p2bKxM#ToZro<_;?ykePkqhr{2L`GOo{(Du z{hQdCv0b_J$MeJ1g1R2Rb54Vx8dCdAs^hO}OT6~P4>LEYBUL+HJtmeaU7||H(CJF@ zziqWlNjMaoPsF`;aAswhN%sveP0@|8s#yuXu%;=5)9wi~>hL|Ia;U!UgG$rwvHD7X zEBF`~xuh31dMpEGJ+C)P_*am)d;uUf1>}u;2h8fYo;`Q+%OrL`yy()(x1jnX&MlNk zzi-7?^+R)ySo|`UAglC7DUoO8Cg;S;j;0i{Q-q@17}!!cK2eyT2(8w9vJIBEjV4ut zE};~7g_4}0m*i=&v=T%-N-VkoF~DJFIDrS0Nlvg!q9v-}C)%Qq zw4l5(Pz6Xyw!CBb-%m{WZvg`TCRKwQ zpggX>j`WwDqD)5&QcB(me?~1CHDX6#hN)FR-&rSx`2&<3YLvglp+WLg7hMw zK|lkdf>>8TdM}pMwb0dF1>MzkcfT{Z&-=dreure3%-nnK@05FPo%wh4-(L~keluq? zqEHZ`z#sbe3EG5Y7A>MJS|~%K(PU+0WaXC8<(4dwQ&m!yU$%C&I#X@6+8PZVGXo7R z6RkCB-?I!&%q^|0t=08yIh!`J&8(~~NhTB-Sy{Oyaw>GXilwHSrse-{`u9GPr(svH zD+?&{h$>H6AW!-C0a5{w3n(O^{}F|{0Fzp{hz56;&ENUIw;&05_ut28@d65>(ihO- z%HIx!cM%)O2-PB8;in>^vavL2M8`ByJcf`ATszZShSbUgwtC5Qn=H6awWF)+X4<6N zLjJ@bgAffN0`Vz`pH^mn@g&00foX*5ZKc>WS53&yhA)(i@yUN=QmV8&!f8^jC5R@? zlCcrcs1GEzS~&30q+N7DYX~}EmPuyZm8T;*<;g{+fMrV8xQiIt((@et-vgw?q~JiI z*wcfk#T04+27IUp#U~&|2BHvjgeS{0x@ZaUYh17c(`=NBBc#Fq#)Cma3<4o(oB=F= z;2em>l%g}(RAgU5p}N$Pch=a_7&dn)pbu{$($=M_3)u0v?ZIiJEREc4lWh1@f1()U z6Br-;k3cCvlzIL%T!=tdSgED}E>kGPaZM@$X86f0eta^L*E~)y_`*j_QrT30S_wX{ zEsU?G2^To^S{ z4Xun;O!Yp|_?oSV-E{$#B*+Lj3B~ak1*fyg5=f$8?g_5QRgDjDAPJfmjwbD?j7ia1 zSQ^5m`06BfVhtrCsDt`YP4;;dm9Ib{5HrD*$)J@i)01AvR&{chi=Ym$rN>9?aj3_2>z9LSPX{!TP zJ`LEsBT7hTI46`QB}!v4sRWrH$o1R5c@7AZp(T;52>6I_xIp}aiTaRPS&Z;po8m zK4gO`0!QijhzdU#1k?zUIb1}Lkkk-G5koAfr-&l2%_lQcwn;IOHjsK&^nxRw6?~#b}Kz;`6mBbS{UBkX#3d1ookrKo*QIO}_~L zL1!2ryq7$q(_GlxOoq040-Y71FC<~<5C{ViDY|Z&Oiez*y%=rEwn&XH55X0^X_)7O zDX?82DFb7dkX(>7#vm|ME}&qxN|-I(v(mQSKFz&ySW8b&%x*I>)Q?+q;DY_`;9fut z7NnEFxetp0HIj0w%470Mc-0k_d*z^blhLVQ z_0EU)4Gn$HblNZPNC|Q&;dXXD?0&pCCdXz;VDHZTMaO#fbbpx)jWGC;h3J|z#D`u7 zRUIi35UZqI2_i7jM!rFTQ#lj9*b(VU7TD|8rQD1p>=uyg} z)L$wqLlh-UK$@6e`oLBT91A6%0~e;1Foe`Lq?)bv08wzVaY{$Ak49Q1j+kxm%H(yu z^bcsr(hhL1s;?B`Vi~r!bRvEcQ`i&1q}wytY_-RV%weX4BGzZAvjWs41rEOE*Amt0 zE>&b(iQm@Ec^)2)v*@u4&jvl)k*18t)CEuh5v{@AyO`o)TZ}N(>qZoeFU3L7D@kBb z#sh!KsiNAc8^D^{Px`Yje|R%wnd1rcPrDWQOeZGT6c{8dJz} z@ez~<$W{HuZdj-kFvfOx^oaM?aL%IeOPqJX=IdrMER;kASErJpZ9Y6{5;BSY0s?>A zkOut_A;J=<1e%?_)3f2ztLt5tEiYK_4pdnDo6^~B}cU)h2=(164+*sSda!=XRgI+=GaJE!3 zH9i3oLgNo*6EwRJnyw#HRLo!_Wn63%cx|uE1;do^nBab{ASbwj6WSl*yWI2n!0eN@ZC)F@LOZ8= zR6Erta&^A1y&|nEql^m)oZ)^2rwgbQ?~Ax3ENzg_g|46ynRoSY0{RWs?S#DA0jrCYrNl;PArw;;K~@C&7@Nn-=!9dk)XNMzCM5jeF4#8vz8asv;0)%N{1bEg*1o)QVxjY zLL-Q4Vi%gOH>MoU!VxQAaq&orUauWbmzjInF_N8lky#b!Rk7J4({9^(Q-``4<2mo5 zZ3gw?AzrnpSWOzj7#(7c6rT`5i+0=~q!yZf4N`uD7V7+dEfhGRxH$ zw=Z{>mv_zex>}gh({KE7(Jk>nNd0=ID~4>ZkTLJLX8cKHC-;P2jNL^PCY8X_*oHe# zy?S!5K;M0Ztpm?S(j1z6+viJuBd@}^JQxfO!5EBy)b6t&ejTEAagb0NDV|9-2#L96 z??l0`a+oLVglhHDn39nu%QZg2G+jd!-c!z-Tl}}_QKcB4nP35d*+ZmtVXFr`u(?m6 z-UR$0I>p8xE%f|qCimQ`FwcYaqu%*LbpJy;S_?)B*Sj{%HW`;-(7hB;0w{={EJfhR z4-Rz8lO-Mje&{*oR2{p2G2Go28uE~*yir0EMzUQ)Y6_vASbL3q~`is5R27cU`^?r^| zdA%G=$ik`8%!`=XJr@EA-(&UufPjrkY~GKUl}d}5k}x3$DS0s&Y0}IS#%cnMO82fX zN7u?+ubWm{-~`S^PP``}*Vr}>Xjm0SSLCzM_Ha`3h#H14J|*Y#zsTzAbL(HK!T#Rj zL(jM=GUpt|rVshvcp*;I=_v5DX+MrrDe45xelU%NG5mCU=Q|hJ^3A6mylu)P0e$L; zOun5hC7@lMDWquzdkCekIlh$0?pUK`E4fw|{mAO-7mqK8i@ZCYo~(x$h;hAi(1Axx zPy&Nxg7INknEhh^<*e2{ZDp=knHMeULiAmlBUC>A`f+07w?d0f2Tts4X`8G+ffSi( z50m&TDTk%WCK$LTqPQ8C`ifZUWjg}74Y&-Q#a*gfo95)0g||PnFWaGR!;)>t4GCMy z%_#DE`RrKI)+Y*w)6}4qr6G6LkCu^uAx%meA%ta~P3`{2xM)x3Wbk%9rRwcImzUzr zyo~krb$6%E>Kv)9oMOBmA9j6+1S}+Q)df9@1Kx-5p-W4pNI7S)`Sxk7+8MoOs=J4) zP@86-=3Sx3sNJP_F|pBBRn{%+zQm!rtMly23vx$$>O23=>>o#%Jyd0;Ebg!<227fU zN^t0;2-s>nMcucT7VT-8407Ts`_}fGX!ELNax*u?6y?wK=!ME$ZR(%MWPmmNiNy(( z0-1{^C5P%Z2Nz>h0=fxU5qLr^tc8qh2_E~B5p(c7-M z%NtkFEmu$U*w47>Q2Hp0r_tQmEu6`95%Y|>GGd$NwcZVz0x62s$@vGZ&HUUO{!TWy zIhaY~Qy&m8z7{OK_F5WrQ%u$w>UXPG{wZhmcDJK;MW}11+?lK5nj=QKkvx@Fs|Y^> z$Ji$mDe1ZfCRNjHsWd)|S}dSRSKB{h`G;R+3LlgNDd_LY88A&b80s1nxFb7xSpn<7 znM?7e7K`NstW6t+E2Z^A6)!Ds$zra|PY)N4pO)&$7)jCndt~YKL6~@u*QDDYM=0j$ zah#z!AG;;4?2R=?t!1;rcPz3Bu#K)xUO9GXAadVbv7|j9YWU-#jH=k9=G{5v!Q-Nw zE7DAli?YmSp~K*|n69fAvxbbgl`X=_Yc9@#yal-v;@E-y@V@wM%%N@G&kQXd?$olh z&q_^dkaA3+xH>JC5ow080zF>k)HjM2<<%V9>vwSLT|jSeHH~fu{Pyw)Ngt}ylTl-c>z3{hkJ(~Ac{SC$Pr7o5XQ9?VX_xOYuq<1jOLw`E z)Pj@Jyzb zJ5Y;zU+a77>^N6IjB|Wxh7BJYKXgybExzOBFipVlnug*DzFfzDdSfDle(n1DJUgyy zbeU(+istN#O|mLEE`!}y20AR|1Qpv%$Jagh^lFEG(9xx{tJ6!<#-Mi`=^nRbgBe(~)IEFUQlB(xp0-w8NuB z#tYwPMKc22d&Tik3$k?o-l;I>J^^rI2xNn zPO4mAwcT%D(e?482g=IiU1@4C#DKA^Y9pVloKkQ^H9pU~8a{TYYHV}TbicZ^>b6@2 z*WX8QDrRhCm&utK&XHT8FK+Iu&NjBbaJu+BbA?F%s)@NEaL0pI`)9hWMRH>b;!t%j zma*>sr>`T!ZW+yb3Bx1nO?KE;x96yzS<)dgG_DS4?nql45W#R*uIk#HY3L;Fw=!S% z?bfFTKe)x>RBar_T@cEcZw6t|nnp08^%tT=8}H=LPPL_86S1|*ZRK+IG8P9K@jGX) zP8%%mm5h14SN+qq%kkCJjW6m!l~Jmvk^?GEYn60_I=W2z8nraqZ&{dGS9aAalEy6E z_q2Jhs-BrU%vCXMhj$` zpxI`wBi1cXcp87@%$tk_gtuCqseTxnYoGc3!jpNr8g@>y%W{e~?f)|3Y{?}kKjKsv zF{smT0piKOT2=l#24q5~m01KL5e(#b2LC zjOx!;yqYXY@87@u$Fi`di61+|_C3AVbW64@Bsz^Zl2H|BG^2Y_*sLIP^3~w z!a+ZHwa3qWZrzvJV-`!6D4%LI+7q?i;y}mMM!Q5UkIO5$bLvBT8CQJTuQ)L+*5Z}7+nq&u@`k0d+`&W-+V{UVBeON$f=mIN^x4Rgedm;Dq zuX-2M4t7dxAC5w&Qxe?3RAe3R@s&T+|5R8J()_}qXwb%e zrZR~N2G0f^AKrc#o#FC5iy!nIFxBP0x?e{3YLsPw1cZd->7_Wf8JleE3ha7jmHGEe=f8i22@;A-LYZcok~|T^>_rqNA3;6P zMB-U6rk|y^mc7_8omXO;oBzH|bn3Kuiu<#=OTk?Rt7d=yh9}bSy z-00g}?(F`s`?`hk!DJ766{Vrzwcg!kJCrq}yng2O8TiyLxpY!kR#$e@q58aLH77Tq zKvo=c@}Z=5lpYe4lbQ2udaRRUtbgdQvDSu$Vc*;y7-!6wR?*^gx|D> zm<+y5;dj<|C_R@Qhr;!2)s>xC65iSjN_cm}wA=}!sLz+y4i&s498D8L8=yq?g}C?(R06Udpfm_} z?+piLZy!CZF?)@f7Sf=)Fvn-W@m01?&ak(O;C0T}Y;J4zfQolP>@D-Dk-UhoG;XK( zs^8<4${Spqd=jR+9v5G2vglUoWB4?d4t0j}yfUL#EXY@`>RSArjj2z2izipf)Kq;} z$iiOzUAo)Vcm-1J%`^WCmbS3nM*s4bwCka@baczUCs4Fqt|H21@K~S5H zM1P&h_N)3$TO780(12rZ(r;dSQHwid$1(K&e5uIn$nV+LB1-ojO1h_|YTD`@Tp!-h zc6iVJ3#Pl34Ge<(YS*XQkJnYEM|A`wC&j2J%jVgoS~Nv)MdoKWulGKeQ=Vv?ntQ{$ z!nBHJw(VyPrG73WGEhF`Kw#+ECWSvi}t>HVU&C>9n`} zi#Cisxn$YdU6zn^B4+Re`*o7tjH=dh7oq(sjk?z}Mf!W)eBI*gX0UF*OB=sTC+Aiz zUzxdq9=+l+i`@_v*!J`-Rrgxba7@#WUKLtT>r`U;l&g}KsrC&w(zOO5fWNDlVcC*}|f23<-FyoI0bJzJ)#D|W*l!Qtd@ki2RUjx~*(SpvrudlLq z*EK3)3rwfhGc(re>iK;1?i8FF`!0KULw$ZleX96&odTn;Jl}L=Y0B;gLI;(w^(ng> z48^WP_X|wZ*;5Ak>-}$4Xzc0=4VW=lQn25<^WlW$+Is&nr={lWD^;aRwJ(^Ls5^`O zU(`t#Ub>{D8y4bWTz4kp@z&8lI&N}Zp}T=0DT0n0ko92R*J=@375#i7|L}H8fy^Mo z|JD|Q*`kw`8s1@_sU5y{+^leALT=}~yvfu!;aZ39tNo+(WOC0fSJus|mOD2pPVe!o zb!=}9_#iSf($4YxFdfzM$@8L1i+-H;hLkfIWev=`IX;>WZwc-iVV1g# z`)(}_{8-o&ryo)ZF;}e^AwI6^fs@@?P@OA*RLr0M9QE7J1uWNksWaJuWelFbe$;TB zi`Yd#`#sI@ zFjoV29e3kIE2)eWGfkh~8zNnCy6c0ys=^3!uMtyqhrAlCT$lKDqfd`zkBF+eV01#I z6@z;b7Ly1Q5P*o8i72gRzkfaadB7t9ch7lJwTH8Ay`qVEc%w^a|N1lE zlUEbC;^TRlN%Nq`brznEiHr2S)h$F9+_@8}xeq1=PsaB)IX2Zlb7|J{Fi@4>#vQgx zOl{cfqtzP}wx^D&TVi8>q9o|o&;{Z!4zDE2$VRcKc&6x==&{3OPZ3X|!*F*&4gWti zaX?LVKgs`mC(9ILu#|GABg5n(wYlRL2dFLauN0E34*xU2ess8btUcuCtYk&T|&e5J!lr{x`A!0^M_IyB73~2(5=l)q^)pTY~ zfOLFXIhE6k*KRDWtMm*~l@FWPFm~d_&ELnSavaZ3#U6Z{+mN_$b6fWw-w0KujA z7sE$C{j~4KJLq3flweK}teE;3=6Cs^FeG%L2)~Bv-_P@0)>H;gLXZetQ z&Qj)xuKhWKiDPH2<8lpjR(t(CFnHeN!%Ux1YHhN5X?S`2a#i_5NfPlU?b(k78jb$p zK@rN87c?zc$ElT(#&O|}$;;YI%tYaga%p^}?y92?AA9K%_}Esn3;Mp~luk-vvSPd~ ztY_IkTtI4;VgEIb&;n6%zn--&GVQsR>|I5xa!OGb4+aE^yxmpC%M;sAUN-#v{Ctn7 zj#mIZi}N+%6R@cxE2 z@0AXL0j;`z4ML~D@{o&}+Om2bC%T=a@f*yN&cf}^u`@rEIsQ`=GEAWt)76Tpq_*&P z=)XWJEsZa~+`)U^&U<@l8(XZD?{}GTYoW#l-r$r?dbwk$sC=pH4`y?pr$SDz{bBph z10$v>(XCQBxdlm>-Aw+pvG%SN%`?Vs&ZWQk1f7agN;^4aEbS)B`z+?P4n_62KWEgXXaM?(lMnwULuuX z{vGkKDlE)f$uY}mL)DDv)a&L{`<5=6=E2rA;+)Rtl^F_qTCsxlAJm`%X^T0u4PAD`YF_N#B=J$e`xQ&X{yvq{wW@+58a zv6^vz;1cthQq5>WWoU=F*HG}`^J!13_g&al)tKemZ98=6b^A@ZEQxI=BmAOJCaaFx zXPTqI`MD`Jx98^S>ocp$JCDOo46;7bVFe39t3TiZk||tdU9`5R-qSwaYbidwtz^+E zu4@%1y&-eYk=u3S(G#zqPTsDui0RlBU}ULRmLIdJK3Y4>d*k2EpZ814_N{1srDw3p z%yCY+`|ma8ALarCu$GK|;?sEbZi{b@Pj%`I{52(x!_HgZ}>R$g!IhrsRND8`s9P5uzX9L-Rwy;R>Qmbo{Pz zRK9?tWFt5!N{v@Jz1(|q^OA%P`_CyoYkexhKR@djTE5-rK+S~};rm98aBE*4Xq9pi zUf`4*xt5%1IQZUTc5eSbrMqio#L|s9B@*oSlSN5a@-{7#~m}q{8^;r`D#>19(Y+ zc3DeHb9T>$c8|atcc+pbY(HN0XJbpoj;^KGwpv_T6@T5_bwcJ3b-5wv;3?!v@ON4( z6;zcvckMK5in}r5`q=Q&3em>76M-HL9qXK$q?HfU2uItMq}P3KmYV1PA|rgX@yr7` zOMO2BH~k9E#Ef-(&&=VmsTm^<6V`93;9FEpGDc7djE_iCiTe7T{^+Z+G?$tzZC8tw z>Du?JVspZ05-jkb*z^xa4QoGjS<-joz*Gv{cp!yI;x6Dd=6#Y)B9P{7dLy z*OX`|-!59o(0Og~Xulux&GnRXHR5WA{JV{;v_;+-e95q{zu46oo6-%dQ{LFo(>&Gl zW)F;l4ofrBxUiLlkCR&~<~2slgF=hcz8b8`KlJuTcP)3inW>TArnHu_nMAXMllu(h z>OS0x?XTNvdF1czqercen)>CA>$~5bT(64-L7&1r}kj^3@@+G z6X#E@$ZeIHn9INU#p`LyB`IxZ-o++AJ-^uJe*01z``7FG?^cQ9RV=kG`{jIY@l?Xa z3{hwJhd;I`-AX*J-sN!FoT^+^oDTw!kE)VxK^Hpm}Z}ZNt?{(y=YAoX1z0y-8o_5-`+(Ry-$2p-q z*sHZ%C1#Mv2oDQu$dvCa2pSHxPh}(yH`?Yb&s*jdyN45yHT&1A)VjayS_dM`GAT>} zhgyLX3J$otm$yZr@SJ+4nC-jf)k)N zmjzW2?5S`Hv{?PKv+t3O0L;j^OlOm8-^69D_yc#FqFc2BIbp|kK99Eu@P5tva@*=l zNO`sFg6@WQer~r-L=TpE$kKN!TgU}&%9R*GBmJ=3V&+UnV1fBo$1#iZqRy(J1KH*K z7e+;mY-`ZLC(H+mpY1r8RUMdPqVZ(&1*yW#l6OA;T)*v?B7)6KI71p*O4#`@16>P@ zPXa>=mLJ=hy>)@A18RjuyTG!HcF}38J-b$H{v7DRsQTK`*IMNB(Qo~+J7>>VgjZCU z_8CwQY}b0OEE;UjQc7Ip$f;5A+LaQLU;limPg21a!~DpoN9mJWOru-ZS7`LViP0w} zGGv}M)ZXJ^4|*T_I(9}J8go)>jL>h@3tsi9;aKv>+1(;t1X^SAp{GdKjN$(`euUNd zEnQJFvqu`MZ9QaM>zGq|t87vOD=XHwzsFWtkLe#jWR`i9W=YCC&DwQTH$+y)bnuK`XC=uReQ)_HSM0&+zn(I}XtfB4W`x;H2As=V z>KkbB;2AUkc1__fC3AUWf2bb%sNTVVu|EYDs_la2Nru!IlhhYz%y^<y*n;Ehj4W`AS(RiCTd9c7na zus`oADJj_Z$aQ;}fORH3>XDnml?UDTUEcWy5AD|uIk(-GI}{cclBK^iti9G^F{9#A z*bSX^BXeUPtq#pCHPHoB-LQMMXWGobvUjRnHE`WK>?QBsv^aczo}iwIb73;d`#WBqb!eC5DzPyr#Cbeya8POixg6Z-YN5 z2R2qP5dMD#k)SE6oayI1R>vGvk93^fb^CsKK$cRI-v-lIx3u4~H~CymW^H+0 zXZ*{uDetM|a>W2{?_h~bwEoE~O*yw3eU><~_~jE}*Q-*lflH9rh9#7&7)4E(gj(-o zZ+9uNaBRhLk#2}jd_#`y=)%aGt-HKAe96mJx%|zGitAP`?I^VTZZ+@a&Ha z8hAN7Qam@7TNdhWA=@goKW8NBvHot+=Jzk&9rRUBBT{DYm(z zoZ_ao);r@+!@^K?-lIqQ`>V5j9%|c)F0E*m-7Y^E;xp~Ne8sYL_I;*!2~X|yiVk~m zSWA1h#>Vdaua}By&fakDnmBCcl;V)946X%!&WCkfm;XB|qSCyFO~-g6EgycnR}ft_ z6tryUeCZ8mi;P+>^Rdp#!X-tkpJ#iT{bG8YV^lX{p4xJ0MXOxFHm3fmD^fZ}4iARk z2hdWzU)Kz*b^G4s#3qvy)&7-HE6?Sry7o)-{Ry!+jc}2(Ti#MQ4Zr_a_x5m4?>%SBLrtkNk`D?^v~7R~m|Z6rG_h zsoFQy9(JJPoP|+B@2vOd+xcJrp15NsYU<*>&HKanvUSfEi`w(T#-y}7z0%k6+!eN2 z)lpA{7fb^~#zT^GxJmuSwUWbe?)eAQ#&k+ez0PPxUEsKtJruSCNgp)SUmU4yuFx^n zv(oxswDeiS^x(7WPHy3kOic7SI0OpFYBSnu9WlP))8{uaAKqDQ z{wr{WcyQl{e92@-w_H;xJ{F$%zM$dIFXp>^s{a1Y`q{IC<4^wx_3j9MQInZ9Vd1dC z)^=C-UZu*s;2YYZKEq)ySL=4WE>Y+)wQy3NYGFm4YR)dcdjjiMYlLYjL+!AetybBh zaV^CSdyX6pyzS}Jn(s+$zxKJ9Iq`_$c@>?|F&cz19hYS+PO>5?xVM=X1ePt{T@}XJ>i@n z!StKk@CTz0GQx&+JkOZ4F&kfV=oSjyO5#EL*XOda=IW`AB91dJ;6bLTrc23?UZ;aV z1hXWJ+x>^1jP-?ltnRL8D-oCHdWlP-9taT?FhM-Qgd{jvy+pz?#Yzp+*ROUi@3@mu z5SP43Te4_X#pm$hbQ`0Y)bDrg%>Oj@^MEM1mG?I4?cB2GCz`%Ix)nP#qo7bM=!klK zg3)R&X>yl{A9}XwItE>dN{lg#-m4KWbZT-gBob>TS$8yV$Vd z*$$^L_u!#b`vVXEWcu60>u35=;fIeLKDy8XwtHPpnfCLli$6?r&_5~U-pxoGwkUD8 zaJCtC?~Na`IMd~L#&ybL#xJ_}?r68^^-@FehJi9zQsuxZU*(SFZHN8awEZLP|GI8{ z`}3Z?;>z&cr6va6>Tep#eCi$ND}|~%EUyX(Qg={^*?4zn)ok5m;j77CyT3YE3_C4; zGbQRD%`m=Xps(k*`8~9yA0ik(`aQQU;`Cfjt~xN`E32c`a;uzv3(IYGj_cO)&Lf~p zbgn)iPsu0s{Mzqx6xmiv<0eKX#%8|fWh4&@Hg7(uD%;|vA9g*-tE~R}I))Ro{^&~U z!n(eYFWusjlBkbieR|$@b4?;$*mp$C$3CzsoB&Z=rCd7)7TlW{88?sl?6Cg&P0La7 zu($UL{{CRo-~ayeMbP-CP+z0bkK;{80|KvG4nIm=X_2t7gU8-dRGz#!J}Fn(e2KPL zESq`2WAR!`*cR6`W`Yksn9Sa^LZz)Ygi})bVU3BeXFy_%ifEfr!)$%gX6wPZ$jQ*S z;VuZs`kbh?-6q2Om#G|FNc)D3DYy$AOFp1;r@NQuJZd&*k9zywYozFcq#(x0E+$yV zEx>+xa6ysu6H)T??9|1rmTr@EM=VYJ5`%`0ynbUq_q!_k-8}lWrJ4@6^R15GuECHz zM$_s2=gc#V-OkO)1=^f?y`uWOw#rmLE2l&Q^_y;Uy*plKeAee{^~7Y|vCiM>N+(K8 zA?R^yoxDOEc9jX89J#PJ6%mU(Xb`FYn^mCUbQ#6r{Tm}AUT*keebB8j;&!-GFn`z5 z4x>}vMN-eRo%fcc=FwxfTYnu{)8#7>{;`D-u|1($=JIBkcAP2K-K*!E&~n4Bz_5BL z^Ot=V&dlcZqWb=T5N@xev9}~parA14(_)8}%A&HRn!zEv#(pa*5`SzM8L9iFYED&J z%(Hpfp`PfaD-tJ)ndgKA3{2Nn7Be6+lN~6MU~{_SFwZ>rbD{6;O;+Xu*Y^A>uDagd zms9ey_`PaFgu$iMOp^_Jj+&Qr_{wjp^fRt0J~`MN7htcV%pIKUl1Q@lJvuItG}U<; znx4_=3GMY-@8g!ADXE>js-0G!5!Fo8xVh~L>U{Y0YhgF@)`phbh21j+kDd

B5z%XWSK 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%0AECH>^)O6D%=hApUrK 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 z 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 z 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�&Eo>W=u+wAK2Guojk&r+@d1X>}As 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 diff --git a/extensions/fablabchemnitz/boxes.py/boxes/static/samples/AirPurifier-thumb.jpg b/extensions/fablabchemnitz/boxes.py/boxes/static/samples/AirPurifier-thumb.jpg deleted file mode 100644 index db7ee71cb101b8c18295cac0b23c12c9aedbbf83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29276 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%0DO8TAbj)x)6<2bNIQ^ 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

nM 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%0DlY^wVIkHEs2Q>_a>& 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