Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

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

WICHTIG: Bitte zuerst lesen, bevor Sie posten
Post Reply
User avatar
roerich_64
Veteran
Posts: 1465
Joined: Thu May 21, 2015 7:00 pm
Location: Ostfriesland

Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by roerich_64 »

Moin zusammen,

würde gerne in dem 'Tutorial to prepare a part to generate gcode' https://forum.freecadweb.org/viewtopic. ... 16#p309987

das 'Boxcreator-Macro' mit hinein nehmen. Leider funktioniert das Macro bei mir nicht mehr nach einem Update...
Bevor ich jetzt den Kollegen anschreibe, würde ich jetzt gerne zwecks lernen mich mit eurer Hilfe in den Boxcreaor-Macro einwühlen. Denn deren 'Einfachheit' scheint prädestiniert dafür zu sein.

Ich habe mir diese beiden Files
BoxC_I.jpg
BoxC_I.jpg (58.96 KiB) Viewed 997 times
von https://github.com/chbergmann/boxcreator gezogen

und unter C:\Users\User\AppData\Roaming\FreeCAD\Macro

abgelegt.

Wenn ich die GUI-Datei dann ausführen lasse, poppt diese auch sauber auf und ich kann die Eingaben machen, die ich möchte.
Allerdings wenn ich dann auf 'Create_Box' klicke, kommt die Fehlermeldung:

Code: Select all

 File "C:/Users/User/AppData/Roaming/FreeCAD/Macro/boxcreatorGUI.py", line 190, in createBox
    box = boxcreator.create_box(materialWidth, boxWidth, boxHeight, boxLength, notchWidth, drawSides, overhangTop, overhangBottom)
AttributeError: module 'boxcreator' has no attribute 'create_box'
Was könnte da faul sein...?

Erste Recherchen ergaben.das die Datei '__init__.py' und dort 'from SimplePackage import boxcreator' fehlen würde...
Jedoch kommt die selbe Fehlermeldung...

VG
Walter
Die Liebe wird siegen, denn sie ist unzerstörbar :) ;)
User avatar
looo
Veteran
Posts: 3941
Joined: Mon Nov 11, 2013 5:29 pm

Re: Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by looo »

In python3 haben sich die imports ein bisschen verändert und sind jetzt etwas mehr konsistent (wie ich finde). In python2 war es so, dass man stets module (das sind die Dateien die hinten ein .py stehen haben) im selben ordner direkt importieren konnte (was in boxcreaterGui.py durch "import boxcreater" erfolgt). Da du jetzt eine Version von FreeCAD hast die mit python3 läuft (vermute ich zumindest) wird nicht mehr die Datei im selben Ordner eingeladen. Aber anstatt, dass da jetzt eine Fehlermeldung (ImportError ...) erscheint (was ja zu erwarten wäre) wird jetzt (höchstwahrscheinlich) der Ordner der den selben Namen (ohne .py) hat eingeladen. Dies würde in python2 nicht funktionieren weil keine __init__.py vorhanden ist. In python3 ist die __init__.py nicht mehr zwingend notwendig (vermutlich wegen der namespace-packages aber so sicher bin ich mir da nicht)

Also da kommen glaub ich 2 dinge zusammen die nicht einmal jemand der sich schon länger mit python beschäftigt richtig versteht.

Wie man es löst:
Meiner Meinung nach ist es am Sinnvollsten ein richtiges python Packet ( Packet = ordner + __init__.py) aus dem ganzen zu machen. Das heißt (wie du schon richtig erkannt hast) eine __init__.py Datei hinzufügen. Wenn du das gemacht hast, hast du die Option zwischen relativen imports bzw. absoluten imports [1].

relative imports
zB. in boxcreatorGUI.py anstelle von import boxcreator ->
from . import boxcreator

was natürlich auch geht:
from . import boxcreator as box
und dann
box.create_box(...)

absolute imports:
zB. in boxcreatorGUI.py anstelle von import boxcreator ->
from boxcreator import boxcreator

oder
from boxcreator import boxcreator as box
und dann
box.create_box(...)

oder
import boxcreator.boxcreator
und dann
boxcreator.boxcreator.create_box(..)

Bin gespannt für was du dich entscheidest und ob es dann wirklich funktioniert :D . Ich hoffe das war jetzt im Sinne der Anfrage. Für mich hat das so geklungen als würdest du Python lernen wollen. Also wollte ich es dir nicht zu leicht machen, da ist der Lernerfolg dann höher (sofern man auf eine Lösung kommt) :D Und wenn du das mit den imports verstehst, weißt du schon einmal mehr als die Hälfte der Leute die angeben Python zu verstehen.

[1] https://docs.python.org/3/reference/import.html
User avatar
roerich_64
Veteran
Posts: 1465
Joined: Thu May 21, 2015 7:00 pm
Location: Ostfriesland

Re: Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by roerich_64 »

Vielen vielen Dank @looo, genau so wollte ich es!

Ein bisschen den kleinen Anstoß in die richtige Richtung. Und dann selber schwitzend zum Ziel kommen ;-)

Jetzt muß ich mich erst mal einarbeiten... Bin auch gespannt was dabei rumkommt ;-)

VG
Walter
Die Liebe wird siegen, denn sie ist unzerstörbar :) ;)
User avatar
roerich_64
Veteran
Posts: 1465
Joined: Thu May 21, 2015 7:00 pm
Location: Ostfriesland

Re: Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by roerich_64 »

Moin,

Da ich Anfänger bin (jedoch früher 'Turbo Pascal' programmiert), habe ich mich erst mal für die absolute Variante entschieden und zwar unter Py3 ohne __init__.py

Die __init__.py würde es ja grundsätzlich leichter machen eine boxcrator-Version zu erstellen für py2 und py3.
Allerdings erscheint diese in dem Macro-Auswahlfenster von FreeCAD, was ich im ersten Moment dort als unschön / unelegant empfinde ;-)
Auch könnte es sein wenn ich einmal unachtsam andere Macros installiere, das diese überschrieben wird von anderen Macros, die die gleiche Technik verwenden...

Die absolute Variante habe ich gewählt weil so ausgeschlossen werden kann, das durch irgendwelche zusätzlichen Einstellungen der Bezug flöten geht ;-)

Das FreeCAD einen eigenen Umgang mit Macros Namens FCMacro verfolgt, habe ich gesehen. Damit möchte ich mich später auseinander setzen.

Also ist jetzt der Stand:
In boxcreatorGUI.py: from boxcreator import boxcreator -> box = boxcreator.create_box()
So scheint jetzt der Bezug hergestellt zu sein.

Allerdings geht das 'Gemecker' weiter:

Code: Select all

[0.0, 0.0, 0.0, 0.0]
Traceback (most recent call last):
  File "C:/Users/User/AppData/Roaming/FreeCAD/Macro/boxcreatorGUI.py", line 190, in createBox
    box = boxcreator.create_box(materialWidth, boxWidth, boxHeight, boxLength, notchWidth, drawSides, overhangTop, overhangBottom)
  File "C:/Users/User/AppData/Roaming/FreeCAD/Macro\boxcreator\boxcreator.py", line 16, in create_box
    side1 = draw_bottom("bottom", materialWidth, boxWidth, boxLength, notchWidth, drawSides, overhangBottom)
  File "C:/Users/User/AppData/Roaming/FreeCAD/Macro\boxcreator\boxcreator.py", line 128, in draw_bottom
    side1 = extrudeLines(partname, lines, materialWidth)
  File "C:/Users/User/AppData/Roaming/FreeCAD/Macro\boxcreator\boxcreator.py", line 189, in extrudeLines
    j.Proxy.execute(j)
  File "C:\Program Files\FreeCAD_0.19.16808_x64_LP_12.1.2_PY3QT5-WinVS2015\Mod\Part\BOPTools\JoinFeatures.py", line 130, in execute
    rst = JoinAPI.connect([obj.Shape for obj in selfobj.Objects], selfobj.Tolerance)
  File "C:\Program Files\FreeCAD_0.19.16808_x64_LP_12.1.2_PY3QT5-WinVS2015\Mod\Part\BOPTools\JoinAPI.py", line 68, in connect
    new_list_of_shapes.extend( compoundLeaves(sh) )
  File "C:\Program Files\FreeCAD_0.19.16808_x64_LP_12.1.2_PY3QT5-WinVS2015\Mod\Part\BOPTools\Utils.py", line 74, in compoundLeaves
    if shape_or_compound.ShapeType == "Compound":
Base.FreeCADError: cannot determine type of null shape
Traceback (most recent call last):
  File "C:\Program Files\FreeCAD_0.19.16808_x64_LP_12.1.2_PY3QT5-WinVS2015\Mod\Part\BOPTools\JoinFeatures.py", line 130, in execute
    rst = JoinAPI.connect([obj.Shape for obj in selfobj.Objects], selfobj.Tolerance)
  File "C:\Program Files\FreeCAD_0.19.16808_x64_LP_12.1.2_PY3QT5-WinVS2015\Mod\Part\BOPTools\JoinAPI.py", line 97, in connect
    largest = shapeOfMaxSize(danglers)
  File "C:\Program Files\FreeCAD_0.19.16808_x64_LP_12.1.2_PY3QT5-WinVS2015\Mod\Part\BOPTools\JoinAPI.py", line 55, in shapeOfMaxSize
    raise ValueError("There is more than one largest piece!")
<class 'ValueError'>: There is more than one largest piece!
Der Hinweis in der ersten Zeile [0.0, 0.0, 0.0, 0.0] ist wohl der 'markanteste' im Moment...
So wie ich das interpretiere kommen die nachfolgenden Meldungen daraus, das Variablen-Werte nicht weiter gegeben werden...

Was mir auch noch fehlt, wie boxcreator die Verbindung mit FreeCAD herstellt um die Linien und die Teile der Box zu generieren...

VG
Walter
Die Liebe wird siegen, denn sie ist unzerstörbar :) ;)
Manja
Posts: 57
Joined: Tue Apr 03, 2018 6:35 am

Re: Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by Manja »

Hallo Walter,
die Fehler entstehen anscheinend in den BOPTools JoinAPI.py,JoinFeatures.py usw...
und zwar ausgehend von extrudeLines () in boxcreator.py



Ich bin kein Python - Experte , also eher totaler Anfänger.
Was mich interessiert, wie man FreeCAD- Macros optimal debuggen kann, im Menü unter Macro kann man Breakpoints setzen, aber step-weises debuggen mit F10 ist beispielsweise ausgegraut, würde mich schon interessieren, wie die Experten hier vorgehen.

MfG. Berthold
with kind regards, Berthold

Linux SuSE leap 15.5 , 64Bit
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by wmayer »

Was mich interessiert, wie man FreeCAD- Macros optimal debuggen kann, im Menü unter Macro kann man Breakpoints setzen, aber step-weises debuggen mit F10 ist beispielsweise ausgegraut, würde mich schon interessieren, wie die Experten hier vorgehen.
Zurzeit noch mit einem externen Debugger oder IDE.
User avatar
roerich_64
Veteran
Posts: 1465
Joined: Thu May 21, 2015 7:00 pm
Location: Ostfriesland

Re: Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by roerich_64 »

Hallo Berthold,

Mit den FeeCAD-Macro's (Endung FCMacro) habe ich mich ja noch nicht beschäftigt...
vielleicht könntest du mit dem Thema einen extra Thread aufmachen ;-)

Das boxcreator Macro ist ja desshalb für mich so interessant, weil es ja grundsätzlich sehr eigenständig ist und nur ein paar Routinen von FreeCAD / Draft aufruft und damit die entsprechenden Container (BOX) und Wires bildet und damit eigentlich sehr übersichtlich ist... ;-)

Zu lesen ist der boxcreator für mich im Moment noch wie 'Spagetti Code' ... Bin es von Turbo-Pascal strukturierter gewohnt...
Aber irgendwie werde ich mich dort einwurschteln ;-)

Boxcreator editiere ich im Moment mit Notepad++, also ohne spezieller Oberfläche... aber da wird sich sicher auch noch was finden lassen, damit man schön einfach Debuggen kann und sich Inhalte von Variablen anschauen kann... Muss mal suchen...
Die Liebe wird siegen, denn sie ist unzerstörbar :) ;)
User avatar
roerich_64
Veteran
Posts: 1465
Joined: Thu May 21, 2015 7:00 pm
Location: Ostfriesland

Re: Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by roerich_64 »

Manja wrote: Sat May 25, 2019 11:38 am
die Fehler entstehen anscheinend in den BOPTools JoinAPI.py,JoinFeatures.py usw...
und zwar ausgehend von extrudeLines () in boxcreator.py
Ich denke der Fehler tritt noch eher auf. In meinen Augen werden Daten nicht sauber von boxcreator an FreeCAD übergeben und somit meckern dort die Routinen ;-)

Edit: Danke @wmayer für die Info :-)
Die Liebe wird siegen, denn sie ist unzerstörbar :) ;)
User avatar
looo
Veteran
Posts: 3941
Joined: Mon Nov 11, 2013 5:29 pm

Re: Mein LieblingsMacro 'Boxcreator' funktioniert nicht mehr :-(

Post by looo »

noch was zu den Imports:

Der Pfad der zu sys.path hinzugefügt wird ist abhängig von dem Ordner der bei dem Macro-GUI gerade aktuell geöffnet ist. Das heißt wenn man den Ordner "boxcreator" bei den Macros öffnet und dann FreeCAD neustartet, sollte das Macro mit seinen ursprünglichen Imports funktionieren.
Post Reply