SheetMetal Biegung mit nichtparallelen Seiten
Re: SheetMetal Biegung mit nichtparallelen Seiten
Also ich hab den master von https://github.com/shaise/FreeCAD_SheetMetal/ genommen, deine änderungen reinkopiert. git schafft es nicht da änderungen anzuzeigen... Ich hab mal versucht vorher mit autopep8 und dox2unix das zu normalisieren, aber dennoch sinds ziemlich viele änderungen.
Ich hab übrigens auch im sheet metal thread gefragt ob das ggf gemereged wird.
Ich hab übrigens auch im sheet metal thread gefragt ob das ggf gemereged wird.
Re: SheetMetal Biegung mit nichtparallelen Seiten
Ich hab das nochmal in git eingebaut: https://github.com/shaise/FreeCAD_Sheet ... x:new_wall
Einige Dinge funktionieren da aber nicht. Mal mit den Invertierungen herumspielen, dann hagelt es gleich Fehler auf der Konsole.
Einige Dinge funktionieren da aber nicht. Mal mit den Invertierungen herumspielen, dann hagelt es gleich Fehler auf der Konsole.
Re: SheetMetal Biegung mit nichtparallelen Seiten
Moin,
sorry, daß ich mich eine Weile nicht gemeldet habe. Ich habe zwischendurch diverses ausprobiert. Weil sonst alles nicht verfügbar war oder richtig scheiße aussah - kanten, wo keine hingehören oder ein rundrum mit 45° auf Gehrung gelaserter Oberteil, blieb mir nichts anderes übrig als die Kanten alle mit Taschenrechner, Papier und dann im Draft zu basteln und dann Flächen und Körper draus zu machen. Wenn man sehr stark rein zoomt findet man noch Rundungsfehler im µm-Bereich, aber es soll erstmal gut sein.
Dabei ist mir noch aufgefallen, daß die Ellipsen- und Ellipsenbogenfunktionen sowohl im Draft als auch im Sketch nicht wirklich zu gebrauchen sind. Im Sketcher reagieren sie nicht auf Constraints, dort gleich präzise erstellen geht nicht und Im Draft gibt es keine Ellipsenbögen. Der Sketcher ist sowieso 2D und fällt daher raus. Ellipsenbögen aus DXF importieren geht auch nicht. Das werden komplette Ellipsen.
Die Abhilfe waren Kreisbögen in Kombination mit der Skalierung, die ich dann Achsweise verwendet habe. Da werden dann NURBS draus, naja hauptsache ich muß da keine Gleichungssysteme berechnen um die Kontrollpunkte zu berechnen, aber wie man NURBS sinnvoll dazu bringt, daß man bestimmte Punkte trifft ist ein anderes Thema. Das hat hier zum Glück automatisch funktioniert.
Um den K-Faktor habe ich mich jetzt nicht gekümmert. Es wird ja auch nach dem DXF gelasert und von die Biegemaschine versteht sicher auch weder .step noch .fcstd.
Vielen Dank für die vielen Gedanken, die Ihr Euch gemacht habt. Offensichtlich habe ich hier wohl eher eine Featurerequest gemacht. Wenn das so funktionieren würde wie mit Creo wäre das natürlich total super. Dann wird's präzise und noch vorherzusehen, was mit dem Drainageloch neben der Schweißnaht wird ist auch super - ich meine das Loch, was sich bei dem Screenshot aus Creo etwas verformt hat. Das tut es in der Praxis auch und beim Schweissen muß man da etwas aufpassen. Wäre es weiter weg könnte da jedoch Wasser/Matsch hängen bleiben.
sorry, daß ich mich eine Weile nicht gemeldet habe. Ich habe zwischendurch diverses ausprobiert. Weil sonst alles nicht verfügbar war oder richtig scheiße aussah - kanten, wo keine hingehören oder ein rundrum mit 45° auf Gehrung gelaserter Oberteil, blieb mir nichts anderes übrig als die Kanten alle mit Taschenrechner, Papier und dann im Draft zu basteln und dann Flächen und Körper draus zu machen. Wenn man sehr stark rein zoomt findet man noch Rundungsfehler im µm-Bereich, aber es soll erstmal gut sein.
Dabei ist mir noch aufgefallen, daß die Ellipsen- und Ellipsenbogenfunktionen sowohl im Draft als auch im Sketch nicht wirklich zu gebrauchen sind. Im Sketcher reagieren sie nicht auf Constraints, dort gleich präzise erstellen geht nicht und Im Draft gibt es keine Ellipsenbögen. Der Sketcher ist sowieso 2D und fällt daher raus. Ellipsenbögen aus DXF importieren geht auch nicht. Das werden komplette Ellipsen.
Die Abhilfe waren Kreisbögen in Kombination mit der Skalierung, die ich dann Achsweise verwendet habe. Da werden dann NURBS draus, naja hauptsache ich muß da keine Gleichungssysteme berechnen um die Kontrollpunkte zu berechnen, aber wie man NURBS sinnvoll dazu bringt, daß man bestimmte Punkte trifft ist ein anderes Thema. Das hat hier zum Glück automatisch funktioniert.
Um den K-Faktor habe ich mich jetzt nicht gekümmert. Es wird ja auch nach dem DXF gelasert und von die Biegemaschine versteht sicher auch weder .step noch .fcstd.
Vielen Dank für die vielen Gedanken, die Ihr Euch gemacht habt. Offensichtlich habe ich hier wohl eher eine Featurerequest gemacht. Wenn das so funktionieren würde wie mit Creo wäre das natürlich total super. Dann wird's präzise und noch vorherzusehen, was mit dem Drainageloch neben der Schweißnaht wird ist auch super - ich meine das Loch, was sich bei dem Screenshot aus Creo etwas verformt hat. Das tut es in der Praxis auch und beim Schweissen muß man da etwas aufpassen. Wäre es weiter weg könnte da jedoch Wasser/Matsch hängen bleiben.
- Attachments
-
- gefrickel-mit-nurbs.fcstd
- (107.04 KiB) Downloaded 34 times
-
- Veteran
- Posts: 7788
- Joined: Tue Jan 07, 2014 11:10 am
- Contact:
Re: SheetMetal Biegung mit nichtparallelen Seiten
Schon gesehen?Das_Sams wrote: ↑Sun Feb 24, 2019 12:00 am Offensichtlich habe ich hier wohl eher eine Featurerequest gemacht. Wenn das so funktionieren würde wie mit Creo wäre das natürlich total super. Dann wird's präzise und noch vorherzusehen, was mit dem Drainageloch neben der Schweißnaht wird ist auch super - ich meine das Loch, was sich bei dem Screenshot aus Creo etwas verformt hat. Das tut es in der Praxis auch und beim Schweissen muß man da etwas aufpassen. Wäre es weiter weg könnte da jedoch Wasser/Matsch hängen bleiben.
https://forum.freecadweb.org/viewtopic. ... 57#p288757
Habs mal ausprobiert, es funktioniert. Hab folgende Zeilen im Makro auf Wanddicke, Biegeradius und Winkel geändert:
Code: Select all
import Part
import BOPTools.SplitFeatures, BOPTools.JoinFeatures
def smthk(obj, foldface) :
normal = foldface.normalAt(0,0)
theVol = obj.Volume
if theVol < 0.0001:
SMError("Shape is not a real 3D-object or to small for a metal-sheet!")
else:
# Make a first estimate of the thickness
estimated_thk = theVol/(obj.Area / 5.0)
p1 = foldface.CenterOfMass
p2 = foldface.CenterOfMass + estimated_thk * -1.3 * normal
e1 = Part.makeLine(p1, p2)
thkedge = obj.common(e1)
thk = thkedge.Length
return thk
def smFold(bendR = 5.0, bendA = 45.0, kfactor = 0.45, invertbend = False, flipped = False, unfold = False,
bendlinesketch = None, selFaceNames = '', MainObject = None):
FoldShape = MainObject.Shape
foldface = FoldShape.getElement(selFaceNames[0])
normal = foldface.normalAt(0,0)
thk = smthk(FoldShape, foldface)
offset = thk / 2.0 * kfactor
tool = bendlinesketch.Shape
tool_faces = tool.extrude(normal * -thk)
#Part.show(tool_faces)
cutSolid = BOPTools.SplitAPI.slice(FoldShape, tool_faces.Faces, "Standard", 0.0)
cutface = BOPTools.SplitAPI.slice(foldface, tool.Edges, "Standard", 0.0)
sketch = tool.copy()
sketch.translate(normal * -offset)
cutface.translate(normal * -offset)
Axis = FoldShape.common(sketch)
#Part.show(Axis)
edge = Axis.Edges[0]
revAxisP = edge.valueAt(edge.FirstParameter)
revAxisV = edge.valueAt(edge.LastParameter) - edge.valueAt(edge.FirstParameter)
revAxisV.normalize()
face0 = cutface.childShapes()[0]
face1 = cutface.childShapes()[1]
face1.rotate(revAxisP, revAxisV, bendA)
#Part.show(face1)
facecommon = face1.common(tool)
#Part.show(facecommon)
if not(facecommon.Edges) :
revAxisV = revAxisV * -1
face1 = cutface.childShapes()[1]
face1.rotate(revAxisP, revAxisV, bendA)
solid0 = cutSolid.childShapes()[0]
solid1 = cutSolid.childShapes()[1]
solid1.rotate(revAxisP, revAxisV, bendA)
#Part.show(solid0)
#Part.show(solid1)
facelist = [face0, face1]
joinface = BOPTools.JoinAPI.connect(facelist)
filletedface = joinface.makeFillet(bendR + offset, joinface.Edges)
#Part.show(filletedface)
offsetfacelist = []
offsetsolidlist = []
for face in filletedface.Faces :
if str(face.Surface) != "<Plane object>" :
offsetface = face.makeOffsetShape(offset-thk, 0.0)
#Part.show(offsetface)
offsetfacelist.append(offsetface)
for face in offsetfacelist :
offsetsolid = face.makeOffsetShape(thk, 0.0, fill = True)
#Part.show(offsetsolid)
offsetsolidlist.append(offsetsolid)
if len(offsetsolidlist) > 1 :
offsetsolid = offsetsolidlist[0].multiFuse(offsetsolidlist[1:])
else :
offsetsolid = offsetsolidlist[0]
cutsolid1 = BOPTools.JoinAPI.cutout_legacy(solid0, offsetsolid, 0.0)
cutsolid2 = BOPTools.JoinAPI.cutout_legacy(solid1, offsetsolid, 0.0)
solidlist = [cutsolid1, cutsolid2, offsetsolid]
resultsolid = BOPTools.JoinAPI.connect(solidlist)
return resultsolid
base = Gui.Selection.getSelectionEx()[0].Object
face = Gui.Selection.getSelectionEx()[0].SubElementNames
sketch = Gui.Selection.getSelectionEx()[1].Object
a = smFold(bendR = 5, bendA = 45.0, kfactor = 0.4, bendlinesketch = sketch, selFaceNames = face, MainObject = base)
Part.show(a)
Das wäre kein Problem, man könnte die Biegelinie um 2,5mm verschieben, aber sobald die Biegung in die Bohrung läuft funktioniert das Makro nicht mehr.
Re: SheetMetal Biegung mit nichtparallelen Seiten
Auch wenn es für Dich aus anderen Gründen nicht nutzbar ist, würde mich interessieren auf welche Constraints die Ellipsenbögen nicht reagieren.
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
-
- Veteran
- Posts: 7788
- Joined: Tue Jan 07, 2014 11:10 am
- Contact:
Re: SheetMetal Biegung mit nichtparallelen Seiten
Re: SheetMetal Biegung mit nichtparallelen Seiten
Irgendwas scheint da regelmäßig beim Einstieg schief zu laufen. Ich halte Sketcher für das einfachere, weil besser zu kontrollierende Tool.
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
-
- Veteran
- Posts: 7788
- Joined: Tue Jan 07, 2014 11:10 am
- Contact:
Re: SheetMetal Biegung mit nichtparallelen Seiten
Hab ich schon mal geschrieb. Aus irgend einem Grund verirren sich neue User in der Draft-Workbench und versuchen darin zu zeichnen. Man müsste aus Sicht eines Neuanfängers suchen an welcher Stelle sich diese Fehlleitung befindet.
-
- Veteran
- Posts: 7788
- Joined: Tue Jan 07, 2014 11:10 am
- Contact:
Re: SheetMetal Biegung mit nichtparallelen Seiten
freecad-heini-1 wrote: ↑Mon Feb 25, 2019 2:13 pmHab ich schon mal geschrieb. Aus irgend einem Grund verirren sich neue User in der Draft-Workbench und versuchen darin zu zeichnen. Man müsste aus Sicht eines Neuanfängers suchen an welcher Stelle sich diese Fehlleitung befindet.
Das_Sams wrote: Wie bist Du darauf gekommen in der Draft-Workbench zu zeichnen, anstelle in der Sketcher Workbench?
Welche Dokumentation hat Dich fehlgeleitet? Leider bist Du nicht alleine. Ich beobachte immer wieder, dass sich neue User in der Draft-Workbench verirren. Irgendwie muss es uns gelingen das zu verhindern.
Re: SheetMetal Biegung mit nichtparallelen Seiten
Hallo zusammen,
es hat mir keine Ruhe gelassen, dieses schöne Script
händischer zu machen.
Eine grafische Eingabemöglichkeit der Biegeparameter über
eine Maske ist mir bisher noch nicht gelungen (mangelnde Erfahrung
in Python).
Damit das Makro aber für beliebige Biegeradien, Biegewinkel und
wählbare K-Faktoren genutzt werden kann, habe ich die Eingabe der Werte
über die Pyton-Konsole möglich gemacht.
Die Parameter werden über das Ausgabefenster abgefragt und angezeigt.
Mit Gruß
Werner
es hat mir keine Ruhe gelassen, dieses schöne Script
händischer zu machen.
Eine grafische Eingabemöglichkeit der Biegeparameter über
eine Maske ist mir bisher noch nicht gelungen (mangelnde Erfahrung
in Python).
Damit das Makro aber für beliebige Biegeradien, Biegewinkel und
wählbare K-Faktoren genutzt werden kann, habe ich die Eingabe der Werte
über die Pyton-Konsole möglich gemacht.
Die Parameter werden über das Ausgabefenster abgefragt und angezeigt.
Code: Select all
#
##################################
#
# Herkunft: by jaisejames
# Sun Feb 24, 2019 2:51 pm
# pls see new Fold Along line code
#
##################################
#
import Part
import BOPTools.SplitFeatures, BOPTools.JoinFeatures
def smthk(obj, foldface) :
normal = foldface.normalAt(0,0)
theVol = obj.Volume
if theVol < 0.0001:
SMError("Shape is not a real 3D-object or to small for a metal-sheet!")
else:
# Make a first estimate of the thickness
estimated_thk = theVol/(obj.Area / 2.0)
p1 = foldface.CenterOfMass
p2 = foldface.CenterOfMass + estimated_thk * -1.3 * normal
e1 = Part.makeLine(p1, p2)
thkedge = obj.common(e1)
thk = thkedge.Length
return thk
####### Eingabewerte ##################
#
# Die Eingabewerte werden im Ausgabefenster
# abgefragt und ausgegeben.
# Die Eingabe selbst erfolgt haendisch in
# der Python-Konsole.
#
# Eine graphische Eingabe ueber eine Maske
# waere eleganter.
#
Biegeradius = float(raw_input("Biegeradius = "))
print Biegeradius
Biegewinkel = float(raw_input("Biegewinkel = "))
print Biegewinkel
KFaktor = float(raw_input("der K-Faktor betraegt: "))
print KFaktor
#
# Ab jetzt folgt wieder die originale Programmanweisung.
#
def smFold(bendR = Biegeradius, bendA = Biegewinkel, kfactor = KFaktor, invertbend = False, flipped = False, unfold = False,
bendlinesketch = None, selFaceNames = '', MainObject = None):
FoldShape = MainObject.Shape
foldface = FoldShape.getElement(selFaceNames[0])
normal = foldface.normalAt(0,0)
thk = smthk(FoldShape, foldface)
offset = thk / 2.0 * kfactor
tool = bendlinesketch.Shape
tool_faces = tool.extrude(normal * -thk)
#Part.show(tool_faces)
cutSolid = BOPTools.SplitAPI.slice(FoldShape, tool_faces.Faces, "Standard", 0.0)
cutface = BOPTools.SplitAPI.slice(foldface, tool.Edges, "Standard", 0.0)
sketch = tool.copy()
sketch.translate(normal * -offset)
cutface.translate(normal * -offset)
Axis = FoldShape.common(sketch)
#Part.show(Axis)
edge = Axis.Edges[0]
revAxisP = edge.valueAt(edge.FirstParameter)
revAxisV = edge.valueAt(edge.LastParameter) - edge.valueAt(edge.FirstParameter)
revAxisV.normalize()
face0 = cutface.childShapes()[0]
face1 = cutface.childShapes()[1]
face1.rotate(revAxisP, revAxisV, bendA)
#Part.show(face1)
facecommon = face1.common(tool)
#Part.show(facecommon)
if not(facecommon.Edges) :
revAxisV = revAxisV * -1
face1 = cutface.childShapes()[1]
face1.rotate(revAxisP, revAxisV, bendA)
solid0 = cutSolid.childShapes()[0]
solid1 = cutSolid.childShapes()[1]
solid1.rotate(revAxisP, revAxisV, bendA)
#Part.show(solid0)
#Part.show(solid1)
facelist = [face0, face1]
joinface = BOPTools.JoinAPI.connect(facelist)
filletedface = joinface.makeFillet(bendR + offset, joinface.Edges)
#Part.show(filletedface)
offsetfacelist = []
offsetsolidlist = []
for face in filletedface.Faces :
if str(face.Surface) != "<Plane object>" :
offsetface = face.makeOffsetShape(offset-thk, 0.0)
#Part.show(offsetface)
offsetfacelist.append(offsetface)
for face in offsetfacelist :
offsetsolid = face.makeOffsetShape(thk, 0.0, fill = True)
#Part.show(offsetsolid)
offsetsolidlist.append(offsetsolid)
if len(offsetsolidlist) > 1 :
offsetsolid = offsetsolidlist[0].multiFuse(offsetsolidlist[1:])
else :
offsetsolid = offsetsolidlist[0]
cutsolid1 = BOPTools.JoinAPI.cutout_legacy(solid0, offsetsolid, 0.0)
cutsolid2 = BOPTools.JoinAPI.cutout_legacy(solid1, offsetsolid, 0.0)
solidlist = [cutsolid1, cutsolid2, offsetsolid]
resultsolid = BOPTools.JoinAPI.connect(solidlist)
return resultsolid
base = Gui.Selection.getSelectionEx()[0].Object
face = Gui.Selection.getSelectionEx()[0].SubElementNames
sketch = Gui.Selection.getSelectionEx()[1].Object
a = smFold(bendR = Biegeradius, bendA = Biegewinkel, kfactor = KFaktor, bendlinesketch = sketch, selFaceNames = face, MainObject = base)
Part.show(a)
Werner