ahmetcemturan / sfact Goto Github PK
View Code? Open in Web Editor NEWSFACT the New Skeinforge
Home Page: http://reprap.org/wiki/Sfact
License: GNU Affero General Public License v3.0
SFACT the New Skeinforge
Home Page: http://reprap.org/wiki/Sfact
License: GNU Affero General Public License v3.0
In the clip plugin, "Clip Over Perimeter adjuster" has the note "decrease for bigger gap", but in reality you increase this parameter for a larger gap. It's line 91 in clip.py. I'd make a pull request, but I didn't think it would be worth making a branch for one word :]
My description is maybe not really understandable/clear, but enabling leadin plugin on daily build leads to an empty area all around inner shell.
Test was made on a clean checkout (741fc41), with following .stl : http://www.thingiverse.com/thing:5011 (simple bridge calibration cube).
With plugin enabled : http://uppix.net/b/f/4/022b47333343fc3c03ef60e17d988.png
Without : http://uppix.net/6/0/d/e4e1429edfc8afb114aba1447867a.png
When using relative units as extruder values, the retraction distance in the gcode is always 0.0:
G1 F900.0
G1 E-0.0
G1 F1200.0
G1 X9.848 Y-22.999 Z0.4 F1200.0
G1 F900.0
G1 E0.0
G1 F1200.0
This does not happen when using absolute values.
After a bit of tinkering with my new felixprinter I finally figured out that the lash plugin contains a "thinko". The way it compensates for backlash is strictly speaking only correct for rectangular pieces, i.e. with all perimeters aligned to the X and Y axis.
Way to reproduce: make a rectangular piece and rotate it slightly, i.e. alpha=5 or 10 degrees. printing this with backlash in the axis will leave pieces of wall after the corners that are parallel to the axis for a length of backlash/sin(alpha). This could be removed by reversing the extruder movement along the relevant axis for the backlash distance at the corner.
What the lash plugin does instead is trying to compensate for the backlash during the path to the corner, which results in the corner points being in the right place, but the line in between is only correct if it is parallel to one of the axis. On most prints and printers with edges mostly parallel to the axis and backlash 0.1mm or less this is barely noticeable, I only noticed because I have a bit of a vibration issue in my x-axis and can only use it somewhat loosened until that is fixed. Nevertheless, fixing the plugin to do the right thing in every case would improve the quality on any printer that uses this plugin.
I'll gladly provide test pieces or test updated code, but I haven't understood the plugin code yet.
retraction used to be set at 30 mm per minute, now it's 30 per second. Is this a typo? I've been having odd retraction voids, and I'm wondering if the "stock" setting should be .5mm per second now.
From Readme.txt:
"(CAUTION: If you want to use SFACT from within Pronterface, you need to copy the files into a folder called skeinforge within the folder of Pronterface. Then you will need to manually copy or move the sfact_settings folder into that directory as otherwise SFACT wont see the default profiles shipped with it.) "
The sfact_settings folder mentioned above does not appear to exist. Should it read sfact_profiles instead?
Suggestion: adding a textual diagram like the following might also help visually clarify the required final directory structure:
C:\
___ [Path to Pronterface]
______ Pronterface
_________ locale
_________ sfact_settings (sfact_profiles?)
_________ skeinforge
Changing the Extrusion lines extra spacing value doesn't seem to have any effect at all on the skeined object.
Running sfact on linux mint works fine until i add a raft, setting both base layers and interface layers to 1 and I get the following:
Multiply procedure took 1 second.
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in call
return self.func(*args)
File "/home/laptop/Desktop/SFACT-master/fabmetheus_utilities/settings.py", line 1173, in execute
self.repository.execute()
File "sfact.py", line 599, in execute
skeinforge_craft.writeOutput(fileName) #use this line instead of the below two for regular python slicing
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_utilities/skeinforge_craft.py", line 135, in writeOutput
return pluginModule.writeOutput(fileName, shouldAnalyze)
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_plugins/craft_plugins/export.py", line 275, in writeOutput
gcodeText = skeinforge_craft.getChainTextFromProcedures(fileName, procedures[: -1], gcodeText)
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_utilities/skeinforge_craft.py", line 44, in getChainTextFromProcedures
text = craftModule.getCraftedText(fileName, text)
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py", line 226, in getCraftedText
return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository)
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py", line 236, in getCraftedTextFromText
return RaftSkein().getCraftedGcode(gcodeText, repository)
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py", line 815, in getCraftedGcode
self.addRaft()
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py", line 585, in addRaft
self.addBaseLayer()
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py", line 449, in addBaseLayer
self.addLayerFromEndpoints( self.baseEndpoints, self.repository.baseFeedRateMultiplier.value,self.repository.baseFlowRateMultiplier.value,baseLayerThickness,self.baseLayerThicknessOverLayerThickness, self.baseStep,z)
File "/home/laptop/Desktop/SFACT-master/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py", line 512, in addLayerFromEndpoints
feedRateMinute = self.feedRateMinute * feedRateMultiplier / layerThicknessRatioSquared
TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'
I have tried running as both root and regular user, If I reset the value's to zero it slices fine.
Any Ideas ?
Cheers
I generated an STL file from the scad file below and then looked at the gcode after sfact had sliced it using the slice walking window in pronterface. As you rise up through the left hand vertical pipe in the model, the pipe bends through 90 degrees and becomes horizontal. If you move up to where the pipe void starts to narrow, rather than filling in the roof of the pipe uniformly, the bottom (as you look at the model on pronterface) side of the pipe next to the bend has a odd jig in its walls. This is not in the scad model, and if you fly through the model with meshlab it should not be there. Slic3r gets this pipe right, but has problems with parts of the vertical pipes which it leaves filled rather than hollow.
I have not tried building this model as if the pronterface rendering is right this overhang will sag into the pipe which will render it useless.
.scad file>>>>>>>>>>>>>>>>
// Hydrocyclone
// Copyright(C) David Goodenough 2011
// Licenced under GPL V3
// Much of the calculations for this parametric cyclone come from a paper
// found on the web called "The Sizing and Selection of Cyclones" by Richard
// A. Arterburn.
$fs=0.01;
cyclone(supplyIR=3,underflowIR=2,pipeWall=2,pipeLen=15,vesselWall=3);
// A pipe is an outer cylinder from which is removed an inner cylinder
module pipe(len,ir,wall) {
difference() {
cylinder(len,r=ir+wall);
}
}
// A funnel is an outer cone from which is removed an inner cone
module funnel(len,ir1,ir2,wall) {
difference() {
cylinder(len,r1=ir1+wall,r2=ir2+wall);
}
}
// This is like a pipe, but has a side pipe entering it. This side pipe has
// to be clipped by the inside of the main cylinder. But actually the side
// pipe is a block, its easier that way. Also no need to remove the inside
// the pipe as we remove that later.
module chamber(cylLen,cylIr,cylWall,pipeLen,pipeIr,pipeWall, inletOffset,inletAngle) {
xlen = (2_cylIr) + pipeIr + pipeWall;
ylen = 2_( pipeIr + pipeWall );
zlen = 2*pipeIr + cylWall;
difference() {
union() {
cylinder(cylLen,r=cylIr+cylWall);
rotate([0,0,inletAngle])
translate([inletOffset+pipeIr,-(ylen + pipeWall/2),zlen/2])
cube(size=[xlen,ylen,zlen],center=true);
}
}
}
// This creates the inside of the inlet pipe, which has a 90 degree bend in it
// We remove this from a solid block to create the pipe, and union that with a
// real pipe for the outside connector.
//
//pipeCorder
// Build a pipe with a 90 degree corner
// @param cylR object radius
// @param bendR bend radius
// @param upperL length of upper pipe
// @param lowerL length of lower pipe
//
module pipeCorner(cylR,bendR,upperL,lowerL) {
translate([-(bendR+cylR),0,0])
union() {
// lower arm
translate([bendR+cylR, 0 /.02 */, 0])
rotate([90, 0, 0])
cylinder(r=cylR, h=lowerL+2);
// upper arm
rotate([0, 0, 90])
translate([bendR + cylR, -0 /.02 */, 0])
rotate([-90, 0, 0])
cylinder(r=cylR, h=upperL+2);
// bend
difference() {
// torus
rotate_extrude()
translate([bendR + cylR, 0, 0])
circle(r=cylR);
// lower cutout
translate([-50, -100, -50]) cube([100, 100, 100]);
// upper cutout
rotate([0, 0, 90]) translate([-50, 0, -50]) cube([100, 100, 100]);
}
}
}
// Cyclone takes several arguements:-
// supplyIR the internal radius of the inflow and outflow pipes
// underflowIR the internal radius of the underflow pipe
// pipeWall the thickness of the pipe walls
// pipeLen the length of the pipes outside the vessel, ie the length the pipe fits to
// vesselWall the thickness of the main vessel walls
//
// Everything else is calculated. The only two bits of this that are not from
// "the sizing and selection of hydrocyclones" by Richard Arterburn are the height
// of the chamber (which is set to its diameter) and and angle for the cone
// (which is set to 15 degrees, the doc says 10-20 degrees).
//
module cyclone(supplyIR,underflowIR,pipeWall,pipeLen,vesselWall) {
cylinderHeightMultiplier = 2;
coneAngle = 15;
// cylinder internal radius is such that the input pipe area is 0.05
// times the cyclone diameter
cylinderIR = sqrt(80 * supplyIR * supplyIR) / 2;
echo("cylinderIR=",cylinderIR);
// cylinder height is twice the cylinder internal radius
cylinderHeight = cylinderIR * cylinderHeightMultiplier;
echo("cylinderHeight=",cylinderHeight);
// the vortex finder depth (in the cylinder) is 0.7 times the cylinderIR
vortexLen = cylinderIR * 0.7;
echo("vortexLen=",vortexLen);
// cone height is such that the angle of the cone is coneAngle degrees (the
// book says between 10 and 20 degrees).
coneHeight = (cylinderIR - underflowIR) / tan(coneAngle);
echo("coneHeight=",coneHeight);
echo("total Height=",pipeLen + pipeLen + cylinderHeight + coneHeight);
removeOffset = cylinderIR + vesselWall;
pipeSeparation = cylinderIR * 2; // may change this if we add a screw fit connector
inletOffset = cylinderIR - supplyIR;
inletAngle = asin(inletOffset/pipeSeparation) + 180;
// Now build it.
// We build it upside down so that it does not need internal support
// First a plate so that it adheres to the build surface.
difference() {
union() {
difference() {
union() {
translate([-50-(removeOffset/2),-25,0]) cube(size=[100,50,2]);
translate([-(cylinderIR+vesselWall)_2.5,-cylinderIR-vesselWall,0])
cube(size=[(cylinderIR+vesselWall)_3.5,
2*(cylinderIR+vesselWall),
pipeLen],
center=false);
}
translate([-(cylinderIR),0,0])
cube(size=[(cylinderIR*3)+vesselWall,
2*cylinderIR,
pipeLen-vesselWall],
center=true);
cylinder(h=pipeLen,r=supplyIR);
translate([-pipeSeparation,0,0])
cylinder(h=pipeLen,r=supplyIR);
}
}
// First the outlet pipe
pipe(vortexLen + vesselWall + pipeLen,supplyIR,pipeWall);
// and the end of the inlet pipe
translate([-pipeSeparation,0,0])
pipe(pipeLen+(vesselWall-pipeWall),supplyIR,pipeWall);
// the bend of the inlet pipe
rotate([90,0,inletAngle])
pipeCorner(supplyIR,vesselWall-pipeWall,pipeLen+vesselWall,pipeLen);
// end plate
translate([0,0,pipeLen]) pipe(vesselWall,supplyIR,cylinderIR);
// Now the chamber
translate([0,0,pipeLen]) chamber(cylinderHeight,cylinderIR,vesselWall,
cylinderIR+vesselWall,supplyIR,pipeWall,
inletOffset,inletAngle);
// now the cone
translate([0,0,pipeLen + cylinderHeight])
funnel(coneHeight,cylinderIR,underflowIR,vesselWall);
// The underflow pipe is unnecessary, so ignore it
// finally the underflow pipe
// translate([0,0,pipeLen + cylinderHeight + coneHeight])
// pipe(pipeLen,underflowIR,pipeWall);
}
// the bend of the inlet pipe
rotate([90,0,inletAngle])
pipeCorner(supplyIR,vesselWall-pipeWall,pipeLen+vesselWall,pipeLen);
}
}
Hi,
as of today (30 Oct), I get the following exception, after I pulled the latest changes from git:
Exception traceback in getModuleWithDirectoryPath in archive:
Traceback (most recent call last):
File "/Users/markusklink/Documents/Printrun/skeinforge/fabmetheus_utilities/archive.py", line 201, in getModuleWithDirectoryPath
folderPluginsModule = import(fileName)
File "/Users/markusklink/Documents/Printrun/skeinforge/skeinforge_application/skeinforge_plugins/craft_plugins/export.py", line 271
fileNameSuffix += '.' + getFirstValue(gcodeText, '(')
^
IndentationError: expected an indented block
That error means; could not import a module with the fileName export
and an absolute directory name of /Users/markusklink/Documents/Printrun/skeinforge/skeinforge_application/skeinforge_plugins/craft_plugins
I get this error after try to load a file from Printrun, but I guess it is due to SFact. Hope this helps. Markus
It would be great if SFACT could support $XDG_CONFIG_HOME $XDG_DATA_HOME.
Hey,
Here's what I've got... my carve setting is 0.2mm layer height. my bed surface is 0.3mm above my endstop.
First layer should print at 0.4 if BASE Nozzle Lift over Layer Height is 0.5. also
shouldn't each subsequent slice be moved after moving the bottom layer? if you don't then you're shifting the location of the slice that's printed and messing up the spacing, I think.
I had to do the following to get the expected normal dimensions:
LAYER HEIGHT: 0.2
Extra Nozzle Lift over Layer Height: 1.0 < WHY? do I need this at all? and why is it 1.0, not 1.5 like interface and base?
Interface Nozzle Lift over Layer Height: 1.5 <this seems like it should be 0 since it should be 0 more than 1 layer height above base?
Base Nozzle Lift over Layer Height: 1.5 <OK this seems right
this results in the follow G-Code Z heights for layers
BASE: 0.4
INTERFACE: 0.6
OBJECT FIRST LAYER: 0.8
Layers after: 1.0,1.2... etc.
seems unable to fill with other patterns
I get errors when i activate support with sfact daily 04ade76 but slices nice if it`s not activated.. FIX IT!!!! ehem.. please...? :-) http://dl.dropbox.com/u/21839627/supportActivatedWTF.jpg
It doesn't matter what I put to "Main Flow Rate (scaler):", the result is always the same.
I have tried values from the default 1 to 0.1, and my reprap always extrudes a bit too much.
I did not have such issues with the original skeinforge
Using the OldDimension module, the filament is not being retracted when the nozzle moves from one island to another. It is retracted when moving within an island (which is exactly the opposite of the desired behavior).
I downloaded the STL files for this pliers:
Pliers Left.STL
Pliers Right.STL
http://www.thingiverse.com/thing:11332
Both of them produced this error.
keinforge execution failed.
Traceback (most recent call last):
File "./pronterface.py", line 956, in skein_func
skeinforge_craft.writeOutput(self.filename,False)
File "/Users/dshanaghy/Workspace/Others/Printrun/skeinforge/skeinforge_application/skeinforge_utilities/skeinforge_craft.py", line 134, in writeOutput
return pluginModule.writeOutput(fileName, shouldAnalyze)
File "/Users/dshanaghy/Workspace/Others/Printrun/skeinforge/skeinforge_application/skeinforge_plugins/craft_plugins/export.py", line 190, in writeOutput
gcodeText = skeinforge_craft.getChainTextFromProcedures(fileName, procedures[ : - 1 ], gcodeText)
File "/Users/dshanaghy/Workspace/Others/Printrun/skeinforge/skeinforge_application/skeinforge_utilities/skeinforge_craft.py", line 44, in getChainTextFromProcedures
text = craftModule.getCraftedText(fileName, text)
File "/Users/dshanaghy/Workspace/Others/Printrun/skeinforge/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py", line 72, in getCraftedText
return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository)
File "/Users/dshanaghy/Workspace/Others/Printrun/skeinforge/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py", line 82, in getCraftedTextFromText
return SkirtSkein().getCraftedGcode(gcodeText, repository)
File "/Users/dshanaghy/Workspace/Others/Printrun/skeinforge/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py", line 212, in getCraftedGcode
self.parseLine(line)
File "/Users/dshanaghy/Workspace/Others/Printrun/skeinforge/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py", line 286, in parseLine
self.addSkirt(float(splitLine[1]))
File "/Users/dshanaghy/Workspace/Others/Printrun/skeinforge/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py", line 173, in addSkirt
closedLoop = outsetLoop + [outsetLoop[0]]
IndexError: list index out of range
Description (at the top) points to reprapfordummies dot net, which seems to lead to a domain for sale page.
the "object first layer infill" speed doesn't work afaik... i think it used the main feedrate for that and not the value i set... (SFACT-5fbef98)
I ran a side-by-side comparison printing with the dwells, and then after commenting ALL G4's out... 88 minutes vs 69 minutes. That is a huge difference. I did notice a teensy bit more strings... very minor for the amount of speedup... it would scrifice less, I think, to just retract a little more. the dwells on a 69 minute print added up to almost 20 minutes (a 27% time increase)... and in the one test model I did, no appreciable difference.
perhaps it could be a check-box in the speed setting "use dwell for (maybe) some improved quality during retractions"
just a thought, but I'll be putting a find/replace in my find/replace.csv to remove them for now.
not 100% sure if this is an error or not, but here's a hypothetical.
scale 1.0 on a 10mm part with 0.5mm extrusion width. SF will output a motion path of 9mm.
when the scale is doubled, rather than creating a 20mm geometry for a 0.5mm extrusion, it creates a 18mm extrusion, as though it were expecting a 1mm extrusion width
Whenever a layer contains an overhang that is > 45 degrees, the entire layer is printed as though it were a bridge. If you are using a fairly low bridge flow rate, in order to create tight bridges (.4, for example), the entire layer is printed with .4 flow rate, resulting in a visible indentation at the surface of the object.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.