├── .gitignore ├── LICENSE.md ├── README.md ├── build ├── README.md ├── build.py ├── output │ ├── iTopie_plates-CNC-16mm_thickness.dxf │ └── iTopie_plates-LaserCut-16mm_thickness.dxf └── tmp │ └── .gitignore ├── cb ├── iTopie_plate_1.cb ├── iTopie_plate_2.cb └── iTopie_plates.cb ├── odmt ├── README.md └── odmt.py ├── scad ├── README.md ├── config.scad ├── main.scad ├── parts │ ├── feet.scad │ ├── horizontal_plate.scad │ ├── logo.dxf │ ├── triangle.scad │ ├── vertical_plate.scad │ └── y_carriage.scad └── shapes.scad ├── skp └── iTopie.skp └── stl ├── iTopie_logo.OPTIONAL.stl ├── iTopie_x_carriage.stl ├── iTopie_x_carriage_v2.stl ├── iTopie_x_end_idler.stl ├── iTopie_x_end_motor.stl ├── iTopie_xy_bearing_idler.stl ├── iTopie_xz_endstop_holder.stl ├── iTopie_y_bed_thumbwheel.OPTIONAL.stl ├── iTopie_y_belt_holder.stl ├── iTopie_y_endstop_flag.OPTIONAL.stl ├── iTopie_y_lm8uu_holder.stl ├── iTopie_z_endstop_thumbwheel.OPTIONAL.stl ├── iTopie_z_rod_holder_left.stl ├── iTopie_z_rod_holder_right.stl └── upgrades ├── iTopie_power_panel_left.stl ├── iTopie_power_panel_right.stl ├── iTopie_power_supply_bracket.stl └── iTopie_smoothieboard_panel.stl /.gitignore: -------------------------------------------------------------------------------- 1 | *.skb 2 | *.b1 3 | *.b2 4 | *.b3 5 | skp/EnregistrementAuto_iTopie_1.skp 6 | skp/EnregistrementAuto_iTopie_plates_2D.skp 7 | .idea/ 8 | build/output/ 9 | 10 | # Byte-compiled / optimized / DLL files 11 | __pycache__/ 12 | *.py[cod] 13 | *$py.class 14 | 15 | # C extensions 16 | *.so 17 | 18 | # Distribution / packaging 19 | .Python 20 | env/ 21 | build/ 22 | develop-eggs/ 23 | dist/ 24 | downloads/ 25 | eggs/ 26 | .eggs/ 27 | lib/ 28 | lib64/ 29 | parts/ 30 | sdist/ 31 | var/ 32 | wheels/ 33 | *.egg-info/ 34 | .installed.cfg 35 | *.egg 36 | 37 | # PyInstaller 38 | # Usually these files are written by a python script from a template 39 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 40 | *.manifest 41 | *.spec 42 | 43 | # Installer logs 44 | pip-log.txt 45 | pip-delete-this-directory.txt 46 | 47 | # Unit test / coverage reports 48 | htmlcov/ 49 | .tox/ 50 | .coverage 51 | .coverage.* 52 | .cache 53 | nosetests.xml 54 | coverage.xml 55 | *,cover 56 | .hypothesis/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django stuff: 63 | *.log 64 | local_settings.py 65 | 66 | # Flask stuff: 67 | instance/ 68 | .webassets-cache 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | 76 | # PyBuilder 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # pyenv 83 | .python-version 84 | 85 | # celery beat schedule file 86 | celerybeat-schedule 87 | 88 | # dotenv 89 | .env 90 | 91 | # virtualenv 92 | .venv/ 93 | venv/ 94 | ENV/ 95 | 96 | # Spyder project settings 97 | .spyderproject 98 | 99 | # Rope project settings 100 | .ropeproject -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | ========================== 3 | 4 | Version 3, 29 June 2007 5 | 6 | Copyright © 2007 Free Software Foundation, Inc. <> 7 | 8 | Everyone is permitted to copy and distribute verbatim copies of this license 9 | document, but changing it is not allowed. 10 | 11 | ## Preamble 12 | 13 | The GNU General Public License is a free, copyleft license for software and other 14 | kinds of works. 15 | 16 | The licenses for most software and other practical works are designed to take away 17 | your freedom to share and change the works. By contrast, the GNU General Public 18 | License is intended to guarantee your freedom to share and change all versions of a 19 | program--to make sure it remains free software for all its users. We, the Free 20 | Software Foundation, use the GNU General Public License for most of our software; it 21 | applies also to any other work released this way by its authors. You can apply it to 22 | your programs, too. 23 | 24 | When we speak of free software, we are referring to freedom, not price. Our General 25 | Public Licenses are designed to make sure that you have the freedom to distribute 26 | copies of free software (and charge for them if you wish), that you receive source 27 | code or can get it if you want it, that you can change the software or use pieces of 28 | it in new free programs, and that you know you can do these things. 29 | 30 | To protect your rights, we need to prevent others from denying you these rights or 31 | asking you to surrender the rights. Therefore, you have certain responsibilities if 32 | you distribute copies of the software, or if you modify it: responsibilities to 33 | respect the freedom of others. 34 | 35 | For example, if you distribute copies of such a program, whether gratis or for a fee, 36 | you must pass on to the recipients the same freedoms that you received. You must make 37 | sure that they, too, receive or can get the source code. And you must show them these 38 | terms so they know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: (1) assert 41 | copyright on the software, and (2) offer you this License giving you legal permission 42 | to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains that there is 45 | no warranty for this free software. For both users' and authors' sake, the GPL 46 | requires that modified versions be marked as changed, so that their problems will not 47 | be attributed erroneously to authors of previous versions. 48 | 49 | Some devices are designed to deny users access to install or run modified versions of 50 | the software inside them, although the manufacturer can do so. This is fundamentally 51 | incompatible with the aim of protecting users' freedom to change the software. The 52 | systematic pattern of such abuse occurs in the area of products for individuals to 53 | use, which is precisely where it is most unacceptable. Therefore, we have designed 54 | this version of the GPL to prohibit the practice for those products. If such problems 55 | arise substantially in other domains, we stand ready to extend this provision to 56 | those domains in future versions of the GPL, as needed to protect the freedom of 57 | users. 58 | 59 | Finally, every program is threatened constantly by software patents. States should 60 | not allow patents to restrict development and use of software on general-purpose 61 | computers, but in those that do, we wish to avoid the special danger that patents 62 | applied to a free program could make it effectively proprietary. To prevent this, the 63 | GPL assures that patents cannot be used to render the program non-free. 64 | 65 | The precise terms and conditions for copying, distribution and modification follow. 66 | 67 | ## TERMS AND CONDITIONS 68 | 69 | ### 0. Definitions. 70 | 71 | “This License” refers to version 3 of the GNU General Public License. 72 | 73 | “Copyright” also means copyright-like laws that apply to other kinds of 74 | works, such as semiconductor masks. 75 | 76 | “The Program” refers to any copyrightable work licensed under this 77 | License. Each licensee is addressed as “you”. “Licensees” and 78 | “recipients” may be individuals or organizations. 79 | 80 | To “modify” a work means to copy from or adapt all or part of the work in 81 | a fashion requiring copyright permission, other than the making of an exact copy. The 82 | resulting work is called a “modified version” of the earlier work or a 83 | work “based on” the earlier work. 84 | 85 | A “covered work” means either the unmodified Program or a work based on 86 | the Program. 87 | 88 | To “propagate” a work means to do anything with it that, without 89 | permission, would make you directly or secondarily liable for infringement under 90 | applicable copyright law, except executing it on a computer or modifying a private 91 | copy. Propagation includes copying, distribution (with or without modification), 92 | making available to the public, and in some countries other activities as well. 93 | 94 | To “convey” a work means any kind of propagation that enables other 95 | parties to make or receive copies. Mere interaction with a user through a computer 96 | network, with no transfer of a copy, is not conveying. 97 | 98 | An interactive user interface displays “Appropriate Legal Notices” to the 99 | extent that it includes a convenient and prominently visible feature that (1) 100 | displays an appropriate copyright notice, and (2) tells the user that there is no 101 | warranty for the work (except to the extent that warranties are provided), that 102 | licensees may convey the work under this License, and how to view a copy of this 103 | License. If the interface presents a list of user commands or options, such as a 104 | menu, a prominent item in the list meets this criterion. 105 | 106 | ### 1. Source Code. 107 | 108 | The “source code” for a work means the preferred form of the work for 109 | making modifications to it. “Object code” means any non-source form of a 110 | work. 111 | 112 | A “Standard Interface” means an interface that either is an official 113 | standard defined by a recognized standards body, or, in the case of interfaces 114 | specified for a particular programming language, one that is widely used among 115 | developers working in that language. 116 | 117 | The “System Libraries” of an executable work include anything, other than 118 | the work as a whole, that (a) is included in the normal form of packaging a Major 119 | Component, but which is not part of that Major Component, and (b) serves only to 120 | enable use of the work with that Major Component, or to implement a Standard 121 | Interface for which an implementation is available to the public in source code form. 122 | A “Major Component”, in this context, means a major essential component 123 | (kernel, window system, and so on) of the specific operating system (if any) on which 124 | the executable work runs, or a compiler used to produce the work, or an object code 125 | interpreter used to run it. 126 | 127 | The “Corresponding Source” for a work in object code form means all the 128 | source code needed to generate, install, and (for an executable work) run the object 129 | code and to modify the work, including scripts to control those activities. However, 130 | it does not include the work's System Libraries, or general-purpose tools or 131 | generally available free programs which are used unmodified in performing those 132 | activities but which are not part of the work. For example, Corresponding Source 133 | includes interface definition files associated with source files for the work, and 134 | the source code for shared libraries and dynamically linked subprograms that the work 135 | is specifically designed to require, such as by intimate data communication or 136 | control flow between those subprograms and other parts of the work. 137 | 138 | The Corresponding Source need not include anything that users can regenerate 139 | automatically from other parts of the Corresponding Source. 140 | 141 | The Corresponding Source for a work in source code form is that same work. 142 | 143 | ### 2. Basic Permissions. 144 | 145 | All rights granted under this License are granted for the term of copyright on the 146 | Program, and are irrevocable provided the stated conditions are met. This License 147 | explicitly affirms your unlimited permission to run the unmodified Program. The 148 | output from running a covered work is covered by this License only if the output, 149 | given its content, constitutes a covered work. This License acknowledges your rights 150 | of fair use or other equivalent, as provided by copyright law. 151 | 152 | You may make, run and propagate covered works that you do not convey, without 153 | conditions so long as your license otherwise remains in force. You may convey covered 154 | works to others for the sole purpose of having them make modifications exclusively 155 | for you, or provide you with facilities for running those works, provided that you 156 | comply with the terms of this License in conveying all material for which you do not 157 | control copyright. Those thus making or running the covered works for you must do so 158 | exclusively on your behalf, under your direction and control, on terms that prohibit 159 | them from making any copies of your copyrighted material outside their relationship 160 | with you. 161 | 162 | Conveying under any other circumstances is permitted solely under the conditions 163 | stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 164 | 165 | ### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 166 | 167 | No covered work shall be deemed part of an effective technological measure under any 168 | applicable law fulfilling obligations under article 11 of the WIPO copyright treaty 169 | adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention 170 | of such measures. 171 | 172 | When you convey a covered work, you waive any legal power to forbid circumvention of 173 | technological measures to the extent such circumvention is effected by exercising 174 | rights under this License with respect to the covered work, and you disclaim any 175 | intention to limit operation or modification of the work as a means of enforcing, 176 | against the work's users, your or third parties' legal rights to forbid circumvention 177 | of technological measures. 178 | 179 | ### 4. Conveying Verbatim Copies. 180 | 181 | You may convey verbatim copies of the Program's source code as you receive it, in any 182 | medium, provided that you conspicuously and appropriately publish on each copy an 183 | appropriate copyright notice; keep intact all notices stating that this License and 184 | any non-permissive terms added in accord with section 7 apply to the code; keep 185 | intact all notices of the absence of any warranty; and give all recipients a copy of 186 | this License along with the Program. 187 | 188 | You may charge any price or no price for each copy that you convey, and you may offer 189 | support or warranty protection for a fee. 190 | 191 | ### 5. Conveying Modified Source Versions. 192 | 193 | You may convey a work based on the Program, or the modifications to produce it from 194 | the Program, in the form of source code under the terms of section 4, provided that 195 | you also meet all of these conditions: 196 | 197 | * a) The work must carry prominent notices stating that you modified it, and giving a 198 | relevant date. 199 | * b) The work must carry prominent notices stating that it is released under this 200 | License and any conditions added under section 7. This requirement modifies the 201 | requirement in section 4 to “keep intact all notices”. 202 | * c) You must license the entire work, as a whole, under this License to anyone who 203 | comes into possession of a copy. This License will therefore apply, along with any 204 | applicable section 7 additional terms, to the whole of the work, and all its parts, 205 | regardless of how they are packaged. This License gives no permission to license the 206 | work in any other way, but it does not invalidate such permission if you have 207 | separately received it. 208 | * d) If the work has interactive user interfaces, each must display Appropriate Legal 209 | Notices; however, if the Program has interactive interfaces that do not display 210 | Appropriate Legal Notices, your work need not make them do so. 211 | 212 | A compilation of a covered work with other separate and independent works, which are 213 | not by their nature extensions of the covered work, and which are not combined with 214 | it such as to form a larger program, in or on a volume of a storage or distribution 215 | medium, is called an “aggregate” if the compilation and its resulting 216 | copyright are not used to limit the access or legal rights of the compilation's users 217 | beyond what the individual works permit. Inclusion of a covered work in an aggregate 218 | does not cause this License to apply to the other parts of the aggregate. 219 | 220 | ### 6. Conveying Non-Source Forms. 221 | 222 | You may convey a covered work in object code form under the terms of sections 4 and 223 | 5, provided that you also convey the machine-readable Corresponding Source under the 224 | terms of this License, in one of these ways: 225 | 226 | * a) Convey the object code in, or embodied in, a physical product (including a 227 | physical distribution medium), accompanied by the Corresponding Source fixed on a 228 | durable physical medium customarily used for software interchange. 229 | * b) Convey the object code in, or embodied in, a physical product (including a 230 | physical distribution medium), accompanied by a written offer, valid for at least 231 | three years and valid for as long as you offer spare parts or customer support for 232 | that product model, to give anyone who possesses the object code either (1) a copy of 233 | the Corresponding Source for all the software in the product that is covered by this 234 | License, on a durable physical medium customarily used for software interchange, for 235 | a price no more than your reasonable cost of physically performing this conveying of 236 | source, or (2) access to copy the Corresponding Source from a network server at no 237 | charge. 238 | * c) Convey individual copies of the object code with a copy of the written offer to 239 | provide the Corresponding Source. This alternative is allowed only occasionally and 240 | noncommercially, and only if you received the object code with such an offer, in 241 | accord with subsection 6b. 242 | * d) Convey the object code by offering access from a designated place (gratis or for 243 | a charge), and offer equivalent access to the Corresponding Source in the same way 244 | through the same place at no further charge. You need not require recipients to copy 245 | the Corresponding Source along with the object code. If the place to copy the object 246 | code is a network server, the Corresponding Source may be on a different server 247 | (operated by you or a third party) that supports equivalent copying facilities, 248 | provided you maintain clear directions next to the object code saying where to find 249 | the Corresponding Source. Regardless of what server hosts the Corresponding Source, 250 | you remain obligated to ensure that it is available for as long as needed to satisfy 251 | these requirements. 252 | * e) Convey the object code using peer-to-peer transmission, provided you inform 253 | other peers where the object code and Corresponding Source of the work are being 254 | offered to the general public at no charge under subsection 6d. 255 | 256 | A separable portion of the object code, whose source code is excluded from the 257 | Corresponding Source as a System Library, need not be included in conveying the 258 | object code work. 259 | 260 | A “User Product” is either (1) a “consumer product”, which 261 | means any tangible personal property which is normally used for personal, family, or 262 | household purposes, or (2) anything designed or sold for incorporation into a 263 | dwelling. In determining whether a product is a consumer product, doubtful cases 264 | shall be resolved in favor of coverage. For a particular product received by a 265 | particular user, “normally used” refers to a typical or common use of 266 | that class of product, regardless of the status of the particular user or of the way 267 | in which the particular user actually uses, or expects or is expected to use, the 268 | product. A product is a consumer product regardless of whether the product has 269 | substantial commercial, industrial or non-consumer uses, unless such uses represent 270 | the only significant mode of use of the product. 271 | 272 | “Installation Information” for a User Product means any methods, 273 | procedures, authorization keys, or other information required to install and execute 274 | modified versions of a covered work in that User Product from a modified version of 275 | its Corresponding Source. The information must suffice to ensure that the continued 276 | functioning of the modified object code is in no case prevented or interfered with 277 | solely because modification has been made. 278 | 279 | If you convey an object code work under this section in, or with, or specifically for 280 | use in, a User Product, and the conveying occurs as part of a transaction in which 281 | the right of possession and use of the User Product is transferred to the recipient 282 | in perpetuity or for a fixed term (regardless of how the transaction is 283 | characterized), the Corresponding Source conveyed under this section must be 284 | accompanied by the Installation Information. But this requirement does not apply if 285 | neither you nor any third party retains the ability to install modified object code 286 | on the User Product (for example, the work has been installed in ROM). 287 | 288 | The requirement to provide Installation Information does not include a requirement to 289 | continue to provide support service, warranty, or updates for a work that has been 290 | modified or installed by the recipient, or for the User Product in which it has been 291 | modified or installed. Access to a network may be denied when the modification itself 292 | materially and adversely affects the operation of the network or violates the rules 293 | and protocols for communication across the network. 294 | 295 | Corresponding Source conveyed, and Installation Information provided, in accord with 296 | this section must be in a format that is publicly documented (and with an 297 | implementation available to the public in source code form), and must require no 298 | special password or key for unpacking, reading or copying. 299 | 300 | ### 7. Additional Terms. 301 | 302 | “Additional permissions” are terms that supplement the terms of this 303 | License by making exceptions from one or more of its conditions. Additional 304 | permissions that are applicable to the entire Program shall be treated as though they 305 | were included in this License, to the extent that they are valid under applicable 306 | law. If additional permissions apply only to part of the Program, that part may be 307 | used separately under those permissions, but the entire Program remains governed by 308 | this License without regard to the additional permissions. 309 | 310 | When you convey a copy of a covered work, you may at your option remove any 311 | additional permissions from that copy, or from any part of it. (Additional 312 | permissions may be written to require their own removal in certain cases when you 313 | modify the work.) You may place additional permissions on material, added by you to a 314 | covered work, for which you have or can give appropriate copyright permission. 315 | 316 | Notwithstanding any other provision of this License, for material you add to a 317 | covered work, you may (if authorized by the copyright holders of that material) 318 | supplement the terms of this License with terms: 319 | 320 | * a) Disclaiming warranty or limiting liability differently from the terms of 321 | sections 15 and 16 of this License; or 322 | * b) Requiring preservation of specified reasonable legal notices or author 323 | attributions in that material or in the Appropriate Legal Notices displayed by works 324 | containing it; or 325 | * c) Prohibiting misrepresentation of the origin of that material, or requiring that 326 | modified versions of such material be marked in reasonable ways as different from the 327 | original version; or 328 | * d) Limiting the use for publicity purposes of names of licensors or authors of the 329 | material; or 330 | * e) Declining to grant rights under trademark law for use of some trade names, 331 | trademarks, or service marks; or 332 | * f) Requiring indemnification of licensors and authors of that material by anyone 333 | who conveys the material (or modified versions of it) with contractual assumptions of 334 | liability to the recipient, for any liability that these contractual assumptions 335 | directly impose on those licensors and authors. 336 | 337 | All other non-permissive additional terms are considered “further 338 | restrictions” within the meaning of section 10. If the Program as you received 339 | it, or any part of it, contains a notice stating that it is governed by this License 340 | along with a term that is a further restriction, you may remove that term. If a 341 | license document contains a further restriction but permits relicensing or conveying 342 | under this License, you may add to a covered work material governed by the terms of 343 | that license document, provided that the further restriction does not survive such 344 | relicensing or conveying. 345 | 346 | If you add terms to a covered work in accord with this section, you must place, in 347 | the relevant source files, a statement of the additional terms that apply to those 348 | files, or a notice indicating where to find the applicable terms. 349 | 350 | Additional terms, permissive or non-permissive, may be stated in the form of a 351 | separately written license, or stated as exceptions; the above requirements apply 352 | either way. 353 | 354 | ### 8. Termination. 355 | 356 | You may not propagate or modify a covered work except as expressly provided under 357 | this License. Any attempt otherwise to propagate or modify it is void, and will 358 | automatically terminate your rights under this License (including any patent licenses 359 | granted under the third paragraph of section 11). 360 | 361 | However, if you cease all violation of this License, then your license from a 362 | particular copyright holder is reinstated (a) provisionally, unless and until the 363 | copyright holder explicitly and finally terminates your license, and (b) permanently, 364 | if the copyright holder fails to notify you of the violation by some reasonable means 365 | prior to 60 days after the cessation. 366 | 367 | Moreover, your license from a particular copyright holder is reinstated permanently 368 | if the copyright holder notifies you of the violation by some reasonable means, this 369 | is the first time you have received notice of violation of this License (for any 370 | work) from that copyright holder, and you cure the violation prior to 30 days after 371 | your receipt of the notice. 372 | 373 | Termination of your rights under this section does not terminate the licenses of 374 | parties who have received copies or rights from you under this License. If your 375 | rights have been terminated and not permanently reinstated, you do not qualify to 376 | receive new licenses for the same material under section 10. 377 | 378 | ### 9. Acceptance Not Required for Having Copies. 379 | 380 | You are not required to accept this License in order to receive or run a copy of the 381 | Program. Ancillary propagation of a covered work occurring solely as a consequence of 382 | using peer-to-peer transmission to receive a copy likewise does not require 383 | acceptance. However, nothing other than this License grants you permission to 384 | propagate or modify any covered work. These actions infringe copyright if you do not 385 | accept this License. Therefore, by modifying or propagating a covered work, you 386 | indicate your acceptance of this License to do so. 387 | 388 | ### 10. Automatic Licensing of Downstream Recipients. 389 | 390 | Each time you convey a covered work, the recipient automatically receives a license 391 | from the original licensors, to run, modify and propagate that work, subject to this 392 | License. You are not responsible for enforcing compliance by third parties with this 393 | License. 394 | 395 | An “entity transaction” is a transaction transferring control of an 396 | organization, or substantially all assets of one, or subdividing an organization, or 397 | merging organizations. If propagation of a covered work results from an entity 398 | transaction, each party to that transaction who receives a copy of the work also 399 | receives whatever licenses to the work the party's predecessor in interest had or 400 | could give under the previous paragraph, plus a right to possession of the 401 | Corresponding Source of the work from the predecessor in interest, if the predecessor 402 | has it or can get it with reasonable efforts. 403 | 404 | You may not impose any further restrictions on the exercise of the rights granted or 405 | affirmed under this License. For example, you may not impose a license fee, royalty, 406 | or other charge for exercise of rights granted under this License, and you may not 407 | initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging 408 | that any patent claim is infringed by making, using, selling, offering for sale, or 409 | importing the Program or any portion of it. 410 | 411 | ### 11. Patents. 412 | 413 | A “contributor” is a copyright holder who authorizes use under this 414 | License of the Program or a work on which the Program is based. The work thus 415 | licensed is called the contributor's “contributor version”. 416 | 417 | A contributor's “essential patent claims” are all patent claims owned or 418 | controlled by the contributor, whether already acquired or hereafter acquired, that 419 | would be infringed by some manner, permitted by this License, of making, using, or 420 | selling its contributor version, but do not include claims that would be infringed 421 | only as a consequence of further modification of the contributor version. For 422 | purposes of this definition, “control” includes the right to grant patent 423 | sublicenses in a manner consistent with the requirements of this License. 424 | 425 | Each contributor grants you a non-exclusive, worldwide, royalty-free patent license 426 | under the contributor's essential patent claims, to make, use, sell, offer for sale, 427 | import and otherwise run, modify and propagate the contents of its contributor 428 | version. 429 | 430 | In the following three paragraphs, a “patent license” is any express 431 | agreement or commitment, however denominated, not to enforce a patent (such as an 432 | express permission to practice a patent or covenant not to sue for patent 433 | infringement). To “grant” such a patent license to a party means to make 434 | such an agreement or commitment not to enforce a patent against the party. 435 | 436 | If you convey a covered work, knowingly relying on a patent license, and the 437 | Corresponding Source of the work is not available for anyone to copy, free of charge 438 | and under the terms of this License, through a publicly available network server or 439 | other readily accessible means, then you must either (1) cause the Corresponding 440 | Source to be so available, or (2) arrange to deprive yourself of the benefit of the 441 | patent license for this particular work, or (3) arrange, in a manner consistent with 442 | the requirements of this License, to extend the patent license to downstream 443 | recipients. “Knowingly relying” means you have actual knowledge that, but 444 | for the patent license, your conveying the covered work in a country, or your 445 | recipient's use of the covered work in a country, would infringe one or more 446 | identifiable patents in that country that you have reason to believe are valid. 447 | 448 | If, pursuant to or in connection with a single transaction or arrangement, you 449 | convey, or propagate by procuring conveyance of, a covered work, and grant a patent 450 | license to some of the parties receiving the covered work authorizing them to use, 451 | propagate, modify or convey a specific copy of the covered work, then the patent 452 | license you grant is automatically extended to all recipients of the covered work and 453 | works based on it. 454 | 455 | A patent license is “discriminatory” if it does not include within the 456 | scope of its coverage, prohibits the exercise of, or is conditioned on the 457 | non-exercise of one or more of the rights that are specifically granted under this 458 | License. You may not convey a covered work if you are a party to an arrangement with 459 | a third party that is in the business of distributing software, under which you make 460 | payment to the third party based on the extent of your activity of conveying the 461 | work, and under which the third party grants, to any of the parties who would receive 462 | the covered work from you, a discriminatory patent license (a) in connection with 463 | copies of the covered work conveyed by you (or copies made from those copies), or (b) 464 | primarily for and in connection with specific products or compilations that contain 465 | the covered work, unless you entered into that arrangement, or that patent license 466 | was granted, prior to 28 March 2007. 467 | 468 | Nothing in this License shall be construed as excluding or limiting any implied 469 | license or other defenses to infringement that may otherwise be available to you 470 | under applicable patent law. 471 | 472 | ### 12. No Surrender of Others' Freedom. 473 | 474 | If conditions are imposed on you (whether by court order, agreement or otherwise) 475 | that contradict the conditions of this License, they do not excuse you from the 476 | conditions of this License. If you cannot convey a covered work so as to satisfy 477 | simultaneously your obligations under this License and any other pertinent 478 | obligations, then as a consequence you may not convey it at all. For example, if you 479 | agree to terms that obligate you to collect a royalty for further conveying from 480 | those to whom you convey the Program, the only way you could satisfy both those terms 481 | and this License would be to refrain entirely from conveying the Program. 482 | 483 | ### 13. Use with the GNU Affero General Public License. 484 | 485 | Notwithstanding any other provision of this License, you have permission to link or 486 | combine any covered work with a work licensed under version 3 of the GNU Affero 487 | General Public License into a single combined work, and to convey the resulting work. 488 | The terms of this License will continue to apply to the part which is the covered 489 | work, but the special requirements of the GNU Affero General Public License, section 490 | 13, concerning interaction through a network will apply to the combination as such. 491 | 492 | ### 14. Revised Versions of this License. 493 | 494 | The Free Software Foundation may publish revised and/or new versions of the GNU 495 | General Public License from time to time. Such new versions will be similar in spirit 496 | to the present version, but may differ in detail to address new problems or concerns. 497 | 498 | Each version is given a distinguishing version number. If the Program specifies that 499 | a certain numbered version of the GNU General Public License “or any later 500 | version” applies to it, you have the option of following the terms and 501 | conditions either of that numbered version or of any later version published by the 502 | Free Software Foundation. If the Program does not specify a version number of the GNU 503 | General Public License, you may choose any version ever published by the Free 504 | Software Foundation. 505 | 506 | If the Program specifies that a proxy can decide which future versions of the GNU 507 | General Public License can be used, that proxy's public statement of acceptance of a 508 | version permanently authorizes you to choose that version for the Program. 509 | 510 | Later license versions may give you additional or different permissions. However, no 511 | additional obligations are imposed on any author or copyright holder as a result of 512 | your choosing to follow a later version. 513 | 514 | ### 15. Disclaimer of Warranty. 515 | 516 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 517 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 518 | PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER 519 | EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 520 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE 521 | QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE 522 | DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 523 | 524 | ### 16. Limitation of Liability. 525 | 526 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY 527 | COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS 528 | PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, 529 | INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 530 | PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE 531 | OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE 532 | WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 533 | POSSIBILITY OF SUCH DAMAGES. 534 | 535 | ### 17. Interpretation of Sections 15 and 16. 536 | 537 | If the disclaimer of warranty and limitation of liability provided above cannot be 538 | given local legal effect according to their terms, reviewing courts shall apply local 539 | law that most closely approximates an absolute waiver of all civil liability in 540 | connection with the Program, unless a warranty or assumption of liability accompanies 541 | a copy of the Program in return for a fee. 542 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## [RepRap iTopie](http://reprap.org/wiki/ITopie) 2 | Here you will find all the sources files for the [RepRap iTopie](http://reprap.org/wiki/ITopie).
The [build manual](http://reprap.org/wiki/ITopie_Build_Manual), [bill of materials](http://reprap.org/wiki/ITopie_Buyers_Guide) and other information is on the [RepRap wiki](http://reprap.org/wiki/ITopie).
Thank you. 3 | 4 | ## Highly customizable [frame generator](https://github.com/lautr3k/RepRap-iTopie/tree/dev/scad) 5 | 6 | ## DXF [build tool](https://github.com/lautr3k/RepRap-iTopie/tree/dev/build) 7 | Builder to create a clean layered DXF from (your custom) OpenSCAD source files. 8 | 9 | ## Some pictures 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /build/README.md: -------------------------------------------------------------------------------- 1 | # iTopie DXF build tool 2 | 3 | # Usage 4 | ``` 5 | usage: build.py [-h] [--target int] [--output_type int] [--output_dir path] 6 | [--output_file filename] [--output_clean] [--tmp_dir path] 7 | [--tmp_clean] [--odmt path] [--scad path] [--openscad path] 8 | [--clean] [--version] 9 | 10 | iTopie RepRap DXF builder - v1.0.0 11 | 12 | optional arguments: 13 | -h, --help show this help message and exit 14 | --target int 15 | output version (default : 0) 16 | ---------------------------- 17 | 0 : CNC milling (default) 18 | 1 : Laser cutting 19 | --output_type int, -t int 20 | output type (default : 0) 21 | ------------------------- 22 | 0 : all (plate 1 and plate 2 in one file) 23 | 1 : plate 1 (horizontal_plate, y_carriage, feet) 24 | 2 : plate 2 (vertical_plate, triangles, feet) 25 | --output_dir path, -d path 26 | path to the output directory (default : ./output) 27 | --output_file filename, -f filename 28 | output filename without extension (default : auto) 29 | --output_clean remove all files in the output directory (default : false) 30 | --tmp_dir path path to the temporary directory (default : ./tmp) 31 | --tmp_clean remove all files in the temporary directory (default : true) 32 | --odmt path path to the OpenSCAD DXF Merge Tool (default : ../odmt/odmt.py) 33 | --scad path path to the main OpenSCAD file (default : ../scad/main.scad) 34 | --openscad path path to the OpenSCAD binary (default : C:/Program Files/OpenSCAD/openscad.exe) 35 | --clean, -c remove all files in temporary and output directories (default : false) 36 | --version, -v show program's version number and exit 37 | ``` 38 | 39 | # Some basic examples 40 | `python build.py` or `python build.py --output_type 0` or `python build.py -t 0` 41 | 42 | 43 | `python build.py --output_type 1` or `python build.py -t 1` 44 | 45 | 46 | `python build.py --output_type 2` or `python build.py -t 2` 47 | 48 | -------------------------------------------------------------------------------- /build/build.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import argparse, os 4 | from argparse import RawTextHelpFormatter 5 | from subprocess import call 6 | 7 | # ----------------------------------------------------------------------------- 8 | # configuration 9 | # ----------------------------------------------------------------------------- 10 | # build tool version 11 | version = '1.0.0' 12 | description = 'iTopie RepRap DXF builder - v' + version 13 | 14 | # output version 15 | # 0 : CNC milling (default) 16 | # 1 : Laser cutting 17 | outputVersion = 0; 18 | 19 | # output type 20 | # 0 : all plates 21 | # 1 : plate 1 (horizontal_plate, y_carriage, feet) 22 | # 2 : plate 2 (vertical_plate, triangles, feet) 23 | outputType = 0; 24 | 25 | # output path 26 | outputFilename = 'auto'; 27 | outputDirectory = './output'; 28 | outputAutoClean = False; 29 | 30 | # temporary path 31 | tmpDirectory = './tmp'; 32 | tmpAutoClean = True; 33 | 34 | # path to OpenSCAD DXF Merge (and clean) Tool 35 | odmtPath = '../odmt/odmt.py'; 36 | 37 | # iTopie main scad file path 38 | mainScadFile = '../scad/main.scad'; 39 | 40 | # path to the OpenSCAD binary 41 | openscadPath = 'C:/Program Files/OpenSCAD/openscad.exe'; 42 | 43 | # ----------------------------------------------------------------------------- 44 | 45 | # command line parser 46 | parser = argparse.ArgumentParser( 47 | description = description, 48 | formatter_class=RawTextHelpFormatter); 49 | parser.add_argument('--target', 50 | metavar = 'int', 51 | default = outputVersion, 52 | help = 'output version (default : 0)\n' 53 | '----------------------------\n' 54 | '0 : CNC milling (default)\n' 55 | '1 : Laser cutting'); 56 | parser.add_argument('--output_type', '-t', 57 | metavar = 'int', 58 | default = outputType, 59 | help = 'output type (default : 0)\n' 60 | '-------------------------\n' 61 | '0 : all (plate 1 and plate 2 in one file)\n' 62 | '1 : plate 1 (horizontal_plate, y_carriage, feet)\n' 63 | '2 : plate 2 (vertical_plate, triangles, feet)'); 64 | parser.add_argument('--output_dir', '-d', 65 | metavar = 'path', 66 | default = outputDirectory, 67 | help = 'path to the output directory (default : '+outputDirectory+')'); 68 | parser.add_argument('--output_file', '-f', 69 | metavar = 'filename', 70 | default = outputFilename, 71 | help = 'output filename without extension (default : '+outputFilename+')'); 72 | parser.add_argument('--output_clean', 73 | action = 'store_true', 74 | help = 'remove all files in the output directory (default : false)'); 75 | parser.add_argument('--tmp_dir', 76 | metavar = 'path', 77 | default = tmpDirectory, 78 | help = 'path to the temporary directory (default : '+tmpDirectory+')'); 79 | parser.add_argument('--tmp_clean', 80 | action = 'store_false', 81 | help = 'remove all files in the temporary directory (default : true)'); 82 | parser.add_argument('--odmt', 83 | metavar = 'path', 84 | default = odmtPath, 85 | help = 'path to the OpenSCAD DXF Merge Tool (default : '+odmtPath+')'); 86 | parser.add_argument('--scad', 87 | metavar = 'path', 88 | default = mainScadFile, 89 | help = 'path to the main OpenSCAD file (default : '+mainScadFile+')'); 90 | parser.add_argument('--openscad', 91 | metavar = 'path', 92 | default = openscadPath, 93 | help = 'path to the OpenSCAD binary (default : '+openscadPath+')'); 94 | parser.add_argument('--clean', '-c', 95 | action = 'store_true', 96 | help = 'remove all files in temporary and output directories (default : false)'); 97 | parser.add_argument('--version', '-v', action='version', version=description); 98 | args = parser.parse_args(); 99 | 100 | # user settings 101 | outputType = int(args.output_type); 102 | outputVersion = int(args.target); 103 | outputAutoClean = args.clean or args.output_clean; 104 | tmpAutoClean = args.clean or args.tmp_clean; 105 | 106 | outputDirectory = os.path.realpath(args.output_dir); 107 | openscadPath = os.path.realpath(args.openscad); 108 | mainScadFile = os.path.realpath(args.scad); 109 | tmpDirectory = os.path.realpath(args.tmp_dir); 110 | odmtPath = os.path.realpath(args.odmt); 111 | 112 | # clean output folder 113 | if outputAutoClean: 114 | print('clean -> '+outputDirectory); 115 | for outputFile in os.listdir(outputDirectory): 116 | os.unlink(os.path.join(outputDirectory, outputFile)); 117 | 118 | # output file name 119 | if outputType == 1: 120 | outputFilename = 'iTopie_plate_1'; 121 | elif outputType == 2: 122 | outputFilename = 'iTopie_plate_2'; 123 | else: 124 | outputType = 0; 125 | outputFilename = 'iTopie_plates'; 126 | 127 | if args.output_file != 'auto': 128 | outputFilename = args.output_file; 129 | 130 | outputFile = os.path.realpath(os.path.join(outputDirectory, outputFilename+'.dxf')); 131 | tmpFile1 = os.path.realpath(os.path.join(tmpDirectory, outputFilename+'_layer_1.dxf')); 132 | tmpFile2 = os.path.realpath(os.path.join(tmpDirectory, outputFilename+'_layer_2.dxf')); 133 | 134 | # build process 135 | print('create -> '+tmpFile1); 136 | call([openscadPath, 137 | '-o', tmpFile1, 138 | '-D', 'output_mode=2', # first layer 139 | '-D', 'output_type='+str(outputType), 140 | '-D', 'output_version='+str(outputVersion), 141 | mainScadFile]); 142 | 143 | print('create -> '+tmpFile2); 144 | call([openscadPath, 145 | '-o', tmpFile2, 146 | '-D', 'output_mode=3', # second layer 147 | '-D', 'output_type='+str(outputType), 148 | '-D', 'output_version='+str(outputVersion), 149 | mainScadFile]); 150 | 151 | call(['python', odmtPath, 152 | 'input', tmpFile1, tmpFile2, 153 | '--output', outputFile]); 154 | 155 | # clean temporary folder 156 | if tmpAutoClean: 157 | print('clean -> '+tmpDirectory); 158 | for tmpFile in os.listdir(tmpDirectory): 159 | if tmpFile[0] != '.': # avoid remove .git* 160 | os.unlink(os.path.join(tmpDirectory, tmpFile)); 161 | 162 | print('done!'); 163 | -------------------------------------------------------------------------------- /build/tmp/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore everything in this directory 2 | * 3 | # Except this file 4 | !.gitignore 5 | -------------------------------------------------------------------------------- /odmt/README.md: -------------------------------------------------------------------------------- 1 | # OpenSCAD DXF Merge (and clean) Tool (odmt) 2 | Used internally by the build script for merging all DXF files generated by OpenSCAD in one layered DXF file. 3 | 4 | # Install dependencies 5 | Simply install the ezdxf library. 6 | ``` 7 | pip install ezdxf 8 | ``` 9 | 10 | For the curious, sources and usages at : https://github.com/lautr3k/odmt 11 | -------------------------------------------------------------------------------- /odmt/odmt.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import argparse, sys, os, glob, ezdxf 4 | 5 | # configuration 6 | app_name = 'odmt' 7 | app_version = '1.0.0' 8 | app_description = 'OpenSCAD DXF Merge Tool (odmt) - v' + app_version 9 | output_file = './merged.dxf' 10 | 11 | # command line parser 12 | parser = argparse.ArgumentParser( 13 | prog = app_name, 14 | description = app_description) 15 | parser.add_argument('--output', '-o', 16 | metavar = 'path', 17 | default = output_file, 18 | help='output file path to save the merged file') 19 | parser.add_argument('--input_type', '-t', 20 | choices = ['file', 'dir'], 21 | default = 'file', 22 | help='set the input type') 23 | parser.add_argument('input', 24 | metavar='input', 25 | nargs = '+', 26 | help='a directory or one or more file to be merged') 27 | parser.add_argument('--version', '-v', action='version', version='%(prog)s ' + app_version) 28 | args = parser.parse_args() 29 | 30 | # variables... 31 | input_files = [] 32 | output_file = os.path.realpath(args.output) 33 | output_dir = os.path.dirname(output_file) 34 | 35 | # test output path 36 | if os.path.isdir(output_dir) == False: 37 | print('output directory not found :'+ output_dir) 38 | sys.exit(1); 39 | 40 | # input type file 41 | if args.input_type == 'file': 42 | for input_file in args.input: 43 | if input_file.endswith('.dxf'): 44 | input_files.append(input_file) 45 | # no DXF file provided 46 | if len(input_files) == 0: 47 | print('at least one DXF file must be provided') 48 | sys.exit(1); 49 | 50 | # input type directory 51 | elif args.input_type == 'dir': 52 | input_dir = os.path.realpath(args.input[0]) 53 | if os.path.isdir(input_dir) == False: 54 | print('input directory not found :'+ input_dir) 55 | sys.exit(1); 56 | input_files = glob.glob(input_dir + '/*.dxf') 57 | # no DXF file provided 58 | if len(input_files) == 0: 59 | print('no DXF file found in'+ input_dir) 60 | sys.exit(1); 61 | 62 | # ... 63 | def merge_dxf_file(file): 64 | 'Merge DXF file and convert continuous line to polyline.' 65 | 66 | print('merging ->'+ file) 67 | 68 | dwg.layers.create(name=layer_name, dxfattribs={'color': layer_num}) 69 | 70 | counter = 0 71 | points = [] 72 | last_block = [] 73 | 74 | with open(file) as f: 75 | for line in f: 76 | line = line.strip('\n'); 77 | 78 | # block start 79 | if line == 'LINE': 80 | counter = 1; 81 | block = [[0, 0], [0, 0]]; 82 | 83 | # in the block 84 | if counter > 0: 85 | # start line 86 | if counter == 5: 87 | block[0][0] = line 88 | if counter == 7: 89 | block[0][1] = line 90 | # end line 91 | if counter == 9: 92 | block[1][0] = line 93 | if counter == 11: 94 | block[1][1] = line 95 | # increment 96 | counter += 1 97 | 98 | # end block 99 | if counter == 13: 100 | counter = 0 101 | 102 | # discontinued line 103 | if len(last_block) and block[0] != last_block[1]: 104 | msp.add_lwpolyline(points, dxfattribs={'layer': layer_name}) 105 | points = [] 106 | 107 | points.append((block[0][0], block[0][1])) 108 | points.append((block[1][0], block[1][1])) 109 | last_block = block 110 | 111 | if len(points): 112 | msp.add_lwpolyline(points, dxfattribs={'layer': layer_name}) 113 | 114 | return 115 | 116 | # DXF file 117 | dwg = ezdxf.new('AC1015') 118 | msp = dwg.modelspace() 119 | 120 | # layer 121 | layer_name = None 122 | layer_num = 0 123 | 124 | # for each file 125 | for input_file in input_files: 126 | layer_name = os.path.basename(input_file).rstrip('.dxf') 127 | layer_num += 1 128 | merge_dxf_file(input_file) 129 | 130 | # save output 131 | dwg.saveas(output_file) 132 | print('output :'+ output_file) 133 | -------------------------------------------------------------------------------- /scad/README.md: -------------------------------------------------------------------------------- 1 | # Highly customizable iTopie frame generator 2 | The [configuration file](https://github.com/lautr3k/RepRap-iTopie/blob/dev/scad/config.scad) contains about 80 variables (evilly commented) you can adjust for fine tuning (all will not be explained here). See the [build directory](https://github.com/lautr3k/RepRap-iTopie/tree/dev/build) for DXF merging/layering/cleaning tool. 3 | 4 | # Some basic examples 5 | ### Output version 6 | `output_version = 0` CNC milling (default) 7 | 8 | `output_version = 1` Laser cutting (two layers glued together - Miguel Sánchez version) 9 | 10 | ### Output mode 11 | `output_mode = 0` 2D preview (default) 12 | 13 | `output_mode = 1` extruded view 14 | 15 | `output_mode = 2` first layer only (plates) 16 | 17 | `output_mode = 3` second layer only (pockets) 18 | 19 | `output_mode = 4` 3D build preview 20 | 21 | ### Output type 22 | `output_type = 0` all parts 23 | 24 | `output_type = 1` plate 1 (horizontal_plate, y_carriage, feet) 25 | 26 | `output_type = 2` plate 2 (vertical_plate, triangles, feet) 27 | 28 | `output_type = 3` horizontal_plate only 29 | 30 | `output_type = 4` vertical_plate only 31 | 32 | `output_type = 5` y_carriage only 33 | 34 | `output_type = 6` triangle only 35 | 36 | `output_type = 7` feet only 37 | -------------------------------------------------------------------------------- /scad/config.scad: -------------------------------------------------------------------------------- 1 | // iTopie RepRap - Configuration 2 | // 3 | // @version 1.0.1 4 | // @license GPLv3 5 | // @docs http://reprap.org/wiki/ITopie 6 | // @sources https://github.com/lautr3k/RepRap-iTopie 7 | // @author Sébastien Mischler 8 | // @author http://www.onlfait.ch 9 | // 10 | $fn = 50; 11 | 12 | // ---------------------------------------------------------------- // 13 | // output settings 14 | // ---------------------------------------------------------------- // 15 | // output version 16 | // 0 : CNC milling (default) 17 | // 1 : Laser cutting 18 | output_version = 0; 19 | 20 | // output mode 21 | // 0 : 2D preview (default) 22 | // 1 : extruded view (slow) 23 | // 2 : export first layer (plates) 24 | // 3 : export second layer (pockets) 25 | // 4 : build preview (slow) 26 | output_mode = 0; 27 | 28 | // output type 29 | // 0 : all parts 30 | // 1 : plate 1 (horizontal_plate, y_carriage, feet) 31 | // 2 : plate 2 (vertical_plate, triangles, feet) 32 | // 3 : horizontal_plate 33 | // 4 : vertical_plate 34 | // 5 : y_carriage 35 | // 6 : triangle 36 | // 7 : feet 37 | output_type = 0; 38 | 39 | // parts margin (mode : 0-3) 40 | parts_margin = 10; 41 | 42 | // ---------------------------------------------------------------- // 43 | // drawing settings 44 | // ---------------------------------------------------------------- // 45 | sheet_thickness = 16; // raw sheet thickness 46 | pockets_depth = 6; // pockets depth 47 | pockets_color = "RoyalBlue"; // pockets color 48 | connector_size = [20, sheet_thickness]; // pockets/fingers [width, height] 49 | 50 | // ---------------------------------------------------------------- // 51 | // shortcuts 52 | // ---------------------------------------------------------------- // 53 | m3_screw_radius = 1.5; 54 | m4_screw_radius = 2; 55 | 56 | // ---------------------------------------------------------------- // 57 | // horizontal plate 58 | // ---------------------------------------------------------------- // 59 | horizontal_plate_width = 390; // 60 | horizontal_plate_height = 440; // 61 | horizontal_plate_borders = [40, 82, 40, 82]; // borders weight [top, right, bottom, left] 62 | horizontal_plate_outer_corners = [10, 10, 10, 10]; // outer corners radius [topLeft, topRight, bottomRight, bottoLeft] 63 | horizontal_plate_inner_corners = [30, 30, 30, 30]; // inner corners radius [topLeft, topRight, bottomRight, bottoLeft] 64 | 65 | // y motor mount 66 | y_motor_mount_width = 50; // 67 | y_motor_mount_height = 36; // 68 | y_motor_mount_corners = [5, 5, 10, 10]; // corners radius [topLeft, topRight, bottomRight, bottoLeft] 69 | y_motor_mount_angle = 8; // motor rotation angle (belt tensionner) 0 = disabled 70 | y_motor_holes_radius = m3_screw_radius; // y motor screw holes radius 71 | 72 | // z_motor mount 73 | z_motor_mount_margin = 8; // between the "motor" and the "z_plate" (border to border) 74 | z_motor_mount_spacing = undef; // between the two motor mount (axis to axis) [undef = auto] 75 | 76 | z_motor_holes_radius = m3_screw_radius; // z motor screw holes radius 77 | 78 | // z rods 79 | z_rod_spacing = 17; // between the "motor" and the "z rod" (axis to axis) 80 | z_rod_radius = 4; // z smoothe rod radius 81 | 82 | z_rod_holder_holes_radius = m3_screw_radius; // z rod top holder holes radius 83 | z_rod_holder_holes_margin = [12, 6]; // [from the top frame border, between the z rod and the first holder hole (axis to axis)] 84 | z_rod_holder_holes_spacing = 20; // between the two holder holes (axis to axis) 85 | 86 | // y idler mount 87 | y_idler_mount_width = 44; // 88 | y_idler_mount_height = 24; // 89 | y_idler_mount_corners = [5, 5, 10, 10]; // corners radius [topLeft, topRight, bottomRight, bottoLeft] 90 | y_idler_mount_hole_radius = 2.5; // y idler bearing hole radius 91 | 92 | // y idler pocket 93 | y_idler_pocket_width = undef; // idler pocket width [undef = auto] 94 | y_idler_pockets_height = y_idler_mount_height; // idler pocket height 95 | 96 | // y endstop mount 97 | y_endstop_mount_width = 25; // 98 | y_endstop_mount_height = 16.4; // 99 | y_endstop_mount_corners = [8.2, 8.2, 10, 10]; // corners radius [topLeft, topRight, bottomRight, bottoLeft] 100 | y_endstop_mount_position = 82; // from the frame top border to the endstop top border 101 | 102 | // ---------------------------------------------------------------- // 103 | // vertical plate 104 | // ---------------------------------------------------------------- // 105 | // vertical plate 106 | vertical_plate_width = horizontal_plate_width; // outer width 107 | vertical_plate_height = horizontal_plate_height; // outer height 108 | vertical_plate_borders = [60, 60, undef, 60]; // borders weight [top, right, bottom, left] 109 | vertical_plate_outer_corners = [10, 10, 10, 10]; // outer corners radius [topLeft, topRight, bottomRight, bottoLeft] 110 | vertical_plate_inner_corners = [10, 10, 10, 10]; // inner corners radius [topLeft, topRight, bottomRight, bottoLeft] 111 | vertical_plate_position = undef; // y position from the horizontal plate bottom border 112 | 113 | // ---------------------------------------------------------------- // 114 | // logo 115 | // ---------------------------------------------------------------- // 116 | dxf_logo = "logo.dxf"; // path to DXF logo 117 | logo_depth = 2; // logo pocket depth (set to undef for through cut) 118 | 119 | 120 | // ---------------------------------------------------------------- // 121 | // rear triangles 122 | // ---------------------------------------------------------------- // 123 | triangle_width = undef; // rear triangle width [undef = auto] 124 | triangle_height = undef; // rear triangle height [undef = auto] 125 | triangle_angle = undef; // rear triangle angle [undef = auto] 126 | triangle_margin = [undef, 15, 15, 15]; // rear triangle margin [top, right, bottom, left] 127 | triangle_radius = 10; // rear triangle corner radius [undef = auto] 128 | 129 | triangle_connectors_size = [connector_size[1], connector_size[0]]; // rotate 90° 130 | triangle_connectors_margin = [63, 22, undef, 22]; // pockets margin [top, right, ---, left] 131 | 132 | triangle_holes_radius = m4_screw_radius; // screws holes radius 133 | triangle_holes_margin = 20; // screws margin (from z triangle pocket border) 134 | 135 | // ---------------------------------------------------------------- // 136 | // y carriage 137 | // ---------------------------------------------------------------- // 138 | y_carriage_corners_holes_spacing = [209, 209]; // [x, y] axis to axis 139 | y_carriage_outer_offset = [11, 11]; // [x, y] 140 | y_carriage_holes_radius = m3_screw_radius; // 141 | y_carriage_ergots_radius = 5.5; // 142 | y_carriage_triangle_offset = 10; // inner offset 143 | y_carriage_triangle_margin = [11, 11]; // [x, y] 144 | y_carriage_thumbwheel_radius = 10; 145 | 146 | y_carriage_belt_holder_offset = 2; // offset position from y carriage axis (issue#13) 147 | y_carriage_belt_holder_screw_spacing = 16; // y belt holder holes spacing (axis to axis) 148 | y_carriage_lm8_holder_screw_spacing = 24; // y lm8uu holder holes spacing (axis to axis) 149 | y_carriage_lm8_holder_vspacing = undef; // lm8uu holder vertical spacing (axis to axis) 150 | 151 | y_rod_pockets_size = [8, 20]; // pockets size [rod diameter, length] 152 | y_rod_spacing = undef; // pockets spacing (axis to axis) [undef = auto] 153 | y_rod_holes_radius = m3_screw_radius; // y rod screws holes radius 154 | y_rod_holes_margin = 4; // y rod screws margin (from y rod pocket border) 155 | 156 | y_endstop_holes_radius = m3_screw_radius; // endstop screws holes radius 157 | y_endstop_holes_spacing = 9.5; // between the two endstop screws (axis to axis) 158 | 159 | // ---------------------------------------------------------------- // 160 | // feet 161 | // ---------------------------------------------------------------- // 162 | feet_width = horizontal_plate_width; // 163 | feet_height = 60; // 164 | feet_corners = [10, 10, 10, 10]; // corners radius [leftOut, leftIn, rightIn, rightOut] 165 | feet_gap_height = 20; // gap height ? 166 | 167 | feet_connectors_size = connector_size; // 168 | feet_connectors_margin = [10.5, 40, 10.5, 40]; // pockets margin [top, right, bottom, left] 169 | 170 | feet_holes_radius = m4_screw_radius; // feet screws holes radius 171 | feet_holes_margin = 10; // feet screws horizontal margin (for fine adjustement) 172 | 173 | foot_width = 40; // 174 | 175 | // ---------------------------------------------------------------- // 176 | // CHANGE NOTHING BELOW, UNLESS YOU KNOW WHAT YOU ARE DOING 177 | // ---------------------------------------------------------------- // 178 | 179 | // ---------------------------------------------------------------- // 180 | // pockets 181 | // ---------------------------------------------------------------- // 182 | pockets_height = sheet_thickness - pockets_depth; 183 | 184 | // ---------------------------------------------------------------- // 185 | // y carriage 186 | // ---------------------------------------------------------------- // 187 | y_carriage_corners_diameter = y_carriage_ergots_radius * 2; 188 | y_carriage_width = y_carriage_corners_holes_spacing[0] + y_carriage_corners_diameter; 189 | y_carriage_height = y_carriage_corners_holes_spacing[1] + y_carriage_corners_diameter; 190 | 191 | // ---------------------------------------------------------------- // 192 | // y rods 193 | // ---------------------------------------------------------------- // 194 | y_rod_pockets_spacing = y_rod_spacing ? y_rod_spacing : y_carriage_width / 2; 195 | 196 | // ---------------------------------------------------------------- // 197 | // horizontal plate 198 | // ---------------------------------------------------------------- // 199 | horizontal_plate_computed_borders = [horizontal_plate_borders[0] + horizontal_plate_borders[2], horizontal_plate_borders[1] + horizontal_plate_borders[3]]; 200 | horizontal_plate_inner_width = horizontal_plate_width - horizontal_plate_computed_borders[1]; 201 | horizontal_plate_inner_height = horizontal_plate_height - horizontal_plate_computed_borders[0]; 202 | 203 | // z motor mount auto spacing 204 | z_motor_spacing = z_motor_mount_spacing ? z_motor_mount_spacing : horizontal_plate_width - 60; 205 | 206 | // ---------------------------------------------------------------- // 207 | // vertical plate 208 | // ---------------------------------------------------------------- // 209 | vertical_plate_y_position = vertical_plate_position ? vertical_plate_position : (horizontal_plate_inner_height / 2) + horizontal_plate_borders[2] + 66; 210 | vertical_plate_computed_borders = [vertical_plate_borders[0], vertical_plate_borders[1] + vertical_plate_borders[3]]; 211 | vertical_plate_inner_width = vertical_plate_width - vertical_plate_computed_borders[1]; 212 | vertical_plate_inner_height = vertical_plate_height - vertical_plate_computed_borders[0]; 213 | 214 | triangle_max_width = horizontal_plate_height - vertical_plate_y_position - sheet_thickness; 215 | triangle_max_height = vertical_plate_inner_height - feet_height; 216 | 217 | _triangle_width = triangle_width && triangle_width <= triangle_max_width ? triangle_width : triangle_max_width; 218 | _triangle_height = triangle_height && triangle_height <= triangle_max_height ? triangle_height : triangle_max_height; 219 | _triangle_angle = triangle_angle ? triangle_angle : ceil((atan(_triangle_width / _triangle_height) / 4) * 3); 220 | -------------------------------------------------------------------------------- /scad/main.scad: -------------------------------------------------------------------------------- 1 | // iTopie RepRap - Main file 2 | // 3 | // @version 1.0.1 4 | // @license GPLv3 5 | // @docs http://reprap.org/wiki/ITopie 6 | // @sources https://github.com/lautr3k/RepRap-iTopie 7 | // @author Sébastien Mischler 8 | // @author http://www.onlfait.ch 9 | // 10 | include 11 | use 12 | use 13 | use 14 | use 15 | use 16 | 17 | // plates 18 | module plate1() { 19 | // horizontal plate 20 | translate([parts_margin, (parts_margin * 2) + feet_height + sheet_thickness, 0]) { 21 | horizontal_plate(); 22 | // y carriage 23 | translate([(horizontal_plate_width - y_carriage_width) / 2, horizontal_plate_borders[2] + y_idler_mount_height + parts_margin, 0]) 24 | y_carriage(); 25 | } 26 | // feet 27 | translate([parts_margin, parts_margin, 0]) 28 | feet(); 29 | } 30 | 31 | module plate2() { 32 | // vertical plate 33 | translate([parts_margin, (parts_margin * 2) + feet_height + sheet_thickness, 0]) { 34 | vertical_plate(); 35 | // triangles 36 | translate([vertical_plate_borders[3] + triangle_margin[3], triangle_margin[2], 0]) 37 | triangle(); 38 | // triangles 39 | rotate([0, 0, 180]) 40 | translate([-vertical_plate_width + vertical_plate_borders[1] + triangle_margin[3], -_triangle_height - triangle_margin[2] - triangle_connectors_size[0], 0]) 41 | triangle(); 42 | } 43 | // feet 44 | translate([parts_margin, parts_margin, 0]) 45 | feet(); 46 | } 47 | 48 | // parts module 49 | if (output_mode != 4) { 50 | 51 | if (output_type == 0) { 52 | plate1(); 53 | translate([-vertical_plate_width - (parts_margin * 2), 0, 0]) 54 | plate2(); 55 | } 56 | else if (output_type == 1) { 57 | plate1(); 58 | } 59 | else if (output_type == 2) { 60 | plate2(); 61 | } 62 | else { 63 | translate([parts_margin, parts_margin, 0]) { 64 | if (output_type == 3) horizontal_plate(); 65 | if (output_type == 4) vertical_plate(); 66 | if (output_type == 5) y_carriage(); 67 | if (output_type == 6) triangle(); 68 | if (output_type == 7) feet(); 69 | } 70 | } 71 | } 72 | 73 | // 3D build 74 | if (output_mode == 4) { 75 | // horizontal plate 76 | horizontal_plate(); 77 | // y carriage 78 | translate([(horizontal_plate_width - y_carriage_width) / 2, horizontal_plate_borders[2] + y_idler_mount_height + parts_margin, 0]) 79 | y_carriage(); 80 | // vertical plate 81 | rotate([90, 0, 0]) 82 | translate([0, -feet_height, -vertical_plate_y_position-sheet_thickness]) 83 | vertical_plate(); 84 | // feet 85 | rotate([90, 0, 0]) 86 | translate([0, -feet_height, -feet_connectors_margin[2] - feet_connectors_size[1]]) 87 | feet(); 88 | rotate([90, 0, 0]) 89 | translate([0, -feet_height, -horizontal_plate_height + feet_connectors_margin[0]]) 90 | feet(); 91 | // triangles 92 | translate([triangle_connectors_margin[3], vertical_plate_y_position, 0]) { 93 | rotate([90, 0, 90]) 94 | triangle(); 95 | } 96 | translate([vertical_plate_width - triangle_connectors_margin[1] - sheet_thickness, vertical_plate_y_position, 0]) { 97 | rotate([90, 0, 90]) 98 | triangle(); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /scad/parts/feet.scad: -------------------------------------------------------------------------------- 1 | // iTopie RepRap - Feet 2 | // 3 | // @version 1.0.1 4 | // @license GPLv3 5 | // @docs http://reprap.org/wiki/ITopie 6 | // @sources https://github.com/lautr3k/RepRap-iTopie 7 | // @author Sébastien Mischler 8 | // @author http://www.onlfait.ch 9 | // 10 | include <../config.scad> 11 | use <../shapes.scad> 12 | 13 | // feet 14 | module feet_2D() { 15 | render() difference() { 16 | rounded_square(feet_width, feet_height, corner_radius = [0, 0, feet_corners[3], feet_corners[0]]); 17 | translate([foot_width, 0, 0]) 18 | y_mount(feet_width - (foot_width * 2), feet_gap_height, [feet_corners[1], feet_corners[2], feet_corners[3], feet_corners[0]]); 19 | } 20 | translate([feet_connectors_margin[3], feet_height, 0]) 21 | square(connector_size); 22 | translate([(horizontal_plate_width - connector_size[0]) / 2, feet_height, 0]) 23 | square(connector_size); 24 | translate([horizontal_plate_width - connector_size[0] - feet_connectors_margin[1], feet_height, 0]) 25 | square(connector_size); 26 | } 27 | 28 | module feet_3D() { 29 | if (output_version == 1) { 30 | offset = sheet_thickness - pockets_depth; 31 | color(pockets_color) 32 | linear_extrude(offset) 33 | feet_2D(); 34 | translate([0, 0, offset]) 35 | linear_extrude(pockets_depth) 36 | feet_2D(); 37 | 38 | } 39 | else { 40 | linear_extrude(sheet_thickness) 41 | feet_2D(); 42 | } 43 | } 44 | 45 | module feet() { 46 | // 0 : 2D preview (default) 47 | // 1 : extruded view 48 | // 2 : export first layer 49 | // 3 : export second layer (pockets) 50 | if (output_mode == 0) { 51 | feet_2D(); 52 | } 53 | else if (output_mode == 1) { 54 | feet_3D(); 55 | } 56 | else if (output_mode == 2) { 57 | feet_2D(); 58 | } 59 | else if (output_mode == 3) { 60 | if (output_version == 1) 61 | feet_2D(); 62 | } 63 | else { 64 | feet_3D(); 65 | } 66 | } 67 | 68 | feet(); 69 | -------------------------------------------------------------------------------- /scad/parts/horizontal_plate.scad: -------------------------------------------------------------------------------- 1 | // iTopie RepRap - Horizontal plate 2 | // 3 | // @version 1.0.1 4 | // @license GPLv3 5 | // @docs http://reprap.org/wiki/ITopie 6 | // @sources https://github.com/lautr3k/RepRap-iTopie 7 | // @author Sébastien Mischler 8 | // @author http://www.onlfait.ch 9 | // 10 | include <../config.scad> 11 | use <../shapes.scad> 12 | 13 | // local configuration 14 | motor_pos = [(horizontal_plate_width - y_motor_mount_width) / 2, horizontal_plate_height - horizontal_plate_borders[0]]; 15 | idler_pos = [(horizontal_plate_width - y_idler_mount_width) / 2, horizontal_plate_borders[2]]; 16 | endstop_pos = [horizontal_plate_borders[3], horizontal_plate_height - y_endstop_mount_position]; 17 | 18 | // y idler pocket auto width 19 | _y_idler_pocket_width = y_idler_pocket_width ? y_idler_pocket_width : y_idler_mount_width - 20; 20 | 21 | 22 | // y endstop holes 23 | module y_endstop_holes() { 24 | holes_center = y_endstop_mount_height / 2; 25 | translate([horizontal_plate_borders[3], horizontal_plate_height - y_endstop_mount_position, 0]) { 26 | translate([7, -holes_center, 0]) 27 | circle(y_endstop_holes_radius); 28 | translate([7 + y_endstop_holes_spacing, -holes_center, 0]) 29 | circle(y_endstop_holes_radius); 30 | } 31 | } 32 | 33 | // y endstop mount 34 | module endstop_mount() { 35 | translate([endstop_pos[0], endstop_pos[1], 0]) 36 | rotate([0, 0, -90]) 37 | y_mount(y_endstop_mount_height, y_endstop_mount_width, y_endstop_mount_corners); 38 | } 39 | 40 | // horizontal base plate 41 | module horizontal_base_plate() { 42 | // base plate 43 | render() difference() { 44 | rounded_square(horizontal_plate_width, horizontal_plate_height, corner_radius = horizontal_plate_outer_corners); 45 | translate([horizontal_plate_borders[3], horizontal_plate_borders[2], 0]) 46 | rounded_square(horizontal_plate_inner_width, horizontal_plate_inner_height, corner_radius = horizontal_plate_inner_corners); 47 | } 48 | // motor mount 49 | translate([motor_pos[0], motor_pos[1], 0]) 50 | mirror([0, 1, 0]) 51 | y_mount(y_motor_mount_width, y_motor_mount_height, y_motor_mount_corners); 52 | // idler mount 53 | translate([idler_pos[0], idler_pos[1], 0]) 54 | y_mount(y_idler_mount_width, y_idler_mount_height, y_idler_mount_corners); 55 | // endstop mount 56 | endstop_mount(); 57 | } 58 | 59 | // feet holes 60 | module _feet_connectors_holes() { 61 | // feet connector holes 62 | translate([feet_connectors_margin[3], 0, 0]) 63 | square(feet_connectors_size); 64 | translate([(horizontal_plate_width - feet_connectors_size[0]) / 2, 0, 0]) 65 | square(feet_connectors_size); 66 | translate([horizontal_plate_width - feet_connectors_size[0] - feet_connectors_margin[1], 0, 0]) 67 | square(feet_connectors_size); 68 | // feet screws holes 69 | center = horizontal_plate_width / 2; 70 | half_pocket = feet_connectors_size[0] / 2; 71 | spacing_left = (center - feet_connectors_margin[3] - half_pocket) / 2; 72 | spacing_right = (center - feet_connectors_margin[1] - half_pocket) / 2; 73 | y_pos = feet_connectors_size[1] / 2; 74 | translate([center - spacing_left - feet_holes_margin, y_pos, 0]) 75 | circle(feet_holes_radius); 76 | translate([center + spacing_right + feet_holes_margin, y_pos, 0]) 77 | circle(feet_holes_radius); 78 | } 79 | 80 | // holes 81 | module feet_connectors_holes() { 82 | // feet connector holes (top) 83 | translate([0, horizontal_plate_height - feet_connectors_size[1] - feet_connectors_margin[0], 0]) 84 | _feet_connectors_holes(); 85 | // feet connector holes (bottom) 86 | translate([0, feet_connectors_margin[2], 0]) 87 | _feet_connectors_holes(); 88 | } 89 | 90 | // triangle screws holes 91 | module triangle_screws_holes() { 92 | center = triangle_connectors_size[0] / 2; 93 | translate([center, -triangle_holes_margin, 0]) 94 | circle(triangle_holes_radius); 95 | translate([center, triangle_connectors_size[1] + triangle_holes_margin, 0]) 96 | circle(triangle_holes_radius); 97 | } 98 | 99 | // triangle connectors holes 100 | module triangle_connectors_holes() { 101 | margin_top = horizontal_plate_height - triangle_connectors_size[1] - triangle_connectors_margin[0]; 102 | translate([triangle_connectors_margin[3], margin_top, 0]) { 103 | square(triangle_connectors_size); 104 | triangle_screws_holes(); 105 | } 106 | translate([horizontal_plate_width - triangle_connectors_size[0] - triangle_connectors_margin[1], margin_top, 0]) { 107 | square(triangle_connectors_size); 108 | triangle_screws_holes(); 109 | } 110 | } 111 | 112 | // vertical plate connectors holes 113 | module vertical_plate_holes() { 114 | translate([0, vertical_plate_y_position, 0]) 115 | square([foot_width, sheet_thickness]); 116 | translate([horizontal_plate_width - foot_width, vertical_plate_y_position, 0]) 117 | square([foot_width, sheet_thickness]); 118 | } 119 | 120 | // motor mount & z rod pockets 121 | // 0 = none, 1 = left, 2 = right 122 | module motor_mount(radius, z_holes = 0, centerOnly = 0) { 123 | if (centerOnly == 0) { 124 | circle(radius); 125 | translate([31, 0, 0]) 126 | circle(radius); 127 | translate([31, 31, 0]) 128 | circle(radius); 129 | translate([0, 31, 0]) 130 | circle(radius); 131 | } 132 | translate([15.5, 15.5, 0]) { 133 | circle(12); 134 | // z rod pockets 135 | if (z_holes == 1) { 136 | translate([-z_rod_spacing, 0, 0]) 137 | circle(z_rod_radius); 138 | } 139 | if (z_holes == 2) { 140 | translate([z_rod_spacing, 0, 0]) 141 | circle(z_rod_radius); 142 | } 143 | } 144 | } 145 | 146 | // z motors mounts 147 | module z_motor_mount() { 148 | y_position = vertical_plate_y_position - 36.5 - z_motor_mount_margin; 149 | translate([((horizontal_plate_width - z_motor_spacing) / 2) - 15.5, y_position, 0]) 150 | motor_mount(z_motor_holes_radius, 1); 151 | translate([((horizontal_plate_width + z_motor_spacing) / 2) - 15.5, y_position, 0]) 152 | motor_mount(z_motor_holes_radius, 2); 153 | } 154 | 155 | // y motor mount 156 | module y_motor_mount(centerOnly = 0) { 157 | translate([(horizontal_plate_width - 31) / 2, horizontal_plate_height - horizontal_plate_borders[0] - 27.5, 0]) { 158 | motor_mount(y_motor_holes_radius, 0, centerOnly); 159 | if (y_motor_mount_angle > 0) { 160 | render() translate([31, 31, 0]) 161 | for ( i = [1:y_motor_mount_angle] ) { 162 | rotate([0, 0, 180 + i]) 163 | motor_mount(y_motor_holes_radius, 0, centerOnly); 164 | } 165 | } 166 | } 167 | } 168 | 169 | module y_motor_pocket() { 170 | radius = (y_motor_mount_width - 24) / 4; 171 | translate([motor_pos[0], motor_pos[1] - y_motor_mount_height, 0]) { 172 | render() difference() { 173 | square([y_motor_mount_width, y_motor_mount_height]); 174 | translate([0, (y_motor_mount_height / 2) + radius, 0]) { 175 | translate([radius, 0, 0]) 176 | circle(radius); 177 | translate([y_motor_mount_width - radius, 0, 0]) 178 | circle(radius); 179 | square([y_motor_mount_width, (y_motor_mount_height / 2)]); 180 | } 181 | } 182 | } 183 | y_motor_mount(1); 184 | } 185 | 186 | module y_idler_pocket() { 187 | top_radius = _y_idler_pocket_width / 2; 188 | bottom_radius = (y_idler_mount_width - _y_idler_pocket_width) / 4; 189 | render() difference() { 190 | translate([(horizontal_plate_width - _y_idler_pocket_width) / 2, horizontal_plate_borders[2] + y_idler_mount_height, 0]) 191 | mirror([0, 1, 0]) 192 | y_mount(_y_idler_pocket_width, y_idler_pockets_height, [top_radius, top_radius, bottom_radius, bottom_radius]); 193 | } 194 | } 195 | 196 | // y idler mount 197 | module y_idler_hole() { 198 | translate([horizontal_plate_width / 2, horizontal_plate_borders[2] + y_idler_mount_height / 2, 0]) 199 | circle(y_idler_mount_hole_radius); 200 | } 201 | 202 | // y rod holes 203 | module _y_rod_holes() { 204 | center = y_rod_pockets_size[1] / 2; 205 | translate([-y_rod_holes_margin, center, 0]) 206 | circle(y_rod_holes_radius); 207 | translate([y_rod_pockets_size[0] + y_rod_holes_margin, center, 0]) 208 | circle(y_rod_holes_radius); 209 | } 210 | 211 | module y_rod_holes() { 212 | center = (horizontal_plate_width - y_rod_pockets_size[0]) / 2; 213 | spacing = y_rod_pockets_spacing / 2; 214 | translate([0, horizontal_plate_borders[2] - y_rod_pockets_size[1], 0]) { 215 | translate([center - spacing, 0, 0]) _y_rod_holes(); 216 | translate([center + spacing, 0, 0]) _y_rod_holes(); 217 | } 218 | translate([0, horizontal_plate_height - horizontal_plate_borders[0], 0]) { 219 | translate([center - spacing, 0, 0]) _y_rod_holes(); 220 | translate([center + spacing, 0, 0]) _y_rod_holes(); 221 | } 222 | } 223 | 224 | // y rod pockets 225 | module y_rod_pockets() { 226 | center = (horizontal_plate_width - y_rod_pockets_size[0]) / 2; 227 | spacing = y_rod_pockets_spacing / 2; 228 | translate([0, horizontal_plate_borders[2] - y_rod_pockets_size[1], 0]) { 229 | translate([center - spacing, 0, 0]) square(y_rod_pockets_size); 230 | translate([center + spacing, 0, 0]) square(y_rod_pockets_size); 231 | } 232 | translate([0, horizontal_plate_height - horizontal_plate_borders[0], 0]) { 233 | translate([center - spacing, 0, 0]) square(y_rod_pockets_size); 234 | translate([center + spacing, 0, 0]) square(y_rod_pockets_size); 235 | } 236 | } 237 | 238 | // holes 239 | module horizontal_plate_holes() { 240 | triangle_connectors_holes(); 241 | feet_connectors_holes(); 242 | vertical_plate_holes(); 243 | y_endstop_holes(); 244 | z_motor_mount(); 245 | y_motor_mount(); 246 | y_idler_hole(); 247 | y_rod_holes(); 248 | } 249 | 250 | // pockets 251 | module horizontal_plate_pockets() { 252 | color(pockets_color) { 253 | difference() { 254 | endstop_mount(); 255 | if (output_mode != 3) { 256 | y_endstop_holes(); 257 | } 258 | } 259 | difference() { 260 | y_idler_pocket(); 261 | if (output_mode != 3) { 262 | y_idler_hole(); 263 | } 264 | } 265 | difference() { 266 | y_motor_pocket(); 267 | if (output_mode != 3) { 268 | y_motor_mount(); 269 | } 270 | } 271 | y_rod_pockets(); 272 | } 273 | } 274 | 275 | // horizontal plate 2D 276 | module horizontal_plate_2D() { 277 | difference() { 278 | horizontal_base_plate(); 279 | horizontal_plate_holes(); 280 | } 281 | } 282 | 283 | // horizontal plate 3D 284 | module horizontal_plate_3D() { 285 | offset = sheet_thickness - pockets_depth; 286 | if (output_version == 1) { 287 | color(pockets_color) 288 | linear_extrude(offset) 289 | horizontal_plate_2D(); 290 | } 291 | y = output_version == 1 ? offset : 0; 292 | h = output_version == 1 ? pockets_depth : sheet_thickness; 293 | translate([0, 0, y]) 294 | render() difference() { 295 | linear_extrude(h) 296 | horizontal_plate_2D(); 297 | translate([0, 0, pockets_height - y]) 298 | linear_extrude(pockets_depth) 299 | horizontal_plate_pockets(); 300 | } 301 | } 302 | 303 | // horizontal plate 304 | module horizontal_plate() { 305 | // 0 : 2D preview (default) 306 | // 1 : extruded view 307 | // 2 : export first layer 308 | // 3 : export second layer (pockets) 309 | if (output_mode == 0) { 310 | horizontal_plate_2D(); 311 | horizontal_plate_pockets(); 312 | } 313 | else if (output_mode == 1) { 314 | horizontal_plate_3D(); 315 | } 316 | else if (output_mode == 2) { 317 | horizontal_plate_2D(); 318 | } 319 | else if (output_mode == 3) { 320 | difference() { 321 | if (output_version == 1) { 322 | horizontal_plate_2D(); 323 | } 324 | horizontal_plate_pockets(); 325 | } 326 | } 327 | else { 328 | horizontal_plate_3D(); 329 | } 330 | } 331 | 332 | horizontal_plate(); 333 | -------------------------------------------------------------------------------- /scad/parts/logo.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | ENTITIES 5 | 0 6 | LINE 7 | 8 8 | Grouper#3 9 | 10 10 | -2.469989271765901 11 | 20 12 | 20.433747236259162 13 | 30 14 | -8.125761375426963e-13 15 | 11 16 | 2.726141771890364 17 | 21 18 | 20.222289719322685 19 | 31 20 | 4.3163495999823646e-14 21 | 0 22 | LINE 23 | 8 24 | Grouper#3 25 | 10 26 | -3.6612125082126554 27 | 20 28 | 15.375506402718736 29 | 30 30 | -9.017445407503305e-13 31 | 11 32 | -2.469989271765901 33 | 21 34 | 20.433747236259162 35 | 31 36 | -8.125761375426963e-13 37 | 0 38 | LINE 39 | 8 40 | Grouper#3 41 | 10 42 | -7.877296107833903 43 | 20 44 | 13.502297570196504 45 | 30 46 | -1.7574845958768477e-12 47 | 11 48 | -3.6612125082126554 49 | 21 50 | 15.375506402718736 51 | 31 52 | -9.017445407503305e-13 53 | 0 54 | LINE 55 | 8 56 | Grouper#3 57 | 10 58 | -12.211700263105696 59 | 20 60 | 16.29324274558011 61 | 30 62 | -9.895457891946059e-13 63 | 11 64 | -7.877296107833903 65 | 21 66 | 13.502297570196504 67 | 31 68 | -1.7574845958768477e-12 69 | 0 70 | LINE 71 | 8 72 | Grouper#3 73 | 10 74 | -16.035442804165847 75 | 20 76 | 12.768546292833989 77 | 30 78 | -8.074232105901678e-13 79 | 11 80 | -12.211700263105696 81 | 21 82 | 16.29324274558011 83 | 31 84 | -9.895457891946059e-13 85 | 0 86 | LINE 87 | 8 88 | Grouper#3 89 | 10 90 | -13.301048438293362 91 | 20 92 | 8.349507870162084 93 | 30 94 | -1.308293647831111e-13 95 | 11 96 | -16.035442804165847 97 | 21 98 | 12.768546292833989 99 | 31 100 | -8.074232105901678e-13 101 | 0 102 | LINE 103 | 8 104 | Grouper#3 105 | 10 106 | -14.957711073579677 107 | 20 108 | 4.043727898765703 109 | 30 110 | 1.4099162575904062e-13 111 | 11 112 | -13.301048438293362 113 | 21 114 | 8.349507870162084 115 | 31 116 | -1.308293647831111e-13 117 | 0 118 | LINE 119 | 8 120 | Grouper#3 121 | 10 122 | -19.99609390360946 123 | 20 124 | 2.9523375876033873 125 | 30 126 | 5.241913652540895e-14 127 | 11 128 | -14.957711073579677 129 | 21 130 | 4.043727898765703 131 | 31 132 | 1.4099162575904062e-13 133 | 0 134 | LINE 135 | 8 136 | Grouper#3 137 | 10 138 | -20.2075514205435 139 | 20 140 | -2.2437934560526074 141 | 30 142 | 1.885733411287887e-13 143 | 11 144 | -19.99609390360946 145 | 21 146 | 2.9523375876033873 147 | 31 148 | 5.241913652540895e-14 149 | 0 150 | LINE 151 | 8 152 | Grouper#3 153 | 10 154 | -15.149310587003255 155 | 20 156 | -3.4350166924994516 157 | 30 158 | 1.1347313851758642e-12 159 | 11 160 | -20.2075514205435 161 | 21 162 | -2.2437934560526074 163 | 31 164 | 1.885733411287887e-13 165 | 0 166 | LINE 167 | 8 168 | Grouper#3 169 | 10 170 | -13.276101754480841 171 | 20 172 | -7.651100292120429 173 | 30 174 | -2.188206957782216e-13 175 | 11 176 | -15.149310587003255 177 | 21 178 | -3.4350166924994516 179 | 31 180 | 1.1347313851758642e-12 181 | 0 182 | LINE 183 | 8 184 | Grouper#3 185 | 10 186 | -16.067046929864627 187 | 20 188 | -11.985504447392401 189 | 30 190 | 8.203757458846613e-13 191 | 11 192 | -13.276101754480841 193 | 21 194 | -7.651100292120429 195 | 31 196 | -2.188206957782216e-13 197 | 0 198 | LINE 199 | 8 200 | Grouper#3 201 | 10 202 | -12.542350477118417 203 | 20 204 | -15.809246988452642 205 | 30 206 | -8.04444221622805e-13 207 | 11 208 | -16.067046929864627 209 | 21 210 | -11.985504447392401 211 | 31 212 | 8.203757458846613e-13 213 | 0 214 | LINE 215 | 8 216 | Grouper#3 217 | 10 218 | -8.123312054448677 219 | 20 220 | -13.074852622580067 221 | 30 222 | 9.623299289765475e-14 223 | 11 224 | -12.542350477118417 225 | 21 226 | -15.809246988452642 227 | 31 228 | -8.04444221622805e-13 229 | 0 230 | LINE 231 | 8 232 | Grouper#3 233 | 10 234 | -6.018300552724541 235 | 20 236 | -13.819927110085207 237 | 30 238 | 1.40825500231567e-13 239 | 11 240 | -8.123312054448677 241 | 21 242 | -13.074852622580067 243 | 31 244 | 9.623299289765475e-14 245 | 0 246 | LINE 247 | 8 248 | Grouper#3 249 | 10 250 | -2.2544419330499195 251 | 20 252 | -5.29527894950122 253 | 30 254 | 1.8361353778688567e-13 255 | 11 256 | -6.018300552724541 257 | 21 258 | -13.819927110085207 259 | 31 260 | 1.40825500231567e-13 261 | 0 262 | LINE 263 | 8 264 | Grouper#3 265 | 10 266 | -2.786497548356634 267 | 20 268 | -4.756377422414149 269 | 30 270 | 9.056087393063002e-13 271 | 11 272 | -2.2544419330499195 273 | 21 274 | -5.29527894950122 275 | 31 276 | 1.8361353778688567e-13 277 | 0 278 | LINE 279 | 8 280 | Grouper#3 281 | 10 282 | -3.1689198991829484 283 | 20 284 | -4.522335676533805 285 | 30 286 | -4.1818173475066956e-14 287 | 11 288 | -2.786497548356634 289 | 21 290 | -4.756377422414149 291 | 31 292 | 9.056087393063002e-13 293 | 0 294 | LINE 295 | 8 296 | Grouper#3 297 | 10 298 | -3.53179600750435 299 | 20 300 | -4.259004472086121 301 | 30 302 | -1.3198527170691853e-13 303 | 11 304 | -3.1689198991829484 305 | 21 306 | -4.522335676533805 307 | 31 308 | -4.1818173475066956e-14 309 | 0 310 | LINE 311 | 8 312 | Grouper#3 313 | 10 314 | -3.872887614027955 315 | 20 316 | -3.968008064573029 317 | 30 318 | -1.3192388169265878e-13 319 | 11 320 | -3.53179600750435 321 | 21 322 | -4.259004472086121 323 | 31 324 | -1.3198527170691853e-13 325 | 0 326 | LINE 327 | 8 328 | Grouper#3 329 | 10 330 | -4.190090828636677 331 | 20 332 | -3.6511413514769084 333 | 30 334 | -4.163438209257045e-14 335 | 11 336 | -3.872887614027955 337 | 21 338 | -3.968008064573029 339 | 31 340 | -1.3192388169265878e-13 341 | 0 342 | LINE 343 | 8 344 | Grouper#3 345 | 10 346 | -4.4814491074122325 347 | 20 348 | -3.3103588011382334 349 | 30 350 | 9.376345143800708e-14 351 | 11 352 | -4.190090828636677 353 | 21 354 | -3.6511413514769084 355 | 31 356 | -4.163438209257045e-14 357 | 0 358 | LINE 359 | 8 360 | Grouper#3 361 | 10 362 | -4.745165320811019 363 | 20 364 | -2.9477623973818012 365 | 30 366 | 9.379152073119225e-14 367 | 11 368 | -4.4814491074122325 369 | 21 370 | -3.3103588011382334 371 | 31 372 | 9.376345143800708e-14 373 | 0 374 | LINE 375 | 8 376 | Grouper#3 377 | 10 378 | -4.979612838553676 379 | 20 380 | -2.5655886742522203 381 | 30 382 | 1.3892750753559805e-13 383 | 11 384 | -4.745165320811019 385 | 21 386 | -2.9477623973818012 387 | 31 388 | 9.379152073119225e-14 389 | 0 390 | LINE 391 | 8 392 | Grouper#3 393 | 10 394 | -5.18334556285901 395 | 20 396 | -2.166194920829019 397 | 30 398 | -6.732179644802792e-13 399 | 11 400 | -4.979612838553676 401 | 21 402 | -2.5655886742522203 403 | 31 404 | 1.3892750753559805e-13 405 | 0 406 | LINE 407 | 8 408 | Grouper#3 409 | 10 410 | -5.355106848130263 411 | 20 412 | -1.7520446412102784 413 | 30 414 | 1.3892557925643923e-13 415 | 11 416 | -5.18334556285901 417 | 21 418 | -2.166194920829019 419 | 31 420 | -6.732179644802792e-13 421 | 0 422 | LINE 423 | 8 424 | Grouper#3 425 | 10 426 | -5.493837252084459 427 | 20 428 | -1.3256923593527168 429 | 30 430 | 2.742655309497763e-13 431 | 11 432 | -5.355106848130263 433 | 21 434 | -1.7520446412102784 435 | 31 436 | 1.3892557925643923e-13 437 | 0 438 | LINE 439 | 8 440 | Grouper#3 441 | 10 442 | -5.5986810705054 443 | 20 444 | -0.8897678624895703 445 | 30 446 | 4.8638250381744756e-14 447 | 11 448 | -5.493837252084459 449 | 21 450 | -1.3256923593527168 451 | 31 452 | 2.742655309497763e-13 453 | 0 454 | LINE 455 | 8 456 | Grouper#3 457 | 10 458 | -5.668991615320335 459 | 20 460 | -0.4469599803169231 461 | 30 462 | 8.60747297704755e-13 463 | 11 464 | -5.5986810705054 465 | 21 466 | -0.8897678624895703 467 | 31 468 | 4.8638250381744756e-14 469 | 0 470 | LINE 471 | 8 472 | Grouper#3 473 | 10 474 | -5.704335203444272 475 | 20 476 | -2.8199664825478975e-15 477 | 30 478 | 9.366403185509592e-14 479 | 11 480 | -5.668991615320335 481 | 21 482 | -0.4469599803169231 483 | 31 484 | 8.60747297704755e-13 485 | 0 486 | LINE 487 | 8 488 | Grouper#3 489 | 10 490 | -5.704493831783027 491 | 20 492 | 0.44835518070327607 493 | 30 494 | 9.057512363879636e-13 495 | 11 496 | -5.704335203444272 497 | 21 498 | -2.8199664825478975e-15 499 | 31 500 | 9.366403185509592e-14 501 | 0 502 | LINE 503 | 8 504 | Grouper#3 505 | 10 506 | -5.669466521898651 507 | 20 508 | 0.8953400582871559 509 | 30 510 | 4.8407912877620975e-14 511 | 11 512 | -5.704493831783027 513 | 21 514 | 0.44835518070327607 515 | 31 516 | 9.057512363879636e-13 517 | 0 518 | LINE 519 | 8 520 | Grouper#3 521 | 10 522 | -5.599469326048215 523 | 20 524 | 1.3381975814246643 525 | 30 526 | 1.8368287428432527e-13 527 | 11 528 | -5.669466521898651 529 | 21 530 | 0.8953400582871559 531 | 31 532 | 4.8407912877620975e-14 533 | 0 534 | LINE 535 | 8 536 | Grouper#3 537 | 10 538 | -5.4949339945465185 539 | 20 540 | 1.7741961567596958 541 | 30 542 | -6.736797685018397e-13 543 | 11 544 | -5.599469326048215 545 | 21 546 | 1.3381975814246643 547 | 31 548 | 1.8368287428432527e-13 549 | 0 550 | LINE 551 | 8 552 | Grouper#3 553 | 10 554 | -5.356505312684315 555 | 20 556 | 2.200646497672079 557 | 30 558 | 1.3836891664277632e-13 559 | 11 560 | -5.4949339945465185 561 | 21 562 | 1.7741961567596958 563 | 31 564 | -6.736797685018397e-13 565 | 0 566 | LINE 567 | 8 568 | Grouper#3 569 | 10 570 | -5.185037123623012 571 | 20 572 | 2.6149182120898047 573 | 30 574 | -7.190107585573209e-13 575 | 11 576 | -5.356505312684315 577 | 21 578 | 2.200646497672079 579 | 31 580 | 1.3836891664277632e-13 581 | 0 582 | LINE 583 | 8 584 | Grouper#3 585 | 10 586 | -4.981587061797829 587 | 20 588 | 3.014456027033079 589 | 30 590 | 4.7902735170029044e-14 591 | 11 592 | -5.185037123623012 593 | 21 594 | 2.6149182120898047 595 | 31 596 | -7.190107585573209e-13 597 | 0 598 | LINE 599 | 8 600 | Grouper#3 601 | 10 602 | -4.74741002931148 603 | 20 604 | 3.3967955498165017 605 | 30 606 | 1.380174721371e-13 607 | 11 608 | -4.981587061797829 609 | 21 610 | 3.014456027033079 611 | 31 612 | 4.7902735170029044e-14 613 | 0 614 | LINE 615 | 8 616 | Grouper#3 617 | 10 618 | -4.483950455562749 619 | 20 620 | 3.7595784686903597 621 | 30 622 | 1.130515448591065e-12 623 | 11 624 | -4.74741002931148 625 | 21 626 | 3.3967955498165017 627 | 31 628 | 1.380174721371e-13 629 | 0 630 | LINE 631 | 8 632 | Grouper#3 633 | 10 634 | -4.192833387849985 635 | 20 636 | 4.100567099164607 637 | 30 638 | 2.7311018080962077e-13 639 | 11 640 | -4.483950455562749 641 | 21 642 | 3.7595784686903597 643 | 31 644 | 1.130515448591065e-12 645 | 0 646 | LINE 647 | 8 648 | Grouper#3 649 | 10 650 | -3.87585446790067 651 | 20 652 | 4.417658186289602 653 | 30 654 | -8.098968017456028e-13 655 | 11 656 | -4.192833387849985 657 | 21 658 | 4.100567099164607 659 | 31 660 | 2.7311018080962077e-13 661 | 0 662 | LINE 663 | 8 664 | Grouper#3 665 | 10 666 | -3.5349688561587937 667 | 20 668 | 4.708895877761575 669 | 30 670 | 3.179464044768718e-13 671 | 11 672 | -3.87585446790067 673 | 21 674 | 4.417658186289602 675 | 31 676 | -8.098968017456028e-13 677 | 0 678 | LINE 679 | 8 680 | Grouper#3 681 | 10 682 | -3.1722791721437757 683 | 20 684 | 4.972483787832452 685 | 30 686 | 2.7268090484492157e-13 687 | 11 688 | -3.5349688561587937 689 | 21 690 | 4.708895877761575 691 | 31 692 | 3.179464044768718e-13 693 | 0 694 | LINE 695 | 8 696 | Grouper#3 697 | 10 698 | -2.7900225252630846 699 | 20 700 | 5.206796077612134 701 | 30 702 | 8.59086148954579e-13 703 | 11 704 | -3.1722791721437757 705 | 21 706 | 4.972483787832452 707 | 31 708 | 2.7268090484492157e-13 709 | 0 710 | LINE 711 | 8 712 | Grouper#3 713 | 10 714 | -2.3905567160782497 715 | 20 716 | 5.41038748341958 717 | 30 718 | 9.19066446415117e-14 719 | 11 720 | -2.7900225252630846 721 | 21 722 | 5.206796077612134 723 | 31 724 | 8.59086148954579e-13 725 | 0 726 | LINE 727 | 8 728 | Grouper#3 729 | 10 730 | -1.9763456931354555 731 | 20 732 | 5.582002231326728 733 | 30 734 | 1.3687756721336278e-13 735 | 11 736 | -2.3905567160782497 737 | 21 738 | 5.41038748341958 739 | 31 740 | 9.19066446415117e-14 741 | 0 742 | LINE 743 | 8 744 | Grouper#3 745 | 10 746 | -1.5499443550632677 747 | 20 748 | 5.720581782908332 749 | 30 750 | -8.886729641030252e-14 751 | 11 752 | -1.9763456931354555 753 | 21 754 | 5.582002231326728 755 | 31 756 | 1.3687756721336278e-13 757 | 0 758 | LINE 759 | 8 760 | Grouper#3 761 | 10 762 | -1.1139827916784086 763 | 20 764 | 5.825271364421809 765 | 30 766 | 9.036152666295312e-13 767 | 11 768 | -1.5499443550632677 769 | 21 770 | 5.720581782908332 771 | 31 772 | -8.886729641030252e-14 773 | 0 774 | LINE 775 | 8 776 | Grouper#3 777 | 10 778 | -0.6711500613074819 779 | 20 780 | 5.895425239145431 781 | 30 782 | 8.583529686106049e-13 783 | 11 784 | -1.1139827916784086 785 | 21 786 | 5.825271364421809 787 | 31 788 | 9.036152666295312e-13 789 | 0 790 | LINE 791 | 8 792 | Grouper#3 793 | 10 794 | -0.22417760438229245 795 | 20 796 | 5.930610690351597 797 | 30 798 | -8.112063378195617e-13 799 | 11 800 | -0.6711500613074819 801 | 21 802 | 5.895425239145431 803 | 31 804 | 8.583529686106049e-13 805 | 0 806 | LINE 807 | 8 808 | Grouper#3 809 | 10 810 | 0.22417760438231502 811 | 20 812 | 5.930610690351597 813 | 30 814 | 9.104833165499547e-14 815 | 11 816 | -0.22417760438229245 817 | 21 818 | 5.930610690351597 819 | 31 820 | -8.112063378195617e-13 821 | 0 822 | LINE 823 | 8 824 | Grouper#3 825 | 10 826 | 0.6711500613078654 827 | 20 828 | 5.895425239145431 829 | 30 830 | 1.3603856451394412e-13 831 | 11 832 | 0.22417760438231502 833 | 21 834 | 5.930610690351597 835 | 31 836 | 9.104833165499547e-14 837 | 0 838 | LINE 839 | 8 840 | Grouper#3 841 | 10 842 | 1.113982791678431 843 | 20 844 | 5.825271364421809 845 | 30 846 | 1.3591550484108518e-13 847 | 11 848 | 0.6711500613078654 849 | 21 850 | 5.895425239145431 851 | 31 852 | 1.3603856451394412e-13 853 | 0 854 | LINE 855 | 8 856 | Grouper#3 857 | 10 858 | 1.5499443550632903 859 | 20 860 | 5.7205817829082415 861 | 30 862 | 9.06799116818626e-14 863 | 11 864 | 1.113982791678431 865 | 21 866 | 5.825271364421809 867 | 31 868 | 1.3591550484108518e-13 869 | 0 870 | LINE 871 | 8 872 | Grouper#3 873 | 10 874 | 1.976345693135839 875 | 20 876 | 5.582002231326728 877 | 30 878 | 8.576023120298403e-13 879 | 11 880 | 1.5499443550632903 881 | 21 882 | 5.7205817829082415 883 | 31 884 | 9.06799116818626e-14 885 | 0 886 | LINE 887 | 8 888 | Grouper#3 889 | 10 890 | 2.390556716078272 891 | 20 892 | 5.41038748341958 893 | 30 894 | 4.535179781875474e-14 895 | 11 896 | 1.976345693135839 897 | 21 898 | 5.582002231326728 899 | 31 900 | 8.576023120298403e-13 901 | 0 902 | LINE 903 | 8 904 | Grouper#3 905 | 10 906 | 2.7900225252631072 907 | 20 908 | 5.206796077612044 909 | 30 910 | 9.03800278124016e-14 911 | 11 912 | 2.390556716078272 913 | 21 914 | 5.41038748341958 915 | 31 916 | 4.535179781875474e-14 917 | 0 918 | LINE 919 | 8 920 | Grouper#3 921 | 10 922 | 3.1722791721441594 923 | 20 924 | 4.972483787832452 925 | 30 926 | 1.128045955912628e-12 927 | 11 928 | 2.7900225252631072 929 | 21 930 | 5.206796077612044 931 | 31 932 | 9.03800278124016e-14 933 | 0 934 | LINE 935 | 8 936 | Grouper#3 937 | 10 938 | 3.5349688561591774 939 | 20 940 | 4.708895877761575 941 | 30 942 | 1.127974218850596e-12 943 | 11 944 | 3.1722791721441594 945 | 21 946 | 4.972483787832452 947 | 31 948 | 1.128045955912628e-12 949 | 0 950 | LINE 951 | 8 952 | Grouper#3 953 | 10 954 | 3.8758544679006928 955 | 20 956 | 4.417658186289512 957 | 30 958 | 9.016525910830519e-14 959 | 11 960 | 3.5349688561591774 961 | 21 962 | 4.708895877761575 963 | 31 964 | 1.127974218850596e-12 965 | 0 966 | LINE 967 | 8 968 | Grouper#3 969 | 10 970 | 4.192833387850008 971 | 20 972 | 4.1005670991645164 973 | 30 974 | 1.1278624514877063e-12 975 | 11 976 | 3.8758544679006928 977 | 21 978 | 4.417658186289512 979 | 31 980 | 9.016525910830519e-14 981 | 0 982 | LINE 983 | 8 984 | Grouper#3 985 | 10 986 | 4.483950455563133 987 | 20 988 | 3.7595784686903597 989 | 30 990 | 2.705532998855341e-13 991 | 11 992 | 4.192833387850008 993 | 21 994 | 4.1005670991645164 995 | 31 996 | 1.1278624514877063e-12 997 | 0 998 | LINE 999 | 8 1000 | Grouper#3 1001 | 10 1002 | 4.747410029311503 1003 | 20 1004 | 3.3967955498165017 1005 | 30 1006 | 1.351669427652339e-13 1007 | 11 1008 | 4.483950455563133 1009 | 21 1010 | 3.7595784686903597 1011 | 31 1012 | 2.705532998855341e-13 1013 | 0 1014 | LINE 1015 | 8 1016 | Grouper#3 1017 | 10 1018 | 4.981587061798212 1019 | 20 1020 | 3.014456027033079 1021 | 30 1022 | 4.491159681237915e-14 1023 | 11 1024 | 4.747410029311503 1025 | 21 1026 | 3.3967955498165017 1027 | 31 1028 | 1.351669427652339e-13 1029 | 0 1030 | LINE 1031 | 8 1032 | Grouper#3 1033 | 10 1034 | 5.185037123623395 1035 | 20 1036 | 2.6149182120898047 1037 | 30 1038 | 1.351457544604331e-13 1039 | 11 1040 | 4.981587061798212 1041 | 21 1042 | 3.014456027033079 1043 | 31 1044 | 4.491159681237915e-14 1045 | 0 1046 | LINE 1047 | 8 1048 | Grouper#3 1049 | 10 1050 | 5.356505312684699 1051 | 20 1052 | 2.200646497672079 1053 | 30 1054 | 9.003319908463523e-14 1055 | 11 1056 | 5.185037123623395 1057 | 21 1058 | 2.6149182120898047 1059 | 31 1060 | 1.351457544604331e-13 1061 | 0 1062 | LINE 1063 | 8 1064 | Grouper#3 1065 | 10 1066 | 5.494933994546901 1067 | 20 1068 | 1.7741961567596958 1069 | 30 1070 | -6.769791402963996e-13 1071 | 11 1072 | 5.356505312684699 1073 | 21 1074 | 2.200646497672079 1075 | 31 1076 | 9.003319908463523e-14 1077 | 0 1078 | LINE 1079 | 8 1080 | Grouper#3 1081 | 10 1082 | 5.599469326048599 1083 | 20 1084 | 1.3381975814246643 1085 | 30 1086 | 9.473516186695881e-13 1087 | 11 1088 | 5.494933994546901 1089 | 21 1090 | 1.7741961567596958 1091 | 31 1092 | -6.769791402963996e-13 1093 | 0 1094 | LINE 1095 | 8 1096 | Grouper#3 1097 | 10 1098 | 5.669466521899035 1099 | 20 1100 | 0.8953400582871559 1101 | 30 1102 | 4.500374497476372e-14 1103 | 11 1104 | 5.599469326048599 1105 | 21 1106 | 1.3381975814246643 1107 | 31 1108 | 9.473516186695881e-13 1109 | 0 1110 | LINE 1111 | 8 1112 | Grouper#3 1113 | 10 1114 | 5.70449383178305 1115 | 20 1116 | 0.44835518070327607 1117 | 30 1118 | 1.3529515347475663e-13 1119 | 11 1120 | 5.669466521899035 1121 | 21 1122 | 0.8953400582871559 1123 | 31 1124 | 4.500374497476372e-14 1125 | 0 1126 | LINE 1127 | 8 1128 | Grouper#3 1129 | 10 1130 | 5.704335203444655 1131 | 20 1132 | -2.8199664825478975e-15 1133 | 30 1134 | 0.0 1135 | 11 1136 | 5.70449383178305 1137 | 21 1138 | 0.44835518070327607 1139 | 31 1140 | 1.3529515347475663e-13 1141 | 0 1142 | LINE 1143 | 8 1144 | Grouper#3 1145 | 10 1146 | 5.668991615320719 1147 | 20 1148 | -0.44695998031701334 1149 | 30 1150 | 1.3543199542199147e-13 1151 | 11 1152 | 5.704335203444655 1153 | 21 1154 | -2.8199664825478975e-15 1155 | 31 1156 | 0.0 1157 | 0 1158 | LINE 1159 | 8 1160 | Grouper#3 1161 | 10 1162 | 5.598681070505422 1163 | 20 1164 | -0.8897678624896606 1165 | 30 1166 | 1.3551551225475662e-13 1167 | 11 1168 | 5.668991615320719 1169 | 21 1170 | -0.44695998031701334 1171 | 31 1172 | 1.3543199542199147e-13 1173 | 0 1174 | LINE 1175 | 8 1176 | Grouper#3 1177 | 10 1178 | 5.493837252084843 1179 | 20 1180 | -1.3256923593528072 1181 | 30 1182 | 3.160862814027543e-13 1183 | 11 1184 | 5.598681070505422 1185 | 21 1186 | -0.8897678624896606 1187 | 31 1188 | 1.3551551225475662e-13 1189 | 0 1190 | LINE 1191 | 8 1192 | Grouper#3 1193 | 10 1194 | 5.355106848130647 1195 | 20 1196 | -1.7520446412102784 1197 | 30 1198 | 4.5471237669966584e-14 1199 | 11 1200 | 5.493837252084843 1201 | 21 1202 | -1.3256923593528072 1203 | 31 1204 | 3.160862814027543e-13 1205 | 0 1206 | LINE 1207 | 8 1208 | Grouper#3 1209 | 10 1210 | 5.183345562859032 1211 | 20 1212 | -2.166194920829019 1213 | 30 1214 | 1.8093956421625796e-13 1215 | 11 1216 | 5.355106848130647 1217 | 21 1218 | -1.7520446412102784 1219 | 31 1220 | 4.5471237669966584e-14 1221 | 0 1222 | LINE 1223 | 8 1224 | Grouper#3 1225 | 10 1226 | 4.979612838553699 1227 | 20 1228 | -2.5655886742522203 1229 | 30 1230 | 8.578489741105255e-13 1231 | 11 1232 | 5.183345562859032 1233 | 21 1234 | -2.166194920829019 1235 | 31 1236 | 1.8093956421625796e-13 1237 | 0 1238 | LINE 1239 | 8 1240 | Grouper#3 1241 | 10 1242 | 4.745165320811041 1243 | 20 1244 | -2.9477623973818012 1245 | 30 1246 | 1.3606180289026088e-13 1247 | 11 1248 | 4.979612838553699 1249 | 21 1250 | -2.5655886742522203 1251 | 31 1252 | 8.578489741105255e-13 1253 | 0 1254 | LINE 1255 | 8 1256 | Grouper#3 1257 | 10 1258 | 4.481449107412616 1259 | 20 1260 | -3.3103588011382334 1261 | 30 1262 | -4.428577582867958e-14 1263 | 11 1264 | 4.745165320811041 1265 | 21 1266 | -2.9477623973818012 1267 | 31 1268 | 1.3606180289026088e-13 1269 | 0 1270 | LINE 1271 | 8 1272 | Grouper#3 1273 | 10 1274 | 4.190090828637061 1275 | 20 1276 | -3.6511413514769084 1277 | 30 1278 | 9.120811579232643e-14 1279 | 11 1280 | 4.481449107412616 1281 | 21 1282 | -3.3103588011382334 1283 | 31 1284 | -4.428577582867958e-14 1285 | 0 1286 | LINE 1287 | 8 1288 | Grouper#3 1289 | 10 1290 | 3.872887614028339 1291 | 20 1292 | -3.968008064573029 1293 | 30 1294 | 1.8158693220558514e-13 1295 | 11 1296 | 4.190090828637061 1297 | 21 1298 | -3.6511413514769084 1299 | 31 1300 | 9.120811579232643e-14 1301 | 0 1302 | LINE 1303 | 8 1304 | Grouper#3 1305 | 10 1306 | 3.5317960075047337 1307 | 20 1308 | -4.259004472086121 1309 | 30 1310 | 9.149141939840933e-14 1311 | 11 1312 | 3.872887614028339 1313 | 21 1314 | -3.968008064573029 1315 | 31 1316 | 1.8158693220558514e-13 1317 | 0 1318 | LINE 1319 | 8 1320 | Grouper#3 1321 | 10 1322 | 3.168919899183332 1323 | 20 1324 | -4.522335676533805 1325 | 30 1326 | -8.884037978472706e-14 1327 | 11 1328 | 3.5317960075047337 1329 | 21 1330 | -4.259004472086121 1331 | 31 1332 | 9.149141939840933e-14 1333 | 0 1334 | LINE 1335 | 8 1336 | Grouper#3 1337 | 10 1338 | 2.7864975483566563 1339 | 20 1340 | -4.756377422414239 1341 | 30 1342 | 4.6665807255635364e-14 1343 | 11 1344 | 3.168919899183332 1345 | 21 1346 | -4.522335676533805 1347 | 31 1348 | -8.884037978472706e-14 1349 | 0 1350 | LINE 1351 | 8 1352 | Grouper#3 1353 | 10 1354 | 2.3868877776669803 1355 | 20 1356 | -4.959686114790469 1357 | 30 1358 | 2.272922865738513e-13 1359 | 11 1360 | 2.7864975483566563 1361 | 21 1362 | -4.756377422414239 1363 | 31 1364 | 4.6665807255635364e-14 1365 | 0 1366 | LINE 1367 | 8 1368 | Grouper#3 1369 | 10 1370 | 5.676948112366476 1371 | 20 1372 | -13.677522566358137 1373 | 30 1374 | -8.830302928658898e-14 1375 | 11 1376 | 2.3868877776669803 1377 | 21 1378 | -4.959686114790469 1379 | 31 1380 | 2.272922865738513e-13 1381 | 0 1382 | LINE 1383 | 8 1384 | Grouper#3 1385 | 10 1386 | 7.877296107834287 1387 | 20 1388 | -13.049905938767637 1389 | 30 1390 | 1.3654524739125932e-13 1391 | 11 1392 | 5.676948112366476 1393 | 21 1394 | -13.677522566358137 1395 | 31 1396 | -8.830302928658898e-14 1397 | 0 1398 | LINE 1399 | 8 1400 | Grouper#3 1401 | 10 1402 | 12.2117002631068 1403 | 20 1404 | -15.840851114151242 1405 | 30 1406 | 1.0380265983773728e-12 1407 | 11 1408 | 7.877296107834287 1409 | 21 1410 | -13.049905938767637 1411 | 31 1412 | 1.3654524739125932e-13 1413 | 0 1414 | LINE 1415 | 8 1416 | Grouper#3 1417 | 10 1418 | 16.03544280416695 1419 | 20 1420 | -12.316154661405122 1421 | 30 1422 | 4.375367279914011e-14 1423 | 11 1424 | 12.2117002631068 1425 | 21 1426 | -15.840851114151242 1427 | 31 1428 | 1.0380265983773728e-12 1429 | 0 1430 | LINE 1431 | 8 1432 | Grouper#3 1433 | 10 1434 | 13.301048438294467 1435 | 20 1436 | -7.897116238735473 1437 | 30 1438 | 1.3419071024511167e-13 1439 | 11 1440 | 16.03544280416695 1441 | 21 1442 | -12.316154661405122 1443 | 31 1444 | 4.375367279914011e-14 1445 | 0 1446 | LINE 1447 | 8 1448 | Grouper#3 1449 | 10 1450 | 14.957711073580782 1451 | 20 1452 | -3.591336267339002 1453 | 30 1454 | 8.796703830679175e-14 1455 | 11 1456 | 13.301048438294467 1457 | 21 1458 | -7.897116238735473 1459 | 31 1460 | 1.3419071024511167e-13 1461 | 0 1462 | LINE 1463 | 8 1464 | Grouper#3 1465 | 10 1466 | 19.996093903610205 1467 | 20 1468 | -2.4999459561766866 1469 | 30 1470 | -4.905779106340806e-14 1471 | 11 1472 | 14.957711073580782 1473 | 21 1474 | -3.591336267339002 1475 | 31 1476 | 8.796703830679175e-14 1477 | 0 1478 | LINE 1479 | 8 1480 | Grouper#3 1481 | 10 1482 | 20.207551420544604 1483 | 20 1484 | 2.6961850874792175 1485 | 30 1486 | 8.550478665781003e-14 1487 | 11 1488 | 19.996093903610205 1489 | 21 1490 | -2.4999459561766866 1491 | 31 1492 | -4.905779106340806e-14 1493 | 0 1494 | LINE 1495 | 8 1496 | Grouper#3 1497 | 10 1498 | 15.149310587003999 1499 | 20 1500 | 3.8874083239260617 1501 | 30 1502 | -6.801754025061999e-13 1503 | 11 1504 | 20.207551420544604 1505 | 21 1506 | 2.6961850874792175 1507 | 31 1508 | 8.550478665781003e-14 1509 | 0 1510 | LINE 1511 | 8 1512 | Grouper#3 1513 | 10 1514 | 13.276101754481946 1515 | 20 1516 | 8.10349192354713 1517 | 30 1518 | 1.3194311379868946e-13 1519 | 11 1520 | 15.149310587003999 1521 | 21 1522 | 3.8874083239260617 1523 | 31 1524 | -6.801754025061999e-13 1525 | 0 1526 | LINE 1527 | 8 1528 | Grouper#3 1529 | 10 1530 | 16.06704692986537 1531 | 20 1532 | 12.437896078819012 1533 | 30 1534 | 1.3049433771343344e-13 1535 | 11 1536 | 13.276101754481946 1537 | 21 1538 | 8.10349192354713 1539 | 31 1540 | 1.3194311379868946e-13 1541 | 0 1542 | LINE 1543 | 8 1544 | Grouper#3 1545 | 10 1546 | 12.542350477119161 1547 | 20 1548 | 16.261638619879253 1549 | 30 1550 | 1.3101361127331037e-13 1551 | 11 1552 | 16.06704692986537 1553 | 21 1554 | 12.437896078819012 1555 | 31 1556 | 1.3049433771343344e-13 1557 | 0 1558 | LINE 1559 | 8 1560 | Grouper#3 1561 | 10 1562 | 8.123312054449059 1563 | 20 1564 | 13.527244254006769 1565 | 30 1566 | -8.147830669679156e-13 1567 | 11 1568 | 12.542350477119161 1569 | 21 1570 | 16.261638619879253 1571 | 31 1572 | 1.3101361127331037e-13 1573 | 0 1574 | LINE 1575 | 8 1576 | Grouper#3 1577 | 10 1578 | 3.8175320830524995 1579 | 20 1580 | 15.183906889293084 1581 | 30 1582 | 1.7890432774283312e-13 1583 | 11 1584 | 8.123312054449059 1585 | 21 1586 | 13.527244254006769 1587 | 31 1588 | -8.147830669679156e-13 1589 | 0 1590 | LINE 1591 | 8 1592 | Grouper#3 1593 | 10 1594 | 2.726141771890364 1595 | 20 1596 | 20.222289719322685 1597 | 30 1598 | 4.3163495999823646e-14 1599 | 11 1600 | 3.8175320830524995 1601 | 21 1602 | 15.183906889293084 1603 | 31 1604 | 1.7890432774283312e-13 1605 | 0 1606 | LINE 1607 | 8 1608 | Grouper#3 1609 | 10 1610 | 70.32380368875607 1611 | 20 1612 | -1.0440664482635427 1613 | 30 1614 | -6.509253633170464e-13 1615 | 11 1616 | 60.632636301480154 1617 | 21 1618 | -1.0440664482635427 1619 | 31 1620 | -4.675380317809702e-13 1621 | 0 1622 | LINE 1623 | 8 1624 | Grouper#3 1625 | 10 1626 | 70.32380368875607 1627 | 20 1628 | 2.2172059421008044 1629 | 30 1630 | -6.965044626586415e-13 1631 | 11 1632 | 70.32380368875607 1633 | 21 1634 | -1.0440664482635427 1635 | 31 1636 | -6.509253633170464e-13 1637 | 0 1638 | LINE 1639 | 8 1640 | Grouper#3 1641 | 10 1642 | 70.11765791976293 1643 | 20 1644 | 5.392777282434393 1645 | 30 1646 | -8.773679857064376e-13 1647 | 11 1648 | 70.32380368875607 1649 | 21 1650 | 2.2172059421008044 1651 | 31 1652 | -6.965044626586415e-13 1653 | 0 1654 | LINE 1655 | 8 1656 | Grouper#3 1657 | 10 1658 | 69.49922061278352 1659 | 20 1660 | 7.766927992749391 1661 | 30 1662 | -6.519196071102071e-13 1663 | 11 1664 | 70.11765791976293 1665 | 21 1666 | 5.392777282434393 1667 | 31 1668 | -8.773679857064376e-13 1669 | 0 1670 | LINE 1671 | 8 1672 | Grouper#3 1673 | 10 1674 | 68.36889325021399 1675 | 20 1676 | 9.545803842039117 1677 | 30 1678 | -1.057906144710435e-12 1679 | 11 1680 | 69.49922061278352 1681 | 21 1682 | 7.766927992749391 1683 | 31 1684 | -6.519196071102071e-13 1685 | 0 1686 | LINE 1687 | 8 1688 | Grouper#3 1689 | 10 1690 | 66.62707731445121 1691 | 20 1692 | 10.935550599296619 1693 | 30 1694 | -6.966233754262221e-13 1695 | 11 1696 | 68.36889325021399 1697 | 21 1698 | 9.545803842039117 1699 | 31 1700 | -1.057906144710435e-12 1701 | 0 1702 | LINE 1703 | 8 1704 | Grouper#3 1705 | 10 1706 | 64.3038839852358 1707 | 20 1708 | 11.831937257727752 1709 | 30 1710 | -7.411717058995098e-13 1711 | 11 1712 | 66.62707731445121 1713 | 21 1714 | 10.935550599296619 1715 | 31 1716 | -6.966233754262221e-13 1717 | 0 1718 | LINE 1719 | 8 1720 | Grouper#3 1721 | 10 1722 | 61.42942444230799 1723 | 20 1724 | 12.13073281053819 1725 | 30 1726 | -5.147535302208181e-13 1727 | 11 1728 | 64.3038839852358 1729 | 21 1730 | 11.831937257727752 1731 | 31 1732 | -7.411717058995098e-13 1733 | 0 1734 | LINE 1735 | 8 1736 | Grouper#3 1737 | 10 1738 | 59.00200010629807 1739 | 20 1740 | 11.88289463882725 1741 | 30 1742 | -6.944676954817956e-13 1743 | 11 1744 | 61.42942444230799 1745 | 21 1746 | 12.13073281053819 1747 | 31 1748 | -5.147535302208181e-13 1749 | 0 1750 | LINE 1751 | 8 1752 | Grouper#3 1753 | 10 1754 | 56.871055078503076 1755 | 20 1756 | 11.139380123694425 1757 | 30 1758 | -7.388426190352211e-13 1759 | 11 1760 | 59.00200010629807 1761 | 21 1762 | 11.88289463882725 1763 | 31 1764 | -6.944676954817956e-13 1765 | 0 1766 | LINE 1767 | 8 1768 | Grouper#3 1769 | 10 1770 | 55.16629905626708 1771 | 20 1772 | 9.930300444880313 1773 | 30 1774 | -6.479214860460062e-13 1775 | 11 1776 | 56.871055078503076 1777 | 21 1778 | 11.139380123694425 1779 | 31 1780 | -7.388426190352211e-13 1781 | 0 1782 | LINE 1783 | 8 1784 | Grouper#3 1785 | 10 1786 | 54.01744173693416 1787 | 20 1788 | 8.285766782125508 1789 | 30 1790 | -6.47344800282894e-13 1791 | 11 1792 | 55.16629905626708 1793 | 21 1794 | 9.930300444880313 1795 | 31 1796 | -6.479214860460062e-13 1797 | 0 1798 | LINE 1799 | 8 1800 | Grouper#3 1801 | 10 1802 | 53.36426076102312 1803 | 20 1804 | 6.083018171872297 1805 | 30 1806 | -7.370771801991129e-13 1807 | 11 1808 | 54.01744173693416 1809 | 21 1810 | 8.285766782125508 1811 | 31 1812 | -6.47344800282894e-13 1813 | 0 1814 | LINE 1815 | 8 1816 | Grouper#3 1817 | 10 1818 | 53.14653376905277 1819 | 20 1820 | 3.199293650562876 1821 | 30 1822 | -1.9517182471562938e-13 1823 | 11 1824 | 53.36426076102312 1825 | 21 1826 | 6.083018171872297 1827 | 31 1828 | -7.370771801991129e-13 1829 | 0 1830 | LINE 1831 | 8 1832 | Grouper#3 1833 | 10 1834 | 53.14653376905277 1835 | 20 1836 | -3.9717996168860092 1837 | 30 1838 | -5.551168584291425e-13 1839 | 11 1840 | 53.14653376905277 1841 | 21 1842 | 3.199293650562876 1843 | 31 1844 | -1.9517182471562938e-13 1845 | 0 1846 | LINE 1847 | 8 1848 | Grouper#3 1849 | 10 1850 | 53.24381604206074 1851 | 20 1852 | -6.38764272991872 1853 | 30 1854 | -6.450445089774358e-13 1855 | 11 1856 | 53.14653376905277 1857 | 21 1858 | -3.9717996168860092 1859 | 31 1860 | -5.551168584291425e-13 1861 | 0 1862 | LINE 1863 | 8 1864 | Grouper#3 1865 | 10 1866 | 53.535662861085 1867 | 20 1868 | -8.150304867040392 1869 | 30 1870 | -6.448837018418388e-13 1871 | 11 1872 | 53.24381604206074 1873 | 21 1874 | -6.38764272991872 1875 | 31 1876 | -6.450445089774358e-13 1877 | 0 1878 | LINE 1879 | 8 1880 | Grouper#3 1881 | 10 1882 | 54.07998034101087 1883 | 20 1884 | -9.526154156725443 1885 | 30 1886 | -5.094948165801711e-13 1887 | 11 1888 | 53.535662861085 1889 | 21 1890 | -8.150304867040392 1891 | 31 1892 | -6.448837018418388e-13 1893 | 0 1894 | LINE 1895 | 8 1896 | Grouper#3 1897 | 10 1898 | 54.93467459672438 1899 | 20 1900 | -10.781558727448115 1901 | 30 1902 | -6.449328699579167e-13 1903 | 11 1904 | 54.07998034101087 1905 | 21 1906 | -9.526154156725443 1907 | 31 1908 | -5.094948165801711e-13 1909 | 0 1910 | LINE 1911 | 8 1912 | Grouper#3 1913 | 10 1914 | 56.14607052013364 1915 | 20 1916 | -11.849347485940944 1917 | 30 1918 | -6.451460630472121e-13 1919 | 11 1920 | 54.93467459672438 1921 | 21 1922 | -10.781558727448115 1923 | 31 1924 | -6.449328699579167e-13 1925 | 0 1926 | LINE 1927 | 8 1928 | Grouper#3 1929 | 10 1930 | 57.76049300314785 1931 | 20 1932 | -12.662349338936652 1933 | 30 1934 | -7.808745527316893e-13 1935 | 11 1936 | 56.14607052013364 1937 | 21 1938 | -11.849347485940944 1939 | 31 1940 | -6.451460630472121e-13 1941 | 0 1942 | LINE 1943 | 8 1944 | Grouper#3 1945 | 10 1946 | 59.7154034416903 1947 | 20 1948 | -13.176555639121922 1949 | 30 1950 | -6.911500564110838e-13 1951 | 11 1952 | 57.76049300314785 1953 | 21 1954 | -12.662349338936652 1955 | 31 1956 | -7.808745527316893e-13 1957 | 0 1958 | LINE 1959 | 8 1960 | Grouper#3 1961 | 10 1962 | 61.948263231683924 1963 | 20 1964 | -13.347957739183709 1965 | 30 1966 | -6.466767835758597e-13 1967 | 11 1968 | 59.7154034416903 1969 | 21 1970 | -13.176555639121922 1971 | 31 1972 | -6.911500564110838e-13 1973 | 0 1974 | LINE 1975 | 8 1976 | Grouper#3 1977 | 10 1978 | 64.1880717554641 1979 | 20 1980 | -13.174239394526499 1981 | 30 1982 | -4.668958461404252e-13 1983 | 11 1984 | 61.948263231683924 1985 | 21 1986 | -13.347957739183709 1987 | 31 1988 | -6.466767835758597e-13 1989 | 0 1990 | LINE 1991 | 8 1992 | Grouper#3 1993 | 10 1994 | 66.01558874125762 1995 | 20 1996 | -12.653084360554958 1997 | 30 1998 | -7.382347348492259e-13 1999 | 11 2000 | 64.1880717554641 2001 | 21 2002 | -13.174239394526499 2003 | 31 2004 | -4.668958461404252e-13 2005 | 0 2006 | LINE 2007 | 8 2008 | Grouper#3 2009 | 10 2010 | 67.49566903773709 2011 | 20 2012 | -11.784492637268997 2013 | 30 2014 | -6.485625734135262e-13 2015 | 11 2016 | 66.01558874125762 2017 | 21 2018 | -12.653084360554958 2019 | 31 2020 | -7.382347348492259e-13 2021 | 0 2022 | LINE 2023 | 8 2024 | Grouper#3 2025 | 10 2026 | 68.693167493574 2027 | 20 2028 | -10.568464224668615 2029 | 30 2030 | -7.844518608883468e-13 2031 | 11 2032 | 67.49566903773709 2033 | 21 2034 | -11.784492637268997 2035 | 31 2036 | -6.485625734135262e-13 2037 | 0 2038 | LINE 2039 | 8 2040 | Grouper#3 2041 | 10 2042 | 69.5571267276692 2043 | 20 2044 | -9.220409870128734 2045 | 30 2046 | -4.690649836117203e-13 2047 | 11 2048 | 68.693167493574 2049 | 21 2050 | -10.568464224668615 2051 | 31 2052 | -7.844518608883468e-13 2053 | 0 2054 | LINE 2055 | 8 2056 | Grouper#3 2057 | 10 2058 | 70.03658935892284 2059 | 20 2060 | -7.955740321024369 2061 | 30 2062 | -1.0559401953561656e-12 2063 | 11 2064 | 69.5571267276692 2065 | 21 2066 | -9.220409870128734 2067 | 31 2068 | -4.690649836117203e-13 2069 | 0 2070 | LINE 2071 | 8 2072 | Grouper#3 2073 | 10 2074 | 70.32380368875607 2075 | 20 2076 | -4.453578492735261 2077 | 30 2078 | -7.406837626095309e-13 2079 | 11 2080 | 70.03658935892284 2081 | 21 2082 | -7.955740321024369 2083 | 31 2084 | -1.0559401953561656e-12 2085 | 0 2086 | LINE 2087 | 8 2088 | Grouper#3 2089 | 10 2090 | 70.32380368875607 2091 | 20 2092 | -2.63764272991876 2093 | 30 2094 | -7.409396960802197e-13 2095 | 11 2096 | 70.32380368875607 2097 | 21 2098 | -4.453578492735261 2099 | 31 2100 | -7.406837626095309e-13 2101 | 0 2102 | LINE 2103 | 8 2104 | Grouper#3 2105 | 10 2106 | 63.22683024836092 2107 | 20 2108 | -2.63764272991876 2109 | 30 2110 | -6.034506556672455e-13 2111 | 11 2112 | 70.32380368875607 2113 | 21 2114 | -2.63764272991876 2115 | 31 2116 | -7.409396960802197e-13 2117 | 0 2118 | LINE 2119 | 8 2120 | Grouper#3 2121 | 10 2122 | 63.22683024836092 2123 | 20 2124 | -5.880385163519719 2125 | 30 2126 | -4.225157767293786e-13 2127 | 11 2128 | 63.22683024836092 2129 | 21 2130 | -2.63764272991876 2131 | 31 2132 | -6.034506556672455e-13 2133 | 0 2134 | LINE 2135 | 8 2136 | Grouper#3 2137 | 10 2138 | 62.939615918527686 2139 | 20 2140 | -8.354134391438196 2141 | 30 2142 | -6.476782239490033e-13 2143 | 11 2144 | 63.22683024836092 2145 | 21 2146 | -5.880385163519719 2147 | 31 2148 | -4.225157767293786e-13 2149 | 0 2150 | LINE 2151 | 8 2152 | Grouper#3 2153 | 10 2154 | 62.51111066837354 2155 | 20 2156 | -8.833597022692025 2157 | 30 2158 | -6.474820040803365e-13 2159 | 11 2160 | 62.939615918527686 2161 | 21 2162 | -8.354134391438196 2163 | 31 2164 | -6.476782239490033e-13 2165 | 0 2166 | LINE 2167 | 8 2168 | Grouper#3 2169 | 10 2170 | 61.80002357757646 2171 | 20 2172 | -8.993417899776695 2173 | 30 2174 | -4.216486785654849e-13 2175 | 11 2176 | 62.51111066837354 2177 | 21 2178 | -8.833597022692025 2179 | 31 2180 | -6.474820040803365e-13 2181 | 0 2182 | LINE 2183 | 8 2184 | Grouper#3 2185 | 10 2186 | 61.22559491791 2187 | 20 2188 | -8.872973180814315 2189 | 30 2190 | -1.9589588050174284e-13 2191 | 11 2192 | 61.80002357757646 2193 | 21 2194 | -8.993417899776695 2195 | 31 2196 | -4.216486785654849e-13 2197 | 0 2198 | LINE 2199 | 8 2200 | Grouper#3 2201 | 10 2202 | 60.87352573940491 2203 | 20 2204 | -8.511639023927353 2205 | 30 2206 | -6.470357452423387e-13 2207 | 11 2208 | 61.22559491791 2209 | 21 2210 | -8.872973180814315 2211 | 31 2212 | -1.9589588050174284e-13 2213 | 0 2214 | LINE 2215 | 8 2216 | Grouper#3 2217 | 10 2218 | 60.632636301480154 2219 | 20 2220 | -6.362164039369062 2221 | 30 2222 | -7.375052946556942e-13 2223 | 11 2224 | 60.87352573940491 2225 | 21 2226 | -8.511639023927353 2227 | 31 2228 | -6.470357452423387e-13 2229 | 0 2230 | LINE 2231 | 8 2232 | Grouper#3 2233 | 10 2234 | 60.632636301480154 2235 | 20 2236 | -1.0440664482635427 2237 | 30 2238 | -4.675380317809702e-13 2239 | 11 2240 | 60.632636301480154 2241 | 21 2242 | -6.362164039369062 2243 | 31 2244 | -7.375052946556942e-13 2245 | 0 2246 | LINE 2247 | 8 2248 | Grouper#3 2249 | 10 2250 | 62.81917119956549 2251 | 20 2252 | 2.9584042126391976 2253 | 30 2254 | -7.845948163273726e-13 2255 | 11 2256 | 62.81917119956549 2257 | 21 2258 | 4.755810018692311 2259 | 31 2260 | -8.299676019528001e-13 2261 | 0 2262 | LINE 2263 | 8 2264 | Grouper#3 2265 | 10 2266 | 60.63263630148033 2267 | 20 2268 | 2.9584042126391976 2269 | 30 2270 | -8.290578398090276e-13 2271 | 11 2272 | 62.81917119956549 2273 | 21 2274 | 2.9584042126391976 2275 | 31 2276 | -7.845948163273726e-13 2277 | 0 2278 | LINE 2279 | 8 2280 | Grouper#3 2281 | 10 2282 | 60.63263630148033 2283 | 20 2284 | 4.755810018692311 2285 | 30 2286 | -9.195500891552214e-13 2287 | 11 2288 | 60.63263630148033 2289 | 21 2290 | 2.9584042126391976 2291 | 31 2292 | -8.290578398090276e-13 2293 | 0 2294 | LINE 2295 | 8 2296 | Grouper#3 2297 | 10 2298 | 60.81793586911493 2299 | 20 2300 | 7.303679073664519 2301 | 30 2302 | -6.492480276881341e-13 2303 | 11 2304 | 60.63263630148033 2305 | 21 2306 | 4.755810018692311 2307 | 31 2308 | -9.195500891552214e-13 2309 | 0 2310 | LINE 2311 | 8 2312 | Grouper#3 2313 | 10 2314 | 61.15147509085663 2315 | 20 2316 | 7.65806449676521 2317 | 30 2318 | -3.786813265155396e-13 2319 | 11 2320 | 60.81793586911493 2321 | 21 2322 | 7.303679073664519 2323 | 31 2324 | -6.492480276881341e-13 2325 | 0 2326 | LINE 2327 | 8 2328 | Grouper#3 2329 | 10 2330 | 61.78149362081326 2331 | 20 2332 | 7.776192971132077 2333 | 30 2334 | -1.05567907485817e-12 2335 | 11 2336 | 61.15147509085663 2337 | 21 2338 | 7.65806449676521 2339 | 31 2340 | -3.786813265155396e-13 2341 | 0 2342 | LINE 2343 | 8 2344 | Grouper#3 2345 | 10 2346 | 62.30496489938022 2347 | 20 2348 | 7.637218295406309 2349 | 30 2350 | -8.753387894735842e-13 2351 | 11 2352 | 61.78149362081326 2353 | 21 2354 | 7.776192971132077 2355 | 31 2356 | -1.05567907485817e-12 2357 | 0 2358 | LINE 2359 | 8 2360 | Grouper#3 2361 | 10 2362 | 62.61534167516786 2363 | 20 2364 | 7.220294268229094 2365 | 30 2366 | -9.204926740943699e-13 2367 | 11 2368 | 62.30496489938022 2369 | 21 2370 | 7.637218295406309 2371 | 31 2372 | -8.753387894735842e-13 2373 | 0 2374 | LINE 2375 | 8 2376 | Grouper#3 2377 | 10 2378 | 62.81917119956549 2379 | 20 2380 | 4.755810018692311 2381 | 30 2382 | -8.299676019528001e-13 2383 | 11 2384 | 62.61534167516786 2385 | 21 2386 | 7.220294268229094 2387 | 31 2388 | -9.204926740943699e-13 2389 | 0 2390 | LINE 2391 | 8 2392 | Grouper#3 2393 | 10 2394 | 50.68204951951626 2395 | 20 2396 | 17.096761223138802 2397 | 30 2398 | -8.393429712249085e-13 2399 | 11 2400 | 50.68204951951626 2401 | 21 2402 | 13.186940346054174 2403 | 31 2404 | -7.936724670723531e-13 2405 | 0 2406 | LINE 2407 | 8 2408 | Grouper#3 2409 | 10 2410 | 42.97358750592751 2411 | 20 2412 | 17.096761223138802 2413 | 30 2414 | -7.919092775086306e-13 2415 | 11 2416 | 50.68204951951626 2417 | 21 2418 | 17.096761223138802 2419 | 31 2420 | -8.393429712249085e-13 2421 | 0 2422 | LINE 2423 | 8 2424 | Grouper#3 2425 | 10 2426 | 42.97358750592751 2427 | 20 2428 | 13.186940346054174 2429 | 30 2430 | -6.108803821937761e-13 2431 | 11 2432 | 42.97358750592751 2433 | 21 2434 | 17.096761223138802 2435 | 31 2436 | -7.919092775086306e-13 2437 | 0 2438 | LINE 2439 | 8 2440 | Grouper#3 2441 | 10 2442 | 50.68204951951626 2443 | 20 2444 | 13.186940346054174 2445 | 30 2446 | -7.936724670723531e-13 2447 | 11 2448 | 42.97358750592751 2449 | 21 2450 | 13.186940346054174 2451 | 31 2452 | -6.108803821937761e-13 2453 | 0 2454 | LINE 2455 | 8 2456 | Grouper#3 2457 | 10 2458 | 50.68204951951626 2459 | 20 2460 | 11.686013848215984 2461 | 30 2462 | -1.0980173103393035e-12 2463 | 11 2464 | 50.68204951951626 2465 | 21 2466 | -12.903238776861052 2467 | 31 2468 | -9.140739073378303e-13 2469 | 0 2470 | LINE 2471 | 8 2472 | Grouper#3 2473 | 10 2474 | 42.97358750592751 2475 | 20 2476 | 11.686013848215984 2477 | 30 2478 | -9.60344689181493e-13 2479 | 11 2480 | 50.68204951951626 2481 | 21 2482 | 11.686013848215984 2483 | 31 2484 | -1.0980173103393035e-12 2485 | 0 2486 | LINE 2487 | 8 2488 | Grouper#3 2489 | 10 2490 | 42.97358750592751 2491 | 20 2492 | -12.903238776861052 2493 | 30 2494 | -9.11759677342319e-13 2495 | 11 2496 | 42.97358750592751 2497 | 21 2498 | 11.686013848215984 2499 | 31 2500 | -9.60344689181493e-13 2501 | 0 2502 | LINE 2503 | 8 2504 | Grouper#3 2505 | 10 2506 | 50.68204951951626 2507 | 20 2508 | -12.903238776861052 2509 | 30 2510 | -9.140739073378303e-13 2511 | 11 2512 | 42.97358750592751 2513 | 21 2514 | -12.903238776861052 2515 | 31 2516 | -9.11759677342319e-13 2517 | 0 2518 | LINE 2519 | 8 2520 | Grouper#3 2521 | 10 2522 | -17.324196352155194 2523 | 20 2524 | 10.325348155166122 2525 | 30 2526 | -1.0774087458019738e-12 2527 | 11 2528 | -18.878069803913437 2529 | 21 2530 | 4.526213484672181 2531 | 31 2532 | -1.3017222457995852e-12 2533 | 0 2534 | LINE 2535 | 8 2536 | Grouper#3 2537 | 10 2538 | -33.790875046150404 2539 | 20 2540 | 14.737581413244847 2541 | 30 2542 | -9.377285870947498e-13 2543 | 11 2544 | -17.324196352155194 2545 | 21 2546 | 10.325348155166122 2547 | 31 2548 | -1.0774087458019738e-12 2549 | 0 2550 | LINE 2551 | 8 2552 | Grouper#3 2553 | 10 2554 | -35.344748497908654 2555 | 20 2556 | 8.938446742750816 2557 | 30 2558 | -7.559669136054643e-13 2559 | 11 2560 | -33.790875046150404 2561 | 21 2562 | 14.737581413244847 2563 | 31 2564 | -9.377285870947498e-13 2565 | 0 2566 | LINE 2567 | 8 2568 | Grouper#3 2569 | 10 2570 | -30.888006112251254 2571 | 20 2572 | 7.74426621964049 2573 | 30 2574 | -1.4790480289189068e-12 2575 | 11 2576 | -35.344748497908654 2577 | 21 2578 | 8.938446742750816 2579 | 31 2580 | -7.559669136054643e-13 2581 | 0 2582 | LINE 2583 | 8 2584 | Grouper#3 2585 | 10 2586 | -37.09870401356867 2587 | 20 2588 | -15.434373898537167 2589 | 30 2590 | -9.776026159687014e-13 2591 | 11 2592 | -30.888006112251254 2593 | 21 2594 | 7.74426621964049 2595 | 31 2596 | -1.4790480289189068e-12 2597 | 0 2598 | LINE 2599 | 8 2600 | Grouper#3 2601 | 10 2602 | -29.563408654686178 2603 | 20 2604 | -17.453450204680134 2605 | 30 2606 | -1.1149386855401455e-12 2607 | 11 2608 | -37.09870401356867 2609 | 21 2610 | -15.434373898537167 2611 | 31 2612 | -9.776026159687014e-13 2613 | 0 2614 | LINE 2615 | 8 2616 | Grouper#3 2617 | 10 2618 | -23.35271075336876 2619 | 20 2620 | 5.725189913497975 2621 | 30 2622 | -1.1200699975619208e-12 2623 | 11 2624 | -29.563408654686178 2625 | 21 2626 | -17.453450204680134 2627 | 31 2628 | -1.1149386855401455e-12 2629 | 0 2630 | LINE 2631 | 8 2632 | Grouper#3 2633 | 10 2634 | -18.878069803913437 2635 | 20 2636 | 4.526213484672181 2637 | 30 2638 | -1.3017222457995852e-12 2639 | 11 2640 | -23.35271075336876 2641 | 21 2642 | 5.725189913497975 2643 | 31 2644 | -1.1200699975619208e-12 2645 | 0 2646 | LINE 2647 | 8 2648 | Grouper#3 2649 | 10 2650 | -39.47082262378233 2651 | 20 2652 | 7.7860138482158785 2653 | 30 2654 | -9.80163083601596e-13 2655 | 11 2656 | -39.47082262378233 2657 | 21 2658 | -16.803238776861157 2659 | 31 2660 | -6.157418257170573e-13 2661 | 0 2662 | LINE 2663 | 8 2664 | Grouper#3 2665 | 10 2666 | -47.17928463737072 2667 | 20 2668 | 7.7860138482158785 2669 | 30 2670 | -1.0229683173268508e-12 2671 | 11 2672 | -39.47082262378233 2673 | 21 2674 | 7.7860138482158785 2675 | 31 2676 | -9.80163083601596e-13 2677 | 0 2678 | LINE 2679 | 8 2680 | Grouper#3 2681 | 10 2682 | -47.17928463737072 2683 | 20 2684 | -16.803238776861157 2685 | 30 2686 | -5.231886682800133e-13 2687 | 11 2688 | -47.17928463737072 2689 | 21 2690 | 7.7860138482158785 2691 | 31 2692 | -1.0229683173268508e-12 2693 | 0 2694 | LINE 2695 | 8 2696 | Grouper#3 2697 | 10 2698 | -39.47082262378233 2699 | 20 2700 | -16.803238776861157 2701 | 30 2702 | -6.157418257170573e-13 2703 | 11 2704 | -47.17928463737072 2705 | 21 2706 | -16.803238776861157 2707 | 31 2708 | -5.231886682800133e-13 2709 | 0 2710 | LINE 2711 | 8 2712 | Grouper#3 2713 | 10 2714 | -39.47082262378233 2715 | 20 2716 | 13.196761223138607 2717 | 30 2718 | -7.666082082079671e-13 2719 | 11 2720 | -39.47082262378233 2721 | 21 2722 | 9.286940346053978 2723 | 31 2724 | -8.111766314969445e-13 2725 | 0 2726 | LINE 2727 | 8 2728 | Grouper#3 2729 | 10 2730 | -47.17928463737072 2731 | 20 2732 | 13.196761223138607 2733 | 30 2734 | -8.09413441933222e-13 2735 | 11 2736 | -39.47082262378233 2737 | 21 2738 | 13.196761223138607 2739 | 31 2740 | -7.666082082079671e-13 2741 | 0 2742 | LINE 2743 | 8 2744 | Grouper#3 2745 | 10 2746 | -47.17928463737072 2747 | 20 2748 | 9.286940346053978 2749 | 30 2750 | -8.539818652221994e-13 2751 | 11 2752 | -47.17928463737072 2753 | 21 2754 | 13.196761223138607 2755 | 31 2756 | -8.09413441933222e-13 2757 | 0 2758 | LINE 2759 | 8 2760 | Grouper#3 2761 | 10 2762 | -39.47082262378233 2763 | 20 2764 | 9.286940346053978 2765 | 30 2766 | -8.111766314969445e-13 2767 | 11 2768 | -47.17928463737072 2769 | 21 2770 | 9.286940346053978 2771 | 31 2772 | -8.539818652221994e-13 2773 | 0 2774 | LINE 2775 | 8 2776 | Grouper#3 2777 | 10 2778 | 40.1107091859769 2779 | 20 2780 | -10.244189981308338 2781 | 30 2782 | -9.676742750492079e-13 2783 | 11 2784 | 39.50385310197469 2785 | 21 2786 | -11.518124508794397 2787 | 31 2788 | -8.319541487409048e-13 2789 | 0 2790 | LINE 2791 | 8 2792 | Grouper#3 2793 | 10 2794 | 40.40950473878734 2795 | 20 2796 | -8.3425531684609 2797 | 30 2798 | -8.777930637988314e-13 2799 | 11 2800 | 40.1107091859769 2801 | 21 2802 | -10.244189981308338 2803 | 31 2804 | -9.676742750492079e-13 2805 | 0 2806 | LINE 2807 | 8 2808 | Grouper#3 2809 | 10 2810 | 40.509103256390816 2811 | 20 2812 | -5.4727261147240185 2813 | 30 2814 | -8.331079677757609e-13 2815 | 11 2816 | 40.40950473878734 2817 | 21 2818 | -8.3425531684609 2819 | 31 2820 | -8.777930637988314e-13 2821 | 0 2822 | LINE 2823 | 8 2824 | Grouper#3 2825 | 10 2826 | 40.509103256390816 2827 | 20 2828 | 4.8855197160355734 2829 | 30 2830 | -6.540899783020322e-13 2831 | 11 2832 | 40.509103256390816 2833 | 21 2834 | -5.4727261147240185 2835 | 31 2836 | -8.331079677757609e-13 2837 | 0 2838 | LINE 2839 | 8 2840 | Grouper#3 2841 | 10 2842 | 40.19409399141251 2843 | 20 2844 | 9.036230031044783 2845 | 30 2846 | -8.801777157971547e-13 2847 | 11 2848 | 40.509103256390816 2849 | 21 2850 | 4.8855197160355734 2851 | 31 2852 | -6.540899783020322e-13 2853 | 0 2854 | LINE 2855 | 8 2856 | Grouper#3 2857 | 10 2858 | 39.64051153310495 2859 | 20 2860 | 10.187403594973128 2861 | 30 2862 | -8.801737631320037e-13 2863 | 11 2864 | 40.19409399141251 2865 | 21 2866 | 9.036230031044783 2867 | 31 2868 | -8.801777157971547e-13 2869 | 0 2870 | LINE 2871 | 8 2872 | Grouper#3 2873 | 10 2874 | 38.60978268813889 2875 | 20 2876 | 11.194969993984948 2877 | 30 2878 | -9.251257859394053e-13 2879 | 11 2880 | 39.64051153310495 2881 | 21 2882 | 10.187403594973128 2883 | 31 2884 | -8.801737631320037e-13 2885 | 0 2886 | LINE 2887 | 8 2888 | Grouper#3 2889 | 10 2890 | 37.22235217547672 2891 | 20 2892 | 11.89679210639997 2893 | 30 2894 | -6.089719193734022e-13 2895 | 11 2896 | 38.60978268813889 2897 | 21 2898 | 11.194969993984948 2899 | 31 2900 | -9.251257859394053e-13 2901 | 0 2902 | LINE 2903 | 8 2904 | Grouper#3 2905 | 10 2906 | 35.59866471408082 2907 | 20 2908 | 12.13073281053837 2909 | 30 2910 | -8.341147464902614e-13 2911 | 11 2912 | 37.22235217547672 2913 | 21 2914 | 11.89679210639997 2915 | 31 2916 | -6.089719193734022e-13 2917 | 0 2918 | LINE 2919 | 8 2920 | Grouper#3 2921 | 10 2922 | 34.22744791358652 2923 | 20 2924 | 11.968306158283884 2925 | 30 2926 | -7.885607248483727e-13 2927 | 11 2928 | 35.59866471408082 2929 | 21 2930 | 12.13073281053837 2931 | 31 2932 | -8.341147464902614e-13 2933 | 0 2934 | LINE 2935 | 8 2936 | Grouper#3 2937 | 10 2938 | 32.96741085367328 2939 | 20 2940 | 11.481026201520422 2941 | 30 2942 | -9.23472152389874e-13 2943 | 11 2944 | 34.22744791358652 2945 | 21 2946 | 11.968306158283884 2947 | 31 2948 | -7.885607248483727e-13 2949 | 0 2950 | LINE 2951 | 8 2952 | Grouper#3 2953 | 10 2954 | 31.81392104514933 2955 | 20 2956 | 10.664260451057139 2957 | 30 2958 | -6.974134208108434e-13 2959 | 11 2960 | 32.96741085367328 2961 | 21 2962 | 11.481026201520422 2963 | 31 2964 | -9.23472152389874e-13 2965 | 0 2966 | LINE 2967 | 8 2968 | Grouper#3 2969 | 10 2970 | 30.762345998824372 2971 | 20 2972 | 9.51337641770328 2973 | 30 2974 | -6.969355148265184e-13 2975 | 11 2976 | 31.81392104514933 2977 | 21 2978 | 10.664260451057139 2979 | 31 2980 | -6.974134208108434e-13 2981 | 0 2982 | LINE 2983 | 8 2984 | Grouper#3 2985 | 10 2986 | 30.892055696168445 2987 | 20 2988 | 11.686013848215893 2989 | 30 2990 | -8.326390534756512e-13 2991 | 11 2992 | 30.762345998824372 2993 | 21 2994 | 9.51337641770328 2995 | 31 2996 | -6.969355148265184e-13 2997 | 0 2998 | LINE 2999 | 8 3000 | Grouper#3 3001 | 10 3002 | 23.276243466396995 3003 | 20 3004 | 11.686013848215893 3005 | 30 3006 | -8.303526387445088e-13 3007 | 11 3008 | 30.892055696168445 3009 | 21 3010 | 11.686013848215893 3011 | 31 3012 | -8.326390534756512e-13 3013 | 0 3014 | LINE 3015 | 8 3016 | Grouper#3 3017 | 10 3018 | 23.276243466396995 3019 | 20 3020 | -16.40540060515016 3021 | 30 3022 | -8.263935046469158e-13 3023 | 11 3024 | 23.276243466396995 3025 | 21 3026 | 11.686013848215893 3027 | 31 3028 | -8.303526387445088e-13 3029 | 0 3030 | LINE 3031 | 8 3032 | Grouper#3 3033 | 10 3034 | 30.762345998824372 3035 | 20 3036 | -16.40540060515016 3037 | 30 3038 | -1.054238296611773e-12 3039 | 11 3040 | 23.276243466396995 3041 | 21 3042 | -16.40540060515016 3043 | 31 3044 | -8.263935046469158e-13 3045 | 0 3046 | LINE 3047 | 8 3048 | Grouper#3 3049 | 10 3050 | 30.762345998824372 3051 | 20 3052 | -10.767661259875302 3053 | 30 3054 | -6.940771558094897e-13 3055 | 11 3056 | 30.762345998824372 3057 | 21 3058 | -16.40540060515016 3059 | 31 3060 | -1.054238296611773e-12 3061 | 0 3062 | LINE 3063 | 8 3064 | Grouper#3 3065 | 10 3066 | 31.79539108838594 3067 | 20 3068 | -11.890750358084082 3069 | 30 3070 | -6.942290106225113e-13 3071 | 11 3072 | 30.762345998824372 3073 | 21 3074 | -10.767661259875302 3075 | 31 3076 | -6.940771558094897e-13 3077 | 0 3078 | LINE 3079 | 8 3080 | Grouper#3 3081 | 10 3082 | 32.93035094014614 3083 | 20 3084 | -12.69825113016558 3085 | 30 3086 | -9.200532590640757e-13 3087 | 11 3088 | 31.79539108838594 3089 | 21 3090 | -11.890750358084082 3091 | 31 3092 | -6.942290106225113e-13 3093 | 0 3094 | LINE 3095 | 8 3096 | Grouper#3 3097 | 10 3098 | 34.167225554105336 3099 | 20 3100 | -13.185531086929043 3101 | 30 3102 | -4.691612796103622e-13 3103 | 11 3104 | 32.93035094014614 3105 | 21 3106 | -12.69825113016558 3107 | 31 3108 | -9.200532590640757e-13 3109 | 0 3110 | LINE 3111 | 8 3112 | Grouper#3 3113 | 10 3114 | 35.50601493026352 3115 | 20 3116 | -13.34795773918353 3117 | 30 3118 | -8.304960279381675e-13 3119 | 11 3120 | 34.167225554105336 3121 | 21 3122 | -13.185531086929043 3123 | 31 3124 | -4.691612796103622e-13 3125 | 0 3126 | LINE 3127 | 8 3128 | Grouper#3 3129 | 10 3130 | 37.12043741327773 3131 | 20 3132 | -13.137179480999453 3133 | 30 3134 | -6.956520243210628e-13 3135 | 11 3136 | 35.50601493026352 3137 | 21 3138 | -13.34795773918353 3139 | 31 3140 | -8.304960279381675e-13 3141 | 0 3142 | LINE 3143 | 8 3144 | Grouper#3 3145 | 10 3146 | 38.48007299079482 3147 | 20 3148 | -12.504844706447315 3149 | 30 3150 | -6.961493330163659e-13 3151 | 11 3152 | 37.12043741327773 3153 | 21 3154 | -13.137179480999453 3155 | 31 3156 | -6.956520243210628e-13 3157 | 0 3158 | LINE 3159 | 8 3160 | Grouper#3 3161 | 10 3162 | 39.50385310197469 3163 | 20 3164 | -11.518124508794397 3165 | 30 3166 | -8.319541487409048e-13 3167 | 11 3168 | 38.48007299079482 3169 | 21 3170 | -12.504844706447315 3171 | 31 3172 | -6.961493330163659e-13 3173 | 0 3174 | LINE 3175 | 8 3176 | Grouper#3 3177 | 10 3178 | 32.541221848114276 3179 | 20 3180 | 6.555748252169766 3181 | 30 3182 | -7.760117886548878e-13 3183 | 11 3184 | 31.929733274920682 3185 | 21 3186 | 6.676192971132057 3187 | 31 3188 | -9.11203574251529e-13 3189 | 0 3190 | LINE 3191 | 8 3192 | Grouper#3 3193 | 10 3194 | 32.85623111309223 3195 | 20 3196 | 6.194414095282534 3197 | 30 3198 | -2.797413340877779e-13 3199 | 11 3200 | 32.541221848114276 3201 | 21 3202 | 6.555748252169766 3203 | 31 3204 | -7.760117886548878e-13 3205 | 0 3206 | LINE 3207 | 8 3208 | Grouper#3 3209 | 10 3210 | 32.99952159658952 3211 | 20 3212 | 3.8184044546608162 3213 | 30 3214 | -9.11121975874087e-13 3215 | 11 3216 | 32.85623111309223 3217 | 21 3218 | 6.194414095282534 3219 | 31 3220 | -2.797413340877779e-13 3221 | 0 3222 | LINE 3223 | 8 3224 | Grouper#3 3225 | 10 3226 | 32.99865834875561 3227 | 20 3228 | -5.255029882809907 3229 | 30 3230 | -5.488872196717537e-13 3231 | 11 3232 | 32.99952159658952 3233 | 21 3234 | 3.8184044546608162 3235 | 31 3236 | -9.11121975874087e-13 3237 | 0 3238 | LINE 3239 | 8 3240 | Grouper#3 3241 | 10 3242 | 32.846966134710534 3243 | 20 3244 | -7.383844088781889 3245 | 30 3246 | -2.778248666181966e-13 3247 | 11 3248 | 32.99865834875561 3249 | 21 3250 | -5.255029882809907 3251 | 31 3252 | -5.488872196717537e-13 3253 | 0 3254 | LINE 3255 | 8 3256 | Grouper#3 3257 | 10 3258 | 32.53427311432774 3259 | 20 3260 | -7.766024447027211 3261 | 30 3262 | -6.837523000385321e-13 3263 | 11 3264 | 32.846966134710534 3265 | 21 3266 | -7.383844088781889 3267 | 31 3268 | -2.778248666181966e-13 3269 | 0 3270 | LINE 3271 | 8 3272 | Grouper#3 3273 | 10 3274 | 31.94826323168443 3275 | 20 3276 | -7.893417899775861 3277 | 30 3278 | -8.189168051372579e-13 3279 | 11 3280 | 32.53427311432774 3281 | 21 3282 | -7.766024447027211 3283 | 31 3284 | -6.837523000385321e-13 3285 | 0 3286 | LINE 3287 | 8 3288 | Grouper#3 3289 | 10 3290 | 31.33677465849083 3291 | 20 3292 | -7.754443224050093 3293 | 30 3294 | -8.638722748583937e-13 3295 | 11 3296 | 31.94826323168443 3297 | 21 3298 | -7.893417899775861 3299 | 31 3300 | -8.189168051372579e-13 3301 | 0 3302 | LINE 3303 | 8 3304 | Grouper#3 3305 | 10 3306 | 30.984705479985745 3307 | 20 3308 | -7.337519196872969 3309 | 30 3310 | -8.638253370894082e-13 3311 | 11 3312 | 31.33677465849083 3313 | 21 3314 | -7.754443224050093 3315 | 31 3316 | -8.638722748583937e-13 3317 | 0 3318 | LINE 3319 | 8 3320 | Grouper#3 3321 | 10 3322 | 30.793357507171027 3323 | 20 3324 | -4.948576576741489 3325 | 30 3326 | -6.836267274611603e-13 3327 | 11 3328 | 30.984705479985745 3329 | 21 3330 | -7.337519196872969 3331 | 31 3332 | -8.638253370894082e-13 3333 | 0 3334 | LINE 3335 | 8 3336 | Grouper#3 3337 | 10 3338 | 30.79251019819953 3339 | 20 3340 | 3.81094748179149 3341 | 30 3342 | -1.0006972646662483e-12 3343 | 11 3344 | 30.793357507171027 3345 | 21 3346 | -4.948576576741489 3347 | 31 3348 | -6.836267274611603e-13 3349 | 0 3350 | LINE 3351 | 8 3352 | Grouper#3 3353 | 10 3354 | 30.97544050160369 3355 | 20 3356 | 6.120294268228983 3357 | 30 3358 | -8.657192663269374e-13 3359 | 11 3360 | 30.79251019819953 3361 | 21 3362 | 3.81094748179149 3363 | 31 3364 | -1.0006972646662483e-12 3365 | 0 3366 | LINE 3367 | 8 3368 | Grouper#3 3369 | 10 3370 | 31.32056094632296 3371 | 20 3372 | 6.537218295406288 3373 | 30 3374 | -1.0914789570261617e-12 3375 | 11 3376 | 30.97544050160369 3377 | 21 3378 | 6.120294268228983 3379 | 31 3380 | -8.657192663269374e-13 3381 | 0 3382 | LINE 3383 | 8 3384 | Grouper#3 3385 | 10 3386 | 31.929733274920682 3387 | 20 3388 | 6.676192971132057 3389 | 30 3390 | -9.11203574251529e-13 3391 | 11 3392 | 31.32056094632296 3393 | 21 3394 | 6.537218295406288 3395 | 31 3396 | -1.0914789570261617e-12 3397 | 0 3398 | ENDSEC 3399 | 0 3400 | EOF 3401 | -------------------------------------------------------------------------------- /scad/parts/triangle.scad: -------------------------------------------------------------------------------- 1 | // iTopie RepRap - Triangle 2 | // 3 | // @version 1.0.1 4 | // @license GPLv3 5 | // @docs http://reprap.org/wiki/ITopie 6 | // @sources https://github.com/lautr3k/RepRap-iTopie 7 | // @author Sébastien Mischler 8 | // @author http://www.onlfait.ch 9 | // 10 | include <../config.scad> 11 | use <../shapes.scad> 12 | 13 | // triangle connectors 14 | module triangle_connectors() { 15 | translate([-triangle_connectors_size[0], 20, 0]) 16 | square(triangle_connectors_size); 17 | translate([-triangle_connectors_size[0], (_triangle_height - 20 + triangle_connectors_size[1]) / 2, 0]) 18 | square(triangle_connectors_size); 19 | translate([-triangle_connectors_size[0], _triangle_height - triangle_connectors_size[1], 0]) 20 | square(triangle_connectors_size); 21 | translate([_triangle_width - triangle_connectors_size[1] - triangle_connectors_margin[0], -triangle_connectors_size[0], 0]) 22 | square([triangle_connectors_size[1], triangle_connectors_size[0]]); 23 | } 24 | 25 | // rear triangle 26 | module triangle_base(width, height, angle) { 27 | render() difference() { 28 | square([width, height]); 29 | translate([width, 0, 0]) 30 | rotate([0, 0, angle]) 31 | square([width * 2, height * 2]); 32 | } 33 | } 34 | 35 | module triangle_corner(){ 36 | render() difference() { 37 | minkowski() { 38 | offset(-triangle_radius) 39 | triangle_base(_triangle_width, _triangle_height, _triangle_angle); 40 | circle(triangle_radius); 41 | } 42 | square([_triangle_width, _triangle_height / 2]); 43 | square([triangle_radius, _triangle_height]); 44 | } 45 | } 46 | 47 | // triangle 48 | module triangle_2D() { 49 | translate([triangle_connectors_size[0], triangle_connectors_size[0], 0]) { 50 | render() difference() { 51 | triangle_base(_triangle_width, _triangle_height, _triangle_angle); 52 | translate([triangle_radius, _triangle_height / 2, 0]) 53 | square([_triangle_width, _triangle_height / 2]); 54 | } 55 | triangle_corner(); 56 | triangle_connectors(); 57 | } 58 | } 59 | 60 | module triangle_3D() { 61 | if (output_version == 1) { 62 | offset = sheet_thickness - pockets_depth; 63 | color(pockets_color) 64 | linear_extrude(offset) 65 | triangle_2D(); 66 | translate([0, 0, offset]) 67 | linear_extrude(pockets_depth) 68 | triangle_2D(); 69 | 70 | } 71 | else { 72 | linear_extrude(sheet_thickness) 73 | triangle_2D(); 74 | } 75 | } 76 | 77 | module triangle() { 78 | // 0 : 2D preview (default) 79 | // 1 : extruded view 80 | // 2 : export first layer 81 | // 3 : export second layer (pockets) 82 | if (output_mode == 0) { 83 | triangle_2D(); 84 | } 85 | else if (output_mode == 1) { 86 | triangle_3D(); 87 | } 88 | else if (output_mode == 2) { 89 | triangle_2D(); 90 | } 91 | else if (output_mode == 3) { 92 | if (output_version == 1) 93 | triangle_2D(); 94 | } 95 | else { 96 | triangle_3D(); 97 | } 98 | } 99 | 100 | triangle(); 101 | -------------------------------------------------------------------------------- /scad/parts/vertical_plate.scad: -------------------------------------------------------------------------------- 1 | // iTopie RepRap - Vertical plate 2 | // 3 | // @version 1.0.1 4 | // @license GPLv3 5 | // @docs http://reprap.org/wiki/ITopie 6 | // @sources https://github.com/lautr3k/RepRap-iTopie 7 | // @author Sébastien Mischler 8 | // @author http://www.onlfait.ch 9 | // 10 | include <../config.scad> 11 | use <../shapes.scad> 12 | 13 | // base plate 14 | module vertical_base_plate() { 15 | translate([0, feet_height, 0]) { 16 | render() difference() { 17 | translate([0, sheet_thickness, 0]) 18 | rounded_square(vertical_plate_width, vertical_plate_height - feet_height - sheet_thickness, corner_radius = [vertical_plate_outer_corners[0], vertical_plate_outer_corners[1], 0, 0]); 19 | translate([vertical_plate_borders[3], 0, 0]) 20 | y_mount(vertical_plate_inner_width, vertical_plate_inner_height - feet_height, [vertical_plate_inner_corners[0], vertical_plate_inner_corners[1], 0, 0]); 21 | 22 | } 23 | } 24 | rounded_square(foot_width, feet_height + sheet_thickness, corner_radius = [0, 0, feet_corners[1], feet_corners[0]]); 25 | translate([vertical_plate_width - foot_width, 0, 0]) 26 | rounded_square(foot_width, feet_height + sheet_thickness, corner_radius = [0, 0, feet_corners[3], feet_corners[2]]); 27 | } 28 | 29 | // triangles screws holes 30 | module _triangle_holes() { 31 | half_pocket = feet_connectors_size[0] / 2; 32 | min = 20 + half_pocket; 33 | max = _triangle_height - feet_connectors_size[0] + half_pocket; 34 | mid = (max - min) / 4; 35 | translate([0, min + mid, 0]) 36 | circle(triangle_holes_radius); 37 | translate([0, max - mid, 0]) 38 | circle(triangle_holes_radius); 39 | } 40 | 41 | module triangle_holes() { 42 | translate([0, feet_height + sheet_thickness, 0]) { 43 | translate([vertical_plate_borders[3] / 2, 0, 0]) 44 | _triangle_holes(); 45 | translate([vertical_plate_width - (vertical_plate_borders[1] / 2), 0, 0]) 46 | _triangle_holes(); 47 | } 48 | } 49 | 50 | // z rod holder holes 51 | module _z_rod_holder_holes() { 52 | circle(z_rod_holder_holes_radius); 53 | translate([z_rod_holder_holes_spacing, 0, 0]) 54 | circle(z_rod_holder_holes_radius); 55 | } 56 | 57 | module z_rod_holder_holes() { 58 | z_motor_pos = [ 59 | (vertical_plate_width - z_motor_spacing) / 2, 60 | (vertical_plate_width + z_motor_spacing) / 2 61 | ]; 62 | translate([0, vertical_plate_height - z_rod_holder_holes_margin[0], 0]) { 63 | translate([z_motor_pos[0] - z_rod_spacing + z_rod_holder_holes_margin[1], 0, 0]) 64 | _z_rod_holder_holes(); 65 | translate([z_motor_pos[1] - z_rod_holder_holes_spacing + z_rod_spacing - z_rod_holder_holes_margin[1], 0, 0]) 66 | _z_rod_holder_holes(); 67 | } 68 | } 69 | 70 | // triangle pockets 71 | module _triangle_connectors_holes() { 72 | translate([-triangle_connectors_size[0], 20, 0]) 73 | square([triangle_connectors_size[0], triangle_connectors_size[1]]); 74 | translate([-triangle_connectors_size[0], (_triangle_height - 20 + triangle_connectors_size[1]) / 2, 0]) 75 | square([triangle_connectors_size[0], triangle_connectors_size[1]]); 76 | translate([-triangle_connectors_size[0], _triangle_height - triangle_connectors_size[1], 0]) 77 | square([triangle_connectors_size[0], triangle_connectors_size[1]]); 78 | } 79 | 80 | module triangle_connectors_holes() { 81 | translate([triangle_connectors_margin[3] + triangle_connectors_size[0], feet_height + sheet_thickness, 0]) 82 | _triangle_connectors_holes(); 83 | translate([vertical_plate_width - triangle_connectors_margin[1], feet_height + sheet_thickness, 0]) 84 | _triangle_connectors_holes(); 85 | } 86 | 87 | // iTopie logo 88 | module logo() { 89 | translate([vertical_plate_width / 2, vertical_plate_height - (vertical_plate_borders[0] / 2), 0]) 90 | import(dxf_logo); 91 | } 92 | 93 | // holes 94 | module vertical_plate_holes() { 95 | triangle_holes(); 96 | z_rod_holder_holes(); 97 | triangle_connectors_holes(); 98 | if (logo_depth == undef) logo(); 99 | } 100 | 101 | // pockets 102 | module vertical_plate_pockets() { 103 | color(pockets_color) 104 | if (logo_depth != undef) logo(); 105 | } 106 | 107 | // vertical plate 2D 108 | module vertical_plate_2D() { 109 | difference() { 110 | vertical_base_plate(); 111 | vertical_plate_holes(); 112 | } 113 | } 114 | 115 | // vertical plate 3D 116 | module vertical_plate_3D() { 117 | offset = sheet_thickness - pockets_depth; 118 | if (output_version == 1) { 119 | color(pockets_color) 120 | linear_extrude(offset) 121 | vertical_plate_2D(); 122 | } 123 | y = output_version == 1 ? offset : 0; 124 | h = output_version == 1 ? pockets_depth : sheet_thickness; 125 | d = output_version == 1 ? pockets_depth : logo_depth; 126 | translate([0, 0, y]) 127 | render() difference() { 128 | linear_extrude(h) 129 | vertical_plate_2D(); 130 | translate([0, 0, h - d]) 131 | linear_extrude(d) 132 | if (logo_depth != undef) logo(); 133 | } 134 | } 135 | 136 | // vertical plate 137 | module vertical_plate() { 138 | // 0 : 2D preview (default) 139 | // 1 : extruded view 140 | // 2 : export first layer 141 | // 3 : export second layer (pockets) 142 | if (output_mode == 0) { 143 | vertical_plate_2D(); 144 | vertical_plate_pockets(); 145 | } 146 | else if (output_mode == 1) { 147 | vertical_plate_3D(); 148 | } 149 | else if (output_mode == 2) { 150 | vertical_plate_2D(); 151 | } 152 | else if (output_mode == 3) { 153 | difference() { 154 | if (output_version == 1) { 155 | vertical_plate_2D(); 156 | } 157 | vertical_plate_pockets(); 158 | } 159 | } 160 | else { 161 | vertical_plate_3D(); 162 | } 163 | } 164 | 165 | vertical_plate(); 166 | -------------------------------------------------------------------------------- /scad/parts/y_carriage.scad: -------------------------------------------------------------------------------- 1 | // iTopie RepRap - Y carriage 2 | // 3 | // @version 1.0.1 4 | // @license GPLv3 5 | // @docs http://reprap.org/wiki/ITopie 6 | // @sources https://github.com/lautr3k/RepRap-iTopie 7 | // @author Sébastien Mischler 8 | // @author http://www.onlfait.ch 9 | // 10 | include <../config.scad> 11 | 12 | // local configuration 13 | half_width = y_carriage_width / 2; 14 | half_height = y_carriage_height / 2; 15 | base_width = y_carriage_width - (y_carriage_outer_offset[0] * 2); 16 | base_height = y_carriage_height - (y_carriage_outer_offset[1] * 2); 17 | 18 | ergots_width = y_carriage_ergots_radius * 4; 19 | 20 | bed_holes_min_x = y_carriage_ergots_radius; 21 | bed_holes_min_y = y_carriage_ergots_radius; 22 | bed_holes_max_x = y_carriage_width - y_carriage_ergots_radius; 23 | bed_holes_max_y = y_carriage_height - y_carriage_ergots_radius; 24 | 25 | bed_holes_pos = [ 26 | // 0 = bottom-left 27 | [bed_holes_min_x, bed_holes_min_y], 28 | // 1 = top-left 29 | [bed_holes_min_x, bed_holes_max_y], 30 | // 2 = top-right 31 | [bed_holes_max_x, bed_holes_max_y], 32 | // 3 = middle-right 33 | [bed_holes_max_x, half_height], 34 | // 4 = bottom-right 35 | [bed_holes_max_x, bed_holes_min_y], 36 | // 5 = middle-bottom 37 | [half_width, bed_holes_min_y] 38 | ]; 39 | 40 | lm8_hspacing = y_rod_pockets_spacing / 2; 41 | lm8_vspacing = y_carriage_lm8_holder_vspacing ? y_carriage_lm8_holder_vspacing : y_carriage_height / 4; 42 | 43 | lm8_min_x = half_width - lm8_hspacing; 44 | lm8_min_y = half_height - lm8_vspacing; 45 | lm8_max_x = half_width + lm8_hspacing; 46 | lm8_max_y = half_height + lm8_vspacing; 47 | 48 | lm8_holder_pos = [ 49 | // 0 = bottom-left 50 | [lm8_min_x, lm8_min_y], 51 | // 1 = top-left 52 | [lm8_min_x, lm8_max_y], 53 | // 2 = top-right 54 | [lm8_max_x, lm8_max_y], 55 | // 3 = bottom-right 56 | [lm8_max_x, lm8_min_y], 57 | ]; 58 | 59 | belt_holder_spacing = y_carriage_belt_holder_screw_spacing / 2; 60 | 61 | belt_holes_pos = [ 62 | // 0 = top 63 | [half_width + y_carriage_belt_holder_offset, half_height + belt_holder_spacing], 64 | // 1 = bottom 65 | [half_width + y_carriage_belt_holder_offset, half_height - belt_holder_spacing] 66 | ]; 67 | 68 | _endstop_flag_x_margin = y_carriage_triangle_margin[0] / 2; 69 | endstop_flag_x_margin = _endstop_flag_x_margin > 6 ? 6 : _endstop_flag_x_margin; 70 | endstop_flag_x = y_carriage_outer_offset[0] + endstop_flag_x_margin; 71 | 72 | endstop_flag_holes = [ 73 | [endstop_flag_x, half_height + 9], 74 | [endstop_flag_x, half_height + 3], 75 | [endstop_flag_x, half_height - 3], 76 | [endstop_flag_x, half_height - 9], 77 | ]; 78 | 79 | // cross 80 | module y_carriage_cross() { 81 | hull() { 82 | translate(bed_holes_pos[0]) circle(y_carriage_ergots_radius); 83 | translate(bed_holes_pos[2]) circle(y_carriage_ergots_radius); 84 | } 85 | hull() { 86 | translate(bed_holes_pos[1]) circle(y_carriage_ergots_radius); 87 | translate(bed_holes_pos[4]) circle(y_carriage_ergots_radius); 88 | } 89 | } 90 | 91 | // ergots 92 | module y_carriage_ergot(width, radius) { 93 | ergot_diameter = radius * 2; 94 | circle(radius); 95 | difference() { 96 | translate([-ergot_diameter, 0, 0]) square([width, radius]); 97 | translate([-ergot_diameter, 0, 0]) circle(radius); 98 | translate([ergot_diameter, 0, 0]) circle(radius); 99 | } 100 | } 101 | 102 | module y_carriage_ergots() { 103 | translate(bed_holes_pos[5]) 104 | y_carriage_ergot(ergots_width, y_carriage_ergots_radius); 105 | translate(bed_holes_pos[3]) 106 | rotate([0, 0, 90]) 107 | y_carriage_ergot(ergots_width, y_carriage_ergots_radius); 108 | } 109 | 110 | // lm8uu holder holes 111 | module y_carriage_lm8_holder_holes() { 112 | translate([y_carriage_lm8_holder_screw_spacing / 2, 0, 0]) 113 | circle(y_carriage_holes_radius); 114 | translate([-y_carriage_lm8_holder_screw_spacing / 2, 0, 0]) 115 | circle(y_carriage_holes_radius); 116 | } 117 | 118 | // screws holes 119 | module y_carriage_holes() { 120 | // corners 121 | translate(bed_holes_pos[0]) circle(y_carriage_holes_radius); 122 | translate(bed_holes_pos[1]) circle(y_carriage_holes_radius); 123 | translate(bed_holes_pos[2]) circle(y_carriage_holes_radius); 124 | translate(bed_holes_pos[4]) circle(y_carriage_holes_radius); 125 | // ergots 126 | translate(bed_holes_pos[3]) circle(y_carriage_holes_radius); 127 | translate(bed_holes_pos[5]) circle(y_carriage_holes_radius); 128 | // lm8uu holder 129 | translate(lm8_holder_pos[0]) y_carriage_lm8_holder_holes(); 130 | translate(lm8_holder_pos[1]) y_carriage_lm8_holder_holes(); 131 | translate(lm8_holder_pos[2]) y_carriage_lm8_holder_holes(); 132 | translate(lm8_holder_pos[3]) y_carriage_lm8_holder_holes(); 133 | // belt holder 134 | translate(belt_holes_pos[0]) circle(y_carriage_holes_radius); 135 | translate(belt_holes_pos[1]) circle(y_carriage_holes_radius); 136 | // endstop flag (screw) 137 | translate(endstop_flag_holes[0]) circle(y_carriage_holes_radius); 138 | translate(endstop_flag_holes[1]) circle(y_carriage_holes_radius); 139 | translate(endstop_flag_holes[2]) circle(y_carriage_holes_radius); 140 | translate(endstop_flag_holes[3]) circle(y_carriage_holes_radius); 141 | } 142 | 143 | // triangles 144 | module y_carriage_triangle(width, height) { 145 | minkowski() { 146 | circle(y_carriage_ergots_radius); 147 | offset(-y_carriage_triangle_offset - y_carriage_ergots_radius) 148 | polygon(points=[[0, 0], [width, 0],[width / 2, height / 2]], paths=[[0, 1, 2]]); 149 | } 150 | } 151 | 152 | module y_carriage_triangles() { 153 | margin = [ 154 | y_carriage_outer_offset[0] + y_carriage_triangle_margin[0], 155 | y_carriage_outer_offset[1] + y_carriage_triangle_margin[1] 156 | ]; 157 | triangle_width = base_width - (y_carriage_triangle_margin[0] * 2); 158 | triangle_height = base_height- (y_carriage_triangle_margin[1] * 2); 159 | translate(margin) { 160 | // bottom 161 | translate([0, -y_carriage_triangle_offset, 0]) 162 | y_carriage_triangle(triangle_width, triangle_height); 163 | // left 164 | translate([-y_carriage_triangle_offset, triangle_height, 0]) 165 | rotate([0, 0, 270]) 166 | y_carriage_triangle(triangle_height, triangle_width); 167 | // right 168 | translate([triangle_width + y_carriage_triangle_offset, 0, 0]) 169 | rotate([0, 0, 90]) 170 | y_carriage_triangle(triangle_height, triangle_width); 171 | // top 172 | translate([triangle_width, triangle_height + y_carriage_triangle_offset, 0]) 173 | rotate([0, 0, 180]) 174 | y_carriage_triangle(triangle_width, triangle_height); 175 | } 176 | } 177 | 178 | // holes screws pockets 179 | module y_carriage_holes_pocket() { 180 | corners_radius = y_carriage_thumbwheel_radius * 1.75; 181 | // corners 182 | translate(bed_holes_pos[0]) circle(corners_radius); 183 | translate(bed_holes_pos[1]) circle(corners_radius); 184 | translate(bed_holes_pos[2]) circle(corners_radius); 185 | translate(bed_holes_pos[4]) circle(corners_radius); 186 | // ergots 187 | translate(bed_holes_pos[3]) circle(y_carriage_thumbwheel_radius); 188 | translate(bed_holes_pos[5]) circle(y_carriage_thumbwheel_radius); 189 | } 190 | 191 | // base 192 | module y_carriage_base() { 193 | translate([y_carriage_outer_offset[0], y_carriage_outer_offset[1], 0]) 194 | square([base_width, base_height]); 195 | y_carriage_cross(); 196 | y_carriage_ergots(); 197 | } 198 | 199 | // carriage 2D 200 | module y_carriage_2D() { 201 | difference() { 202 | y_carriage_base(); 203 | if (output_mode != 3 || output_version == 1) 204 | y_carriage_holes(); 205 | y_carriage_triangles(); 206 | } 207 | } 208 | 209 | // carriage 3D 210 | module y_carriage_3D() { 211 | offset = sheet_thickness - pockets_depth; 212 | if (output_version == 1) { 213 | color(pockets_color) 214 | linear_extrude(offset) 215 | y_carriage_2D(); 216 | } 217 | y = output_version == 1 ? offset : 0; 218 | h = output_version == 1 ? pockets_depth : sheet_thickness; 219 | translate([0, 0, y]) 220 | render() difference() { 221 | linear_extrude(h) 222 | y_carriage_2D(); 223 | translate([0, 0, pockets_height - y]) 224 | linear_extrude(pockets_depth) 225 | y_carriage_holes_pocket(); 226 | } 227 | } 228 | 229 | // pockets 230 | module y_carriage_pockets() { 231 | color(pockets_color) render() intersection() { 232 | y_carriage_2D(); 233 | y_carriage_holes_pocket(); 234 | } 235 | } 236 | 237 | // carriage 238 | module y_carriage() { 239 | // 0 : 2D preview (default) 240 | // 1 : extruded view 241 | // 2 : export first layer 242 | // 3 : export second layer (pockets) 243 | if (output_mode == 0) { 244 | y_carriage_2D(); 245 | y_carriage_pockets(); 246 | } 247 | else if (output_mode == 1) { 248 | y_carriage_3D(); 249 | } 250 | else if (output_mode == 2) { 251 | y_carriage_2D(); 252 | } 253 | else if (output_mode == 3) { 254 | difference() { 255 | if (output_version == 1) { 256 | y_carriage_2D(); 257 | } 258 | y_carriage_pockets(); 259 | } 260 | } 261 | else { 262 | y_carriage_3D(); 263 | } 264 | } 265 | 266 | y_carriage(); 267 | -------------------------------------------------------------------------------- /scad/shapes.scad: -------------------------------------------------------------------------------- 1 | // iTopie RepRap - Shapes modules 2 | // 3 | // @version 1.1.0 4 | // @license GPLv3 5 | // @docs http://reprap.org/wiki/ITopie 6 | // @sources https://github.com/lautr3k/RepRap-iTopie 7 | // @author Sébastien Mischler 8 | // @author http://www.onlfait.ch 9 | // 10 | module corner(radius = 0) { 11 | render() difference() { 12 | square([radius, radius]); 13 | translate([radius, radius, 0]) 14 | circle(radius); 15 | } 16 | } 17 | 18 | module rounded_square(width, height, radius = 0, corner_radius = [0, 0, 0, 0]) { 19 | render() difference() { 20 | square([width, height]); 21 | if (radius > 0 || corner_radius[3] > 0) { 22 | corner(radius > 0 ? radius : corner_radius[3]); 23 | } 24 | if (radius > 0 || corner_radius[0] > 0) { 25 | translate([0, height, 0]) 26 | rotate([0, 0, -90]) 27 | corner(radius > 0 ? radius : corner_radius[0]); 28 | } 29 | if (radius > 0 || corner_radius[1] > 0) { 30 | translate([width, height, 0]) 31 | rotate([0, 0, -180]) 32 | corner(radius > 0 ? radius : corner_radius[1]); 33 | } 34 | if (radius > 0 || corner_radius[2] > 0) { 35 | translate([width, 0, 0]) 36 | rotate([0, 0, -270]) 37 | corner(radius > 0 ? radius : corner_radius[2]); 38 | } 39 | } 40 | } 41 | 42 | module y_mount(width, height, corner_radius) { 43 | render() union() { 44 | rounded_square(width, height, corner_radius = [corner_radius[0], corner_radius[1], 0, 0]); 45 | translate([width, 0, 0]) 46 | corner(corner_radius[2]); 47 | rotate([0, 180, 0]) 48 | corner(corner_radius[3]); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /skp/iTopie.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skarab42/RepRap-iTopie/cafd2e9f0a0e8649587fa77eba56c08734868e5c/skp/iTopie.skp -------------------------------------------------------------------------------- /stl/iTopie_x_carriage_v2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skarab42/RepRap-iTopie/cafd2e9f0a0e8649587fa77eba56c08734868e5c/stl/iTopie_x_carriage_v2.stl --------------------------------------------------------------------------------