-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathhe_mount_generator_customized.scad
3198 lines (2739 loc) · 138 KB
/
he_mount_generator_customized.scad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// Roadfeldt - Hot End Mount Generator
//
/*
Copyright (C)2015-2016 Chris Roadfeldt <[email protected]>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//
// Includes E3D Chimera openscad design by Author: Professional 3D - Jons Collasius from Germany/Hamburg
// URL Professional 3D: http://professional3d.de
// http://www.thingiverse.com/thing:1018787
//
// Includes E3D Cyclops openscad design by Author: Professional 3D - Jons Collasius from Germany/Hamburg
// URL Professional 3D: http://professional3d.de
// http://www.thingiverse.com/thing:1018957
//
// Includes E3D V6 openscad design by Author: Professional 3D - Jons Collasius from Germany/Hamburg
// URL Professional 3D: http://professional3d.de
// http://www.thingiverse.com/thing:548237
//
// Includes E3D V6 w/ Volcano openscad design by Author: Professional 3D - Jons Collasius from Germany/Hamburg
// URL Professional 3D: http://professional3d.de
// http://www.thingiverse.com/thing:862716
//
// Includes Lulzbot Hexagon Hot End openscad design by [email protected] -- This model is inaccurate according to lulzbot documentation. Mount is correct.
// https://www.youmagine.com/designs/hexagon-hotend-visualization
// Which hotend are we importing? Can only use one at a time, Jons uses the same variable
// and module names and openscad doesn't support conditionally import as far as I can tell.
//use<e3d_v6_chimera.scad>;
//use<e3d_vulcano_chimera.scad>;
//use<e3d_cyclops.scad>;
//use<e3d_v6_all_metall_hotend.scad>;
use<e3d_v6_volcano_all_metall_hotend.scad>;
use<Hexagon-102.scad>;
use<vslot.scad>;
// Bring in the basic delta fan designs I created for visualization.
use<delta_blower_fans.scad>;
/* [Features] */
// What type of Carriage do you use / need?
carriage = "cbot"; // [cbot:C Bot style, prusai3:Prusa i3]
// Which hot end is in use. Ensure you enter height from top of mount to tip of nozzle if you select generic J Head.
hotend = "e3d_v6"; // [chimera_v6:Chimera Dual V6, chimera_vol:Chimera Dual Volcano, cyclops:Cyclops, e3d_v6:E3D V6, e3d_v6_vol:E3D V6 w/ Volcano, jhead_mkv:J Head Mark V, hexagon:Hexagon, gen_jhead:Generic J Head]
// What style of extruder are you using?
extruder = "titan"; // [bowden:Bowden, titan:E3D Titan, carl_direct:Carl Feniak Direct Drive - Not ready yet.]
// What type of fan duct should be made?
fanDuctStyle = "full"; // [Full:Full 360 duct, classic:Simple single outlet]
// Which Z Probe type is in use. Select Servo here if you want to if you Servo Bracket selected above, otherwise it won't appear.
servoInduct = "induct"; // [servo:Servo w/ Arm, induct:Inductive / Capacitive Sensor, bltouch:BL Touch, none:Neither/None]
// Which side should the z probe be on? Be mindful of clearance with fan mount.
// If you choose a Prusa i3 style carriage and a titan extruder, this will be overridden to left.
zProbeSide = "left"; // [right:Right of hot end., left:Left of hot end.]
// Which side should the fan mount to? Be mindful of Z probe clearance.
printFanSide = "left"; // [left:Left side of hot end., right:Right side of hot end., none:No print cooling fan.]
// Should the fan outlet point towards the left or the right? Be mindful of Z probe clearance.
printFanDirection = "right"; // [left:Fan outlet to the left, right:Fan outlet to right]
// Should the nut traps be closed, so printing support is not needed? This will mean the holes with nut traps will be closed with .1mm amount of material which will need to be removed prior to use.
boltHoleSupportFix = 1; // [ 1:Yes, 0:No]
// Should the parts be exploded, do this before producing the stl file. You will still receive a single STL file with all the parts, but they will be separated so you can split them up with Cura or NetFabb. Select no if you want to see the parts fit together as they would on the printer. Selecting no will NOT produce a valid STL for printing as the parts will be inseparable.
explodeParts = 1; // [1:Yes, 0:No]
/* [Prusa i3] */
// Which part should be displayed.
// xcar = X Carriage mount
// serv = Servo Bracket
// fanm = Fan Mount
// fant = Fan Bracket
// duct = Fan Duct
// mag = Magnetic Z Probe mount
// zpro = Z Probe arm used with servo
// jhead_col = J Head style collar
// bltouch = BL Touch mount
// all = All parts
// Which Prusa i3 part should be exported.
prusai3Which = "hotm"; // [hotm:Back Plane & Cold / Hot End Mount, jhead_col: J Head Style Collar, servo:Servo Bracket, fanm:Fan Mount, fant:Fan Bracket, duct:Fan Duct, zarm:Z Probe Servo Arm, induct:Inductive / Capacitive Sensor, bltouch:BL Touch, all:All Parts ]
// How wide to make the X Carriage back plane.
xMountWidth = 40;
// How high to make the X Carriage back plane. Affects both X Carriage and servo mount.
xMountHeight = 40;
// How deep the overall X Back Plane should be.
xMountDepth = 5;
// The radius of the rounded X Back Plane corners.
xMountCornerRadius = 4;
// How wide to make the X Carriage nut traps, point to point, not flat to flat.
xMountNutDiameter = 8.8;
// How deep to make the X Carriage nut traps.
xMountNutDepth = 3.8;
// How wide to make the X Carriage bolt shaft holes.
xMountBoltDiameter = 4.5;
// Distance between mounting bolt holes in the horizontal direction
xMountHoleWidth = 23;
// Distance between mounting bolt holes in the vertical direction
xMountHoleHeight = 23;
// How wide to make the tab the cooling fan hangs off of.
prusai3FanTabWidth = 8;
// How far out should the tab the cooling fan hangs off of be. Must be above 0.
prusai3FanTabDepth = 4;
// Degrees the fan mount is rotated in the vertical.
prusai3FanTabVerticalAngle = 0;
// Degrees the fan mount is rotated in the horizontal. Affects fan duct only.
prusai3FanTabHorizontalAngle = 0;
// How large to make the bolt hole that the fan bracket will bolt to.
prusai3FanTabHole = 3.5;
// How much material should be around the fan bracket screw.
prusai3FanTabMat = 2;
// How wide the nubs on each side of the fan mount tab should be.
prusai3FanTabNubWidth = 4;
// How deep the fan bracket should be.
prusai3FanBracketDepth = 3;
/* [C Bot Carriage] */
// Which part should be displayed.
// hotm = Carriage side with hot end
// carrside = Carriage side opposite hot end side. This one is for accessories.
// serv = Servo Bracket
// fanm = Fan Mount
// fant = Fan Bracket
// duct = Fan Duct
// mag = Magnetic Z Probe mount
// zarm = Z Probe arm used with servo
// jhead_col = J Head style collar
// induct = Inductive Sensor Mount
// xbump = X Endstop Bumper
// bltouch = BL Touch mount
// all = All parts
// Which C Botpart should be exported.
cBotWhich = "all"; // [hotm:Carriage with Cold / Hot End Mount, carrside: Carriage Side, jhead_col:J Head Style Collar, belth:Belt Holder, servo:Servo Bracket, fant:Fan Mount Bracket, fanm:Fan Mount, duct:Fan Duct, zarm:Z Probe Servo Arm, induct:Inductive / Capacitive Sensor, xbump:X Endstop Bumper, bltouch:BL Touch, all:All Parts]
// Do you want a carriage mount axis limit switch?
cBotXAxisSwitch = "cheap"; // [yl99:YL-99, keyes:Keyes, gen:Generic Mini Switch, cheap:Cheapo, none:None]
// Which side should have the endstop mount?
cBotXAxisSwitchSide = "acc"; // [he:Hot End, acc:Accessory, both:Both]
// Which carriage should the probe mout on?
cBotProbeCarriage = "he"; // [he:Hot End Carriage, acc:Accessory Carriage]
// How deep into the carriage should the switch be recessed?
cBotXAxisSwitchDepth = 0;
// How far should the switch stick out from the carriage?
cBotXAxisSwitchOffset = 2;
// How far in should the cutout for the through hole cavity be?
cBotXAxisSwitchTHOffset = 2.5;
// Minimum width of carriage, will be increased if needed.
cBotCarriageMinWidth = 40;
// Height of carriage. Only changed if height of XY Bar is modified.
cBotCarriageHeight = 65;
// Depth of carriage.
cBotCarriageDepth = 6;
// Whether to include slider
cBotCarriageSlider = true;
// extra space around extrusion
vslotOversize = 0.7;
// Diameter of screw holes for carriage idler wheels.
cBotCarriageIdlerScrewDiameter = 5.0;
// Amount of material around screw holes for carriage idler wheels.
cBotCarriageIdlerScrewMat = 3.3;
// Diameter of screw holes that mounts back plane to carriage.
cBotCarriageMountScrewDiameter = 4.2;
// Horizontal distance of screw holes for back plane mount. Not used if hot end mount is integrated.
cBotCarriageMountScrewHorizontalDistance = 30;
// Vertical distance of screw holes for back plane mount. Not used if hot end mount is integrated.
cBotCarriageMountScrewVerticalDistance = 30;
// Vertical position of back plane mount from bottom of carriage. Not used if hot end mount is integrated.
cBotBackMountVertPosition = 40;
// Vertical position of fan bracket.
cBotFanMountPos = 25;
// Vertical position of accessory mount holes. Offset from top and bottom respectively.
cBotAccessoryMountPos = 7;
// Vertical position of cable tie locations. Offset from top down.
cBotCableTieVerticalPos = 4.5;
// Vertical distance of cable tie locations. Offset from top down.
cBotCableTieVerticalDistance = 15;
// How many rows of cable tie cut outs should there be?
cBotCableTieVerticalCount = 3;
// How many columns of cable tie cut outs should there be?
cBotCableTieHorizontalCount = 3;
// How much to shrink the horizontal spacing of the cable ties?
cBotCableTieHorizontalOffset = 5;
/* [Hot End Settings] */
// How far out to offset the Hot End from the rear of the mount.
heDepthOffset = 0.0; // Not needed, but kept just in case.
// Hot end mount height offset. Positive number = higher, negative = lower.
heHeightOffset = 0;
// Thickness of Chimera mount vertical brace.
chiBraceThickness = 4;
// How thick the Chimera mount top plate should be.
chiMountHeight = 5;
// Enter height in millimeters from the top of the J Head mount, usually that is the top of the cold end itself. The top of the mount is 3.7 mm from the top of the inner groove of the J Head mount.
genJHeadHeight = 0;
// J Head adjustments. How much to adjust the J Head mount. Really dependent on your printer. Print a calibration cube and enter the adjustments in size here. These are mm and will be added to their respective parameters. eg; you want to make the height of the collar in the middle smaller by .2mm, enter -.2 in innerCollarHeightAdjustment. If you want to make that same collar a larger hole by .2mm, enter .2 in innerCollarDiameterAdjustment.
upperCollarDiameterAdjustment = .1;
upperCollarHeightAdjustment = .15;
innerCollarDiameterAdjustment = .2;
innerCollarHeightAdjustment = -0.3;
lowerCollarDiameterAdjustment = .1;
lowerCollarHeightAdjustment = .15;
/* [Print Cooling Fan] */
// How thick the fan mount should be.
fanMountThickness = 4;
// Diameter of the hole for the screws that hold the fan on to the mount.
fanMountScrewDiameter = 4.5;
// Amount of material around the fan screw holes.
fanMountScrewMat = 3;
// X,Y coordinates of holes for fan screw relative to the center of the fan. Top right, top left, bottom left. Leave the negative signs.
fanMountScrews = [[21,20],[-22,20],[-22,-18]];
// Dimensions of the fan. Width, depth, height when looking at it from the side.
fanDimensions = [50,20,50];
// Outside dimensions of fan outlet
fanDuctConnectSize = [27, 20, 20];
// Offset from center of fan body to center of fan tab. Left / Right, Forward / Back, Up / Down. Usually only need Left / Right.
fanMountOffset = [2,0,0];
// Offset the center of the fan blower in relation to the overall fan body. Usually negative value of fanMountOffset.
fanCenterOffset = [-2,0,0];
// Diameter of fan opening. If your fan has air intakes on both sides, enter the diameter of that opening here.
fanIntakeDiameter = 20;
// How much clearance between the fan mount nubs and the fan tab. Too much of a gap and the fan mount will not snug up properly.
fanTabNubClear = .1;
// How far below the bottom of the fan should the bowl of the duct be.
fanDuctBowlDepth = 5;
// How thick should the exterior walls of the fan duct be?
fanDuctThickness = .8;
// How thick should the interior walls of the fan duct be?
fanDuctInternalThickness = .8;
// How far the fan duct should overlap the inside edge of the fan itself when connected.
fanDuctOverlap = 2.75;
// How far the fan duct should overlap the outside edge of the fan itself when connected.
fanDuctOutsideOverlap = 6;
// How far below the nozzle should the fan outlet point?
fanDuctOutletOffset = 1;
// Offset from the nozzles where the fan duct outlets should be placed. Leave named variables in place.
fanDuctOutletNozzleOffsetL = [16,3]; // [0] X distance from nozzle for start of duct opening, fanDuctThickness will be subtracted from this [1] Z distance from nozzle tip. + up, - down
classicFanDuctOutletNozzleOffsetL = [10,2]; // [0] X distance from nozzle for start of duct opening, fanDuctThickness will be subtracted from this [1] Z distance from nozzle tip. + up, - down
// Size of air chamber around fan duct ring.
fanDuctAirChamberSize = [5,1.5]; // [0] X width of internal portion of air chamber, [1] Z height of internal portion of air chamber.
// Size of the fan duct outlets.
fanDuctOutletSize = [8,4]; // [0] Number of outlets, will be spread out equally. [1] Size of outlets.
classicFanDuctOutletSize = [20,.1,3];
/* [Z Probe / Servo] */
// How high should the probe extension be for the Prusa i3 carriage? Normally full height to avoid issues with endstops and other parts of printer.
probeExtHeight = "full"; // [full:Full Height of X Carriage, minimum:Minimum required to support probe mount]
// How much of a gap from the edge of the X Carriage back plane to the inside of the servo mount.
probeExtWidth = 25;
// How wide the servo body is when held vertical and mount holes on top and bottom with output facing away.
servoWidth = 12;
// How tall the servo body is held in the same orientation as servoWidth.
servoHeight = 23.5;
// How tall the servo mounting bracket is. Held in the same orientation as servoWidth.
servoMountPlateHeight = 32;
// Center to center distance for mounting screws on servo.
servoScrewDistance = 28;
// Diameter of screws holes used for mounting servo. Should be slighty smaller than screw.
servoScrewDiameter = 1.5;
// How much material should exist around the servo and servo mount screws.
servoBracketMat = 1.5;
// Diameter of screw holes used for mount bracket that the hold servo bracket.
servoBracketScrewDiameter = 3.5;
// Size of hole for nut trap for servo bracket. Point to point, not flat to flat.
servoBracketNutDiameter = 6.5;
// Depth of hole for nut trap for servo bracket.
servoBracketNutDepth = 2.4;
// Depth of the servo bracket base.
servoBracketBaseDepth = 2;
// Offset of servo mount from the bracket. Allows for C Bot bracket screws to clear. Keep in mind the fan mount probably needs to be adjusted as well so servo and fan mount and fan duct don't interfere with each other.
servoBracketOffset = 1;
// Distance between center of servo motor output and side of the servo body.
servoCenterOffset = 5;
// Diameter of whole the servo fits through to mount the arm.
servoShaftDiameter = 6.2;
// Diameter of servo hat where it connects to the servo motor.
servoHatTopDiameter = 6.2;
// Length of servo hat.
servoHatLength = 19;
// Diameter of servo hat at the opposite end of the servo mount, the tip of the servo hat.
servoHatTipDiameter = 4.2;
// Depth the servo hat should recess into the Z Probe Arm.
servoHatRecessDepth = 2;
// Thickness of the Z Probe arm.
zProbeThickness = 4;
// Diameter of Z Probe switch mounting screws.
zProbeScrewDiameter = 2;
// Distance between Z Probe switch mount screws.
zProbeScrewDistance = 10;
// Distance from servo bracket to Z Probe Arm, purely for visualizing how the arm fits in the space provided.
zProbeArmOffset = 4;
// How much material should around the holes in the arm.
zProbeArmMat = 2;
// Distance between the switch mount holes and the side with the switch.
zProbeSwitchHeight = 7.5;
// Distance below nozzle you want the switch to trigger, roughly, depends on switch activation point.
zProbeSwitchActivationDistance = 5;
/* [Inductive / Capacitive Sensor] */
// Distance between hot end mount and side of induct mount. Only applicable to Prusa i3.
inductMountDistance = 8;
// Diameter of sensor.
inductDiameter = 18.6;
// Amount of material around sensor, account for nuts and washers around the sensor.
inductMat = 8;
// Height of mount plate above nozzle tip.
inductPlateHeight = 25;
// How much extra should be added to the carriage to provide clearance for the inductive mount bracket.
inductBracketExtra = 6;
/* [ Generic Probe Mount Variables ] */
// Offset of mount from back of X Carriage back plane.
probeOffset = 0;
// Thickness of sensor mount plate.
probePlateThickness = 3;
// Depth of back plate of probe mount.
probeBracketDepth = 3;
// Height of sensor mount braces.
probeBraceHeight = 20;
// Width of braces.
probeBraceWidth = 3;
// Diameter of screws that hold bracket on.
probeBracketScrewDiameter = 3.2;
// Diameter of nuts that hold bracket on.
probeBracketNutDiameter = 1.5;
// Depth of hole for nut trap for probe sensor bracket.
probeBracketNutDepth = 2.4;
// Mount inductive or BL Touch sensor with a removable bracket?
probeMountBracketed = 1; // [0:No, 1:Yes]
/* [Prusa i3 Carriage Advanced] */
// Variables used for calculations and not normally change variables..
xMountBoltDepth = (xMountDepth - xMountNutDepth); // How deep the X Carriage bolt shafts hole are.
xMountHoleWidthOffset = (xMountWidth - (xMountHoleWidth /2));
xMountHoleHeightOffset = (xMountHeight - (xMountHoleHeight /2));
/* [Chimera / Cyclops Advanced] */
// Variables for E3D Chimera / Cyclops
chiColdHeight = 30;
chiColdDepth = 16;
chiScrewHole = 3.2; // Size of hole for screws that mount the Chimera Cold End.
chiBowdenHole = 8.2; // Size of hole for bowden tube fittings.
chiHEPosUD = (carriage == "prusai3" ? 15 : 20);
chiBraceLength = chiColdDepth; // Length of brace for chimera mount in the horizontal. From back plane towards the front.
chiBraceHeight = (chiColdHeight / 2) - (carriage == "prusai3" ? (chiHEPosUD - (chiColdHeight / 2) < xMountCornerRadius ? xMountCornerRadius - (chiHEPosUD - (chiColdHeight / 2)) : 0) : 0);
chiWidth = 31; // Width of Chimera is 30, use 31 to account for 3d printer material overage. Use 30.5 for cnc.
chiMountDepth = (heDepthOffset + 20); // How far out the Chimera mount top plate should be.
chiMountWidth = (chiBraceThickness * 2) + chiWidth; // The width of the Chimera mount top plate.
chiScrewHoleHeight = chiMountHeight + .2; // How tall to make the Chimera mount screw holes.
chiScrewLocs = [[(chiMountWidth / 2) - 8.5, chiMountDepth - (heDepthOffset + 15)],
[(chiMountWidth / 2), chiMountDepth - (heDepthOffset + 3)],
[(chiMountWidth / 2) + 8.5, chiMountDepth - (heDepthOffset + 15)]]; // X,Y locations for Chimera mount screw holes.
chiBowdenHoleHeight = chiMountHeight + .2; // How tall to make the Bowden tube fitting holes.
chiBowdenLocs = [[(chiMountWidth / 2) - 9, chiMountDepth - (heDepthOffset + 6)],
[(chiMountWidth / 2) + 9, chiMountDepth - (heDepthOffset + 6)]]; // X,Y locations for Bowden tube fitting holes.
chiV6NozzleL = [[6,-6,-49.6],[24,-6,-49.6]]; // Location of Chimera V6 Nozzles in relation to top rear left corner of cold end.
chiVolNozzleL = [[6,-6,-59.6],[24,-6,-59.6]]; // Location of Chimera Volcano nozzles in relation to the top rear left corner of cold end.
cycNozzleL = [[15,-6,-50.1]]; // Location of Cyclops nozzle in relation to the top rear left corner of cold end.
chiCBotProbePos = 1; // Mounting position of probe mounts for the E3D Chimera on the C-Bot carriage.
/* [J Head Mount Advanced */
// Variables for J Head Mount
jHeadWidth = 26;
jHeadUpperCollarDiameter = upperCollarDiameterAdjustment + 16;
jHeadUpperCollarHeight = upperCollarHeightAdjustment + (hotend == "hexagon" ? 4.7 :
(hotend == "jhead_mkv" ? 4.76 :
3.7));
jHeadInnerCollarDiameter = innerCollarDiameterAdjustment + 12;
jHeadInnerCollarHeight = innerCollarHeightAdjustment + (hotend == "hexagon" ? 4.5 :
(hotend == "jhead_mkv" ? 4.64 :
6));
jHeadLowerCollarDiameter = lowerCollarDiameterAdjustment + 16;
jHeadLowerCollarHeight = lowerCollarHeightAdjustment + (hotend == "hexagon" ? 4.6 : 3);
jHeadMountHeight = jHeadUpperCollarHeight + jHeadInnerCollarHeight + jHeadLowerCollarHeight;
jHeadHEPosUD = (carriage == "prusai3" ? 14 : (hotend == "e3d_v6" ? 21 :
(hotend == "jhead_mkv" ? 11 :
(hotend == "generic_jhead" ? 11 :
(hotend == "hexagon" ? 14 : 30)))));
jHeadMountWidth = 36;
jHeadCollarCornerRadius = 3;
jHeadMountBoltDiameter = 3.2;
jHeadMountNutDiameter = 6.5;
jHeadMountNutDepth = 4.4;
jHeadFanScrewOffset = 5;
jHeadMountScrewHorizontalOffset = (jHeadWidth / 4);
jHeadMountScrewVerticalOffset = (jHeadMountHeight / 2);
jHeadCBotProbePos = 2; // Mounting position of probe mounts for J-Head mount based hotends on the C-Bot carriage.
/* [Hidden] */
// If the hotend is a chimera / cyclops based one, force extruder to be bowden and fan duct style to be classic..
realExtruder = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops") ? "bowden" : extruder;
realFanDuctStyle = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops") ? "classic" : fanDuctStyle;
echo("realFanDuctStyle", realFanDuctStyle);
// If the extruder is an E3D Titan, change the he depth to allign the titan and hotend properly.
jHeadMountDepth = (realExtruder == "titan" ? 27 : 25); // Do not change this value, the direct drive extruders require this to be placed here and OpenSCAD programming makes it nearly impossible to auto adjust.
/* [E3D V6 Advanced] */
// Variables for E3D V6
v6NozzleL = [[0, 0, -62]]; // This must be a vector of vectors. If only one nozzle, enter x,y,z in [[ ]]
v6VolNozzleL = [[0,0,-70.5]]; // This must be a vector of vectors. If only one nozzle, enter x,y,z in [[ ]]
/* [J Head Mark V Advanced] */
// Variables for J Head Mark V
jheadMkVNozzleL = [[0, 0, -51]]; // This must be a vector of vectors. If only one nozzle, enter x,y,z in [[ ]]
/* [Hexagon Advanced] */
// Variables for Hexagon Hot End
hexagonNozzleL = [[0, 0, -55]]; // This must be a vector of vectors. If only one nozzle, enter x,y,z in [[ ]]
/* [Generic J Head Advanced] */
// Variables for Generic J Head Hot End
genericJHeadNozzleL = [[0, 0, -genJHeadHeight]]; // This must be a vector of vectors. If only one nozzle, enter x,y,z in [[ ]]
/* [E3D Titan Extruder Advanced] */
// Variables for E3D Titan extruder.
e3dTitanOffset = [0,13.5]; // This is offset of the filament path. 0 - From center of stepper shaft, 1 - From face of carrier / mount. Do not change.
e3dTitanMountThickness = 6; // [2:2 MM, 5:5 MM]
e3dTitanMountMat = 3; // How much material should be around the face of the mount.
e3dTitanMountCornerRadius = 4; // The radius of the corners for the mounting plate.
/* [Hidden] */
// Collision switch variables
ylSwitchDimensions = [[25.5,5,15],[7.25,11.5,3.2,6.5,2.4]]; //[x,y,z],[hole x, hole z, hole d, nut dia, nut depth],[hole.....
keyesSwitchDimensions = [[26.5,10,22],[3.5,18.5,3.2,6.5,2.4],[3.5,3.5,3.2,6.5,2.4]];
genSwitchDimensions = [[10.5,7,21],[2.5,5.5,2.5,4,1.8],[2.5,15.5,2.5,4,1.8]];
cBotXAxisSwitchDimensions = (cBotXAxisSwitch == "yl99" ? ylSwitchDimensions :
(cBotXAxisSwitch == "keyes" ? keyesSwitchDimensions :
(cBotXAxisSwitch == "gen" ? genSwitchDimensions : [])));
// Display parts offset
partsOffset = [0,10,0];
// Generic Hot End Variables
heNozzleL = (hotend == "chimera_v6" ? chiV6NozzleL
: (hotend == "chimera_vol" ? chiVolNozzleL
: (hotend == "cyclops" ? cycNozzleL
: (hotend == "e3d_v6" ? v6NozzleL
: (hotend == "e3d_v6_vol" ? v6VolNozzleL
: (hotend == "jhead_mkv" ? jheadMkVNozzleL
: (hotend == "hexagon" ? hexagonNozzleL
: (hotend == "gen_jhead" ? genericJHeadNozzleL
: [[0]])))))))); // This must be a vector of vectors. If only one nozzle, enter x,y,z in [[ ]]
// Variables for BLTouch
blPlateOuterRadius = 4; // Radius of outer circles of the mount.
blPlateInnerDiameter = 3.2; // Diameter of outer circles used to mount the BL Touch.
blPlateCenterDiameter = 4.5; // Diameter of inner circle for wires.
blPlateRectDimensions = [8,11.54]; // Width, Depth of rectangle at center of plate.
blPlateInnerDistance = 9; // Distance from center of BL Touch to center of outer mounting holes.
blMountWidth = (blPlateOuterRadius + blPlateInnerDistance) * 2; // Overall width to consider when placing the BL Touch mounting bracket.
blMountDistance = 10; // Extra distance from other components.
blPlateHeight = 28; // The target height from the tip of the of the nozzle for the mount.
bltouchBracketExtra = 2; // How much extra should be added to the carriage to provide clearance for the bltouch mount bracket.
// Nema 17 Stepper Dimension variables.
nema17CenterDiameter = 22.4; // Diameter of hole for center of Nema 17 Stepper. Spec is 22, but added a little buffer.
nema17MountHoleLocs = [[-15.5,15.5],[15.5,15.5],[-15.5,-15.5],[15.5,-15.5]]; // Offsets from center of shaft to mounting holes, top left, top right, bottom left, bottom right.
nema17MountHoleDiameter = 3; // Diameter of mounting hole.
nema17OuterOffset= 21.15; // Offset of outside edges from center of shaft. Only need single value due to Nema 17 being square and shaft in center.
// Prusa i3 variant carriage specific positioning variables.
prusai3FanBarWidth = prusai3FanTabWidth + (prusai3FanTabNubWidth * 2) + (fanTabNubClear * 2);
prusai3FanTabHeight = chiMountHeight;
prusai3FanScrewOffset = (((prusai3FanTabHole / 2) + prusai3FanTabMat) - prusai3FanTabHeight);
prusai3RealFanTabVerticalAngle = printFanSide == "left" ?
- prusai3FanTabVerticalAngle :
prusai3FanTabVerticalAngle;
prusai3ChiMountL = [((xMountWidth / 2) - (chiMountWidth / 2)),
- (xMountDepth + chiMountDepth),
chiHEPosUD + heHeightOffset]; // Position of Chimera Mount.
prusai3ChiAnchorL = [((xMountWidth / 2) - (chiWidth / 2)),
- (xMountDepth + heDepthOffset),
prusai3ChiMountL[2]]; // Position of Chimera Mount Anchor point.
prusai3JHeadMountL = [((xMountWidth / 2) - (jHeadMountWidth / 2)),
- (xMountDepth + jHeadMountDepth + heDepthOffset),
jHeadHEPosUD + heHeightOffset]; // Position of J Head Mount.
prusai3JHeadAnchorL = [(xMountWidth / 2),
- (xMountDepth + (jHeadMountDepth / 2) + heDepthOffset),
prusai3JHeadMountL[2] + jHeadMountHeight]; // Position of J Head Anchor point..
prusai3HEMountL = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops")
? prusai3ChiMountL
: (hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead")
? prusai3JHeadMountL
: 0;
prusai3HEAnchorL = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops")
? prusai3ChiAnchorL
: (hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead")
? prusai3JHeadAnchorL
: 0;
prusai3ChiFanScrewL = [printFanSide == "left" ?
prusai3ChiMountL[0] + (sin(prusai3RealFanTabVerticalAngle) * ((prusai3FanTabHole / 2) + prusai3FanTabMat + prusai3FanTabDepth)) :
prusai3ChiMountL[0] + chiMountWidth + (sin(prusai3RealFanTabVerticalAngle) * ((prusai3FanTabHole / 2) + prusai3FanTabMat + prusai3FanTabDepth)),
prusai3ChiMountL[1] - (cos(prusai3RealFanTabVerticalAngle) * ((prusai3FanTabHole / 2) + prusai3FanTabMat + prusai3FanTabDepth)),
prusai3ChiMountL[2] + (prusai3FanTabHole / 2) + prusai3FanTabMat]; // Offset of the center of the fan mount screw from prusai3FanTabL
prusai3JHeadFanScrewL = [prusai3JHeadMountL[0] + (jHeadMountWidth / 2) + (sin(prusai3RealFanTabVerticalAngle) * ((prusai3FanTabHole / 2) + prusai3FanTabMat + prusai3FanTabDepth)),
prusai3JHeadMountL[1] - prusai3FanBracketDepth - (cos(prusai3RealFanTabVerticalAngle) * ((prusai3FanTabHole / 2) + prusai3FanTabMat + prusai3FanTabDepth)),
prusai3JHeadMountL[2] + (jHeadMountHeight / 2) + ((prusai3FanTabHeight / 2) + prusai3FanScrewOffset)]; // Offset of the center of the fan mount screw from prusai3FanTabL
prusai3FanScrewL = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops")
? prusai3ChiFanScrewL
: (hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead")
? prusai3JHeadFanScrewL
: 0;
prusai3DuctConnectL = fan_duct_connect(prusai3FanScrewL, prusai3FanTabHorizontalAngle, prusai3RealFanTabVerticalAngle, fanDimensions, fanCenterOffset, fanMountOffset, fanMountThickness, prusai3FanTabHole, prusai3FanTabMat, fanDuctConnectSize);
/* [C Bot Carriage Advanced] */
// Variables for C Bot Carriage.
cBotCarriageSideDistance = 20 + (cBotCarriageSlider ? 0 : vslotOversize);
cBotTopHoleLength = 0;
cBotTopHoleAngle = 0;
cBotTopHoleDepth = cBotCarriageSlider ? 0 : 4.1;
cBotMountScrewDepth = cBotCarriageDepth - 2.5;
cBotBeltDepth = 2;
cBotBeltToothHeight = 1;
cBotBeltToothSpacing = 2;
cBotBeltToothLength = 10;
cBotBeltLength = 13;
cBotBeltHeight = 7;
cBotBeltBottomPos = 7; // Distance from center of carriage side.
cBotBeltTopPos = 6; // Distance from center of carriage side.
cBotBeltScrewDiameter = 3.0;
cBotBeltScrewDistance = 3;
cBotBeltScrewNutDiameter = 6.5;
cBotBeltScrewNutDepth = -0.3;
cBotBeltHolderHeight = 19;
cBotBeltHolderDepth = 4;
cBotBeltHolderNubDepth = 3;
cBotBeltHolderNubHeight = 6.2;
cBotBeltHolderCornerRadius = 1;
cBotCenterHoleDiameter = 25;
cBotCenterHoleWidth = 30;
cBotCarriageCornerRadius = (cBotCarriageIdlerScrewDiameter / 2) + cBotCarriageIdlerScrewMat;
cBotFanTabVerticalAngle = 0;
cBotFanTabHorizontalAngle = 0;
cBotRealFanTabVerticalAngle = printFanSide == "left" ?
cBotFanTabVerticalAngle :
- cBotFanTabVerticalAngle;
cBotFanMountDistance = 10;
cBotFanBracketWidth = 20;
cBotFanBracketHeight = 8;
cBotFanBracketDepth = 3;
cBotFanTabHeight = 8;
cBotFanTabWidth = 5;
cBotFanTabDepth = 4;
cBotFanTabAngle = 0;
cBotFanTabHole = 3.2;
cBotFanTabMat = 2;
cBotXBumperHeight = 10; // Total Height of bumper.
cBotXBumperWidth = 14; // How wide to make the bumper.
cBotXBumperDepth = 3; // How thick to make the bumper.
cBotXBumperHolePos = [10,5]; // Where the hole is in relation to the bottom of the bumper.
/* [Hidden] */
realZProbeSide = (carriage == "prusai3" && extruder == "titan" ? "left" : zProbeSide);
inductMountWidth = inductDiameter + (probeBraceWidth * 2) + (inductMat * 2);
cBotProbePos = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops") ? chiCBotProbePos : jHeadCBotProbePos; // Used the correct location of the probe mount based on hotend type.
heMountWidth = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops")
? chiMountWidth
: (hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead")
? jHeadMountWidth
: 0;
cBotTempCarriageWidth = heMountWidth + (cBotCarriageIdlerScrewDiameter * 2) + (cBotCarriageIdlerScrewMat * 4) +
(servoInduct == "servo" ? servoHeight :
(servoInduct == "induct" ? inductMountWidth + inductBracketExtra:
(servoInduct == "bltouch" ? blMountWidth + bltouchBracketExtra:
0)));
cBotCarriageWidth = (cBotCarriageMinWidth > cBotTempCarriageWidth ? cBotCarriageMinWidth : cBotTempCarriageWidth);
cBotFanBarWidth = cBotFanTabWidth + (cBotFanTabWidth * 2) + (fanTabNubClear * 2);
cBotFanScrewL = [printFanSide == "left" ? cBotCarriageWidth - (fanDimensions[0] / 2) :
(fanDimensions[0] / 2),
cBotCarriageSideDistance + cBotCarriageDepth + cBotFanBracketDepth + cBotFanTabDepth + (cBotFanTabHole / 2) + cBotFanTabMat,
cBotFanMountPos];
cBotFanScrewOffset = 0;
cBotTempDuctConnectL = fan_duct_connect(cBotFanScrewL, cBotFanTabHorizontalAngle, cBotRealFanTabVerticalAngle, fanDimensions, fanCenterOffset, fanMountOffset, fanMountThickness, cBotFanTabHole, cBotFanTabMat, fanDuctConnectSize, true);
cBotDuctConnectL = [cBotTempDuctConnectL[1],cBotTempDuctConnectL[0]];
cBotChiMountL = [(realZProbeSide == "right" ? (cBotBeltLength + 2) :
(cBotCarriageWidth - (cBotBeltLength + chiMountWidth + 2))),
- (cBotCarriageDepth + chiMountDepth),
chiHEPosUD + heHeightOffset];
cBotChiAnchorL = [cBotChiMountL[0] + ((chiMountWidth - chiWidth) / 2),
- (cBotCarriageDepth + heDepthOffset),
cBotChiMountL[2]]; // Position of Chimera Mount.
cBotJHeadMountL = [(realZProbeSide == "right" ? (cBotBeltLength + 2) :
(cBotCarriageWidth - (cBotBeltLength + jHeadMountWidth + 2))),
- (cBotCarriageDepth + jHeadMountDepth + heDepthOffset),
jHeadHEPosUD + heHeightOffset];
cBotJHeadAnchorL = [cBotJHeadMountL[0] + (jHeadMountWidth / 2),
- (cBotCarriageDepth + (jHeadMountDepth / 2) + heDepthOffset),
cBotJHeadMountL[2] + jHeadMountHeight]; // Position of E3D V6 Mount.
cBotHEMountL = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops")
? cBotChiMountL
: (hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead")
? cBotJHeadMountL
: 0;
cBotHEAnchorL = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops")
? cBotChiAnchorL
: (hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead")
? cBotJHeadAnchorL
: 0;
cBotCableTieHorizontalDistance = (cBotCarriageWidth / (cBotCableTieHorizontalCount + 1));
// Generic variables that are hot end and carriage dependent.
heMountL = (carriage == "prusai3" ? prusai3HEMountL : (carriage == "cbot" ? cBotHEMountL : 0));
heAnchorL = (carriage == "prusai3" ? prusai3HEAnchorL : (carriage == "cbot" ? cBotHEAnchorL : 0));
fanScrewL = (carriage == "prusai3" ? prusai3FanScrewL : (carriage == "cbot" ? cBotFanScrewL : 0));
tempDuctConnectL = (carriage == "prusai3" ? prusai3DuctConnectL : (carriage == "cbot" ? cBotDuctConnectL : 0));
ductConnectL = (printFanDirection == "left" ? tempDuctConnectL[0] : tempDuctConnectL[1]);
heMountWidth = (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops")
? chiMountWidth
: (hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead")
? jHeadMountWidth
: 0;
// Generic Z Probe variable logic
probeMountDistance = (servoInduct == "induct" ? inductMountDistance :
(servoInduct == "bltouch" ? blMountDistance :
0));
probeMountWidth = (servoInduct == "induct" ? inductMountWidth :
(servoInduct == "bltouch" ? blMountWidth :
0));
probePlateHeight = (servoInduct == "induct" ? inductPlateHeight :
(servoInduct == "bltouch" ? blPlateHeight :
0));
prusai3ProbeMountL = [ realZProbeSide == "right" ?
heMountL[0] + heMountWidth + probeMountDistance:
heMountL[0] - (probeMountWidth + probeMountDistance),
-xMountDepth,
heAnchorL[2] + heNozzleL[0][2] + probePlateHeight];
cBotProbeMountL = [ realZProbeSide == "right" ?
(cBotCarriageWidth / 2) + ((cBotFanMountDistance / 2) + (cBotFanMountDistance * floor((((cBotCarriageWidth - (cBotCarriageIdlerScrewDiameter * 2) - (cBotCarriageIdlerScrewMat * 4)) / cBotFanMountDistance) / 2) - cBotProbePos /* The number after the - sign before this comment indicates position from edge */))) - (probeMountWidth / 2) :
(cBotCarriageWidth / 2) - ((cBotFanMountDistance / 2) + (cBotFanMountDistance * floor((((cBotCarriageWidth - (cBotCarriageIdlerScrewDiameter * 2) - (cBotCarriageIdlerScrewMat * 4)) / cBotFanMountDistance) / 2) - cBotProbePos /* The number after the - sign before this comment indicates position from edge. */))) - (probeMountWidth / 2),
- cBotCarriageDepth,
heAnchorL[2] + heNozzleL[0][2] + probePlateHeight];
probeMountL = (carriage == "prusai3" ? prusai3ProbeMountL : (carriage == "cbot" ? cBotProbeMountL : 0));
carriageDepth = (carriage == "prusai3" ? xMountDepth : cBotCarriageDepth);
echo("probeMountL", probeMountL);
echo("probeMountWidth", probeMountWidth);
// Variables for Fan Duct
fanDuctOutletAngle = atan((fanDuctOutletNozzleOffsetL[1] + fanDuctOutletOffset + fanDuctOutletSize[1]) / fanDuctOutletNozzleOffsetL[0]);
classicFanDuctOutletAngle = atan((classicFanDuctOutletNozzleOffsetL[1] + fanDuctOutletOffset + (classicFanDuctOutletSize[1] / 2) + fanDuctThickness) / classicFanDuctOutletNozzleOffsetL[0]);
fanDuctConnectRadius = fanDuctConnectSize[2] / 2; // Radius of the bottom of the fan duct below housing.
// Variables for probe extension and servo bracket.
prusai3ServoBracketL = [ realZProbeSide == "right" ?
(xMountWidth + probeExtWidth - (servoBracketNutDiameter / 2) - servoBracketMat) :
(- probeExtWidth + (servoBracketNutDiameter / 2) + servoBracketMat),
-carriageDepth,
- (((servoMountPlateHeight + (servoBracketNutDiameter * 2) + (servoBracketMat * 4)) / 2) - (xMountHeight / 2))];
cBotServoBracketL = [realZProbeSide == "right" ?
(cBotCarriageWidth / 2) + ((cBotFanMountDistance / 2) + (cBotFanMountDistance * floor(((cBotCarriageWidth / cBotFanMountDistance) / 2) -3))) :
(cBotCarriageWidth / 2) - ((cBotFanMountDistance / 2) + (cBotFanMountDistance * floor(((cBotCarriageWidth / cBotFanMountDistance) / 2) -3))),
- cBotCarriageDepth - servoBracketBaseDepth,
- ((servoBracketMat * 2) + servoWidth + ((servoMountPlateHeight - servoHeight) / 2))];
servoBracketL = (carriage == "prusai3" ? prusai3ServoBracketL : cBotServoBracketL);
servoMountL = [-(servoBracketMat + (servoBracketScrewDiameter / 2)),
-((servoBracketMat * 2) + servoWidth + servoBracketBaseDepth + (carriage == "cbot" ? - servoBracketOffset : 0)),
(servoBracketMat * 2) + servoBracketNutDiameter];
prusai3ServoBracketBotScrewL = [0,0,(servoBracketMat + (servoBracketNutDiameter / 2))];
prusai3ServoBracketTopScrewL = [0,0,(servoBracketMat * 3) + (servoBracketNutDiameter * 1.5) + servoMountPlateHeight];
cBotServoBracketBotScrewL = [realZProbeSide == "right" ?
- cBotFanMountDistance :
cBotFanMountDistance,
servoBracketBaseDepth,
-servoBracketL[2] + cBotAccessoryMountPos];
cBotServoBracketTopScrewL = [cBotServoBracketBotScrewL[0],
cBotServoBracketBotScrewL[1],
cBotServoBracketBotScrewL[2] + cBotAccessoryMountPos];
servoBracketBotScrewL = (carriage == "prusai3" ? prusai3ServoBracketBotScrewL : cBotServoBracketBotScrewL);
servoBracketTopScrewL = (carriage == "prusai3" ? prusai3ServoBracketTopScrewL : cBotServoBracketTopScrewL);
/*cBotServoMountL = [-(servoBracketMat + (servoBracketScrewDiameter / 2)),
-((servoBracketMat * 2) + servoWidth + servoBracketBaseDepth),
(servoBracketMat * 2) + servoBracketNutDiameter];
servoMountL = (carriage == "prusai3" ? prusai3ServoMountL : cBotServoMountL);
*/
// Variables for Z Probe
prusai3ZProbeTopL = [realZProbeSide == "right" ?
servoBracketL[0] + servoMountL[0] - zProbeArmOffset:
servoBracketL[0] + servoMountL[0] + zProbeArmOffset,
servoBracketL[1] + servoMountL[1] + servoBracketMat + (servoWidth / 2),
servoBracketL[2] + servoMountL[2] + ((servoMountPlateHeight - servoHeight) / 2) + servoCenterOffset];
cBotZProbeTopL = [realZProbeSide == "right" ?
servoBracketL[0] + servoMountL[0] - zProbeArmOffset:
servoBracketL[0] - servoMountL[0] + zProbeArmOffset,
servoBracketL[1] + servoMountL[1] + servoBracketMat + (servoWidth / 2),
servoBracketL[2] + servoMountL[2] + ((servoMountPlateHeight - servoHeight) / 2) + servoCenterOffset];
zProbeTopL = (carriage == "prusai3" ? prusai3ZProbeTopL : cBotZProbeTopL);
zProbeBottomL = -zProbeTopL[2] + (heAnchorL[2] + heNozzleL[0][2]) + (servoHatTopDiameter / 2) + zProbeArmMat + zProbeSwitchHeight - zProbeSwitchActivationDistance;
// Toggle that controls if fan is shown.
showFan = true;
showHE = true;
//////////// Prusa i3 Carriage //////////
if (carriage == "prusai3") {
// X Carriage Mount
if(prusai3Which == "hotm" || prusai3Which == "all") {
// Spin up the Mount.
difference () {
union() {
// Create the backplane.
xback_plane();
// Place the hot end mount, need to do here so holes are cut correctly.
// Chimera Mount
if(hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops") {
// Place the Chimera mount
translate(heMountL)
chimera_mount("below",
prusai3RealFanTabVerticalAngle, prusai3FanTabWidth, prusai3FanTabDepth,
prusai3FanTabHeight, prusai3FanTabHole, prusai3FanTabMat, printFanSide);
}
// J Head style mount
if(hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead") {
// Place the J Head style mount
translate(heMountL)
jhead_mount(carriageDepth);
}
// Attach fan tab if needed.
if((printFanSide != "none") && (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops")) {
translate(fanScrewL)
rotate([0,0,prusai3RealFanTabVerticalAngle])
fan_tab(prusai3FanScrewOffset,prusai3FanTabWidth,
prusai3FanTabDepth,prusai3FanTabHeight,prusai3FanTabHole,prusai3FanTabMat);
}
// Servo Extension
if(servoInduct == "servo") {
// Place the servo extension.
servo_ext(servoBracketL);
}
// Inductive / Capacitive / BL Touch Extension
if(servoInduct == "induct" || servoInduct == "bltouch") {
// Place the Inductive / Capacitive Sensor extension.
probe_ext();
}
}
// Cut out the holes needed to mount the back plane to the X Carriage.
xback_holes();
// Cut out the wholes for the appropriate cold / hot end.
if(hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops") {
// Cut out the wholes needed to mount and use the Chimera.
translate(heMountL)
chimera_mount_holes();
}
// Carve J Head style mount holes, if needed.
if(hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead") {
translate(heMountL)
jhead_holes(carriageDepth);
}
// Servo Extension Holes
if(servoInduct == "servo") {
// Cut out the holes for the servo bracket.
servo_ext_holes(servoBracketL);
}
// Inductive / Capacitive / BL Touch Extension
if(servoInduct == "induct" || servoInduct == "bltouch") {
// Place the Inductive / Capacitive sensor holes.
translate(probeMountL)
probe_ext_holes(carriageDepth);
}
}
}
// J Head style mount collar
if((hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead") && (prusai3Which == "jhead_col" || prusai3Which == "all")) {
// Place the J Head collar.
translate(explodeParts == 1 ? (heMountL - partsOffset) : heMountL)
jhead_collar(carriageDepth);
}
// Display cold / hot end model.
if((prusai3Which == "hotm" || prusai3Which == "all") && (hotend == "chimera_v6" || hotend == "chimera_vol" || hotend == "cyclops") && (showHE == true)) {
// Place the E3D Chimera fron Jons.
translate([((xMountWidth - chiWidth) / 2) + (chiWidth /2),
- (carriageDepth + heDepthOffset + 6), // 6 is there to offset the fan in the e3d model, used to line everything up properly
heMountL[2] - chiColdHeight])
%e3d();
}
// Display E3D V6 if needed.
if((prusai3Which == "hotm" || prusai3Which == "all") && (hotend == "e3d_v6" || hotend == "e3d_v6_vol") && (showHE == true)) {
// Place the E3D V6.
translate([heMountL[0] + (jHeadMountWidth / 2),
heMountL[1] + (jHeadMountDepth / 2),
heMountL[2] + 16])
rotate([0,180,0])
%e3d();
}
// Display Hexagon if needed.
if((prusai3Which == "hotm" || prusai3Which == "all") && (hotend == "hexagon") && (showHE == true)) {
// Place the E3D V6.
translate([heMountL[0] + (jHeadMountWidth / 2),
heMountL[1] + (jHeadMountDepth / 2),
heMountL[2] + hexagonNozzleL[0][2] + 12.7])
rotate([0,0,0])
%hexagon_hotend();
}
// Fan Bracket, if needed.
if((prusai3Which == "fant" || prusai3Which == "all") && (hotend == "e3d_v6" || hotend == "e3d_v6_vol" || hotend == "jhead_mkv" || hotend == "hexagon" || hotend == "gen_jhead")) {
// Place the fan tab.
translate(explodeParts == 1 ? (fanScrewL - (partsOffset * 2)) : fanScrewL)
bracket_fan_tab(jHeadMountWidth - (jHeadCollarCornerRadius * 2), prusai3FanBracketDepth, jHeadMountHeight, jHeadMountBoltDiameter,
(jHeadMountWidth / 2),
prusai3FanTabWidth, prusai3FanTabDepth, prusai3FanTabHeight,
prusai3FanTabHole, prusai3FanTabMat, prusai3FanScrewOffset);
}
// Fan Mount
if((prusai3Which == "fanm" || prusai3Which == "all") && printFanSide != "none") {
// Spin up the Fan Mount.
translate(explodeParts == 1 ? (fanScrewL - (partsOffset * 3)) : fanScrewL)
rotate([prusai3FanTabHorizontalAngle,0,prusai3RealFanTabVerticalAngle])
fan_mount(prusai3FanTabHole, prusai3FanTabMat, prusai3FanTabWidth, fanTabNubClear, fanMountThickness, prusai3FanBarWidth, fanMountOffset, fanCenterOffset, fanMountScrewDiameter, fanMountScrewMat, fanMountScrews, fanIntakeDiameter, printFanDirection);
}
// Display fan if needed
if(showFan == true && (prusai3Which == "all" || prusai3Which == "fanm")) {
if(printFanDirection == "left") {
// Place the fan for reference.
translate(explodeParts == 1 ? (fanScrewL - (partsOffset * 3)) : fanScrewL)
rotate([prusai3FanTabHorizontalAngle,0,prusai3RealFanTabVerticalAngle])
rotate([0,-90,0])
translate([fanMountOffset[2],
-((prusai3FanTabHole / 2) + prusai3FanTabMat + fanMountThickness + fanMountOffset[1] + fanDimensions[1]),
fanMountOffset[0]])
%blower_fan_50_20();
}
else {
translate(explodeParts == 1 ? (fanScrewL - (partsOffset * 3)) : fanScrewL)
rotate([-prusai3FanTabHorizontalAngle,0,180 + prusai3RealFanTabVerticalAngle])
rotate([0,-90,0])
translate([fanMountOffset[2],
((prusai3FanTabHole / 2) + prusai3FanTabMat + fanMountThickness + fanMountOffset[1]),
fanMountOffset[0]])
%blower_fan_50_20();
}
}
// Display fan duct if needed
if((prusai3Which == "all" || prusai3Which == "duct") && printFanSide != "none") {
// Place the fan duct.
translate(explodeParts == 1 ? (fanScrewL - (partsOffset * 3)) : fanScrewL)
rotate([prusai3FanTabHorizontalAngle,0,prusai3RealFanTabVerticalAngle])
translate(ductConnectL)