Beschreibung |
---|
Dies ist eine Lösung für das Problem der topologischen Benennung. Versionsmakro : 1.0 Datum der letzten Änderung : 2022-08-16 Herunterladen : Werkzeugleisten-Symbol Autor: Dprojects |
Autor |
Dprojects |
Herunterladen |
Werkzeugleisten-Symbol |
Links |
Makros Rezepte Wie man Makros installiert Symbolleisten anpassen |
Macro-Version |
1.0 |
Datum der letzten Änderung |
2022-08-16 |
FreeCAD-Version(s) |
None |
Standardverknüpfung |
None |
Siehe auch |
None |
Dies ist eine Lösung für das Problem der topologischen Benennung, Beispielhaft beschrieben auf der Seite: Problem der topologischen Benennung
Wenn ein Objekt an einem anderen Objekt erstellt wird, und zwar ebenfalls mit einer Skizze, ist die Lösung ganz einfach, da Sie zwei Dinge wissen:
Um das Problem der topologischen Benennung zu lösen, kann Folgendes getan werden:
Speichere den Schlüssel vor jeder Operation:
Vor jeder Operation muss nur der Schlüssel gespeichert werden. Für dieses Beispiel, das sich auf der Seite Problem der topologischen Benennung, befindet sich das Objekt auf der XY-Ebene. Daher verwende ich den Z-Achsenwert aus der Mitte des Begrenzungsrahmens der Skizze:
ad = FreeCAD.ActiveDocument p2 = ad.Pad002 s2 = p2.Profile[0] key = round(s2.Shape.BoundBox.Center[2], precision)
Als nächstes werden alle Flächen nach dem gespeicherten Schlüssel durchsucht:
Nach der Größenänderung suche ich alle Flächen nach dem gespeicherten Schlüssel. Denn wenn die Skizze und die Fläche auf derselben Ebene XY lagen, war der Z-Achsenwert für beide gleich. Im Arbeitsbereich PartDesign kann das dritte Pad nicht über das zweite Pad verschoben werden, um einen Abstand zwischen ihnen zu schaffen, da es sich um ein einzelnes Objekt handelt und das nächste Pad mit der Skizze immer die Fläche berührt. An der neuen Fläche ist der Z-Achsenwert immer derselbe wie der gespeicherte Schlüssel. Es wird der Flächenindex zurückgegeben. Es muss nichts weiter getan werden.
def getFaceIndex(iObj, iBB): index = 0 for f in iObj.Shape.Faces: index += 1 bb = round(f.BoundBox.Center[2], precision) if bb == iBB: return index return -1
Abschließende Schritte
Am Ende weise ich die neue Fläche der Skizze zu und berechne sie neu. Ehrlich gesagt war es für mich am schwierigsten, die Fläche der Skizze zuzuweisen. Die Syntax ist für mich einfach umwerfend ;-)
Testdateien wurden ins FreeCAD-Forum hochgeladen: TNP.FCStd.
__Title__="TNP_solution" __Author__ = "Dprojects" __Version__ = "1.0" __Date__ = "2022-08-16" __Comment__ = "" __Web__ = "https://github.com/dprojects/Woodworking" __Wiki__ = "https://wiki.freecad.org/TNP_solution" __Icon__ = "https://wiki.freecad.org/images/e/e4/TNP_solution.png" __IconW__ = "https://wiki.freecad.org/images/e/e4/TNP_solution.png" __Help__ = "solution for Topological Naming Problem" __Status__ = "stable" __Requires__ = "" __Communication__ = "https://wiki.freecad.org/index.php?title=User:Dprojects" # #################################################################### # # This is solution for Topological Naming Problem described at # https://wiki.freecad.org/Topological_naming_problem # # MIT License # # Copyright (c) 2022 Darek L github.com/dprojects # # Permission is hereby granted, free of charge, to any # person obtaining a copy of this software and associated # documentation files (the "Software"), to deal in the # Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, # sublicense, and/or sell copies of the Software, and to permit # persons to whom the Software is furnished to do so, subject # to the following conditions: # # The above copyright notice and this permission notice shall # be included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # # #################################################################### import FreeCAD # this should be set according # FreeCAD user GUI precision settings precision = 5 # global settings ad = FreeCAD.ActiveDocument # middle object to be resized p1 = ad.Pad001 s1 = p1.Profile[0] # top object bottom to store key p2 = ad.Pad002 s2 = p2.Profile[0] # #################################################################### def getFaceIndex(iObj, iBB): index = 0 for f in iObj.Shape.Faces: index += 1 bb = round(f.BoundBox.Center[2], precision) FreeCAD.Console.PrintMessage("\n") FreeCAD.Console.PrintMessage(index) FreeCAD.Console.PrintMessage(" ") FreeCAD.Console.PrintMessage(bb) if bb == iBB: FreeCAD.Console.PrintMessage(" <=== found") return index return -1 # #################################################################### def makeTNP(): # set key key = round(s2.Shape.BoundBox.Center[2], precision) # resize and cause TNP s1.setDatum(9, FreeCAD.Units.Quantity('350')) # recompute s1.recompute() p1.recompute() ad.recompute() FreeCAD.Console.PrintMessage("\n\n") FreeCAD.Console.PrintMessage("Stored key:"+str(key)) FreeCAD.Console.PrintMessage("\n") # search all faces for solution solutionIndex = getFaceIndex(p1, key) solution = "Face"+str(solutionIndex) FreeCAD.Console.PrintMessage("\n\n") FreeCAD.Console.PrintMessage("Solution: "+solution) # set exact face to Sketch s2.Support = (p1, (solution,)) ad.recompute() # #################################################################### def moveBack(): s1.setDatum(9, FreeCAD.Units.Quantity('250')) s2.Support = (p1, ('Face13',)) ad.recompute() # #################################################################### # main # #################################################################### # uncomment what you want makeTNP() #moveBack() # ####################################################################
Der obige Code zeigt, wie das Beispiel aus dem Problem der topologischen Benennung gelöst werden kann, das unter folgender Adresse beschrieben wird: Problem der topologischen Benennung Es können aber genau dieselben Regeln anwendet werden, um andere Probleme zu lösen. Der Ansatz ist einfach:
Die konkrete Umsetzung kann unterschiedlich sein. In diesem Beispiel ist die Ebene XY, aber es kann genau dasselbe auch für andere Achsen getan werden. Außerdem kann eine andere Taste gewählt werden. Beim Woodworking project führe ich viele Operationen an nicht existierenden Objekten durch, sodass ich das topologische Benennungsproblem viele Male lösen musste.
Hier wandle ich Würfelobjekte in PartDesign-Dicke-Objekte um:
Im folgenden Beispiel wandle ich Würfel in PartDesign-Fasen um, daher musste ich Schlüssel für Kanten speichern:
Das folgende Beispiel ist etwas komplizierter, da sich, wie auf dem GUI-Bildschirm zu sehen ist, die Verweise auf das Objekt und die Fläche automatisch ändern. Aber auch um ein Loch zu erstellen, rufe ich eine Funktion auf, die in meiner Bibliothek definiert ist, nicht direkt im Werkzeug. Daher musste ich einen kleinen Trick mit Auswahl und Abwahl anwenden, um den neuen Verweis zu erhalten:
Bei der Programmierung in FreeCAD gibt es viele solcher Probleme, aber sie lassen sich alle auf ähnliche Weise lösen. Ich hoffe, das hilft weiter.