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

Add "2D Lattice" fill pattern for lightweight aircraft structures #8293

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

LoftedAero
Copy link

Description

This is a new fill pattern intended for lightweight printed model aircraft structures, primarily wings with single walls and low fill percentages. It creates a 2D lattice structure extruded in a planar direction, typically perpendicular to the wing chord but able to be manipulated by the fill angle setting. The lattice elements are arranged in two alternating groups, each with a user-specified angle relative to the Z direction. These two angles are adjustable by the user via settings that appear when this fill type is selected.

Screenshots/Recordings/Graphs

An example of a wing or tail part sliced with 2D Lattice at 2% fill and +/- 30 degree lattice angles
Screenshot 2025-02-02 141544

Another example lattice angle configuration, -30 degrees and 0 degrees
Screenshot 2025-02-02 141737

Cross-section with 0 degree fill angle
Screenshot 2025-02-02 141910

The new fill angle parameters appearing when 2D Lattice is the selected pattern
Screenshot 2025-02-02 142122

When "Advanced" is not selected, the angles default to +/- 45 degrees and their fields are hidden
Screenshot 2025-02-02 142234

A completed test part
PXL_20250202_222552826

Tests

  • Printed numerous real-world test articles
  • Verified correct behavior when specifying high or solid fill percentage
  • Checked various lengths of fill anchors
  • Tried specifying out-of-range lattice angles
  • Verified benign results when lattice angles match
  • Checked behavior when rotating infill angle
  • Checked behavior when rotating part

@ParaDiddle777
Copy link

This is a game changer for 3D printing planes and Eric is a genius for creating this. It can save plane designers probably 80 percent of their time vs manually creating these structures in CAD.

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 3, 2025

Amazing!

@Alan5596
Copy link

Alan5596 commented Feb 3, 2025

For many of us that like to design and build 3D printed models this would be a major feature to have in Orca which is already an excellent slicer for 3D aeroplane work.

@Flyguy62
Copy link

Flyguy62 commented Feb 4, 2025

I am really looking forward to having this implemented into orca slicer. I already have so many ideas designing model airplanes with this technique.

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 5, 2025

Does this infill require the model to be placed with the long edge parallal to x-axis? Otherwise I guess the infill will be formed in undesired direction?

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 5, 2025

Also changing the angle via modifiers doesn't seem to work.

@LoftedAero
Copy link
Author

LoftedAero commented Feb 5, 2025

Does this infill require the model to be placed with the long edge parallal to x-axis? Otherwise I guess the infill will be formed in undesired direction?

Thanks for checking this out! The infill obeys the "Sparse infill direction", so it can be rotated to align with the part as desired in any orientation. Here's an example with both the part and the infill rotated 45 degrees.
Screenshot 2025-02-04 183159

I hadn't thought to try changing the sparse infill direction with modifiers, but that seems to work on my end.
Screenshot 2025-02-04 183132

Screenshot 2025-02-04 183118

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 5, 2025

Thanks for checking this out! The infill obeys the "Sparse infill direction", so it can be rotated to align with the part as desired in any orientation. Here's an example with both the part and the infill rotated 45 degrees.

Awesome!

I hadn't thought to try changing the sparse infill direction with modifiers, but that seems to work on my end.

As for this one I was talking about the lattice_angle_1 and lattice_angle_2, not the infill direction.

@LoftedAero
Copy link
Author

Oh, I see! Will look into that.

@marc-frank
Copy link

awesome!

@Really01101001
Copy link

Really01101001 commented Feb 7, 2025

I've been wanting to see this since 2023. I posted this idea in numerous places including slicer communities and in 3D printing communities. I didn't/dont have coding skills or $ to pay for development and couldn't make anyone realize how much this type of infill methodology would be of benefit. I had to move forward with Infill Modifiers generated from CAD derived STL models which in many instances were sucessful (and) time consuming. The most interesting Infill along these lines I was working on was Honeycomb. That required very specific mesh attributes and I sought help from the Blender, FreeCAD, and Cura Communities. I was very successful when using a Honeycomb as a sort of subtractive mesh generating a vase mode like print but "Sparse" "internal" or "standard type" Infill was very difficult. I did have limited success and the proof of concept for viability was proven but implementation was extremely tedious.

It would have been nice to have had slicer devs acknowledge and implement this idea from me back then but it's good to see it now as kinda "better late than never"

I'd be thrilled to see if you could implement a sparse honeycomb infill. I can give you a bit of information related to possible pitfalls or constraints that may be important if you would like. I also have several ideas that would be awsome as slicer features that I would be willing to share if interested.

I got into 3D printing back in 2014 and have a pretty strong proficiency with front end slicer operation and functional printing ability.

I'm going to include a couple pictures of test prints from the Honeycomb work in 2023. First part is a wing section test of a glider called Mizmo by GForceAero printed with a Vase Mode type toolpath and in 3DLabPrint Orange Foaming PLA.
Second picture is with internal infill "sparse infill" of the Mizmo upper stabilizer section in 3DHojour (Translucent) White PLA.

I'm currently involved with pretty interesting hardware and material development, designers and sales and would be stoked to work more closely with Lofted Aero to advance 3DP Aircraft Manufacture and Additive as a whole.

Sincerely,

-Brian H.

IntraSpecHoneycombFoamingPLAMizmoWing

SecondHoneycombSparseInfillTest

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 7, 2025

First part is a wing section test of a glider called Mizmo by GForceAero printed with a Vase Mode type toolpath and in 3DLabPrint Orange Foaming PLA.

Looks similar to https://youtu.be/QJjhMan6T_E?si=XfEHfAh61PUdUbc_ but simpler. Adding infills in vase mode automatically is currently very hard to do due to how Orca works. I've spent some time on this but not having much progress so far. I'll definitely keep working on this in the future.

Second picture is with internal infill "sparse infill" of the Mizmo upper stabilizer section in 3DHojour (Translucent) White PLA.

This looks feasible though, since we already have the horizental honeycomb infill and should be able to create a vertical one.

@SoftFever
Copy link
Owner

Fantastic!
Thank you, the changes look good to me

@SoftFever
Copy link
Owner

Thanks for checking this out! The infill obeys the "Sparse infill direction", so it can be rotated to align with the part as desired in any orientation. Here's an example with both the part and the infill rotated 45 degrees.

Awesome!

I hadn't thought to try changing the sparse infill direction with modifiers, but that seems to work on my end.

As for this one I was talking about the lattice_angle_1 and lattice_angle_2, not the infill direction.

Hmm, it works fine here.
image

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 8, 2025

Thanks for checking this out! The infill obeys the "Sparse infill direction", so it can be rotated to align with the part as desired in any orientation. Here's an example with both the part and the infill rotated 45 degrees.

Awesome!

I hadn't thought to try changing the sparse infill direction with modifiers, but that seems to work on my end.

As for this one I was talking about the lattice_angle_1 and lattice_angle_2, not the infill direction.

Hmm, it works fine here. image

Do you mean you could change the lattice_angle_1 and lattice_angle_2 in modifier and it works as expected?

@SoftFever
Copy link
Owner

Thanks for checking this out! The infill obeys the "Sparse infill direction", so it can be rotated to align with the part as desired in any orientation. Here's an example with both the part and the infill rotated 45 degrees.

Awesome!

I hadn't thought to try changing the sparse infill direction with modifiers, but that seems to work on my end.

As for this one I was talking about the lattice_angle_1 and lattice_angle_2, not the infill direction.

Hmm, it works fine here. image

Do you mean you could change the lattice_angle_1 and lattice_angle_2 in modifier and it works as expected?

that's right
image

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 8, 2025

Use a modifier so the angles are different between the main part and the modified part.

@SoftFever
Copy link
Owner

SoftFever commented Feb 8, 2025

Use a modifier so the angles are different between the main part and the modified part.

Here you go.
It reminds me last I tried to test your organic tree clip feature, it
image

Use a modifier so the angles are different between the main part and the modified part.

Ah, you are referring to the modified part.
Yeah, it didn't work
My bad. Good catch

@LoftedAero
Copy link
Author

LoftedAero commented Feb 8, 2025

Here's an interesting observation. I'm traveling right now and don't have the build environment set up on my laptop, so I grabbed the most recently generated installer from the automated builds for this PR. On this instance, I'm able to change lattice_angle_1 and lattice_angle_2 successfully with modifiers either per-part or applied to a section of one part. Here's a few examples of default lattice angles +/- 30 degrees with modifiers changing it to +/- 70 degrees.

This all seems to be functioning as it should. The only difference from the built-from-source OrcaSlicer instance on my dev machine is the merge with master from yesterday, but it doesn't look like any of the changes that introduced could be involved. When I'm back at home I'll try and figure out why I was seeing different behavior on that instance.

Screenshot 2025-02-08 095103

Screenshot 2025-02-08 095033

Screenshot 2025-02-08 095541

Screenshot 2025-02-08 095525

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 9, 2025

Here's an interesting observation. I'm traveling right now and don't have the build environment set up on my laptop, so I grabbed the most recently generated installer from the automated builds for this PR. On this instance, I'm able to change lattice_angle_1 and lattice_angle_2 successfully with modifiers either per-part or applied to a section of one part. Here's a few examples of default lattice angles +/- 30 degrees with modifiers changing it to +/- 70 degrees.

This all seems to be functioning as it should. The only difference from the built-from-source OrcaSlicer instance on my dev machine is the merge with master from yesterday, but it doesn't look like any of the changes that introduced could be involved. When I'm back at home I'll try and figure out why I was seeing different behavior on that instance.

Screenshot 2025-02-08 095103

Screenshot 2025-02-08 095033

Screenshot 2025-02-08 095541

Screenshot 2025-02-08 095525

That's because your modifier covers the entire layer of the object. Try a smaller modifier that covers only part of the layer

@Noisyfox
Copy link
Collaborator

Noisyfox commented Feb 9, 2025

First part is a wing section test of a glider called Mizmo by GForceAero printed with a Vase Mode type toolpath and in 3DLabPrint Orange Foaming PLA.

BTW are you able to share the model of this part so I could take a look? Or is this available somewhere that I could download/purchase?

@LoftedAero
Copy link
Author

That's because your modifier covers the entire layer of the object. Try a smaller modifier that covers only part of the layer

You're right - I've done some more tests and it's definitely sensitive to the coverage region of a modifier.
Sometimes the lattice angles in the modified regions slice as expected:

Screenshot 2025-02-09 110458

Screenshot 2025-02-09 110440

And sometimes the modified lattice angle only takes effect in small portions of the modified regions that are split by other features:

Screenshot 2025-02-09 110242

Screenshot 2025-02-09 110224

I'll admit I'm not well enough versed in the code base to immediately know the right place to look to investigate this behavior. If one of you guys has a thought about that, it'd be much appreciated. Here's the project file I'm using for testing:

https://drive.google.com/file/d/1IzIFfAC--IW8flAaxx4CNA6Zcy-zUIAF/view?usp=drive_link

@Noisyfox
Copy link
Collaborator

I'll admit I'm not well enough versed in the code base to immediately know the right place to look to investigate this behavior.

You'll also need to update the operator<(const SurfaceFillParams &rhs) and bool operator==(const SurfaceFillParams &rhs) methods of the SurfaceFillParams class to take the lattice_angle_1 & lattice_angle_2 into account.

bool operator<(const SurfaceFillParams &rhs) const {
#define RETURN_COMPARE_NON_EQUAL(KEY) if (this->KEY < rhs.KEY) return true; if (this->KEY > rhs.KEY) return false;
#define RETURN_COMPARE_NON_EQUAL_TYPED(TYPE, KEY) if (TYPE(this->KEY) < TYPE(rhs.KEY)) return true; if (TYPE(this->KEY) > TYPE(rhs.KEY)) return false;
// Sort first by decreasing bridging angle, so that the bridges are processed with priority when trimming one layer by the other.
if (this->bridge_angle > rhs.bridge_angle) return true;
if (this->bridge_angle < rhs.bridge_angle) return false;
RETURN_COMPARE_NON_EQUAL(extruder);
RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, pattern);
RETURN_COMPARE_NON_EQUAL(spacing);
RETURN_COMPARE_NON_EQUAL(overlap);
RETURN_COMPARE_NON_EQUAL(angle);
RETURN_COMPARE_NON_EQUAL(rotate_angle);
RETURN_COMPARE_NON_EQUAL(density);
// RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_adjust);
RETURN_COMPARE_NON_EQUAL(anchor_length);
RETURN_COMPARE_NON_EQUAL(anchor_length_max);
RETURN_COMPARE_NON_EQUAL(flow.width());
RETURN_COMPARE_NON_EQUAL(flow.height());
RETURN_COMPARE_NON_EQUAL(flow.nozzle_diameter());
RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, bridge);
RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, extrusion_role);
RETURN_COMPARE_NON_EQUAL(sparse_infill_speed);
RETURN_COMPARE_NON_EQUAL(top_surface_speed);
RETURN_COMPARE_NON_EQUAL(solid_infill_speed);
return false;
}
bool operator==(const SurfaceFillParams &rhs) const {
return this->extruder == rhs.extruder &&
this->pattern == rhs.pattern &&
this->spacing == rhs.spacing &&
this->overlap == rhs.overlap &&
this->angle == rhs.angle &&
this->rotate_angle == rhs.rotate_angle &&
this->bridge == rhs.bridge &&
this->bridge_angle == rhs.bridge_angle &&
this->density == rhs.density &&
// this->dont_adjust == rhs.dont_adjust &&
this->anchor_length == rhs.anchor_length &&
this->anchor_length_max == rhs.anchor_length_max &&
this->flow == rhs.flow &&
this->extrusion_role == rhs.extrusion_role &&
this->sparse_infill_speed == rhs.sparse_infill_speed &&
this->top_surface_speed == rhs.top_surface_speed &&
this->solid_infill_speed == rhs.solid_infill_speed;
}
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants