Macro Dienstprogramm Zusammenbau
| Beschreibung |
|---|
| Dieses Makro stellt ein Build-Dienstprogramm bereit, mit dem mehrere Projektdateien zu einer Projektdatei zusammengefügt werden können. Versionsmakro : 1.0 Datum der letzten Änderung : 2015-01-21 FreeCAD version : Alle Herunterladen : Werkzeugleisten-Symbol Autor: Piffpoof |
| Autor |
| Piffpoof |
| Herunterladen |
| Werkzeugleisten-Symbol |
| Links |
| Makros Rezepte Wie man Makros installiert Symbolleisten anpassen |
| Macro-Version |
| 1.0 |
| Datum der letzten Änderung |
| 2015-01-21 |
| FreeCAD-Version(s) |
| Alle |
| Standardverknüpfung |
| None |
| Siehe auch |
| None |
Beschreibung
Dieses Makro ist für den Einsatz in großen Projekten mit Hunderten von Objekten vorgesehen. Seine Verwendung in einem kleinen Projekt mit nur einer Datei wäre sinnlos und unnötig. Bei einem großen Projekt mit vielen Objekten und vielen Dateien, die zu einer endgültigen Datei zusammengeführt werden müssen, spart es jedoch Zeit, erspart dem Benutzer wiederholte Aktionen und verhindert menschliche Fehler.
Installation
Der gesamte Code für buildUtility.FCMacro befindet sich in einem Makro. Die Installation besteht also darin, den Code in das entsprechende Makroverzeichnis zu kopieren und pythonAssistantWindow über das Makro-Menü, die Python-Konsole oder eine Symbolleisten-Schaltfläche (die bevorzugte Methode) aufzurufen.
- Siehe How to install macros/de über Informationen zur Installation dieses Makro-Codes
- Siehe Customize Toolbars/de über Informationen zur Installation als Schaltfläche in einer Symbolleiste
Anwendung
Das Build-Dienstprogramm funktioniert nach denselben Prinzipien wie die Build-Dateien, die zum Zusammenstellen großer Softwaresysteme (wie FreeCAD) verwendet werden. Mit einem Texteditor wird eine Textdatei erstellt, die den vom Build-Dienstprogramm geforderten Formaten entspricht. Das Build-Dienstprogramm liest dann einfach jede Zeile der Textdatei und führt die in dieser Textdatei angegebenen Aktionen aus.
Das Makro fordert den Benutzer zur Eingabe einer "Build-Datei" auf. Anschließend analysiert es diese Build-Datei. Es gibt drei zulässige Zeilentypen:
- Zeilen, die mit dem Kommentarzeichen "#" beginnen und als Kommentare oder Anmerkungen ignoriert werden
- Zeilen, die mit dem Unterdateizeichen "@" beginnen und ignoriert werden
Hinweis: Das Zeichen "@" ist für zukünftige Erweiterungen vorgesehen, wenn Unter-Build-Dateien verarbeitet werden sollen - alle anderen Zeilen, die eine Projektdatei oder ein Unterverzeichnis sein können
Die Dateiendung für Build Utility-Dateien lautet „.FCBld“. Dadurch wird verhindert, dass diese Dateien mit anderen Verwendungszwecken und Anwendungen verwechselt werden.
Jede in der Build-Datei angegebene Datei hat standardmäßig die Erweiterung ".FCStd". Beginnt die Zeile mit einem Verzeichnis, wird die Projektdatei aus diesem Unterordner gelesen. Andernfalls wird davon ausgegangen, dass die Zeile eine Projektdatei angibt. Verzeichnisse innerhalb von Verzeichnissen werden unterstützt, sodass eine beliebige Verschachtelungstiefe möglich ist. Das Dateispezifikationsformat entspricht dem "Unix"-Stil, wobei verschiedene Ebenen durch den Schrägstrich "/" getrennt werden.
Jede fehlende Datei wird in der Ausgabefenster ausgegeben. Jedes fehlende Verzeichnis wird in der Ausgabefenster ausgegeben.
Es wird ein neues Dokument erstellt und jedes Projekt wird in dieses neue und leere Dokument zusammengeführt. Das Dokument wird am Ende nicht gespeichert, dies bleibt dem Benutzer überlassen, falls gewünscht. Wenn die Datei nicht existiert, wird der Dateiname in das Ausgabefenster ausgegeben.
Benutzeroberfläche
Für dieses Makro gibt es überhaupt keine grafische Benutzeroberfläche. Das Makro liest eine mit einem Texteditor erstellte Textdatei und erstellt ein Modell in einem Ausgabedokument. Abgesehen vom Klicken auf die Schaltfläche in der Symbolleiste, um den Vorgang zu starten, ist keine Benutzerinteraktion erforderlich.
Optionen
Es gibt keine grafische Benutzeroberfläche, daher gibt es auch keine Optionen. Die einzigen Alternativen bestehen darin, die drei oben beschriebenen Zeilentypen in der Textdatei zu verwenden.
Anmerkungen
Um noch einmal zu wiederholen, was zu Beginn gesagt wurde: Bei einem kleinen Modell mit nur einer Datei ist diese Makrofunktion nutzlos. Für Personen, die Flugzeuge, Lokomotiven, Schiffe, Gebäude, physikalische Anlagen oder komplexe Schaltkreise modellieren, bietet es jedoch einen eindeutigen Nutzen und Vorteil. Durch die Wahl der Dateiendung „.FCBld“ soll eine Art Standard für Build-Dateien innerhalb von FreeCAD geschaffen werden. Durch die Reservierung des Präfixzeichens „@“ in der Befehlsdateidefinition soll die zukünftige Verwendung und (falls erforderlich) Erweiterung ermöglicht werden.
Verweise
keine (so weit)
Skript
Macro_Build_Utility.FCMacro
#
# Build Utility
# v 0.0 - build from files and files in sub-folders
#
#***********************************************************************************
# routine to read in a build file and merge all specified projects
"""
This function asks the user for a "build file". It then parses that build file, there
are 3 legal line types:
- lines starting with the comment character "#" which are ignored
- lines starting with the subfile character "@" which are ignored
Note: the "@" character is for future enhancement when sub-build files
will be handled
- all other lines which may be a project file or a subfolder (sub-directory)
If the line is a subfolder then the project file is read from that subfolder.
Otherwise it is assumed the line specifies a project file.
A new document is created and each project is "Project Merged" into that new and empty document.
The document is not saved at the end, this is left for the user if desired.
If the file does not exist then the file name is Printed to the Report view
"""
"""
Example file:
#this is a sample build file
#==============================
@sub-build-files - not presently inplemented
# first the top-level file
metal
# now some misc files
./black/black
./blue/blue
# file does not exist
zebra
# folder does not exist
/bear/bear
# multiple files in one sub-folder
./engineering/green
./engineering/grey
#multiple files in hierarchical folders
./externalModules/white
./externalModules/red/red
#./externalModules/red/stackerAssembly - commented out as not currently loading
./externalModules/red/orange
./externalModules/red/level3/yellow
"""
# import statements
import FreeCAD
import os.path
from PySide import QtGui
# UI Class definitions
# Class definitions
# Function definitionss
# Constant definitions
buildTargetDocument = "build_target"
commentTag = "#"
subfileTag = "@"
lineFeed = "\n"
subfolder = "./"
carriageReturn = "\r"
fileSeparator = "/"
fcFileExtension = ".FCStd"
fcFileExtensionUC = ".FCSTD"
fcFileExtensionLen = -6
# code ***********************************************************************************
buildFilePathName=QtGui.QFileDialog.getOpenFileName()[0]
if len(buildFilePathName) > 0:
# set up a new empty "build_target" document
FreeCAD.newDocument(buildTargetDocument)
FreeCAD.setActiveDocument(buildTargetDocument)
FreeCAD.ActiveDocument=FreeCAD.getDocument(buildTargetDocument)
guiDoc=FreeCADGui.ActiveDocument
#
lastFileSeparator = buildFilePathName.rindex(fileSeparator)
buildFilePath = buildFilePathName[: lastFileSeparator]
buildFileName = buildFilePathName[lastFileSeparator +1:]
#
buildFileContents = open(buildFilePathName,"r")
buildFileLines = buildFileContents.readlines()
buildFileContents.close()
#
for line in buildFileLines:
if line[0] == commentTag:
# line of internal comment
pass
elif line[0] == subfileTag:
# line of sub-build-file (not presently implemented)
pass
else:
# a line which should specify a FreeCAD project file
# - may be preceded by a sub-directory e.g. "./subdir309/"
# - project file may be missing file extension
#
# if line break at end of file spec then remove
if line[-1:] == lineFeed:
line = line[:-1]
if line[-1:] == carriageReturn:
line = line[:-1]
# if no FreeCAD project file extension supplied then append one
# make an uppercase comparison in case of mixed case
tempLine = fcFileExtension + line.upper()
if fcFileExtensionUC != tempLine[fcFileExtensionLen:]:
line = line + fcFileExtension
# if there is a leading subdirectory then remove "./" from beginning
if subfolder[0:2] == line[0:2]:
line = line[2:]
projectFileSpec = str(buildFilePath) + str("/") + str(line)
if os.path.exists(projectFileSpec):
guiDoc.mergeProject(projectFileSpec)
else:
FreeCAD.Console.PrintMessage('project file "' + projectFileSpec + '" not found' + "\n")
# set view back to "build_target", it is up to user to save it (if they want)
FreeCAD.setActiveDocument(buildTargetDocument)
FreeCAD.ActiveDocument=FreeCAD.getDocument(buildTargetDocument)
FreeCADGui.ActiveDocument=FreeCADGui.getDocument(buildTargetDocument)
FreeCADGui.SendMsgToActiveView("ViewFit")
FreeCADGui.activeDocument().activeView().viewAxometric()
#
#OS: Mac OS X
#Word size: 64-bit
#Version: 0.14.3703 (Git)
#Branch: releases/FreeCAD-0-14
#Hash: c6edd47334a3e6f209e493773093db2b9b4f0e40
#Python version: 2.7.5
#Qt version: 4.8.6
#Coin version: 3.1.3
#SoQt version: 1.5.0
#OCC version: 6.7.0
#
#thus ends the macro...
Beispiel
Man arbeitet mit einigen anderen Abteilungen des Unternehmens zusammen, um mit FreeCAD ein großes CAD-Modell für einen externen Kunden zu erstellen. Zur Vorbereitung der bevorstehenden Präsentation muss man die Modelle aus den Subsystemen 'schwarz' und 'blau' integrieren. Die Konstruktionsabteilung ist für die Subsysteme 'grün' und 'grau' zuständig, und man hat das Untersystem 'Metall' auf dem eigenen Computer. Der Kunde verwendet ebenfalls FreeCAD, und der Entwurf muss in die Untersysteme 'rot' und 'gelb' integriert werden. Der externe Kunde hat mitgeteilt, dass die Stacker-Baugruppe noch nicht einsatzbereit ist, sodass man sie in der Build-Datei auskommentieren muss.
Es gibt viele Verzeichnispfade einzugeben, daher gibt man die Befehle in die Textdatei "Build Utility" ein, sodass man sie mit einem einzigen Klick auf eine Schaltfläche in der Symbolleiste ausführen kann.
Der Inhalt der unten gezeigten Build-Datei "buildFile.FCBld" zeigt die Dateistruktur für das oben beschriebene Projekt.
#this is the build file for the complete assembly
#==============================
@sub-build-files - not presently implemented
# first the top-level file
metal
# now some misc files
./black/black
./blue/blue
# file does not exist
zebra
# folder does not exist
/bear/bear
# multiple files in one sub-folder
./engineering/green
./engineering/grey
#multiple files in hierarchical folders
./externalModules/white
./externalModules/red/red
#./externalModules/red/stackerAssembly - commented out as not currently loading
./externalModules/red/orange
./externalModules/red/level3/yellow
Eine Zusammenfassung der Datei und ihrer Verarbeitung lautet wie folgt:
- Die ersten beiden Zeilen werden als Kommentare behandelt, und alles, was nach dem ersten Zeichen des Hash-Zeichens folgt, wird ignoriert
#this is the build file for the complete assembly
#==============================
- Die dritte Zeile wird ebenfalls ignoriert, da ihr erstes Zeichen das Und-Zeichen ist, das für zukünftige Zwecke reserviert ist, bei denen Befehlsdateien andere Befehlsdateien aufrufen können
@sub-build-files - not presently implemented
- Die fünfte Zeile ist die erste Dateispezifikation. Die Datei befindet sich im selben Verzeichnis wie die Build-Datei, nicht in einem Unterverzeichnis
metal
- Die siebte und achte Zeile sind beide Dateispezifikationen, bei denen sich die Datei in einem Unterverzeichnis befindet. Man beachte, dass das Unterverzeichnis die Form "./black/" hat, wobei "black" der Name des Verzeichnisses ist. Eine Datei namens "sheetFold.FCstd" im Verzeichnis "outsourcing" würde also als "./outsourcing/sheetFold" erscheinen.
./black/black
./blue/blue
- Die neunzehnte Zeile zeigt eine Dateispezifikation, die zwar existiert, aber nicht in diesen Build-Vorgang einbezogen wird
#./externalModules/red/stackerAssembly - commented out as not currently loading
- Die letzten beiden Zeilen zeigen Dateispezifikationen, bei denen sich die Datei in mehr als einer Ebene eines Unterverzeichnisses befindet.
./externalModules/red/orange
./externalModules/red/level3/yellow
