Macro SketchUnmap/de

Skizzenzuordnung aufheben

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.

Versionsmakro : 0.6.2
Datum der letzten Änderung : 2019-06-14
FreeCAD version : 0.17 und höher
Herunterladen : Werkzeugleisten-Symbol
Autor: OpenBrain

Autor
OpenBrain
Herunterladen
Werkzeugleisten-Symbol
Links
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

Beschreibung

Zusammenhang

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.

Anwendung

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!

Installation

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.

Details

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:

Skript

Werkzeugleisten-Symbol

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")

Einschränkungen

Forums-Diskussion

Für jegliches Feedback (Fehler, Funktionswünsche, Kommentare usw.) nutze bitte diesen Forum-Thread: (FR) macro to remap sketch to different reference