├── .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
--------------------------------------------------------------------------------