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

Independent linear/pressure advance for internal and external perimeters. #3998

Open
MartijnGevaert opened this issue Dec 11, 2023 · 17 comments
Labels
new Feature New feature or request

Comments

@MartijnGevaert
Copy link

Is your feature request related to a problem? Please describe.
Bulging on seams, especially for thick layers.

Bulging on seams is reduced by tuning linear/pressure advance. However, these values are tuned for a specific speed, acceleration, ... Specifically, it's recommended to tune these for the external perimeter settings. This means that the linear advance values are not tuned for the internal perimeters.
Most of the time this is not an issue, but on thick layer lines (0.4mm layer w. 0.6 nozzle), the bulging of the internal perimeters pushes out the seam of the external perimeter.
The more internal wall perimeters, the more obvious this issue should become.

Describe the solution you'd like
I believe if the internal perimeters could have a different PA value, tuning could be done separately for internal and external perimeters, having more filament being put down with it's optimal PA value..

Describe how it would work

The slicer would simply have to emit a gcode value whenever it switches between internal/external perimeters.
There might be even cooler implementations where a PA curve is used for different speeds... but that's getting a bit out there.

Describe alternatives you've considered
There are other solutions regarding flow around the seems, such as stopping earlier, coasting, ... although they work in practice, they are more of a patch on underlying differences between the modeled flow and actual flow.

Additional context
None for now, let me know if there is any additional investigation/information which I can add which would be of use here.
Unfortunately I can't test the separate PA values in practice yet because it's not trivial to add these gcode commands manually as far as I know.

@legend069
Copy link

this is already on my "to-do list"
currently you can already do it with "in between extrusion role change G-code"
heres a snipit of what i'm currently doing.

{if print_preset == "0.1mm SuperFast_original_speed"}
	{if filament_type == "PLA"}
		{if layer_height == 0.1}
			;layerheight0.1 PLA
			;layerheight0.1 PLA
		;endof layerheight0.1 {endif}
		{if layer_height == 0.2}
			;layerheight0.2 PLA
			;layerheight0.2 PLA
		;endof layerheight0.2 {endif}
	;endof PLA {endif}
	{if filament_type == "ABS"}
		{if layer_height == 0.1}
			;layerheight0.1 ABS
			{if layer_num == 1 and extrusion_role == "SolidInfill"} SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.020; first layer solidinfill
			{elsif layer_num == 1 and extrusion_role == "ExternalPerimeter"} SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.020; first layer externalPerimeter
			{elsif layer_num == 1 and extrusion_role == "Perimeter"} SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.020; first layer Perimeter
			{elsif layer_num == 1 and extrusion_role == "SupportMaterial"} SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.020; first layer SupportMaterial
			{elsif layer_num == 1 and extrusion_role == "Skirt" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.020; first layer Skirt
			{elsif extrusion_role == "InternalInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.01 SMOOTH_TIME=0.025;InternalInfill
			{elsif extrusion_role == "SolidInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.025 SMOOTH_TIME=0.025;SolidInfill
			{elsif extrusion_role == "Perimeter" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.025 SMOOTH_TIME=0.025;Perimeter
			{elsif extrusion_role == "ExternalPerimeter" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.035;ExternalPerimeter
			{elsif extrusion_role == "OverhangPerimeter" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.035;OverhangPerimeter
			{elsif extrusion_role == "TopSolidInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.035;TopSolidInfill
			{elsif extrusion_role == "BridgeInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.01 SMOOTH_TIME=0.020;BridgeInfill
			{elsif extrusion_role == "SupportMaterial" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.0125 SMOOTH_TIME=0.035;SupportMaterial
			{elsif extrusion_role == "ThinWall" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.02 SMOOTH_TIME=0.035; ThinWall
			{elsif extrusion_role == "GapFill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.025 SMOOTH_TIME=0.025; GapFill
			{elsif extrusion_role == "InternalBridgeInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.0125 SMOOTH_TIME=0.035; InternalBridgeInfill
			{elsif extrusion_role == "Ironing" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.01 SMOOTH_TIME=0.020; Ironing
			{elsif extrusion_role == "SupportMaterialInterface" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE=0.01 SMOOTH_TIME=0.020; SupportMaterialInterface {endif}
			;layerheight0.1 ABS
		;endof layerheight0.1 {endif}
	
		;0.1mm SuperFast_original
		{if layer_num == 1 and extrusion_role == "SolidInfill"} SET_VELOCITY_LIMIT ACCEL={first_layer_acceleration} ACCEL_TO_DECEL={first_layer_acceleration} SQUARE_CORNER_VELOCITY=5.0 ; first layer solidinfill
		{elsif layer_num == 1 and extrusion_role == "ExternalPerimeter"} SET_VELOCITY_LIMIT ACCEL={first_layer_acceleration} ACCEL_TO_DECEL={first_layer_acceleration} SQUARE_CORNER_VELOCITY=5.0 ; first layer externalPerimeter
		{elsif layer_num == 1 and extrusion_role == "Perimeter"}   SET_VELOCITY_LIMIT ACCEL={first_layer_acceleration} ACCEL_TO_DECEL={first_layer_acceleration} SQUARE_CORNER_VELOCITY=5.0 ; first layer Perimeter
		{elsif layer_num == 1 and extrusion_role == "SupportMaterial"}  SET_VELOCITY_LIMIT ACCEL={first_layer_acceleration} ACCEL_TO_DECEL={first_layer_acceleration} SQUARE_CORNER_VELOCITY=5.0 ; first layer SupportMaterial
		{elsif layer_num == 1 and extrusion_role == "Skirt" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={first_layer_acceleration} ACCEL_TO_DECEL={first_layer_acceleration} SQUARE_CORNER_VELOCITY=5.0 ;first layer Skirt
		{elsif extrusion_role == "SupportMaterialInterface" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={support_material_interface_acceleration} ACCEL_TO_DECEL={support_material_interface_acceleration} SQUARE_CORNER_VELOCITY=5.0 ;SupportMaterialInterface
		{elsif extrusion_role == "Ironing" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={ironing_acceleration} ACCEL_TO_DECEL={ironing_acceleration} SQUARE_CORNER_VELOCITY=5.0 ;Ironing
		{elsif extrusion_role == "InternalBridgeInfill" and layer_num > 0}SET_VELOCITY_LIMIT ACCEL={bridge_internal_acceleration} ACCEL_TO_DECEL={bridge_internal_acceleration} SQUARE_CORNER_VELOCITY=20.0 ;InternalBridgeInfill
		{elsif extrusion_role == "InternalInfill" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={infill_acceleration} ACCEL_TO_DECEL={infill_acceleration} SQUARE_CORNER_VELOCITY=20.0 ;InternalInfill
		{elsif extrusion_role == "SolidInfill" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={solid_infill_acceleration} ACCEL_TO_DECEL={solid_infill_acceleration} SQUARE_CORNER_VELOCITY=20.0 ;SolidInfill
		{elsif extrusion_role == "Perimeter" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={perimeter_acceleration} ACCEL_TO_DECEL={perimeter_acceleration} SQUARE_CORNER_VELOCITY=20.0 ;Perimeter
		{elsif extrusion_role == "ExternalPerimeter" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={external_perimeter_acceleration} ACCEL_TO_DECEL={external_perimeter_acceleration} SQUARE_CORNER_VELOCITY=5.0 ;ExternalPerimeter
		{elsif extrusion_role == "OverhangPerimeter" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={overhangs_acceleration} ACCEL_TO_DECEL={overhangs_acceleration} SQUARE_CORNER_VELOCITY=5.0 ;OverhangPerimeter
		{elsif extrusion_role == "TopSolidInfill" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={top_solid_infill_acceleration} ACCEL_TO_DECEL={top_solid_infill_acceleration} SQUARE_CORNER_VELOCITY=5.0 ;TopSolidInfill
		{elsif extrusion_role == "BridgeInfill" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={bridge_acceleration} ACCEL_TO_DECEL={bridge_acceleration} SQUARE_CORNER_VELOCITY=5.0 ;BridgeInfill
		{elsif extrusion_role == "SupportMaterial" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={support_material_acceleration} ACCEL_TO_DECEL={support_material_acceleration} SQUARE_CORNER_VELOCITY=20.0 ;SupportMaterial
		{elsif extrusion_role == "ThinWall" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={thin_walls_acceleration} ACCEL_TO_DECEL={thin_walls_acceleration} SQUARE_CORNER_VELOCITY=5.0 ;ThinWall
		{elsif extrusion_role == "GapFill" and layer_num > 0} SET_VELOCITY_LIMIT ACCEL={gap_fill_acceleration} ACCEL_TO_DECEL={gap_fill_acceleration} SQUARE_CORNER_VELOCITY=20.0 ;GapFill {endif}
		;0.1mm SuperFast_original
	;endof ABS {endif}
{endif}

@MartijnGevaert
Copy link
Author

MartijnGevaert commented Dec 13, 2023

Amazing! I'll run it on a couple of prints. Any specific testing you're looking for that I can contribute?
Also looks like it must have taken forever to tune in all those values. Where you able to derive some from other values?

@legend069
Copy link

Amazing! I'll run it on a couple of prints. Any specific testing you're looking for that I can contribute?
Also looks like it must have taken forever to tune in all those values. Where you able to derive some from other values?

There's nothing really to test, aslong as you edit my snipit appropriately it should work flawlessly for you.

Yes it did take a hour or two to get the PA values.
You only need to run a PA test if a speed/acceleration value is different than 50mms/5000

Example; internal perimeter ER is 400mms and 30k Accel.
External perimeter ER is 200mme and 10k accel.
You would want two PA values.

If your other ER changes alot you would need a PA values for each.

@MartijnGevaert
Copy link
Author

Work's great, especially great for solid infill as I'm now seeing less bulging since I can tune my PA for separate cases better and much more!
Only thing that could come out of this ticket now is a different UI experience, but in my opinion a programmatic style like the G-code you provided is probably the best way.
Feel free to close if you agree.

@supermerill
Copy link
Owner

supermerill commented Dec 19, 2023

if you find it more convenient, you can also move these values to custom variables.
That way, you don't need to have a printer profile for each filament/print, if the pa value changes per filament/print

in start gcode:

default_double(pa_first_solidfill,0)
default_double(pa_first_ext_peri,0)
default_double(pa_first_int_peri,0)
default_double(pa_first_support,0)
default_double(pa_first_skirt_brim,0)
default_double(pa_skirt,0)
default_double(pa_ext_peri,0)
default_double(pa_int_peri,0)
default_double(pa_overhang,0)
default_double(pa_int_fill,0)
default_double(pa_solid_fill,0)
default_double(pa_top_fill,0)
default_double(pa_ironing,0)
default_double(pa_bridge_fill,0)
default_double(pa_int_bridge_fill,0)
default_double(pa_thin,0)
default_double(pa_gap,0)
default_double(pa_support,0)
default_double(pa_support_top,0)

in "in between extrusion role change G-code"

{if layer_num == 1 and extrusion_role == "SolidInfill"} SET_PRESSURE_ADVANCE ADVANCE={pa_first_solidfill} SMOOTH_TIME=0.020; first layer solidinfill
{elsif layer_num == 1 and extrusion_role == "ExternalPerimeter"} SET_PRESSURE_ADVANCE ADVANCE={pa_first_ext_peri} SMOOTH_TIME=0.020; first layer externalPerimeter
{elsif layer_num == 1 and extrusion_role == "Perimeter"} SET_PRESSURE_ADVANCE ADVANCE={pa_first_int_peri} SMOOTH_TIME=0.020; first layer Perimeter
{elsif layer_num == 1 and extrusion_role == "SupportMaterial"} SET_PRESSURE_ADVANCE ADVANCE={pa_first_support} SMOOTH_TIME=0.020; first layer SupportMaterial
{elsif layer_num == 1 and extrusion_role == "Skirt" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_first_skirt_brim} SMOOTH_TIME=0.020; first layer Skirt
{elsif extrusion_role == "Skirt" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_skirt} SMOOTH_TIME=0.020; first layer Skirt
{elsif extrusion_role == "ExternalPerimeter" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_ext_peri} SMOOTH_TIME=0.035;ExternalPerimeter
{elsif extrusion_role == "Perimeter" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_int_peri} SMOOTH_TIME=0.025;Perimeter
{elsif extrusion_role == "OverhangPerimeter" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_overhang} SMOOTH_TIME=0.035;OverhangPerimeter
{elsif extrusion_role == "InternalInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_int_fill} SMOOTH_TIME=0.025;InternalInfill
{elsif extrusion_role == "SolidInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_solid_fill} SMOOTH_TIME=0.025;SolidInfill
{elsif extrusion_role == "TopSolidInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_top_fill} SMOOTH_TIME=0.035;TopSolidInfill
{elsif extrusion_role == "Ironing" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_ironing} SMOOTH_TIME=0.020; Ironing
{elsif extrusion_role == "BridgeInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_bridge_fill} SMOOTH_TIME=0.020;BridgeInfill
{elsif extrusion_role == "InternalBridgeInfill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_int_bridge_fill} SMOOTH_TIME=0.035; InternalBridgeInfill
{elsif extrusion_role == "ThinWall" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_thin} SMOOTH_TIME=0.035; ThinWall
{elsif extrusion_role == "GapFill" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_gap} SMOOTH_TIME=0.025; GapFill
{elsif extrusion_role == "SupportMaterial" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_support} SMOOTH_TIME=0.035;SupportMaterial
{elsif extrusion_role == "SupportMaterialInterface" and layer_num > 0}SET_PRESSURE_ADVANCE ADVANCE={pa_support_top} SMOOTH_TIME=0.020; SupportMaterialInterface {endif}

in your print/filament->notes->custom variables (if none, the default from start gcode will be taken): (

pa_first_solidfill=0.02
pa_first_ext_peri=0.02
pa_first_int_peri=0.02
pa_first_support=0.02
pa_first_skirt_brim=0.02
pa_skirt=0.02
pa_ext_peri=0.035
pa_int_peri=0.02
pa_overhang=0.035
pa_int_fill=0.025
pa_solid_fill=0.025
pa_top_fill=0.02
pa_ironing=0.02
pa_bridge_fill=0.02
pa_int_bridge_fill=0.02
pa_thin=0.035
pa_gap=0.025
pa_support=0.0125
pa_support_top=0.01

You can also add a multiplier in the print config, and use it to multiply the value in the "in between extrusion role change G-code"

@supermerill supermerill added the new Feature New feature or request label Dec 19, 2023
@legend069
Copy link

I'll start working on this when the new release is finished.
Will add a PA calibration tool the same method as this
Will have it pull speed,width, acceleration values automatically.

User would just need to select what ER to generate a test for and slice it then print it.

@MartijnGevaert
Copy link
Author

That would be amazing, anything that helps speed up tuning in new filaments is welcome. Would also be very cool if multiple ER's could be combined in a single calibration print.
Simply printing one after the other, but not having to clean bed and start new print in between would be a big time saver.

@MartijnGevaert
Copy link
Author

MartijnGevaert commented Jan 4, 2024

I have an idea that is very much related to this issue, and might be the most elegant solution to it, which I have not seen in any other slicer yet.

@supermerill you added a post showing your PA value for different accelerations.
You modified 2 parameters, PA and smooth time, but for the sake of my explanation I'll simplify it to a single parameter, PA.

Let's assume that you always run the same smooth time, and you run a PA test for following accelerations:
1000, 2500, 5000, 10000
I think it would then be very likely a curve start showing that can be used to determine the correct PA value for all other accelerations in between.
This would drastically reduce the amount of calibration prints needed.

Adding in a second data point, smooth time, would then simply make it a 3d graph, which would require some more data points, maybe 5 or 6 + some assumptions on what the graph looks like (linear/exponential/..) to get good estimations of non-tested combinations.

Testing the concept

This process can already be done manually today to verify if there is an underlying predictable PA behavior which can be taken advantage of, let me know if you think this idea makes sense, in which case I will try to invest the time to do this.

Feature value

If this works, it would mean that Superslicer can pick the right PA for every single acceleration, and require no re-tuning if you modify your accels, such as is common for different qualities (quality/draft), and layer heights

Dreaming ahead

  • If it turns out almost all toolheads follow the same graph shape, it might be possible to get the amount of required calibration data points down to only 3 (for PA only).

  • This would also perhaps allow the incorporation of more parameters, such as layer height, by simply adding more calibration points and increasing the graph dimensions.

@legend069
Copy link

That would be amazing, anything that helps speed up tuning in new filaments is welcome. Would also be very cool if multiple ER's could be combined in a single calibration print.
Simply printing one after the other, but not having to clean bed and start new print in between would be a big time saver.

Adding several models for the single plate should be fine, currently the code wipes the plate each time you make a model, easy enough change to make.
Simple "check box/button" to clear plate should do the trick.

I'm wanting to add in a option that would make a model for all ER and it will make several lines just so the user can easily identify what needs adjusting.
In short, this would be a "pre test" to make tuning it easier. Although I'm not sure if I should make a model for each letter/word and add that too next to each pre test line

@legend069
Copy link

Adding in a second data point, smooth time, would then simply make it a 3d graph, which would require some more data points, maybe 5 or 6 + some assumptions on what the graph looks like (linear/exponential/..) to get good estimations of non-tested combinations.

Aswell as individual boxes for each ER value, I'm also wanting to add exactly what you've mentioned. A kind of " auto adjustment for PA, but the math for this one could be a bit tricky to implement.

I've still got a bit of work to do for the PA calibration tool to be finished.i might have to make the GUI injection part for PA at another time.

@MartijnGevaert
Copy link
Author

I'm not sure the PA math would be all that complicated it's essentially just fitting a graph to data points.
I'm sure there's a bunch of c++ libraries that have graph fitting functions available, maybe even some that are already part of the dependencies.
I think it's very likely that the best fitting graph will always be an inverse exponential graph.

I can do this test:
calibration print for PA at 500, 1000, 2500, 5000, 7500, 10000.
Get a fitted graph for each combination of 4 data points and see how close the graphs are to each other (closer=better).
If the graphs are very close, it means it's possible to estimate the other data points using a graph based on 4 calibration points.
I can do this test maybe later today, feel free to comment if you have some ideas/doubts about this testing methodology in the meantime.

@supermerill
Copy link
Owner

If you want a fast calibration print, maybe you can print just a line in "L" shape (one for each acceleration).
then by looking at the start, corner and end, maybe you can decide if it's good, under-pa (start late, corner bulge, end ooze) or over-pa (start blob, thin corner, missing end).

@NiiXXiiN
Copy link

I just want to say that I was about to post a request for this feature exactly "variable pressure advance for different speeds and accelerations". I am really glad to see that there is already interest in this feature.
Such an amazing community!

@MartijnGevaert
Copy link
Author

I did some calibrations and I do think there is underlying behavior that can be taken advantage of, however, I did it with a 0.6 nozzle thinking it would be easier to spot PA, but it actually made it harder, I don't think for example the 7000 and 10000 acc values make sense, but for those there is much less difference between 0.01, 0.02... they all look the same.

I'll redo the test with 0.4 nozzle in the future.
image

@legend069
Copy link

I did some calibrations and I do think there is underlying behavior that can be taken advantage of, however, I did it with a 0.6 nozzle thinking it would be easier to spot PA, but it actually made it harder, I don't think for example the 7000 and 10000 acc values make sense, but for those there is much less difference between 0.01, 0.02... they all look the same.

I'll redo the test with 0.4 nozzle in the future

you'll find that when printing faster and faster you need to start changing the smooth_time variable.
on a 'large' enough model, and dependent on the accuracy of the calipers you should be able to measure the widths of the lines when running a PA test.
i have not done any real world measurements/data gathering. but in my hypothesis, in the picture below area '2'/'4,'5 is where the smooth time takes place. but since the acceleration values are so FAST! the 'smoothing' of the extrusion actually covers the distance (example) of 5mm, instead of 0.1mm compared to a lower acceleration value.
with a larger 'smoothing' distance it's a result of harder to tell PA values apart.
pa_graph_off 1

i recently just started printing with 50k accelerations ~40mm³/s speeds and can confirm the same 'very little visible differences' when looking at advance numbers alone. i did notice width changes when changing it to smooth time though.

@MartijnGevaert
Copy link
Author

AFAIK know, smooth time should be kept as low as possible, but is introduced to avoid asking the extruder to do things which it can't do, such as very fast retract and deretracts.
That means smooth time should be a constant, across all accels, which is good because that means it's one less dimension to the issue.
This means we are left with speed and accel.
I still need to do the tests again at different speeds to see if there's a predictable 2D-plane in there.
That being said, @legend069 your input is useful as it can explain why my 7000 and 10000 accel tests where difficult to read.

@legend069
Copy link

i've partially completed the PA calibration tool #4115

on the topic of adding in PA values that would be injected into the gcode
theres a few ways i've considered doing this

  1. base value for PA in filament settings tab. ie; PA=0.025
    then in the print settings tab would be where the adjustments would be, box for each ER role with the user adding a modifier to the base value for PA +/-
    (but this will soon turn issues with using the same print settings for different filaments)

  2. having the PA values only in the filament settings tab. the user would need to have several filament profiles per print settings speeds/accelerations.(i assume the would already since more speed = different part cooling)

i'm thinking the best place for them is possibility 2
to save the user switching back and forth when entering in the PA values it should be possible to add a "tooltip" type window.
(similar to the part cooling description) that just lists the speeds/accelerations

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
new Feature New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants