Open MichaelJLew opened 11 months ago
This looks really promising and would make one of the banes of FDM less of an issue.
Very few new features in a slicer are revolutionary these days, but this seems like it could be one of them.
I would love to see this idea receive more attention. I've printed the test cylinder, and the result is simply great.
I can imagine that implementing it in a slicer might be quite complicated since an algorithm would have to handle various shapes and sizes. Nevertheless, the result is very compelling, at least visually.
I think implementation would be easy in the slicer. It would just have to keep track of the first x millimetres of each layer, do the taper over those point and then complete the matching taper over the same points, in the same sequence, at the end of the layer.
I’m hoping that now that PS2.7 is out there will be some attention given to scarf seams…
On Sat, Nov 25, 2023, at 10:40 PM, ulfertg wrote:
I would love to see this idea receive more attention. I've printed the test cylinder, and the result is simply great.
I can imagine that implementing it in a slicer might be quite complicated since an algorithm would have to handle various shapes and sizes. Nevertheless, the result is very compelling, at least visually.
— Reply to this email directly, view it on GitHub https://github.com/prusa3d/PrusaSlicer/issues/11621#issuecomment-1826288208, or unsubscribe https://github.com/notifications/unsubscribe-auth/BBXJAZJ423AYI5TJCWZ4QGTYGHKJJAVCNFSM6AAAAAA7DV6GVSVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMRWGI4DQMRQHA. You are receiving this because you authored the thread.Message ID: @.***>
commit https://github.com/b3n3d1k7/PrusaSlicer/commit/173a69391e3091cdb63dd9073a2e5bdf5818ea95 (that solves issue #7932) implements a 360 degree scarf for the last layer of vase mode. I think it can be adapted
Yes, that would probably work. In fact, my own scarf code is adapted from a routine that I wrote to go between vase-mode and layer by layer portions of my objects.
I think that the best solution would involve both the slicer and the firmware because the firmware could have responsibility for tapering extrusions over the length of a move. Such a capability would be very useful for non-planar printing. I once asked for this feature for RepRap firmware in the Duet forum, but the response was that my use-case was too specialised.
wow, that's astounding, I will peek at the code.
What should I do to gain more attention this feature request? Given the effectiveness of the scarf seams and the straightforward way in which they can be incorporated into slicers, I'm surprised that it has no visible interest from developers. Presumably I'm 'doing it wrong'...
I love it!
Maybe they have more important things to do, but you can stir the hornet's nest a bit: post this to Prusa/3D printing groups and maybe it will get enough traction. Eventually Jo will get bored from all the people who tag him asking for it and will just greenlight it 😂
Reddit:
Facebook:
Show everyone the example picture from your initial message here, and it's sure to get lots of traction. I'm rooting for you, this is something I always wanted to see.
@popsickl3 Good idea. Yes, I'll post to Reddit, but not Facebook.
I deleted my Facebook account after Zuck threatened the Australian federal government with retaliation for proposed legislation that would have Facebook paying a small amount to Australian commercial news outlets for their news. Facebook then closed down all of the government departmental facebook pages and those of many emergency and social support services! He/they are not, at the moment, as obviously odious as Musk, but he/they are equally deserving of no support from me. Sorry for the rant, but things like that should not be forgotten. You can read about it here: https://www.theguardian.com/media/2021/feb/23/facebook-reverses-australia-news-ban-after-government-makes-media-code-amendments
This is a nice idea but the requirement to print the outer perimeter first is a deal breaker. Most designs I print have some overhang perimeters somewhere (negative beveled edges or horizontal round holes), and printing the outer perimeter first results in poor quality due to insufficient contact surface. That's why printing the outer perimeter first is disabled by default. It's useful only for prints with no negative slopes that need high dimensional accuracy. I'd wager that this setting is rarely used, and by consequence this scarf seam feature would also be rarely used. It would be great if the scarf seam was simply an automatic integrated feature of the 'outer perimeter first' setting.
@amatulic You may be right, but it certainly should not be a deal-breaker. Any clever implementation in the slicer would do the scarf seam where is fits well and a conventional seam in layers where the outer perimeter first is a problem. The slicer knows where there are overhangs and by how much the hang over, after all.
@MichaelJLew - I'd like to see an option to "print non-overhang outer perimeters first". Then this scarf seam could be used on those, and on layers where there's any overhang, print the inner perimeter first as normal. This concept looks promising and needs some thought on how to implement it so that it gets used when it's possible to do so.
I can't think of anything I've published recently that doesn't involve an overhang somewhere, even if it's just a 45° beveled bottom edge. A Benchy wouldn't do well with outer perimeters first, but it might be good if this could be flipped back and forth automatically.
This is a great idea
If it's easy open a Pull Request with you code, it's just an idea at this point..
I don't know what a Pull Request is. Yes, it's an idea for the slicer, but I have already implemented it in my own LiveCode functions, so it is not "just" an idea. I have posted an example of Gcode that works, so it is not "just" an idea. I have also given a description that is pretty much pseudo-code, so it is not "just" an idea.
Does a person have to provide C++ code in order to contribute? I don't think so, and I find your comment to be a bit offensive.
I knew what you were referring to, but thank you for mansplaining it to me.
I have been castigated on Reddit for saying that the implementation of this should be "easy". I guess I should have said that the implementation is conceptually straightforward. I have also been castigated for not supplying the code. I assumed that my Livecode code would not be helpful, but here it is: `on mouseUp put 50 into xc put 50 into yc put 0.2 into LH put 0.45 into w put the cPrusaSlicerCode of me into tcode--6mm tall cylinder, two walls, LH=0.2
put 6 into z put 6 into rout put rout-0.9 into rLumen put 0 into theta put 600 into f
put rout-w/2 into r put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode repeat while z<=12 put smallSeamLayerMW(xc, yc, rout, rLumen, LH, theta, z, f) & return after tcode end repeat
put rout-w/2 into r put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode put 1.4 into seamDtheta put 0 into theta repeat while z<=18 put smallSeamLayerMW2(xc, yc, rout, rLumen, LH, seamDtheta,theta, z, f) & return after tcode subtract seamDtheta from theta end repeat put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode repeat while z<=24 put smallSeamLayerMW2(xc, yc, rout, rLumen, LH, seamDtheta,theta, z, f) & return after tcode end repeat put tcode into fld "gcodeFld" end mouseUp
function smallSeamLayerMW xc,yc,rout,rLumen,LH, theta,@z,f put true into ccw put rout-rLumen into totW put max(1,totW div 0.45) into n put totW/n into w put rout-w/2 into r --outer perim made of two tapers put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode put circle1Taper(xc, yc, r, z, theta, w, LH, f, ccw) & return after tcode put circle1Taper(xc, yc, r, z, theta, w, LH & return & 0, f, ccw) & return after tcode --inner perims --put r into ri repeat n-1 put r-w into r put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode put arc1(xc, yc, r, 0, 2pi, z, theta, w, LH, f, ccw) & return after tcode end repeat -- --return to start -- put unpolarGoToGC(xc, yc, r, theta, z, 0, 1.5f) & return after tcode return tcode end smallSeamLayerMW
function smallSeamLayerMW2 xc,yc,rout,rLumen,LH,seamDtheta,@theta,@z,f put true into ccw put rout-rLumen into totW put max(1,totW div 0.45) into n put totW/n into w put rout-w/2 into r put unpolarGoToGC(xc, yc, r, theta, z, 0, 2000) & return after tcode put ";taper 1" & return after tcode put 0 into LH1 put LH into LH2 put arc1taperLH(xc,yc,r, LH,seamDtheta,z,theta,w,LH1,LH2,f,ccw) & return after tcode put return after tcode put arc1(xc,yc,r, 0,2pi-seamDtheta,z,theta,w,LH,f,ccw) & return after tcode --need a taper here that decreases LH by keeps z constant... put LH into LH1 put 0 into LH2 put ";taper 2" & return after tcode put arc1taperLH(xc,yc,r, 0,seamDtheta,z,theta,w,LH1,LH2,f,ccw) & return after tcode put return after tcode --inner perims --put r into ri repeat n-1 put r-w into r put unpolarGoToGC(xc, yc, r, theta, z, 0, 2000) & return after tcode put arc1(xc, yc, r, 0, 2pi, z, theta, w, LH, f, ccw) & return after tcode end repeat -- --return to start -- put unpolarGoToGC(xc, yc, r, theta, z, 0, 1.5*f) & return after tcode return tcode end smallSeamLayerMW2
function arc1taperLH xc,yc,r, dz,dtheta,@z,@theta,w,LH1,LH2,f,ccw --Uses only G1 commands so that it can work with Prusa MK4 firmware. --Can taper w, but LH is constant. Use circle1Taper to vary LH. if ccw is empty or ccw="ccw" then put true into ccw if dtheta="dtheta" then put 2pi into dtheta put LH1 into LH put line 1 of w into w1 put line 2 of w into w2 if w2 is empty then put w1 into w2 put round(6(r+1)^1.5) into numSegsPerCircle put round(numSegsPerCircledtheta/(2pi)) into numSegs if numSegs<1 then return "; arc1 had less than one segment; r=" & r end if put abs(dtheta) into dtheta --can't have negative here. Use ccw=false to go clockwise. put dtheta/numSegs into dtheta put dz/numSegs into dz put (w2-w1)/numSegs into dw put line 1 of w into w put (LH2-LH1)/numSegs into dLH if not ccw then put -dtheta into dtheta put unpolarX(xc, r, theta) into x1 put unpolarY(yc, r, theta) into y1 add dtheta to theta put unpolarX(xc, r, theta) into x put unpolarY(yc, r, theta) into y put sqrt((x1-x)^2+(y1-y)^2) into dist repeat numSegs add dz to z add dw to w add dLH to LH put extrudeAmount(dist, LH, w, 1.75) into e if e<0 then return "; extrusion less than zero; r=" & r end if put G1line(x, y, z, e, f) & return after tcode add dtheta to theta put unpolarX(xc, r, theta) into x put unpolarY(yc, r, theta) into y end repeat subtract dtheta from theta return tcode end arc1taperLH `
Seems that the Code function plays badly with the LiveCode code, so here it is again (with a couple of commented out lines removed):
("--" denotes a comment; code is case-insensitive; indentation is for clarity only)
on mouseUp put 50 into xc put 50 into yc put 0.2 into LH put 0.45 into w put the cPrusaSlicerCode of me into tcode--6mm tall cylinder, two walls, LH=0.2
put 6 into z put 6 into rout put rout-0.9 into rLumen put 0 into theta put 600 into f
put rout-w/2 into r put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode repeat while z<=12 put smallSeamLayerMW(xc, yc, rout, rLumen, LH, theta, z, f) & return after tcode end repeat
put rout-w/2 into r put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode put 1.4 into seamDtheta put 0 into theta repeat while z<=18 put smallSeamLayerMW2(xc, yc, rout, rLumen, LH, seamDtheta,theta, z, f) & return after tcode subtract seamDtheta from theta end repeat put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode repeat while z<=24 put smallSeamLayerMW2(xc, yc, rout, rLumen, LH, seamDtheta,theta, z, f) & return after tcode end repeat put tcode into fld "gcodeFld" end mouseUp
function smallSeamLayerMW xc,yc,rout,rLumen,LH, theta,@z,f put true into ccw put rout-rLumen into totW put max(1,totW div 0.45) into n put totW/n into w put rout-w/2 into r --outer perim made of two tapers put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode put circle1Taper(xc, yc, r, z, theta, w, LH, f, ccw) & return after tcode put circle1Taper(xc, yc, r, z, theta, w, LH & return & 0, f, ccw) & return after tcode --inner perims repeat n-1 put r-w into r put unpolarGoToGC(xc, yc, r, theta, z, 0, f) & return after tcode put arc1(xc, yc, r, 0, 2*pi, z, theta, w, LH, f, ccw) & return after tcode end repeat return tcode end smallSeamLayerMW
function smallSeamLayerMW2 xc,yc,rout,rLumen,LH,seamDtheta,@theta,@z,f put true into ccw put rout-rLumen into totW put max(1,totW div 0.45) into n put totW/n into w put rout-w/2 into r put unpolarGoToGC(xc, yc, r, theta, z, 0, 2000) & return after tcode put ";taper 1" & return after tcode put 0 into LH1 put LH into LH2 put arc1taperLH(xc,yc,r, LH,seamDtheta,z,theta,w,LH1,LH2,f,ccw) & return after tcode put return after tcode put arc1(xc,yc,r, 0,2pi-seamDtheta,z,theta,w,LH,f,ccw) & return after tcode --need a taper here that decreases LH by keeps z constant... put LH into LH1 put 0 into LH2 put ";taper 2" & return after tcode put arc1taperLH(xc,yc,r, 0,seamDtheta,z,theta,w,LH1,LH2,f,ccw) & return after tcode put return after tcode --inner perims repeat n-1 put r-w into r put unpolarGoToGC(xc, yc, r, theta, z, 0, 2000) & return after tcode put arc1(xc, yc, r, 0, 2pi, z, theta, w, LH, f, ccw) & return after tcode end repeat return tcode end smallSeamLayerMW2
function arc1taperLH xc,yc,r, dz,dtheta,@z,@theta,w,LH1,LH2,f,ccw --Uses only G1 commands so that it can work with original Prusa MK4 firmware. --Can taper w, but LH is constant. Use circle1Taper to vary LH. if ccw is empty or ccw="ccw" then put true into ccw if dtheta="dtheta" then put 2pi into dtheta put LH1 into LH put line 1 of w into w1 put line 2 of w into w2 if w2 is empty then put w1 into w2 put round(6(r+1)^1.5) into numSegsPerCircle put round(numSegsPerCircledtheta/(2pi)) into numSegs if numSegs<1 then return "; arc1 had less than one segment; r=" & r end if put abs(dtheta) into dtheta --can't have negative here. Use ccw=false to go clockwise. put dtheta/numSegs into dtheta put dz/numSegs into dz put (w2-w1)/numSegs into dw put line 1 of w into w put (LH2-LH1)/numSegs into dLH if not ccw then put -dtheta into dtheta put unpolarX(xc, r, theta) into x1 put unpolarY(yc, r, theta) into y1 add dtheta to theta put unpolarX(xc, r, theta) into x put unpolarY(yc, r, theta) into y put sqrt((x1-x)^2+(y1-y)^2) into dist repeat numSegs add dz to z add dw to w add dLH to LH put extrudeAmount(dist, LH, w, 1.75) into e if e<0 then return "; extrusion less than zero; r=" & r end if put G1line(x, y, z, e, f) & return after tcode add dtheta to theta put unpolarX(xc, r, theta) into x put unpolarY(yc, r, theta) into y end repeat subtract dtheta from theta return tcode end arc1taperLH
This is now being implemented for OrcaSlicer: https://github.com/SoftFever/OrcaSlicer/pull/3839
I never really noticed this was an issue before. I started recently designing (with a view to selling) astronomy parts. Telescopes are round and cylindrical for the most part. These seams are bad enough that I'm not actually sure I can sell them in the current state!
This solution does seem fantastic. I wonder, does it work with lower layer heights than 0.3? I have details on cylinder walls which benefit from lower layer height, around 0.15mm.
I hope Prusa actually acknowledge the effort put in by the community in this thread.
Yes, it works well for me with layers of 0.12mm. I'm not sure, but the micro-step distance on the z-axis might be a limiting factor...
Are you aware that Noisyfox has implemented the method in OrcaSlicer? See this thread: https://github.com/SoftFever/OrcaSlicer/pull/3839 You can try it out here: https://github.com/SoftFever/OrcaSlicer/actions/runs/7792877482
I saw that. I've not looked in to alternative slicers, so will take a look thanks. I was on with Prusa Support the other day and I linked this thread, he said he would forward it on. Believe it or not the seams were actually interfering with my interference fit. I really hope they implement it. It's great.
So I had a go with the Orca Slicer implementation. I do not have Orca dialled in at all for my printer, and I simply used default settings. As expected in such a scenario, PrusaSlicer gave a much nicer finish generally out of the box. However, the seam is absolutely outrageous.
Orca Slicer's implementation of the Scarf Seam seems good. Printing allows you to see what most of the settings represent. I would say that it certainly minimises the stark impact of the seam, but does spread the seam over a much wider space, which is still visible.
I think usage will really depend on what you're printing, as always.
None of these settings are dialled in, I'm sure I could get much better with experimenting as these are just default. But I figured sharing defaults might be useful
Print Time 2hr 21min
Print Time 3hr 29min (Default Scarf Seam settings)
The scarf seam seems (sorry!) to have given you an improvement, but there is still room for more. Did you print the outer perimeter first? I would do that if the outer wall seam is the one you want best hidden. And I would not have retractions or z-hop between layers.
Print Time 3hr 29min
I just noticed the increased time for the scarf seam print. It seems to be too much. At most the scarf seam should extend print time by adding overlap on the perimeter and by (sometimes) requiring the outer perimeter to be printed slowly. That should not increase the time by anything like 50%.
Can you zip your gcode files and post them?
Sure. As I said I just ran pretty much defaults on Orca. I'm sure it can be tweaked.
Sure. As I said I just ran pretty much defaults on Orca. I'm sure it can be tweaked.
I printed the bottom few mm of your files and got the results that you did (Prusa MK4, like yours). I then sliced a similar tube shape with retractions turned off and got a much better scarf seam, at the cost of having quite a few blobs on the inner surface and a little stringing. I think that turning off retract on layer change might help. I'll test that next.
Michael if you'd like the stl I used it's here:
https://drive.google.com/file/d/1WnE1i8HTZmbk9CAEqrja8WseL_imOmHK/view?usp=drivesdk
On Sun, 18 Feb 2024, 23:49 MichaelJLew, @.***> wrote:
Sure. As I said I just ran pretty much defaults on Orca. I'm sure it can be tweaked.
I printed the bottom few mm of your files and got the results that you did (Prusa MK4, like yours). I then sliced a similar tube shape with retractions turned off and got a much better scarf seam, at the cost of having quite a few blobs on the inner surface and a little stringing. I think that turning off retract on layer change might help. I'll test that next.
— Reply to this email directly, view it on GitHub https://github.com/prusa3d/PrusaSlicer/issues/11621#issuecomment-1951488100, or unsubscribe https://github.com/notifications/unsubscribe-auth/AIPJKO2ZGTSWELZZFEB6V33YUKHP7AVCNFSM6AAAAAA7DV6GVSVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTSNJRGQ4DQMJQGA . You are receiving this because you commented.Message ID: @.***>
+1 for adding this as a seam option to the slicer
+1 Just seen a video for this on TeachingTech YouTube channel. 100% want to see this in prusa slicer :) seams are the bane of my prints (well other than the printer itself that is!)
This looks incredible. +1 from me
Another +1! This should be prioritized as it all but eliminates one of the ugliest issues of FDM printing.
+1
+1
Please just add a Like to the first post instead of posting "+1", it gets harder to communicate with all that.
Video about this new feature
+1
+1
I was just watching a video on the Teaching Tech YouTube channel about this the other day hoping for it to come to Prusa. This would be awesome. I've had nothing but problems with seams (and supports) using my Kobra 2 Pro.
updated the wikipedia page of scarf joint to include reference to usage in 3D printing, now that OrcaSlicer implemented this. https://en.wikipedia.org/wiki/Scarf_joint#3D_printing
@petrubecheru wikipedia's administration rolled that back...
This looks brilliant! Given the hype Orcaslicer put on it (well-deserved), I would hope to see it on PS very shortly!
Orca slicer is based on bambu slicer, which is based on prusa slicer right? I guess it should be possible to backport the code...
It is a mix of Bambu and prusa. I believe the base is Bambu
Is there a way on voting on such features ? anyone know ? @SachCZ
Is there a way on voting on such features ? anyone know ? @SachCZ
Give it a 👍 in the first item. At least that shows the interest and support.
@idaadi
Please just add a Like to the first post instead of posting "+1", it gets harder to communicate with all that.
I can't wait to have this feature in PrusaSlicer (or alternatively a XL-Profile in CURA)! It would resolve the biggest issue on functional "print in place"-prints. When will it be implemented?
I can't believe how long this idea has gone unnoticed for. This seems pretty easy to implement and would be a massive upgrade for PrusaSlicer. I hope they'll add it in 2.9 or 3.0 but I have no idea.
The problem presented by the seams at layer change needs little introduction. It is sometimes trivial and sometimes important and PrusaSlicer offers a lot of variables that can alter the seam location, form, and visibility on the model. However, there is often no good way to prevent the seam from being #intrusive.
I have a method for making seams in my 'hand-made' gcode that are far less intrusive than those that I can achieve using PrusaSlicer. I believe that the method would be readily incorporated into the slicer and should be offered as an option.
I call the improved seam a 'scarf seam' because it is similar to a scarf joint that woodworkers might use to join two pieces of timber end to end. The scarf joint is conceptually simple as it simply has matching tapers on the ends of the timber that are glued together. A long taper gives a strong joint.
The standard seam can be described like this: the nozzle is positioned at the start of a perimeter at the z-height that is a full layer height above the previous layer. Extrusion starts and the nozzle moves around the perimeter until it arrives back at the start position whereupon the nozzle movement and extrusion stops. The scarf seam differs in that the nozzle starts at the same z-height as the previous layer. The Z-height is gradually increased as the perimeter is printed until it reaches the full layer height. (That is one of the scarf tapers.) The perimeter is then printed normally until the nozzle reaches back to the starting XY location, whereupon the nozzle retraces the first taper with a complementary taper where the layer height is decreased gradually to zero but the z-height is fixed. (That makes the second taper.) After the second taper is complete the nozzle can be moved away to complete the rest of the layer in the normal manner.
The low visibility of the scarf seam comes from the fact that the discontinuity of the joint if spread over the gradual tapers. When the nozzle is moved to the outer perimeter to start a scarf seam it is moved with effectively zero layer height and so there is almost no artefact from that movement. The scarf seam is compatible with any object shape, but I used a cylinder for the example for my own convenience. (I normally print fountain pen parts and most of my printing is pseudo-cylindrical objects with gcode from custom-written software and so I have a big library of cylinder-related functions.)
The scarf seam has a couple of possible disadvantages. First, it gives a region of variable layer height that may sometimes be visible. Second, it will be slower than the normal seam because it involves the nozzle moving twice over a part of the outer perimeter. That speed difference may be trivial in many cases as the scarf distance can be small compared to the perimeter total, and the outer perimeter is a small part of most printed objects. Finally, the scarf seam requires that the outer perimeter be printed first so that the first taper does not foul adjacent extrusions.
Example file
The attached file was generated by PrusaSlicer and then gcode generated by custom software appended. The PrusaSlicer settings were for the MK4 (no IS) and used the 0.20 QUALITY setting for Prusament PLA with the following changes from the defaults: no retract on layer change; no wipe; external perimeters first. The seam was painted on to force it to align with the seams from my software.
The first 6mm of the cylinder are the PrusaSlicer output. The region between 6mm and 12mm has a scarf seam with the tapers extending around the full 360 degrees of circumference. Between 12mm and 18mm the scarf seam has aligned tapers over 80 degrees of circumference. The alignment requires a retrograde travel move after each layer. The last section, 18mm to 24mm, has the 80 degree scarf but does not re-align the seams and so the seam moves by 80 degrees at each layer change.
cylinder d=12 h=6 v2d.gcode.zip