SheetMetal Biegung mit nichtparallelen Seiten

In diesem Forum Fragen und Diskussionen in Deutsch
Forum rules
Foren-Regeln und hilfreiche Informationen

WICHTIG: Bitte zuerst lesen, bevor Sie posten
reox
Posts: 929
Joined: Sat Aug 13, 2016 10:06 am
Contact:

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by reox »

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.
reox
Posts: 929
Joined: Sat Aug 13, 2016 10:06 am
Contact:

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by reox »

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.
Das_Sams
Posts: 17
Joined: Thu Feb 14, 2019 1:34 pm

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by Das_Sams »

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.
Attachments
gefrickel-mit-nurbs.fcstd
(107.04 KiB) Downloaded 34 times
freecad-heini-1
Veteran
Posts: 7788
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by freecad-heini-1 »

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.
Schon gesehen?
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)
In Creo startete die Biegung erst ab der Biegelinie, mit diesem Makro liegt die Biegelinie mitte Radius.
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.
Blech_Biegen_D5_45_R5.png
Blech_Biegen_D5_45_R5.png (44.53 KiB) Viewed 1121 times
Forumfrage_Sheetmetal2_FH-1.FCStd
(29.69 KiB) Downloaded 40 times
chrisb
Veteran
Posts: 53933
Joined: Tue Mar 17, 2015 9:14 am

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by chrisb »

Das_Sams wrote: Sun Feb 24, 2019 12:00 am Dabei ist mir noch aufgefallen, daß die Ellipsen- und Ellipsenbogenfunktionen sowohl im Draft als auch im Sketch nicht wirklich zu gebrauchen sind.
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.
freecad-heini-1
Veteran
Posts: 7788
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by freecad-heini-1 »

chrisb wrote: Sun Feb 24, 2019 6:58 pm
Das_Sams wrote: Sun Feb 24, 2019 12:00 am Dabei ist mir noch aufgefallen, daß die Ellipsen- und Ellipsenbogenfunktionen sowohl im Draft als auch im Sketch nicht wirklich zu gebrauchen sind.
Auch wenn es für Dich aus anderen Gründen nicht nutzbar ist, würde mich interessieren auf welce Constraints die Ellipsenbögen nicht reagieren.
Er hat mit Draft herum gedaddelt, anstelle der Sketcher Workbench.
chrisb
Veteran
Posts: 53933
Joined: Tue Mar 17, 2015 9:14 am

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by chrisb »

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.
freecad-heini-1
Veteran
Posts: 7788
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by freecad-heini-1 »

chrisb wrote: Mon Feb 25, 2019 2:06 pm Irgendwas scheint da regelmäßig beim Einstieg schief zu laufen. Ich halte Sketcher für das einfachere, weil besser zu kontrollierende Tool.
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.
freecad-heini-1
Veteran
Posts: 7788
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by freecad-heini-1 »

freecad-heini-1 wrote: Mon Feb 25, 2019 2:13 pm
chrisb wrote: Mon Feb 25, 2019 2:06 pm Irgendwas scheint da regelmäßig beim Einstieg schief zu laufen. Ich halte Sketcher für das einfachere, weil besser zu kontrollierende Tool.
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.
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.
wega
Posts: 347
Joined: Mon Nov 11, 2013 3:13 pm

Re: SheetMetal Biegung mit nichtparallelen Seiten

Post by wega »

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.
Ergebnis.jpg
Ergebnis.jpg (7.49 KiB) Viewed 998 times
Python-Konsole.jpg
Python-Konsole.jpg (8.31 KiB) Viewed 998 times
Ausgabefenster.jpg
Ausgabefenster.jpg (8.56 KiB) Viewed 998 times

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)

Mit Gruß
Werner
Post Reply