Teileliste (Stückliste, Sägeliste) per Makro

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

WICHTIG: Bitte zuerst lesen, bevor Sie posten
erdolg
Posts: 4
Joined: Fri Jul 06, 2012 1:58 pm

Teileliste (Stückliste, Sägeliste) per Makro

Post by erdolg »

Vielleicht hilft es dem einen oder der anderen, etwas schneller zum Ziel zu kommen, wenn man beispielsweise eine Holzkonstruktion modelliert hat und sich die Liste der benötigten Zuschnitte bequem und übersichtlich ausgeben lassen möchte:

* "Werkzeuge/Makros/erstellen"
* einen Ordner auswählen, auf den man mit seinen Benutzerrechten schreiben darf (zumindest die Linux-Version hat standardmäßig einen systemweiten Pfad voreingestellt, auf dem das nicht der Fall ist)
* einen Dateiname (z.B. "Teileliste") vergeben
* folgenden Codeschnipsel in das Makrofenster einfügen:

Code: Select all

# -*- coding: UTF-8-*-
import FreeCAD, Sketcher, PartDesign
a = App.ActiveDocument
print 'Stückliste zu ',a.Name+':'
for o in a.findObjects():
  try:
    print o.Label.rjust(25)+': B= '+str(o.Width).rjust(7)+' mm H='+str(o.Height).rjust(7)+' mm T='+str(o.Length).rjust(7)+' mm'
Das Ergebnis ist dann beispielsweise:

Code: Select all

Stückliste zu Schrank_013:
             Wange rechts: B=    20.0 mm H=  490.0 mm T=  494.0 mm
              Wange links: B=    20.0 mm H=  490.0 mm T=  514.0 mm
              Bodenplatte: B=  1566.0 mm H=   20.0 mm T=  514.0 mm
               Deckplatte: B=  1566.0 mm H=   20.0 mm T=  514.0 mm
                 Rückwand: B=  1526.0 mm H=  430.0 mm T=   20.0 mm
             Zwischenwand: B=    20.0 mm H=  490.0 mm T=  474.0 mm
                Tür links: B=   460.0 mm H=  486.0 mm T=   20.0 mm
               Tür rechts: B=   460.0 mm H=  486.0 mm T=   20.0 mm
    Schubladenfront unten: B=   623.0 mm H=  148.0 mm T=   20.0 mm
     Schubladenfront oben: B=   623.0 mm H=  186.0 mm T=   20.0 mm
    Schubladenfront Mitte: B=   623.0 mm H=  148.0 mm T=   20.0 mm
User avatar
shoogen
Veteran
Posts: 2823
Joined: Thu Dec 01, 2011 5:24 pm

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by shoogen »

Gute Idee!
Bei aufwendigeren Konstruktionen könnte es aber Probleme geben sobald die Objekte keine Quader mehr sind und damit nicht nicht Length, Width und Height haben.
Ich würde dann eher die Bounding Boxen der Shapes benutzen.

Code: Select all

print o.Label.rjust(25)+': B= '+str(o.Shape.BoundBox.XLength).rjust(7)+' mm H='+str(o.Shape.BoundBox.YLength).rjust(7)+' mm T='+str(o.Shape.BoundBox.ZLength).rjust(7)+' mm'
erdolg
Posts: 4
Joined: Fri Jul 06, 2012 1:58 pm

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by erdolg »

Ebenfalls ein guter Hinweis! Allerdings glaube ich schon, daß nur bei tatsächlich quaderförmigen Objekten (in diesem Fall: Zuschnitte aus Leimholzplatten) die Angabe von Breite, Höhe und Tiefe einen Sinn macht. Spaßeshalber habe ich den Schrank einmal mit zwei zylinderförmigen Streben ausgestattet, für die man dann ja lieber den Durchmesser und Länge als Stückliste hätte. Das geänderte Makro dazu wäre dann

Code: Select all

# -*- coding: UTF-8-*-
import FreeCAD
import Sketcher
import PartDesign
a = App.ActiveDocument
# g = Gui.ActiveDocument
print 'Stückliste zu ',a.Name+':'
print 'Quader:'
for o in a.findObjects():
  try:
    print o.Label.rjust(25)+': B= '+str(o.Width).rjust(7)+' mm H='+str(o.Height).rjust(7)+' mm T='+str(o.Length).rjust(7)+' mm'
  except:

    pass
print 'Zylinder:'
for o in a.findObjects():
  try:
    print o.Label.rjust(25)+': B= '+str(o.Radius).rjust(7)+' mm H='+str(o.Height).rjust(7)+' mm '
  except:
    pass

Es funktionert tatsächlich auch und liefert zu jeder Objektart (Zylinder, Quader) dank der Try-Anweisung lediglich die passenden Objekte, der Rest der Liste wird jeweils schweigend übergangen:

Code: Select all

 Stückliste zu Schrank_014:
Quader:
             Wange rechts: B=    20.0 mm H=  490.0 mm T=  494.0 mm
              Wange links: B=    20.0 mm H=  490.0 mm T=  514.0 mm
              Bodenplatte: B=  1566.0 mm H=   20.0 mm T=  514.0 mm
               Deckplatte: B=  1566.0 mm H=   20.0 mm T=  514.0 mm
             Zwischenwand: B=    20.0 mm H=  490.0 mm T=  474.0 mm
Zylinder:
                Zylinder1: B=    50.0 mm H=  490.0 mm 
                Zylinder2: B=    25.0 mm H=  490.0 mm  
Natürlich wäre es jetzt noch eleganter, nicht nur die komplette Stückliste nach Objektarten zu gruppieren, sondern auch automatisch die relevanten Attribute auszugeben... Das wäre dann schon annähernd eine Stücklisten-Funktionalität, wie man sie sich fest im Programm implenentiert vorstellen würde.
mettym
Posts: 10
Joined: Fri May 08, 2015 10:22 am

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by mettym »

Hallo zusammen!
Tut mir leid für die vielleicht etwas dumme Frage:
Ich habe ein Makro in FreeCAD erstellt, den Code dieser Skripte eingefügt und ausgeführt. Jedoch ist bei mir nichts passiert.
Nur in der Konsole erscheint: "Gui.SendMsgToActiveView("Run")"
Makros, FreeCAD und Python sind für mich etwas neu. Was habe ich vergessen oder nicht gemacht?
Danke für eure Hilfe!
schuellerf
Posts: 5
Joined: Fri Mar 18, 2016 8:53 pm

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by schuellerf »

@mettym Ich bin auch gerade daran gescheitert. Bei mir war das Problem, dass die Ausgabe in der "Report view" ist und die muss man extra einschalten:

siehe: "For those who see no information is displayed."
http://www.freecadweb.org/wiki/index.ph ... _displayed.
schuellerf
Posts: 5
Joined: Fri Mar 18, 2016 8:53 pm

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by schuellerf »

Hi!
Der code oben läuft auf meinem FreeCad leider nicht mehr und ich habe hier einmal versucht das ganze in ein Spreadsheet zu füllen

Code: Select all

# -*- coding: UTF-8-*-
import FreeCAD

a = App.ActiveDocument
#a = App.getDocument("test")

sheet = a.addObject('Spreadsheet::Sheet','Spreadsheet')

#just to exclude from List
sheet.ViewObject.Visibility=False

sheet.Label="Part List"
sheet.set("A1", "Type")
sheet.set("B1", "Name")
sheet.set("C1", "Height (mm)")
sheet.set("D1", "Width/Radius (mm)")
sheet.set("E1", "Length (mm)")
sheet.set("F1", "Notes")

cur_row=2

for o in a.findObjects():
  if not o.ViewObject.Visibility: continue
  if (o.TypeId == "Part::Box"):
    sheet.set("A"+str(cur_row), str(o.TypeId))
    sheet.set("B"+str(cur_row), str(o.Label.encode("utf-8")))
    sheet.set("C"+str(cur_row), str(o.Height.Value))
    sheet.set("D"+str(cur_row), str(o.Width.Value))
    sheet.set("E"+str(cur_row), str(o.Length.Value))
  elif (o.TypeId == "Part::Cylinder"):
    sheet.set("A"+str(cur_row), str(o.TypeId))
    sheet.set("B"+str(cur_row), str(o.Label.encode("utf-8")))
    sheet.set("C"+str(cur_row), str(o.Height.Value))
    sheet.set("D"+str(cur_row), str(o.Radius.Value))
    sheet.set("E"+str(cur_row), "----")
  else:
    sheet.set("A"+str(cur_row), str(o.TypeId))
    sheet.set("B"+str(cur_row), o.Label.encode("utf-8"))
    sheet.set("C"+str(cur_row), str(o.Shape.BoundBox.ZLength))
    sheet.set("D"+str(cur_row), str(o.Shape.BoundBox.YLength))
    sheet.set("E"+str(cur_row), str(o.Shape.BoundBox.XLength))
    sheet.set("F"+str(cur_row), "<-- Bounding Box Values!")
  cur_row+=1

#Spreadsheet is not redrawn automatically...
a.recompute()
-----
OS: Ubuntu 16.04.1 LTS
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.16.6707 (Git)
Build type: None
Branch: releases/FreeCAD-0-16
Hash: 5465bc47c95db45e0be85dc0e2872419efadce0f
Python version: 2.7.12
Qt version: 4.8.7
Coin version: 4.0.0a
OCC version: 6.8.0.oce-0.17
chrisb
Veteran
Posts: 54213
Joined: Tue Mar 17, 2015 9:14 am

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by chrisb »

Hallo Schuellerf,
Du hast schon gesehen, dass dieses Thema von 2012 ist und zuletzt vor 1 1/2 Jahren bearbeitet wurde?
schuellerf wrote:Der code oben läuft auf meinem FreeCad leider nicht mehr und ich habe hier einmal versucht das ganze in ein Spreadsheet zu füllen
Die Aussage gibt nicht so recht was her, was geht denn bei Dir nicht? Bei mir funktioniert es, wenn ich ich wie beschrieben nur Teile mit Width, Height und Length habe. Ansonsten: was Shoogen sagt.
Gruß Chris
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
schuellerf
Posts: 5
Joined: Fri Mar 18, 2016 8:53 pm

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by schuellerf »

Hi chrisb!
Stimmt das hatte ich gemeint einiges geht nur mit Bounding box und die Ausgabe liefert bei mir zweimal "mm"
also z.B. "H= 10.0 mm mm"
Sorry "laufen" tut's schon...
chrisb
Veteran
Posts: 54213
Joined: Tue Mar 17, 2015 9:14 am

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by chrisb »

schuellerf wrote:Hi chrisb!
Stimmt das hatte ich gemeint einiges geht nur mit Bounding box und die Ausgabe liefert bei mir zweimal "mm"
also z.B. "H= 10.0 mm mm"
Das liegt daran, dass die Einheit inzwischen sozusagen zum Maß dazugehört. Dadurch können Modelle besser zwischen unterschiedlich konfigurierten Systemen ausgetauscht werden.
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
HolgerL
Posts: 4
Joined: Thu Nov 28, 2019 3:30 pm

Re: Teileliste (Stückliste, Sägeliste) per Makro

Post by HolgerL »

Hi,

ich bin neu hier bei Freecad und habe mir aus Parts eine Möbelkonstruktion erstellt.
Davon möchte ich nun gerne eine Teileliste erstellen mit den Maßen, um dann in Excel den Holzbedarf auszurechnen.
Den code von schuellerf habe ich probiert, läuft aber nicht:

Code: Select all

  File "C:/Users/Acer/AppData/Roaming/FreeCAD/Macro/testBOM.FCMacro", line 38, in <module>
    sheet.set("B"+str(cur_row), o.Label.encode("utf-8"))
<class 'TypeError'>: set() argument 2 must be str, not bytes
Leider habe ich keinen Plan von der Macroprogrammierung :-(

Aber ich werde ja wohl nicht der erste sein, der so eine Stückliste erstellen will ???

Gibt es vielleicht schon ein fertiges Macro dafür?

Vielen Dank für eure Hilfe,
Holger
Post Reply