| Beschreibung |
|---|
| Dieses Makro setzt die Platzierung einer Skizze auf eine absolute Position zurück und erstellt schließlich eine Bezugsebene. Dieses Makro wurde hauptsächlich geschrieben, um das Problem der topologischen Benennung zu umgehen, das ein Modell beschädigen kann, wenn eine Skizze direkt oder indirekt an eine Fläche oder ein anderes topologisches Element angehängt wurde.
Um eine Beschädigung zu verhindern, sollte das Makro angewendet werden, solange das Modell noch intakt ist. Es kann ein beschädigtes Modell nicht „reparieren”. Wenn Sie Ihr Modell beschädigt haben, machen Sie die letzten Änderungen rückgängig, bis das Modell wieder intakt ist, wenden Sie das Makro auf die instabilen Skizzen an und wiederholen Sie dann den vorherigen Vorgang. |
| Autor |
| OpenBrain |
| Herunterladen |
| Werkzeugleisten-Symbol |
| Links |
| Makros Rezepte Wie man Makros installiert Symbolleisten anpassen |
| Macro-Version |
| 0.6.2 |
| Datum der letzten Änderung |
| 2019-06-14 |
| FreeCAD-Version(s) |
| 0.17 und höher |
| Standardverknüpfung |
| None |
| Siehe auch |
| None |
Dieses Makro wurde hauptsächlich geschrieben, um das Problem der topologischen Benennung zu umgehen, das ein Modell beschädigen kann, wenn eine Skizze direkt oder indirekt an eine Fläche oder ein anderes topologisches Element angehängt wurde. Um eine Beschädigung zu verhindern, sollte das Makro angewendet werden, solange das Modell noch intakt ist. Es kann ein beschädigtes Modell nicht „reparieren”. Wenn das Modell beschädigt wurde, die letzten Änderungen rückgängig machen, bis das Modell wieder intakt ist, das Makro auf die instabilen Skizzen anwenden und dann den vorherigen Vorgang wiederholen.
Funktional entfernt das Makro die aktuelle Zuordnung der Skizze, auf die es angewendet wird, und wendet dann eine absolute Platzierung darauf an, sodass es immun gegen Änderungen der Zuordnungsunterstützung ist.
Dazu schlägt das Makro grundsätzlich drei Optionen vor (wenn sich die Skizze nicht in einem PartDesign-Körper befindet, ist nur die erste Option verfügbar und wird automatisch angewendet):
Um das Makro zu verwenden, einfach die Zielskizze auswählen (z. B. in der Baumansicht) und dann das Makro ausführen. Das war's schon!
Das Makro ist über Erweiterungsverwalter verfügbar. Der Code wird auf dieser Seite zur Verfügung gestellt, für den Fall, dass das Benutzersystem nicht über git-python verfügt. Obwohl es aktuell sein sollte, ist die neueste Version immer unter FreeCAD-Makro Repositorium verfügbar.
Ausführlichere Erläuterungen findet man unter: Wie man Makros installiert.
Zum besseren Verständnis folgt hier ein Beispiel: Nehmen wir einen einfachen Würfel, dessen obere (gelbe) Fläche entworfen wurde. Ein Zylinder wird mit einem gepolsterten Kreis erstellt, dessen Skizze auf die entworfene Fläche abgebildet (Flache Fläche) und entsprechend den Anforderungen versetzt wurde (Anhangsversatz):
Aus irgendeinem Grund muss nun die Zugrichtung des Entwurfs umgekehrt werden (natürlich ohne dass sich der Zylinder bewegt). Im Grunde genommen geschieht Folgendes:
Die Baumansicht zeigt einen Fehler an, die 3D-Ansicht wird nicht aktualisiert und die Kreisskizze schwebt irgendwo im Nirgendwo ...
Nun kommt die Aufgabe des Makros (das ausgeführt werden muss, bevor die Referenzfläche geändert wird, wenn sich die Skizze noch an der richtigen Stelle befindet). Die Skizze auswählen und sie ausführen. Befindet sich Ihre Skizze in einem Körper, wird man in einem Meldungsfeld aufgefordert, zwischen drei verschiedenen Optionen zu wählen (befindet sich die Skizze außerhalb eines Körpers, wird automatisch die erste Option angewendet):
Was in Bezug auf das Bild Folgendes ergibt:
Macro_SketchUnmap.FCMacro
#!/usr/bin/python
#####################################
# Copyright (c) openBrain 2019
# Licensed under LGPL v2
#
# This FreeCAD macro will unmap a sketch from eg. a face and make its placement absolute in the body. It proposes 3 options (forcely the first if sketch not in a body) :
# * "Raw" mode => the sketch placement is made absolute in the body referential, nothing more
# * "DP@Face mode" => a datum plane is created where the mapping face is, then the sketch is attached to it respecting its attachment offset
# * "DP@Sketch" mode => a datum place is created where the sketch is (including attachment offset), then the sketch is attached to its origin
#
# Main use of the macro is to make design more robust to topological naming issue
#
# Version history :
# *0.6.2 : add icon (metadata)
# *0.6.1 : minor changes after PR review
# *0.6 : some typo improvement + commenting for official PR
# *0.5 : beta release
#
#####################################
__Name__ = 'SketchUnmap'
__Comment__ = 'Unmap a sketch & makes its placement absolute"'
__Author__ = 'openBrain'
__Version__ = '0.6.2'
__Date__ = '2019-06-14'
__License__ = 'LGPL v2'
__Web__ = 'https://wiki.freecad.org/Macro_SketchUnmap'
__Wiki__ = 'https://wiki.freecad.org/Macro_SketchUnmap'
__Icon__ = 'https://wiki.freecad.org/images/3/34/SketchUnmap.svg'
__Help__ = 'Select the sketch to unmap (eg. in the tree view) then run the macro'
__Status__ = 'Beta'
__Requires__ = 'FreeCAD >= 0.17'
__Communication__ = 'https://forum.freecad.org/viewtopic.php?f=22&t=36078'
# __Files__ = ''
__dbg__ = False #True for debugging
from PySide import QtGui
def cslM(msg): #Print message in console
FreeCAD.Console.PrintMessage('\n')
FreeCAD.Console.PrintMessage(msg)
def cslW(msg): #Print warning in console
FreeCAD.Console.PrintMessage('\n')
FreeCAD.Console.PrintWarning(msg)
def cslE(msg): #Print error in console
FreeCAD.Console.PrintMessage('\n')
FreeCAD.Console.PrintError(msg)
def cslD(msg): #Print debug message in console
if __dbg__:
FreeCAD.Console.PrintMessage('\n')
FreeCAD.Console.PrintMessage("Debug : " + str(msg))
_0Vec_ = FreeCAD.Vector(0, 0, 0) #Shortener for null vector
_ZVec_ = FreeCAD.Vector(0, 0, 1) #Shortener for Z axis
if __dbg__: ##Clear report view in debug mode
FreeCADGui.getMainWindow().findChild(QtGui.QTextEdit, "Report view").clear()
cslM("Starting SketchUnmap macro")
cslD("Checking selection")
##If selection is wrong, print error message and exit
if (len(Gui.Selection.getSelection()) != 1 or str(Gui.Selection.getSelection()[0]) != '<Sketcher::SketchObject>'):
cslE("You must select a sketch that you want to unmap (and only one) ... Exiting")
else:
cslD("Selection OK")
App.ActiveDocument.openTransaction("SketchUnmap") #Open transaction for undo management
sk = Gui.Selection.getSelection()[0] #Get target sketch
skNatPl = sk.Placement #Store placement
skNatAO = sk.AttachmentOffset #Store attachment offset
skInBody = False
for obj in sk.InList: ##Check if sketch is inside a Body
if obj.TypeId == 'PartDesign::Body':
skInBody = True
skBody = obj
cslD("Sketch in a body : " + str(skInBody))
msgb = QtGui.QMessageBox() ##Prepare the message box to choose option
msgb.setWindowTitle("Unmap Sketch : Mode selection")
msgb.setText("""Choose which unmapping mode you want to apply :
Raw => the sketch placement is made absolute in the body referential, nothing more
DP@Face => a datum plane is created where the mapping face is, then the sketch is attached to it respecting its attachment offset
DP@Sketch => a datum place is created where the sketch is (including attachment offset), then the sketch is attached to its origin
Click 'Cancel' to cancel operation""")
msgb.setIcon(QtGui.QMessageBox.Question)
rbut = msgb.addButton("Raw", QtGui.QMessageBox.AcceptRole)
fbut = msgb.addButton("DP@Face", QtGui.QMessageBox.AcceptRole)
sbut = msgb.addButton("DP@Sketch", QtGui.QMessageBox.AcceptRole)
cbut = msgb.addButton("Cancel", QtGui.QMessageBox.RejectRole)
if skInBody: #If sketch in a Body
msgb.exec_() ##Show message box and get user choice
msgbRep = msgb.clickedButton()
else:
msgbRep = rbut #Else apply raw mode automatically
if msgbRep == rbut: #If raw mode
sk.Support = None ##Just unmap the sketch so its placement is absolute
sk.MapMode = 'Deactivated'
elif msgbRep == fbut: #If DP@Face mode
newDP = skBody.newObject('PartDesign::Plane','DP' + sk.Name) #Create a datum plane
if sk.Label != sk.Name: ##Eventually clarify its label
newDP.Label = 'DP' + sk.Label
newDP.Support = None ##Plane is placed absolute
newDP.MapMode = 'Deactivated'
newDP.Placement = skNatPl.multiply(skNatAO.inverse()) #Plane placement is set to former face one
sk.Support = [(newDP,'')] #Sketch is mapped to plane keeping its attachment offset
elif msgbRep == sbut: #If DP@Sketch mode
newDP = skBody.newObject('PartDesign::Plane','DP' + sk.Name) #Create a datum plane
if sk.Label != sk.Name: ##Eventually clarify its label
newDP.Label = 'DP' + sk.Label
newDP.Support = None ##Plane is placed absolute
newDP.MapMode = 'Deactivated'
newDP.Placement = skNatPl #Plane placement is set to former sketch one
sk.Support = [(newDP,'')] ##Sketch is mapped to plane resetting its attachment offset
sk.AttachmentOffset = App.Placement(_0Vec_, App.Rotation(_ZVec_, 0))
App.ActiveDocument.commitTransaction() #Commit transaction for undo management
cslM("SketchUnmap Macro ended correctly")
Für jegliches Feedback (Fehler, Funktionswünsche, Kommentare usw.) nutze bitte diesen Forum-Thread: (FR) macro to remap sketch to different reference