Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better tree support for pointy overhangs: Cradle Generation #1880

Draft
wants to merge 136 commits into
base: main
Choose a base branch
from

Conversation

ThomasRahm
Copy link
Contributor

@ThomasRahm ThomasRahm commented May 7, 2023

Tree Support Cradle Generation

One issue of tree supports is that pointy overhangs are more prone to failing. This PR tries to solve this by surrounding the model with lines orthogonal to the model outline.
The model is not densely surrounded with support, as this would make the support impossible to remove without damaging the model.

Example Cradle

It works great in my tests, but i do have some stringing issues with my printer, which may cause the result to be better than with a well tuned printer.

One of my issues is that the the cradle currently has more settings than i think it should.
I am very open to further feedback, as currently this feature has way to many settings.
The settings are currently added using a dummy plugin found here

Settings:

Enforce Initial Layer Diameter

Enlarge tips so that the branch could reach Initial layer Diameter. This should improve the tree supports ability to support areas very close to the buildplate. Enabling support skin or using support roof is strongly recommended.

Disabled:
Enforce Initial Layer Diameter Off

Enabled:
Enforce Initial Layer Diameter On

Cradle Height

The height of the cradle to support pointy overhangs. The cradle will stop generating if the pointy part of the model connects with another part of the model that either rests on the buildplate or already has its own cradle. Set to 0 to disable.

Small Cradle Height:
Small Cradle Height

Large Cradle Height:
Large Cradle Height

Minimum Cradle Height

If a cradle smaller than this would generate, it just doesn't.

Cradle Lines

Amount of lines that should be generated around the model.

Low Amount Of Cradle Lines:
Low Amount Of Cradle Lines

Large Amount Of Cradle Lines:
Large Amount Of Cradle Lines

Cradle Length

Length of the lines that generate around the model.

Small Cradle Length:
Small Cradle Length

Large Cradle Length:
Large Cradle Length

Cradle Line Width

Width of the lines that generate around the model. I would just hard-code this to line width.

Small Cradle Line Width:
Small Cradle Line Width

Large Cradle Line Width:
Large Cradle Line Width

Cradle Threshold

Maximum area a pointy overhang may have for the cradle to generate.

Cradle Base Support Area Diameter

Size of the tips below an pointy overhang overhang. Also the size of tips below lines if Large Cradle Line Tips is active and the roof base if Cradle Roof Type is Large Cradle and Base

Small Cradle Tip Size:
Small Cradle Line Width

Large Cradle Tip Size:
Large Cradle Line Width

Cradle XY Distance

Distance of the cradle lines from the model, dependent on the height of cradle lines below it (Cradle XY distance)

Visualisation:
Visualisation

Cradle Z Distance

Distance between cradle lines and the support that supports them. Makes cradle lines easier to fold over.

Large Cradle Line Tips

Generate large tips below the cradle lines.

Tree Support Large Cradle Line Tips Off:
Tree Support Large Cradle Line Tips Off

Tree Support Large Cradle Line Tips On:
Tree Support Large Cradle Line Tips On

Cradle Roof Type

How the cradle behaves if roof is enabled.

Regular Support
Regular Support

Cradle:
Cradle

Cradle and Base:
Cradle and Base

Large Cradle and Base:
Large Cradle and Base

Support Skin Height

Height of Support Skin generated to support cradle/interface/model parts that would fall inside of a support area. What i call Support Skin is just a support area with high density zig-zag infill.

Small Support Skin Height:
Small Support Skin Height

Large Support Skin Height:
Large Support Skin Height

Support Skin Line Distance Distance between the lines for said high density support infill.

Small Support Skin Line Distance:
Small Support Skin Line Distance

Large Support Skin Line Distance:
Large Support Skin Line Distance

Support Skin for Tips Threshold

Generate support skin for any tips that have at least this diameter.

Idea behind it

The support structure connects to the model from multiple sides, holding it in tension. These connections are thin (one or two layers). This occurs not only at the beginning of a pointy overhang (where the model itself may not be stable yet), but also further up (configurable with the cradle XY distances and heights).
When removing the support these connection points are twisted off (basically by just folding over the cradle lines).
The benefit to holding the model in tension over just surrounding it with material is that it should reduce the chances of the model tipping over slightly (which could enable the nozzle to crash into the model, and rip it of)
To improve ease of removal these lines do not touch the model, put are printed closer than the tolerances allow (distance of 0.1mm or 0.15mm).
If soluble support it could be possible to reduce the distance to 0mm and make it much thicker than a few layers. I cant test this though.

Currently known limitations:

  • If custom angles are set for the infill the result may not be what the end-user expects.
  • Enforce Initial Layer Diameter may cause an effectively higher Branch Density. When tips are multiple mm large, placing one tip ever few cm seems counter productive.
  • Cradle XY distance can be larger than intended if the line hits the model at a small angle, especially if the model surface is uneven. This is rare though.
  • As cradle lines that would collide with branches are removed, but cradle lines are elongated to prevent overhang at the end of the line, some lines may be larger than Cradle Length

Things that should be done

  • Reducing the amount of settings (I would like some input in that regard)
  • Evaluating what the default settings should be.
  • Try to shorten cradle lines that collide with branches before removing them. Shorten cradle lines that are longer than they should be if the reason that they are longer is a cradle line above it that was removed.
  • Refactoring to improve code quality.
  • Looking over and solving/deciding what to do for all "Todo" comments.
  • Improve performance (Currently it about doubles the IncreaseArea time if cradles are present)
  • Improve merge behavior (Currently branches that could collide with a cradle line will not merge)

@github-actions github-actions bot added the PR: Community Contribution 👑 Community Contribution PR's label May 7, 2023
@ThomasRahm
Copy link
Contributor Author

  1. I added another setting:
    Tree Support Support Skin for Tips Threshold: Generate support skin for any tips that have at least this diameter.

  2. I got my new direct drive hot-end working: The pointy overhang support feature needs a pretty well tuned xy distance/minimum xy distance distance to work.
    Most people will not have been tuning that parameter, so it is definitely an advanced feature. With my new hot-end i had success with minimum xy distance set to 0.2mm. It should be where a tolerances test with this distance would not fuse up in a way that it is too hard to separate, but also not too easy.

This brings me to a question: Should how close the cradle can get to the model be independent of xy distance ?
It would not be too hard to do (as long as z distance stays the same as i would just offset the collision), but it would be yet another setting.

@ThomasRahm ThomasRahm marked this pull request as ready for review May 22, 2023 10:36
ThomasRahm and others added 20 commits July 13, 2023 14:57
…f it is larger than the (hardcoded) minimum fake roof area when roof is disabled
…of that) sometimes when the influence area becomes very small, caused by a very small hole in the avoidance.
# Conflicts:
#	include/SupportInfillPart.h
#	include/TreeSupportTipGenerator.h
#	include/TreeSupportUtils.h
#	src/FffGcodeWriter.cpp
#	src/SupportInfillPart.cpp
#	src/TreeModelVolumes.cpp
#	src/TreeSupport.cpp
#	src/TreeSupportTipGenerator.cpp
Implemented significant changes to the Conan file and GitHub workflow
files in order to increase stability and maintainability.
The Conan file now fetches versions and requirements from a new data
 source, while unnecessary or redundant code in the workflow files has
 been removed or simplified. This ensures smoother implementation and
 easier troubleshooting for future needs.

 Contributes to CURA-11440
Contributes to CURA-11440
# Conflicts:
#	include/sliceDataStorage.h
#	src/TreeSupportTipGenerator.cpp
#	src/sliceDataStorage.cpp
…line count by one to improve strength of support skin.
rburema and others added 30 commits July 10, 2024 09:03
CURA-12017 (related to CURA-6410)
Though it's technically possible to do it the other way around because of the constexpr, it doesn't make much 'aestetic' sense.

done as part of CURA-12017
CURA-11875

Co-authored-by: Thomas Rahm <67757218+ThomasRahm@users.noreply.github.com>
The calculated line width is quite important here, because GCodePath
objects may be merged (or not) depending on it, and sometimes the value
would be rounded to a very close value, but not equal. We now use llrint
to make sure we round to the neareset value.

CURA-12038
To compute the end type, we previously used a lambda function, that was
declared static. Thus, the arguments were apparently captured when
calling it the first time, and didn't change for subsequent calls. As
one of them is a pointer, this could crash if the pointed object had
been destroyed in the meantime.
Although the minimum fix is just to remove the static for the function,
I removed the function itself because it really doesn't make sense
anymore in this context.

CURA-12042
done as part of CURA-11875

Co-authored-by: Erwan MATHIEU <erwan.mathieu@ultimaker.com>
…pport_2

# Conflicts:
#	CMakeLists.txt
#	include/FffGcodeWriter.h
#	include/SupportInfillPart.h
#	include/TreeModelVolumes.h
#	include/TreeSupport.h
#	include/TreeSupportElement.h
#	include/TreeSupportTipGenerator.h
#	include/TreeSupportUtils.h
#	include/sliceDataStorage.h
#	include/utils/polygon.h
#	src/FffGcodeWriter.cpp
#	src/SkirtBrim.cpp
#	src/SupportInfillPart.cpp
#	src/TreeSupport.cpp
#	src/TreeSupportTipGenerator.cpp
#	src/bridge.cpp
#	src/sliceDataStorage.cpp
#	src/support.cpp
#	src/utils/polygon.cpp
#	src/utils/polygonUtils.cpp
…ions that were lost by the merge (because they were in the poylgons class)
This is actually actively wanted and used in the code (see the unionPolygons() signature, note the missing argument), to solve self-overlap and the like. The added early outs where blocking that use here, leading to hard to trace problems, like tree support stopping midway.

CURA-12061
…scene.

This could get increasingly inaccurate results with more objects on the buildplate, since the center could be outside of the objects.

CURA-12043
…ier meshes are stored and fix a small bug preventing non drop down support meshes from slicing correctly
…. Also prevent parallel for from being used in a nested way.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
PR: Community Contribution 👑 Community Contribution PR's PR: Slicing Process 🤯 Like fixing simplification, adding a new primetower, introducing tree support, correcting logging,
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants