Skip to content

Commit 582347e

Browse files
committed
WIP: HP: Allow prism-like setups instead of just pyramid-like setups
3.5 HP: Change from bool to class and introduce None mode 3.5 HP: refactor out IsInsidePyramidSides 3.5 HP: refactor out IsInsidePrismSides
1 parent a18141b commit 582347e

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

src/Movement/Kinematics/HangprinterKinematics.cpp

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ void HangprinterKinematics::Init() noexcept
9999
constexpr float DefaultTorqueConstants[HANGPRINTER_AXES] = { 0.0F };
100100

101101
ARRAY_INIT(anchors, DefaultAnchors);
102+
anchorMode = HangprinterAnchorMode::LastOnTop;
102103
printRadius = DefaultPrintRadius;
103104
spoolBuildupFactor = DefaultSpoolBuildupFactor;
104105
ARRAY_INIT(spoolRadii, DefaultSpoolRadii);
@@ -419,25 +420,51 @@ static bool isSameSide(float const v0[3], float const v1[3], float const v2[3],
419420
return dot0*dot1 > 0.0F;
420421
}
421422

422-
// For each triangle side in a pseudo-pyramid, check if the point is inside the pyramid (Except for the base)
423-
// Also check that any point below the line between two exterior anchors (all anchors are exterior except for the last one)
424-
// is in the "inside part" all the way down to min_Z, however low it may be.
425-
// To further limit the movements in the X and Y axes one can simply set a smaller print radius.
426-
bool HangprinterKinematics::IsReachable(float axesCoords[MaxAxes], AxesBitmap axes) const noexcept /*override*/
423+
bool HangprinterKinematics::IsInsidePyramidSides(float const coords[3]) const noexcept
427424
{
428-
float const coords[3] = {axesCoords[X_AXIS], axesCoords[Y_AXIS], axesCoords[Z_AXIS]};
429425
bool reachable = true;
430426

431427
// Check all the planes defined by triangle sides in the pyramid
432428
for (size_t i = 0; reachable && i < HANGPRINTER_AXES - 1; ++i) {
433429
reachable = reachable && isSameSide(anchors[i], anchors[(i+1) % (HANGPRINTER_AXES - 1)], anchors[HANGPRINTER_AXES - 1], anchors[(i+2) % (HANGPRINTER_AXES - 1)], coords);
434430
}
431+
return reachable;
432+
}
433+
434+
bool HangprinterKinematics::IsInsidePrismSides(float const coords[3], unsigned const discount_last) const noexcept
435+
{
436+
bool reachable = true;
435437

436438
// For each side of the base, check the plane formed by side and another point bellow them in z.
437-
for (size_t i = 0; reachable && i < HANGPRINTER_AXES - 1; ++i) {
439+
for (size_t i = 0; reachable && i < HANGPRINTER_AXES - discount_last; ++i) {
438440
float const lower_point[3] = {anchors[i][0], anchors[i][1], anchors[i][2] - 1};
439441
reachable = reachable && isSameSide(anchors[i], anchors[(i+1) % (HANGPRINTER_AXES - 1)], lower_point, anchors[(i+2) % (HANGPRINTER_AXES - 1)], coords);
440442
}
443+
return reachable;
444+
}
445+
446+
// For each triangle side in a pseudo-pyramid, check if the point is inside the pyramid (Except for the base)
447+
// Also check that any point below the line between two exterior anchors (all anchors are exterior except for the last one)
448+
// is in the "inside part" all the way down to min_Z, however low it may be.
449+
// To further limit the movements in the X and Y axes one can simply set a smaller print radius.
450+
bool HangprinterKinematics::IsReachable(float axesCoords[MaxAxes], AxesBitmap axes) const noexcept /*override*/
451+
{
452+
float const coords[3] = {axesCoords[X_AXIS], axesCoords[Y_AXIS], axesCoords[Z_AXIS]};
453+
bool reachable = true;
454+
455+
switch (anchorMode) {
456+
case HangprinterAnchorMode::None:
457+
return true;
458+
459+
// This reaches a pyramid on top of the lower prism if the bed is below the lower anchors
460+
case HangprinterAnchorMode::LastOnTop:
461+
default:
462+
reachable = reachable && IsInsidePyramidSides(coords);
463+
reachable = reachable && IsInsidePrismSides(coords, 1);
464+
465+
case HangprinterAnchorMode::AllOnTop:
466+
reachable = reachable && IsInsidePrismSides(coords, 0);
467+
};
441468

442469
return reachable;
443470
}

src/Movement/Kinematics/HangprinterKinematics.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212

1313
#if SUPPORT_HANGPRINTER
1414

15+
// Different modes can be configured for different tradeoffs in terms of printing volumes and speeds
16+
enum class HangprinterAnchorMode {
17+
None, // All is reacheable in None anchor mode as printing volume
18+
LastOnTop, // (Default) Rsults in a pyramid plus a prism below if the lower anchors are above the printing bed
19+
AllOnTop, // Result in a prism (speeds get limited, specially going down in Z)
20+
};
21+
1522
class HangprinterKinematics : public RoundBedKinematics
1623
{
1724
public:
@@ -55,6 +62,9 @@ class HangprinterKinematics : public RoundBedKinematics
5562
protected:
5663
DECLARE_OBJECT_MODEL_WITH_ARRAYS
5764

65+
bool IsInsidePyramidSides(float const coords[3]) const noexcept;
66+
bool IsInsidePrismSides(float const coords[3], unsigned const discount_last) const noexcept;
67+
5868
private:
5969
// Basic facts about movement system
6070
static constexpr size_t HANGPRINTER_AXES = 4;
@@ -71,6 +81,7 @@ class HangprinterKinematics : public RoundBedKinematics
7181
void PrintParameters(const StringRef& reply) const noexcept; // Print all the parameters for debugging
7282

7383
// The real defaults are in the cpp file
84+
HangprinterAnchorMode anchorMode = HangprinterAnchorMode::LastOnTop;
7485
float printRadius = 0.0F;
7586
float anchors[HANGPRINTER_AXES][3] = {{ 0.0, 0.0, 0.0},
7687
{ 0.0, 0.0, 0.0},

0 commit comments

Comments
 (0)