From 101d280f6ac28994480b3c09e8761a07f7d5a717 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Sun, 18 Dec 2016 20:17:16 -0200 Subject: [PATCH 01/60] Draft: More solid normal detection in Draft2Sketch --- src/Mod/Draft/Draft.py | 35 ++++++++++++++++++++------------- src/Mod/Draft/DraftGeomUtils.py | 4 ++-- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 7003d9f5ee91..4dadc1850b39 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -2500,6 +2500,8 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S nobj = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject", "Sketch") deletable = nobj nobj.ViewObject.Autoconstraints = False + startc = 0 + endc = 0 rotation = None for obj in objectslist: @@ -2586,11 +2588,18 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S nobj.addConstraint(Constraint("Coincident",last-1,EndPoint,segs[0],StartPoint)) ok = True elif obj.isDerivedFrom("Part::Feature"): - if rotation is None: - rotation = obj.Placement.Rotation if not DraftGeomUtils.isPlanar(obj.Shape): FreeCAD.Console.PrintError(translate("draft","The given object is not planar and cannot be converted into a sketch.")) return None + if rotation is None: + #rotation = obj.Placement.Rotation + norm = DraftGeomUtils.getNormal(obj.Shape) + if norm: + rotation = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),norm) + else: + FreeCAD.Console.PrintWarning(translate("draft","Unable to guess the normal direction of this object")) + rotation = FreeCAD.Rotation() + norm = obj.Placement.Rotation.Axis for e in obj.Shape.Edges: if DraftGeomUtils.geomType(e) in ["BSplineCurve","BezierCurve"]: FreeCAD.Console.PrintError(translate("draft","BSplines and Bezier curves are not supported by this tool")) @@ -2598,38 +2607,36 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S # if not addTo: # nobj.Placement.Rotation = DraftGeomUtils.calculatePlacement(obj.Shape).Rotation if autoconstraints: - start = 0 - end = 0 for wire in obj.Shape.Wires: for edge in wire.OrderedEdges: nobj.addGeometry(DraftGeomUtils.orientEdge(edge)) - end += 1 - segs = list(range(start,end)) + endc += 1 + segs = list(range(startc,endc)) for seg in segs: if seg == nobj.GeometryCount-1: if wire.isClosed: - if nobj.Geometry[seg].EndPoint == nobj.Geometry[start].StartPoint: - nobj.addConstraint(Constraint("Coincident",seg,EndPoint,start,StartPoint)) - else: - nobj.addConstraint(Constraint("Coincident",seg,StartPoint,start,EndPoint)) + if nobj.Geometry[seg].EndPoint == nobj.Geometry[startc].StartPoint: + nobj.addConstraint(Constraint("Coincident",seg,EndPoint,startc,StartPoint)) + elif nobj.Geometry[seg].StartPoint == nobj.Geometry[startc].EndPoint: + nobj.addConstraint(Constraint("Coincident",seg,StartPoint,startc,EndPoint)) else: if nobj.Geometry[seg].EndPoint == nobj.Geometry[seg+1].StartPoint: nobj.addConstraint(Constraint("Coincident",seg,EndPoint,seg+1,StartPoint)) - else: + elif nobj.Geometry[seg].StartPoint == nobj.Geometry[seg+1].EndPoint: nobj.addConstraint(Constraint("Coincident",seg,StartPoint,seg+1,EndPoint)) if DraftGeomUtils.isAligned(nobj.Geometry[seg],"x"): nobj.addConstraint(Constraint("Vertical",seg)) elif DraftGeomUtils.isAligned(nobj.Geometry[seg],"y"): nobj.addConstraint(Constraint("Horizontal",seg)) - start = end + startc = endc else: for edge in obj.Shape.Edges: - nobj.addGeometry(DraftGeomUtils.orientEdge(edge)) + nobj.addGeometry(DraftGeomUtils.orientEdge(edge,norm)) ok = True formatObject(nobj,obj) if ok and delete: FreeCAD.ActiveDocument.removeObject(obj.Name) - if not rotation is None: + if rotation: nobj.Placement.Rotation = rotation else: print("-----error!!! rotation is still None...") diff --git a/src/Mod/Draft/DraftGeomUtils.py b/src/Mod/Draft/DraftGeomUtils.py index 1312a6b73049..054974f62914 100755 --- a/src/Mod/Draft/DraftGeomUtils.py +++ b/src/Mod/Draft/DraftGeomUtils.py @@ -547,8 +547,8 @@ def orientEdge(edge, normal=None): else: axis = edge.Placement.Rotation.Axis angle = -1*edge.Placement.Rotation.Angle*FreeCAD.Units.Radian - - edge.rotate(base, axis, angle) + if angle: + edge.rotate(base, axis, angle) if isinstance(edge.Curve,Part.Line): return Part.LineSegment(edge.Curve,edge.FirstParameter,edge.LastParameter) return edge.Curve From 72ab17fb48b69fb8d9c1a6df95a0a21a26c1d48b Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 19 Dec 2016 14:07:35 +0100 Subject: [PATCH 02/60] fix typos --- src/3rdParty/salomesmesh/src/SMESHDS/SMESHDS_SubMesh.cpp | 2 +- src/App/PropertyFile.cpp | 2 +- src/Gui/MDIView.cpp | 2 +- src/Gui/MainWindow.cpp | 2 +- src/Gui/ProgressBar.h | 2 +- src/Gui/Selection.cpp | 2 +- src/Gui/TextEdit.cpp | 2 +- src/Gui/View3DInventor.cpp | 2 +- src/Gui/ViewProvider.h | 2 +- src/Gui/ViewProviderPythonFeature.h | 2 +- src/Gui/propertyeditor/PropertyItem.cpp | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/3rdParty/salomesmesh/src/SMESHDS/SMESHDS_SubMesh.cpp b/src/3rdParty/salomesmesh/src/SMESHDS/SMESHDS_SubMesh.cpp index 11dbb124a294..c927e5c162a4 100644 --- a/src/3rdParty/salomesmesh/src/SMESHDS/SMESHDS_SubMesh.cpp +++ b/src/3rdParty/salomesmesh/src/SMESHDS/SMESHDS_SubMesh.cpp @@ -121,7 +121,7 @@ bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDele } if (!IsComplexSubmesh()) { - if ( ME->getshapeId() != myIndex ) // elem not in a pool can loose it's data already + if ( ME->getshapeId() != myIndex ) // elem not in a pool can lose its data already { if ( isElemDeleted ) for ( size_t i = 0; i < myElements.size(); ++i ) diff --git a/src/App/PropertyFile.cpp b/src/App/PropertyFile.cpp index f5a1137ff884..7ab448af78df 100644 --- a/src/App/PropertyFile.cpp +++ b/src/App/PropertyFile.cpp @@ -182,7 +182,7 @@ void PropertyFileIncluded::setValue(const char* sFile, const char* sName) // directory: // When a file is read-only it is supposed to be assigned to a // PropertyFileIncluded instance. In this case we must copy the - // file because otherwise the above instance looses its data. + // file because otherwise the above instance loses its data. // If the file is writable it is supposed to be of free use and // it can be simply renamed. diff --git a/src/Gui/MDIView.cpp b/src/Gui/MDIView.cpp index 9567cf96a42e..c069717035ea 100644 --- a/src/Gui/MDIView.cpp +++ b/src/Gui/MDIView.cpp @@ -178,7 +178,7 @@ void MDIView::closeEvent(QCloseEvent *e) } // Note: When using QMdiArea we must not use removeWindow() - // because otherwise the QMdiSubWindow will loose its parent + // because otherwise the QMdiSubWindow will lose its parent // and thus the notification in QMdiSubWindow::closeEvent of // other mdi windows to get maximized if this window // is maximized will fail. diff --git a/src/Gui/MainWindow.cpp b/src/Gui/MainWindow.cpp index 01002cb2738a..23074e926aa2 100644 --- a/src/Gui/MainWindow.cpp +++ b/src/Gui/MainWindow.cpp @@ -783,7 +783,7 @@ void MainWindow::removeWindow(Gui::MDIView* view) QWidget* parent = view->parentWidget(); // The call of 'd->mdiArea->removeSubWindow(parent)' causes the QMdiSubWindow - // to loose its parent and thus the notification in QMdiSubWindow::closeEvent + // to lose its parent and thus the notification in QMdiSubWindow::closeEvent // of other mdi windows to get maximized if this window is maximized will fail. // However, we must let it here otherwise deleting MDI child views directly can // cause other problems. diff --git a/src/Gui/ProgressBar.h b/src/Gui/ProgressBar.h index 0bdc70074a1b..d99439cae175 100644 --- a/src/Gui/ProgressBar.h +++ b/src/Gui/ProgressBar.h @@ -175,7 +175,7 @@ protected Q_SLOTS: void resetObserveEventFilter(); /** Gets the events under control */ void enterControlEvents(); - /** Looses the control over incoming events*/ + /** Loses the control over incoming events*/ void leaveControlEvents(); //@} ProgressBarPrivate* d; diff --git a/src/Gui/Selection.cpp b/src/Gui/Selection.cpp index 8f0b726a439d..3e9bac496959 100644 --- a/src/Gui/Selection.cpp +++ b/src/Gui/Selection.cpp @@ -382,7 +382,7 @@ std::vector SelectionSingleton::getSelectionEx(const char* pDoc } } - // The map looses the order thus we have to go again through the list and pick up the SelectionObject from the map + // The map loses the order thus we have to go again through the list and pick up the SelectionObject from the map for (std::list<_SelObj>::const_iterator It = _SelList.begin();It != _SelList.end();++It) { std::map::iterator Jt = SortMap.find(It->pObject); if (Jt != SortMap.end()) { diff --git a/src/Gui/TextEdit.cpp b/src/Gui/TextEdit.cpp index b3f19b0e6d81..932c2f7dc242 100644 --- a/src/Gui/TextEdit.cpp +++ b/src/Gui/TextEdit.cpp @@ -156,7 +156,7 @@ void TextEdit::complete() /** * Creates the listbox containing all possibilities for the completion. - * The listbox is closed when ESC is pressed, the text edit field looses focus or a + * The listbox is closed when ESC is pressed, the text edit field loses focus or a * mouse button was pressed. */ void TextEdit::createListBox() diff --git a/src/Gui/View3DInventor.cpp b/src/Gui/View3DInventor.cpp index 0c29a3503d51..a6e7b2cfc984 100644 --- a/src/Gui/View3DInventor.cpp +++ b/src/Gui/View3DInventor.cpp @@ -974,7 +974,7 @@ void View3DInventor::setCurrentViewMode(ViewMode newmode) // be avoided because when two or more windows are either in 'TopLevel' or 'Fullscreen' // mode only the last window gets all key event even if it is not the active one. // - // It is important to set the focus proxy to get all key events otherwise we would loose + // It is important to set the focus proxy to get all key events otherwise we would lose // control after redirecting the first key event to the GL widget. if (oldmode == Child) { // To make a global shortcut working from this window we need to add diff --git a/src/Gui/ViewProvider.h b/src/Gui/ViewProvider.h index 27de3423e313..7cc0f886e49d 100644 --- a/src/Gui/ViewProvider.h +++ b/src/Gui/ViewProvider.h @@ -255,7 +255,7 @@ class GuiExport ViewProvider : public App::TransactionalObject protected: /// is called by the document when the provider goes in edit mode virtual bool setEdit(int ModNum); - /// is called when you loose the edit mode + /// is called when you lose the edit mode virtual void unsetEdit(int ModNum); /// return the edit mode or -1 if nothing is being edited int getEditingMode() const; diff --git a/src/Gui/ViewProviderPythonFeature.h b/src/Gui/ViewProviderPythonFeature.h index 900a63ec86ab..cb4402bb1f6d 100644 --- a/src/Gui/ViewProviderPythonFeature.h +++ b/src/Gui/ViewProviderPythonFeature.h @@ -387,7 +387,7 @@ class ViewProviderPythonFeatureT : public ViewProviderT if (!ok) ok = ViewProviderT::setEdit(ModNum); return ok; } - /// is called when you loose the edit mode + /// is called when you lose the edit mode virtual void unsetEdit(int ModNum) { bool ok = imp->unsetEdit(ModNum); diff --git a/src/Gui/propertyeditor/PropertyItem.cpp b/src/Gui/propertyeditor/PropertyItem.cpp index 4bade8509163..918c34cfc84b 100644 --- a/src/Gui/propertyeditor/PropertyItem.cpp +++ b/src/Gui/propertyeditor/PropertyItem.cpp @@ -1898,7 +1898,7 @@ void PropertyPlacementItem::setValue(const QVariant& value) if (!value.canConvert()) return; // Accept this only if the user changed the axis, angle or position but - // not if >this< item looses focus + // not if >this< item loses focus if (!changed_value) return; changed_value = false; From bb7e662e7c5d7ed93fbd268b74d3f6cb776ee791 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 19 Dec 2016 17:32:39 +0100 Subject: [PATCH 03/60] issue #0002673: Not memorize the rotation --- src/Gui/propertyeditor/PropertyItem.cpp | 23 +++++++++++++++++++++-- src/Gui/propertyeditor/PropertyItem.h | 2 ++ src/Gui/propertyeditor/PropertyModel.cpp | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Gui/propertyeditor/PropertyItem.cpp b/src/Gui/propertyeditor/PropertyItem.cpp index 918c34cfc84b..5f65b52a3a52 100644 --- a/src/Gui/propertyeditor/PropertyItem.cpp +++ b/src/Gui/propertyeditor/PropertyItem.cpp @@ -160,6 +160,10 @@ bool PropertyItem::hasProperty(const App::Property* prop) const return false; } +void PropertyItem::assignProperty(const App::Property*) +{ +} + bool PropertyItem::removeProperty(const App::Property* prop) { std::vector::iterator it = std::find(propertyItems.begin(), propertyItems.end(), prop); @@ -1835,6 +1839,21 @@ void PropertyPlacementItem::setPosition(const Base::Vector3d& pos) setValue(QVariant::fromValue(val)); } +void PropertyPlacementItem::assignProperty(const App::Property* prop) +{ + if (prop->getTypeId().isDerivedFrom(App::PropertyPlacement::getClassTypeId())) { + const Base::Placement& value = static_cast(prop)->getValue(); + double angle; + Base::Vector3d dir; + value.getRotation().getValue(dir, angle); + Base::Vector3d cross = this->rot_axis.Cross(dir); + if (cross.Sqr() > Base::Vector3d::epsilon()) { + this->rot_axis = dir; + } + this->rot_angle = Base::toDegrees(angle); + } +} + QVariant PropertyPlacementItem::value(const App::Property* prop) const { assert(prop && prop->getTypeId().isDerivedFrom(App::PropertyPlacement::getClassTypeId())); @@ -1928,13 +1947,13 @@ QWidget* PropertyPlacementItem::createEditor(QWidget* parent, const QObject* rec void PropertyPlacementItem::setEditorData(QWidget *editor, const QVariant& data) const { - Gui::LabelButton *pe = qobject_cast(editor); + PlacementEditor *pe = qobject_cast(editor); pe->setValue(data); } QVariant PropertyPlacementItem::editorData(QWidget *editor) const { - Gui::LabelButton *pe = qobject_cast(editor); + PlacementEditor *pe = qobject_cast(editor); return pe->value(); } diff --git a/src/Gui/propertyeditor/PropertyItem.h b/src/Gui/propertyeditor/PropertyItem.h index ac9c821fa0d5..972b8019db16 100644 --- a/src/Gui/propertyeditor/PropertyItem.h +++ b/src/Gui/propertyeditor/PropertyItem.h @@ -114,6 +114,7 @@ class GuiExport PropertyItem : public QObject, public ExpressionBinding void updateData(); const std::vector& getPropertyData() const; bool hasProperty(const App::Property*) const; + virtual void assignProperty(const App::Property*); bool removeProperty(const App::Property*); App::Property* getFirstProperty(); const App::Property* getFirstProperty() const; @@ -582,6 +583,7 @@ class GuiExport PropertyPlacementItem: public PropertyItem virtual QVariant editorData(QWidget *editor) const; virtual void propertyBound(); + virtual void assignProperty(const App::Property*); Base::Quantity getAngle() const; void setAngle(Base::Quantity); diff --git a/src/Gui/propertyeditor/PropertyModel.cpp b/src/Gui/propertyeditor/PropertyModel.cpp index b0cc7b856a44..59e806670540 100644 --- a/src/Gui/propertyeditor/PropertyModel.cpp +++ b/src/Gui/propertyeditor/PropertyModel.cpp @@ -268,6 +268,7 @@ void PropertyModel::updateProperty(const App::Property& prop) child->updateData(); QModelIndex data = this->index(row, column, QModelIndex()); if (data.isValid()) { + child->assignProperty(&prop); dataChanged(data, data); updateChildren(child, column, data); } From ae077f192c34e1981c543810e0df1583ba073e38 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Mon, 19 Dec 2016 15:28:16 -0200 Subject: [PATCH 04/60] Draft: Fixedbug in facebinder --- src/Mod/Draft/Draft.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 4dadc1850b39..e6daf48ebe92 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -5799,6 +5799,9 @@ def execute(self,obj): sh = sh.removeSplitter() else: sh = faces[0] + if hasattr(obj,"Extrusion"): + if obj.Extrusion.Value: + sh = sh.extrude(sh.normalAt(0,0).multiply(obj.Extrusion.Value)) sh.transformShape(sh.Matrix, True) except Part.OCCError: print("Draft: error building facebinder") From 5099f2385a7c294939c1421e6510b60c3dc29f95 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Mon, 19 Dec 2016 11:20:42 -0800 Subject: [PATCH 05/60] Fixed 2d geometry changes for dogbone. --- src/Mod/Path/PathScripts/DogboneDressup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mod/Path/PathScripts/DogboneDressup.py b/src/Mod/Path/PathScripts/DogboneDressup.py index 84041b2a04ac..caa26ee6c75c 100644 --- a/src/Mod/Path/PathScripts/DogboneDressup.py +++ b/src/Mod/Path/PathScripts/DogboneDressup.py @@ -434,7 +434,7 @@ def smoothChordCommands(self, bone, inChord, outChord, edge, wire, corner, smoot debugPrint("smooth: (%.2f, %.2f)-(%.2f, %.2f)" % (edge.Vertexes[0].Point.x, edge.Vertexes[0].Point.y, edge.Vertexes[1].Point.x, edge.Vertexes[1].Point.y)) for e in wire.Edges: self.dbg.append(e) - if type(e.Curve) == Part.LineSegment: + if type(e.Curve) == Part.LineSegment or type(e.Curve) == Part.Line: debugPrint(" (%.2f, %.2f)-(%.2f, %.2f)" % (e.Vertexes[0].Point.x, e.Vertexes[0].Point.y, e.Vertexes[1].Point.x, e.Vertexes[1].Point.y)) else: debugPrint(" (%.2f, %.2f)^%.2f" % (e.Curve.Center.x, e.Curve.Center.y, e.Curve.Radius)) From d82d050c34635c61090813851ab109e6f81bdd96 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Mon, 19 Dec 2016 16:52:28 -0800 Subject: [PATCH 06/60] Fixed dogbone for small tool bit radii. --- src/Mod/Path/PathScripts/DogboneDressup.py | 71 ++++++++++++---------- src/Mod/Path/PathScripts/PathGeom.py | 18 ++++++ 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/Mod/Path/PathScripts/DogboneDressup.py b/src/Mod/Path/PathScripts/DogboneDressup.py index caa26ee6c75c..4a677bee17ad 100644 --- a/src/Mod/Path/PathScripts/DogboneDressup.py +++ b/src/Mod/Path/PathScripts/DogboneDressup.py @@ -25,6 +25,7 @@ import FreeCADGui import Path from PathScripts import PathUtils +from PathScripts.PathGeom import * from PySide import QtCore, QtGui import math import Part @@ -267,14 +268,14 @@ def g3Command(self, center): return self.arcCommand("G3", center) def isAPlungeMove(self): - return self.End.z != self.Start.z + return not PathGeom.isRoughly(self.End.z, self.Start.z) def foldsBackOrTurns(self, chord, side): dir = chord.getDirectionOf(self) return dir == 'Back' or dir == side def connectsTo(self, chord): - return self.End == chord.Start + return PathGeom.isRoughly(self.End, chord.Start) class Bone: def __init__(self, boneId, obj, lastCommand, inChord, outChord, smooth): @@ -369,8 +370,6 @@ def __init__(self, obj): obj.addProperty("App::PropertyFloat", "Custom", "Dressup", QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "Dressup length if Incision == custom")) obj.Custom = 0.0 obj.Proxy = self - self.shapes = {} - self.dbg = [] def __getstate__(self): return None @@ -413,6 +412,10 @@ def findPivotIntersection(self, pivot, pivotEdge, edge, refPt, d, color): debugPrint(" --> (%.2f, %.2f)" % (ppt.x, ppt.y)) return ppt + def pointIsOnEdge(self, point, edge): + param = edge.Curve.parameter(point) + return edge.FirstParameter <= param <= edge.LastParameter + def smoothChordCommands(self, bone, inChord, outChord, edge, wire, corner, smooth, color = None): if smooth == 0: debugPrint(" No smoothing requested") @@ -439,7 +442,8 @@ def smoothChordCommands(self, bone, inChord, outChord, edge, wire, corner, smoot else: debugPrint(" (%.2f, %.2f)^%.2f" % (e.Curve.Center.x, e.Curve.Center.y, e.Curve.Radius)) for pt in DraftGeomUtils.findIntersection(edge, e, True, findAll=True): - if pt != corner: + if not PathGeom.pointsCoincide(pt, corner) and self.pointIsOnEdge(pt, e): + debugMarker(pt, "candidate-%d-%s" % (self.boneId, d), color, 0.05) debugPrint(" -> candidate") distance = (pt - refPoint).Length if not pivot or pivotDistance > distance: @@ -456,7 +460,7 @@ def smoothChordCommands(self, bone, inChord, outChord, edge, wire, corner, smoot t2 = self.findPivotIntersection(pivot, pivotEdge, outChord.asEdge(), inChord.End, d, color) commands = [] - if t1 != inChord.Start: + if not PathGeom.pointsCoincide(t1, inChord.Start): debugPrint(" add lead in") commands.append(Chord(inChord.Start, t1).g1Command()) if bone.obj.Side == Side.Left: @@ -465,13 +469,13 @@ def smoothChordCommands(self, bone, inChord, outChord, edge, wire, corner, smoot else: debugPrint(" add g2 command center=(%.2f, %.2f) -> from (%2f, %.2f) to (%.2f, %.2f" % (pivot.x, pivot.y, t1.x, t1.y, t2.x, t2.y)) commands.append(Chord(t1, t2).g2Command(pivot)) - if t2 != outChord.End: + if not PathGeom.pointsCoincide(t2, outChord.End): debugPrint(" add lead out") commands.append(Chord(t2, outChord.End).g1Command()) - debugMarker(pivot, "pivot.%d-%s" % (self.boneId, d), color, 0.2) - debugMarker(t1, "pivot.%d-%s.in" % (self.boneId, d), color, 0.1) - debugMarker(t2, "pivot.%d-%s.out" % (self.boneId, d), color, 0.1) + #debugMarker(pivot, "pivot.%d-%s" % (self.boneId, d), color, 0.2) + #debugMarker(t1, "pivot.%d-%s.in" % (self.boneId, d), color, 0.1) + #debugMarker(t2, "pivot.%d-%s.out" % (self.boneId, d), color, 0.1) return commands @@ -484,7 +488,7 @@ def inOutBoneCommands(self, bone, boneAngle, fixedLength): bone.tip = bone.inChord.End # in case there is no bone debugPrint("corner = (%.2f, %.2f)" % (corner.x, corner.y)) - debugMarker(corner, 'corner', (1., 0., 1.), 0.3) + debugMarker(corner, 'corner', (1., 0., 1.), self.toolRadius) length = fixedLength if bone.obj.Incision == Incision.Custom: @@ -505,7 +509,7 @@ def inOutBoneCommands(self, bone, boneAngle, fixedLength): bone.tip = boneInChord.End if bone.smooth == 0: - return [ bone.lastCommand, boneInChord.g1Command(), boneOutChord.g1Command(), outChord.g1Command()] + return [ bone.lastCommand, boneInChord.g1Command(), boneOutChord.g1Command(), bone.outChord.g1Command()] # reconstruct the corner and convert to an edge offset = corner - bone.inChord.End @@ -547,14 +551,14 @@ def dogbone(self, bone): def tboneHorizontal(self, bone): angle = bone.angle() boneAngle = 0 - if angle == math.pi or math.fabs(angle) > math.pi/2: + if PathGeom.isRoughly(angle, math.pi) or math.fabs(angle) > math.pi/2: boneAngle = -math.pi return self.inOutBoneCommands(bone, boneAngle, self.toolRadius) def tboneVertical(self, bone): angle = bone.angle() boneAngle = math.pi/2 - if angle == math.pi or angle < 0: + if PathGeom.isRoughly(angle, math.pi) or angle < 0: boneAngle = -boneAngle return self.inOutBoneCommands(bone, boneAngle, self.toolRadius) @@ -622,7 +626,7 @@ def insertBone(self, bone): self.bones.append((bone.boneId, bone.location(), enabled, inaccessible)) self.boneId = bone.boneId - if debugDressup and bone.boneId < 11: + if debugDressup and bone.boneId > 2: commands = self.boneCommands(bone, False) else: commands = self.boneCommands(bone, enabled) @@ -646,7 +650,7 @@ def removePathCrossing(self, commands, bone1, bone2): for pt in cutoff: #debugCircle(e1.Curve.Center, e1.Curve.Radius, "bone.%d-1" % (self.boneId), (1.,0.,0.)) #debugCircle(e2.Curve.Center, e2.Curve.Radius, "bone.%d-2" % (self.boneId), (0.,1.,0.)) - if pt == e1.valueAt(e1.LastParameter) or pt == e2.valueAt(e2.FirstParameter): + if PathGeom.pointsCoincide(pt, e1.valueAt(e1.LastParameter)) or PathGeom.pointsCoincide(pt, e2.valueAt(e2.FirstParameter)): continue debugMarker(pt, "it", (0.0, 1.0, 1.0)) # 1. remove all redundant commands @@ -753,20 +757,19 @@ def execute(self, obj): obj.Path = path def setup(self, obj): - if not hasattr(self, 'toolRadius'): - debugPrint("Here we go ... ") - if hasattr(obj.Base, "BoneBlacklist"): - # dressing up a bone dressup - obj.Side = obj.Base.Side + debugPrint("Here we go ... ") + if hasattr(obj.Base, "BoneBlacklist"): + # dressing up a bone dressup + obj.Side = obj.Base.Side + else: + # otherwise dogbones are opposite of the base path's side + if obj.Base.Side == Side.Left: + obj.Side = Side.Right + elif obj.Base.Side == Side.Right: + obj.Side = Side.Left else: - # otherwise dogbones are opposite of the base path's side - if obj.Base.Side == Side.Left: - obj.Side = Side.Right - elif obj.Base.Side == Side.Right: - obj.Side = Side.Left - else: - # This will cause an error, which is fine for now 'cause I don't know what to do here - obj.Side = 'On' + # This will cause an error, which is fine for now 'cause I don't know what to do here + obj.Side = 'On' self.toolRadius = 5 toolLoad = PathUtils.getLastToolLoad(obj) @@ -779,6 +782,9 @@ def setup(self, obj): else: self.toolRadius = tool.Diameter / 2 + self.shapes = {} + self.dbg = [] + def boneStateList(self, obj): state = {} # If the receiver was loaded from file, then it never generated the bone list. @@ -856,9 +862,10 @@ def updateUI(self): self.updateBoneList() if debugDressup: - for self.obj in FreeCAD.ActiveDocument.Objects: - if self.obj.Name.startswith('Shape'): - FreeCAD.ActiveDocument.removeObject(self.obj.Name) + for obj in FreeCAD.ActiveDocument.Objects: + if obj.Name.startswith('Shape'): + FreeCAD.ActiveDocument.removeObject(obj.Name) + print('object name %s' % self.obj.Name) if hasattr(self.obj.Proxy, "shapes"): debugPrint("showing shapes attribute") for shapes in self.obj.Proxy.shapes.itervalues(): diff --git a/src/Mod/Path/PathScripts/PathGeom.py b/src/Mod/Path/PathScripts/PathGeom.py index dda353efb8d3..3effa097f58f 100644 --- a/src/Mod/Path/PathScripts/PathGeom.py +++ b/src/Mod/Path/PathScripts/PathGeom.py @@ -70,6 +70,24 @@ class PathGeom: CmdMoveArc = CmdMoveCW + CmdMoveCCW CmdMove = CmdMoveStraight + CmdMoveArc + @classmethod + def isRoughly(cls, float1, float2, error=0.0000001): + """(float1, float2, [error=0.0000001]) + Returns true if the two values are the same within a given error.""" + return math.fabs(float1 - float2) <= error + + @classmethod + def pointsCoincide(cls, p1, p2, error=0.0000001): + """(p1, p2, [error=0.0000001]) + Return True if two points are roughly identical (see also isRoughly).""" + return cls.isRoughly(p1.x, p2.x, error) and cls.isRoughly(p1.y, p2.y, error) and cls.isRoughly(p1.z, p2.z, error) + + @classmethod + def edgeConnectsTo(cls, edge, vector): + """(edge, vector) + Returns True if edge connects to given vector.""" + return cls.pointsCoincide(edge.valueAt(edge.FirstParameter), vector) or cls.pointsCoincide(edge.valueAt(edge.LastParameter), vector) + @classmethod def getAngle(cls, vertex): """(vertex) From 65523043231da603784f40c3561bcdc23b4977cc Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Mon, 19 Dec 2016 17:53:01 -0800 Subject: [PATCH 07/60] Renamed dressups to conform to naming scheme. --- src/Mod/Path/InitGui.py | 6 +-- ...ogboneDressup.py => PathDressupDogbone.py} | 40 +++++++++---------- ...nifeDressup.py => PathDressupDragknife.py} | 24 +++++------ 3 files changed, 35 insertions(+), 35 deletions(-) rename src/Mod/Path/PathScripts/{DogboneDressup.py => PathDressupDogbone.py} (95%) rename src/Mod/Path/PathScripts/{DragknifeDressup.py => PathDressupDragknife.py} (95%) diff --git a/src/Mod/Path/InitGui.py b/src/Mod/Path/InitGui.py index 7e2959903b5d..3a81dacc9983 100644 --- a/src/Mod/Path/InitGui.py +++ b/src/Mod/Path/InitGui.py @@ -68,10 +68,10 @@ def Initialize(self): from PathScripts import PathEngrave from PathScripts import PathSurface from PathScripts import PathSanity - from PathScripts import DragknifeDressup + from PathScripts import PathDressupDragknife from PathScripts import PathContour from PathScripts import PathProfileEdges - from PathScripts import DogboneDressup + from PathScripts import PathDressupDogbone from PathScripts import PathMillFace import PathCommands @@ -82,7 +82,7 @@ def Initialize(self): twodopcmdlist = ["Path_Contour", "Path_Profile", "Path_Profile_Edges", "Path_Pocket", "Path_Drilling", "Path_Engrave", "Path_MillFace"] threedopcmdlist = ["Path_Surfacing"] modcmdlist = ["Path_Copy", "Path_CompoundExtended", "Path_Array", "Path_SimpleCopy" ] - dressupcmdlist = ["Dogbone_Dressup", "DragKnife_Dressup"] + dressupcmdlist = ["PathDressup_Dogbone", "PathDressup_DragKnife"] extracmdlist = ["Path_SelectLoop"] #modcmdmore = ["Path_Hop",] #remotecmdlist = ["Path_Remote"] diff --git a/src/Mod/Path/PathScripts/DogboneDressup.py b/src/Mod/Path/PathScripts/PathDressupDogbone.py similarity index 95% rename from src/Mod/Path/PathScripts/DogboneDressup.py rename to src/Mod/Path/PathScripts/PathDressupDogbone.py index 4a677bee17ad..6a45511ad4fd 100644 --- a/src/Mod/Path/PathScripts/DogboneDressup.py +++ b/src/Mod/Path/PathScripts/PathDressupDogbone.py @@ -354,20 +354,20 @@ def edges(self): class ObjectDressup: def __init__(self, obj): - obj.addProperty("App::PropertyLink", "Base","Base", QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "The base path to modify")) - obj.addProperty("App::PropertyEnumeration", "Side", "Dressup", QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "The side of path to insert bones")) + obj.addProperty("App::PropertyLink", "Base","Base", QtCore.QT_TRANSLATE_NOOP("PathDressup_Dogbone", "The base path to modify")) + obj.addProperty("App::PropertyEnumeration", "Side", "Dressup", QtCore.QT_TRANSLATE_NOOP("PathDressup_Dogbone", "The side of path to insert bones")) obj.Side = [Side.Left, Side.Right] obj.Side = Side.Right - obj.addProperty("App::PropertyEnumeration", "Style", "Dressup", QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "The style of boness")) + obj.addProperty("App::PropertyEnumeration", "Style", "Dressup", QtCore.QT_TRANSLATE_NOOP("PathDressup_Dogbone", "The style of boness")) obj.Style = Style.All obj.Style = Style.Dogbone - obj.addProperty("App::PropertyIntegerList", "BoneBlacklist", "Dressup", QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "Bones that aren't dressed up")) + obj.addProperty("App::PropertyIntegerList", "BoneBlacklist", "Dressup", QtCore.QT_TRANSLATE_NOOP("PathDressup_Dogbone", "Bones that aren't dressed up")) obj.BoneBlacklist = [] obj.setEditorMode('BoneBlacklist', 2) # hide this one - obj.addProperty("App::PropertyEnumeration", "Incision", "Dressup", QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "The algorithm to determine the bone length")) + obj.addProperty("App::PropertyEnumeration", "Incision", "Dressup", QtCore.QT_TRANSLATE_NOOP("PathDressup_Dogbone", "The algorithm to determine the bone length")) obj.Incision = Incision.All obj.Incision = Incision.Adaptive - obj.addProperty("App::PropertyFloat", "Custom", "Dressup", QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "Dressup length if Incision == custom")) + obj.addProperty("App::PropertyFloat", "Custom", "Dressup", QtCore.QT_TRANSLATE_NOOP("PathDressup_Dogbone", "Dressup length if Incision == custom")) obj.Custom = 0.0 obj.Proxy = self @@ -805,7 +805,7 @@ class TaskPanel: def __init__(self, obj): self.obj = obj self.form = FreeCADGui.PySideUic.loadUi(":/panels/DogboneEdit.ui") - FreeCAD.ActiveDocument.openTransaction(translate("Dogbone_Dressup", "Edit Dogbone Dress-up")) + FreeCAD.ActiveDocument.openTransaction(translate("PathDressup_Dogbone", "Edit Dogbone Dress-up")) def reject(self): FreeCAD.ActiveDocument.abortTransaction() @@ -967,12 +967,12 @@ def onDelete(self, arg1=None, arg2=None): PathUtils.addToJob(arg1.Object.Base) return True -class CommandDogboneDressup: +class CommandDressupDogbone: def GetResources(self): return {'Pixmap': 'Path-Dressup', - 'MenuText': QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "Dogbone Dress-up"), - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Dogbone_Dressup", "Creates a Dogbone Dress-up object from a selected path")} + 'MenuText': QtCore.QT_TRANSLATE_NOOP("PathDressup_Dogbone", "Dogbone Dress-up"), + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("PathDressup_Dogbone", "Creates a Dogbone Dress-up object from a selected path")} def IsActive(self): if FreeCAD.ActiveDocument is not None: @@ -986,27 +986,27 @@ def Activated(self): # check that the selection contains exactly what we want selection = FreeCADGui.Selection.getSelection() if len(selection) != 1: - FreeCAD.Console.PrintError(translate("Dogbone_Dressup", "Please select one path object\n")) + FreeCAD.Console.PrintError(translate("PathDressup_Dogbone", "Please select one path object\n")) return baseObject = selection[0] if not baseObject.isDerivedFrom("Path::Feature"): - FreeCAD.Console.PrintError(translate("Dogbone_Dressup", "The selected object is not a path\n")) + FreeCAD.Console.PrintError(translate("PathDressup_Dogbone", "The selected object is not a path\n")) return if baseObject.isDerivedFrom("Path::FeatureCompoundPython"): - FreeCAD.Console.PrintError(translate("Dogbone_Dressup", "Please select a Profile or Dogbone Dressup object")) + FreeCAD.Console.PrintError(translate("PathDressup_Dogbone", "Please select a Profile or Dogbone Dressup object")) return if not hasattr(baseObject, "Side"): - FreeCAD.Console.PrintError(translate("Dogbone_Dressup", "Please select a Profile or Dogbone Dressup object")) + FreeCAD.Console.PrintError(translate("PathDressup_Dogbone", "Please select a Profile or Dogbone Dressup object")) return # everything ok! - FreeCAD.ActiveDocument.openTransaction(translate("Dogbone_Dressup", "Create Dogbone Dress-up")) - FreeCADGui.addModule("PathScripts.DogboneDressup") + FreeCAD.ActiveDocument.openTransaction(translate("PathDressup_Dogbone", "Create Dogbone Dress-up")) + FreeCADGui.addModule("PathScripts.PathDressupDogbone") FreeCADGui.addModule("PathScripts.PathUtils") FreeCADGui.doCommand('obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "DogboneDressup")') - FreeCADGui.doCommand('dbo = PathScripts.DogboneDressup.ObjectDressup(obj)') + FreeCADGui.doCommand('dbo = PathScripts.PathDressupDogbone.ObjectDressup(obj)') FreeCADGui.doCommand('obj.Base = FreeCAD.ActiveDocument.' + baseObject.Name) - FreeCADGui.doCommand('PathScripts.DogboneDressup.ViewProviderDressup(obj.ViewObject)') + FreeCADGui.doCommand('PathScripts.PathDressupDogbone.ViewProviderDressup(obj.ViewObject)') FreeCADGui.doCommand('PathScripts.PathUtils.addToJob(obj)') FreeCADGui.doCommand('obj.Base.ViewObject.Visibility = False') FreeCADGui.doCommand('dbo.setup(obj)') @@ -1015,6 +1015,6 @@ def Activated(self): if FreeCAD.GuiUp: # register the FreeCAD command - FreeCADGui.addCommand('Dogbone_Dressup', CommandDogboneDressup()) + FreeCADGui.addCommand('PathDressup_Dogbone', CommandDressupDogbone()) -FreeCAD.Console.PrintLog("Loading DogboneDressup... done\n") +FreeCAD.Console.PrintLog("Loading DressupDogbone... done\n") diff --git a/src/Mod/Path/PathScripts/DragknifeDressup.py b/src/Mod/Path/PathScripts/PathDressupDragknife.py similarity index 95% rename from src/Mod/Path/PathScripts/DragknifeDressup.py rename to src/Mod/Path/PathScripts/PathDressupDragknife.py index 326400e191cc..47925491b29c 100644 --- a/src/Mod/Path/PathScripts/DragknifeDressup.py +++ b/src/Mod/Path/PathScripts/PathDressupDragknife.py @@ -467,12 +467,12 @@ def onDelete(self, arg1=None, arg2=None): return True -class CommandDragknifeDressup: +class CommandDressupDragknife: def GetResources(self): return {'Pixmap': 'Path-Dressup', - 'MenuText': QtCore.QT_TRANSLATE_NOOP("DragKnife_Dressup", "DragKnife Dress-up"), - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("DragKnife_Dressup", "Modifies a path to add dragknife corner actions")} + 'MenuText': QtCore.QT_TRANSLATE_NOOP("PathDressup_DragKnife", "DragKnife Dress-up"), + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("PathDressup_DragKnife", "Modifies a path to add dragknife corner actions")} def IsActive(self): if FreeCAD.ActiveDocument is not None: @@ -487,25 +487,25 @@ def Activated(self): selection = FreeCADGui.Selection.getSelection() if len(selection) != 1: FreeCAD.Console.PrintError( - translate("DragKnife_Dressup", "Please select one path object\n")) + translate("PathDressup_DragKnife", "Please select one path object\n")) return if not selection[0].isDerivedFrom("Path::Feature"): FreeCAD.Console.PrintError( - translate("DragKnife_Dressup", "The selected object is not a path\n")) + translate("PathDressup_DragKnife", "The selected object is not a path\n")) return if selection[0].isDerivedFrom("Path::FeatureCompoundPython"): FreeCAD.Console.PrintError( - translate("DragKnife_Dressup", "Please select a Path object")) + translate("PathDressup_DragKnife", "Please select a Path object")) return # everything ok! - FreeCAD.ActiveDocument.openTransaction(translate("DragKnife_Dressup", "Create Dress-up")) - FreeCADGui.addModule("PathScripts.DragknifeDressup") + FreeCAD.ActiveDocument.openTransaction(translate("PathDressup_DragKnife", "Create Dress-up")) + FreeCADGui.addModule("PathScripts.PathDressupDragknife") FreeCADGui.addModule("PathScripts.PathUtils") FreeCADGui.doCommand('obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython","DragknifeDressup")') - FreeCADGui.doCommand('PathScripts.DragknifeDressup.ObjectDressup(obj)') + FreeCADGui.doCommand('PathScripts.PathDressupDragknife.ObjectDressup(obj)') FreeCADGui.doCommand('obj.Base = FreeCAD.ActiveDocument.' + selection[0].Name) - FreeCADGui.doCommand('PathScripts.DragknifeDressup.ViewProviderDressup(obj.ViewObject)') + FreeCADGui.doCommand('PathScripts.PathDressupDragknife.ViewProviderDressup(obj.ViewObject)') FreeCADGui.doCommand('PathScripts.PathUtils.addToJob(obj)') FreeCADGui.doCommand('Gui.ActiveDocument.getObject(obj.Base.Name).Visibility = False') FreeCADGui.doCommand('obj.filterangle = 20') @@ -518,6 +518,6 @@ def Activated(self): if FreeCAD.GuiUp: # register the FreeCAD command - FreeCADGui.addCommand('DragKnife_Dressup', CommandDragknifeDressup()) + FreeCADGui.addCommand('PathDressup_DragKnife', CommandDressupDragknife()) -FreeCAD.Console.PrintLog("Loading DragKnife_Dressup... done\n") +FreeCAD.Console.PrintLog("Loading PathDressup_DragKnife... done\n") From 12d3d6950fccfc83d9334c4e502575a960e4c4d6 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Mon, 19 Dec 2016 18:27:27 -0800 Subject: [PATCH 08/60] Fixed build. --- src/Mod/Path/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mod/Path/CMakeLists.txt b/src/Mod/Path/CMakeLists.txt index 5ba9eac22965..4a0d5edfc8d7 100644 --- a/src/Mod/Path/CMakeLists.txt +++ b/src/Mod/Path/CMakeLists.txt @@ -16,8 +16,6 @@ INSTALL( SET(PathScripts_SRCS PathCommands.py - PathScripts/DogboneDressup.py - PathScripts/DragknifeDressup.py PathScripts/PathAreaUtils.py PathScripts/PathArray.py PathScripts/PathComment.py @@ -26,6 +24,8 @@ SET(PathScripts_SRCS PathScripts/PathCopy.py PathScripts/PathCustom.py PathScripts/PathDressup.py + PathScripts/PathDressupDogbone.py + PathScripts/PathDressupDragknife.py PathScripts/PathDrilling.py PathScripts/PathEngrave.py PathScripts/PathFacePocket.py From a862279d7f5ce97991997715e63d1ff8986ce907 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 20 Dec 2016 20:52:40 +0100 Subject: [PATCH 09/60] fix crash when using ImageView --- src/Mod/Image/Gui/ImageView.cpp | 35 +++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/Mod/Image/Gui/ImageView.cpp b/src/Mod/Image/Gui/ImageView.cpp index a2a0ea3ed780..23209f6d6fa7 100644 --- a/src/Mod/Image/Gui/ImageView.cpp +++ b/src/Mod/Image/Gui/ImageView.cpp @@ -40,6 +40,37 @@ using namespace ImageGui; ImageView::ImageView(QWidget* parent) : MDIView(0, parent), _ignoreCloseEvent(false) { + // Create an OpenGL widget for displaying images +#if QT_VERSION >=0x050000 + // Since Qt5 there is a weird behaviour when creating a GLImageBox. + // It works correctly for the first time when creating an image view + // but only when no 3d view is created. For the second time or if a + // 3d view is created it fails with an assert() inside the function + // QWindowPrivate::create because QWindowsIntegration::createPlatformWindow + // fails to create an instance of QPlatformWindow. + // The reason for the failure is that for the passed parent widget + // i.e. this ImageView the QPlatformWindow is also null. + // As said above it works the very first time because at construction time + // of GLImageBox it doesn't set the ImageView as parent but the parent of + // the ImageView, i.e. the main window. This mafic happens inside the + // function QWidgetPrivate::setParent_sys at this line: + // QWidget *parentWithWindow = + // newparent ? (newparent->windowHandle() ? newparent : newparent->nativeParentWidget()) : 0; + // where newparent->nativeParentWidget() returns the main window. + // For the second time this magic fails. Interesting in this context is + // that for the 3d view this magic always works. + // In order to fix this problem we directly pass the pointer of the parent + // of this ImageView, i.e. the main window. + // Note: + // Since Qt the class QGLWidget is marked as deprecated and should be + // replaced by QOpenGLWidget. + + _pGLImageBox = new GLImageBox(parent); +#else + _pGLImageBox = new GLImageBox(this); +#endif + setCentralWidget(_pGLImageBox); + // enable mouse tracking when moving even if no buttons are pressed setMouseTracking(true); @@ -49,10 +80,6 @@ ImageView::ImageView(QWidget* parent) // Create the default status bar for displaying messages enableStatusBar(true); - // Create an OpenGL widget for displaying images - _pGLImageBox = new GLImageBox(this); - setCentralWidget(_pGLImageBox); - _currMode = nothing; _currX = 0; _currY = 0; From 7fd367a396b2f5ecea0a2febdd32979a8479c944 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 21 Dec 2016 10:07:55 +0100 Subject: [PATCH 10/60] handle infinite lines and segments in OpenSCAD2Dgeom.superWireReverse --- src/Mod/OpenSCAD/OpenSCAD2Dgeom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py b/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py index 4502b94edace..26ba2ab60e61 100644 --- a/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py +++ b/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py @@ -461,7 +461,7 @@ def median(v1,v2): nexte[0].Vertexes[-1*(not nexte[1])].Point) else: p2 = curr[0].Vertexes[-1*(curr[1])].Point - if isinstance(curr[0].Curve,Part.LineSegment): + if isinstance(curr[0].Curve,(Part.LineSegment, Part.Line)): print "line",p1,p2 newedges.append(Part.LineSegment(p1,p2).toShape()) elif isinstance(curr[0].Curve,Part.Circle): From 1a20ead8da39276490bbe9ec8f5dfca68c32b916 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 21 Dec 2016 11:19:54 +0100 Subject: [PATCH 11/60] fix typos & whitespaces --- src/Gui/ViewProvider.cpp | 17 +++++++++-------- src/Gui/ViewProviderGroupExtension.cpp | 14 ++++++++------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/Gui/ViewProvider.cpp b/src/Gui/ViewProvider.cpp index 0c4147ce5df0..2241e87fd867 100644 --- a/src/Gui/ViewProvider.cpp +++ b/src/Gui/ViewProvider.cpp @@ -397,9 +397,8 @@ void ViewProvider::setModeSwitch() { if (viewOverrideMode == -1) pcModeSwitch->whichChild = _iActualMode; - else - if (viewOverrideMode < pcModeSwitch->getNumChildren()) - pcModeSwitch->whichChild = viewOverrideMode; + else if (viewOverrideMode < pcModeSwitch->getNumChildren()) + pcModeSwitch->whichChild = viewOverrideMode; } void ViewProvider::setDefaultMode(int val) @@ -533,7 +532,7 @@ bool ViewProvider::mouseButtonPressed(int button, bool pressed, (void)cursorPos; (void)viewer; return false; - } +} bool ViewProvider::onDelete(const vector< string >& subNames) { bool del = true; @@ -547,9 +546,10 @@ bool ViewProvider::onDelete(const vector< string >& subNames) { bool ViewProvider::canDragObject(App::DocumentObject* obj) const { auto vector = getExtensionsDerivedFromType(); - for(Gui::ViewProviderExtension* ext : vector) + for(Gui::ViewProviderExtension* ext : vector) { if(ext->extensionCanDragObject(obj)) return true; + } return false; } @@ -557,9 +557,10 @@ bool ViewProvider::canDragObject(App::DocumentObject* obj) const { bool ViewProvider::canDragObjects() const { auto vector = getExtensionsDerivedFromType(); - for(Gui::ViewProviderExtension* ext : vector) + for(Gui::ViewProviderExtension* ext : vector) { if(ext->extensionCanDragObjects()) return true; + } return false; } @@ -574,7 +575,7 @@ void ViewProvider::dragObject(App::DocumentObject* obj) { } } - throw Base::Exception("ViewProvider::dragObject: no extension for draging given object available."); + throw Base::Exception("ViewProvider::dragObject: no extension for dragging given object available."); } @@ -615,7 +616,7 @@ void ViewProvider::dropObject(App::DocumentObject* obj) { } } - throw Base::Exception("ViewProvider::dropObject: no extension for droping given object available."); + throw Base::Exception("ViewProvider::dropObject: no extension for dropping given object available."); } void ViewProvider::Restore(Base::XMLReader& reader) { diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 03050117b5e8..317073a6cbcb 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -46,7 +46,6 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGroupExtension, Gui::ViewProviderExte ViewProviderGroupExtension::ViewProviderGroupExtension() : visible(false) { initExtension(ViewProviderGroupExtension::getExtensionClassTypeId()); - } ViewProviderGroupExtension::~ViewProviderGroupExtension() @@ -77,7 +76,9 @@ bool ViewProviderGroupExtension::extensionCanDropObjects() const { bool ViewProviderGroupExtension::extensionCanDropObject(App::DocumentObject* obj) const { - Base::Console().Message("Check ViewProviderGroupExtension"); +#ifdef FC_DEBUG + Base::Console().Log("Check ViewProviderGroupExtension"); +#endif auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); @@ -86,12 +87,13 @@ bool ViewProviderGroupExtension::extensionCanDropObject(App::DocumentObject* obj return false; //group into group? - if (obj->hasExtension(App::GroupExtension::getExtensionClassTypeId())) - if (group->isChildOf(obj->getExtensionByType())) - return false; + if (obj->hasExtension(App::GroupExtension::getExtensionClassTypeId())) { + if (group->isChildOf(obj->getExtensionByType())) + return false; + } //We need to find the correct App extension to ask if this is a supported type, there should only be one - if(group->allowObject(obj)) + if (group->allowObject(obj)) return true; return false; From 7e82bd1d7db24ceaead657ec4ad3051e57b49c69 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 21 Dec 2016 11:39:26 +0100 Subject: [PATCH 12/60] fix drag and drop of boolean operations --- src/Mod/Part/Gui/ViewProviderBoolean.cpp | 20 ++++++++++++++++++++ src/Mod/Part/Gui/ViewProviderBoolean.h | 4 ++++ 2 files changed, 24 insertions(+) diff --git a/src/Mod/Part/Gui/ViewProviderBoolean.cpp b/src/Mod/Part/Gui/ViewProviderBoolean.cpp index e4cac431a408..b440f276c558 100644 --- a/src/Mod/Part/Gui/ViewProviderBoolean.cpp +++ b/src/Mod/Part/Gui/ViewProviderBoolean.cpp @@ -244,6 +244,11 @@ bool ViewProviderMultiFuse::canDragObjects() const return true; } +bool ViewProviderMultiFuse::canDragObject(App::DocumentObject* obj) const +{ + return obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId()); +} + void ViewProviderMultiFuse::dragObject(App::DocumentObject* obj) { Part::MultiFuse* pBool = static_cast(getObject()); @@ -262,6 +267,11 @@ bool ViewProviderMultiFuse::canDropObjects() const return true; } +bool ViewProviderMultiFuse::canDropObject(App::DocumentObject* obj) const +{ + return obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId()); +} + void ViewProviderMultiFuse::dropObject(App::DocumentObject* obj) { Part::MultiFuse* pBool = static_cast(getObject()); @@ -363,6 +373,11 @@ bool ViewProviderMultiCommon::canDragObjects() const return true; } +bool ViewProviderMultiCommon::canDragObject(App::DocumentObject* obj) const +{ + return obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId()); +} + void ViewProviderMultiCommon::dragObject(App::DocumentObject* obj) { Part::MultiCommon* pBool = static_cast(getObject()); @@ -381,6 +396,11 @@ bool ViewProviderMultiCommon::canDropObjects() const return true; } +bool ViewProviderMultiCommon::canDropObject(App::DocumentObject* obj) const +{ + return obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId()); +} + void ViewProviderMultiCommon::dropObject(App::DocumentObject* obj) { Part::MultiCommon* pBool = static_cast(getObject()); diff --git a/src/Mod/Part/Gui/ViewProviderBoolean.h b/src/Mod/Part/Gui/ViewProviderBoolean.h index f3a0f09cd0ba..3c379309abab 100644 --- a/src/Mod/Part/Gui/ViewProviderBoolean.h +++ b/src/Mod/Part/Gui/ViewProviderBoolean.h @@ -65,8 +65,10 @@ class PartGuiExport ViewProviderMultiFuse : public ViewProviderPart /// drag and drop bool canDragObjects() const; + bool canDragObject(App::DocumentObject*) const; void dragObject(App::DocumentObject*); bool canDropObjects() const; + bool canDropObject(App::DocumentObject*) const; void dropObject(App::DocumentObject*); }; @@ -89,8 +91,10 @@ class PartGuiExport ViewProviderMultiCommon : public ViewProviderPart /// drag and drop bool canDragObjects() const; + bool canDragObject(App::DocumentObject*) const; void dragObject(App::DocumentObject*); bool canDropObjects() const; + bool canDropObject(App::DocumentObject*) const; void dropObject(App::DocumentObject*); }; From 0cddd742559d6afae205ccec65cfdb4d5830c3cd Mon Sep 17 00:00:00 2001 From: kgoao Date: Tue, 20 Dec 2016 18:10:03 +0100 Subject: [PATCH 13/60] FEM: FemConstraintTemperature: Add CFLUX option to temperature constraint --- src/Mod/Fem/App/FemConstraintTemperature.cpp | 6 ++ src/Mod/Fem/App/FemConstraintTemperature.h | 2 + src/Mod/Fem/FemInputWriterCcx.py | 12 ++- src/Mod/Fem/Gui/Command.cpp | 2 +- .../Fem/Gui/TaskFemConstraintTemperature.cpp | 79 +++++++++++++++++-- .../Fem/Gui/TaskFemConstraintTemperature.h | 6 +- .../Fem/Gui/TaskFemConstraintTemperature.ui | 30 ++++++- 7 files changed, 124 insertions(+), 13 deletions(-) diff --git a/src/Mod/Fem/App/FemConstraintTemperature.cpp b/src/Mod/Fem/App/FemConstraintTemperature.cpp index 1d010ed3b38d..3846be44e3ff 100644 --- a/src/Mod/Fem/App/FemConstraintTemperature.cpp +++ b/src/Mod/Fem/App/FemConstraintTemperature.cpp @@ -42,9 +42,15 @@ using namespace Fem; PROPERTY_SOURCE(Fem::ConstraintTemperature, Fem::Constraint); +static const char* ConstraintTypes[] = {"CFlux","Temperature", NULL}; + ConstraintTemperature::ConstraintTemperature() { ADD_PROPERTY(Temperature,(300.0)); + ADD_PROPERTY(CFlux,(0.0)); + ADD_PROPERTY_TYPE(ConstraintType,(1),"ConstraintTemperature",(App::PropertyType)(App::Prop_None), + "Type of constraint, temperature or concentrated heat flux"); + ConstraintType.setEnums(ConstraintTypes); ADD_PROPERTY_TYPE(Points,(Base::Vector3d()),"ConstraintTemperature",App::PropertyType(App::Prop_ReadOnly|App::Prop_Output), "Points where symbols are drawn"); diff --git a/src/Mod/Fem/App/FemConstraintTemperature.h b/src/Mod/Fem/App/FemConstraintTemperature.h index cce8b58ec894..f7c2a6dc9e0b 100644 --- a/src/Mod/Fem/App/FemConstraintTemperature.h +++ b/src/Mod/Fem/App/FemConstraintTemperature.h @@ -46,6 +46,8 @@ class AppFemExport ConstraintTemperature : public Fem::Constraint //Temperature parameters App::PropertyFloat Temperature; + App::PropertyFloat CFlux; + App::PropertyEnumeration ConstraintType; /// recalculate the object diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 283da75e62c8..102fa47edb44 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -802,9 +802,15 @@ def write_constraints_temperature(self, f): f.write('** written by {} function\n'.format(sys._getframe().f_code.co_name)) for ftobj in self.temperature_objects: fixedtemp_obj = ftobj['Object'] - f.write('*BOUNDARY\n') - f.write('{},11,11,{}\n'.format(fixedtemp_obj.Name, fixedtemp_obj.Temperature)) - f.write('\n') + NumberOfNodes = len(ftobj['Nodes']) + if fixedtemp_obj.ConstraintType == "Temperature": + f.write('*BOUNDARY\n') + f.write('{},11,11,{}\n'.format(fixedtemp_obj.Name, fixedtemp_obj.Temperature)) + f.write('\n') + elif fixedtemp_obj.ConstraintType == "CFlux": + f.write('*CFLUX\n') + f.write('{},11,{}\n'.format(fixedtemp_obj.Name, fixedtemp_obj.CFlux / NumberOfNodes)) + f.write('\n') def write_constraints_heatflux(self, f): f.write('\n***********************************************************\n') diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index b5480e208cbf..9d8616abc7d4 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -798,7 +798,7 @@ CmdFemConstraintTemperature::CmdFemConstraintTemperature() sAppModule = "Fem"; sGroup = QT_TR_NOOP("Fem"); sMenuText = QT_TR_NOOP("Constraint temperature "); - sToolTipText = QT_TR_NOOP("Creates a FEM constraint for a temperature acting on a face"); + sToolTipText = QT_TR_NOOP("Creates a FEM constraint for a temperature/concentrated heat flux acting on a face"); sWhatsThis = "Fem_ConstraintTemperature"; sStatusTip = sToolTipText; sPixmap = "fem-constraint-temperature"; diff --git a/src/Mod/Fem/Gui/TaskFemConstraintTemperature.cpp b/src/Mod/Fem/Gui/TaskFemConstraintTemperature.cpp index 5804cd90ca3e..42c0d8f2eb24 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintTemperature.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintTemperature.cpp @@ -73,6 +73,11 @@ TaskFemConstraintTemperature::TaskFemConstraintTemperature(ViewProviderFemConstr connect(ui->lw_references, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(setSelection(QListWidgetItem*))); + connect(ui->rb_temperature, SIGNAL(clicked(bool)), this, SLOT(Temp())); + connect(ui->rb_cflux, SIGNAL(clicked(bool)), this, SLOT(Flux())); + + connect(ui->if_temperature, SIGNAL(valueChanged(double)), + this, SLOT(onTempCfluxChanged(double))); this->groupLayout()->addWidget(proxy); @@ -85,8 +90,23 @@ TaskFemConstraintTemperature::TaskFemConstraintTemperature(ViewProviderFemConstr // Fill data into dialog elements ui->if_temperature->setMinimum(0); ui->if_temperature->setMaximum(FLOAT_MAX); - Base::Quantity t = Base::Quantity(pcConstraint->Temperature.getValue(), Base::Unit::Temperature); - ui->if_temperature->setValue(t); + + std::string constraint_type = pcConstraint->ConstraintType.getValueAsString(); + if (constraint_type == "Temperature") { + ui->rb_temperature->setChecked(1); + std::string str = "Temperature"; + QString qstr = QString::fromStdString(str); + ui->lbl_type->setText(qstr); + Base::Quantity t = Base::Quantity(pcConstraint->Temperature.getValue(), Base::Unit::Temperature); + ui->if_temperature->setValue(t); + } else if (constraint_type == "CFlux") { + ui->rb_cflux->setChecked(1); + std::string str = "Concentrated heat flux"; + QString qstr = QString::fromStdString(str); + ui->lbl_type->setText(qstr); + Base::Quantity c = Base::Quantity(pcConstraint->CFlux.getValue(), Base::Unit::Power); + ui->if_temperature->setValue(c); + } ui->lw_references->clear(); for (std::size_t i = 0; i < Objects.size(); i++) { @@ -117,6 +137,42 @@ void TaskFemConstraintTemperature::updateUI() } } +void TaskFemConstraintTemperature::onTempCfluxChanged(double val) +{ + Fem::ConstraintTemperature* pcConstraint = static_cast(ConstraintView->getObject()); + if (ui->rb_temperature->isChecked()) { + pcConstraint->Temperature.setValue(val); + } else { + pcConstraint->CFlux.setValue(val); + } +} + +void TaskFemConstraintTemperature::Temp() +{ + Fem::ConstraintTemperature* pcConstraint = static_cast(ConstraintView->getObject()); + std::string name = ConstraintView->getObject()->getNameInDocument(); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.ConstraintType = %s",name.c_str(), get_constraint_type().c_str()); + std::string str = "Temperature"; + QString qstr = QString::fromStdString(str); + ui->lbl_type->setText(qstr); + Base::Quantity t = Base::Quantity(300, Base::Unit::Temperature); + ui->if_temperature->setValue(t); + pcConstraint->Temperature.setValue(300); +} + +void TaskFemConstraintTemperature::Flux() +{ + Fem::ConstraintTemperature* pcConstraint = static_cast(ConstraintView->getObject()); + std::string name = ConstraintView->getObject()->getNameInDocument(); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.ConstraintType = %s",name.c_str(), get_constraint_type().c_str()); + std::string str = "Concentrated heat flux"; + QString qstr = QString::fromStdString(str); + ui->lbl_type->setText(qstr); + Base::Quantity c = Base::Quantity(0, Base::Unit::Power); + ui->if_temperature->setValue(c); + pcConstraint->CFlux.setValue(0); +} + void TaskFemConstraintTemperature::addToSelection() { std::vector selection = Gui::Selection().getSelectionEx(); //gets vector of selected objects of active document @@ -255,6 +311,22 @@ double TaskFemConstraintTemperature::get_temperature() const{ return temperature_in_kelvin; } +double TaskFemConstraintTemperature::get_cflux() const{ + Base::Quantity cflux = ui->if_temperature->getQuantity(); + double cflux_in_watt = cflux.getValueAs(Base::Quantity::Watt); + return cflux_in_watt; +} + +std::string TaskFemConstraintTemperature::get_constraint_type(void) const { + std::string type; + if (ui->rb_temperature->isChecked()) { + type = "\"Temperature\""; + } else if (ui->rb_cflux->isChecked()) { + type = "\"CFlux\""; + } + return type; +} + void TaskFemConstraintTemperature::changeEvent(QEvent *) { // TaskBox::changeEvent(e); @@ -297,9 +369,6 @@ bool TaskDlgFemConstraintTemperature::accept() const TaskFemConstraintTemperature* parameterTemperature = static_cast(parameter); try { - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Temperature = %f", - name.c_str(), parameterTemperature->get_temperature()); - std::string scale = parameterTemperature->getScale(); //OvG: determine modified scale Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Scale = %s", name.c_str(), scale.c_str()); //OvG: implement modified scale } diff --git a/src/Mod/Fem/Gui/TaskFemConstraintTemperature.h b/src/Mod/Fem/Gui/TaskFemConstraintTemperature.h index 9559e30adf07..f7aa7e47a3fc 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintTemperature.h +++ b/src/Mod/Fem/Gui/TaskFemConstraintTemperature.h @@ -52,10 +52,14 @@ class TaskFemConstraintTemperature : public TaskFemConstraint ~TaskFemConstraintTemperature(); const std::string getReferences() const; double get_temperature()const; + double get_cflux() const; + std::string get_constraint_type(void) const; private Q_SLOTS: void onReferenceDeleted(void); - + void onTempCfluxChanged(double val); + void Temp(); + void Flux(); void addToSelection(); void removeFromSelection(); void setSelection(QListWidgetItem* item); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintTemperature.ui b/src/Mod/Fem/Gui/TaskFemConstraintTemperature.ui index 426b9eb8fa93..5180f7240663 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintTemperature.ui +++ b/src/Mod/Fem/Gui/TaskFemConstraintTemperature.ui @@ -6,8 +6,8 @@ 0 0 - 309 - 233 + 503 + 340 @@ -42,10 +42,34 @@ + + + + + + Temperature + + + true + + + false + + + + + + + Concentrated heat flux + + + + + - + Temperature From 96a705dc7d6c9f69ffb4a6a47ebb41dcb3cdf8cd Mon Sep 17 00:00:00 2001 From: kgoao Date: Tue, 20 Dec 2016 18:10:20 +0100 Subject: [PATCH 14/60] FEM: FemConstraintHeatflux: Add DFLUX option to heat flux constraint --- src/Base/Unit.cpp | 4 +- src/Base/Unit.h | 1 + src/Gui/DlgUnitsCalculatorImp.cpp | 2 +- src/Mod/Fem/App/FemConstraintHeatflux.cpp | 6 + src/Mod/Fem/App/FemConstraintHeatflux.h | 3 + src/Mod/Fem/FemInputWriterCcx.py | 29 +++-- src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp | 66 +++++++++- src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h | 5 +- src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui | 116 +++++++++++++----- 9 files changed, 187 insertions(+), 45 deletions(-) diff --git a/src/Base/Unit.cpp b/src/Base/Unit.cpp index 6fd5f55460de..f0315b5528cd 100644 --- a/src/Base/Unit.cpp +++ b/src/Base/Unit.cpp @@ -485,7 +485,8 @@ QString Unit::getTypeString(void) const if(*this == Unit::ThermalExpansionCoefficient ) return QString::fromLatin1("ThermalExpansionCoefficient"); else if(*this == Unit::SpecificHeat ) return QString::fromLatin1("SpecificHeat"); else if(*this == Unit::ThermalTransferCoefficient ) return QString::fromLatin1("ThermalTransferCoefficient"); else - + if(*this == Unit::HeatFluxDensity ) return QString::fromLatin1("HeatFluxDensity"); else + return QString(); } @@ -517,3 +518,4 @@ Unit Unit::ThermalConductivity (1,1,-3,0,-1); Unit Unit::ThermalExpansionCoefficient (0,0,0,0,-1); Unit Unit::SpecificHeat (2,0,-2,0,-1); Unit Unit::ThermalTransferCoefficient (0,1,-3,0,-1); +Unit Unit::HeatFluxDensity (0,1,-3,0,0); diff --git a/src/Base/Unit.h b/src/Base/Unit.h index 65c213e0eeec..00ab80230943 100644 --- a/src/Base/Unit.h +++ b/src/Base/Unit.h @@ -120,6 +120,7 @@ class BaseExport Unit static Unit ThermalExpansionCoefficient; static Unit SpecificHeat; static Unit ThermalTransferCoefficient; + static Unit HeatFluxDensity; //@} protected: diff --git a/src/Gui/DlgUnitsCalculatorImp.cpp b/src/Gui/DlgUnitsCalculatorImp.cpp index f25e1a23c27f..f6deb02cdba8 100644 --- a/src/Gui/DlgUnitsCalculatorImp.cpp +++ b/src/Gui/DlgUnitsCalculatorImp.cpp @@ -71,7 +71,7 @@ DlgUnitsCalculator::DlgUnitsCalculator( QWidget* parent, Qt::WindowFlags fl ) << Base::Unit::AmountOfSubstance << Base::Unit::LuminoseIntensity << Base::Unit::Stress << Base::Unit::Pressure << Base::Unit::Force << Base::Unit::Work << Base::Unit::Power << Base::Unit::ThermalConductivity << Base::Unit::ThermalExpansionCoefficient - << Base::Unit::SpecificHeat << Base::Unit::ThermalTransferCoefficient; + << Base::Unit::SpecificHeat << Base::Unit::ThermalTransferCoefficient <::iterator it = units.begin(); it != units.end(); ++it) { ui->unitsBox->addItem(it->getTypeString()); } diff --git a/src/Mod/Fem/App/FemConstraintHeatflux.cpp b/src/Mod/Fem/App/FemConstraintHeatflux.cpp index 02b4632d4c56..86068f6d7e84 100644 --- a/src/Mod/Fem/App/FemConstraintHeatflux.cpp +++ b/src/Mod/Fem/App/FemConstraintHeatflux.cpp @@ -41,11 +41,17 @@ using namespace Fem; PROPERTY_SOURCE(Fem::ConstraintHeatflux, Fem::Constraint); +static const char* ConstraintTypes[] = {"DFlux","Convection", NULL}; + ConstraintHeatflux::ConstraintHeatflux() { ADD_PROPERTY(AmbientTemp,(0.0)); /*ADD_PROPERTY(FaceTemp,(0.0));*/ ADD_PROPERTY(FilmCoef,(0.0)); + ADD_PROPERTY(DFlux,(0.0)); + ADD_PROPERTY_TYPE(ConstraintType,(1),"ConstraintHeatflux",(App::PropertyType)(App::Prop_None), + "Type of constraint, surface convection or surface heat flux"); + ConstraintType.setEnums(ConstraintTypes); ADD_PROPERTY_TYPE(Points,(Base::Vector3d()),"ConstraintHeatflux",App::PropertyType(App::Prop_ReadOnly|App::Prop_Output), "Points where symbols are drawn"); diff --git a/src/Mod/Fem/App/FemConstraintHeatflux.h b/src/Mod/Fem/App/FemConstraintHeatflux.h index 4d74f4bcd677..035cc84c08be 100644 --- a/src/Mod/Fem/App/FemConstraintHeatflux.h +++ b/src/Mod/Fem/App/FemConstraintHeatflux.h @@ -41,6 +41,9 @@ class AppFemExport ConstraintHeatflux : public Fem::Constraint App::PropertyFloat AmbientTemp; /*App::PropertyFloat FaceTemp;*/ App::PropertyFloat FilmCoef; + App::PropertyFloat DFlux; + App::PropertyEnumeration ConstraintType; + App::PropertyVectorList Points; App::PropertyVectorList Normals; diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 102fa47edb44..85ac5a9132ac 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -818,15 +818,26 @@ def write_constraints_heatflux(self, f): f.write('** written by {} function\n'.format(sys._getframe().f_code.co_name)) for hfobj in self.heatflux_objects: heatflux_obj = hfobj['Object'] - f.write('*FILM\n') - for o, elem_tup in heatflux_obj.References: - for elem in elem_tup: - ho = o.Shape.getElement(elem) - if ho.ShapeType == 'Face': - v = self.mesh_object.FemMesh.getccxVolumesByFace(ho) - f.write("** Heat flux on face {}\n".format(elem)) - for i in v: - f.write("{},F{},{},{}\n".format(i[0], i[1], heatflux_obj.AmbientTemp, heatflux_obj.FilmCoef * 0.001)) # SvdW add factor to force heatflux to units system of t/mm/s/K # OvG: Only write out the VolumeIDs linked to a particular face + if heatflux_obj.ConstraintType == "Convection": + f.write('*FILM\n') + for o, elem_tup in heatflux_obj.References: + for elem in elem_tup: + ho = o.Shape.getElement(elem) + if ho.ShapeType == 'Face': + v = self.mesh_object.FemMesh.getccxVolumesByFace(ho) + f.write("** Heat flux on face {}\n".format(elem)) + for i in v: + f.write("{},F{},{},{}\n".format(i[0], i[1], heatflux_obj.AmbientTemp, heatflux_obj.FilmCoef * 0.001)) # SvdW add factor to force heatflux to units system of t/mm/s/K # OvG: Only write out the VolumeIDs linked to a particular face + elif heatflux_obj.ConstraintType == "DFlux": + f.write('*DFLUX\n') + for o, elem_tup in heatflux_obj.References: + for elem in elem_tup: + ho = o.Shape.getElement(elem) + if ho.ShapeType == 'Face': + v = self.mesh_object.FemMesh.getccxVolumesByFace(ho) + f.write("** Heat flux on face {}\n".format(elem)) + for i in v: + f.write("{},S{},{}\n".format(i[0], i[1], heatflux_obj.DFlux)) def write_outputs_types(self, f): f.write('\n***********************************************************\n') diff --git a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp index fff52529de3c..42c11354a649 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp @@ -65,6 +65,11 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(ViewProviderFemConstraintHe ui->lw_references->addAction(action); ui->lw_references->setContextMenuPolicy(Qt::ActionsContextMenu); + connect(ui->rb_convection, SIGNAL(clicked(bool)), this, SLOT(Conv())); + connect(ui->rb_dflux, SIGNAL(clicked(bool)), this, SLOT(Flux())); + + connect(ui->if_heatflux, SIGNAL(valueChanged(double)), + this, SLOT(onHeatFluxChanged(double))); connect(ui->if_ambienttemp, SIGNAL(valueChanged(double)), this, SLOT(onAmbientTempChanged(double))); //connect(ui->if_facetemp, SIGNAL(valueChanged(double)), @@ -90,13 +95,24 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(ViewProviderFemConstraintHe // Fill data into dialog elements ui->if_ambienttemp->setMinimum(0); ui->if_ambienttemp->setMaximum(FLOAT_MAX); - Base::Quantity t = Base::Quantity(pcConstraint->AmbientTemp.getValue(), Base::Unit::Temperature); - ui->if_ambienttemp->setValue(t); ui->if_filmcoef->setMinimum(0); ui->if_filmcoef->setMaximum(FLOAT_MAX); - Base::Quantity f = Base::Quantity(pcConstraint->FilmCoef.getValue(), Base::Unit::ThermalTransferCoefficient); - ui->if_filmcoef->setValue(f); + + std::string constraint_type = pcConstraint->ConstraintType.getValueAsString(); + if (constraint_type == "Convection") { + ui->rb_convection->setChecked(1); + ui->sw_heatflux->setCurrentIndex(0); + Base::Quantity t = Base::Quantity(pcConstraint->AmbientTemp.getValue(), Base::Unit::Temperature); + ui->if_ambienttemp->setValue(t); + Base::Quantity f = Base::Quantity(pcConstraint->FilmCoef.getValue(), Base::Unit::ThermalTransferCoefficient); + ui->if_filmcoef->setValue(f); + } else if (constraint_type == "DFlux") { + ui->rb_dflux->setChecked(1); + ui->sw_heatflux->setCurrentIndex(1); + Base::Quantity c = Base::Quantity(pcConstraint->DFlux.getValue(), Base::Unit::HeatFluxDensity); + ui->if_heatflux->setValue(c); + } ui->lw_references->clear(); for (std::size_t i = 0; i < Objects.size(); i++) { @@ -154,6 +170,38 @@ void TaskFemConstraintHeatflux::onFilmCoefChanged(double val) pcConstraint->FilmCoef.setValue(val); // [W]/[[m^2]/[K]] } +void TaskFemConstraintHeatflux::onHeatFluxChanged(double val) +{ + Fem::ConstraintHeatflux* pcConstraint = static_cast(ConstraintView->getObject()); + pcConstraint->DFlux.setValue(val); + +} + +void TaskFemConstraintHeatflux::Conv() +{ + Fem::ConstraintHeatflux* pcConstraint = static_cast(ConstraintView->getObject()); + std::string name = ConstraintView->getObject()->getNameInDocument(); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.ConstraintType = %s",name.c_str(), get_constraint_type().c_str()); + Base::Quantity t = Base::Quantity(300, Base::Unit::Temperature); + ui->if_ambienttemp->setValue(t); + pcConstraint->AmbientTemp.setValue(300); + Base::Quantity f = Base::Quantity(10, Base::Unit::ThermalTransferCoefficient); + ui->if_filmcoef->setValue(f); + pcConstraint->FilmCoef.setValue(10); + ui->sw_heatflux->setCurrentIndex(0); +} + +void TaskFemConstraintHeatflux::Flux() +{ + Fem::ConstraintHeatflux* pcConstraint = static_cast(ConstraintView->getObject()); + std::string name = ConstraintView->getObject()->getNameInDocument(); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.ConstraintType = %s",name.c_str(), get_constraint_type().c_str()); + Base::Quantity c = Base::Quantity(0, Base::Unit::HeatFluxDensity); + ui->if_heatflux->setValue(c); + pcConstraint->DFlux.setValue(0); + ui->sw_heatflux->setCurrentIndex(1); +} + void TaskFemConstraintHeatflux::addToSelection() { std::vector selection = Gui::Selection().getSelectionEx(); //gets vector of selected objects of active document @@ -327,6 +375,16 @@ double TaskFemConstraintHeatflux::getFilmCoef(void) const return filmcoef_in_units; } +std::string TaskFemConstraintHeatflux::get_constraint_type(void) const { + std::string type; + if (ui->rb_convection->isChecked()) { + type = "\"Convection\""; + } else if (ui->rb_dflux->isChecked()) { + type = "\"DFlux\""; + } + return type; +} + void TaskFemConstraintHeatflux::changeEvent(QEvent *e) { TaskBox::changeEvent(e); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h index 086ccc436936..4d0e0d46a107 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h +++ b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h @@ -53,6 +53,7 @@ class TaskFemConstraintHeatflux : public TaskFemConstraint double getAmbientTemp(void) const; /*double getFaceTemp(void) const;*/ double getFilmCoef(void) const; + std::string get_constraint_type(void) const; virtual const std::string getReferences() const; private Q_SLOTS: @@ -60,7 +61,9 @@ private Q_SLOTS: void onAmbientTempChanged(double val); /*void onFaceTempChanged(double val);*/ void onFilmCoefChanged(double val); - + void onHeatFluxChanged(double val); + void Conv(); + void Flux(); void addToSelection(); void removeFromSelection(); void setSelection(QListWidgetItem* item); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui index 28feb3078c41..7c78b140af7e 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui +++ b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui @@ -7,13 +7,13 @@ 0 0 379 - 400 + 531 TaskFemConstraintHeatflux - + @@ -43,46 +43,104 @@ - + - + - Ambient Temperature + Surface Convection - + - 300 K - - - K + Surface heat flux - - - - - Film coefficient - - - - - - - 1 W/m^2/K - - - W/m^2/K - - - - + + + 1 + + + + + + + + + + + Film coefficient + + + + + + + 1 W/m^2/K + + + W/m^2/K + + + + + + + + + + + Ambient Temperature + + + + + + + 300 K + + + K + + + + + + + + + + + + + + + + + Surface heat flux + + + + + + + 300 K + + + K + + + + + + + + From 9a3b750fb7d1381050494e27c341216efa9217d7 Mon Sep 17 00:00:00 2001 From: vdwalts Date: Tue, 20 Dec 2016 18:10:25 +0100 Subject: [PATCH 15/60] Base: Units for FEM, new heat and heat flux functions --- src/Base/Unit.cpp | 4 ++-- src/Base/Unit.h | 2 +- src/Base/UnitsSchemaCentimeters.cpp | 8 ++++++++ src/Base/UnitsSchemaInternal.cpp | 8 ++++++++ src/Base/UnitsSchemaMKS.cpp | 8 ++++++++ src/Gui/DlgUnitsCalculatorImp.cpp | 2 +- src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp | 4 ++-- 7 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/Base/Unit.cpp b/src/Base/Unit.cpp index f0315b5528cd..72d7876eb2d6 100644 --- a/src/Base/Unit.cpp +++ b/src/Base/Unit.cpp @@ -485,7 +485,7 @@ QString Unit::getTypeString(void) const if(*this == Unit::ThermalExpansionCoefficient ) return QString::fromLatin1("ThermalExpansionCoefficient"); else if(*this == Unit::SpecificHeat ) return QString::fromLatin1("SpecificHeat"); else if(*this == Unit::ThermalTransferCoefficient ) return QString::fromLatin1("ThermalTransferCoefficient"); else - if(*this == Unit::HeatFluxDensity ) return QString::fromLatin1("HeatFluxDensity"); else + if(*this == Unit::HeatFlux ) return QString::fromLatin1("HeatFlux"); else return QString(); @@ -518,4 +518,4 @@ Unit Unit::ThermalConductivity (1,1,-3,0,-1); Unit Unit::ThermalExpansionCoefficient (0,0,0,0,-1); Unit Unit::SpecificHeat (2,0,-2,0,-1); Unit Unit::ThermalTransferCoefficient (0,1,-3,0,-1); -Unit Unit::HeatFluxDensity (0,1,-3,0,0); +Unit Unit::HeatFlux (0,1,-3,0,0); diff --git a/src/Base/Unit.h b/src/Base/Unit.h index 00ab80230943..2e3475b8329d 100644 --- a/src/Base/Unit.h +++ b/src/Base/Unit.h @@ -120,7 +120,7 @@ class BaseExport Unit static Unit ThermalExpansionCoefficient; static Unit SpecificHeat; static Unit ThermalTransferCoefficient; - static Unit HeatFluxDensity; + static Unit HeatFlux; //@} protected: diff --git a/src/Base/UnitsSchemaCentimeters.cpp b/src/Base/UnitsSchemaCentimeters.cpp index 57e98a0bfbfa..aeac683cca10 100644 --- a/src/Base/UnitsSchemaCentimeters.cpp +++ b/src/Base/UnitsSchemaCentimeters.cpp @@ -54,6 +54,14 @@ QString UnitsSchemaCentimeters::schemaTranslate(const Base::Quantity& quant, dou unitString = QString::fromLatin1("m^3"); factor = 1000000000.0; } + else if (unit == Unit::Power) { + unitString = QString::fromLatin1("W"); + factor = 1000000; + } + else if (unit == Unit::HeatFlux) { + unitString = QString::fromLatin1("W/m^2"); + factor = 1.0; + } else { // default action for all cases without special treatment: unitString = quant.getUnit().getString(); diff --git a/src/Base/UnitsSchemaInternal.cpp b/src/Base/UnitsSchemaInternal.cpp index 411a446ece4f..09a7e285d181 100644 --- a/src/Base/UnitsSchemaInternal.cpp +++ b/src/Base/UnitsSchemaInternal.cpp @@ -155,6 +155,14 @@ QString UnitsSchemaInternal::schemaTranslate(const Quantity &quant, double &fact factor = 0.001; } } + else if (unit == Unit::Power) { + unitString = QString::fromLatin1("W"); + factor = 1000000; + } + else if (unit == Unit::HeatFlux) { + unitString = QString::fromLatin1("W/m^2"); + factor = 1.0; + } else { // default action for all cases without special treatment: unitString = quant.getUnit().getString(); diff --git a/src/Base/UnitsSchemaMKS.cpp b/src/Base/UnitsSchemaMKS.cpp index 22c223f1a5e7..1f37b71a6060 100644 --- a/src/Base/UnitsSchemaMKS.cpp +++ b/src/Base/UnitsSchemaMKS.cpp @@ -156,6 +156,14 @@ QString UnitsSchemaMKS::schemaTranslate(const Quantity &quant, double &factor, Q unitString = QString::fromLatin1("W/m^2/K"); factor = 1.0; } + else if (unit == Unit::Power) { + unitString = QString::fromLatin1("W"); + factor = 1000000; + } + else if (unit == Unit::HeatFlux) { + unitString = QString::fromLatin1("W/m^2"); + factor = 1.0; + } else { // default action for all cases without special treatment: unitString = quant.getUnit().getString(); diff --git a/src/Gui/DlgUnitsCalculatorImp.cpp b/src/Gui/DlgUnitsCalculatorImp.cpp index f6deb02cdba8..50bf4378c495 100644 --- a/src/Gui/DlgUnitsCalculatorImp.cpp +++ b/src/Gui/DlgUnitsCalculatorImp.cpp @@ -71,7 +71,7 @@ DlgUnitsCalculator::DlgUnitsCalculator( QWidget* parent, Qt::WindowFlags fl ) << Base::Unit::AmountOfSubstance << Base::Unit::LuminoseIntensity << Base::Unit::Stress << Base::Unit::Pressure << Base::Unit::Force << Base::Unit::Work << Base::Unit::Power << Base::Unit::ThermalConductivity << Base::Unit::ThermalExpansionCoefficient - << Base::Unit::SpecificHeat << Base::Unit::ThermalTransferCoefficient <::iterator it = units.begin(); it != units.end(); ++it) { ui->unitsBox->addItem(it->getTypeString()); } diff --git a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp index 42c11354a649..344b8d32ba15 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp @@ -110,7 +110,7 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(ViewProviderFemConstraintHe } else if (constraint_type == "DFlux") { ui->rb_dflux->setChecked(1); ui->sw_heatflux->setCurrentIndex(1); - Base::Quantity c = Base::Quantity(pcConstraint->DFlux.getValue(), Base::Unit::HeatFluxDensity); + Base::Quantity c = Base::Quantity(pcConstraint->DFlux.getValue(), Base::Unit::HeatFlux); ui->if_heatflux->setValue(c); } @@ -196,7 +196,7 @@ void TaskFemConstraintHeatflux::Flux() Fem::ConstraintHeatflux* pcConstraint = static_cast(ConstraintView->getObject()); std::string name = ConstraintView->getObject()->getNameInDocument(); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.ConstraintType = %s",name.c_str(), get_constraint_type().c_str()); - Base::Quantity c = Base::Quantity(0, Base::Unit::HeatFluxDensity); + Base::Quantity c = Base::Quantity(0, Base::Unit::HeatFlux); ui->if_heatflux->setValue(c); pcConstraint->DFlux.setValue(0); ui->sw_heatflux->setCurrentIndex(1); From 46d8a643894869950e275074ae658faec520ec07 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:10:28 +0100 Subject: [PATCH 16/60] Base: units, code formating --- src/Base/UnitsSchemaCentimeters.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Base/UnitsSchemaCentimeters.cpp b/src/Base/UnitsSchemaCentimeters.cpp index aeac683cca10..88b19b96dcc1 100644 --- a/src/Base/UnitsSchemaCentimeters.cpp +++ b/src/Base/UnitsSchemaCentimeters.cpp @@ -67,6 +67,6 @@ QString UnitsSchemaCentimeters::schemaTranslate(const Base::Quantity& quant, dou unitString = quant.getUnit().getString(); factor = 1.0; } - + return toLocale(quant, factor, unitString); } From 9e12af32da8da5991c7abca26596af4cf8ce6f34 Mon Sep 17 00:00:00 2001 From: mkhizenz Date: Tue, 20 Dec 2016 18:10:32 +0100 Subject: [PATCH 17/60] FEM: DataAlongLine: Icon --- src/Mod/Fem/Gui/Command.cpp | 28 ++++++++++++++++-- src/Mod/Fem/Gui/Resources/Fem.qrc | 7 +++-- .../Gui/Resources/icons/fem-DataAlongLine.png | Bin 0 -> 1801 bytes src/Mod/Fem/Gui/Workbench.cpp | 1 + 4 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 src/Mod/Fem/Gui/Resources/icons/fem-DataAlongLine.png diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index 9d8616abc7d4..63e04959b915 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -471,7 +471,7 @@ void CmdFemConstraintTransform::activated(int) Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts - + updateActive(); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); @@ -602,7 +602,7 @@ void CmdFemConstraintFluidBoundary::activated(int) doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]", Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); - doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts + doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts updateActive(); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); @@ -1123,6 +1123,29 @@ bool CmdFemPostCreateClipFilter::isActive(void) return hasActiveDocument(); } +DEF_STD_CMD_A(CmdFemPostCreateDataAlongLineFilter); + +CmdFemPostCreateDataAlongLineFilter::CmdFemPostCreateDataAlongLineFilter() + : Command("Fem_PostCreateDataAlongLineFilter") +{ + sAppModule = "Fem"; + sGroup = QT_TR_NOOP("Fem"); + sMenuText = QT_TR_NOOP("Define/create a clip filter which clips a field along a line"); + sToolTipText = QT_TR_NOOP("Define/create a clip filter which clips a field along a line"); + sWhatsThis = "Fem_PostCreateDataAlongLineFilter"; + sStatusTip = sToolTipText; + sPixmap = "fem-DataAlongLine"; +} + +void CmdFemPostCreateDataAlongLineFilter::activated(int) +{ +} + +bool CmdFemPostCreateDataAlongLineFilter::isActive(void) +{ + return hasActiveDocument(); +} + DEF_STD_CMD_A(CmdFemPostCreateScalarClipFilter); CmdFemPostCreateScalarClipFilter::CmdFemPostCreateScalarClipFilter() @@ -1456,6 +1479,7 @@ void CreateFemCommands(void) rcCmdMgr.addCommand(new CmdFemConstraintTransform()); #ifdef FC_USE_VTK rcCmdMgr.addCommand(new CmdFemPostCreateClipFilter); + rcCmdMgr.addCommand(new CmdFemPostCreateDataAlongLineFilter); rcCmdMgr.addCommand(new CmdFemPostCreateScalarClipFilter); rcCmdMgr.addCommand(new CmdFemPostWarpVectorFilter); rcCmdMgr.addCommand(new CmdFemPostFunctions); diff --git a/src/Mod/Fem/Gui/Resources/Fem.qrc b/src/Mod/Fem/Gui/Resources/Fem.qrc index 79eec3a0b7f0..7e09420d64ef 100755 --- a/src/Mod/Fem/Gui/Resources/Fem.qrc +++ b/src/Mod/Fem/Gui/Resources/Fem.qrc @@ -1,5 +1,5 @@ - + icons/fem-add-fem-mesh.svg icons/fem-add-material.svg icons/fem-add-part.svg @@ -48,6 +48,7 @@ icons/preferences-fem.svg icons/fem-clip.png + icons/fem-DataAlongLine.png icons/fem-clip-scalar.png icons/fem-cut.png icons/fem-isosurface.png @@ -55,7 +56,7 @@ translations/Fem_af.qm translations/Fem_de.qm - translations/Fem_fi.qm + translations/Fem_fi.qm translations/Fem_fr.qm translations/Fem_hr.qm translations/Fem_it.qm @@ -80,4 +81,4 @@ translations/Fem_el.qm translations/Fem_sl.qm - + diff --git a/src/Mod/Fem/Gui/Resources/icons/fem-DataAlongLine.png b/src/Mod/Fem/Gui/Resources/icons/fem-DataAlongLine.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b4551b764b73970dfebeb1530c6376e6183f98 GIT binary patch literal 1801 zcmX|>cR1UN8pnT1a8+%G);yeQt*TMGHA;wHHOeDGS`n$L6%t|`<5)#wUE`o?#)xCZ z5z^37+~zu{ow%sf-jZ9@60|4%!+qZ8o!`&J-Ot11JrMex*+`uYCm9$cXa+&KzMivv&$pFMupfgRr03y%UtYe%;PZ_>%vE} z!Wf!pxF28sz58J+O!7Lj2Ya-(*y-N;t*|?~H(o5UdikW6)Z%U46Z=u&AZ!({B%G2C z9&jIBs`H3r&YQ&buh4YX-GaOzU2TTxC1*}y+W@i59RYy#_{#hA*_RxZJ>{wNrvn?trYx22YGXWldT0y=@ z-Af3^pE-!q_q^eSj1@CbISVm!ZRvzhUWv&m`!?dg6a!`F^G&3zVUw4XBESl~sdtxi z(_K&A+I>mOJ6jtfhj+d)F{yvxfVO|8*f1C4E+&o_ESHY={E7BwTF(t@D<#y1i$Gvi z=OUY3Oi5SHLZ}ii6DMB<7MVn|+YCB>*?_rs-P+ID1={H4->U_nxBUE#e>EDb{d_6M z=|#$ENN}#`7}X#xRWbt1l9OgAdj5pGO?||G8_EyM7!~W?QQsUfr9_Q<5&@Vohm{01 z6DfCtgNIpTt1ps2kLm{9;q%;TJ4;8n{x&vlUSY8-;=_lxgx4V4YljP1Mtdel(+ypX zGC6RQ!>=b{I-p;AqIiWG`)hCnQgwUD#2MV1!Jc~Cw#K{mAI~F?{Hn?vr+5z~P^VJl zaSupQQF3hs)4A>Yy8V&xK*30KrGi+N-Ib&k_8%68lSbDpzy2XleM~hVL+SemCB_Sg zPhWkecm$9sP1wR279Rma)g$$(%DelL=&$`A`F7YkHCHtpEz)>kHQF+6g>o@hbq{LQ z(!PjH$h*7~6=^@tU323V-bWRiO56!G)cPPbonaI^XTi8ubTcYLwwyKN*3({HGvOAo zvrDTp|8OujjUgX4FGM4+fR2BDDrf$1QMz_xhUYIOYLaAywd**05i;90=IpvTEX`Ax z!dU-3N(Jn2{dl)_AT%?xzMaq!q=c?Iob|_PG3A%Yaig#}jTZe7M}`+CwPQQV`Yulm zQh;jSJHsey*i>B^r&AhKg5i?vWzy#AyuV$0>&TgeGnImWbx=pbLXIWvvJJD}=o$^; zz4V9dBWGh(-Vu_d_z#7ug|4=~!(tPDpXWF3un`911;KA*!`u#mz6L9cCjt~;h33?s z>A$X37RO)}-DXHkZRvHf9ZFRdvq{tRlcsqk#Nx}LD7vbIhYcaFFkOhwf$p$4tcYMB zP2{pwuM6*PXgU0^h~yK}S+f!8zFrAYB=Bn*vE>lTUcpKzLT?r8;0iO-Gt;4gkinJM zc*;l4aBE;q|0zl*P2Vh)V%XYUe%e-gyrYxL)Xq>>oy<^^PkO7|BI!&E3zHW>dgF~{ zSD<6}#GaGsQX&=fw>^8{2l=4-l#R&KtyDQ+^uzs%z z!e?Th30qB=NdQDqIigb+bgy%tzB<+xiVZ*_O_8DK= Date: Tue, 20 Dec 2016 18:10:35 +0100 Subject: [PATCH 18/60] FEM: DataAlongLine: core implementation --- src/Mod/Fem/App/AppFem.cpp | 3 +- src/Mod/Fem/App/FemPostFilter.cpp | 132 +++++++- src/Mod/Fem/App/FemPostFilter.h | 35 ++ src/Mod/Fem/Gui/AppFemGui.cpp | 1 + src/Mod/Fem/Gui/CMakeLists.txt | 4 +- src/Mod/Fem/Gui/Command.cpp | 1 + src/Mod/Fem/Gui/TaskPostBoxes.cpp | 312 +++++++++++++++++- src/Mod/Fem/Gui/TaskPostBoxes.h | 80 ++++- src/Mod/Fem/Gui/TaskPostDataAlongLine.ui | 286 ++++++++++++++++ src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp | 18 + src/Mod/Fem/Gui/ViewProviderFemPostFilter.h | 12 + src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp | 7 +- 12 files changed, 878 insertions(+), 13 deletions(-) create mode 100644 src/Mod/Fem/Gui/TaskPostDataAlongLine.ui diff --git a/src/Mod/Fem/App/AppFem.cpp b/src/Mod/Fem/App/AppFem.cpp index f70df02c0030..96d025287ad8 100644 --- a/src/Mod/Fem/App/AppFem.cpp +++ b/src/Mod/Fem/App/AppFem.cpp @@ -162,7 +162,7 @@ PyMODINIT_FUNC initFem() Fem::ConstraintContact ::init(); Fem::ConstraintFluidBoundary ::init(); Fem::ConstraintTransform ::init(); - + Fem::FemResultObject ::init(); Fem::FemResultObjectPython ::init(); Fem::FemSolverObject ::init(); @@ -173,6 +173,7 @@ PyMODINIT_FUNC initFem() Fem::FemPostPipeline ::init(); Fem::FemPostFilter ::init(); Fem::FemPostClipFilter ::init(); + Fem::FemPostDataAlongLineFilter ::init(); Fem::FemPostScalarClipFilter ::init(); Fem::FemPostWarpVectorFilter ::init(); Fem::FemPostCutFilter ::init(); diff --git a/src/Mod/Fem/App/FemPostFilter.cpp b/src/Mod/Fem/App/FemPostFilter.cpp index cbf900035e40..dbc0a295100c 100644 --- a/src/Mod/Fem/App/FemPostFilter.cpp +++ b/src/Mod/Fem/App/FemPostFilter.cpp @@ -68,12 +68,21 @@ void FemPostFilter::setActiveFilterPipeline(std::string name) { DocumentObjectExecReturn* FemPostFilter::execute(void) { if(!m_pipelines.empty() && !m_activePipeline.empty()) { - FemPostFilter::FilterPipeline& pipe = m_pipelines[m_activePipeline]; - pipe.source->SetInputDataObject(getInputData()); - pipe.target->Update(); + if (m_activePipeline.length() >= 13) { + std::string LineClip = m_activePipeline.substr(0,13); + if (LineClip == "DataAlongLine") { + pipe.filterSource->SetSourceData(getInputData()); + pipe.filterTarget->Update(); + + Data.setValue(pipe.filterTarget->GetOutputDataObject(0)); + } + } else { + pipe.source->SetInputDataObject(getInputData()); + pipe.target->Update(); + Data.setValue(pipe.target->GetOutputDataObject(0)); + } - Data.setValue(pipe.target->GetOutputDataObject(0)); } return StdReturn; } @@ -171,6 +180,121 @@ DocumentObjectExecReturn* FemPostClipFilter::execute(void) { return Fem::FemPostFilter::execute(); } +PROPERTY_SOURCE(Fem::FemPostDataAlongLineFilter, Fem::FemPostFilter) + +FemPostDataAlongLineFilter::FemPostDataAlongLineFilter(void) : FemPostFilter() { + + ADD_PROPERTY_TYPE(Point1,(Base::Vector3d(0.0,0.0,0.0)), "DataAlongLine", App::Prop_None, "The point 1 used to define end point of line"); + ADD_PROPERTY_TYPE(Point2,(Base::Vector3d(0.0,0.0,1.0)), "DataAlongLine", App::Prop_None, "The point 2 used to define end point of line"); + ADD_PROPERTY_TYPE(Resolution,(100), "DataAlongLine", App::Prop_None, "The number of intervals between the 2 end points of line"); + ADD_PROPERTY_TYPE(XAxisData,(0), "DataAlongLine",App::Prop_None,"X axis data values used for plotting"); + ADD_PROPERTY_TYPE(YAxisData,(0), "DataAlongLine",App::Prop_None,"Y axis data values used for plotting"); + ADD_PROPERTY_TYPE(PlotData ,(""),"DataAlongLine",App::Prop_None,"Field used for plotting"); + + PlotData.setStatus(App::Property::ReadOnly, true); + XAxisData.setStatus(App::Property::ReadOnly, true); + YAxisData.setStatus(App::Property::ReadOnly, true); + + FilterPipeline clip; + + m_line = vtkSmartPointer::New(); + const Base::Vector3d& vec1 = Point1.getValue(); + m_line->SetPoint1(vec1.x, vec1.y, vec1.z); + const Base::Vector3d& vec2 = Point2.getValue(); + m_line->SetPoint2(vec2.x, vec2.y, vec2.z); + m_line->SetResolution(Resolution.getValue()); + + + m_probe = vtkSmartPointer::New(); + m_probe->SetInputConnection(m_line->GetOutputPort()); + m_probe->SetValidPointMaskArrayName("ValidPointArray"); + m_probe->SetPassPointArrays(1); + m_probe->SetPassCellArrays(1); + m_probe->ComputeToleranceOff(); + m_probe->SetTolerance(0.01); + + clip.filterSource = m_probe; + clip.filterTarget = m_probe; + + addFilterPipeline(clip, "DataAlongLine"); + setActiveFilterPipeline("DataAlongLine"); +} + +FemPostDataAlongLineFilter::~FemPostDataAlongLineFilter() { + +} + +DocumentObjectExecReturn* FemPostDataAlongLineFilter::execute(void) { + + //recalculate the filter + return Fem::FemPostFilter::execute(); +} + + +void FemPostDataAlongLineFilter::onChanged(const Property* prop) { + if(prop == &Point1) { + const Base::Vector3d& vec1 = Point1.getValue(); + m_line->SetPoint1(vec1.x, vec1.y, vec1.z); + } + else if(prop == &Point2) { + const Base::Vector3d& vec2 = Point2.getValue(); + m_line->SetPoint2(vec2.x, vec2.y, vec2.z); + } + else if(prop == &Resolution) { + m_line->SetResolution(Resolution.getValue()); + } + else if(prop == &PlotData) { + GetAxisData(); + } + Fem::FemPostFilter::onChanged(prop); +} + +short int FemPostDataAlongLineFilter::mustExecute(void) const { + + if(Point1.isTouched() || + Point2.isTouched() || + Resolution.isTouched()){ + + return 1; + } + else return App::DocumentObject::mustExecute(); +} + +void FemPostDataAlongLineFilter::GetAxisData() { + + std::vector coords; + std::vector values; + + vtkSmartPointer data = m_probe->GetOutputDataObject(0); + vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + vtkDataArray* pdata = dset->GetPointData()->GetArray(PlotData.getValue()); + vtkDataArray *tcoords = dset->GetPointData()->GetTCoords("Texture Coordinates"); + + int component = 0; + + const Base::Vector3d& vec1 = Point1.getValue(); + const Base::Vector3d& vec2 = Point2.getValue(); + const Base::Vector3d diff = vec1 - vec2; + double Len = diff.Length(); + + for(int i=0; iGetNumberOfPoints(); ++i) { + + double value = 0; + if(pdata->GetNumberOfComponents() == 1) + value = pdata->GetComponent(i, component); + else { + for(int j=0; jGetNumberOfComponents(); ++j) + value += std::pow(pdata->GetComponent(i, j),2); + + value = std::sqrt(value); + } + values.push_back(value); + double tcoord = tcoords->GetComponent(i, component); + coords.push_back(tcoord*Len); + } + YAxisData.setValues(values); + XAxisData.setValues(coords); +} PROPERTY_SOURCE(Fem::FemPostScalarClipFilter, Fem::FemPostFilter) diff --git a/src/Mod/Fem/App/FemPostFilter.h b/src/Mod/Fem/App/FemPostFilter.h index 52d59ffcb73e..b2e59377a4a5 100644 --- a/src/Mod/Fem/App/FemPostFilter.h +++ b/src/Mod/Fem/App/FemPostFilter.h @@ -35,6 +35,9 @@ #include #include #include +#include +#include +#include namespace Fem { @@ -58,6 +61,7 @@ class AppFemExport FemPostFilter : public Fem::FemPostObject //pipeline handling for derived filter struct FilterPipeline { vtkSmartPointer source, target; + vtkSmartPointer filterSource, filterTarget; std::vector > algorithmStorage; }; @@ -96,6 +100,37 @@ class AppFemExport FemPostClipFilter : public FemPostFilter { vtkSmartPointer m_extractor; }; +class AppFemExport FemPostDataAlongLineFilter : public FemPostFilter { + + PROPERTY_HEADER(Fem::FemPostDataAlongLineFilter); + +public: + FemPostDataAlongLineFilter(void); + virtual ~FemPostDataAlongLineFilter(); + + App::PropertyVector Point2; + App::PropertyVector Point1; + App::PropertyInteger Resolution; + App::PropertyFloatList XAxisData; + App::PropertyFloatList YAxisData; + App::PropertyString PlotData; + + virtual const char* getViewProviderName(void) const { + return "FemGui::ViewProviderFemPostDataAlongLine"; + } + virtual short int mustExecute(void) const; + +protected: + virtual App::DocumentObjectExecReturn* execute(void); + virtual void onChanged(const App::Property* prop); + void GetAxisData(); + +private: + + vtkSmartPointer m_line; + vtkSmartPointer m_probe; + +}; class AppFemExport FemPostScalarClipFilter : public FemPostFilter { diff --git a/src/Mod/Fem/Gui/AppFemGui.cpp b/src/Mod/Fem/Gui/AppFemGui.cpp index e8bb5266d132..c8f5f42b1494 100644 --- a/src/Mod/Fem/Gui/AppFemGui.cpp +++ b/src/Mod/Fem/Gui/AppFemGui.cpp @@ -146,6 +146,7 @@ PyMODINIT_FUNC initFemGui() FemGui::ViewProviderFemPostPlaneFunction ::init(); FemGui::ViewProviderFemPostSphereFunction ::init(); FemGui::ViewProviderFemPostClip ::init(); + FemGui::ViewProviderFemPostDataAlongLine ::init(); FemGui::ViewProviderFemPostScalarClip ::init(); FemGui::ViewProviderFemPostWarpVector ::init(); FemGui::ViewProviderFemPostCut ::init(); diff --git a/src/Mod/Fem/Gui/CMakeLists.txt b/src/Mod/Fem/Gui/CMakeLists.txt index 195a0c002d4a..1f6779479a88 100755 --- a/src/Mod/Fem/Gui/CMakeLists.txt +++ b/src/Mod/Fem/Gui/CMakeLists.txt @@ -53,7 +53,7 @@ set(FemGui_MOC_HDRS TaskFemConstraintBearing.h TaskFemConstraintFixed.h TaskFemConstraintForce.h - TaskFemConstraintFluidBoundary.h + TaskFemConstraintFluidBoundary.h TaskFemConstraintPressure.h TaskFemConstraintGear.h TaskFemConstraintPulley.h @@ -109,6 +109,7 @@ if(BUILD_FEM_VTK) ${FemGui_UIC_SRCS} TaskPostDisplay.ui TaskPostClip.ui + TaskPostDataAlongLine.ui TaskPostScalarClip.ui TaskPostWarpVector.ui TaskPostCut.ui @@ -270,6 +271,7 @@ if(BUILD_FEM_VTK) PlaneWidget.ui SphereWidget.ui TaskPostClip.ui + TaskPostDataAlongLine.ui TaskPostScalarClip.ui TaskPostDisplay.ui TaskPostWarpVector.ui diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index 63e04959b915..ba42f52350cb 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -1139,6 +1139,7 @@ CmdFemPostCreateDataAlongLineFilter::CmdFemPostCreateDataAlongLineFilter() void CmdFemPostCreateDataAlongLineFilter::activated(int) { + setupFilter(this, "DataAlongLine"); } bool CmdFemPostCreateDataAlongLineFilter::isActive(void) diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.cpp b/src/Mod/Fem/Gui/TaskPostBoxes.cpp index 9d91cbc27d20..279005deba15 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.cpp +++ b/src/Mod/Fem/Gui/TaskPostBoxes.cpp @@ -28,6 +28,7 @@ #include "ui_TaskPostDisplay.h" #include "ui_TaskPostClip.h" +#include "ui_TaskPostDataAlongLine.h" #include "ui_TaskPostScalarClip.h" #include "ui_TaskPostWarpVector.h" #include "ui_TaskPostCut.h" @@ -45,10 +46,98 @@ #include #include #include +#include +#include +# include + +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#include +#include + +#include +#include +#include using namespace FemGui; using namespace Gui; +// ---------------------------------------------------------------------------- + +PointMarker::PointMarker(Gui::View3DInventorViewer* iv, std::string ObjName) : view(iv), + vp(new ViewProviderPointMarker) +{ + view->addViewProvider(vp); + m_name = ObjName; +} + +PointMarker::~PointMarker() +{ + view->removeViewProvider(vp); + delete vp; +} + +void PointMarker::addPoint(const SbVec3f& pt) +{ + int ct = countPoints(); + vp->pCoords->point.set1Value(ct, pt); +} + +int PointMarker::countPoints() const +{ + return vp->pCoords->point.getNum(); +} + +void PointMarker::customEvent(QEvent*) +{ + const SbVec3f& pt1 = vp->pCoords->point[0]; + const SbVec3f& pt2 = vp->pCoords->point[1]; + + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Point1 = App.Vector(%f, %f, %f)", m_name.c_str(), pt1[0],pt1[1], pt1[2]); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Point2 = App.Vector(%f, %f, %f)", m_name.c_str(), pt2[0],pt2[1], pt2[2]); + Gui::Command::doCommand(Gui::Command::Doc, ObjectInvisible().c_str()); + PointsChanged(pt1[0],pt1[1], pt1[2], pt2[0],pt2[1], pt2[2]); +} + +std::string PointMarker::ObjectInvisible(){ +return "for amesh in App.activeDocument().Objects:\n\ + if \"Mesh\" in amesh.TypeId:\n\ + aparttoshow = amesh.Name.replace(\"_Mesh\",\"\")\n\ + for apart in App.activeDocument().Objects:\n\ + if aparttoshow == apart.Name:\n\ + apart.ViewObject.Visibility = False\n"; +} + +PROPERTY_SOURCE(FemGui::ViewProviderPointMarker, Gui::ViewProviderDocumentObject) + +ViewProviderPointMarker::ViewProviderPointMarker() +{ + pCoords = new SoCoordinate3(); + pCoords->ref(); + pCoords->point.setNum(0); + + SoGroup* grp = new SoGroup(); + grp->addChild(pCoords); + addDisplayMaskMode(grp, "Base"); + setDisplayMaskMode("Base"); +} + +ViewProviderPointMarker::~ViewProviderPointMarker() +{ + pCoords->unref(); +} + //************************************************************************** //************************************************************************** // TaskDialog @@ -129,8 +218,6 @@ void TaskDlgPost::modifyStandardButtons(QDialogButtonBox* box) { if(box->button(QDialogButtonBox::Apply)) box->button(QDialogButtonBox::Apply)->setDefault(true); } - - //############################################################################################ TaskPostBox::TaskPostBox(Gui::ViewProviderDocumentObject* view, const QPixmap &icon, const QString &title, QWidget* parent) @@ -161,8 +248,9 @@ void TaskPostBox::updateEnumerationList(App::PropertyEnumeration& prop, QComboBo box->clear(); QStringList list; std::vector vec = prop.getEnumVector(); - for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it ) + for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it ) { list.push_back(QString::fromStdString(*it)); + } box->insertItems(0, list); box->setCurrentIndex(prop.getValue()); @@ -221,7 +309,7 @@ void TaskPostDisplay::applyPythonCode() { //############################################################################################ -TaskPostFunction::TaskPostFunction(ViewProviderDocumentObject* view, QWidget* parent): TaskPostBox(view, Gui::BitmapFactory().pixmap("fem-femmesh-create-node-by-poly"), tr("Implicit function"), parent) { +TaskPostFunction::TaskPostFunction(ViewProviderDocumentObject* view, QWidget* parent): TaskPostBox(view, Gui::BitmapFactory().pixmap("fem-fem-mesh-create-node-by-poly"), tr("Implicit function"), parent) { assert(view->isDerivedFrom(ViewProviderFemPostFunction::getClassTypeId())); @@ -359,6 +447,222 @@ void TaskPostClip::on_InsideOut_toggled(bool val) { static_cast(getObject())->InsideOut.setValue(val); recompute(); } +//############################################################################################ + +TaskPostDataAlongLine::TaskPostDataAlongLine(ViewProviderDocumentObject* view, QWidget* parent) + : TaskPostBox(view,Gui::BitmapFactory().pixmap("fem-femmesh-create-node-by-poly"), tr("Data Along Line"), parent) { + + assert(view->isDerivedFrom(ViewProviderFemPostDataAlongLine::getClassTypeId())); + + //we load the views widget + proxy = new QWidget(this); + ui = new Ui_TaskPostDataAlongLine(); + ui->setupUi(proxy); + + QMetaObject::connectSlotsByName(this); + this->groupLayout()->addWidget(proxy); + + const Base::Vector3d& vec1 = static_cast(getObject())->Point1.getValue(); + ui->point1X->setValue(vec1.x); + ui->point1Y->setValue(vec1.y); + ui->point1Z->setValue(vec1.z); + + const Base::Vector3d& vec2 = static_cast(getObject())->Point2.getValue(); + ui->point2X->setValue(vec2.x); + ui->point2Y->setValue(vec2.y); + ui->point2Z->setValue(vec2.z); + + int res = static_cast(getObject())->Resolution.getValue(); + ui->resolution->setValue(res); + + connect(ui->point1X, SIGNAL(valueChanged(double)), this, SLOT(point1Changed(double))); + connect(ui->point1Y, SIGNAL(valueChanged(double)), this, SLOT(point1Changed(double))); + connect(ui->point1Z, SIGNAL(valueChanged(double)), this, SLOT(point1Changed(double))); + connect(ui->point2X, SIGNAL(valueChanged(double)), this, SLOT(point2Changed(double))); + connect(ui->point2Y, SIGNAL(valueChanged(double)), this, SLOT(point2Changed(double))); + connect(ui->point2Z, SIGNAL(valueChanged(double)), this, SLOT(point2Changed(double))); + connect(ui->resolution, SIGNAL(valueChanged(int)), this, SLOT(resolutionChanged(int))); + + //update all fields + updateEnumerationList(getTypedView()->DisplayMode, ui->Representation); + updateEnumerationList(getTypedView()->Field, ui->Field); + updateEnumerationList(getTypedView()->VectorMode, ui->VectorMode); +} + +TaskPostDataAlongLine::~TaskPostDataAlongLine() { + +} + +void TaskPostDataAlongLine::applyPythonCode() { + +} + +static const char * cursor_triangle[] = { +"32 32 3 1", +" c None", +". c #FFFFFF", +"+ c #FF0000", +" . ", +" . ", +" . ", +" . ", +" . ", +" ", +"..... ..... ", +" ", +" . ", +" . ", +" . ++ ", +" . + + ", +" . + ++ + ", +" + ++++ + ", +" + ++ ++ + ", +" + ++++++++ + ", +" ++ ++ ++ ++ "}; + +void TaskPostDataAlongLine::on_SelectPoints_clicked() { + + Gui::Command::doCommand(Gui::Command::Doc, ObjectVisible().c_str()); + Gui::Document* doc = Gui::Application::Instance->activeDocument(); + Gui::View3DInventor* view = static_cast(doc->getActiveView()); + if (view) { + Gui::View3DInventorViewer* viewer = view->getViewer(); + viewer->setEditing(true); + viewer->setEditingCursor(QCursor(QPixmap(cursor_triangle), 7, 7)); + + // Derives from QObject and we have a parent object, so we don't + // require a delete. + std::string ObjName = static_cast(getObject())->Label.getValue(); + + FemGui::PointMarker* marker = new FemGui::PointMarker(viewer, ObjName); + viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), + FemGui::TaskPostDataAlongLine::pointCallback, marker); + connect(marker, SIGNAL(PointsChanged(double, double, double, double, double, double)), this, SLOT(onChange(double, double, double, double, double, double))); + } + +} + +std::string TaskPostDataAlongLine::ObjectVisible(){ +return "for amesh in App.activeDocument().Objects:\n\ + if \"Mesh\" in amesh.TypeId:\n\ + aparttoshow = amesh.Name.replace(\"_Mesh\",\"\")\n\ + for apart in App.activeDocument().Objects:\n\ + if aparttoshow == apart.Name:\n\ + apart.ViewObject.Visibility = True\n"; +} + +void TaskPostDataAlongLine::on_CreatePlot_clicked() { + + std::string ObjName = static_cast(getObject())->Label.getValue(); + Gui::Command::doCommand(Gui::Command::Doc,"x = App.ActiveDocument.%s.XAxisData",ObjName.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"y = App.ActiveDocument.%s.YAxisData",ObjName.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"title = App.ActiveDocument.%s.PlotData",ObjName.c_str()); + Gui::Command::doCommand(Gui::Command::Doc, Plot().c_str()); + recompute(); +} + +void TaskPostDataAlongLine::onChange(double x1, double y1, double z1, double x2, double y2, double z2) { + + ui->point2X->setValue(x2); + ui->point2Y->setValue(y2); + ui->point2Z->setValue(z2); + + ui->point1X->setValue(x1); + ui->point1Y->setValue(y1); + ui->point1Z->setValue(z1); + +} + +void TaskPostDataAlongLine::point1Changed(double) { + + Base::Vector3d vec(ui->point1X->value(), ui->point1Y->value(), ui->point1Z->value()); + std::string ObjName = static_cast(getObject())->Label.getValue(); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Point1 = App.Vector(%f, %f, %f)",ObjName.c_str(), ui->point1X->value(), ui->point1Y->value(), ui->point1Z->value()); + + +} + +void TaskPostDataAlongLine::point2Changed(double) { + + Base::Vector3d vec(ui->point2X->value(), ui->point2Y->value(), ui->point2Z->value()); + std::string ObjName = static_cast(getObject())->Label.getValue(); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Point2 = App.Vector(%f, %f, %f)", ObjName.c_str(), ui->point2X->value(), ui->point2Y->value(), ui->point2Z->value()); + +} + +void TaskPostDataAlongLine::resolutionChanged(int val) { + + static_cast(getObject())->Resolution.setValue(val); + +} + +void TaskPostDataAlongLine::pointCallback(void * ud, SoEventCallback * n) +{ + const SoMouseButtonEvent * mbe = static_cast(n->getEvent()); + Gui::View3DInventorViewer* view = reinterpret_cast(n->getUserData()); + PointMarker *pm = reinterpret_cast(ud); + + // Mark all incoming mouse button events as handled, especially, to deactivate the selection node + n->getAction()->setHandled(); + + if (mbe->getButton() == SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::DOWN) { + const SoPickedPoint * point = n->getPickedPoint(); + if (point == NULL) { + Base::Console().Message("No point picked.\n"); + return; + } + + n->setHandled(); + pm->addPoint(point->getPoint()); + if (pm->countPoints() == 2) { + QEvent *e = new QEvent(QEvent::User); + QApplication::postEvent(pm, e); + // leave mode + view->setEditing(false); + view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pointCallback, ud); + } + } + else if (mbe->getButton() != SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::UP) { + n->setHandled(); + view->setEditing(false); + view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pointCallback, ud); + pm->deleteLater(); + } +} + +void TaskPostDataAlongLine::on_Representation_activated(int i) { + + getTypedView()->DisplayMode.setValue(i); + updateEnumerationList(getTypedView()->Field, ui->Field); + updateEnumerationList(getTypedView()->VectorMode, ui->VectorMode); +} + +void TaskPostDataAlongLine::on_Field_activated(int i) { + + getTypedView()->Field.setValue(i); + std::string FieldName = ui->Field->currentText().toStdString(); + static_cast(getObject())->PlotData.setValue(FieldName); + updateEnumerationList(getTypedView()->VectorMode, ui->VectorMode); +} + +void TaskPostDataAlongLine::on_VectorMode_activated(int i) { + + getTypedView()->VectorMode.setValue(i); +} + +std::string TaskPostDataAlongLine::Plot() { + return "import FreeCAD\n\ +import numpy as np\n\ +from matplotlib import pyplot as plt\n\ +plt.figure(1)\n\ +plt.plot(x, y)\n\ +plt.xlabel(\"Length\")\n\ +plt.ylabel(title)\n\ +plt.title(title)\n\ +plt.grid()\n\ +plt.show()\n"; + +} //############################################################################################ diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.h b/src/Mod/Fem/Gui/TaskPostBoxes.h index aa768153563c..ebab074cf563 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.h +++ b/src/Mod/Fem/Gui/TaskPostBoxes.h @@ -30,17 +30,66 @@ #include #include #include "ViewProviderFemPostFunction.h" +#include class QComboBox; class Ui_TaskPostDisplay; class Ui_TaskPostClip; +class Ui_TaskPostDataAlongLine; class Ui_TaskPostScalarClip; class Ui_TaskPostWarpVector; class Ui_TaskPostCut; +class SoFontStyle; +class SoText2; +class SoBaseColor; +class SoTranslation; +class SoCoordinate3; +class SoIndexedLineSet; +class SoEventCallback; +class SoMarkerSet; + namespace FemGui { +class ViewProviderPointMarker; +class PointMarker : public QObject +{ + Q_OBJECT + +public: + PointMarker(Gui::View3DInventorViewer* view, std::string ObjName); + ~PointMarker(); + + void addPoint(const SbVec3f&); + int countPoints() const; + +Q_SIGNALS: + void PointsChanged(double x1, double y1, double z1, double x2, double y2, double z2); + +protected: + void customEvent(QEvent* e); + +private: + Gui::View3DInventorViewer *view; + ViewProviderPointMarker *vp; + std::string m_name; + std::string ObjectInvisible(); +}; + +class FemGuiExport ViewProviderPointMarker : public Gui::ViewProviderDocumentObject +{ + PROPERTY_HEADER(FemGui::ViewProviderPointMarker); + +public: + ViewProviderPointMarker(); + virtual ~ViewProviderPointMarker(); + +protected: + SoCoordinate3 * pCoords; + friend class PointMarker; +}; + class TaskPostBox : public Gui::TaskView::TaskBox { Q_OBJECT @@ -105,7 +154,6 @@ class TaskDlgPost : public Gui::TaskView::TaskDialog std::vector m_boxes; }; - class TaskPostDisplay : public TaskPostBox { Q_OBJECT @@ -164,6 +212,36 @@ private Q_SLOTS: FunctionWidget* fwidget; }; +class TaskPostDataAlongLine: public TaskPostBox { + + Q_OBJECT + +public: + TaskPostDataAlongLine(Gui::ViewProviderDocumentObject* view, QWidget* parent = 0); + virtual ~TaskPostDataAlongLine(); + + virtual void applyPythonCode(); + static void pointCallback(void * ud, SoEventCallback * n); + +private Q_SLOTS: + void on_SelectPoints_clicked(); + void on_CreatePlot_clicked(); + void on_Representation_activated(int i); + void on_Field_activated(int i); + void on_VectorMode_activated(int i); + void point2Changed(double); + void point1Changed(double); + void resolutionChanged(int val); + void onChange(double x1, double y1, double z1, double x2, double y2, double z2); + + +private: + std::string Plot(); + std::string ObjectVisible(); + QWidget* proxy; + Ui_TaskPostDataAlongLine* ui; +}; + class TaskPostScalarClip : public TaskPostBox { Q_OBJECT diff --git a/src/Mod/Fem/Gui/TaskPostDataAlongLine.ui b/src/Mod/Fem/Gui/TaskPostDataAlongLine.ui new file mode 100644 index 000000000000..7c80824e2ae3 --- /dev/null +++ b/src/Mod/Fem/Gui/TaskPostDataAlongLine.ui @@ -0,0 +1,286 @@ + + + TaskPostDataAlongLine + + + + 0 + 0 + 482 + 363 + + + + Form + + + + + + Qt::Horizontal + + + + + + + + + Point1 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + + + + + + + + + Point2 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + + + + + + + Select Points + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Resolution + + + + + + + 999999999 + + + + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + Mode + + + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Field + + + + + + + + + + Vector + + + + + + + + + + + + Qt::Horizontal + + + + + + + Create Plot + + + + + SelectPoints + line + line_2 + line_3 + CreatePlot + + + + diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp index 6698d8bd61dc..a5832a899240 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp @@ -51,6 +51,24 @@ void ViewProviderFemPostClip::setupTaskDialog(TaskDlgPost* dlg) { FemGui::ViewProviderFemPostObject::setupTaskDialog(dlg); } +PROPERTY_SOURCE(FemGui::ViewProviderFemPostDataAlongLine, FemGui::ViewProviderFemPostObject) + +ViewProviderFemPostDataAlongLine::ViewProviderFemPostDataAlongLine() { + + sPixmap = "fem-DataAlongLine"; +} + +ViewProviderFemPostDataAlongLine::~ViewProviderFemPostDataAlongLine() { + +} + +void ViewProviderFemPostDataAlongLine::setupTaskDialog(TaskDlgPost* dlg) { + + //add the function box + dlg->appendBox(new TaskPostDataAlongLine(dlg->getView())); + +} + PROPERTY_SOURCE(FemGui::ViewProviderFemPostScalarClip, FemGui::ViewProviderFemPostObject) diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h index 396ba89998cf..426b0afd9a9a 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h @@ -42,6 +42,18 @@ class FemGuiExport ViewProviderFemPostClip : public ViewProviderFemPostObject { virtual void setupTaskDialog(TaskDlgPost* dlg); }; +class FemGuiExport ViewProviderFemPostDataAlongLine : public ViewProviderFemPostObject { + + PROPERTY_HEADER(FemGui::ViewProviderFemPostDataAlongLine); + +public: + /// constructor. + ViewProviderFemPostDataAlongLine(); + ~ViewProviderFemPostDataAlongLine(); + +protected: + virtual void setupTaskDialog(TaskDlgPost* dlg); +}; class FemGuiExport ViewProviderFemPostScalarClip : public ViewProviderFemPostObject { PROPERTY_HEADER(FemGui::ViewProviderFemPostScalarClip); diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp index fa8fedf2bf15..65f6b0745c78 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp @@ -247,8 +247,11 @@ void ViewProviderFemPostObject::updateProperties() { colorArrays.push_back("None"); vtkPointData* point = poly->GetPointData(); - for(int i=0; iGetNumberOfArrays(); ++i) - colorArrays.push_back(point->GetArrayName(i)); + for(int i=0; iGetNumberOfArrays(); ++i) { + std::string FieldName = point->GetArrayName(i); + if (FieldName != "Texture Coordinates") + colorArrays.push_back(FieldName); + } vtkCellData* cell = poly->GetCellData(); for(int i=0; iGetNumberOfArrays(); ++i) From b7e4259676d002d16d285a6000ed874c8661a92b Mon Sep 17 00:00:00 2001 From: mkhizenz Date: Tue, 20 Dec 2016 18:10:39 +0100 Subject: [PATCH 19/60] FEM: LinearizedStress: Icon --- src/Mod/Fem/Gui/Command.cpp | 25 ++ src/Mod/Fem/Gui/Resources/Fem.qrc | 1 + .../icons/fem-linearizedstresses.svg | 273 ++++++++++++++++++ src/Mod/Fem/Gui/Workbench.cpp | 1 + 4 files changed, 300 insertions(+) create mode 100644 src/Mod/Fem/Gui/Resources/icons/fem-linearizedstresses.svg diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index ba42f52350cb..f60dcac90f8a 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -1147,6 +1147,30 @@ bool CmdFemPostCreateDataAlongLineFilter::isActive(void) return hasActiveDocument(); } +DEF_STD_CMD_A(CmdFemPostCreateLinearizedStressesFilter); + +CmdFemPostCreateLinearizedStressesFilter::CmdFemPostCreateLinearizedStressesFilter() + : Command("Fem_PostCreateLinearizedStressesFilter") +{ + sAppModule = "Fem"; + sGroup = QT_TR_NOOP("Fem"); + sMenuText = QT_TR_NOOP("Create stress linearization plots"); + sToolTipText = QT_TR_NOOP("Create stress linearization plots"); + sWhatsThis = "Fem_PostCreateLinearizedStressesFilter"; + sStatusTip = sToolTipText; + sPixmap = "fem-linearizedstresses"; +} + +void CmdFemPostCreateLinearizedStressesFilter::activated(int) +{ +} + +bool CmdFemPostCreateLinearizedStressesFilter::isActive(void) +{ + return hasActiveDocument(); +} + + DEF_STD_CMD_A(CmdFemPostCreateScalarClipFilter); CmdFemPostCreateScalarClipFilter::CmdFemPostCreateScalarClipFilter() @@ -1481,6 +1505,7 @@ void CreateFemCommands(void) #ifdef FC_USE_VTK rcCmdMgr.addCommand(new CmdFemPostCreateClipFilter); rcCmdMgr.addCommand(new CmdFemPostCreateDataAlongLineFilter); + rcCmdMgr.addCommand(new CmdFemPostCreateLinearizedStressesFilter); rcCmdMgr.addCommand(new CmdFemPostCreateScalarClipFilter); rcCmdMgr.addCommand(new CmdFemPostWarpVectorFilter); rcCmdMgr.addCommand(new CmdFemPostFunctions); diff --git a/src/Mod/Fem/Gui/Resources/Fem.qrc b/src/Mod/Fem/Gui/Resources/Fem.qrc index 7e09420d64ef..d3e5783831f3 100755 --- a/src/Mod/Fem/Gui/Resources/Fem.qrc +++ b/src/Mod/Fem/Gui/Resources/Fem.qrc @@ -54,6 +54,7 @@ icons/fem-isosurface.png icons/fem-warp.png + icons/fem-linearizedstresses.svg translations/Fem_af.qm translations/Fem_de.qm translations/Fem_fi.qm diff --git a/src/Mod/Fem/Gui/Resources/icons/fem-linearizedstresses.svg b/src/Mod/Fem/Gui/Resources/icons/fem-linearizedstresses.svg new file mode 100644 index 000000000000..ab6c08c6b941 --- /dev/null +++ b/src/Mod/Fem/Gui/Resources/icons/fem-linearizedstresses.svg @@ -0,0 +1,273 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T + M + B + + + diff --git a/src/Mod/Fem/Gui/Workbench.cpp b/src/Mod/Fem/Gui/Workbench.cpp index d52959b4dc33..01f0ef790131 100755 --- a/src/Mod/Fem/Gui/Workbench.cpp +++ b/src/Mod/Fem/Gui/Workbench.cpp @@ -104,6 +104,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const << "Fem_PostCreateCutFilter" << "Fem_PostCreateWarpVectorFilter" << "Fem_PostCreateDataAlongLineFilter" + << "Fem_PostCreateLinearizedStressesFilter" << "Separator" << "Fem_PostCreateFunctions"; #endif From d92b8ff8b23c4b3707cd4849050a5856e310ea73 Mon Sep 17 00:00:00 2001 From: mkhizenz Date: Tue, 20 Dec 2016 18:10:43 +0100 Subject: [PATCH 20/60] FEM: LinearizedStress: Core implementation --- src/Mod/Fem/Gui/Command.cpp | 70 ++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index f60dcac90f8a..fb3724e306fc 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -1099,6 +1099,53 @@ void setupFilter(Gui::Command* cmd, std::string Name) { }; +std::string Plot() { + +return "t=t_coords[len(t_coords)-1]\n\ +for i in range(len(t_coords)):\n\ + dum = t_coords[i]\n\ + t_coords[i] = dum - t_coords[len(t_coords)-1]*0.5\n\ +m = 0\n\ +for i in range(len(sValues)-1):\n\ + m = m +(t_coords[i+1] - t_coords[i])*(sValues[i+1]+sValues[i])\n\ +m = (1/t)*0.5*m\n\ +membrane = []\n\ +for i in range(len(sValues)):\n\ + membrane.append(m)\n\ +b = 0\n\ +for i in range(len(sValues)-1):\n\ + d = (t_coords[i+1] - t_coords[i])\n\ + b = b + d*(-3/t**2)*(sValues[i+1]*t_coords[i+1] + sValues[i]*t_coords[i])\n\ +b2 = -b\n\ +bending =[]\n\ +for i in range(len(t_coords)):\n\ + func = ((b2-b)/t)*t_coords[i]\n\ + bending.append(func)\n\ +peak = []\n\ +mb = []\n\ +for i in range(len(sValues)):\n\ + peak.append(sValues[i])\n\ + mb.append(bending[i] + membrane[0])\n\ +import FreeCAD\n\ +import numpy as np\n\ +from matplotlib import pyplot as plt\n\ +plt.figure(1)\n\ +plt.plot(t_coords, membrane, \"k--\")\n\ +plt.plot(t_coords, mb, \"b*-\")\n\ +plt.plot(t_coords, peak, \"r-x\")\n\ +plt.annotate(str(membrane[0]), xy=(t_coords[0], membrane[0]), xytext=(t_coords[0], membrane[0]))\n\ +plt.annotate(str(mb[0]), xy=(t_coords[0], mb[0]), xytext=(t_coords[0], mb[0]))\n\ +plt.annotate(str(peak[0]), xy=(t_coords[0], peak[0]), xytext=(t_coords[0], peak[0]))\n\ +plt.annotate(str(mb[len(t_coords)-1]), xy=(t_coords[len(t_coords)-1], mb[len(t_coords)-1]), xytext=(t_coords[len(t_coords)-1], mb[len(t_coords)-1]))\n\ +plt.annotate(str(peak[len(t_coords)-1]), xy=(t_coords[len(t_coords)-1], peak[len(t_coords)-1]), xytext=(t_coords[len(t_coords)-1], peak[len(t_coords)-1]))\n\ +plt.legend([\"Membrane\", \"Membrane and Bending\", \"Total\"], loc = \"best\")\n\ +plt.xlabel(\"Thickness [mm] \")\n\ +plt.ylabel(\"Stress [MPa]\")\n\ +plt.title(\"Linearized Stresses\")\n\ +plt.grid()\n\ +plt.show()\n"; +} + DEF_STD_CMD_A(CmdFemPostCreateClipFilter); CmdFemPostCreateClipFilter::CmdFemPostCreateClipFilter() @@ -1163,6 +1210,28 @@ CmdFemPostCreateLinearizedStressesFilter::CmdFemPostCreateLinearizedStressesFilt void CmdFemPostCreateLinearizedStressesFilter::activated(int) { + + Gui::SelectionFilter DataAlongLineFilter("SELECT Fem::FemPostDataAlongLineFilter COUNT 1"); + + if (DataAlongLineFilter.match()) { + Fem::FemPostDataAlongLineFilter* DataAlongLine = static_cast(DataAlongLineFilter.Result[0][0].getObject()); + std::string FieldName = DataAlongLine->PlotData.getValue(); + if ((FieldName == "Max shear stress (Tresca)") || (FieldName == "Maximum Principal stress") || (FieldName == "Minimum Principal stress") || (FieldName == "Von Mises stress")) { + doCommand(Gui::Command::Doc,"t_coords = App.ActiveDocument.DataAlongLine.XAxisData"); + doCommand(Gui::Command::Doc,"sValues = App.ActiveDocument.DataAlongLine.YAxisData"); + doCommand(Gui::Command::Doc, Plot().c_str()); + } else { + QMessageBox::warning(Gui::getMainWindow(), + qApp->translate("CmdFemPostCreateLinearizedStressesFilter", "Wrong selection"), + qApp->translate("CmdFemPostCreateLinearizedStressesFilter", "Select a Clip filter which clips a STRESS field along a line, please.")); + } +} + else { + QMessageBox::warning(Gui::getMainWindow(), + qApp->translate("CmdFemPostCreateLinearizedStressesFilter", "Wrong selection"), + qApp->translate("CmdFemPostCreateLinearizedStressesFilter", "Select a Clip filter which clips a STRESS field along a line, please.")); + } + } bool CmdFemPostCreateLinearizedStressesFilter::isActive(void) @@ -1170,7 +1239,6 @@ bool CmdFemPostCreateLinearizedStressesFilter::isActive(void) return hasActiveDocument(); } - DEF_STD_CMD_A(CmdFemPostCreateScalarClipFilter); CmdFemPostCreateScalarClipFilter::CmdFemPostCreateScalarClipFilter() From 64e945db75602f9c035399db4daaa738b6667d64 Mon Sep 17 00:00:00 2001 From: mkhizenz Date: Tue, 20 Dec 2016 18:10:46 +0100 Subject: [PATCH 21/60] FEM: linearizedStress: Implementation --- src/Mod/Fem/Gui/Command.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index fb3724e306fc..3316ea0b8659 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -1126,6 +1126,7 @@ mb = []\n\ for i in range(len(sValues)):\n\ peak.append(sValues[i])\n\ mb.append(bending[i] + membrane[0])\n\ +print str(round(membrane[0],2))\n\ import FreeCAD\n\ import numpy as np\n\ from matplotlib import pyplot as plt\n\ @@ -1133,11 +1134,21 @@ plt.figure(1)\n\ plt.plot(t_coords, membrane, \"k--\")\n\ plt.plot(t_coords, mb, \"b*-\")\n\ plt.plot(t_coords, peak, \"r-x\")\n\ -plt.annotate(str(membrane[0]), xy=(t_coords[0], membrane[0]), xytext=(t_coords[0], membrane[0]))\n\ -plt.annotate(str(mb[0]), xy=(t_coords[0], mb[0]), xytext=(t_coords[0], mb[0]))\n\ -plt.annotate(str(peak[0]), xy=(t_coords[0], peak[0]), xytext=(t_coords[0], peak[0]))\n\ -plt.annotate(str(mb[len(t_coords)-1]), xy=(t_coords[len(t_coords)-1], mb[len(t_coords)-1]), xytext=(t_coords[len(t_coords)-1], mb[len(t_coords)-1]))\n\ -plt.annotate(str(peak[len(t_coords)-1]), xy=(t_coords[len(t_coords)-1], peak[len(t_coords)-1]), xytext=(t_coords[len(t_coords)-1], peak[len(t_coords)-1]))\n\ +plt.annotate(str(round(membrane[0],2)), xy=(t_coords[0], membrane[0]), xytext=(t_coords[0], membrane[0]))\n\ +plt.annotate(str(round(mb[0],2)), xy=(t_coords[0], mb[0]), xytext=(t_coords[0], mb[0]))\n\ +plt.annotate(str(round(mb[len(t_coords)-1],2)), xy=(t_coords[len(t_coords)-1], mb[len(t_coords)-1]), xytext=(t_coords[len(t_coords)-1], mb[len(t_coords)-1]))\n\ +plt.annotate(str(round(peak[0],2)), xy=(t_coords[0], peak[0]), xytext=(t_coords[0], peak[0]))\n\ +plt.annotate(str(round(peak[len(t_coords)-1],2)), xy=(t_coords[len(t_coords)-1], peak[len(t_coords)-1]), xytext=(t_coords[len(t_coords)-1], peak[len(t_coords)-1]))\n\ +FreeCAD.Console.PrintError('membrane stress = ')\n\ +FreeCAD.Console.PrintError([str(round(membrane[0],2))])\n\ +FreeCAD.Console.PrintError('membrane + bending min = ')\n\ +FreeCAD.Console.PrintError([str(round(mb[0],2))])\n\ +FreeCAD.Console.PrintError('membrane + bending max = ')\n\ +FreeCAD.Console.PrintError([str(round(mb[len(t_coords)-1],2))])\n\ +FreeCAD.Console.PrintError('Total stress min = ')\n\ +FreeCAD.Console.PrintError([str(round(peak[0],2))])\n\ +FreeCAD.Console.PrintError('Total stress max = ')\n\ +FreeCAD.Console.PrintError([str(round(peak[len(t_coords)-1],2))])\n\ plt.legend([\"Membrane\", \"Membrane and Bending\", \"Total\"], loc = \"best\")\n\ plt.xlabel(\"Thickness [mm] \")\n\ plt.ylabel(\"Stress [MPa]\")\n\ From 3cfc9d5dd0b77f6bf30dda35bd63e63fd97116e6 Mon Sep 17 00:00:00 2001 From: mkhizenz Date: Tue, 20 Dec 2016 18:10:50 +0100 Subject: [PATCH 22/60] FEM: LinearizedStress: Update --- src/Mod/Fem/Gui/Command.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index 3316ea0b8659..d500549c762d 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -1126,7 +1126,6 @@ mb = []\n\ for i in range(len(sValues)):\n\ peak.append(sValues[i])\n\ mb.append(bending[i] + membrane[0])\n\ -print str(round(membrane[0],2))\n\ import FreeCAD\n\ import numpy as np\n\ from matplotlib import pyplot as plt\n\ From c11fdbe3557e2dd685b9a335dc1ffdb020582c39 Mon Sep 17 00:00:00 2001 From: kgoao Date: Tue, 20 Dec 2016 18:10:54 +0100 Subject: [PATCH 23/60] FEM: ConstraintTransform: Allow forces to be transformed --- src/Mod/Fem/Gui/TaskFemConstraintTransform.cpp | 6 +++--- src/Mod/Fem/Gui/TaskFemConstraintTransform.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Mod/Fem/Gui/TaskFemConstraintTransform.cpp b/src/Mod/Fem/Gui/TaskFemConstraintTransform.cpp index ca4164165579..4627eb41af9e 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintTransform.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintTransform.cpp @@ -114,7 +114,7 @@ TaskFemConstraintTransform::TaskFemConstraintTransform(ViewProviderFemConstraint ui->lw_Rect->clear(); //Transformable surfaces - Gui::Command::doCommand(Gui::Command::Doc,TaskFemConstraintTransform::getDisplcementReferences((static_cast(ConstraintView->getObject()))->getNameInDocument()).c_str()); + Gui::Command::doCommand(Gui::Command::Doc,TaskFemConstraintTransform::getSurfaceReferences((static_cast(ConstraintView->getObject()))->getNameInDocument()).c_str()); std::vector ObjDispl = pcConstraint->RefDispl.getValues(); std::vector nDispl = pcConstraint->NameDispl.getValues(); std::vector SubElemDispl = pcConstraint->RefDispl.getSubValues(); @@ -436,7 +436,7 @@ void TaskFemConstraintTransform::onReferenceDeleted() { TaskFemConstraintTransform::removeFromSelection(); } -std::string TaskFemConstraintTransform::getDisplcementReferences(std::string showConstr="") +std::string TaskFemConstraintTransform::getSurfaceReferences(std::string showConstr="") { return "for obj in FreeCAD.ActiveDocument.Objects:\n\ if obj.isDerivedFrom(\"Fem::FemAnalysisPython\"):\n\ @@ -446,7 +446,7 @@ A = []\n\ i = 0\n\ ss = []\n\ for member in members:\n\ - if member.isDerivedFrom(\"Fem::ConstraintDisplacement\"):\n\ + if (member.isDerivedFrom(\"Fem::ConstraintDisplacement\")) or (member.isDerivedFrom(\"Fem::ConstraintForce\")):\n\ m = member.References\n\ A.append(m)\n\ if i >0:\n\ diff --git a/src/Mod/Fem/Gui/TaskFemConstraintTransform.h b/src/Mod/Fem/Gui/TaskFemConstraintTransform.h index ac2da9857160..83ef19314811 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintTransform.h +++ b/src/Mod/Fem/Gui/TaskFemConstraintTransform.h @@ -55,7 +55,7 @@ class TaskFemConstraintTransform : public TaskFemConstraint double get_Y_rot()const; double get_Z_rot()const; std::string get_transform_type(void) const; - static std::string getDisplcementReferences(const std::string showConstr); + static std::string getSurfaceReferences(const std::string showConstr); private Q_SLOTS: void onReferenceDeleted(void); From 5eb621cbfc47ac22adc9b9798a687fff88dd1f17 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:10:57 +0100 Subject: [PATCH 24/60] FEM: typo in ifndef of a header file --- src/Mod/Fem/Gui/Workbench.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Mod/Fem/Gui/Workbench.h b/src/Mod/Fem/Gui/Workbench.h index a3c7a4a234bd..036cc638b235 100755 --- a/src/Mod/Fem/Gui/Workbench.h +++ b/src/Mod/Fem/Gui/Workbench.h @@ -21,8 +21,8 @@ ***************************************************************************/ -#ifndef IMAGE_WORKBENCH_H -#define IMAGE_WORKBENCH_H +#ifndef FEM_WORKBENCH_H +#define FEM_WORKBENCH_H #include @@ -47,4 +47,4 @@ class FemGuiExport Workbench : public Gui::StdWorkbench } // namespace FemGui -#endif // IMAGE_WORKBENCH_H +#endif // FEM_WORKBENCH_H From 5d7eadc8e6ae6c1376e530738aa71e9ef731cf3e Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:01 +0100 Subject: [PATCH 25/60] FEM: cmake, delete dublicates --- src/Mod/Fem/App/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 514ceaf77326..29572819bca0 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -66,8 +66,6 @@ SET(FemScripts_SRCS _CommandControlSolver.py _CommandConstraintSelfWeight.py _CommandFEMMesh2Mesh.py - _CommandMechanicalMaterial.py - _CommandShowResult.py _CommandMaterialMechanicalNonlinear.py _CommandMechanicalMaterial.py _CommandMeshGmshFromShape.py From df10569f23704d215b4afd85ccd115c6b39385b7 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:04 +0100 Subject: [PATCH 26/60] FEM: gmsh mesh tool, set optimize mesh to True for new objects --- src/Mod/Fem/_FemMeshGmsh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mod/Fem/_FemMeshGmsh.py b/src/Mod/Fem/_FemMeshGmsh.py index 5cfe46711a36..ef9db0b6a783 100644 --- a/src/Mod/Fem/_FemMeshGmsh.py +++ b/src/Mod/Fem/_FemMeshGmsh.py @@ -61,7 +61,7 @@ def __init__(self, obj): obj.ElementOrder = 'Automatic' # = 2nd obj.addProperty("App::PropertyBool", "OptimizeStd", "FEM GMSH Mesh Params", "Optimize tetra elements") - obj.OptimizeStd = False + obj.OptimizeStd = True obj.addProperty("App::PropertyBool", "OptimizeNetgen", "FEM GMSH Mesh Params", "Optimize tetra elements by use of Netgen") obj.OptimizeNetgen = False From 089933d7a3b5cce2701aa9a94912026ed75e1416 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:07 +0100 Subject: [PATCH 27/60] FEM: add some title to some FEM task panels --- src/Mod/Fem/TaskPanelFemBeamSection.ui | 2 +- src/Mod/Fem/TaskPanelFemShellThickness.ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mod/Fem/TaskPanelFemBeamSection.ui b/src/Mod/Fem/TaskPanelFemBeamSection.ui index 9fc09d32e3af..6162ea8c4855 100644 --- a/src/Mod/Fem/TaskPanelFemBeamSection.ui +++ b/src/Mod/Fem/TaskPanelFemBeamSection.ui @@ -11,7 +11,7 @@ - Form + Beam section parameter diff --git a/src/Mod/Fem/TaskPanelFemShellThickness.ui b/src/Mod/Fem/TaskPanelFemShellThickness.ui index daf305943bb9..d0438764f8f7 100644 --- a/src/Mod/Fem/TaskPanelFemShellThickness.ui +++ b/src/Mod/Fem/TaskPanelFemShellThickness.ui @@ -11,7 +11,7 @@ - Form + Shell thickness parameter From 36868f3fe575014af2ed1130dcafc011a0395ec0 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:10 +0100 Subject: [PATCH 28/60] FEM: mesh region, add object --- src/Mod/Fem/App/CMakeLists.txt | 3 + src/Mod/Fem/CMakeLists.txt | 4 ++ src/Mod/Fem/FemMeshRegion.py | 49 +++++++++++++ src/Mod/Fem/_FemMeshGmsh.py | 3 + src/Mod/Fem/_FemMeshRegion.py | 40 +++++++++++ src/Mod/Fem/_ViewProviderFemMeshRegion.py | 84 +++++++++++++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 src/Mod/Fem/FemMeshRegion.py create mode 100644 src/Mod/Fem/_FemMeshRegion.py create mode 100644 src/Mod/Fem/_ViewProviderFemMeshRegion.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 29572819bca0..14633a173bd4 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -80,6 +80,7 @@ SET(FemScripts_SRCS _FemConstraintSelfWeight.py _FemMaterialMechanicalNonlinear.py _FemMeshGmsh.py + _FemMeshRegion.py _FemShellThickness.py _FemSolverCalculix.py _FemSolverZ88.py @@ -94,6 +95,7 @@ SET(FemScripts_SRCS _ViewProviderFemConstraintSelfWeight.py _ViewProviderFemMaterialMechanicalNonlinear.py _ViewProviderFemMeshGmsh.py + _ViewProviderFemMeshRegion.py _ViewProviderFemShellThickness.py _ViewProviderFemSolverCalculix.py _ViewProviderFemSolverZ88.py @@ -116,6 +118,7 @@ SET(FemScripts_SRCS FemMaterialMechanicalNonlinear.py FemMesh2Mesh.py FemMeshGmsh.py + FemMeshRegion.py FemMeshTools.py FemShellThickness.py FemSolverCalculix.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 794b56e5e2ea..d541817503cf 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -48,6 +48,10 @@ INSTALL( FemMesh2Mesh.py _CommandFEMMesh2Mesh.py + FemMeshRegion.py + _FemMeshRegion.py + _ViewProviderFemMeshRegion.py + FemBeamSection.py _FemBeamSection.py _ViewProviderFemBeamSection.py diff --git a/src/Mod/Fem/FemMeshRegion.py b/src/Mod/Fem/FemMeshRegion.py new file mode 100644 index 000000000000..94fb8a2aa253 --- /dev/null +++ b/src/Mod/Fem/FemMeshRegion.py @@ -0,0 +1,49 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "FemMeshRegion" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## \addtogroup FEM +# @{ + +import FreeCAD +import _FemMeshRegion + + +def makeFemMeshRegion(base_mesh, element_length=2.0, name="FEMMeshRegion"): + '''makeFemMeshRegion([length], [name]): creates a FEM mesh region object to define properties for a regon of a FEM mesh''' + obj = FreeCAD.ActiveDocument.addObject("Fem::FeaturePython", name) + _FemMeshRegion._FemMeshRegion(obj) + obj.CharacteristicLength = element_length + # obj.BaseMesh = base_mesh + # App::PropertyLinkList does not support append, we will use a temporary list to append the mesh region obj. to the list + tmplist = base_mesh.MeshRegionList + tmplist.append(obj) + base_mesh.MeshRegionList = tmplist + if FreeCAD.GuiUp: + import _ViewProviderFemMeshRegion + _ViewProviderFemMeshRegion._ViewProviderFemMeshRegion(obj.ViewObject) + return obj + +# @} diff --git a/src/Mod/Fem/_FemMeshGmsh.py b/src/Mod/Fem/_FemMeshGmsh.py index ef9db0b6a783..1eee8c85381b 100644 --- a/src/Mod/Fem/_FemMeshGmsh.py +++ b/src/Mod/Fem/_FemMeshGmsh.py @@ -43,6 +43,9 @@ def __init__(self, obj): self.Object = obj # keep a ref to the DocObj for nonGui usage obj.Proxy = self # link between App::DocumentObject to this object + obj.addProperty("App::PropertyLinkList", "MeshRegionList", "Base", "Mesh regions of the mesh") + obj.MeshRegionList = [] + obj.addProperty("App::PropertyLink", "Part", "FEM Mesh", "Part object to mesh") obj.Part = None diff --git a/src/Mod/Fem/_FemMeshRegion.py b/src/Mod/Fem/_FemMeshRegion.py new file mode 100644 index 000000000000..49f7e1dde186 --- /dev/null +++ b/src/Mod/Fem/_FemMeshRegion.py @@ -0,0 +1,40 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_FemMeshRegion" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package FemMeshRegion +# \ingroup FEM + + +class _FemMeshRegion: + "The FemMeshRegion object" + def __init__(self, obj): + obj.addProperty("App::PropertyLength", "CharacteristicLength", "MeshRegionProperties", "set characteristic length of FEM elements for this region") + obj.addProperty("App::PropertyLinkSubList", "References", "MeshRegionShapes", "List of FEM mesh region shapes") + obj.Proxy = self + self.Type = "FemMeshRegion" + + def execute(self, obj): + return diff --git a/src/Mod/Fem/_ViewProviderFemMeshRegion.py b/src/Mod/Fem/_ViewProviderFemMeshRegion.py new file mode 100644 index 000000000000..a5a4f3caaaf4 --- /dev/null +++ b/src/Mod/Fem/_ViewProviderFemMeshRegion.py @@ -0,0 +1,84 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_ViewProviderFemMeshRegion" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package ViewProviderFemMeshRegion +# \ingroup FEM + +import FreeCAD +import FreeCADGui +from pivy import coin + + +class _ViewProviderFemMeshRegion: + "A View Provider for the FemMeshRegion object" + def __init__(self, vobj): + vobj.Proxy = self + + def getIcon(self): + return ":/icons/fem-femmesh-from-shape.svg" + + def attach(self, vobj): + self.ViewObject = vobj + self.Object = vobj.Object + self.standard = coin.SoGroup() + vobj.addDisplayMode(self.standard, "Standard") + + def getDisplayModes(self, obj): + return ["Standard"] + + def getDefaultDisplayMode(self): + return "Standard" + + def updateData(self, obj, prop): + return + + def onChanged(self, vobj, prop): + return + + def setEdit(self, vobj, mode=0): + import _TaskPanelFemMeshRegion + taskd = _TaskPanelFemMeshRegion._TaskPanelFemMeshRegion(self.Object) + taskd.obj = vobj.Object + FreeCADGui.Control.showDialog(taskd) + return True + + def unsetEdit(self, vobj, mode=0): + FreeCADGui.Control.closeDialog() + return + + def doubleClicked(self, vobj): + doc = FreeCADGui.getDocument(vobj.Object.Document) + if not doc.getInEdit(): + doc.setEdit(vobj.Object.Name) + else: + FreeCAD.Console.PrintError('Active Task Dialog found! Please close this one first!\n') + return True + + def __getstate__(self): + return None + + def __setstate__(self, state): + return None From 347d4be25f7bb62a1c2e1b5c52e3ff13cbcf3e12 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:13 +0100 Subject: [PATCH 29/60] FEM: mesh region, add command to FreeCAD GUI menu and tool bar --- src/Mod/Fem/App/CMakeLists.txt | 1 + src/Mod/Fem/CMakeLists.txt | 1 + src/Mod/Fem/FemCommands.py | 9 +++++ src/Mod/Fem/Gui/Workbench.cpp | 6 ++++ src/Mod/Fem/InitGui.py | 1 + src/Mod/Fem/_CommandMeshRegion.py | 57 +++++++++++++++++++++++++++++++ 6 files changed, 75 insertions(+) create mode 100644 src/Mod/Fem/_CommandMeshRegion.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 14633a173bd4..3393c593c9d5 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -70,6 +70,7 @@ SET(FemScripts_SRCS _CommandMechanicalMaterial.py _CommandMeshGmshFromShape.py _CommandMeshNetgenFromShape.py + _CommandMeshRegion.py _CommandPurgeResults.py _CommandRunSolver.py _CommandShellThickness.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index d541817503cf..e00dd5fa4b86 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -51,6 +51,7 @@ INSTALL( FemMeshRegion.py _FemMeshRegion.py _ViewProviderFemMeshRegion.py + _CommandMeshRegion.py FemBeamSection.py _FemBeamSection.py diff --git a/src/Mod/Fem/FemCommands.py b/src/Mod/Fem/FemCommands.py index 7c6f505d195f..79284e756b89 100644 --- a/src/Mod/Fem/FemCommands.py +++ b/src/Mod/Fem/FemCommands.py @@ -60,6 +60,8 @@ def IsActive(self): active = FreeCADGui.ActiveDocument is not None and self.part_feature_selected() elif self.is_active == 'with_femmesh': active = FreeCADGui.ActiveDocument is not None and self.femmesh_selected() + elif self.is_active == 'with_gmsh_femmesh': + active = FreeCADGui.ActiveDocument is not None and self.gmsh_femmesh_selected() elif self.is_active == 'with_femmesh_andor_res': active = FreeCADGui.ActiveDocument is not None and self.with_femmesh_andor_res_selected() elif self.is_active == 'with_material': @@ -92,6 +94,13 @@ def femmesh_selected(self): else: return False + def gmsh_femmesh_selected(self): + sel = FreeCADGui.Selection.getSelection() + if len(sel) == 1 and hasattr(sel[0], "Proxy") and sel[0].Proxy.Type == "FemMeshGmsh": + return True + else: + return False + def material_selected(self): sel = FreeCADGui.Selection.getSelection() if len(sel) == 1 and sel[0].isDerivedFrom("App::MaterialObjectPython"): diff --git a/src/Mod/Fem/Gui/Workbench.cpp b/src/Mod/Fem/Gui/Workbench.cpp index 01f0ef790131..1038afa47070 100755 --- a/src/Mod/Fem/Gui/Workbench.cpp +++ b/src/Mod/Fem/Gui/Workbench.cpp @@ -59,8 +59,11 @@ Gui::ToolBarItem* Workbench::setupToolBars() const << "Fem_Analysis" << "Fem_SolverCalculix" // << "Fem_SolverZ88" + << "Separator" << "Fem_MeshNetgenFromShape" << "Fem_MeshGmshFromShape" + << "Fem_MeshRegion" + << "Separator" << "Fem_MechanicalMaterial" << "Fem_MaterialMechanicalNonlinear" << "Fem_BeamSection" @@ -129,8 +132,11 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Fem_Analysis" << "Fem_SolverCalculix" << "Fem_SolverZ88" + << "Separator" << "Fem_MeshNetgenFromShape" << "Fem_MeshGmshFromShape" + << "Fem_MeshRegion" + << "Separator" << "Fem_MechanicalMaterial" << "Fem_MaterialMechanicalNonlinear" << "Fem_BeamSection" diff --git a/src/Mod/Fem/InitGui.py b/src/Mod/Fem/InitGui.py index d813bd4a4f5f..65985a2f2ac6 100644 --- a/src/Mod/Fem/InitGui.py +++ b/src/Mod/Fem/InitGui.py @@ -52,6 +52,7 @@ def Initialize(self): import _CommandFEMMesh2Mesh import _CommandMeshGmshFromShape import _CommandMeshNetgenFromShape + import _CommandMeshRegion import _CommandAnalysis import _CommandShellThickness import _CommandBeamSection diff --git a/src/Mod/Fem/_CommandMeshRegion.py b/src/Mod/Fem/_CommandMeshRegion.py new file mode 100644 index 000000000000..8cd8e87d4e6a --- /dev/null +++ b/src/Mod/Fem/_CommandMeshRegion.py @@ -0,0 +1,57 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_CommandMeshRegion" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package CommandMeshRegion +# \ingroup FEM + +import FreeCAD +from FemCommands import FemCommands +import FreeCADGui +from PySide import QtCore + + +class _CommandMeshRegion(FemCommands): + "The Fem_MeshRegion command definition" + def __init__(self): + super(_CommandMeshRegion, self).__init__() + self.resources = {'Pixmap': 'fem-femmesh-from-shape', + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_MeshRegion", "FEM mesh region"), + 'Accel': "M, R", + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_MeshRegion", "Creates a FEM mesh region")} + self.is_active = 'with_gmsh_femmesh' + + def Activated(self): + FreeCAD.ActiveDocument.openTransaction("Create FemMeshRegion") + FreeCADGui.addModule("FemMeshRegion") + sel = FreeCADGui.Selection.getSelection() + if (len(sel) == 1): + sobj = sel[0] + if len(sel) == 1 and hasattr(sobj, "Proxy") and sobj.Proxy.Type == "FemMeshGmsh": + FreeCADGui.doCommand("FemMeshRegion.makeFemMeshRegion(App.ActiveDocument." + sobj.Name + ")") + + FreeCADGui.Selection.clearSelection() + +FreeCADGui.addCommand('Fem_MeshRegion', _CommandMeshRegion()) From 90bc5255b441d4c926f9df44af93e14194f870eb Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:17 +0100 Subject: [PATCH 30/60] FEM: mesh region, add task panel --- src/Mod/Fem/App/CMakeLists.txt | 2 + src/Mod/Fem/CMakeLists.txt | 2 + src/Mod/Fem/TaskPanelFemMeshRegion.ui | 82 ++++++++++++++ src/Mod/Fem/_TaskPanelFemMeshRegion.py | 146 +++++++++++++++++++++++++ 4 files changed, 232 insertions(+) create mode 100644 src/Mod/Fem/TaskPanelFemMeshRegion.ui create mode 100644 src/Mod/Fem/_TaskPanelFemMeshRegion.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 3393c593c9d5..ec63818669f5 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -88,6 +88,7 @@ SET(FemScripts_SRCS _MechanicalMaterial.py _TaskPanelFemBeamSection.py _TaskPanelFemMeshGmsh.py + _TaskPanelFemMeshRegion.py _TaskPanelFemShellThickness.py _TaskPanelFemSolverCalculix.py _TaskPanelMechanicalMaterial.py @@ -133,6 +134,7 @@ SET(FemScripts_SRCS z88DispReader.py TaskPanelFemBeamSection.ui TaskPanelFemMeshGmsh.ui + TaskPanelFemMeshRegion.ui TaskPanelFemShellThickness.ui TaskPanelFemSolverCalculix.ui TaskPanelMechanicalMaterial.ui diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index e00dd5fa4b86..826cd10f0b5f 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -52,6 +52,8 @@ INSTALL( _FemMeshRegion.py _ViewProviderFemMeshRegion.py _CommandMeshRegion.py + _TaskPanelFemMeshRegion.py + TaskPanelFemMeshRegion.ui FemBeamSection.py _FemBeamSection.py diff --git a/src/Mod/Fem/TaskPanelFemMeshRegion.ui b/src/Mod/Fem/TaskPanelFemMeshRegion.ui new file mode 100644 index 000000000000..8cfedf84e55c --- /dev/null +++ b/src/Mod/Fem/TaskPanelFemMeshRegion.ui @@ -0,0 +1,82 @@ + + + Form + + + + 0 + 0 + 249 + 379 + + + + Mesh region + + + + + + + 16777215 + 1677215 + + + + FEM mesh region + + + + + + Use FreeCAD Property Editor + + + + + + + to edit the characteristic length + + + + + + + + + + References + + + + + + Add reference + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + diff --git a/src/Mod/Fem/_TaskPanelFemMeshRegion.py b/src/Mod/Fem/_TaskPanelFemMeshRegion.py new file mode 100644 index 000000000000..56a3e1124a8b --- /dev/null +++ b/src/Mod/Fem/_TaskPanelFemMeshRegion.py @@ -0,0 +1,146 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_TaskPanelFemMeshRegion" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package TaskPanelFemMeshRegion +# \ingroup FEM + +import FreeCAD +import FreeCADGui +from PySide import QtGui +from PySide import QtCore + + +class _TaskPanelFemMeshRegion: + '''The TaskPanel for editing References property of FemMeshRegion objects''' + def __init__(self, obj): + FreeCADGui.Selection.clearSelection() + self.sel_server = None + self.obj = obj + self.references = [] + if self.obj.References: + self.tuplereferences = self.obj.References + self.get_references() + + self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelFemMeshRegion.ui") + QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) + self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) + + self.rebuild_list_References() + + def accept(self): + if self.sel_server: + FreeCADGui.Selection.removeObserver(self.sel_server) + self.obj.References = self.references + FreeCADGui.ActiveDocument.resetEdit() + FreeCAD.ActiveDocument.recompute() + return True + + def reject(self): + if self.sel_server: + FreeCADGui.Selection.removeObserver(self.sel_server) + FreeCADGui.ActiveDocument.resetEdit() + return True + + def get_references(self): + for ref in self.tuplereferences: + for elem in ref[1]: + self.references.append((ref[0], elem)) + + def references_list_right_clicked(self, QPos): + self.form.contextMenu = QtGui.QMenu() + menu_item = self.form.contextMenu.addAction("Remove Reference") + if not self.references: + menu_item.setDisabled(True) + self.form.connect(menu_item, QtCore.SIGNAL("triggered()"), self.remove_reference) + parentPosition = self.form.list_References.mapToGlobal(QtCore.QPoint(0, 0)) + self.form.contextMenu.move(parentPosition + QPos) + self.form.contextMenu.show() + + def remove_reference(self): + if not self.references: + return + currentItemName = str(self.form.list_References.currentItem().text()) + for ref in self.references: + refname_to_compare_listentry = ref[0].Name + ':' + ref[1] + if refname_to_compare_listentry == currentItemName: + self.references.remove(ref) + self.rebuild_list_References() + + def add_references(self): + '''Called if Button add_reference is triggered''' + # in constraints EditTaskPanel the selection is active as soon as the taskpanel is open + # here the addReference button EditTaskPanel has to be triggered to start selection mode + FreeCADGui.Selection.clearSelection() + # start SelectionObserver and parse the function to add the References to the widget + print_message = "Select Edges and Faces by single click on them or Solids by single click on a Vertex to add them to the list" + import FemSelectionObserver + self.sel_server = FemSelectionObserver.FemSelectionObserver(self.selectionParser, print_message) + + def selectionParser(self, selection): + print('selection: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1]) + if hasattr(selection[0], "Shape"): + # get the Shape to mesh + if len(self.obj.InList) == 1: + shape_to_mesh = self.obj.InList[0].Part.Shape + # check if the Shape the selected element belongs to is the Part to mesh of the mesh object + if shape_to_mesh.isSame(selection[0].Shape): + if selection[1]: + elt = selection[0].Shape.getElement(selection[1]) + ''' + # we need to select a Solid out of a CompSolid !!! + # may be by selecting a Face and and Edge which belongs to the solid + # we really need some ShapeType filter for selecting shapes + if elt.ShapeType == "Vertex": + if selection[0].Shape.ShapeType == "Solid": + elt = selection[0].Shape + selection = (selection[0], '') + else: + FreeCAD.Console.PrintMessage("Selected Vertex does not belong to a Solid: " + selection[0].Name + " is a " + selection[0].Shape.ShapeType + " \n") + ''' + if elt.ShapeType == "Vertex" or elt.ShapeType == 'Edge' or elt.ShapeType == 'Face' or elt.ShapeType == 'Solid': + if selection not in self.references: + self.references.append(selection) + self.rebuild_list_References() + else: + FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is in reference list already!\n') + else: + FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is a not supported ShapeType: ' + elt.ShapeType + ' \n') + else: + FreeCAD.Console.PrintError("No selection[1].\n") + else: + FreeCAD.Console.PrintError("The selected element does not belong to the shape to mesh. Select an element of the object: " + self.obj.InList[0].Part.Name + "\n") + else: + FreeCAD.Console.PrintMessage(self.obj.Name + ' seam to belong to more than one mesh object. This is not supported.\n') + + def rebuild_list_References(self): + self.form.list_References.clear() + items = [] + for ref in self.references: + item_name = ref[0].Name + ':' + ref[1] + items.append(item_name) + for listItemName in sorted(items): + self.form.list_References.addItem(listItemName) From 3363c1a0a1f8e92a357b7e1c566ca2d9a8383432 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:20 +0100 Subject: [PATCH 31/60] FEM: mesh region, use the new mesh region object in gmsh mesh class --- src/Mod/Fem/FemGmshTools.py | 48 ++++++++++++++++++++++--------------- src/Mod/Fem/_FemMeshGmsh.py | 2 -- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/Mod/Fem/FemGmshTools.py b/src/Mod/Fem/FemGmshTools.py index 22b3aef954fc..c92848297f8c 100644 --- a/src/Mod/Fem/FemGmshTools.py +++ b/src/Mod/Fem/FemGmshTools.py @@ -220,26 +220,36 @@ def get_group_data(self): print(' Group meshing.') import FemMeshTools self.group_elements = FemMeshTools.get_analysis_group_elements(self.analysis, self.part_obj) - print(self.group_elements) + print(' {}'.format(self.group_elements)) else: print(' NO group meshing.') - self.ele_length_map = self.mesh_obj.CharacteristicLengthMap - self.ele_node_map = {} - if self.ele_length_map: - import FemMeshTools - print(self.ele_length_map) - self.ele_node_map = {} - for e in self.ele_length_map: - if not e.startswith('Solid'): - # Face, Edge, Vertex - ele_shape = self.part_obj.Shape.getElement(e) - else: - # Solid - ele_shape_index = int(e.lstrip('Solid')) - 1 - ele_shape = self.part_obj.Shape.Solids[ele_shape_index] - ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) - self.ele_node_map[e] = ele_vertexes - print(self.ele_node_map) + + self.ele_length_map = {} + for mr_obj in self.mesh_obj.MeshRegionList: + # print(mr_obj.Name) + # print(mr_obj.CharacteristicLength) + # print(Units.Quantity(mr_obj.CharacteristicLength).Value) + for sub in mr_obj.References: + # print(sub[0]) # Part the elements belongs to + # check if the shape of the mesh region is an element of the Part to mesh + if not self.part_obj.Shape.isSame(sub[0].Shape): + FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.\n") + for eles in sub[1]: + # print(eles) # element + if eles not in self.ele_length_map: + self.ele_length_map[eles] = Units.Quantity(mr_obj.CharacteristicLength).Value + else: + FreeCAD.Console.PrintError("The element " + eles + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") + print(' {}'.format(self.ele_length_map)) + self.ele_node_map = {} # { 'ElementString' : [element nodes] } + for elel in self.ele_length_map: + if elel.startswith('Solid'): + ele_shape = self.part_obj.Shape.Solids[int(elel.lstrip('Solid')) - 1] # Solid + else: + ele_shape = self.part_obj.Shape.getElement(elel) # Face, Edge, Vertex + ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) + self.ele_node_map[elel] = ele_vertexes + print(' {}'.format(self.ele_node_map)) def write_part_file(self): self.part_obj.Shape.exportBrep(self.temp_file_geometry) @@ -279,7 +289,7 @@ def write_geo(self): for e in self.ele_length_map: ele_nodes = (''.join((str(n + 1) + ', ') for n in self.ele_node_map[e])).rstrip(', ') geo.write("// " + e + "\n") - geo.write("Characteristic Length { " + ele_nodes + " } = " + self.ele_length_map[e] + ";\n") + geo.write("Characteristic Length { " + ele_nodes + " } = " + str(self.ele_length_map[e]) + ";\n") geo.write("\n") geo.write("Mesh.CharacteristicLengthMax = " + str(self.clmax) + ";\n") geo.write("Mesh.CharacteristicLengthMin = " + str(self.clmin) + ";\n") diff --git a/src/Mod/Fem/_FemMeshGmsh.py b/src/Mod/Fem/_FemMeshGmsh.py index 1eee8c85381b..2e956e91d8a5 100644 --- a/src/Mod/Fem/_FemMeshGmsh.py +++ b/src/Mod/Fem/_FemMeshGmsh.py @@ -83,8 +83,6 @@ def __init__(self, obj): obj.Algorithm3D = _FemMeshGmsh.known_mesh_algorithm_3D obj.Algorithm3D = 'Automatic' # ? - obj.addProperty("App::PropertyMap", "CharacteristicLengthMap", "FEM GMSH Mesh Params", "Map of CharacteristicLength of Shape elements") - def execute(self, obj): return From 6822d09208e8b4028074a6ee63c293421086ce3d Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:22 +0100 Subject: [PATCH 32/60] FEM: mesh region, make mesh region objects childrens of mesh object in tree view --- src/Mod/Fem/_ViewProviderFemMeshGmsh.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Mod/Fem/_ViewProviderFemMeshGmsh.py b/src/Mod/Fem/_ViewProviderFemMeshGmsh.py index 34d4239aa7e2..2c0b25c0feb7 100644 --- a/src/Mod/Fem/_ViewProviderFemMeshGmsh.py +++ b/src/Mod/Fem/_ViewProviderFemMeshGmsh.py @@ -109,3 +109,14 @@ def __getstate__(self): def __setstate__(self, state): return None + + def claimChildren(self): + return self.Object.MeshRegionList + + def onDelete(self, feature, subelements): + try: + for obj in self.claimChildren(): + obj.ViewObject.show() + except Exception as err: + FreeCAD.Console.PrintError("Error in onDelete: " + err.message) + return True From 862937080e51dce863e1eb53d587634cf0539c5f Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:26 +0100 Subject: [PATCH 33/60] FEM: mesh region, on edit hide all meshes and shapes, show the part to mesh --- src/Mod/Fem/_ViewProviderFemMeshRegion.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Mod/Fem/_ViewProviderFemMeshRegion.py b/src/Mod/Fem/_ViewProviderFemMeshRegion.py index a5a4f3caaaf4..33c3e6ed1ed3 100644 --- a/src/Mod/Fem/_ViewProviderFemMeshRegion.py +++ b/src/Mod/Fem/_ViewProviderFemMeshRegion.py @@ -59,6 +59,15 @@ def onChanged(self, vobj, prop): return def setEdit(self, vobj, mode=0): + # hide all meshes and shapes, show part to mesh + for o in FreeCAD.ActiveDocument.Objects: + if o.isDerivedFrom("Fem::FemMeshObject") or hasattr(o, "Shape"): + o.ViewObject.hide() + if len(self.Object.InList) == 1: + self.Object.InList[0].Part.ViewObject.show() + else: + FreeCAD.Console.PrintError(self.Object.Name + ' seam to belong to more than one mesh object. This is not supported.\n') + # show task panel import _TaskPanelFemMeshRegion taskd = _TaskPanelFemMeshRegion._TaskPanelFemMeshRegion(self.Object) taskd.obj = vobj.Object From be831e78bd0d9454740484a9ec4e8c573cf17c31 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:29 +0100 Subject: [PATCH 34/60] FEM: mesh region, taks panel, add a mode to select solids --- src/Mod/Fem/TaskPanelFemMeshRegion.ui | 32 +++++++++++- src/Mod/Fem/_TaskPanelFemMeshRegion.py | 70 +++++++++++++++++++------- 2 files changed, 82 insertions(+), 20 deletions(-) diff --git a/src/Mod/Fem/TaskPanelFemMeshRegion.ui b/src/Mod/Fem/TaskPanelFemMeshRegion.ui index 8cfedf84e55c..8d1206c600b5 100644 --- a/src/Mod/Fem/TaskPanelFemMeshRegion.ui +++ b/src/Mod/Fem/TaskPanelFemMeshRegion.ui @@ -6,8 +6,8 @@ 0 0 - 249 - 379 + 350 + 500 @@ -59,6 +59,34 @@ + + + + + + Solid + + + + + + + Face, Edge, Vertex + + + true + + + + + + + <html><head/><body><p>Selection</p></body></html> + + + + + diff --git a/src/Mod/Fem/_TaskPanelFemMeshRegion.py b/src/Mod/Fem/_TaskPanelFemMeshRegion.py index 56a3e1124a8b..bc797d03f550 100644 --- a/src/Mod/Fem/_TaskPanelFemMeshRegion.py +++ b/src/Mod/Fem/_TaskPanelFemMeshRegion.py @@ -38,6 +38,9 @@ class _TaskPanelFemMeshRegion: def __init__(self, obj): FreeCADGui.Selection.clearSelection() self.sel_server = None + self.selection_mode_solid = False + self.selection_mode_std_print_message = "Select Faces, Edges and Vertices by single click on them to add them to the list." + self.selection_mode_solid_print_message = "Select Solids by single click on a Face or Edge which belongs to the Solid, to add the Solid to the list." self.obj = obj self.references = [] if self.obj.References: @@ -45,6 +48,8 @@ def __init__(self, obj): self.get_references() self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelFemMeshRegion.ui") + QtCore.QObject.connect(self.form.rb_standard, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_standard) + QtCore.QObject.connect(self.form.rb_solid, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_solid) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) @@ -65,6 +70,16 @@ def reject(self): FreeCADGui.ActiveDocument.resetEdit() return True + def choose_selection_mode_standard(self, state): + self.selection_mode_solid = not state + if self.sel_server and not self.selection_mode_solid: + print(self.selection_mode_std_print_message) + + def choose_selection_mode_solid(self, state): + self.selection_mode_solid = state + if self.sel_server and self.selection_mode_solid: + print(self.selection_mode_solid_print_message) + def get_references(self): for ref in self.tuplereferences: for elem in ref[1]: @@ -96,7 +111,10 @@ def add_references(self): # here the addReference button EditTaskPanel has to be triggered to start selection mode FreeCADGui.Selection.clearSelection() # start SelectionObserver and parse the function to add the References to the widget - print_message = "Select Edges and Faces by single click on them or Solids by single click on a Vertex to add them to the list" + if self.selection_mode_solid: # print message on button click + print_message = self.selection_mode_solid_print_message + else: + print_message = self.selection_mode_std_print_message import FemSelectionObserver self.sel_server = FemSelectionObserver.FemSelectionObserver(self.selectionParser, print_message) @@ -110,25 +128,41 @@ def selectionParser(self, selection): if shape_to_mesh.isSame(selection[0].Shape): if selection[1]: elt = selection[0].Shape.getElement(selection[1]) - ''' - # we need to select a Solid out of a CompSolid !!! - # may be by selecting a Face and and Edge which belongs to the solid - # we really need some ShapeType filter for selecting shapes - if elt.ShapeType == "Vertex": - if selection[0].Shape.ShapeType == "Solid": - elt = selection[0].Shape - selection = (selection[0], '') - else: - FreeCAD.Console.PrintMessage("Selected Vertex does not belong to a Solid: " + selection[0].Name + " is a " + selection[0].Shape.ShapeType + " \n") - ''' - if elt.ShapeType == "Vertex" or elt.ShapeType == 'Edge' or elt.ShapeType == 'Face' or elt.ShapeType == 'Solid': - if selection not in self.references: - self.references.append(selection) - self.rebuild_list_References() + if self.selection_mode_solid: + # in solid selection mode use edges and faces for selection of a solid + solid_to_add = None + if elt.ShapeType == 'Edge': + found_edge = False + for i, s in enumerate(shape_to_mesh.Solids): + for e in s.Edges: + if elt.isSame(e): + if not found_edge: + solid_to_add = str(i + 1) + else: + FreeCAD.Console.PrintMessage('Edge belongs to more than one solid\n') + solid_to_add = None + found_edge = True + elif elt.ShapeType == 'Face': + found_face = False + for i, s in enumerate(shape_to_mesh.Solids): + for e in s.Faces: + if elt.isSame(e): + if not found_face: + solid_to_add = str(i + 1) + else: + FreeCAD.Console.PrintMessage('Face belongs to more than one solid\n') + solid_to_add = None + found_edge = True + if solid_to_add: + selection = (selection[0], 'Solid' + solid_to_add) + print('selection: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1]) else: - FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is in reference list already!\n') + return + if selection not in self.references: + self.references.append(selection) + self.rebuild_list_References() else: - FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is a not supported ShapeType: ' + elt.ShapeType + ' \n') + FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is in reference list already!\n') else: FreeCAD.Console.PrintError("No selection[1].\n") else: From 6304258975191e437ce0fa443029b53db0c44738 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:31 +0100 Subject: [PATCH 35/60] FEM: mesh region, allow any shape as reference shape, not only elements of the shape to mesh --- src/Mod/Fem/FemGmshTools.py | 19 +++++- src/Mod/Fem/_TaskPanelFemMeshRegion.py | 82 ++++++++++------------- src/Mod/Fem/_ViewProviderFemMeshRegion.py | 8 +-- 3 files changed, 54 insertions(+), 55 deletions(-) diff --git a/src/Mod/Fem/FemGmshTools.py b/src/Mod/Fem/FemGmshTools.py index c92848297f8c..0db5c765d463 100644 --- a/src/Mod/Fem/FemGmshTools.py +++ b/src/Mod/Fem/FemGmshTools.py @@ -231,11 +231,26 @@ def get_group_data(self): # print(Units.Quantity(mr_obj.CharacteristicLength).Value) for sub in mr_obj.References: # print(sub[0]) # Part the elements belongs to - # check if the shape of the mesh region is an element of the Part to mesh + # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh + search_ele_in_shape_to_mesh = False if not self.part_obj.Shape.isSame(sub[0].Shape): - FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.\n") + # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") + # print(" But we gone try to fine it in the Shape to mesh :-)") + search_ele_in_shape_to_mesh = True for eles in sub[1]: # print(eles) # element + if search_ele_in_shape_to_mesh: + if eles.startswith('Solid'): + ele_shape = sub[0].Shape.Solids[int(eles.lstrip('Solid')) - 1] # Solid + else: + ele_shape = sub[0].Shape.getElement(eles) # Face, Edge, Vertex + import FemMeshTools + found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) + if found_element: + eles = found_element + else: + FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") + print(eles) # element if eles not in self.ele_length_map: self.ele_length_map[eles] = Units.Quantity(mr_obj.CharacteristicLength).Value else: diff --git a/src/Mod/Fem/_TaskPanelFemMeshRegion.py b/src/Mod/Fem/_TaskPanelFemMeshRegion.py index bc797d03f550..5759be723300 100644 --- a/src/Mod/Fem/_TaskPanelFemMeshRegion.py +++ b/src/Mod/Fem/_TaskPanelFemMeshRegion.py @@ -120,55 +120,43 @@ def add_references(self): def selectionParser(self, selection): print('selection: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1]) - if hasattr(selection[0], "Shape"): - # get the Shape to mesh - if len(self.obj.InList) == 1: - shape_to_mesh = self.obj.InList[0].Part.Shape - # check if the Shape the selected element belongs to is the Part to mesh of the mesh object - if shape_to_mesh.isSame(selection[0].Shape): - if selection[1]: - elt = selection[0].Shape.getElement(selection[1]) - if self.selection_mode_solid: - # in solid selection mode use edges and faces for selection of a solid - solid_to_add = None - if elt.ShapeType == 'Edge': - found_edge = False - for i, s in enumerate(shape_to_mesh.Solids): - for e in s.Edges: - if elt.isSame(e): - if not found_edge: - solid_to_add = str(i + 1) - else: - FreeCAD.Console.PrintMessage('Edge belongs to more than one solid\n') - solid_to_add = None - found_edge = True - elif elt.ShapeType == 'Face': - found_face = False - for i, s in enumerate(shape_to_mesh.Solids): - for e in s.Faces: - if elt.isSame(e): - if not found_face: - solid_to_add = str(i + 1) - else: - FreeCAD.Console.PrintMessage('Face belongs to more than one solid\n') - solid_to_add = None - found_edge = True - if solid_to_add: - selection = (selection[0], 'Solid' + solid_to_add) - print('selection: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1]) - else: - return - if selection not in self.references: - self.references.append(selection) - self.rebuild_list_References() - else: - FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is in reference list already!\n') - else: - FreeCAD.Console.PrintError("No selection[1].\n") + if hasattr(selection[0], "Shape") and selection[1]: + elt = selection[0].Shape.getElement(selection[1]) + if self.selection_mode_solid: + # in solid selection mode use edges and faces for selection of a solid + solid_to_add = None + if elt.ShapeType == 'Edge': + found_edge = False + for i, s in enumerate(selection[0].Shape.Solids): + for e in s.Edges: + if elt.isSame(e): + if not found_edge: + solid_to_add = str(i + 1) + else: + FreeCAD.Console.PrintMessage('Edge belongs to more than one solid\n') + solid_to_add = None + found_edge = True + elif elt.ShapeType == 'Face': + found_face = False + for i, s in enumerate(selection[0].Shape.Solids): + for e in s.Faces: + if elt.isSame(e): + if not found_face: + solid_to_add = str(i + 1) + else: + FreeCAD.Console.PrintMessage('Face belongs to more than one solid\n') + solid_to_add = None + found_edge = True + if solid_to_add: + selection = (selection[0], 'Solid' + solid_to_add) + print('selection element changed to Solid: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1]) else: - FreeCAD.Console.PrintError("The selected element does not belong to the shape to mesh. Select an element of the object: " + self.obj.InList[0].Part.Name + "\n") + return + if selection not in self.references: + self.references.append(selection) + self.rebuild_list_References() else: - FreeCAD.Console.PrintMessage(self.obj.Name + ' seam to belong to more than one mesh object. This is not supported.\n') + FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is in reference list already!\n') def rebuild_list_References(self): self.form.list_References.clear() diff --git a/src/Mod/Fem/_ViewProviderFemMeshRegion.py b/src/Mod/Fem/_ViewProviderFemMeshRegion.py index 33c3e6ed1ed3..2778daf2db46 100644 --- a/src/Mod/Fem/_ViewProviderFemMeshRegion.py +++ b/src/Mod/Fem/_ViewProviderFemMeshRegion.py @@ -59,14 +59,10 @@ def onChanged(self, vobj, prop): return def setEdit(self, vobj, mode=0): - # hide all meshes and shapes, show part to mesh + # hide all meshes for o in FreeCAD.ActiveDocument.Objects: - if o.isDerivedFrom("Fem::FemMeshObject") or hasattr(o, "Shape"): + if o.isDerivedFrom("Fem::FemMeshObject"): o.ViewObject.hide() - if len(self.Object.InList) == 1: - self.Object.InList[0].Part.ViewObject.show() - else: - FreeCAD.Console.PrintError(self.Object.Name + ' seam to belong to more than one mesh object. This is not supported.\n') # show task panel import _TaskPanelFemMeshRegion taskd = _TaskPanelFemMeshRegion._TaskPanelFemMeshRegion(self.Object) From 2dd3f6620f82728e253fa6fc08b56ef78d10475e Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:34 +0100 Subject: [PATCH 36/60] FEM: mesh region, add icon --- src/Mod/Fem/Gui/Resources/Fem.qrc | 1 + .../Resources/icons/fem-femmesh-region.svg | 317 ++++++++++++++++++ src/Mod/Fem/_CommandMeshRegion.py | 2 +- src/Mod/Fem/_ViewProviderFemMeshRegion.py | 2 +- 4 files changed, 320 insertions(+), 2 deletions(-) create mode 100644 src/Mod/Fem/Gui/Resources/icons/fem-femmesh-region.svg diff --git a/src/Mod/Fem/Gui/Resources/Fem.qrc b/src/Mod/Fem/Gui/Resources/Fem.qrc index d3e5783831f3..a100469aef37 100755 --- a/src/Mod/Fem/Gui/Resources/Fem.qrc +++ b/src/Mod/Fem/Gui/Resources/Fem.qrc @@ -29,6 +29,7 @@ icons/fem-femmesh-from-shape.svg icons/fem-femmesh-gmsh-from-shape.svg icons/fem-femmesh-netgen-from-shape.svg + icons/fem-femmesh-region.svg icons/fem-femmesh-to-mesh.svg icons/fem-frequency-analysis.svg icons/fem-inp-editor.svg diff --git a/src/Mod/Fem/Gui/Resources/icons/fem-femmesh-region.svg b/src/Mod/Fem/Gui/Resources/icons/fem-femmesh-region.svg new file mode 100644 index 000000000000..2e1c7111fc69 --- /dev/null +++ b/src/Mod/Fem/Gui/Resources/icons/fem-femmesh-region.svg @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Fem/_CommandMeshRegion.py b/src/Mod/Fem/_CommandMeshRegion.py index 8cd8e87d4e6a..bf1f84137130 100644 --- a/src/Mod/Fem/_CommandMeshRegion.py +++ b/src/Mod/Fem/_CommandMeshRegion.py @@ -37,7 +37,7 @@ class _CommandMeshRegion(FemCommands): "The Fem_MeshRegion command definition" def __init__(self): super(_CommandMeshRegion, self).__init__() - self.resources = {'Pixmap': 'fem-femmesh-from-shape', + self.resources = {'Pixmap': 'fem-femmesh-region', 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_MeshRegion", "FEM mesh region"), 'Accel': "M, R", 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_MeshRegion", "Creates a FEM mesh region")} diff --git a/src/Mod/Fem/_ViewProviderFemMeshRegion.py b/src/Mod/Fem/_ViewProviderFemMeshRegion.py index 2778daf2db46..b0305094ae3b 100644 --- a/src/Mod/Fem/_ViewProviderFemMeshRegion.py +++ b/src/Mod/Fem/_ViewProviderFemMeshRegion.py @@ -38,7 +38,7 @@ def __init__(self, vobj): vobj.Proxy = self def getIcon(self): - return ":/icons/fem-femmesh-from-shape.svg" + return ":/icons/fem-femmesh-region.svg" def attach(self, vobj): self.ViewObject = vobj From 443112ce87de2b616e372d1899c18433a2aeaa63 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:37 +0100 Subject: [PATCH 37/60] FEM: add length values to task panel of meshregion --- src/Mod/Fem/TaskPanelFemMeshRegion.ui | 68 +++++++++++++++++++++----- src/Mod/Fem/_TaskPanelFemMeshRegion.py | 31 +++++++++--- 2 files changed, 80 insertions(+), 19 deletions(-) diff --git a/src/Mod/Fem/TaskPanelFemMeshRegion.ui b/src/Mod/Fem/TaskPanelFemMeshRegion.ui index 8d1206c600b5..c9801409209c 100644 --- a/src/Mod/Fem/TaskPanelFemMeshRegion.ui +++ b/src/Mod/Fem/TaskPanelFemMeshRegion.ui @@ -23,22 +23,59 @@ - FEM mesh region + Parameter - - - Use FreeCAD Property Editor - - - - - - - to edit the characteristic length + + + QFormLayout::AllNonFixedFieldsGrow - + + + + Max element size: + + + + + + + + 0 + 0 + + + + + 80 + 20 + + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 1.000000000000000 + + + 1000000000.000000000000000 + + + mm + + + 2 + + + 0.000000000000000 + + + + @@ -105,6 +142,13 @@ + + + Gui::InputField + QLineEdit +
Gui/InputField.h
+
+
diff --git a/src/Mod/Fem/_TaskPanelFemMeshRegion.py b/src/Mod/Fem/_TaskPanelFemMeshRegion.py index 5759be723300..a9c4418177d0 100644 --- a/src/Mod/Fem/_TaskPanelFemMeshRegion.py +++ b/src/Mod/Fem/_TaskPanelFemMeshRegion.py @@ -38,28 +38,26 @@ class _TaskPanelFemMeshRegion: def __init__(self, obj): FreeCADGui.Selection.clearSelection() self.sel_server = None + self.obj = obj self.selection_mode_solid = False self.selection_mode_std_print_message = "Select Faces, Edges and Vertices by single click on them to add them to the list." self.selection_mode_solid_print_message = "Select Solids by single click on a Face or Edge which belongs to the Solid, to add the Solid to the list." - self.obj = obj - self.references = [] - if self.obj.References: - self.tuplereferences = self.obj.References - self.get_references() self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelFemMeshRegion.ui") + QtCore.QObject.connect(self.form.if_elelen, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.elelen_changed) QtCore.QObject.connect(self.form.rb_standard, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_standard) QtCore.QObject.connect(self.form.rb_solid, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_solid) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) - self.rebuild_list_References() + self.get_meshregion_props() + self.update() def accept(self): + self.set_meshregion_props() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) - self.obj.References = self.references FreeCADGui.ActiveDocument.resetEdit() FreeCAD.ActiveDocument.recompute() return True @@ -70,6 +68,25 @@ def reject(self): FreeCADGui.ActiveDocument.resetEdit() return True + def get_meshregion_props(self): + self.elelen = self.obj.CharacteristicLength + self.references = [] + if self.obj.References: + self.tuplereferences = self.obj.References + self.get_references() + + def set_meshregion_props(self): + self.obj.References = self.references + self.obj.CharacteristicLength = self.elelen + + def update(self): + 'fills the widgets' + self.form.if_elelen.setText(self.elelen.UserString) + self.rebuild_list_References() + + def elelen_changed(self, base_quantity_value): + self.elelen = base_quantity_value + def choose_selection_mode_standard(self, state): self.selection_mode_solid = not state if self.sel_server and not self.selection_mode_solid: From cb6baaaf90264120ecc6fc884c6de70d8800ba7e Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:40 +0100 Subject: [PATCH 38/60] FEM: add length values to task panel of shellthickness --- src/Mod/Fem/TaskPanelFemShellThickness.ui | 87 +++++++++++++++------- src/Mod/Fem/_TaskPanelFemShellThickness.py | 29 ++++++-- 2 files changed, 85 insertions(+), 31 deletions(-) diff --git a/src/Mod/Fem/TaskPanelFemShellThickness.ui b/src/Mod/Fem/TaskPanelFemShellThickness.ui index d0438764f8f7..51ca0f45e431 100644 --- a/src/Mod/Fem/TaskPanelFemShellThickness.ui +++ b/src/Mod/Fem/TaskPanelFemShellThickness.ui @@ -6,8 +6,8 @@ 0 0 - 249 - 379 + 350 + 500 @@ -23,22 +23,62 @@ - Thickness + Parameter - - - Use FreeCAD Property Editor + + + QFormLayout::AllNonFixedFieldsGrow - - - - - - to edit the thickness value - - + + + + + 0 + 0 + + + + + 80 + 20 + + + + Qt::LeftToRight + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 1.000000000000000 + + + 1000000000.000000000000000 + + + mm + + + 2 + + + 0.000000000000000 + + + + + + + Thickness: + + + + @@ -52,17 +92,7 @@ - Leave references blank - - - - - - - to choose all remaining shapes - - - true + Leave blank to choose all remaining shapes @@ -94,6 +124,13 @@ + + + Gui::InputField + QLineEdit +
Gui/InputField.h
+
+
diff --git a/src/Mod/Fem/_TaskPanelFemShellThickness.py b/src/Mod/Fem/_TaskPanelFemShellThickness.py index acd1079989c2..6aa97a1e8df2 100644 --- a/src/Mod/Fem/_TaskPanelFemShellThickness.py +++ b/src/Mod/Fem/_TaskPanelFemShellThickness.py @@ -39,22 +39,20 @@ def __init__(self, obj): FreeCADGui.Selection.clearSelection() self.sel_server = None self.obj = obj - self.references = [] - if self.obj.References: - self.tuplereferences = self.obj.References - self.get_references() self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelFemShellThickness.ui") + QtCore.QObject.connect(self.form.if_thickness, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.thickness_changed) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) - self.rebuild_list_References() + self.get_shellthickness_props() + self.update() def accept(self): + self.set_shellthickness_props() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) - self.obj.References = self.references FreeCADGui.ActiveDocument.resetEdit() FreeCAD.ActiveDocument.recompute() return True @@ -65,6 +63,25 @@ def reject(self): FreeCADGui.ActiveDocument.resetEdit() return True + def get_shellthickness_props(self): + self.thickness = self.obj.Thickness + self.references = [] + if self.obj.References: + self.tuplereferences = self.obj.References + self.get_references() + + def set_shellthickness_props(self): + self.obj.References = self.references + self.obj.Thickness = self.thickness + + def update(self): + 'fills the widgets' + self.form.if_thickness.setText(self.thickness.UserString) + self.rebuild_list_References() + + def thickness_changed(self, base_quantity_value): + self.thickness = base_quantity_value + def get_references(self): for ref in self.tuplereferences: for elem in ref[1]: From 7110a4e2c79cd2853a50be9d520da03084561277 Mon Sep 17 00:00:00 2001 From: kgoao Date: Tue, 20 Dec 2016 18:11:43 +0100 Subject: [PATCH 39/60] FEM: BeamSection: Allow other beam section types --- src/Mod/Fem/FemBeamSection.py | 7 +- src/Mod/Fem/FemInputWriterCcx.py | 22 +++++-- src/Mod/Fem/FemInputWriterZ88.py | 4 +- src/Mod/Fem/TaskPanelFemBeamSection.ui | 85 ++++++++++++++++++++----- src/Mod/Fem/_FemBeamSection.py | 11 +++- src/Mod/Fem/_TaskPanelFemBeamSection.py | 28 ++++++++ 6 files changed, 127 insertions(+), 30 deletions(-) diff --git a/src/Mod/Fem/FemBeamSection.py b/src/Mod/Fem/FemBeamSection.py index 934168cb5006..86d6ac21ae29 100644 --- a/src/Mod/Fem/FemBeamSection.py +++ b/src/Mod/Fem/FemBeamSection.py @@ -35,8 +35,11 @@ def makeFemBeamSection(width=20.0, height=20.0, name="BeamSection"): '''makeFemBeamSection([width], [height], [name]): creates an beamsection object to define a cross section''' obj = FreeCAD.ActiveDocument.addObject("Fem::FeaturePython", name) _FemBeamSection._FemBeamSection(obj) - obj.Width = width - obj.Height = height + obj.RectWidth = width + obj.RectHeight = height + obj.CircRadius = height + obj.PipeRadius = height + obj.PipeThickness = 2.0 if FreeCAD.GuiUp: import _ViewProviderFemBeamSection _ViewProviderFemBeamSection._ViewProviderFemBeamSection(obj.ViewObject) diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 85ac5a9132ac..f82aec1b03dc 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -543,15 +543,23 @@ def write_femelementsets(self, f): beamsec_obj = ccx_elset['beamsection_obj'] elsetdef = 'ELSET=' + ccx_elset['ccx_elset_name'] + ', ' material = 'MATERIAL=' + ccx_elset['mat_obj_name'] - height = beamsec_obj.Height.getValueAs('mm') - width = beamsec_obj.Width.getValueAs('mm') - if width == 0: - section_type = ', SECTION=CIRC' - setion_geo = str(height) + '\n' - else: + if beamsec_obj.SectionType == 'Rectangular': + height = beamsec_obj.RectHeight.getValueAs('mm') + width = beamsec_obj.RectWidth.getValueAs('mm') section_type = ', SECTION=RECT' setion_geo = str(height) + ', ' + str(width) + '\n' - setion_def = '*BEAM SECTION, ' + elsetdef + material + section_type + '\n' + setion_def = '*BEAM SECTION, ' + elsetdef + material + section_type + '\n' + elif beamsec_obj.SectionType == 'Circular': + radius = beamsec_obj.CircRadius.getValueAs('mm') + section_type = ', SECTION=CIRC' + setion_geo = str(radius) + '\n' + setion_def = '*BEAM SECTION, ' + elsetdef + material + section_type + '\n' + elif beamsec_obj.SectionType == 'Pipe': + radius = beamsec_obj.PipeRadius.getValueAs('mm') + thickness = beamsec_obj.PipeThickness.getValueAs('mm') + section_type = ', SECTION=PIPE' + setion_geo = str(radius) + ', ' + str(thickness) + '\n' + setion_def = '*BEAM GENERAL SECTION, ' + elsetdef + material + section_type + '\n' f.write(setion_def) f.write(setion_geo) elif 'shellthickness_obj'in ccx_elset: # shell mesh diff --git a/src/Mod/Fem/FemInputWriterZ88.py b/src/Mod/Fem/FemInputWriterZ88.py index 9090496b6c35..87d76cacbe62 100644 --- a/src/Mod/Fem/FemInputWriterZ88.py +++ b/src/Mod/Fem/FemInputWriterZ88.py @@ -173,8 +173,8 @@ def write_z88_elements_properties(self): if FemMeshTools.is_edge_femmesh(self.femmesh): if len(self.beamsection_objects) == 1: beam_obj = self.beamsection_objects[0]['Object'] - width = beam_obj.Width.getValueAs('mm') - height = beam_obj.Height.getValueAs('mm') + width = beam_obj.RectWidth.getValueAs('mm') + height = beam_obj.RectHeight.getValueAs('mm') area = str(width * height) elements_data.append('1 ' + str(self.element_count) + ' ' + area + ' 0 0 0 0 0 0 ') print("Be aware, only trusses are supported for edge meshes!") diff --git a/src/Mod/Fem/TaskPanelFemBeamSection.ui b/src/Mod/Fem/TaskPanelFemBeamSection.ui index 6162ea8c4855..a8c551522dfd 100644 --- a/src/Mod/Fem/TaskPanelFemBeamSection.ui +++ b/src/Mod/Fem/TaskPanelFemBeamSection.ui @@ -6,8 +6,8 @@ 0 0 - 249 - 379 + 492 + 560 @@ -25,7 +25,7 @@ Cross Section - + @@ -40,6 +40,52 @@ + + + + Qt::Horizontal + + + + + + + Choose cross section type: + + + + + + + + + Rectangular + + + + + + + Circular + + + + + + + Pipe + + + + + + + + + Qt::Horizontal + + + @@ -48,7 +94,7 @@ References - + @@ -76,22 +122,27 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + + l_label_text_1 + l_label_text_2 + pushButton_Reference + list_References + verticalSpacer - - - - Qt::Vertical - - - - 20 - 40 - - - - diff --git a/src/Mod/Fem/_FemBeamSection.py b/src/Mod/Fem/_FemBeamSection.py index 032c815a4f04..4c6c1f0d21af 100644 --- a/src/Mod/Fem/_FemBeamSection.py +++ b/src/Mod/Fem/_FemBeamSection.py @@ -30,10 +30,17 @@ class _FemBeamSection: "The FemBeamSection object" + known_beam_types = ['Rectangular', 'Circular', 'Pipe'] def __init__(self, obj): - obj.addProperty("App::PropertyLength", "Width", "BeamSection", "set width of the beam elements") - obj.addProperty("App::PropertyLength", "Height", "BeamSection", "set height of the beam elements") + obj.addProperty("App::PropertyLength", "RectWidth", "RectBeamSection", "set width of the rectangular beam elements") + obj.addProperty("App::PropertyLength", "RectHeight", "RectBeamSection", "set height of therectangular beam elements") + obj.addProperty("App::PropertyLength", "CircRadius", "CircBeamSection", "set radius of the circular beam elements") + obj.addProperty("App::PropertyLength", "PipeRadius", "PipeBeamSection", "set height of the pipe beam elements") + obj.addProperty("App::PropertyLength", "PipeThickness", "PipeBeamSection", "set height of the pipe beam elements") + obj.addProperty("App::PropertyEnumeration", "SectionType", "BeamSection", "select beam section type") obj.addProperty("App::PropertyLinkSubList", "References", "BeamSection", "List of beam section shapes") + obj.SectionType = _FemBeamSection.known_beam_types + obj.SectionType = 'Rectangular' obj.Proxy = self self.Type = "FemBeamSection" diff --git a/src/Mod/Fem/_TaskPanelFemBeamSection.py b/src/Mod/Fem/_TaskPanelFemBeamSection.py index 5333a5d8f168..ffd0703b533e 100644 --- a/src/Mod/Fem/_TaskPanelFemBeamSection.py +++ b/src/Mod/Fem/_TaskPanelFemBeamSection.py @@ -45,7 +45,18 @@ def __init__(self, obj): self.get_references() self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelFemBeamSection.ui") + + if self.obj.SectionType == 'Rectangular': + self.form.rb_Rect.setChecked(True) + elif self.obj.SectionType == 'Circular': + self.form.rb_Circ.setChecked(True) + elif self.obj.SectionType == 'Pipe': + self.form.rb_Pipe.setChecked(True) + QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) + QtCore.QObject.connect(self.form.rb_Rect, QtCore.SIGNAL("clicked()"), self.rect_section) + QtCore.QObject.connect(self.form.rb_Circ, QtCore.SIGNAL("clicked()"), self.circ_section) + QtCore.QObject.connect(self.form.rb_Pipe, QtCore.SIGNAL("clicked()"), self.pipe_section) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) @@ -100,6 +111,23 @@ def add_references(self): import FemSelectionObserver self.sel_server = FemSelectionObserver.FemSelectionObserver(self.selectionParser, print_message) + def rect_section(self): + '''Called if Rectangular radio button is triggered''' + self.obj.SectionType = 'Rectangular' + self.obj.RectWidth = 20.0 + self.obj.RectHeight = 20.0 + + def circ_section(self): + '''Called if Circular radio button is triggered''' + self.obj.SectionType = 'Circular' + self.obj.CircRadius = 20.0 + + def pipe_section(self): + '''Called if Pipe radio button is triggered''' + self.obj.SectionType = 'Pipe' + self.obj.PipeRadius = 20.0 + self.obj.PipeThickness = 2.0 + def selectionParser(self, selection): # print('selection: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1]) if hasattr(selection[0], "Shape"): From a826a6d2bfc0f8964b17ab6f8cc0f45d21f1f5a9 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:45 +0100 Subject: [PATCH 40/60] FEM: code formating, flake8 --- src/Mod/Fem/FemBeamSection.py | 2 +- src/Mod/Fem/_FemBeamSection.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Mod/Fem/FemBeamSection.py b/src/Mod/Fem/FemBeamSection.py index 86d6ac21ae29..8d24a9703c27 100644 --- a/src/Mod/Fem/FemBeamSection.py +++ b/src/Mod/Fem/FemBeamSection.py @@ -39,7 +39,7 @@ def makeFemBeamSection(width=20.0, height=20.0, name="BeamSection"): obj.RectHeight = height obj.CircRadius = height obj.PipeRadius = height - obj.PipeThickness = 2.0 + obj.PipeThickness = 2.0 if FreeCAD.GuiUp: import _ViewProviderFemBeamSection _ViewProviderFemBeamSection._ViewProviderFemBeamSection(obj.ViewObject) diff --git a/src/Mod/Fem/_FemBeamSection.py b/src/Mod/Fem/_FemBeamSection.py index 4c6c1f0d21af..4fa1d18ad07d 100644 --- a/src/Mod/Fem/_FemBeamSection.py +++ b/src/Mod/Fem/_FemBeamSection.py @@ -30,7 +30,9 @@ class _FemBeamSection: "The FemBeamSection object" + known_beam_types = ['Rectangular', 'Circular', 'Pipe'] + def __init__(self, obj): obj.addProperty("App::PropertyLength", "RectWidth", "RectBeamSection", "set width of the rectangular beam elements") obj.addProperty("App::PropertyLength", "RectHeight", "RectBeamSection", "set height of therectangular beam elements") From 856b7844c01ed50fb2740920627b407e18bc6b75 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:48 +0100 Subject: [PATCH 41/60] FEM: beamsection task panel, add length values and use combobox to choose the section type --- src/Mod/Fem/TaskPanelFemBeamSection.ui | 385 +++++++++++++++++++----- src/Mod/Fem/_TaskPanelFemBeamSection.py | 99 +++--- 2 files changed, 373 insertions(+), 111 deletions(-) diff --git a/src/Mod/Fem/TaskPanelFemBeamSection.ui b/src/Mod/Fem/TaskPanelFemBeamSection.ui index a8c551522dfd..b9fbcf096834 100644 --- a/src/Mod/Fem/TaskPanelFemBeamSection.ui +++ b/src/Mod/Fem/TaskPanelFemBeamSection.ui @@ -6,8 +6,8 @@ 0 0 - 492 - 560 + 350 + 500 @@ -15,75 +15,293 @@ - - - - 16777215 - 1677215 - - + - Cross Section + Cross section parameter - - - - - Use FreeCAD Property Editor - - - - - - - to edit the cross section values - - + + + 9 + + + 6 + + + - - - - Qt::Horizontal + + + + 2 - - - - - - Choose cross section type: - - - - - - - - - Rectangular + + + + 9 - - - - - - Circular + + 6 - - - - - - Pipe + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Width: + + + + + + + + 0 + 0 + + + + + 80 + 20 + + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 1.000000000000000 + + + 1000000000.000000000000000 + + + mm + + + 2 + + + 0.000000000000000 + + + + + + + Height: + + + + + + + + 0 + 0 + + + + + 80 + 20 + + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 1.000000000000000 + + + 1000000000.000000000000000 + + + mm + + + 2 + + + 0.000000000000000 + + + + + + + + + + + 9 - - - - - - - - Qt::Horizontal - + + 6 + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + + 0 + 0 + + + + + 80 + 20 + + + + Qt::LeftToRight + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 1.000000000000000 + + + 1000000000.000000000000000 + + + mm + + + 2 + + + 0.000000000000000 + + + + + + + Diameter: + + + + + + + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Diameter: + + + + + + + + 0 + 0 + + + + + 80 + 20 + + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 1.000000000000000 + + + 1000000000.000000000000000 + + + mm + + + 2 + + + 0.000000000000000 + + + + + + + Thickness: + + + + + + + + 0 + 0 + + + + + 80 + 20 + + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 1.000000000000000 + + + 1000000000.000000000000000 + + + mm + + + 2 + + + 0.000000000000000 + + + + + + + @@ -98,17 +316,7 @@ - Leave references blank - - - - - - - to choose all remaining shapes - - - true + Leave blank to choose all remaining shapes @@ -137,7 +345,6 @@ l_label_text_1 - l_label_text_2 pushButton_Reference list_References verticalSpacer @@ -145,6 +352,30 @@ + + + Gui::InputField + QLineEdit +
Gui/InputField.h
+
+
- + + + cb_crosssectiontype + currentIndexChanged(int) + widget_stack + setCurrentIndex(int) + + + 245 + 45 + + + 245 + 126 + + + + diff --git a/src/Mod/Fem/_TaskPanelFemBeamSection.py b/src/Mod/Fem/_TaskPanelFemBeamSection.py index ffd0703b533e..1da9d4ab7d2a 100644 --- a/src/Mod/Fem/_TaskPanelFemBeamSection.py +++ b/src/Mod/Fem/_TaskPanelFemBeamSection.py @@ -31,6 +31,7 @@ import FreeCADGui from PySide import QtGui from PySide import QtCore +import _FemBeamSection class _TaskPanelFemBeamSection: @@ -39,33 +40,27 @@ def __init__(self, obj): FreeCADGui.Selection.clearSelection() self.sel_server = None self.obj = obj - self.references = [] - if self.obj.References: - self.tuplereferences = self.obj.References - self.get_references() self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelFemBeamSection.ui") - - if self.obj.SectionType == 'Rectangular': - self.form.rb_Rect.setChecked(True) - elif self.obj.SectionType == 'Circular': - self.form.rb_Circ.setChecked(True) - elif self.obj.SectionType == 'Pipe': - self.form.rb_Pipe.setChecked(True) - + QtCore.QObject.connect(self.form.cb_crosssectiontype, QtCore.SIGNAL("activated(int)"), self.sectiontype_changed) + QtCore.QObject.connect(self.form.if_rec_height, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.rec_height_changed) + QtCore.QObject.connect(self.form.if_rec_width, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.rec_width_changed) + QtCore.QObject.connect(self.form.if_circ_diameter, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.circ_diameter_changed) + QtCore.QObject.connect(self.form.if_pipe_diameter, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.pipe_diameter_changed) + QtCore.QObject.connect(self.form.if_pipe_thickness, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.pipe_thickness_changed) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) - QtCore.QObject.connect(self.form.rb_Rect, QtCore.SIGNAL("clicked()"), self.rect_section) - QtCore.QObject.connect(self.form.rb_Circ, QtCore.SIGNAL("clicked()"), self.circ_section) - QtCore.QObject.connect(self.form.rb_Pipe, QtCore.SIGNAL("clicked()"), self.pipe_section) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) - self.rebuild_list_References() + self.form.cb_crosssectiontype.addItems(_FemBeamSection._FemBeamSection.known_beam_types) + + self.get_beamsection_props() + self.update() def accept(self): + self.set_beamsection_props() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) - self.obj.References = self.references FreeCADGui.ActiveDocument.resetEdit() FreeCAD.ActiveDocument.recompute() return True @@ -76,6 +71,59 @@ def reject(self): FreeCADGui.ActiveDocument.resetEdit() return True + def get_beamsection_props(self): + self.references = [] + if self.obj.References: + self.tuplereferences = self.obj.References + self.get_references() + self.SectionType = self.obj.SectionType + self.RectHeight = self.obj.RectHeight + self.RectWidth = self.obj.RectWidth + self.CircRadius = self.obj.CircRadius + self.PipeRadius = self.obj.PipeRadius + self.PipeThickness = self.obj.PipeThickness + + def set_beamsection_props(self): + self.obj.References = self.references + self.obj.SectionType = self.SectionType + self.obj.RectHeight = self.RectHeight + self.obj.RectWidth = self.RectWidth + self.obj.CircRadius = self.CircRadius + self.obj.PipeRadius = self.PipeRadius + self.obj.PipeThickness = self.PipeThickness + + def update(self): + 'fills the widgets' + index_crosssectiontype = self.form.cb_crosssectiontype.findText(self.SectionType) + self.form.cb_crosssectiontype.setCurrentIndex(index_crosssectiontype) + self.form.if_rec_height.setText(self.RectHeight.UserString) + self.form.if_rec_width.setText(self.RectWidth.UserString) + self.form.if_circ_diameter.setText(self.CircRadius.UserString) + self.form.if_pipe_diameter.setText(self.PipeRadius.UserString) + self.form.if_pipe_thickness.setText(self.PipeThickness.UserString) + self.rebuild_list_References() + + def sectiontype_changed(self, index): + if index < 0: + return + self.form.cb_crosssectiontype.setCurrentIndex(index) + self.SectionType = str(self.form.cb_crosssectiontype.itemText(index)) # form returns unicode + + def rec_height_changed(self, base_quantity_value): + self.RectHeight = base_quantity_value + + def rec_width_changed(self, base_quantity_value): + self.RectWidth = base_quantity_value + + def circ_diameter_changed(self, base_quantity_value): + self.CircRadius = base_quantity_value + + def pipe_diameter_changed(self, base_quantity_value): + self.PipeRadius = base_quantity_value + + def pipe_thickness_changed(self, base_quantity_value): + self.PipeThickness = base_quantity_value + def get_references(self): for ref in self.tuplereferences: for elem in ref[1]: @@ -111,23 +159,6 @@ def add_references(self): import FemSelectionObserver self.sel_server = FemSelectionObserver.FemSelectionObserver(self.selectionParser, print_message) - def rect_section(self): - '''Called if Rectangular radio button is triggered''' - self.obj.SectionType = 'Rectangular' - self.obj.RectWidth = 20.0 - self.obj.RectHeight = 20.0 - - def circ_section(self): - '''Called if Circular radio button is triggered''' - self.obj.SectionType = 'Circular' - self.obj.CircRadius = 20.0 - - def pipe_section(self): - '''Called if Pipe radio button is triggered''' - self.obj.SectionType = 'Pipe' - self.obj.PipeRadius = 20.0 - self.obj.PipeThickness = 2.0 - def selectionParser(self, selection): # print('selection: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1]) if hasattr(selection[0], "Shape"): From c06c150d9b35d5005f224e894f6375ef3ac7c41e Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:51 +0100 Subject: [PATCH 42/60] FEM: beam section properties, use diameter instead of radius --- src/Mod/Fem/FemBeamSection.py | 14 ++++++++++---- src/Mod/Fem/FemInputWriterCcx.py | 4 ++-- src/Mod/Fem/_FemBeamSection.py | 6 +++--- src/Mod/Fem/_TaskPanelFemBeamSection.py | 16 ++++++++-------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/Mod/Fem/FemBeamSection.py b/src/Mod/Fem/FemBeamSection.py index 8d24a9703c27..f1f5e5e44ef0 100644 --- a/src/Mod/Fem/FemBeamSection.py +++ b/src/Mod/Fem/FemBeamSection.py @@ -31,15 +31,21 @@ import _FemBeamSection -def makeFemBeamSection(width=20.0, height=20.0, name="BeamSection"): +def makeFemBeamSection(sectiontype='Rectangular', width=10.0, height=25.0, name="BeamSection"): '''makeFemBeamSection([width], [height], [name]): creates an beamsection object to define a cross section''' obj = FreeCAD.ActiveDocument.addObject("Fem::FeaturePython", name) _FemBeamSection._FemBeamSection(obj) + sec_types = _FemBeamSection._FemBeamSection.known_beam_types + if sectiontype not in sec_types: + FreeCAD.Console.PrintError("Section type is not known. Set to " + sec_types[0] + " \n") + obj.SectionType = sec_types[0] + else: + obj.SectionType = sectiontype obj.RectWidth = width obj.RectHeight = height - obj.CircRadius = height - obj.PipeRadius = height - obj.PipeThickness = 2.0 + obj.CircDiameter = height + obj.PipeDiameter = height + obj.PipeThickness = width if FreeCAD.GuiUp: import _ViewProviderFemBeamSection _ViewProviderFemBeamSection._ViewProviderFemBeamSection(obj.ViewObject) diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index f82aec1b03dc..3d43b2d5fba3 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -550,12 +550,12 @@ def write_femelementsets(self, f): setion_geo = str(height) + ', ' + str(width) + '\n' setion_def = '*BEAM SECTION, ' + elsetdef + material + section_type + '\n' elif beamsec_obj.SectionType == 'Circular': - radius = beamsec_obj.CircRadius.getValueAs('mm') + radius = 0.5 * beamsec_obj.CircDiameter.getValueAs('mm') section_type = ', SECTION=CIRC' setion_geo = str(radius) + '\n' setion_def = '*BEAM SECTION, ' + elsetdef + material + section_type + '\n' elif beamsec_obj.SectionType == 'Pipe': - radius = beamsec_obj.PipeRadius.getValueAs('mm') + radius = 0.5 * beamsec_obj.PipeDiameter.getValueAs('mm') thickness = beamsec_obj.PipeThickness.getValueAs('mm') section_type = ', SECTION=PIPE' setion_geo = str(radius) + ', ' + str(thickness) + '\n' diff --git a/src/Mod/Fem/_FemBeamSection.py b/src/Mod/Fem/_FemBeamSection.py index 4fa1d18ad07d..daf6c453918e 100644 --- a/src/Mod/Fem/_FemBeamSection.py +++ b/src/Mod/Fem/_FemBeamSection.py @@ -36,9 +36,9 @@ class _FemBeamSection: def __init__(self, obj): obj.addProperty("App::PropertyLength", "RectWidth", "RectBeamSection", "set width of the rectangular beam elements") obj.addProperty("App::PropertyLength", "RectHeight", "RectBeamSection", "set height of therectangular beam elements") - obj.addProperty("App::PropertyLength", "CircRadius", "CircBeamSection", "set radius of the circular beam elements") - obj.addProperty("App::PropertyLength", "PipeRadius", "PipeBeamSection", "set height of the pipe beam elements") - obj.addProperty("App::PropertyLength", "PipeThickness", "PipeBeamSection", "set height of the pipe beam elements") + obj.addProperty("App::PropertyLength", "CircDiameter", "CircBeamSection", "set diameter of the circular beam elements") + obj.addProperty("App::PropertyLength", "PipeDiameter", "PipeBeamSection", "set outer diameter of the pipe beam elements") + obj.addProperty("App::PropertyLength", "PipeThickness", "PipeBeamSection", "set thickness of the pipe beam elements") obj.addProperty("App::PropertyEnumeration", "SectionType", "BeamSection", "select beam section type") obj.addProperty("App::PropertyLinkSubList", "References", "BeamSection", "List of beam section shapes") obj.SectionType = _FemBeamSection.known_beam_types diff --git a/src/Mod/Fem/_TaskPanelFemBeamSection.py b/src/Mod/Fem/_TaskPanelFemBeamSection.py index 1da9d4ab7d2a..312e83cf419a 100644 --- a/src/Mod/Fem/_TaskPanelFemBeamSection.py +++ b/src/Mod/Fem/_TaskPanelFemBeamSection.py @@ -79,8 +79,8 @@ def get_beamsection_props(self): self.SectionType = self.obj.SectionType self.RectHeight = self.obj.RectHeight self.RectWidth = self.obj.RectWidth - self.CircRadius = self.obj.CircRadius - self.PipeRadius = self.obj.PipeRadius + self.CircDiameter = self.obj.CircDiameter + self.PipeDiameter = self.obj.PipeDiameter self.PipeThickness = self.obj.PipeThickness def set_beamsection_props(self): @@ -88,8 +88,8 @@ def set_beamsection_props(self): self.obj.SectionType = self.SectionType self.obj.RectHeight = self.RectHeight self.obj.RectWidth = self.RectWidth - self.obj.CircRadius = self.CircRadius - self.obj.PipeRadius = self.PipeRadius + self.obj.CircDiameter = self.CircDiameter + self.obj.PipeDiameter = self.PipeDiameter self.obj.PipeThickness = self.PipeThickness def update(self): @@ -98,8 +98,8 @@ def update(self): self.form.cb_crosssectiontype.setCurrentIndex(index_crosssectiontype) self.form.if_rec_height.setText(self.RectHeight.UserString) self.form.if_rec_width.setText(self.RectWidth.UserString) - self.form.if_circ_diameter.setText(self.CircRadius.UserString) - self.form.if_pipe_diameter.setText(self.PipeRadius.UserString) + self.form.if_circ_diameter.setText(self.CircDiameter.UserString) + self.form.if_pipe_diameter.setText(self.PipeDiameter.UserString) self.form.if_pipe_thickness.setText(self.PipeThickness.UserString) self.rebuild_list_References() @@ -116,10 +116,10 @@ def rec_width_changed(self, base_quantity_value): self.RectWidth = base_quantity_value def circ_diameter_changed(self, base_quantity_value): - self.CircRadius = base_quantity_value + self.CircDiameter = base_quantity_value def pipe_diameter_changed(self, base_quantity_value): - self.PipeRadius = base_quantity_value + self.PipeDiameter = base_quantity_value def pipe_thickness_changed(self, base_quantity_value): self.PipeThickness = base_quantity_value From 8b61027de2a85d93608d0ed59045e0a3ab6c809b Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:54 +0100 Subject: [PATCH 43/60] FEM: material task panel, add explizit solid selection mode, add support for Solids of Compounds and CompSolids --- src/Mod/Fem/FemMeshTools.py | 6 +- src/Mod/Fem/TaskPanelMechanicalMaterial.ui | 42 +++++++--- src/Mod/Fem/_TaskPanelMechanicalMaterial.py | 86 ++++++++++++++------- 3 files changed, 93 insertions(+), 41 deletions(-) diff --git a/src/Mod/Fem/FemMeshTools.py b/src/Mod/Fem/FemMeshTools.py index 25141ccab8d0..2aea71598206 100644 --- a/src/Mod/Fem/FemMeshTools.py +++ b/src/Mod/Fem/FemMeshTools.py @@ -72,10 +72,10 @@ def get_femnodes_by_references(femmesh, references): def get_femnodes_by_refshape(femmesh, ref): nodes = [] for refelement in ref[1]: - if refelement: - r = ref[0].Shape.getElement(refelement) # Vertex, Edge, Face + if refelement.startswith('Solid'): + r = ref[0].Shape.Solids[int(refelement.lstrip('Solid')) - 1] # Solid else: - r = ref[0].Shape # solid + r = ref[0].Shape.getElement(refelement) # Face, Edge, Vertex print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', refelement) if r.ShapeType == 'Vertex': nodes += femmesh.getNodesByVertex(r) diff --git a/src/Mod/Fem/TaskPanelMechanicalMaterial.ui b/src/Mod/Fem/TaskPanelMechanicalMaterial.ui index aba82eed5d20..a836fec34486 100644 --- a/src/Mod/Fem/TaskPanelMechanicalMaterial.ui +++ b/src/Mod/Fem/TaskPanelMechanicalMaterial.ui @@ -7,7 +7,7 @@ 0 0 370 - 713 + 700 @@ -57,17 +57,7 @@ - Leave references blank - - - - - - - to choose all remaining shapes - - - true + Leave blank to choose all remaining shapes @@ -81,6 +71,34 @@ + + + + + + Face, Edge + + + true + + + + + + + Solid + + + + + + + <html><head/><body><p>Selection</p></body></html> + + + + + diff --git a/src/Mod/Fem/_TaskPanelMechanicalMaterial.py b/src/Mod/Fem/_TaskPanelMechanicalMaterial.py index 5b854f3796e2..984b899e069a 100644 --- a/src/Mod/Fem/_TaskPanelMechanicalMaterial.py +++ b/src/Mod/Fem/_TaskPanelMechanicalMaterial.py @@ -40,6 +40,9 @@ def __init__(self, obj): FreeCADGui.Selection.clearSelection() self.sel_server = None self.obj = obj + self.selection_mode_solid = False + self.selection_mode_std_print_message = "Select Faces and Edges by single click on them to add them to the list." + self.selection_mode_solid_print_message = "Select Solids by single click on a Face or Edge which belongs to the Solid, to add the Solid to the list." self.material = self.obj.Material self.references = [] if self.obj.References: @@ -54,6 +57,8 @@ def __init__(self, obj): QtCore.QObject.connect(self.form.spinBox_poisson_ratio, QtCore.SIGNAL("valueChanged(double)"), self.pr_changed) QtCore.QObject.connect(self.form.input_fd_density, QtCore.SIGNAL("valueChanged(double)"), self.density_changed) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) + QtCore.QObject.connect(self.form.rb_standard, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_standard) + QtCore.QObject.connect(self.form.rb_solid, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_solid) QtCore.QObject.connect(self.form.input_fd_thermal_conductivity, QtCore.SIGNAL("valueChanged(double)"), self.tc_changed) QtCore.QObject.connect(self.form.input_fd_expansion_coefficient, QtCore.SIGNAL("valueChanged(double)"), self.tec_changed) QtCore.QObject.connect(self.form.input_fd_specific_heat, QtCore.SIGNAL("valueChanged(double)"), self.sh_changed) @@ -102,6 +107,16 @@ def remove_active_sel_server(self): if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) + def choose_selection_mode_standard(self, state): + self.selection_mode_solid = not state + if self.sel_server and not self.selection_mode_solid: + print(self.selection_mode_std_print_message) + + def choose_selection_mode_solid(self, state): + self.selection_mode_solid = state + if self.sel_server and self.selection_mode_solid: + print(self.selection_mode_solid_print_message) + def get_references(self): for ref in self.tuplereferences: for elem in ref[1]: @@ -111,10 +126,10 @@ def has_equal_references_shape_types(self): if not self.references: self.references_shape_type = None for ref in self.references: - if ref[1]: - r = ref[0].Shape.getElement(ref[1]) + if ref[1].startswith('Solid'): + r = ref[0].Shape.Solids[int(ref[1].lstrip('Solid')) - 1] # Solid else: - r = ref[0].Shape + r = ref[0].Shape.getElement(ref[1]) # Face, Edge # print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1]) if self.references_shape_type is None: self.references_shape_type = r.ShapeType @@ -339,33 +354,52 @@ def add_references(self): # here the addReference button EditTaskPanel has to be triggered to start selection mode FreeCADGui.Selection.clearSelection() # start SelectionObserver and parse the function to add the References to the widget - # TODO add a ToolTip with print_message if the mouse pointer is over addReference button - print_message = "Select Edges and Faces by single click on them or Solids by single click on a Vertex to add them to the list" + if self.selection_mode_solid: # print message on button click + print_message = self.selection_mode_solid_print_message + else: + print_message = self.selection_mode_std_print_message import FemSelectionObserver self.sel_server = FemSelectionObserver.FemSelectionObserver(self.selectionParser, print_message) def selectionParser(self, selection): - # print('selection: ', selection[0].Shape.ShapeType, ' --> ', selection[0].Name, ' --> ', selection[1]) - if hasattr(selection[0], "Shape"): - if selection[1]: - elt = selection[0].Shape.getElement(selection[1]) - if elt.ShapeType == "Vertex": - if selection[0].Shape.ShapeType == "Solid": - elt = selection[0].Shape - selection = (selection[0], '') - else: - FreeCAD.Console.PrintMessage("Selected Vertex does not belong to a Solid: " + selection[0].Name + " is a " + selection[0].Shape.ShapeType + " \n") - if elt.ShapeType == 'Edge' or elt.ShapeType == 'Face' or elt.ShapeType == 'Solid': - if not self.references: - self.references_shape_type = elt.ShapeType - if elt.ShapeType == self.references_shape_type: - if selection not in self.references: - self.references.append(selection) - self.rebuild_list_References() - else: - FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is in reference list already!\n') - else: - FreeCAD.Console.PrintMessage(elt.ShapeType + ' selected, but reference list has ' + self.references_shape_type + 's already!\n') + print('selection: ', selection[0].Shape.ShapeType, ' --> ', selection[0].Name, ' --> ', selection[1]) + if hasattr(selection[0], "Shape") and selection[1]: + elt = selection[0].Shape.getElement(selection[1]) + if self.selection_mode_solid: + # in solid selection mode use edges and faces for selection of a solid + solid_to_add = None + if elt.ShapeType == 'Edge': + found_edge = False + for i, s in enumerate(selection[0].Shape.Solids): + for e in s.Edges: + if elt.isSame(e): + if not found_edge: + solid_to_add = str(i + 1) + else: + FreeCAD.Console.PrintMessage('Edge belongs to more than one solid\n') + solid_to_add = None + found_edge = True + elif elt.ShapeType == 'Face': + found_face = False + for i, s in enumerate(selection[0].Shape.Solids): + for e in s.Faces: + if elt.isSame(e): + if not found_face: + solid_to_add = str(i + 1) + else: + FreeCAD.Console.PrintMessage('Face belongs to more than one solid\n') + solid_to_add = None + found_edge = True + if solid_to_add: + selection = (selection[0], 'Solid' + solid_to_add) + print('selection element changed to Solid: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1]) + else: + return + if selection not in self.references: + self.references.append(selection) + self.rebuild_list_References() + else: + FreeCAD.Console.PrintMessage(selection[0].Name + ' --> ' + selection[1] + ' is in reference list already!\n') def rebuild_list_References(self): self.form.list_References.clear() From d64e2cfd5ea76a98e1a86edf1d576edef0d96846 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:57 +0100 Subject: [PATCH 44/60] FEM: implement get_element since getElement does not return Solid elements --- src/Mod/Fem/FemGmshTools.py | 13 +++---------- src/Mod/Fem/FemMeshTools.py | 19 +++++++++---------- src/Mod/Fem/_TaskPanelMechanicalMaterial.py | 6 ++---- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/Mod/Fem/FemGmshTools.py b/src/Mod/Fem/FemGmshTools.py index 0db5c765d463..1831138af8ec 100644 --- a/src/Mod/Fem/FemGmshTools.py +++ b/src/Mod/Fem/FemGmshTools.py @@ -29,6 +29,7 @@ import FreeCAD import Fem +import FemMeshTools import Units import subprocess import tempfile @@ -218,7 +219,6 @@ def get_gmsh_command(self): def get_group_data(self): if self.analysis: print(' Group meshing.') - import FemMeshTools self.group_elements = FemMeshTools.get_analysis_group_elements(self.analysis, self.part_obj) print(' {}'.format(self.group_elements)) else: @@ -240,11 +240,7 @@ def get_group_data(self): for eles in sub[1]: # print(eles) # element if search_ele_in_shape_to_mesh: - if eles.startswith('Solid'): - ele_shape = sub[0].Shape.Solids[int(eles.lstrip('Solid')) - 1] # Solid - else: - ele_shape = sub[0].Shape.getElement(eles) # Face, Edge, Vertex - import FemMeshTools + ele_shape = FemMeshTools.get_element(sub[0], eles) # the method getElement(element) does not return Solid elements found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) if found_element: eles = found_element @@ -258,10 +254,7 @@ def get_group_data(self): print(' {}'.format(self.ele_length_map)) self.ele_node_map = {} # { 'ElementString' : [element nodes] } for elel in self.ele_length_map: - if elel.startswith('Solid'): - ele_shape = self.part_obj.Shape.Solids[int(elel.lstrip('Solid')) - 1] # Solid - else: - ele_shape = self.part_obj.Shape.getElement(elel) # Face, Edge, Vertex + ele_shape = FemMeshTools.get_element(self.part_obj, elel) # the method getElement(element) does not return Solid elements ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) self.ele_node_map[elel] = ele_vertexes print(' {}'.format(self.ele_node_map)) diff --git a/src/Mod/Fem/FemMeshTools.py b/src/Mod/Fem/FemMeshTools.py index 2aea71598206..4d76e2ed3279 100644 --- a/src/Mod/Fem/FemMeshTools.py +++ b/src/Mod/Fem/FemMeshTools.py @@ -72,10 +72,7 @@ def get_femnodes_by_references(femmesh, references): def get_femnodes_by_refshape(femmesh, ref): nodes = [] for refelement in ref[1]: - if refelement.startswith('Solid'): - r = ref[0].Shape.Solids[int(refelement.lstrip('Solid')) - 1] # Solid - else: - r = ref[0].Shape.getElement(refelement) # Face, Edge, Vertex + r = get_element(ref[0], refelement) # the method getElement(element) does not return Solid elements print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', refelement) if r.ShapeType == 'Vertex': nodes += femmesh.getNodesByVertex(r) @@ -1018,12 +1015,7 @@ def get_analysis_group_elements(aAnalysis, aPart): # print(parent) # print(childs) for child in childs: - if child: - # Face, Edge, Vertex - ref_shape = parent.Shape.getElement(child) - else: - # Solid - ref_shape = parent.Shape + ref_shape = get_element(parent, child) # the method getElement(element) does not return Solid elements if not stype: stype = ref_shape.ShapeType elif stype != ref_shape.ShapeType: @@ -1240,6 +1232,13 @@ def is_same_geometry(shape1, shape2): return False +def get_element(part, element): + if element.startswith('Solid'): + return part.Shape.Solids[int(element.lstrip('Solid')) - 1] # Solid + else: + return part.Shape.getElement(element) # Face, Edge, Vertex + + def femelements_count_ok(len_femelement_table, count_femelements): if count_femelements == len_femelement_table: print('Count FEM elements as sum of constraints: ', count_femelements) diff --git a/src/Mod/Fem/_TaskPanelMechanicalMaterial.py b/src/Mod/Fem/_TaskPanelMechanicalMaterial.py index 984b899e069a..21f706f1f575 100644 --- a/src/Mod/Fem/_TaskPanelMechanicalMaterial.py +++ b/src/Mod/Fem/_TaskPanelMechanicalMaterial.py @@ -123,13 +123,11 @@ def get_references(self): self.references.append((ref[0], elem)) def has_equal_references_shape_types(self): + import FemMeshTools if not self.references: self.references_shape_type = None for ref in self.references: - if ref[1].startswith('Solid'): - r = ref[0].Shape.Solids[int(ref[1].lstrip('Solid')) - 1] # Solid - else: - r = ref[0].Shape.getElement(ref[1]) # Face, Edge + r = FemMeshTools.get_element(ref[0], ref[1]) # the method getElement(element) does not return Solid elements # print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1]) if self.references_shape_type is None: self.references_shape_type = r.ShapeType From a8b61ba8338764e72825d495798dc963d7e8631c Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:12:00 +0100 Subject: [PATCH 45/60] FEM: gmsh mesh obj, use 2nd order as standard and remove Automatic --- src/Mod/Fem/FemGmshTools.py | 4 ++-- src/Mod/Fem/TaskPanelFemMeshGmsh.ui | 16 +++------------- src/Mod/Fem/_FemMeshGmsh.py | 6 +++--- src/Mod/Fem/_TaskPanelFemMeshGmsh.py | 12 ------------ 4 files changed, 8 insertions(+), 30 deletions(-) diff --git a/src/Mod/Fem/FemGmshTools.py b/src/Mod/Fem/FemGmshTools.py index 1831138af8ec..d3ec237c83e5 100644 --- a/src/Mod/Fem/FemGmshTools.py +++ b/src/Mod/Fem/FemGmshTools.py @@ -58,11 +58,11 @@ def __init__(self, gmsh_mesh_obj, analysis=None): self.clmin = Units.Quantity(self.mesh_obj.CharacteristicLengthMin).Value # order - # known_element_orders = ['Automatic', '1st', '2nd'] + # known_element_orders = ['1st', '2nd'] self.order = self.mesh_obj.ElementOrder if self.order == '1st': self.order = '1' - elif self.order == 'Automatic' or self.order == '2nd': + elif self.order == '2nd': self.order = '2' else: print('Error in order') diff --git a/src/Mod/Fem/TaskPanelFemMeshGmsh.ui b/src/Mod/Fem/TaskPanelFemMeshGmsh.ui index 48f738a8ace1..cb1f13acaf80 100644 --- a/src/Mod/Fem/TaskPanelFemMeshGmsh.ui +++ b/src/Mod/Fem/TaskPanelFemMeshGmsh.ui @@ -42,23 +42,13 @@ - - - Mesh element order: - - - - - - - Max element size (0.0 = Auto): - + @@ -95,14 +85,14 @@ - + Min element size (0.0 = Auto): - + diff --git a/src/Mod/Fem/_FemMeshGmsh.py b/src/Mod/Fem/_FemMeshGmsh.py index 2e956e91d8a5..82dadff8ec96 100644 --- a/src/Mod/Fem/_FemMeshGmsh.py +++ b/src/Mod/Fem/_FemMeshGmsh.py @@ -34,7 +34,7 @@ class _FemMeshGmsh(): # they will be used from the task panel too, thus they need to be outside of the __init__ known_element_dimensions = ['Automatic', '1D', '2D', '3D'] - known_element_orders = ['Automatic', '1st', '2nd'] + known_element_orders = ['1st', '2nd'] known_mesh_algorithm_2D = ['Automatic', 'MeshAdapt', 'Delaunay', 'Frontal', 'BAMG', 'DelQuad'] known_mesh_algorithm_3D = ['Automatic', 'Delaunay', 'New Delaunay', 'Frontal', 'Frontal Delaunay', 'Frontal Hex', 'MMG3D', 'R-tree'] @@ -59,9 +59,9 @@ def __init__(self, obj): obj.ElementDimension = _FemMeshGmsh.known_element_dimensions obj.ElementDimension = 'Automatic' # according ShapeType of Part to mesh - obj.addProperty("App::PropertyEnumeration", "ElementOrder", "FEM GMSH Mesh Params", "Order of mesh elements (Auto will be 2nd)") + obj.addProperty("App::PropertyEnumeration", "ElementOrder", "FEM GMSH Mesh Params", "Order of mesh elements") obj.ElementOrder = _FemMeshGmsh.known_element_orders - obj.ElementOrder = 'Automatic' # = 2nd + obj.ElementOrder = '2nd' obj.addProperty("App::PropertyBool", "OptimizeStd", "FEM GMSH Mesh Params", "Optimize tetra elements") obj.OptimizeStd = True diff --git a/src/Mod/Fem/_TaskPanelFemMeshGmsh.py b/src/Mod/Fem/_TaskPanelFemMeshGmsh.py index 8aae5d84872b..50bfabccf764 100644 --- a/src/Mod/Fem/_TaskPanelFemMeshGmsh.py +++ b/src/Mod/Fem/_TaskPanelFemMeshGmsh.py @@ -51,11 +51,9 @@ def __init__(self, obj): QtCore.QObject.connect(self.form.if_max, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.max_changed) QtCore.QObject.connect(self.form.if_min, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.min_changed) QtCore.QObject.connect(self.form.cb_dimension, QtCore.SIGNAL("activated(int)"), self.choose_dimension) - QtCore.QObject.connect(self.form.cb_order, QtCore.SIGNAL("activated(int)"), self.choose_order) QtCore.QObject.connect(self.Timer, QtCore.SIGNAL("timeout()"), self.update_timer_text) self.form.cb_dimension.addItems(_FemMeshGmsh._FemMeshGmsh.known_element_dimensions) - self.form.cb_order.addItems(_FemMeshGmsh._FemMeshGmsh.known_element_orders) self.get_mesh_params() self.get_active_analysis() @@ -80,13 +78,11 @@ def clicked(self, button): def get_mesh_params(self): self.clmax = self.mesh_obj.CharacteristicLengthMax self.clmin = self.mesh_obj.CharacteristicLengthMin - self.order = self.mesh_obj.ElementOrder self.dimension = self.mesh_obj.ElementDimension def set_mesh_params(self): self.mesh_obj.CharacteristicLengthMax = self.clmax self.mesh_obj.CharacteristicLengthMin = self.clmin - self.mesh_obj.ElementOrder = self.order self.mesh_obj.ElementDimension = self.dimension def update(self): @@ -95,8 +91,6 @@ def update(self): self.form.if_min.setText(self.clmin.UserString) index_dimension = self.form.cb_dimension.findText(self.dimension) self.form.cb_dimension.setCurrentIndex(index_dimension) - index_order = self.form.cb_order.findText(self.order) - self.form.cb_order.setCurrentIndex(index_order) def console_log(self, message="", color="#000000"): self.console_message_gmsh = self.console_message_gmsh + '{0:4.1f}: {2}
'.\ @@ -123,12 +117,6 @@ def choose_dimension(self, index): self.form.cb_dimension.setCurrentIndex(index) self.dimension = str(self.form.cb_dimension.itemText(index)) # form returns unicode - def choose_order(self, index): - if index < 0: - return - self.form.cb_order.setCurrentIndex(index) - self.order = str(self.form.cb_order.itemText(index)) # form returns unicode - def run_gmsh(self): QApplication.setOverrideCursor(Qt.WaitCursor) self.Start = time.time() From ebfa179c0a578a28ba0c0268d478be62f2ca69c8 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:12:03 +0100 Subject: [PATCH 46/60] FEM: gmsh mesh obj, element dimension, use From Shape instead of Automatic --- src/Mod/Fem/FemGmshTools.py | 8 ++++---- src/Mod/Fem/_FemMeshGmsh.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Mod/Fem/FemGmshTools.py b/src/Mod/Fem/FemGmshTools.py index d3ec237c83e5..1fc4453d1e76 100644 --- a/src/Mod/Fem/FemGmshTools.py +++ b/src/Mod/Fem/FemGmshTools.py @@ -68,7 +68,6 @@ def __init__(self, gmsh_mesh_obj, analysis=None): print('Error in order') # dimension - # known_element_dimensions = ['Automatic', '1D', '2D', '3D'] self.dimension = self.mesh_obj.ElementDimension # Algorithm2D @@ -129,9 +128,10 @@ def create_mesh(self): def get_dimension(self): # Dimension - # GMSH uses the hightest availabe. - # A use case for not auto would be a surface (2D) mesh of a solid or other 3d shape - if self.dimension == 'Automatic': + # known_element_dimensions = ['From Shape', '1D', '2D', '3D'] + # if not given, GMSH uses the hightest availabe. + # A use case for not "From Shape" would be a surface (2D) mesh of a solid + if self.dimension == 'From Shape': shty = self.part_obj.Shape.ShapeType if shty == 'Solid' or shty == 'CompSolid': # print('Found: ' + shty) diff --git a/src/Mod/Fem/_FemMeshGmsh.py b/src/Mod/Fem/_FemMeshGmsh.py index 82dadff8ec96..ebbffe79cae4 100644 --- a/src/Mod/Fem/_FemMeshGmsh.py +++ b/src/Mod/Fem/_FemMeshGmsh.py @@ -33,7 +33,7 @@ class _FemMeshGmsh(): """ # they will be used from the task panel too, thus they need to be outside of the __init__ - known_element_dimensions = ['Automatic', '1D', '2D', '3D'] + known_element_dimensions = ['From Shape', '1D', '2D', '3D'] known_element_orders = ['1st', '2nd'] known_mesh_algorithm_2D = ['Automatic', 'MeshAdapt', 'Delaunay', 'Frontal', 'BAMG', 'DelQuad'] known_mesh_algorithm_3D = ['Automatic', 'Delaunay', 'New Delaunay', 'Frontal', 'Frontal Delaunay', 'Frontal Hex', 'MMG3D', 'R-tree'] @@ -57,7 +57,7 @@ def __init__(self, obj): obj.addProperty("App::PropertyEnumeration", "ElementDimension", "FEM GMSH Mesh Params", "Dimension of mesh elements (Auto = according ShapeType of part to mesh)") obj.ElementDimension = _FemMeshGmsh.known_element_dimensions - obj.ElementDimension = 'Automatic' # according ShapeType of Part to mesh + obj.ElementDimension = 'From Shape' # according ShapeType of Part to mesh obj.addProperty("App::PropertyEnumeration", "ElementOrder", "FEM GMSH Mesh Params", "Order of mesh elements") obj.ElementOrder = _FemMeshGmsh.known_element_orders From 6378ad3aa721fdeaaf1ff188ca280b000732db33 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:12:06 +0100 Subject: [PATCH 47/60] Part: boolean splitt tools, add type property to the objects --- src/Mod/Part/BOPTools/JoinFeatures.py | 3 +++ src/Mod/Part/BOPTools/SplitFeatures.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Mod/Part/BOPTools/JoinFeatures.py b/src/Mod/Part/BOPTools/JoinFeatures.py index 3a282798fbb8..916b1e7d6954 100644 --- a/src/Mod/Part/BOPTools/JoinFeatures.py +++ b/src/Mod/Part/BOPTools/JoinFeatures.py @@ -121,6 +121,7 @@ def __init__(self,obj): obj.addProperty("App::PropertyLength","Tolerance","Connect","Tolerance when intersecting (fuzzy value). In addition to tolerances of the shapes.") obj.Proxy = self + self.Type = "FeatureConnect" def execute(self,selfobj): rst = JoinAPI.connect([obj.Shape for obj in selfobj.Objects], selfobj.Tolerance) @@ -214,6 +215,7 @@ def __init__(self,obj): obj.addProperty("App::PropertyLength","Tolerance","Embed","Tolerance when intersecting (fuzzy value). In addition to tolerances of the shapes.") obj.Proxy = self + self.Type = "FeatureEmbed" def execute(self,selfobj): rst = JoinAPI.embed_legacy(selfobj.Base.Shape, selfobj.Tool.Shape, selfobj.Tolerance) @@ -308,6 +310,7 @@ def __init__(self,obj): obj.addProperty("App::PropertyLength","Tolerance","Cutout","Tolerance when intersecting (fuzzy value). In addition to tolerances of the shapes.") obj.Proxy = self + self.Type = "FeatureCutout" def execute(self,selfobj): rst = JoinAPI.cutout_legacy(selfobj.Base.Shape, selfobj.Tool.Shape, selfobj.Tolerance) diff --git a/src/Mod/Part/BOPTools/SplitFeatures.py b/src/Mod/Part/BOPTools/SplitFeatures.py index 54bd775260dd..035f7c4e49f5 100644 --- a/src/Mod/Part/BOPTools/SplitFeatures.py +++ b/src/Mod/Part/BOPTools/SplitFeatures.py @@ -75,6 +75,7 @@ def __init__(self,obj): obj.addProperty("App::PropertyLength","Tolerance","BooleanFragments","Tolerance when intersecting (fuzzy value). In addition to tolerances of the shapes.") obj.Proxy = self + self.Type = "FeatureBooleanFragments" def execute(self,selfobj): shapes = [obj.Shape for obj in selfobj.Objects] @@ -203,6 +204,7 @@ def __init__(self,obj): obj.addProperty("App::PropertyLength","Tolerance","Slice","Tolerance when intersecting (fuzzy value). In addition to tolerances of the shapes.") obj.Proxy = self + self.Type = "FeatureSlice" def execute(self,selfobj): if len(selfobj.Tools) < 1: @@ -327,6 +329,7 @@ def __init__(self,obj): obj.addProperty("App::PropertyLength","Tolerance","XOR","Tolerance when intersecting (fuzzy value). In addition to tolerances of the shapes.") obj.Proxy = self + self.Type = "FeatureXOR" def execute(self,selfobj): shapes = [obj.Shape for obj in selfobj.Objects] From 7c8b9a4b2c0dfa0c7704fcbb71c282ca9925e93f Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:12:08 +0100 Subject: [PATCH 48/60] Part: boolean splitt tools, remove trailing whitspaces --- src/Mod/Part/BOPTools/GeneralFuseResult.py | 180 ++++++++++----------- src/Mod/Part/BOPTools/JoinAPI.py | 55 ++++--- src/Mod/Part/BOPTools/ShapeMerge.py | 80 ++++----- src/Mod/Part/BOPTools/SplitAPI.py | 26 +-- src/Mod/Part/BOPTools/SplitFeatures.py | 6 +- src/Mod/Part/BOPTools/Utils.py | 31 ++-- src/Mod/Part/BOPTools/__init__.py | 8 +- 7 files changed, 192 insertions(+), 194 deletions(-) diff --git a/src/Mod/Part/BOPTools/GeneralFuseResult.py b/src/Mod/Part/BOPTools/GeneralFuseResult.py index b5b34dcd5e05..6bc4a9752ecf 100644 --- a/src/Mod/Part/BOPTools/GeneralFuseResult.py +++ b/src/Mod/Part/BOPTools/GeneralFuseResult.py @@ -31,15 +31,15 @@ class GeneralFuseResult(FrozenClass): - """class GeneralFuseResult: helper object for obtaining info from results of - Part.Shape.generalFuse() method. - + """class GeneralFuseResult: helper object for obtaining info from results of + Part.Shape.generalFuse() method. + Usage: def myCustomFusionRoutine(list_of_shapes): generalFuse_return = list_of_shapes[0].generalFuse(list_of_shapes[1:]) ao = GeneralFuseResult(list_of_shapes, generalFuse_return) ... (use attributes and methods of ao) ...""" - + def __define_attributes(self): self.gfa_return = None #stores the data returned by generalFuse, supplied to class constructor @@ -51,24 +51,24 @@ def __define_attributes(self): self._pieces_of_source = [] #list of pieces (indexes) generated from a source shape, by index of source shape. List of lists of ints. self._sources_of_piece = [] #list of source shapes (indexes) the piece came from, by index of piece. List of lists of ints. - - self._element_to_source = {} #dictionary for finding, which source shapes did an element of pieces come from. key = HashableShape (element). Value = set of ints - + + self._element_to_source = {} #dictionary for finding, which source shapes did an element of pieces come from. key = HashableShape (element). Value = set of ints + self._freeze() - + def __init__(self, source_shapes, generalFuse_return): self.__define_attributes() - + self.gfa_return = generalFuse_return self.source_shapes = source_shapes self.parse() def parse(self): - """Parses the result of generalFuse recorded into self.gfa_return. Recovers missing + """Parses the result of generalFuse recorded into self.gfa_return. Recovers missing information. Fills in data structures. - + It is called automatically by class constructor.""" - + #save things to be parsed and wipe out all other data gfa_return = self.gfa_return source_shapes = self.source_shapes @@ -76,10 +76,10 @@ def parse(self): self.gfa_return = gfa_return self.source_shapes = source_shapes # and start filling in data structures... - + compound, map = self.gfa_return self.pieces = compound.childShapes() - + # create piece shape index for iPiece in range(len(self.pieces)): ha_piece = HashableShape(self.pieces[iPiece]) @@ -87,20 +87,20 @@ def parse(self): self._piece_to_index[ha_piece] = iPiece else: raise ValueError("GeneralFuseAnalyzer.parse: duplicate piece shape detected.") - # create source shape index + # create source shape index for iSource in range(len(self.source_shapes)): ha_source = HashableShape(self.source_shapes[iSource]) if not ha_source in self._source_to_index: self._source_to_index[ha_source] = iSource else: raise ValueError("GeneralFuseAnalyzer.parse: duplicate source shape detected.") - + #test if map has missing entries map_needs_repairing = False for iSource in range(len(map)): if len(map[iSource]) == 0: map_needs_repairing = True - + if map_needs_repairing: aggregate_types = set(["Wire","Shell","CompSolid","Compound"]) nonaggregate_types = set(["Vertex","Edge","Face","Solid"]) @@ -108,15 +108,15 @@ def parse(self): types = set() for piece in self.pieces: types.add(piece.ShapeType) - + types_to_extract = types.intersection(nonaggregate_types) - extractor = lambda(sh):( + extractor = lambda(sh):( (sh.Vertexes if "Vertex" in types_to_extract else []) + (sh.Edges if "Edge" in types_to_extract else []) + (sh.Faces if "Face" in types_to_extract else []) + (sh.Solids if "Solid" in types_to_extract else []) ) - + aggregate_sources_indexes = [self.indexOfSource(sh) for sh in self.source_shapes if sh.ShapeType in aggregate_types] aggregate_pieces = [sh for sh in self.pieces if sh.ShapeType in aggregate_types] assert(len(aggregate_sources_indexes) == len(aggregate_pieces)) @@ -132,13 +132,13 @@ def parse(self): #print "found piece {num} in compound {numc}".format(num= iPiece, numc= i_aggregate) if not map[iSource][-1].isSame(self.pieces[iPiece]): map[iSource].append(self.pieces[iPiece]) - + # check the map was recovered successfully for iSource in range(len(map)): if len(map[iSource]) == 0: import FreeCAD as App - App.Console.PrintWarning("Map entry {num} is empty. Source-to-piece correspondence information is probably incomplete.".format(num= iSource)) - + App.Console.PrintWarning("Map entry {num} is empty. Source-to-piece correspondence information is probably incomplete.".format(num= iSource)) + self._pieces_of_source = [[] for i in range(len(self.source_shapes))] self._sources_of_piece = [[] for i in range(len(self.pieces))] assert(len(map) == len(self.source_shapes)) @@ -148,14 +148,14 @@ def parse(self): iPiece = self.indexOfPiece(piece) self._sources_of_piece[iPiece].append(iSource) self._pieces_of_source[iSource].append(iPiece) - + def parse_elements(self): - """Fills element-to-source map. Potentially slow, so separated from general parse. + """Fills element-to-source map. Potentially slow, so separated from general parse. Needed for splitAggregates; called automatically from splitAggregates.""" - + if len(self._element_to_source)>0: return #already parsed. - + for iPiece in range(len(self.pieces)): piece = self.pieces[iPiece] for element in piece.Vertexes + piece.Edges + piece.Faces + piece.Solids: @@ -164,79 +164,79 @@ def parse_elements(self): self._element_to_source[el_h].update(set(self._sources_of_piece[iPiece])) else: self._element_to_source[el_h] = set(self._sources_of_piece[iPiece]) - + def indexOfPiece(self, piece_shape): "indexOfPiece(piece_shape): returns index of piece_shape in list of pieces" return self._piece_to_index[HashableShape(piece_shape)] def indexOfSource(self, source_shape): "indexOfSource(source_shape): returns index of source_shape in list of arguments" return self._source_to_index[HashableShape(source_shape)] - + def piecesFromSource(self, source_shape): - """piecesFromSource(source_shape): returns list of pieces (shapes) that came from + """piecesFromSource(source_shape): returns list of pieces (shapes) that came from given source shape. - - Note: aggregate pieces (e.g. wire, shell, compound) always have only one source - the - shape they came directly from. Only after executing splitAggregates and + + Note: aggregate pieces (e.g. wire, shell, compound) always have only one source - the + shape they came directly from. Only after executing splitAggregates and explodeCompounds the source lists become completely populated.""" - + ilist = self._pieces_of_source[self.indexOfSource(source_shape)] return [self.pieces[i] for i in ilist] - + def sourcesOfPiece(self, piece_shape): """sourcesOfPiece(piece_shape): returns list of source shapes given piece came from. - - Note: aggregate pieces (e.g. wire, shell, compound) always have only one source - the - shape they came directly from. Only after executing splitAggregates and + + Note: aggregate pieces (e.g. wire, shell, compound) always have only one source - the + shape they came directly from. Only after executing splitAggregates and explodeCompounds the source lists become completely populated.""" ilist = self._sources_of_piece[self.indexOfPiece(piece_shape)] return [self.source_shapes[i] for i in ilist] - + def largestOverlapCount(self): - """largestOverlapCount(self): returns the largest overlap count. For example, if three - spheres intersect and have some volume common to all three, largestOverlapCount - returns 3. - + """largestOverlapCount(self): returns the largest overlap count. For example, if three + spheres intersect and have some volume common to all three, largestOverlapCount + returns 3. + Note: the return value may be incorrect if some of the pieces are wires/shells/ compsolids/compounds. Please use explodeCompounds and splitAggregates before using this function.""" - + return max([len(ilist) for ilist in self._sources_of_piece]) - + def splitAggregates(self, pieces_to_split = None): - """splitAggregates(pieces_to_split = None): splits aggregate shapes (wires, shells, - compsolids) in pieces of GF result as cut by intersections. Also splits aggregates - inside compounds. After running this, 'self' is replaced with new data, where the + """splitAggregates(pieces_to_split = None): splits aggregate shapes (wires, shells, + compsolids) in pieces of GF result as cut by intersections. Also splits aggregates + inside compounds. After running this, 'self' is replaced with new data, where the pieces_to_split are split. - - 'pieces_to_split': list of shapes (from self.pieces), that are to be processed. If + + 'pieces_to_split': list of shapes (from self.pieces), that are to be processed. If None, all pieces will be split if possible. - - Notes: - * this routine is very important to functioning of Connect on shells and wires. + + Notes: + * this routine is very important to functioning of Connect on shells and wires. * Warning: convoluted and slow.""" - + if pieces_to_split is None: pieces_to_split = self.pieces pieces_to_split = [HashableShape(piece) for piece in pieces_to_split] pieces_to_split = set(pieces_to_split) - + self.parse_elements() new_data = GeneralFuseReturnBuilder(self.source_shapes) changed = False - + #split pieces that are not compounds.... for iPiece in range(len(self.pieces)): piece = self.pieces[iPiece] - + if HashableShape(piece) in pieces_to_split: new_pieces = self.makeSplitPieces(piece) - changed = changed or len(new_pieces)>1 + changed = changed or len(new_pieces)>1 for new_piece in new_pieces: new_data.addPiece(new_piece, self._sources_of_piece[iPiece]) else: new_data.addPiece(piece, self._sources_of_piece[iPiece]) - + #split pieces inside compounds #prepare index of existing pieces. existing_pieces = new_data._piece_to_index.copy() @@ -248,20 +248,20 @@ def splitAggregates(self, pieces_to_split = None): if ret is not None: changed = True new_data.replacePiece(i_new_piece, ret) - + if len(new_data.pieces) > len(self.pieces) or changed: self.gfa_return = new_data.getGFReturn() self.parse() #else: #print "Nothing was split" - + def _splitInCompound(self, compound, existing_pieces): - """Splits aggregates inside compound. Returns None if nothing is split, otherwise + """Splits aggregates inside compound. Returns None if nothing is split, otherwise returns compound. - existing_pieces is a dict. Key is deep hash. Value is tuple (int, shape). It is - used to search for if this split piece was already generated, and re-use the old + existing_pieces is a dict. Key is deep hash. Value is tuple (int, shape). It is + used to search for if this split piece was already generated, and re-use the old one.""" - + changed = False new_children = [] for piece in compound.childShapes(): @@ -274,7 +274,7 @@ def _splitInCompound(self, compound, existing_pieces): changed = True else: new_pieces = self.makeSplitPieces(piece) - changed = changed or len(new_pieces)>1 + changed = changed or len(new_pieces)>1 for new_piece in new_pieces: hash = HashableShape_Deep(new_piece) dummy,ex_piece = existing_pieces.get(hash, (None, None)) @@ -289,14 +289,14 @@ def _splitInCompound(self, compound, existing_pieces): else: return None - + def makeSplitPieces(self, shape): - """makeSplitPieces(self, shape): splits a shell, wire or compsolid into pieces where - it intersects with other shapes. - - Returns list of split pieces. If no splits were done, returns list containing the + """makeSplitPieces(self, shape): splits a shell, wire or compsolid into pieces where + it intersects with other shapes. + + Returns list of split pieces. If no splits were done, returns list containing the original shape.""" - + if shape.ShapeType == "Wire": bit_extractor = lambda(sh): sh.Edges joint_extractor = lambda(sh): sh.Vertexes @@ -309,7 +309,7 @@ def makeSplitPieces(self, shape): else: #can't split the shape return [shape] - + # for each joint, test if all bits it's connected to are from same number of sources. If not, this is a joint for splitting # FIXME: this is slow, and maybe can be optimized splits = [] @@ -331,7 +331,7 @@ def makeSplitPieces(self, shape): return [shape] from . import ShapeMerge - + new_pieces = ShapeMerge.mergeShapes(bit_extractor(shape), split_connections= splits, bool_compsolid= True).childShapes() if len(new_pieces) == 1: #shape was not split (split points found, but the shape remained in one piece). @@ -339,10 +339,10 @@ def makeSplitPieces(self, shape): return new_pieces def explodeCompounds(self): - """explodeCompounds(): if any of self.pieces is a compound, the compound is exploded. - After running this, 'self' is filled with new data, where pieces are updated to + """explodeCompounds(): if any of self.pieces is a compound, the compound is exploded. + After running this, 'self' is filled with new data, where pieces are updated to contain the stuff extracted from compounds.""" - + has_compounds = False for piece in self.pieces: if piece.ShapeType == "Compound": @@ -351,10 +351,10 @@ def explodeCompounds(self): return from .Utils import compoundLeaves - + new_data = GeneralFuseReturnBuilder(self.source_shapes) new_data.hasher_class = HashableShape #deep hashing not needed here. - + for iPiece in range(len(self.pieces)): piece = self.pieces[iPiece] if piece.ShapeType == "Compound": @@ -372,30 +372,30 @@ class GeneralFuseReturnBuilder(FrozenClass): def __define_attributes(self): self.pieces = [] self._piece_to_index = {} # key = hasher_class(shape). Value = (index_into_self_dot_pieces, shape). Note that GeneralFuseResult uses this item directly. - + self._pieces_from_source = [] #list of list of ints self.source_shapes = [] - + self.hasher_class = HashableShape_Deep - + self._freeze() - + def __init__(self, source_shapes): self.__define_attributes() self.source_shapes = source_shapes self._pieces_from_source = [[] for i in range(len(source_shapes))] - + def addPiece(self, piece_shape, source_shape_index_list): - """addPiece(piece_shape, source_shape_index_list): adds a piece. If the piece + """addPiece(piece_shape, source_shape_index_list): adds a piece. If the piece already exists, returns False, and only updates source<->piece map.""" - + ret = False i_piece_existing = None hash = None if piece_shape.ShapeType != "Compound": # do not catch duplicate compounds hash = self.hasher_class(piece_shape) i_piece_existing, dummy = self._piece_to_index.get(hash, (None, None)) - + if i_piece_existing is None: #adding self.pieces.append(piece_shape) @@ -410,11 +410,11 @@ def addPiece(self, piece_shape, source_shape_index_list): if not i_piece_existing in self._pieces_from_source[iSource]: self._pieces_from_source[iSource].append(i_piece_existing) return ret - + def replacePiece(self, piece_index, new_shape): assert(self.pieces[piece_index].ShapeType == "Compound") assert(new_shape.ShapeType == "Compound") self.pieces[piece_index] = new_shape - + def getGFReturn(self): - return (Part.Compound(self.pieces), [[self.pieces[iPiece] for iPiece in ilist] for ilist in self._pieces_from_source]) \ No newline at end of file + return (Part.Compound(self.pieces), [[self.pieces[iPiece] for iPiece in ilist] for ilist in self._pieces_from_source]) diff --git a/src/Mod/Part/BOPTools/JoinAPI.py b/src/Mod/Part/BOPTools/JoinAPI.py index e6f5b95ff1ee..ea57050817e9 100644 --- a/src/Mod/Part/BOPTools/JoinAPI.py +++ b/src/Mod/Part/BOPTools/JoinAPI.py @@ -36,9 +36,9 @@ def shapeOfMaxSize(list_of_shapes): """shapeOfMaxSize(list_of_shapes): finds the shape that has the largest mass in the list and returns it. The shapes in the list must be of same dimension.""" #first, check if shapes can be compared by size ShapeMerge.dimensionOfShapes(list_of_shapes) - + rel_precision = 1e-8 - + #find it! max_size = -1e100 # max size encountered so far count_max = 0 # number of shapes with size equal to max_size @@ -56,40 +56,40 @@ def shapeOfMaxSize(list_of_shapes): return shape_max def connect(list_of_shapes, tolerance = 0.0): - """connect(list_of_shapes, tolerance = 0.0): connects solids (walled objects), shells and - wires by throwing off small parts that result when splitting them at intersections. - - Compounds in list_of_shapes are automatically exploded, so self-intersecting compounds + """connect(list_of_shapes, tolerance = 0.0): connects solids (walled objects), shells and + wires by throwing off small parts that result when splitting them at intersections. + + Compounds in list_of_shapes are automatically exploded, so self-intersecting compounds are valid for connect.""" - + # explode all compounds before GFA. new_list_of_shapes = [] for sh in list_of_shapes: new_list_of_shapes.extend( compoundLeaves(sh) ) list_of_shapes = new_list_of_shapes - + #test if shapes are compatible for connecting dim = ShapeMerge.dimensionOfShapes(list_of_shapes) if dim == 0: raise TypeError("Cannot connect vertices!") - + if len(list_of_shapes) < 2: return Part.makeCompound(list_of_shapes) - + if not generalFuseIsAvailable(): #fallback to legacy result = list_of_shapes[0] for i in range(1, len(list_of_shapes)): result = connect_legacy(result, list_of_shapes[i], tolerance) return result - + pieces, map = list_of_shapes[0].generalFuse(list_of_shapes[1:], tolerance) ao = GeneralFuseResult(list_of_shapes, (pieces, map)) ao.splitAggregates() #print len(ao.pieces)," pieces total" - + keepers = [] all_danglers = [] # debug - + #add all biggest dangling pieces for src in ao.source_shapes: danglers = [piece for piece in ao.piecesFromSource(src) if len(ao.sourcesOfPiece(piece)) == 1] @@ -103,24 +103,24 @@ def connect(list_of_shapes, tolerance = 0.0): for ii in range(2, ao.largestOverlapCount()+1): list_ii_pieces = [piece for piece in ao.pieces if len(ao.sourcesOfPiece(piece)) == ii] keepers_2_add = [] - for piece in list_ii_pieces: + for piece in list_ii_pieces: if ShapeMerge.isConnected(piece, touch_test_list): keepers_2_add.append(piece) if len(keepers_2_add) == 0: break keepers.extend(keepers_2_add) touch_test_list = Part.Compound(keepers_2_add) - - + + #merge, and we are done! #print len(keepers)," pieces to keep" return ShapeMerge.mergeShapes(keepers) - + def connect_legacy(shape1, shape2, tolerance = 0.0): - """connect_legacy(shape1, shape2, tolerance = 0.0): alternative implementation of - connect, without use of generalFuse. Slow. Provided for backwards compatibility, and + """connect_legacy(shape1, shape2, tolerance = 0.0): alternative implementation of + connect, without use of generalFuse. Slow. Provided for backwards compatibility, and for older OCC.""" - + if tolerance>0.0: import FreeCAD as App App.Console.PrintWarning("connect_legacy does not support tolerance (yet).\n") @@ -134,8 +134,8 @@ def connect_legacy(shape1, shape2, tolerance = 0.0): # (TODO) def embed_legacy(shape_base, shape_tool, tolerance = 0.0): - """embed_legacy(shape_base, shape_tool, tolerance = 0.0): alternative implementation of - embed, without use of generalFuse. Slow. Provided for backwards compatibility, and + """embed_legacy(shape_base, shape_tool, tolerance = 0.0): alternative implementation of + embed, without use of generalFuse. Slow. Provided for backwards compatibility, and for older OCC.""" if tolerance>0.0: import FreeCAD as App @@ -152,12 +152,12 @@ def embed_legacy(shape_base, shape_tool, tolerance = 0.0): elif dim == 1: result = ShapeMerge.mergeShapes(result.Edges) return result - + def cutout_legacy(shape_base, shape_tool, tolerance = 0.0): - """cutout_legacy(shape_base, shape_tool, tolerance = 0.0): alternative implementation of - cutout, without use of generalFuse. Slow. Provided for backwards compatibility, and + """cutout_legacy(shape_base, shape_tool, tolerance = 0.0): alternative implementation of + cutout, without use of generalFuse. Slow. Provided for backwards compatibility, and for older OCC.""" - + if tolerance>0.0: import FreeCAD as App App.Console.PrintWarning("cutout_legacy does not support tolerance (yet).\n") @@ -168,8 +168,7 @@ def cutout_legacy(shape_base, shape_tool, tolerance = 0.0): for sh in shapes_base: result.append(cutout(sh, shape_tool)) return Part.Compound(result) - + shape_base = shapes_base[0] pieces = compoundLeaves(shape_base.cut(shape_tool)) return shapeOfMaxSize(pieces) - diff --git a/src/Mod/Part/BOPTools/ShapeMerge.py b/src/Mod/Part/BOPTools/ShapeMerge.py index 134aa98dd350..dd9fa3436358 100644 --- a/src/Mod/Part/BOPTools/ShapeMerge.py +++ b/src/Mod/Part/BOPTools/ShapeMerge.py @@ -32,12 +32,12 @@ def findSharedElements(shape_list, element_extractor): if len(shape_list) < 2: raise ValueError("findSharedElements: at least two shapes must be provided (have {num})".format(num= len(shape_list))) - + all_elements = [] #list of sets of HashableShapes for shape in shape_list: all_elements.append(set( [HashableShape(sh) for sh in element_extractor(shape)] - )) + )) shared_elements = None for elements in all_elements: if shared_elements is None: @@ -56,22 +56,22 @@ def isConnected(shape1, shape2, shape_dim = -1): return len(findSharedElements([shape1, shape2], extractor))>0 def splitIntoGroupsBySharing(list_of_shapes, element_extractor, split_connections = []): - """splitIntoGroupsBySharing(list_of_shapes, element_type, split_connections = []): find, - which shapes in list_of_shapes are connected into groups by sharing elements. - + """splitIntoGroupsBySharing(list_of_shapes, element_type, split_connections = []): find, + which shapes in list_of_shapes are connected into groups by sharing elements. + element_extractor: function that takes shape as input, and returns list of shapes. - - split_connections: list of shapes to exclude when testing for connections. Use to + + split_connections: list of shapes to exclude when testing for connections. Use to split groups on purpose. - - return: list of lists of shapes. Top-level list is list of groups; bottom level lists + + return: list of lists of shapes. Top-level list is list of groups; bottom level lists enumerate shapes of a group.""" - + split_connections = set([HashableShape(element) for element in split_connections]) - + groups = [] #list of tuples (shapes,elements). Shapes is a list of plain shapes. Elements is a set of HashableShapes - all elements of shapes in the group, excluding split_connections. - - # add shapes to the list of groups, one by one. If not connected to existing groups, + + # add shapes to the list of groups, one by one. If not connected to existing groups, # new group is created. If connected, shape is added to groups, and the groups are joined. for shape in list_of_shapes: shape_elements = set([HashableShape(element) for element in element_extractor(shape)]) @@ -90,19 +90,19 @@ def splitIntoGroupsBySharing(list_of_shapes, element_extractor, split_connection #shape bridges a gap between some groups. Join them into one. #rebuilding list of groups. First, add the new "supergroup", then add the rest groups_new = [] - + supergroup = (list(),set()) for iGroup in connected_to: supergroup[0].extend( groups[iGroup][0] )# merge lists of shapes supergroup[1].update( groups[iGroup][1] )# merge lists of elements groups_new.append(supergroup) - + for iGroup in range(len(groups)): if not iGroup in connected_to: #fixme: inefficient! groups_new.append(groups[iGroup]) groups = groups_new connected_to = [0] - + # add shape to the group it is connected to (if to many, the groups should have been unified by the above code snippet) if len(connected_to) > 0: iGroup = connected_to[0] @@ -111,16 +111,16 @@ def splitIntoGroupsBySharing(list_of_shapes, element_extractor, split_connection else: newgroup = ([shape], shape_elements) groups.append(newgroup) - + # done. Discard unnecessary data and return result. return [shapes for shapes,elements in groups] def mergeSolids(list_of_solids_compsolids, flag_single = False, split_connections = [], bool_compsolid = False): - """mergeSolids(list_of_solids, flag_single = False): merges touching solids that share - faces. If flag_single is True, it is assumed that all solids touch, and output is a - single solid. If flag_single is False, the output is a compound containing all + """mergeSolids(list_of_solids, flag_single = False): merges touching solids that share + faces. If flag_single is True, it is assumed that all solids touch, and output is a + single solid. If flag_single is False, the output is a compound containing all resulting solids. - + Note. CompSolids are treated as lists of solids - i.e., merged into solids.""" solids = [] @@ -128,7 +128,7 @@ def mergeSolids(list_of_solids_compsolids, flag_single = False, split_connection solids.extend(sh.Solids) if flag_single: cs = Part.CompSolid(solids) - return cs if bool_compsolid else Part.makeSolid(cs) + return cs if bool_compsolid else Part.makeSolid(cs) else: if len(solids)==0: return Part.Compound([]) @@ -148,7 +148,7 @@ def mergeShells(list_of_faces_shells, flag_single = False, split_connections = [ else: groups = splitIntoGroupsBySharing(faces, lambda(sh): sh.Edges, split_connections) return Part.makeCompound([Part.Shell(group) for group in groups]) - + def mergeWires(list_of_edges_wires, flag_single = False, split_connections = []): edges = [] for sh in list_of_edges_wires: @@ -158,30 +158,30 @@ def mergeWires(list_of_edges_wires, flag_single = False, split_connections = []) else: groups = splitIntoGroupsBySharing(edges, lambda(sh): sh.Vertexes, split_connections) return Part.makeCompound([Part.Wire(Part.getSortedClusters(group)[0]) for group in groups]) - + def mergeVertices(list_of_vertices, flag_single = False, split_connections = []): # no comprehensive support, just following the footprint of other mergeXXX() return Part.makeCompound(removeDuplicates(list_of_vertices)) def mergeShapes(list_of_shapes, flag_single = False, split_connections = [], bool_compsolid = False): """mergeShapes(list_of_shapes, flag_single = False, split_connections = [], bool_compsolid = False): - merges list of edges/wires into wires, faces/shells into shells, solids/compsolids + merges list of edges/wires into wires, faces/shells into shells, solids/compsolids into solids or compsolids. - + list_of_shapes: shapes to merge. Shapes must share elements in order to be merged. - - flag_single: assume all shapes in list are connected. If False, return is a compound. + + flag_single: assume all shapes in list are connected. If False, return is a compound. If True, return is the single piece (e.g. a shell). - - split_connections: list of shapes that are excluded when searching for connections. - This can be used for example to split a wire in two by supplying vertices where to + + split_connections: list of shapes that are excluded when searching for connections. + This can be used for example to split a wire in two by supplying vertices where to split. If flag_single is True, this argument is ignored. - - bool_compsolid: determines behavior when dealing with solids/compsolids. If True, - result is compsolid/compound of compsolids. If False, all touching solids and - compsolids are unified into single solids. If not merging solids/compsolids, this + + bool_compsolid: determines behavior when dealing with solids/compsolids. If True, + result is compsolid/compound of compsolids. If False, all touching solids and + compsolids are unified into single solids. If not merging solids/compsolids, this argument is ignored.""" - + if len(list_of_shapes)==0: return Part.Compound([]) args = [list_of_shapes, flag_single, split_connections] @@ -209,11 +209,11 @@ def removeDuplicates(list_of_shapes): new_list.append(sh) hashes.add(hash) return new_list - + def dimensionOfShapes(list_of_shapes): - """dimensionOfShapes(list_of_shapes): returns dimension (0D, 1D, 2D, or 3D) of shapes + """dimensionOfShapes(list_of_shapes): returns dimension (0D, 1D, 2D, or 3D) of shapes in the list. If dimension of shapes varies, TypeError is raised.""" - + dimensions = [["Vertex"], ["Edge","Wire"], ["Face","Shell"], ["Solid","CompSolid"]] dim = -1 for sh in list_of_shapes: @@ -224,4 +224,4 @@ def dimensionOfShapes(list_of_shapes): dim = iDim if iDim != dim: raise TypeError("Shapes are of different dimensions ({t1} and {t2}), and cannot be merged or compared.".format(t1= list_of_shapes[0].ShapeType, t2= sht)) - return dim \ No newline at end of file + return dim diff --git a/src/Mod/Part/BOPTools/SplitAPI.py b/src/Mod/Part/BOPTools/SplitAPI.py index af488d53526c..d155dbcd0d50 100644 --- a/src/Mod/Part/BOPTools/SplitAPI.py +++ b/src/Mod/Part/BOPTools/SplitAPI.py @@ -33,16 +33,16 @@ import FreeCAD def booleanFragments(list_of_shapes, mode, tolerance = 0.0): - """booleanFragments(list_of_shapes, mode, tolerance = 0.0): functional part of - BooleanFragments feature. It's just result of generalFuse plus a bit of + """booleanFragments(list_of_shapes, mode, tolerance = 0.0): functional part of + BooleanFragments feature. It's just result of generalFuse plus a bit of post-processing. - + mode is a string. It can be "Standard", "Split" or "CompSolid". - "Standard" - return generalFuse as is. - "Split" - wires and shells will be split at intersections. - "CompSolid" - solids will be extracted from result of generelFuse, and compsolids will + "Standard" - return generalFuse as is. + "Split" - wires and shells will be split at intersections. + "CompSolid" - solids will be extracted from result of generelFuse, and compsolids will be made from them; all other stuff is discarded.""" - + pieces, map = list_of_shapes[0].generalFuse(list_of_shapes[1:], tolerance) if mode == "Standard": return pieces @@ -61,15 +61,15 @@ def booleanFragments(list_of_shapes, mode, tolerance = 0.0): raise ValueError("Unknown mode: {mode}".format(mode= mode)) def slice(base_shape, tool_shapes, mode, tolerance = 0.0): - """slice(base_shape, tool_shapes, mode, tolerance = 0.0): functional part of + """slice(base_shape, tool_shapes, mode, tolerance = 0.0): functional part of Slice feature. Splits base_shape into pieces based on intersections with tool_shapes. - + mode is a string. It can be "Standard", "Split" or "CompSolid". - "Standard" - return like generalFuse: edges, faces and solids are split, but wires, - shells, compsolids get extra segments but remain in one piece. - "Split" - wires and shells will be split at intersections, too. + "Standard" - return like generalFuse: edges, faces and solids are split, but wires, + shells, compsolids get extra segments but remain in one piece. + "Split" - wires and shells will be split at intersections, too. "CompSolid" - slice a solid and glue it back together to make a compsolid""" - + shapes = [base_shape] + [Part.Compound([tool_shape]) for tool_shape in tool_shapes] # hack: putting tools into compounds will prevent contamination of result with pieces of tools if len(shapes) < 2: raise ValueError("No slicing objects supplied!") diff --git a/src/Mod/Part/BOPTools/SplitFeatures.py b/src/Mod/Part/BOPTools/SplitFeatures.py index 035f7c4e49f5..1d3db0a1f0c6 100644 --- a/src/Mod/Part/BOPTools/SplitFeatures.py +++ b/src/Mod/Part/BOPTools/SplitFeatures.py @@ -123,7 +123,7 @@ def onDelete(self, feature, subelements): return True def cmdCreateBooleanFragmentsFeature(name, mode): - """cmdCreateBooleanFragmentsFeature(name, mode): implementation of GUI command to create + """cmdCreateBooleanFragmentsFeature(name, mode): implementation of GUI command to create BooleanFragments feature (GFA). Mode can be "Standard", "Split", or "CompSolid".""" sel = FreeCADGui.Selection.getSelectionEx() FreeCAD.ActiveDocument.openTransaction("Create Boolean Fragments") @@ -250,7 +250,7 @@ def onDelete(self, feature, subelements): return True def cmdCreateSliceFeature(name, mode): - """cmdCreateSliceFeature(name, mode): implementation of GUI command to create + """cmdCreateSliceFeature(name, mode): implementation of GUI command to create Slice feature. Mode can be "Standard", "Split", or "CompSolid".""" sel = FreeCADGui.Selection.getSelectionEx() FreeCAD.ActiveDocument.openTransaction("Create Slice") @@ -378,7 +378,7 @@ def onDelete(self, feature, subelements): return True def cmdCreateXORFeature(name): - """cmdCreateXORFeature(name): implementation of GUI command to create + """cmdCreateXORFeature(name): implementation of GUI command to create XOR feature (GFA). Mode can be "Standard", "Split", or "CompSolid".""" sel = FreeCADGui.Selection.getSelectionEx() FreeCAD.ActiveDocument.openTransaction("Create Boolean XOR") diff --git a/src/Mod/Part/BOPTools/Utils.py b/src/Mod/Part/BOPTools/Utils.py index f615edad72c5..aaa64a6a1f6e 100644 --- a/src/Mod/Part/BOPTools/Utils.py +++ b/src/Mod/Part/BOPTools/Utils.py @@ -40,7 +40,7 @@ def __hash__(self): class HashableShape_Deep(object): """Similar to HashableShape, except that the things the shape is composed of are compared. - + Example: >>> wire2 = Part.Wire(wire1.childShapes()) >>> wire2.isSame(wire1) @@ -48,29 +48,29 @@ class HashableShape_Deep(object): >>> HashableShape_Deep(wire2) == HashableShape_Deep(wire1) True # <--- made of same set of elements """ - + def __init__(self, shape): self.Shape = shape self.hash = 0 for el in shape.childShapes(): self.hash = self.hash ^ el.hashCode() - + def __eq__(self, other): # avoiding extensive comparison for now. Just doing a few extra tests should reduce the already-low chances of false-positives if self.hash == other.hash: if len(self.Shape.childShapes()) == len(other.Shape.childShapes()): if self.Shape.ShapeType == other.Shape.ShapeType: return True - return False - + return False + def __hash__(self): return self.hash def compoundLeaves(shape_or_compound): """compoundLeaves(shape_or_compound): extracts all non-compound shapes from a nested compound. - Note: shape_or_compound may be a non-compound; then, it is the only thing in the + Note: shape_or_compound may be a non-compound; then, it is the only thing in the returned list.""" - + if shape_or_compound.ShapeType == "Compound": leaves = [] for child in shape_or_compound.childShapes(): @@ -78,23 +78,23 @@ def compoundLeaves(shape_or_compound): return leaves else: return [shape_or_compound] - + def upgradeToAggregateIfNeeded(list_of_shapes, types = None): - """upgradeToAggregateIfNeeded(list_of_shapes, types = None): upgrades non-aggregate type - shapes to aggregate-type shapes if the list has a mix of aggregate and non-aggregate + """upgradeToAggregateIfNeeded(list_of_shapes, types = None): upgrades non-aggregate type + shapes to aggregate-type shapes if the list has a mix of aggregate and non-aggregate type shapes. Returns the new list. Recursively traverses into compounds. - + aggregate shape types are Wire, Shell, CompSolid non-aggregate shape types are Vertex, Edge, Face, Solid - Compounds are something special: they are recursively traversed to upgrade the + Compounds are something special: they are recursively traversed to upgrade the contained shapes. - + Examples: list_of_shapes contains only faces -> nothing happens list_of_shapes contains faces and shells -> faces are converted to shells - + 'types' argument is needed for recursive traversal. Do not supply.""" - + import Part if types is None: types = set() @@ -127,4 +127,3 @@ def _freeze(self): def _unfreeze(self): self.__isfrozen = False - diff --git a/src/Mod/Part/BOPTools/__init__.py b/src/Mod/Part/BOPTools/__init__.py index c8cbced1fbe2..468ea8839b6e 100644 --- a/src/Mod/Part/BOPTools/__init__.py +++ b/src/Mod/Part/BOPTools/__init__.py @@ -24,7 +24,7 @@ __title__ = "BOPTools package" __url__ = "http://www.freecadweb.org" __doc__ = """BOPTools Package (part of FreeCAD). Routines that power Connect, Embed, Cutout, -BooleanFragments, Slice and XOR features of Part Workbench. Useful for other custom +BooleanFragments, Slice and XOR features of Part Workbench. Useful for other custom BOP-like operations""" ## @package BOPTools @@ -57,14 +57,14 @@ def reloadAll(): import FreeCAD if FreeCAD.GuiUp: addCommands() - + def addCommands(): "addCommands(): add all GUI commands of BOPTools package to FreeCAD command manager." JoinFeatures.addCommands() SplitFeatures.addCommands() - + def generalFuseIsAvailable(): - """generalFuseIsAvailable(): returns True if FreeCAD's Part.Shape.generalFuse is functional. + """generalFuseIsAvailable(): returns True if FreeCAD's Part.Shape.generalFuse is functional. True if Part.OCC_VERSION >= 6.9.0.""" import Part if not hasattr(Part, "OCC_VERSION"): From a245bf2abc140ec32a02befd6c691ae265debe16 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:12:11 +0100 Subject: [PATCH 49/60] FEM: mesh region: print some info if the shape to mesh is a Compound which could return unexpected meshes --- src/Mod/Fem/FemGmshTools.py | 83 +++++++++++++++------------- src/Mod/Fem/_TaskPanelFemMeshGmsh.py | 8 +++ 2 files changed, 53 insertions(+), 38 deletions(-) diff --git a/src/Mod/Fem/FemGmshTools.py b/src/Mod/Fem/FemGmshTools.py index 1fc4453d1e76..74b9f309123d 100644 --- a/src/Mod/Fem/FemGmshTools.py +++ b/src/Mod/Fem/FemGmshTools.py @@ -147,12 +147,10 @@ def get_dimension(self): FreeCAD.Console.PrintError("You can not mesh a Vertex.\n") self.dimension = '0' elif shty == 'Compound': - print('Found: ' + shty) - print('I do not know what is inside your Compound. Dimension was set to 3 anyway.') - # TODO check contents of Compound - # use dimension 3 on any shape works for 2D and 1d meshes as well ! - # but not in combination with sewfaces or connectfaces - self.dimension = '3' + print(' Found a ' + shty) + err = "A Compound could contain anything. GMSH may not return the expected mesh. It is strongly recommended to extract the shape to mesh from the Compound and use this one." + FreeCAD.Console.PrintError(err + "\n") + self.dimension = '3' # dimension 3 works for 2D and 1d shapes as well else: self.dimension = '0' FreeCAD.Console.PrintError('Could not retrive Dimension from shape type. Please choose dimension.') @@ -224,39 +222,48 @@ def get_group_data(self): else: print(' NO group meshing.') - self.ele_length_map = {} - for mr_obj in self.mesh_obj.MeshRegionList: - # print(mr_obj.Name) - # print(mr_obj.CharacteristicLength) - # print(Units.Quantity(mr_obj.CharacteristicLength).Value) - for sub in mr_obj.References: - # print(sub[0]) # Part the elements belongs to - # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh - search_ele_in_shape_to_mesh = False - if not self.part_obj.Shape.isSame(sub[0].Shape): - # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") - # print(" But we gone try to fine it in the Shape to mesh :-)") - search_ele_in_shape_to_mesh = True - for eles in sub[1]: - # print(eles) # element - if search_ele_in_shape_to_mesh: - ele_shape = FemMeshTools.get_element(sub[0], eles) # the method getElement(element) does not return Solid elements - found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) - if found_element: - eles = found_element + self.ele_length_map = {} # { 'ElementString' : element length } + self.ele_node_map = {} # { 'ElementString' : [element nodes] } + if not self.mesh_obj.MeshRegionList: + print (' No Mesh regions.') + else: + print (' Mesh regions, we need to get the elements.') + if self.part_obj.Shape.ShapeType == 'Compound': + # see http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&start=40#p149467 and http://forum.freecadweb.org/viewtopic.php?f=18&t=18780&p=149520#p149520 + err = "GMSH could return unexpected meshes for a boolean split tools Compound. It is strongly recommended to extract the shape to mesh from the Compound and use this one." + FreeCAD.Console.PrintError(err + "\n") + for mr_obj in self.mesh_obj.MeshRegionList: + # print(mr_obj.Name) + # print(mr_obj.CharacteristicLength) + # print(Units.Quantity(mr_obj.CharacteristicLength).Value) + for sub in mr_obj.References: + # print(sub[0]) # Part the elements belongs to + # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh + search_ele_in_shape_to_mesh = False + if not self.part_obj.Shape.isSame(sub[0].Shape): + # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") + # print(" But we gone try to find it in the Shape to mesh :-)") + search_ele_in_shape_to_mesh = True + for eles in sub[1]: + # print(eles) # element + if search_ele_in_shape_to_mesh: + # we gone try to find the element it in the Shape to mesh and use the found element as eles + ele_shape = FemMeshTools.get_element(sub[0], eles) # the method getElement(element) does not return Solid elements + found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) + if found_element: + eles = found_element + else: + FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") + # print(eles) # element + if eles not in self.ele_length_map: + self.ele_length_map[eles] = Units.Quantity(mr_obj.CharacteristicLength).Value else: - FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") - print(eles) # element - if eles not in self.ele_length_map: - self.ele_length_map[eles] = Units.Quantity(mr_obj.CharacteristicLength).Value - else: - FreeCAD.Console.PrintError("The element " + eles + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") + FreeCAD.Console.PrintError("The element " + eles + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") + for elel in self.ele_length_map: + ele_shape = FemMeshTools.get_element(self.part_obj, elel) # the method getElement(element) does not return Solid elements + ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) + self.ele_node_map[elel] = ele_vertexes print(' {}'.format(self.ele_length_map)) - self.ele_node_map = {} # { 'ElementString' : [element nodes] } - for elel in self.ele_length_map: - ele_shape = FemMeshTools.get_element(self.part_obj, elel) # the method getElement(element) does not return Solid elements - ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) - self.ele_node_map[elel] = ele_vertexes print(' {}'.format(self.ele_node_map)) def write_part_file(self): @@ -267,7 +274,7 @@ def write_geo(self): geo.write('Merge "' + self.temp_file_geometry + '";\n') geo.write("\n") if self.analysis and self.group_elements: - print(' We gone have found elements to make mesh groups for.') + # print(' We gone have found elements to make mesh groups for.') geo.write("// group data\n") # we use the element name of FreeCAD which starts with 1 (example: 'Face1'), same as GMSH for group in self.group_elements: diff --git a/src/Mod/Fem/_TaskPanelFemMeshGmsh.py b/src/Mod/Fem/_TaskPanelFemMeshGmsh.py index 50bfabccf764..109f6d93143b 100644 --- a/src/Mod/Fem/_TaskPanelFemMeshGmsh.py +++ b/src/Mod/Fem/_TaskPanelFemMeshGmsh.py @@ -119,6 +119,14 @@ def choose_dimension(self, index): def run_gmsh(self): QApplication.setOverrideCursor(Qt.WaitCursor) + partsh = self.obj.Part + if partsh.Shape.ShapeType == "Compound": + error_message = "The mesh to shape is a Compound, GMSH could return unexpected meshes for Compounds. It is strongly recommended to extract the shape to mesh from the Compound and use this one." + FreeCAD.Console.PrintError(error_message + "\n") + if hasattr(partsh, "Proxy") and (partsh.Proxy.Type == "FeatureBooleanFragments" or partsh.Proxy.Type == "FeatureSlice" or partsh.Proxy.Type == "FeatureXOR"): # other part obj might not have a Proxy + error_message = "The mesh to shape is a boolean split tools Compound, GMSH could return unexpected meshes for a boolean split tools Compound. It is strongly recommended to extract the shape to mesh from the Compound and use this one." + FreeCAD.Console.PrintError(error_message + "\n") + QtGui.QMessageBox.critical(None, "Shape to mesh is a Compound", error_message) self.Start = time.time() self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start)) self.console_message_gmsh = '' From 3842f9c80b82b83083c21ec820325264a4f3e319 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:12:13 +0100 Subject: [PATCH 50/60] FEM: mesh region, initialize new obj with length 0.0, do not use the obj for mesh creation if references are empty or lenght is 0.0 --- src/Mod/Fem/FemGmshTools.py | 52 ++++++++++++++++++++---------------- src/Mod/Fem/FemMeshRegion.py | 2 +- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/Mod/Fem/FemGmshTools.py b/src/Mod/Fem/FemGmshTools.py index 74b9f309123d..bd9258dc710b 100644 --- a/src/Mod/Fem/FemGmshTools.py +++ b/src/Mod/Fem/FemGmshTools.py @@ -236,29 +236,35 @@ def get_group_data(self): # print(mr_obj.Name) # print(mr_obj.CharacteristicLength) # print(Units.Quantity(mr_obj.CharacteristicLength).Value) - for sub in mr_obj.References: - # print(sub[0]) # Part the elements belongs to - # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh - search_ele_in_shape_to_mesh = False - if not self.part_obj.Shape.isSame(sub[0].Shape): - # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") - # print(" But we gone try to find it in the Shape to mesh :-)") - search_ele_in_shape_to_mesh = True - for eles in sub[1]: - # print(eles) # element - if search_ele_in_shape_to_mesh: - # we gone try to find the element it in the Shape to mesh and use the found element as eles - ele_shape = FemMeshTools.get_element(sub[0], eles) # the method getElement(element) does not return Solid elements - found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) - if found_element: - eles = found_element - else: - FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") - # print(eles) # element - if eles not in self.ele_length_map: - self.ele_length_map[eles] = Units.Quantity(mr_obj.CharacteristicLength).Value - else: - FreeCAD.Console.PrintError("The element " + eles + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") + if mr_obj.CharacteristicLength: + if mr_obj.References: + for sub in mr_obj.References: + # print(sub[0]) # Part the elements belongs to + # check if the shape of the mesh region is an element of the Part to mesh, if not try to find the element in the shape to mesh + search_ele_in_shape_to_mesh = False + if not self.part_obj.Shape.isSame(sub[0].Shape): + # print(" One element of the meshregion " + mr_obj.Name + " is not an element of the Part to mesh.") + # print(" But we gone try to find it in the Shape to mesh :-)") + search_ele_in_shape_to_mesh = True + for eles in sub[1]: + # print(eles) # element + if search_ele_in_shape_to_mesh: + # we gone try to find the element it in the Shape to mesh and use the found element as eles + ele_shape = FemMeshTools.get_element(sub[0], eles) # the method getElement(element) does not return Solid elements + found_element = FemMeshTools.find_element_in_shape(self.part_obj.Shape, ele_shape) + if found_element: + eles = found_element + else: + FreeCAD.Console.PrintError("One element of the meshregion " + mr_obj.Name + " could not be found in the Part to mesh. It will be ignored.\n") + # print(eles) # element + if eles not in self.ele_length_map: + self.ele_length_map[eles] = Units.Quantity(mr_obj.CharacteristicLength).Value + else: + FreeCAD.Console.PrintError("The element " + eles + " of the meshregion " + mr_obj.Name + " has been added to another mesh region.\n") + else: + FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the reference list is empty.\n") + else: + FreeCAD.Console.PrintError("The meshregion: " + mr_obj.Name + " is not used to create the mesh because the CharacteristicLength is 0.0 mm.\n") for elel in self.ele_length_map: ele_shape = FemMeshTools.get_element(self.part_obj, elel) # the method getElement(element) does not return Solid elements ele_vertexes = FemMeshTools.get_vertexes_by_element(self.part_obj.Shape, ele_shape) diff --git a/src/Mod/Fem/FemMeshRegion.py b/src/Mod/Fem/FemMeshRegion.py index 94fb8a2aa253..f3332d92dc0c 100644 --- a/src/Mod/Fem/FemMeshRegion.py +++ b/src/Mod/Fem/FemMeshRegion.py @@ -31,7 +31,7 @@ import _FemMeshRegion -def makeFemMeshRegion(base_mesh, element_length=2.0, name="FEMMeshRegion"): +def makeFemMeshRegion(base_mesh, element_length=0.0, name="FEMMeshRegion"): '''makeFemMeshRegion([length], [name]): creates a FEM mesh region object to define properties for a regon of a FEM mesh''' obj = FreeCAD.ActiveDocument.addObject("Fem::FeaturePython", name) _FemMeshRegion._FemMeshRegion(obj) From 5abb99b37f2bd903595258b57645fbff2ad04697 Mon Sep 17 00:00:00 2001 From: vdwalts Date: Tue, 20 Dec 2016 18:13:44 +0100 Subject: [PATCH 51/60] FEM: workaround, Scaling factor needed to obtain correct results when using DFLUX or CFLUX card. --- src/Mod/Fem/FemInputWriterCcx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 3d43b2d5fba3..d7331dead501 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -817,7 +817,7 @@ def write_constraints_temperature(self, f): f.write('\n') elif fixedtemp_obj.ConstraintType == "CFlux": f.write('*CFLUX\n') - f.write('{},11,{}\n'.format(fixedtemp_obj.Name, fixedtemp_obj.CFlux / NumberOfNodes)) + f.write('{},11,{}\n'.format(fixedtemp_obj.Name, fixedtemp_obj.CFlux * 0.001 / NumberOfNodes)) f.write('\n') def write_constraints_heatflux(self, f): @@ -845,7 +845,7 @@ def write_constraints_heatflux(self, f): v = self.mesh_object.FemMesh.getccxVolumesByFace(ho) f.write("** Heat flux on face {}\n".format(elem)) for i in v: - f.write("{},S{},{}\n".format(i[0], i[1], heatflux_obj.DFlux)) + f.write("{},S{},{}\n".format(i[0], i[1], heatflux_obj.DFlux * 0.001)) def write_outputs_types(self, f): f.write('\n***********************************************************\n') From 9b33f4130bd3200eedba852d873260d84b6c2582 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 21 Dec 2016 15:21:18 +0100 Subject: [PATCH 52/60] add command to select visible objects --- src/Gui/CommandView.cpp | 42 +++++++++++++++++++++++++++++++++++++++++ src/Gui/Workbench.cpp | 1 + 2 files changed, 43 insertions(+) diff --git a/src/Gui/CommandView.cpp b/src/Gui/CommandView.cpp index 8b9238e55912..a7211bd8ec69 100644 --- a/src/Gui/CommandView.cpp +++ b/src/Gui/CommandView.cpp @@ -906,6 +906,47 @@ bool StdCmdHideSelection::isActive(void) return (Gui::Selection().size() != 0); } +//=========================================================================== +// Std_SelectVisibleObjects +//=========================================================================== +DEF_STD_CMD_A(StdCmdSelectVisibleObjects) + +StdCmdSelectVisibleObjects::StdCmdSelectVisibleObjects() + : Command("Std_SelectVisibleObjects") +{ + sGroup = QT_TR_NOOP("Standard-View"); + sMenuText = QT_TR_NOOP("Select visible objects"); + sToolTipText = QT_TR_NOOP("Select visible objects in the active document"); + sStatusTip = QT_TR_NOOP("Select visible objects in the active document"); + sWhatsThis = "Std_SelectVisibleObjects"; + eType = Alter3DView; +} + +void StdCmdSelectVisibleObjects::activated(int iMsg) +{ + Q_UNUSED(iMsg); + // go through active document + Gui::Document* doc = Application::Instance->activeDocument(); + App::Document* app = doc->getDocument(); + const std::vector obj = app->getObjectsOfType + (App::DocumentObject::getClassTypeId()); + + std::vector visible; + visible.reserve(obj.size()); + for (std::vector::const_iterator it=obj.begin();it!=obj.end();++it) { + if (doc->isShow((*it)->getNameInDocument())) + visible.push_back(*it); + } + + SelectionSingleton& rSel = Selection(); + rSel.setSelection(app->getName(), visible); +} + +bool StdCmdSelectVisibleObjects::isActive(void) +{ + return App::GetApplication().getActiveDocument(); +} + //=========================================================================== // Std_ToggleObjects //=========================================================================== @@ -2649,6 +2690,7 @@ void CreateViewStdCommands(void) rcCmdMgr.addCommand(new StdCmdToggleSelectability()); rcCmdMgr.addCommand(new StdCmdShowSelection()); rcCmdMgr.addCommand(new StdCmdHideSelection()); + rcCmdMgr.addCommand(new StdCmdSelectVisibleObjects()); rcCmdMgr.addCommand(new StdCmdToggleObjects()); rcCmdMgr.addCommand(new StdCmdShowObjects()); rcCmdMgr.addCommand(new StdCmdHideObjects()); diff --git a/src/Gui/Workbench.cpp b/src/Gui/Workbench.cpp index b8f436ca1d77..c616d2868d66 100644 --- a/src/Gui/Workbench.cpp +++ b/src/Gui/Workbench.cpp @@ -531,6 +531,7 @@ MenuItem* StdWorkbench::setupMenuBar() const MenuItem* visu = new MenuItem; visu->setCommand("Visibility"); *visu << "Std_ToggleVisibility" << "Std_ShowSelection" << "Std_HideSelection" + << "Std_SelectVisibleObjects" << "Separator" << "Std_ToggleObjects" << "Std_ShowObjects" << "Std_HideObjects" << "Separator" << "Std_ToggleSelectability" << "Separator" << "View_Measure_Toggle_All" << "View_Measure_Clear_All"; From 928cc7bcc4b5252c815919adb1fe585326873d9a Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 21 Dec 2016 17:02:06 +0100 Subject: [PATCH 53/60] replace invalid characters in VRML string with underscore --- src/Gui/ViewProvider.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Gui/ViewProvider.cpp b/src/Gui/ViewProvider.cpp index 2241e87fd867..e65b95d4811b 100644 --- a/src/Gui/ViewProvider.cpp +++ b/src/Gui/ViewProvider.cpp @@ -265,7 +265,21 @@ SbMatrix ViewProvider::convert(const Base::Matrix4D &rcMatrix) const void ViewProvider::addDisplayMaskMode(SoNode *node, const char* type) { - node->setName(type); + if (type) { + std::string name = type; + for (std::string::iterator it = name.begin(); it != name.end(); ++it) { + if (it == name.begin()) { + if (!SbName::isBaseNameStartChar(*it)) + *it = '_'; + } + else { + if (!SbName::isBaseNameChar(*it)) + *it = '_'; + } + } + node->setName(name.c_str()); + } + _sDisplayMaskModes[type] = pcModeSwitch->getNumChildren(); pcModeSwitch->addChild(node); } From 7716e9404241f6582699c523f78f4345bf5c8d59 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 21 Dec 2016 17:08:36 +0100 Subject: [PATCH 54/60] fix whitespaces --- src/Base/Unit.cpp | 4 ++-- src/Base/UnitsSchemaCentimeters.cpp | 2 +- src/Mod/Fem/App/AppFem.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Base/Unit.cpp b/src/Base/Unit.cpp index 72d7876eb2d6..5948812a5668 100644 --- a/src/Base/Unit.cpp +++ b/src/Base/Unit.cpp @@ -485,7 +485,7 @@ QString Unit::getTypeString(void) const if(*this == Unit::ThermalExpansionCoefficient ) return QString::fromLatin1("ThermalExpansionCoefficient"); else if(*this == Unit::SpecificHeat ) return QString::fromLatin1("SpecificHeat"); else if(*this == Unit::ThermalTransferCoefficient ) return QString::fromLatin1("ThermalTransferCoefficient"); else - if(*this == Unit::HeatFlux ) return QString::fromLatin1("HeatFlux"); else + if(*this == Unit::HeatFlux ) return QString::fromLatin1("HeatFlux"); else return QString(); @@ -518,4 +518,4 @@ Unit Unit::ThermalConductivity (1,1,-3,0,-1); Unit Unit::ThermalExpansionCoefficient (0,0,0,0,-1); Unit Unit::SpecificHeat (2,0,-2,0,-1); Unit Unit::ThermalTransferCoefficient (0,1,-3,0,-1); -Unit Unit::HeatFlux (0,1,-3,0,0); +Unit Unit::HeatFlux (0,1,-3,0,0); diff --git a/src/Base/UnitsSchemaCentimeters.cpp b/src/Base/UnitsSchemaCentimeters.cpp index 88b19b96dcc1..aeac683cca10 100644 --- a/src/Base/UnitsSchemaCentimeters.cpp +++ b/src/Base/UnitsSchemaCentimeters.cpp @@ -67,6 +67,6 @@ QString UnitsSchemaCentimeters::schemaTranslate(const Base::Quantity& quant, dou unitString = quant.getUnit().getString(); factor = 1.0; } - + return toLocale(quant, factor, unitString); } diff --git a/src/Mod/Fem/App/AppFem.cpp b/src/Mod/Fem/App/AppFem.cpp index 96d025287ad8..f0c563c686ea 100644 --- a/src/Mod/Fem/App/AppFem.cpp +++ b/src/Mod/Fem/App/AppFem.cpp @@ -160,7 +160,7 @@ PyMODINIT_FUNC initFem() Fem::ConstraintInitialTemperature ::init(); Fem::ConstraintPlaneRotation ::init(); Fem::ConstraintContact ::init(); - Fem::ConstraintFluidBoundary ::init(); + Fem::ConstraintFluidBoundary ::init(); Fem::ConstraintTransform ::init(); Fem::FemResultObject ::init(); @@ -173,7 +173,7 @@ PyMODINIT_FUNC initFem() Fem::FemPostPipeline ::init(); Fem::FemPostFilter ::init(); Fem::FemPostClipFilter ::init(); - Fem::FemPostDataAlongLineFilter ::init(); + Fem::FemPostDataAlongLineFilter ::init(); Fem::FemPostScalarClipFilter ::init(); Fem::FemPostWarpVectorFilter ::init(); Fem::FemPostCutFilter ::init(); From 26c635a435a61a308bae0c5990130e30930ffe85 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 21 Dec 2016 18:39:50 +0100 Subject: [PATCH 55/60] use preprocessor macro to build with vtk 6.1 --- src/Mod/Fem/App/FemPostFilter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Mod/Fem/App/FemPostFilter.cpp b/src/Mod/Fem/App/FemPostFilter.cpp index dbc0a295100c..800cedddaf45 100644 --- a/src/Mod/Fem/App/FemPostFilter.cpp +++ b/src/Mod/Fem/App/FemPostFilter.cpp @@ -210,8 +210,11 @@ FemPostDataAlongLineFilter::FemPostDataAlongLineFilter(void) : FemPostFilter() { m_probe->SetValidPointMaskArrayName("ValidPointArray"); m_probe->SetPassPointArrays(1); m_probe->SetPassCellArrays(1); + // needs vtk > 6.1 +#if (VTK_MAJOR_VERSION > 6) || (VTK_MINOR_VERSION > 1) m_probe->ComputeToleranceOff(); m_probe->SetTolerance(0.01); +#endif clip.filterSource = m_probe; clip.filterTarget = m_probe; From 938daf5c6d20f578c60bbe5caa4dcc15003aabe5 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 22 Dec 2016 11:45:18 +0100 Subject: [PATCH 56/60] show expressions in axis of placement in property editor --- src/Gui/propertyeditor/PropertyItem.cpp | 33 ++++++++++++++++++++++++- src/Gui/propertyeditor/PropertyItem.h | 1 + 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Gui/propertyeditor/PropertyItem.cpp b/src/Gui/propertyeditor/PropertyItem.cpp index 5f65b52a3a52..bb1277cf6b82 100644 --- a/src/Gui/propertyeditor/PropertyItem.cpp +++ b/src/Gui/propertyeditor/PropertyItem.cpp @@ -478,6 +478,15 @@ void PropertyItem::bind(const App::Property& prop) { propertyBound(); } +QString PropertyItem::expressionAsString() const +{ + if (hasExpression()) { + std::unique_ptr result(getExpression()->eval()); + return QString::fromStdString(result->toString()); + } + + return QString(); +} // -------------------------------------------------------------------- @@ -1863,8 +1872,30 @@ QVariant PropertyPlacementItem::value(const App::Property* prop) const Base::Vector3d dir; value.getRotation().getValue(dir, angle); if (!init_axis) { + if (m_a->hasExpression()) { + QString str = m_a->expressionAsString(); + const_cast(this)->rot_angle = str.toDouble(); + } + else { + const_cast(this)->rot_angle = Base::toDegrees(angle); + } + + PropertyItem* x = m_d->child(0); + PropertyItem* y = m_d->child(1); + PropertyItem* z = m_d->child(2); + if (x->hasExpression()) { + QString str = x->expressionAsString(); + dir.x = str.toDouble(); + } + if (y->hasExpression()) { + QString str = y->expressionAsString(); + dir.y = str.toDouble(); + } + if (z->hasExpression()) { + QString str = z->expressionAsString(); + dir.z = str.toDouble(); + } const_cast(this)->rot_axis = dir; - const_cast(this)->rot_angle = Base::toDegrees(angle); const_cast(this)->init_axis = true; } return QVariant::fromValue(value); diff --git a/src/Gui/propertyeditor/PropertyItem.h b/src/Gui/propertyeditor/PropertyItem.h index 972b8019db16..3afe6240a00f 100644 --- a/src/Gui/propertyeditor/PropertyItem.h +++ b/src/Gui/propertyeditor/PropertyItem.h @@ -130,6 +130,7 @@ class GuiExport PropertyItem : public QObject, public ExpressionBinding virtual void bind(const App::Property& prop); virtual void bind(const App::ObjectIdentifier& _path); virtual void propertyBound() {} + QString expressionAsString() const; void setParent(PropertyItem* parent); PropertyItem *parent() const; From 68b946c16eeb08972d44c0a291cb88b3f8ad18e0 Mon Sep 17 00:00:00 2001 From: Alexander Gryson Date: Sun, 18 Dec 2016 20:50:08 +0100 Subject: [PATCH 57/60] Update Path Workbench icons --- .../Gui/Resources/icons/Path-3DSurface.svg | 195 +- .../Path/Gui/Resources/icons/Path-Array.svg | 197 +- .../Path/Gui/Resources/icons/Path-Axis.svg | 62220 +--------------- .../Gui/Resources/icons/Path-BaseGeometry.svg | 119 +- .../Path/Gui/Resources/icons/Path-Comment.svg | 494 +- .../Gui/Resources/icons/Path-Compound.svg | 223 +- .../Path/Gui/Resources/icons/Path-Contour.svg | 330 +- .../Path/Gui/Resources/icons/Path-Copy.svg | 195 +- .../Path/Gui/Resources/icons/Path-Custom.svg | 138 +- .../Path/Gui/Resources/icons/Path-Datums.svg | 456 +- .../Path/Gui/Resources/icons/Path-Depths.svg | 293 +- .../Path/Gui/Resources/icons/Path-Dressup.svg | 194 +- .../Gui/Resources/icons/Path-Drilling.svg | 115 +- .../Path/Gui/Resources/icons/Path-Engrave.svg | 130 +- .../Path/Gui/Resources/icons/Path-Face.svg | 118 +- .../Gui/Resources/icons/Path-FacePocket.svg | 156 +- .../Gui/Resources/icons/Path-FaceProfile.svg | 137 +- .../Path/Gui/Resources/icons/Path-Heights.svg | 209 +- .../Path/Gui/Resources/icons/Path-Holding.svg | 168 +- src/Mod/Path/Gui/Resources/icons/Path-Hop.svg | 158 +- .../Path/Gui/Resources/icons/Path-Inspect.svg | 233 +- src/Mod/Path/Gui/Resources/icons/Path-Job.svg | 401 +- .../Path/Gui/Resources/icons/Path-Kurve.svg | 55 +- .../Gui/Resources/icons/Path-LengthOffset.svg | 155 +- .../Gui/Resources/icons/Path-LoadTool.svg | 207 +- .../Resources/icons/Path-Machine-test1.svg | 1535 +- .../Path/Gui/Resources/icons/Path-Machine.svg | 320 +- .../Gui/Resources/icons/Path-MachineLathe.svg | 303 +- .../Gui/Resources/icons/Path-MachineMill.svg | 186 +- .../Gui/Resources/icons/Path-OperationA.svg | 598 +- .../Gui/Resources/icons/Path-OperationB.svg | 285 +- .../Path/Gui/Resources/icons/Path-Plane.svg | 14140 +--- .../Path/Gui/Resources/icons/Path-Pocket.svg | 225 +- .../Path/Gui/Resources/icons/Path-Post.svg | 189 +- .../Resources/icons/Path-Profile-Edges.svg | 364 +- .../Gui/Resources/icons/Path-Profile-Face.svg | 335 +- .../Path/Gui/Resources/icons/Path-Profile.svg | 328 +- .../Path/Gui/Resources/icons/Path-Sanity.svg | 89 +- .../Gui/Resources/icons/Path-SelectLoop.svg | 215 +- .../Path/Gui/Resources/icons/Path-Shape.svg | 154 +- .../Gui/Resources/icons/Path-SimpleCopy.svg | 170 +- .../Path/Gui/Resources/icons/Path-Speed.svg | 222 +- .../Path/Gui/Resources/icons/Path-Stock.svg | 216 +- .../Path/Gui/Resources/icons/Path-Stop.svg | 65 +- .../Path/Gui/Resources/icons/Path-Tags.svg | 170 +- .../Gui/Resources/icons/Path-ToolChange.svg | 145 +- .../Gui/Resources/icons/Path-ToolTable.svg | 276 +- .../Gui/Resources/icons/Path-Toolpath.svg | 107 +- .../Gui/Resources/icons/PathWorkbench.svg | 306 +- .../Gui/Resources/icons/preferences-path.svg | 304 +- 50 files changed, 9519 insertions(+), 79024 deletions(-) diff --git a/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg b/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg index 8e2e21f8c2e1..aee8fcbf58ed 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg @@ -7,12 +7,71 @@ xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64px" height="64px" id="svg2816" - version="1.1"> + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-3DSurface.svg"> + + + + + + + + + + + @@ -78,6 +137,47 @@ fx="32.151962" fy="27.950663" r="23.634638" /> + + + + + + + @@ -87,7 +187,7 @@ image/svg+xml - + @@ -95,55 +195,66 @@ id="layer1" style="display:inline;opacity:1"> - - - - + ry="16.375673" + sodipodi:cx="26.36937" + sodipodi:cy="31.12994" + sodipodi:rx="17.532757" + sodipodi:ry="16.375673" + transform="matrix(0.99813167,0,0,1.0686584,2.6798973,-2.2672712)" /> + + + style="fill:none;stroke:#172a04;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + d="m 6,56 16,-5 c 0,0 0,-15 10,-17 10,-2 12,9 12,9 L 58,38 53,28 49,30 C 49,30 46,18 30,20 14,22 13,42 13,42 l -7,2" + id="path3807" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cczcccczcc" /> + style="fill:none;stroke:url(#linearGradient3851);stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;display:inline" + d="m 6,56 16,-5 c 0,0 0,-15 10,-17 10,-2 12,9 12,9 L 58,38 53,28 49,30 C 49,30 46,18 30,20 14,22 13,42 13,42 l -7,2" + id="path3807-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cczcccczcc" /> + style="fill:none;stroke:#8ae234;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;display:inline" + d="m 6,55 15,-5 c 0,0 0.525424,-15 11,-17 10.474576,-2 12.610169,8.79661 12.610169,8.79661 l 12.067797,-4.322034 -3.239904,-6.403184 m -0.603234,-4.054151 -3.314222,1.503365 C 49.520606,28.520606 46,17 30,19 14,21 12,41 12,41 l -6,2" + id="path3807-7-4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cczccccczcc" /> + id="g4051" + transform="matrix(0.66585367,0,0,0.65271967,-25.912339,-1.4521846)"> + sodipodi:nodetypes="ccccccccccccccc" + inkscape:connector-curvature="0" + id="rect4417-3" + d="m 94.494721,6.8017444 0,26.9999996 17.999999,-8 0,-18.9999996 z m 17.999999,22.9999996 -17.999999,8 0,8 17.999999,-8 z m 0,12 -14.999999,7 5.999999,4 9,-5 z" + style="color:#000000;fill:url(#linearGradient4055);fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:3.03373241;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + - diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Array.svg b/src/Mod/Path/Gui/Resources/icons/Path-Array.svg index 05f99c4e7963..2c21ace08e0f 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Array.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Array.svg @@ -14,10 +14,22 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Array.svg"> + + + + + + + + + + + + + + + + + + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-nodes="false" + inkscape:snap-global="true"> + + @@ -503,7 +599,7 @@ image/svg+xml - + @@ -511,23 +607,70 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg b/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg index 901493c7736e..6315e3926157 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg @@ -11,12 +11,12 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64px" height="64px" - id="svg33249" + id="svg8277" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="Path-Axis.svg"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Plane.svg"> + id="defs8279" /> + inkscape:window-y="27" + inkscape:window-maximized="0" + inkscape:snap-global="true" + inkscape:snap-bbox="true" + inkscape:snap-nodes="false"> + + + id="metadata8282"> @@ -53,62026 +64,253 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g6846"> + + + + + + + + + + + + + + + + + + + + + sodipodi:nodetypes="cc" /> + sodipodi:nodetypes="cc" /> + sodipodi:nodetypes="sssss" /> + style="fill:none;stroke:#204a87;stroke-width:8.64494228000000042;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" + d="m 10,18.980429 4,20.508205" + id="path6419-6-3" + inkscape:connector-curvature="0" /> + sodipodi:nodetypes="cccc" /> + style="fill:none;stroke:#8ae234;stroke-width:4.32247114;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 44,19.91262 6.954546,-0.02119" + id="path6571-9" + inkscape:connector-curvature="0" /> + sodipodi:nodetypes="cccc" /> + sodipodi:nodetypes="cc" /> + style="fill:none;stroke:#729fcf;stroke-width:4.32247122999999966;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" + d="M 9.6103495,18.352611 13.610349,38.860817" + id="path6419-6-3-1" + inkscape:connector-curvature="0" /> + sodipodi:nodetypes="cccc" /> + sodipodi:nodetypes="cc" /> + sodipodi:nodetypes="cccc" /> + + + sodipodi:nodetypes="cc" /> + sodipodi:nodetypes="cc" /> + sodipodi:nodetypes="sssss" /> + style="fill:none;stroke:#204a87;stroke-width:13.86627007;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" + d="m 10,18.980429 4,20.508205" + id="path6419-6-3-15" + inkscape:connector-curvature="0" /> + sodipodi:nodetypes="cccc" /> + style="fill:none;stroke:#8ae234;stroke-width:6.93313503;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 44,19.91262 6.954546,-0.02119" + id="path6571-9-4" + inkscape:connector-curvature="0" /> + sodipodi:nodetypes="cccc" /> + sodipodi:nodetypes="cc" /> + style="fill:none;stroke:#729fcf;stroke-width:6.93313503;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" + d="M 9.6103495,18.352611 13.610349,38.860817" + id="path6419-6-3-1-5" + inkscape:connector-curvature="0" /> + sodipodi:nodetypes="cccc" /> + sodipodi:nodetypes="cc" /> - - + sodipodi:nodetypes="cccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg b/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg index af393349d7c3..8314bc20c2c0 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg @@ -5,12 +5,89 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg2816" height="64px" - width="64px"> + width="64px" + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-BaseGeometry.svg"> + + + + id="defs2818"> + + + + + + + + + + + @@ -19,20 +96,38 @@ image/svg+xml - + + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 27,11 34,6 0,0 L 39,39 3,33 z" + id="path4225" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + style="fill:url(#linearGradient3805);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 39,39.237288 60.965909,17.247036 61,37 39,59 z" + id="path4221" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + style="fill:url(#linearGradient3779);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 3,53 39,59 39,39 3,33 z" + id="path4223" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg b/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg index e557ca42d50e..a74f694df571 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg @@ -14,42 +14,22 @@ height="64px" id="svg3055" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Comment.svg"> - + id="linearGradient3927"> + id="stop3929" /> + id="stop3931" /> - - - - - - - - - - - - - + + + + + xlink:href="#linearGradient5048-4" + id="linearGradient5027-7" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /> + + id="stop5050-0" /> + + id="stop5052-4" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-bbox="true" + inkscape:snap-nodes="false"> + + @@ -288,7 +444,7 @@ image/svg+xml - + @@ -299,105 +455,105 @@ + transform="matrix(0.03094863,0,0,0.01977524,59.425306,53.691751)"> + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient5027-7);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5029-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + width="42" + height="48" + x="11" + y="5" + rx="0.76872855" + ry="0.75583392" /> + d="m 41.72733,50.532835 c 1.823176,-0.910176 6.142086,-3.25743 7.871563,-5.761047 -2.385849,0.5011 -4.183661,0.325883 -7.826165,0.466848 0,0 0.204325,4.262715 -0.0454,5.294199 z" + style="opacity:0.36931823;color:#000000;fill:none;stroke:url(#linearGradient2257-5);stroke-width:1.33099973;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> - + width="21.296297" + height="3" + x="20.5" + y="18.5" /> - ( - + + ) + transform="matrix(0.82958572,0,0,0.9572285,97.378203,12.776111)"> + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg b/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg index f23c1c37783e..a9fcda5b21ee 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg @@ -468,17 +468,6 @@ id="radialGradient3102" xlink:href="#linearGradient4513-1-2" inkscape:collect="always" /> - + + + + + + + inkscape:snap-global="true"> + + @@ -744,41 +773,123 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg b/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg index 2b3a6ab200f2..045fd1b0f731 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg @@ -14,10 +14,58 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="Path-Profile.svg"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Contour.svg"> + + + + + + + + + + + + + + + + - + + + + + + + gradientTransform="translate(-2.0000002,-1.8e-7)" /> + + + + + + + + + + + + + + + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-global="true" + inkscape:snap-nodes="false"> + + @@ -523,43 +697,109 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + sodipodi:nodetypes="cccccc" /> + style="color:#000000;fill:none;stroke:#73d216;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 23.040518,20.544108 -15.9999997,25 c -1.9999999,3 -0.9999999,5 2.0000003,6 l 29.9999994,6 c 3,1 5,1 7,-2 l 11,-17" + id="rect3083-0-0-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 18.960819,31.607979 0.04114,27.393159 20.011364,0.193182 -0.01883,-22.639121 z" + id="path3879-4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + + + + + sodipodi:nodetypes="cccc" /> + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg b/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg index f11e4b3e14ac..4774dcb71d6f 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg @@ -18,6 +18,18 @@ sodipodi:docname="Path-Copy.svg"> + + + + + + + + + + + + + + + + + + + + + + + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-global="true" + inkscape:snap-nodes="true"> + + @@ -523,22 +644,52 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + sodipodi:nodetypes="csccc" /> + + + + + + sodipodi:nodetypes="csccc" /> + sodipodi:nodetypes="csccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg b/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg index e1c6fdb442ea..26e953eb420b 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg @@ -14,7 +14,7 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Custom.svg"> @@ -476,14 +476,14 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="5.5" - inkscape:cx="60.757221" - inkscape:cy="41.027009" - inkscape:current-layer="layer1" + inkscape:zoom="11" + inkscape:cx="6.7061897" + inkscape:cy="23.210953" + inkscape:current-layer="g3983" showgrid="true" inkscape:document-units="px" inkscape:grid-bbox="true" - inkscape:snap-bbox="true" + inkscape:snap-bbox="false" inkscape:bbox-paths="true" inkscape:bbox-nodes="true" inkscape:snap-bbox-edge-midpoints="true" @@ -491,10 +491,20 @@ inkscape:object-paths="true" inkscape:object-nodes="true" inkscape:window-width="1920" - inkscape:window-height="1053" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" /> + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-global="false" + inkscape:snap-nodes="true"> + + @@ -512,52 +522,92 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> - - + id="text5496" /> + + + + sodipodi:nodetypes="csscsssccccscsscccccccc" + inkscape:connector-curvature="0" + id="path5521" + style="font-style:normal;font-weight:bold;font-size:19.56822014000000100px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:#2e3436;stroke-width:1.99999975999999990;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variant:normal;font-stretch:normal" + d="m 17.050359,16.715191 c -1.136691,0.879746 -1.136691,0.879746 -2.85449,1.441444 -0.943725,0.308586 -2.006215,0.318049 -3.05709,0.318049 -2.3756142,0 -4.2576356,-0.63004 -5.6460642,-1.890121 -1.3884287,-1.266139 -2.082643,-2.980576 -2.082643,-5.143311 0,-2.1869664 0.7069522,-3.907461 2.1208566,-5.1614837 C 6.9448329,5.0257457 8.8809901,4.3987344 11.3394,4.3987344 c 0.948972,0 0.02751,0 2.300887,0 3.410072,0.8797468 2.639431,0.5465524 3.410072,0.8797468 l 0,2.6392406 c -1.136691,0 -2.112508,-0.4535987 -2.902256,-0.6656315 -0.78338,-0.2120329 -1.569944,-0.3180493 -2.359692,-0.3180493 -1.464856,0 -2.5953426,0.3907462 -3.3914601,1.1722386 -0.7897485,0.7754344 -1.1846227,1.8870919 -1.1846227,3.3349724 0,1.435765 0.3821363,2.544394 1.146409,3.325886 0.7642729,0.781493 1.8714778,1.068306 1.8714778,1.068306 1.136691,0 0,0 1.136691,0 1.136691,-0.879747 0,0 1.136691,-0.879747 l 0,-0.879747 -2.273382,0 0,-2.639241 6.820144,0 z" + transform="scale(0.87974687,1.1366906)" /> - - + sodipodi:nodetypes="ccccccccccccc" + inkscape:connector-curvature="0" + id="path5525" + style="font-style:normal;font-weight:bold;font-size:19.56822014000000100px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variant:normal;font-stretch:normal" + d="m 48.877696,11.436709 4.546762,7.037975 -4.546762,0 -2.273381,-4.398734 -2.273381,4.398734 -4.546763,0 4.546763,-7.037975 -4.546763,-7.0379746 4.546763,0 2.273381,4.3987343 2.273381,-4.3987343 4.546762,0 z" + transform="scale(0.87974687,1.1366906)" /> + inkscape:connector-curvature="0" + id="path5527" + style="font-style:normal;font-weight:bold;font-size:19.56822014000000100px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:#2e3436;stroke-width:1.99999988000000010;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variant:normal;font-stretch:normal" + d="m 65.065129,11.413994 q 0,-2.5443931 -0.588229,-3.5803247 -0.577133,-1.0450187 -1.95337,-1.0450187 -1.376238,0 -1.964469,1.0450187 -0.588231,1.0359316 -0.588231,3.5803247 0,2.571655 0.588231,3.625761 0.588231,1.054105 1.964469,1.054105 1.365139,0 1.95337,-1.054105 0.588229,-1.054106 0.588229,-3.625761 z m 4.272995,0.02726 q 0,3.371322 -1.775788,5.206921 -1.775793,1.82651 -5.038806,1.82651 -3.274115,0 -5.049906,-1.82651 -1.775789,-1.835599 -1.775789,-5.206921 0,-3.3804076 1.775789,-5.2069186 1.775791,-1.835598 5.049906,-1.835598 3.263013,0 5.038806,1.835598 1.775788,1.826511 1.775788,5.2069186 z" + transform="scale(0.87974687,1.1366906)" /> + sodipodi:nodetypes="csscsssccccscsscccccccc" + inkscape:connector-curvature="0" + id="path5521-0" + style="font-style:normal;font-weight:bold;font-size:19.56822014000000100px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:#2e3436;stroke-width:1.99999975999999990;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variant:normal;font-stretch:normal" + d="m 17.050359,34.310128 c -1.136691,0.879746 -1.136691,0.879746 -2.854491,1.441444 -0.943724,0.308586 -2.006215,0.31805 -3.05709,0.31805 -2.3756133,0 -4.2576347,-0.630041 -5.6460634,-1.890121 -1.3884287,-1.266139 -2.0826429,-2.980577 -2.0826429,-5.143311 0,-2.186967 0.7069522,-3.907461 2.1208565,-5.161484 1.4139046,-1.254023 3.3500621,-1.881034 5.8084708,-1.881034 0.948973,0 0.02751,0 2.300888,0 3.410072,0.879747 2.639431,0.546552 3.410072,0.879747 l 0,2.63924 c -1.136691,0 -2.112508,-0.453598 -2.902257,-0.665631 -0.783379,-0.212033 -1.569943,-0.318049 -2.359691,-0.318049 -1.464856,0 -2.5953427,0.390746 -3.3914602,1.172238 -0.7897485,0.775435 -1.1846228,1.887092 -1.1846228,3.334973 0,1.435764 0.3821364,2.544393 1.1464091,3.325886 0.7642732,0.781493 1.8714779,1.068305 1.8714779,1.068305 1.136691,0 0,0 1.136691,0 1.136691,-0.879747 0,0 1.136691,-0.879747 l 0,-0.879747 -2.273382,0 0,-2.63924 6.820144,0 z" + transform="scale(0.87974687,1.1366906)" /> + sodipodi:nodetypes="ccccccccccccc" + inkscape:connector-curvature="0" + id="path5525-9" + style="font-style:normal;font-weight:bold;font-size:19.56822014000000100px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variant:normal;font-stretch:normal" + d="m 48.877696,29.031647 4.546762,7.037975 -4.546762,0 -2.273381,-4.398735 -2.273382,4.398735 -4.546762,0 4.546762,-7.037975 -4.546762,-7.037975 4.546762,0 2.273382,4.398734 2.273381,-4.398734 4.546762,0 z" + transform="scale(0.87974687,1.1366906)" /> + inkscape:connector-curvature="0" + id="path5527-4" + style="font-style:normal;font-weight:bold;font-size:19.56822014000000100px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variant:normal;font-stretch:normal" + d="m 28.691034,11.413992 q 0,-2.544393 -0.588229,-3.5803246 -0.577133,-1.0450187 -1.95337,-1.0450187 -1.376238,0 -1.964469,1.0450187 -0.58823,1.0359316 -0.58823,3.5803246 0,2.571655 0.58823,3.625762 0.588231,1.054105 1.964469,1.054105 1.365139,0 1.95337,-1.054105 0.588229,-1.054107 0.588229,-3.625762 z m 4.272995,0.02726 q 0,3.371322 -1.775788,5.206922 -1.775793,1.826509 -5.038806,1.826509 -3.274115,0 -5.049905,-1.826509 -1.775789,-1.8356 -1.775789,-5.206921 0,-3.3804084 1.775789,-5.2069194 1.77579,-1.835598 5.049905,-1.835598 3.263013,0 5.038806,1.835598 1.775788,1.826511 1.775788,5.2069194 z" + transform="scale(0.87974687,1.1366906)" /> + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg b/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg index 7b1e3a7a85da..fbbef03d8a8d 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg @@ -7,16 +7,198 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64px" height="64px" id="svg3060" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="New document 1"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Datums.svg"> + id="defs3062"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:window-width="1920" + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-bbox="true" + inkscape:snap-nodes="true"> + + @@ -44,7 +236,7 @@ image/svg+xml - + @@ -52,111 +244,145 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg b/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg index 908ecd44776e..5bd29ec7bf9c 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg @@ -5,12 +5,201 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg2816" height="64px" - width="64px"> + width="64px" + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Depths.svg"> + + + + id="defs2818"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -19,40 +208,90 @@ image/svg+xml - + + style="fill:url(#linearGradient3800);fill-opacity:1;stroke:#172a04;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" + d="M 11,43 33,49 55,25 33,20 z" + id="path3790" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + style="fill:none;stroke:#73d216;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 33.676409,22.215727 14.546985,41.887172 32.347561,46.748318 51.20339,26.169492 z" + id="path3792" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + style="fill:url(#linearGradient3778);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" + d="M 11,42.679189 33,20 33,7.0000005 11,29 z" + id="path11207" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + style="fill:none;stroke:#3465a4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 12.954868,29.838733 32,10.331257 31.48882,19.404016 12.964795,37.821736 z" + id="path3770" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + + + + style="fill:url(#linearGradient3788);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" + d="M 41,37 61,15 61,35 41,59 z" + id="path11199" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + style="fill:url(#linearGradient3768);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" + d="m 33,35 8,2 0,22 -37.9999999,-10 0,-22 L 11,29 l 0,14 22,6 z" + id="path11203" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccc" /> + style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 5.0000001,29.576271 0,17.864407 L 39,56.372881 39,38.559322 35,37.567797 35.01695,51.59322 9.0000011,44.542373 l 0,-13.966102 z" + id="path2992" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccc" /> + style="fill:none;stroke:#3465a4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 42.98305,37.847457 59.027584,20.197866 58.999986,34.220339 42.966088,53.593221 z" + id="path3780" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg b/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg index c5000327c3e3..8f7e1f6d4d27 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg @@ -479,6 +479,100 @@ fx="32.151962" fy="27.950663" r="23.634638" /> + + + + + + + + + + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1"> + + @@ -514,7 +616,7 @@ image/svg+xml - + @@ -522,27 +624,61 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg b/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg index 0445ae8cbac1..f63a48f28368 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg @@ -18,6 +18,18 @@ sodipodi:docname="Path-Drilling.svg"> + + + + - + gradientTransform="translate(71.494719,-3.1982556)" + x1="30.000002" + y1="7.9999995" + x2="36" + y2="54.227272" /> + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1"> + + @@ -514,7 +553,7 @@ image/svg+xml - + @@ -523,22 +562,50 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + + + + + + + sodipodi:nodetypes="cccccccccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg b/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg index ed70d569fd5f..df7baa45e341 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg @@ -14,10 +14,22 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r" - sodipodi:docname="Path-Engrave.svg"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Engrave.svg.2016_12_19_19_43_11.0.svg"> + + + + + + + + + + - - + inkscape:snap-global="true"> + @@ -541,24 +582,51 @@ transform="matrix(1,0,0,-1,0,64.339618)" id="g4215"> + transform="matrix(1,0,0,-1,0,63.650913)" /> + + + - + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Face.svg b/src/Mod/Path/Gui/Resources/icons/Path-Face.svg index a9c190f11eed..74816e3088f3 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Face.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Face.svg @@ -14,10 +14,22 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Face.svg"> + + + + + + + + + + + inkscape:guide-bbox="true"> + + @@ -890,7 +940,7 @@ image/svg+xml - + @@ -899,28 +949,50 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + sodipodi:nodetypes="cccccccc" /> + sodipodi:nodetypes="ccccc" /> + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg b/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg index bcba5aa8a226..67f5271aa2bf 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg @@ -14,10 +14,34 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="Path-Pocket.svg"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-FacePocket.svg"> + + + + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="true"> + + @@ -514,7 +586,7 @@ image/svg+xml - + @@ -523,26 +595,68 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccc" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + sodipodi:nodetypes="ccccc" /> + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg b/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg index 05429aebf8d1..7c1ddf452439 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg @@ -14,10 +14,34 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="Path-Profile.svg"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-FaceProfile.svg"> + + + + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="true"> + + @@ -514,7 +586,7 @@ image/svg+xml - + @@ -523,21 +595,50 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + + sodipodi:nodetypes="ccscccccc" /> + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg b/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg index ebae6075b850..6c950b9a8d6e 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg @@ -5,12 +5,134 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg2816" height="64px" - width="64px"> + width="64px" + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Heights.svg"> + + + + id="defs2818"> + + + + + + + + + + + + + + + + + + + + + @@ -19,28 +141,79 @@ image/svg+xml - + + + + + + style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 27,13 34,6 0,0 L 39,41 3,35 z" + id="path4225" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + style="fill:url(#linearGradient3805);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 39,41.237288 60.965909,19.247036 61,39 39,61 z" + id="path4221" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + style="fill:url(#linearGradient3779);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 3,55 39,61 39,41 3,35 z" + id="path4223" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 5,53.323591 36.983051,58.610169 36.9915,42.665913 5.0084496,37.343879 z" + id="path4223-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + style="fill:none;stroke:#3465a4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 41,42 59,24 58.988015,38.179773 41,56 z" + id="path4221-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg b/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg index a5278caf5c5a..476d284dbb3e 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg @@ -14,10 +14,34 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Tags.svg"> + + + + + + + + + + + + + + + + + + + + + + inkscape:window-width="1920" + inkscape:window-height="1137" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="true"> + + @@ -530,24 +632,50 @@ sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path3083" - d="M 5.1362221,8.0043212 17.703439,20.925091 M 42.837872,46.76663 55.405088,59.6874" - style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#008b00;stroke-width:9;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" /> + d="m 9.9463843,12.619579 3.9993877,4.190598 m 29.595474,31.010428 7.998777,8.381197" + style="color:#000000;fill:none;stroke:#172a04;stroke-width:8.60108471000000030;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + d="M 17.145283,20.162656 44.341124,48.658725" + style="color:#000000;fill:none;stroke:#172a04;stroke-width:8.60108433;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.30054216000000000, 8.60108433000000083;stroke-dashoffset:3.01037950999999993;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="cc" /> + + + d="M 43.541246,47.820605 C 33.142837,36.925049 24.445987,53.824502 19.351081,48.48601 12.95206,41.781052 15.434566,44.382247 8.9526712,37.590454 6.5530382,35.076095 21.944549,25.191374 13.945772,16.810177" + style="color:#000000;fill:none;stroke:url(#linearGradient3916);stroke-width:4.30054216000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="cssc" /> + + + sodipodi:nodetypes="ccccccccccccccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg b/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg index 9891d47e55b1..e05b162f2a17 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg @@ -18,6 +18,18 @@ sodipodi:docname="Path-Hop.svg"> + + + + + + + + + + + + + + + + + + inkscape:window-width="463" + inkscape:window-height="424" + inkscape:window-x="1828" + inkscape:window-y="127" + inkscape:window-maximized="0" + inkscape:snap-global="true"> + + @@ -514,7 +606,7 @@ image/svg+xml - + @@ -523,22 +615,52 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + sodipodi:nodetypes="cccc" /> + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg b/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg index 540bada73f81..12a63ffc23e1 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg @@ -14,10 +14,34 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Inspect.svg"> + + + + + + + + + inkscape:collect="always" + gradientTransform="matrix(0.98972044,0,0,1.0228953,0.20242822,0.02455684)" /> + gradientTransform="matrix(1.3208711,0,0,1.3208546,-6.6997238,-7.6069175)" /> @@ -738,6 +763,67 @@ fx="32.151962" fy="27.950663" r="23.634638" /> + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="0" + inkscape:snap-global="true"> + + @@ -773,7 +868,7 @@ image/svg+xml - + @@ -782,11 +877,29 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + + + @@ -795,68 +908,72 @@ rx="16.528622" cy="37.967922" cx="24.130018" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.17112301;fill:url(#radialGradient2842);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0pt;stroke-opacity:1;marker:none" + style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.26984127;fill:url(#radialGradient2842);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0pt;stroke-opacity:1;marker:none" id="path4475" - transform="matrix(1.44643,0,0,1.51999,-10.9745,-17.7517)" /> + transform="matrix(1.44643,0,0,1.51999,-10.9745,-17.7517)" + d="m 40.65864,37.967922 c 0,2.172292 -7.400116,3.933282 -16.528622,3.933282 -9.128505,0 -16.5286214,-1.76099 -16.5286214,-3.933282 0,-2.172291 7.4001164,-3.933281 16.5286214,-3.933281 9.128506,0 16.528622,1.76099 16.528622,3.933281 z" /> + d="m 18.638514,3.2400846 c -8.055464,0 -14.5932308,6.7569102 -14.5932308,15.0823904 0,8.325478 6.5377668,15.082389 14.5932308,15.082389 3.443787,0 6.48366,-1.416089 8.98045,-3.480552 -0.203267,1.029934 -0.07723,2.081969 0.74837,2.823115 l 10.851379,9.745543 c 1.220736,1.095858 3.055724,0.952275 4.116038,-0.309382 1.060316,-1.261657 0.921389,-3.15815 -0.299347,-4.254006 L 32.184026,28.184037 c -0.664623,-0.596634 -1.477532,-0.773278 -2.28253,-0.657438 1.966276,-2.569944 3.330248,-5.675845 3.330248,-9.204124 0,-8.3254802 -6.537766,-15.0823904 -14.59323,-15.0823904 z m -0.07484,1.2542573 c 7.560929,0 13.155142,4.8985954 13.155142,13.5960951 0,8.873733 -5.756897,13.596096 -13.155142,13.596096 -7.227878,0 -13.1551394,-5.603515 -13.1551394,-13.596096 0,-8.1669059 5.7647634,-13.5960952 13.1551394,-13.5960951 z" + style="color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2852);stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> - + transform="matrix(1.2329344,0,0,1.2742616,-3.1877108,-6.2938985)" + d="m 28.549437,18.920233 c 0,6.101942 -4.946602,11.048544 -11.048544,11.048544 -6.101943,0 -11.0485443,-4.946602 -11.0485443,-11.048544 0,-6.101943 4.9466013,-11.0485442 11.0485443,-11.0485442 6.101942,0 11.048544,4.9466012 11.048544,11.0485442 z" + sodipodi:cx="17.500893" + sodipodi:cy="18.920233" + sodipodi:rx="11.048544" + sodipodi:ry="11.048544" /> + width="19.128832" + height="4.4807057" + x="40.715664" + y="0.0245609" + rx="2.1456783" + ry="1.9050397" + transform="matrix(0.74211359,0.67027414,-0.6364657,0.77130501,0,0)" /> + transform="matrix(1.384233,0,0,1.4306317,-5.9579283,-8.4644107)" + d="m 25.897786,18.478292 c 0,4.588661 -3.719844,8.308506 -8.308505,8.308506 -4.588661,0 -8.308505,-3.719845 -8.308505,-8.308506 0,-4.58866 3.719844,-8.308505 8.308505,-8.308505 4.588661,0 8.308505,3.719845 8.308505,8.308505 z" + sodipodi:cx="17.589281" + sodipodi:cy="18.478292" + sodipodi:rx="8.3085051" + sodipodi:ry="8.3085051" /> + style="color:#000000;fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 45,5.0000002 0.0114,22.0909078 13.97727,-6.375 0.0114,-15.7159078 z M 59.01528,29.069485 45.00079,35.221365 45,39.092405 59.06349,32.674174 z m 7.9e-4,12.059079 -8.98393,4.192847 2.04821,1.357176 6.93572,-3.839294 z" + id="rect4417-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Job.svg b/src/Mod/Path/Gui/Resources/icons/Path-Job.svg index 57bc6dff7e1d..4d05961afd87 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Job.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Job.svg @@ -15,9 +15,21 @@ id="svg2816" version="1.1" inkscape:version="0.48.5 r10040" - sodipodi:docname="Path-Project.svg"> + sodipodi:docname="Path-Job.svg"> + + + + - - - - + + + + - + + + + + - + + xlink:href="#linearGradient4210" + id="linearGradient4216" + x1="-43.135761" + y1="43.577271" + x2="-29.889616" + y2="13.966157" + gradientUnits="userSpaceOnUse" /> + inkscape:snap-global="true"> + + @@ -1015,7 +1021,7 @@ image/svg+xml - + @@ -1024,161 +1030,140 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + id="g3303" + transform="translate(-84.000004,-1.4545441)"> + transform="matrix(0,-1,1,0,0,0)" + y="87" + x="-56.454544" + height="58.000004" + width="45.999996" + id="rect2987" + style="fill:#d3d7cf;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + transform="matrix(0,-1,1,0,0,0)" + y="89" + x="-54.454544" + height="54.000004" + width="41.999996" + id="rect2987-1" + style="fill:url(#linearGradient3309);fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + + - - - - - - - - - - - - + id="g4201" + style="stroke:url(#linearGradient4216)"> + + + inkscape:connector-curvature="0" + id="path4108" + d="m -16.178007,41.65803 -5.432851,-3.769934" + style="fill:none;stroke:url(#linearGradient4216);stroke-width:3.30506563000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + inkscape:connector-curvature="0" + id="path4110" + d="m -19.799908,35.626136 -4.527376,-3.015947" + style="fill:none;stroke:url(#linearGradient4216);stroke-width:3.30506563000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + + + + + + + + - - - - - + id="g4051" + transform="translate(-61.49479,-3.801745)"> + id="rect4417-3" + d="m 94.494721,6.8017444 0,26.9999996 17.999999,-8 0,-18.9999996 z m 17.999999,22.9999996 -17.999999,8 0,8 17.999999,-8 z m 0,12 -14.999999,7 5.999999,4 9,-5 z" + style="color:#000000;fill:url(#linearGradient4055);fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + id="rect4417-1" + d="m 96.494721,8.801745 0.0114,22.090908 13.977269,-6.375 0.0114,-15.715908 z M 110.51,32.87123 l -14.014489,6.15188 -7.9e-4,3.87104 14.063489,-6.418231 z m 7.9e-4,12.059079 -8.98393,4.192847 2.04821,1.357176 6.93572,-3.839294 z" + style="color:#000000;fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> - diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg b/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg index 4cff2a2345e8..5388679a8581 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg @@ -13,8 +13,8 @@ height="64px" id="svg4982" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="New document 2"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Kurve.svg"> + inkscape:window-y="27" + inkscape:window-maximized="1"> + + @@ -44,7 +52,7 @@ image/svg+xml - + @@ -61,15 +69,28 @@ inkscape:export-filename="C:\Users\Dan\HeeksCAD\HeeksCNC\icons\profile.png"> + style="fill:none;stroke:#000000;stroke-width:17.29129982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 118.1705,160.41325 0,-86.594136 73.65896,0 0,86.594136" + id="path2385" + sodipodi:nodetypes="cccc" /> + sodipodi:nodetypes="cccccccc" /> + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg b/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg index a928b1e1d2e2..179d496fd0c7 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg @@ -14,8 +14,8 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="Path-Height.svg"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-LengthOffset.svg"> + + + + + + + + + + + inkscape:window-width="1920" + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1"> + + @@ -492,7 +542,7 @@ image/svg+xml - + @@ -500,42 +550,63 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> + + + id="g3103" + transform="matrix(1,0,0,1.0041048,-32.999991,-23.012314)"> + id="rect4417-9" + d="M 62.99999,41.840567 59,44.548996 59,49 l 10,-6 -1e-5,-1.159433 z M 69,47 l -10,6 0,4 10,-6 z m 0,8 -8,5 3,1.754717 L 69,58 z" + style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1.99590766;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + + + y="27.8978" + x="50.999989" + height="3.9836488" + width="26.000004" + id="rect3591-2" + style="color:#000000;fill:none;stroke:#d3d7cf;stroke-width:1.99590778;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + y="36" + x="57" + height="3.8487434" + width="13.99999" + id="rect4411-6" + style="color:#000000;fill:none;stroke:#d3d7cf;stroke-width:1.99590778;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> - - + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg b/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg index 347a4aaf1c4b..b29052a1c1a7 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg @@ -14,10 +14,22 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-LoadTool.svg"> + + + + @@ -479,6 +491,86 @@ y2="9.3928995" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.85,0,0,0.85,4.7842247,8.046896)" /> + + + + + + + + + + + + + + + + + + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1"> + + @@ -514,7 +614,7 @@ image/svg+xml - + @@ -522,40 +622,59 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - /\ - + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg b/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg index 15e28f622331..f7b921a114b1 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg @@ -14,10 +14,70 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Machine-test1.svg"> + + + + + + + + + + + + + + + + + + + + @@ -438,117 +498,248 @@ inkscape:collect="always" /> - + r="15.051696" /> + r="15.051696" /> + + gradientTransform="matrix(1.1030356,0,0,1.201116,-3.6141221,-5.4030394)" + cx="33.377876" + cy="23.890728" + fx="33.377876" + fy="23.890728" + r="10.229453" /> + y2="48.944237" /> + y2="32.625889" /> + y2="35.258153" /> + y2="26.519524" /> + y2="32.709194" /> + y2="38.605671" /> + + + + + + + + + + + x1="35.363636" + y1="56.762066" + x2="28.863636" + y2="45.807518" + gradientTransform="translate(-60,0)" /> + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-nodes="false" + inkscape:snap-global="true"> + + @@ -584,7 +785,7 @@ image/svg+xml - + @@ -593,989 +794,239 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g4670" + transform="matrix(1.0037668,0,0,1,60.913154,0)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg b/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg index 822066473cf0..0c5e3ddf5d15 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg @@ -14,10 +14,22 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="Path-LengthOffset.svg"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Machine.svg"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:window-width="1920" + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1"> + + @@ -492,7 +636,7 @@ image/svg+xml - + @@ -500,92 +644,92 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> + + + + + + id="g3103" + transform="matrix(0.62370866,0,0,0.61985947,18.301399,5.4696975)"> + id="rect4417-9" + d="m 36.392955,39.573974 -6.413251,3.226538 0,6.453075 12.826501,-6.453075 0,-3.226538 z m 6.41325,9.679613 -11.223188,4.839807 4.809938,6.453075 6.41325,-6.453075 z" + style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:3.21656585;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + y="33.120895" + x="26.773079" + height="6.453073" + width="19.239746" + id="rect4411-4" + style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:3.21656585;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + y="25.153603" + x="23.566452" + height="7.9672961" + width="25.653004" + id="rect3591-8" + style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:3.21656609;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> - - - - + style="fill:url(#linearGradient3934);fill-opacity:1;stroke:#d3d7cf;stroke-width:2;stroke-linejoin:miter" + id="rect3830-0" + width="12" + height="42" + x="7" + y="5" /> + style="fill:url(#linearGradient3951);fill-opacity:1;stroke:#d3d7cf;stroke-width:1.99999988000000010;stroke-linejoin:miter" + id="rect3830-0-2" + width="54" + height="4" + x="5" + y="51" /> + style="fill:url(#linearGradient3951-7);fill-opacity:1;stroke:#d3d7cf;stroke-width:2;stroke-linejoin:miter" + id="rect3830-0-1" + width="6" + height="8" + x="23" + y="9" /> + style="fill:url(#linearGradient3951-1);fill-opacity:1;stroke:#d3d7cf;stroke-width:2;stroke-linejoin:miter" + id="rect3830-0-4" + width="16" + height="14" + x="33" + y="5" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg b/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg index e576dfc831d7..93c02097beec 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg @@ -6,12 +6,69 @@ xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64px" height="64px" id="svg2860" - version="1.1"> + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-MachineLathe.svg"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -72,7 +294,7 @@ image/svg+xml - + @@ -80,19 +302,62 @@ id="layer1"> - - + d="M 31.999999,5 C 24.931441,5.0000914 17.906444,7.9099936 12.908218,12.908219 7.909993,17.906445 5.0000911,24.931442 5,32.000001 c 9.16e-5,7.068558 2.9099937,14.093555 7.908219,19.09178 4.998226,4.998226 12.023222,7.908128 19.09178,7.908219 7.068558,-9.1e-5 14.093554,-2.909993 19.09178,-7.908219 4.998225,-4.998225 7.908127,-12.023222 7.908219,-19.09178 C 58.999907,24.931442 56.090005,17.906445 51.09178,12.908219 46.093554,7.9099936 39.068557,5.0000914 31.999999,5 z M 32,25 c 4,0 7,3 7,7 0,4 -3,7 -7,7 -4,0 -7,-3 -7,-7 0,-4 3,-7 7,-7 z" + style="color:#000000;fill:url(#linearGradient3866);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cscscscscccccc" /> + id="path4305-1" + d="M 32,7 C 25.455038,7.0000846 18.950411,9.6944384 14.322425,14.322425 9.694438,18.950412 7.0000843,25.455039 7,32 7.0000843,38.544961 9.694438,45.049588 14.322425,49.677575 18.950411,54.305562 25.455038,56.999915 32,57 38.544962,56.999915 45.049589,54.305562 49.677575,49.677575 54.305562,45.049588 56.999916,38.544961 57,32 56.999916,25.455039 54.305562,18.950412 49.677575,14.322425 45.049589,9.6944384 38.544962,7.0000846 32,7 z m 0,16 c 5,0 9,4 9,9 0,5 -4,9 -9,9 -5,0 -8.999832,-5.190571 -9,-9 0,-5 4,-9 9,-9 z" + style="color:#000000;fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cscscscscccccc" /> + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg b/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg index c0b0b63fc304..1dcbb8d11c38 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg @@ -6,13 +6,69 @@ xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64" height="64" viewBox="0 0 64.000001 64.000001" id="svg2" - version="1.1"> + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-MachineMill.svg"> + + + + + + + + + + + + gradientTransform="matrix(0.34129297,0,0,0.34129297,-302.71898,762.9037)" /> + style="stop-color:#888a85;stop-opacity:1" /> + style="stop-color:#d3d7cf;stop-opacity:1" /> + + + + + + + + @@ -74,35 +181,62 @@ image/svg+xml - + - + d="m -34.100645,1040.9716 c 0,0 -2.227414,1.6232 -3.280945,2.5097 -1.323718,1.1138 -2.302618,1.2447 -3.493587,3.3742 0,0.2631 0.04333,2.2924 0.04333,2.2924 0.85054,-1.4892 5.735435,-4.1624 6.189935,-4.2928 1.757904,-0.5045 2.830895,-1.2897 1.645138,-3.0763 -0.211325,-0.3184 -0.640658,-0.6069 -0.921891,-0.7286 l -0.181977,-0.079 z m 0,-8.8737 c -1.978598,1.7487 -5.506612,2.0337 -6.740536,5.7027 -0.01259,0.056 0.0049,0.1875 0.0087,0.2166 0.09222,0.7104 0.761517,1.6048 1.452495,1.9411 0.240277,0.117 0.318867,0.1065 0.52927,-0.071 2.975549,-2.0966 4.998891,-2.899 6.45257,-4.5814 0,0 0.01669,-0.1142 0.02068,-0.24 -0.0065,-0.4805 -0.01652,-0.8719 -0.03198,-0.9666 -0.05535,-0.338 -0.31612,-0.868 -0.587267,-1.1938 -0.244471,-0.2937 -0.640658,-0.6069 -0.92189,-0.7286 l -0.181977,-0.079 z m 0,-8.8736 c -2.010164,1.2268 -5.085255,3.1143 -6.740536,5.7027 -0.02932,0.049 0.0049,0.1875 0.0087,0.2166 0.09222,0.7104 0.761517,1.6048 1.452495,1.9411 0.240277,0.117 0.318867,0.1065 0.52927,-0.071 1.711564,-1.3324 6.587999,-2.9729 6.45257,-4.5815 0.01,-0.018 0.01669,-0.1141 0.02068,-0.2399 -0.0065,-0.4805 -0.01652,-0.8719 -0.03198,-0.9666 -0.05535,-0.338 -0.31612,-0.868 -0.587267,-1.1938 -0.244471,-0.2938 -0.640658,-0.6069 -0.92189,-0.7286 l -0.181977,-0.079 z m 1.667803,-15.5428 -8.385677,0.015 0,11.8665 c 0,0.8886 0.990688,2.196 1.433164,2.4797 0.144442,0.1198 0.220185,0.2379 0.430616,0.06 1.615746,-1.2826 4.940069,-2.1764 6.521897,-4.5447 l 0,-9.8769 z" + style="fill:url(#linearGradient7889);fill-opacity:1;fill-rule:nonzero;stroke:none" + id="rect7856" + inkscape:connector-curvature="0" /> + d="m -41.414086,1007.0465 -0.07371,12.5346 c -0.0073,1.2401 0.696009,2.35 1.601616,2.9489 0.120275,0.078 0.237683,0.1058 0.302874,0.1527 -0.275079,0.1386 -0.53298,0.3177 -0.77124,0.5406 -0.440265,0.4118 -0.844404,1.0804 -0.934556,1.5465 -0.02253,0.1165 -0.0394,0.487 -0.05266,0.9245 -10e-4,0.029 -0.0017,0.063 -0.0027,0.093 -0.0066,0.2394 -0.01218,0.4729 -0.01532,0.7479 -0.01904,1.084 -0.01911,2.3761 0.01734,2.711 0.0799,0.7344 0.379821,1.3471 0.93189,1.9005 0.187257,0.1876 0.41694,0.3571 0.661255,0.4979 -0.213547,0.1242 -0.415306,0.2749 -0.605259,0.4526 -0.440265,0.4119 -0.844403,1.0804 -0.934556,1.5465 -0.02252,0.1165 -0.03939,0.487 -0.05266,0.9245 -10e-4,0.029 -0.0017,0.063 -0.0027,0.093 -0.0066,0.2394 -0.01218,0.4729 -0.01532,0.7479 -0.01904,1.084 -0.01911,2.3761 0.01734,2.711 0.0799,0.7344 0.379821,1.3471 0.93189,1.9005 0.231939,0.2324 0.528089,0.4389 0.837902,0.5946 -0.03078,0.019 -0.03177,0.025 -0.07066,0.047 -0.303932,0.1744 -0.698224,0.4969 -0.961221,0.7866 -0.256564,0.2825 -0.574779,0.8325 -0.693252,1.3131 -0.180673,2.373 0.0243,6.3728 0.01666,6.8842 l 4.540903,0 3.890409,0 c 0.01061,-0.9137 -0.644508,-0.7799 -1.082844,-1.4583 -0.0468,-0.1 -2.661222,0.8702 -2.661222,0.8702 -0.01027,-0.1334 2.55237,-1.511 2.693781,-1.4216 0.214087,-0.1728 1.077124,-2.079 1.455055,-2.7771 0.362812,-0.8144 0.753394,-1.5123 0.439582,-2.324 -0.324064,-0.8391 -1.031297,-1.3608 -1.644472,-1.9071 l -0.02399,-0.046 c 0.733405,-0.7667 1.364776,-1.0317 1.677799,-1.8795 l 0.11132,-0.3079 0.01468,-2.1724 0.01468,-2.1724 -0.0034,-0.01 0.0014,-0.2239 -0.163981,-0.4187 c -0.306351,-0.7804 -0.805809,-1.3584 -1.463826,-1.7399 0.623262,-0.3881 1.201635,-1.0301 1.489157,-1.8296 l 0.11132,-0.308 0.01468,-2.1724 0.01468,-2.1724 -0.0034,-0.01 0.0014,-0.2239 -0.163981,-0.4186 c -0.31028,-0.7904 -0.817912,-1.3948 -1.488491,-1.7718 -0.06212,-0.035 -0.11304,0.093 -0.168647,0.062 0.891635,-0.5365 1.393912,-1.1692 1.694469,-2.1385 0.09692,-0.3125 0.11265,-3.1126 0.11265,-3.1126 l -0.0047,-10.5124 z m 8.980947,0.6353 0,9.8768 c -1.581828,2.4975 -4.906055,3.4394 -6.521801,4.792 -0.210431,0.1875 -0.285864,-0.1878 -0.430306,-0.3078 -0.442476,-0.2837 -1.433188,-1.5914 -1.433188,-2.48 l 0,-11.8661 z m -1.667475,15.5428 0.181977,0.079 c 0.281232,0.1216 0.677419,0.4348 0.92189,0.7286 0.271148,0.3257 0.531912,0.8558 0.587263,1.1938 0.01549,0.095 0.02546,0.4861 0.03198,0.9666 -0.004,0.1258 -0.01065,0.222 -0.02065,0.2399 0.135429,1.6086 -4.741006,3.2491 -6.45257,4.5815 -0.210403,0.1778 -0.384796,0.4195 -0.529273,0.071 -0.690979,-0.3363 -1.360268,-1.2307 -1.452492,-1.9411 -0.0038,-0.029 -0.03799,-0.1658 -0.0087,-0.2166 1.655281,-2.6934 4.730378,-4.6574 6.740543,-5.9339 z m 0,8.8736 0.181977,0.079 c 0.281232,0.1217 0.677419,0.4349 0.92189,0.7286 0.271148,0.3257 0.531912,0.8558 0.587263,1.1938 0.01549,0.095 0.02546,0.4861 0.03198,0.9666 -0.004,0.1258 -0.02065,0.24 -0.02065,0.24 -1.453679,1.7734 -3.477021,2.6192 -6.45257,4.8292 -0.210403,0.1874 -0.288996,-0.059 -0.529273,-0.1768 -0.690979,-0.3363 -1.360268,-1.2307 -1.452492,-1.9411 -0.0038,-0.029 -0.02126,-0.1611 -0.0087,-0.2166 1.233924,-3.669 4.761944,-3.954 6.740543,-5.7027 z m 0,8.8736 0.181977,0.079 c 0.281232,0.1217 0.710565,0.4102 0.92189,0.7286 1.185758,1.7866 0.112542,2.5717 -1.645363,3.0762 -0.544686,0.015 -5.067736,3.5583 -6.189709,4.2929 0,0 -0.04333,-2.0293 -0.04333,-2.2924 1.190969,-2.1295 2.169899,-2.2606 3.493618,-3.3744 1.05353,-0.8865 3.280914,-2.5096 3.280914,-2.5096 z" + style="fill:url(#linearGradient3808);fill-opacity:1.0;fill-rule:nonzero;stroke:#000000;stroke-width:0.95812291000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csccccccccccccccccccccccccccccccccccccccccccccccccccccccccsccccccccccccccccccccccccccccscccccc" /> - + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-OperationA.svg b/src/Mod/Path/Gui/Resources/icons/Path-OperationA.svg index 1decba197b0f..c746f0686916 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-OperationA.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-OperationA.svg @@ -1,4 +1,6 @@ + + + id="defs2728"> + inkscape:collect="always" + id="linearGradient3061"> + + + + + + + + + + + + + id="stop3146" /> + id="stop3148" /> + + inkscape:collect="always" + xlink:href="#linearGradient3144" + id="radialGradient3850" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)" + cx="225.26402" + cy="672.79736" + fx="225.26402" + fy="672.79736" + r="34.345188" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:collect="always" + xlink:href="#linearGradient3144-2" + id="radialGradient3850-6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)" + cx="225.26402" + cy="672.79736" + fx="225.26402" + fy="672.79736" + r="34.345188" /> + + + + + r="34.345188" + fy="672.79736" + fx="225.26402" + cy="672.79736" + cx="225.26402" + gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)" + gradientUnits="userSpaceOnUse" + id="radialGradient4815" + xlink:href="#linearGradient3144-2" + inkscape:collect="always" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="metadata6378"> @@ -63,28 +537,42 @@ + + Mon Mar 12 17:20:03 2012 -0300 + + + [Yorik van Havre] + + + + + FreeCAD LGPL2+ + + + + + FreeCAD + + + FreeCAD/src/Mod/Draft/Resources/icons/Snap_Extension.svg + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + [agryson] Alexander Gryson + + + Three dots or circles in a horizontal sequence simiar to an ellipsis + + + circle + circles + dot + dots + ellipsis + + - - - - - diff --git a/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg b/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg index d35f34ef1595..dbbfb2d13b7b 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg @@ -6,12 +6,70 @@ xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64px" height="64px" id="svg2816" - version="1.1"> + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-OperationB.svg"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -83,55 +264,77 @@ image/svg+xml - + - - + id="g3833" + transform="translate(0,7)"> - + id="g3027"> + + + style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" + d="m 10,10 44,0" + id="path3003-3-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> - + transform="translate(0,14)" + id="g3027-9"> + + + + + + + + style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" + d="m 10,10 44,0" + id="path3003-3-5-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg b/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg index a9740230e8c9..b190fc468348 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg @@ -13,8 +13,8 @@ height="64px" id="svg8277" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="New document 1"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Plane.svg"> + inkscape:window-width="960" + inkscape:window-height="1137" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="0" + inkscape:snap-global="false" + inkscape:snap-bbox="false" + inkscape:snap-nodes="true"> + + @@ -44,7 +55,7 @@ image/svg+xml - + @@ -52,13910 +63,209 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="fill:#8ae234;fill-opacity:1;stroke:#172a04;stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:32.20000076;stroke-opacity:1" + d="m 46,20.844811 c 1.886656,2.854958 1,7.457529 -1,8.38972 -2,0.932191 -4.113344,0.871485 -6,-1.983474 -1.886655,-2.854959 -2.557497,-6.511112 -1,-8.270629 1.557497,-1.759517 6.113344,-0.990576 8,1.864383 z" + id="path6514" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssss" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg b/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg index f07d14814d18..522024e8ac92 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg @@ -14,10 +14,34 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Pocket.svg"> + + + + + + + + + + + + + + + + + + + + + + + + inkscape:snap-global="true"> + + @@ -524,43 +646,92 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + + + + + style="color:#000000;fill:none;stroke:#73d216;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 58,44 C 57.228611,44 27,38 27,38 L 10,58" + id="path3120-7-3" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + + sodipodi:nodetypes="ccccc" /> + style="color:#000000;fill:none;stroke:#8ae234;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 58.279188,28.056713 c -0.771389,0 -30.636364,-6.154718 -30.636364,-6.154718 L 7.7791879,43.761259 35.966299,49.040026 39.370097,45.238532" + id="path3120-6-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Post.svg b/src/Mod/Path/Gui/Resources/icons/Path-Post.svg index 81ba4b2f0a1d..899503a69e96 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Post.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Post.svg @@ -14,10 +14,22 @@ height="64px" id="svg3055" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Post.svg"> + + + + + gradientTransform="matrix(1.4461086,0,0,1.3176466,-0.70089253,-3.6117648)" /> + + inkscape:window-height="1137" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="true" + inkscape:snap-bbox="true" + inkscape:snap-nodes="false"> + + @@ -288,7 +320,7 @@ image/svg+xml - + @@ -321,101 +353,102 @@ sodipodi:nodetypes="cccc" /> + width="42" + height="48" + x="12.999999" + y="5" + rx="0.76872855" + ry="0.75583392" /> + y="12.5" /> + style="color:#000000;fill:#888a85;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + width="23" + height="3" + x="20.5" + y="24.5" /> + style="color:#000000;fill:#888a85;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> - - - > + width="17" + height="3" + x="20.5" + y="36.5" /> + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg index 52eb2f2485ca..7fba5598d99b 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg @@ -14,10 +14,58 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Profile-Edges.svg"> + + + + + + + + + + + + + + + + - + + + + + + + gradientTransform="translate(-2.0000002,-1.8e-7)" /> + + + + + + + + + + + + + + + + + + + + inkscape:window-width="1920" + inkscape:window-height="1017" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-global="false" + inkscape:snap-nodes="false"> + + @@ -523,53 +719,115 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + sodipodi:nodetypes="cccccc" /> + style="color:#000000;fill:none;stroke:#73d216;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 23.040518,20.544108 -15.9999997,25 c -1.9999999,3 -0.9999999,5 2.0000003,6 l 29.9999994,6 c 3,1 5,1 7,-2 l 11,-17" + id="rect3083-0-0-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + sodipodi:nodetypes="ccccc" /> + style="fill:none;stroke:#3465a4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 43.011364,35.546818 0,18.555455 L 53,38.4166 53,20 z" + id="path3881-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + + sodipodi:nodetypes="cccccc" /> + style="color:#000000;fill:none;stroke:url(#linearGradient3977);stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 22,8 6,33 c -2,3 2,5 3,5 l 29,6 c 3,1 5,1 7,-1 L 56,26" + id="rect3083-0-0-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg index 4a29b1bc797a..1d787eb2a645 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg @@ -14,10 +14,58 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Profile-Face.svg"> + + + + + + + + + + + + + + + + - + + + + + + + gradientTransform="translate(-2.0000002,-1.8e-7)" /> + + + + + + + + + + + + + + + inkscape:window-width="1920" + inkscape:window-height="1017" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-global="true" + inkscape:snap-nodes="false"> + + @@ -514,7 +688,7 @@ image/svg+xml - + @@ -523,48 +697,109 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + sodipodi:nodetypes="cccccc" /> + style="color:#000000;fill:none;stroke:#73d216;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 23.040518,20.544108 -15.9999997,25 c -1.9999999,3 -0.9999999,5 2.0000003,6 l 29.9999994,6 c 3,1 5,1 7,-2 l 11,-17" + id="rect3083-0-0-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 18.960819,31.607979 0.04114,27.393159 20.011364,0.193182 -0.01883,-22.639121 z" + id="path3879-4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + + + sodipodi:nodetypes="cccccc" /> + style="color:#000000;fill:none;stroke:url(#linearGradient3977);stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 22,8 6,33 c -2,3 2,5 3,5 l 29,6 c 3,1 5,1 7,-1 L 56,26" + id="rect3083-0-0-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg index 2b3a6ab200f2..78595684101e 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg @@ -14,10 +14,58 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Profile.svg"> + + + + + + + + + + + + + + + + - + + + + + + + gradientTransform="translate(-2.0000002,-1.8e-7)" /> + + + + + + + + + + + + + + + inkscape:window-height="1017" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-global="true" + inkscape:snap-nodes="false"> + + @@ -523,43 +697,109 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + sodipodi:nodetypes="cccccc" /> + style="color:#000000;fill:none;stroke:#73d216;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 23.040518,20.544108 -15.9999997,25 c -1.9999999,3 -0.9999999,5 2.0000003,6 l 29.9999994,6 c 3,1 5,1 7,-2 l 11,-17" + id="rect3083-0-0-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 18.960819,31.607979 0.04114,27.393159 20.011364,0.193182 -0.01883,-22.639121 z" + id="path3879-4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + + + + + sodipodi:nodetypes="cccc" /> + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svg b/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svg index 209b7399c137..692e445a2c08 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svg @@ -20,12 +20,28 @@ viewBox="0 0 64 64" enable-background="new 0 0 32 32" xml:space="preserve" - inkscape:version="0.91 r" - sodipodi:docname="path_sanity.svg">image/svg+xml \ No newline at end of file diff --git a/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg b/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg index 684c0b337a13..f9a8af616d09 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg @@ -14,10 +14,46 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-SelectLoop.svg"> + + + + + + + + + + + + + + + + inkscape:window-width="1920" + inkscape:window-height="1137" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1"> + + @@ -503,7 +574,7 @@ image/svg+xml - + @@ -512,36 +583,104 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> - + style="fill:none;stroke:#302b00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:32.20000076000000178;stroke-opacity:1;stroke-dasharray:none" + id="rect3061-3" + width="52" + height="52" + x="6" + y="6" /> + + + + + + + id="g3987" + transform="matrix(0,1,-1,0,61,-61)"> + - - - + transform="scale(-1,-1)" + y="-22" + x="-72" + height="12" + width="8" + id="rect3921-3-9" + style="fill:#555753;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:32.20000076;stroke-opacity:1;stroke-dasharray:none" /> + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg b/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg index 756d89a08bb7..4a84c2fc5e35 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg @@ -15,9 +15,21 @@ id="svg2816" version="1.1" inkscape:version="0.48.5 r10040" - sodipodi:docname="Path-Toolpath.svg"> + sodipodi:docname="Path-Shape.svg"> + + + + + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="true"> + + @@ -514,7 +600,7 @@ image/svg+xml - + @@ -523,22 +609,52 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + + + + + + sodipodi:nodetypes="ccccccccccccccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg b/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg index c2283c40b6b2..d0b0e502f53c 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg @@ -14,8 +14,8 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="Path-DumbCopy.svg"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-SimpleCopy.svg"> + + + + + + + + + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-nodes="true"> + + @@ -503,7 +604,7 @@ image/svg+xml - + @@ -512,15 +613,40 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + style="fill:none;stroke:#73d216;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 58.001039,47.85359 c 0,0 -14.553726,0.05365 -20.979857,0.05365 -6.135148,-3e-6 -9.28868,-7.999845 -5.140905,-13.409262 C 35.348114,30.390139 47.320226,29.184077 42.229671,18.714957 37.139114,8.2458322 35.735956,6.0033049 35.735956,6.0033049" + id="path3923-3" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csczc" /> + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg b/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg index 4e977a01c9df..6df8160d67bb 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg @@ -6,12 +6,82 @@ xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64px" height="64px" id="svg2860" - version="1.1"> + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Speed.svg"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml - + + + + + + + + d="m 53,36.918439 -6,-4 0,-4 6,-4 L 53,23 l -42,0 0,1.91844 6,4 0,4 -6,4 L 11,39 53,39 z" + style="fill:none;stroke:#2e3436;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccc" /> + + + + style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 27,13 10,0" + id="path3956" + inkscape:connector-curvature="0" /> + style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 19,31 26,0" + id="path3958" + inkscape:connector-curvature="0" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg b/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg index 0a340716007f..1c722e58b46c 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg @@ -14,31 +14,19 @@ height="64px" id="svg3559" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Stock.svg"> - - - - @@ -46,11 +34,11 @@ inkscape:collect="always" id="linearGradient4383"> @@ -58,29 +46,66 @@ inkscape:collect="always" xlink:href="#linearGradient4383" id="linearGradient4389" - x1="12.599358" - y1="51.272079" - x2="51.940205" - y2="21.702158" - gradientUnits="userSpaceOnUse" /> + x1="27.243532" + y1="54.588112" + x2="21.243532" + y2="30.588112" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-1.243533,-2.588112)" /> + x1="48.714352" + y1="45.585785" + x2="40.714352" + y2="24.585787" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.2856487,1.4142136)" /> + xlink:href="#linearGradient4383-3" + id="linearGradient4389-0" + x1="27.243532" + y1="54.588112" + x2="21.243532" + y2="30.588112" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-1.243533,-2.588112)" /> + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="false"> + + @@ -117,87 +151,35 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - - - - - - - - + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg b/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg index a1e6147987d7..2012f65ca51d 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg @@ -14,15 +14,15 @@ height="64px" id="svg2985" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="New document 2"> + inkscape:version="0.48.5 r10040" + sodipodi:docname="Path-Stop.svg"> + inkscape:window-height="1137" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-bbox="true" + inkscape:snap-nodes="false"> + + @@ -67,7 +77,7 @@ image/svg+xml - + @@ -77,34 +87,31 @@ inkscape:groupmode="layer"> + transform="matrix(0.98153848,0,0,1.0323624,-14.667694,9.0064723)" /> - + ! + id="text2999"> + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg b/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg index a5278caf5c5a..0a84b21d354a 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg @@ -14,10 +14,34 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-Tags.svg"> + + + + + + + + + + + + + + + + + + + + + + inkscape:window-width="1920" + inkscape:window-height="1137" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="true"> + + @@ -515,7 +617,7 @@ image/svg+xml - + @@ -530,24 +632,50 @@ sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path3083" - d="M 5.1362221,8.0043212 17.703439,20.925091 M 42.837872,46.76663 55.405088,59.6874" - style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#008b00;stroke-width:9;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" /> + d="m 9.9463843,12.619579 3.9993877,4.190598 m 29.595474,31.010428 7.998777,8.381197" + style="color:#000000;fill:none;stroke:#172a04;stroke-width:8.60108471000000030;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + d="M 17.145283,20.162656 44.341124,48.658725" + style="color:#000000;fill:none;stroke:#172a04;stroke-width:8.60108433;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.30054216000000000, 8.60108433000000083;stroke-dashoffset:3.01037950999999993;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="cc" /> + + + d="M 43.541246,47.820605 C 33.142837,36.925049 24.445987,53.824502 19.351081,48.48601 12.95206,41.781052 15.434566,44.382247 8.9526712,37.590454 6.5530382,35.076095 21.944549,25.191374 13.945772,16.810177" + style="color:#000000;fill:none;stroke:url(#linearGradient3916);stroke-width:4.30054216000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="cssc" /> + + + sodipodi:nodetypes="ccccccccccccccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg b/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg index 5adc6e8c2941..fc1c9e9af301 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg @@ -14,10 +14,21 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-ToolChange.svg"> + + + + + + + + + + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1"> + + @@ -580,7 +681,7 @@ image/svg+xml - + @@ -589,16 +690,28 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + + + sodipodi:nodetypes="ccccccccccccccc" /> + sodipodi:nodetypes="ccccccccccccccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg b/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg index 5292f84ccf89..8d3a90bcbc7f 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg @@ -14,7 +14,7 @@ height="64px" id="svg2816" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.5 r10040" sodipodi:docname="Path-ToolTable.svg"> @@ -545,6 +545,171 @@ id="radialGradient3101-6" xlink:href="#linearGradient4513-1-5" inkscape:collect="always" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="true"> + + @@ -580,7 +754,7 @@ image/svg+xml - + @@ -588,23 +762,71 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg b/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg index 517de11d93d6..04fa914903b3 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg @@ -18,6 +18,18 @@ sodipodi:docname="Path-Toolpath.svg"> + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="false"> + + @@ -514,7 +577,7 @@ image/svg+xml - + @@ -523,16 +586,34 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + + + + sodipodi:nodetypes="ccccccccccccccc" /> diff --git a/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg b/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg index 0a6fa189b249..4d12cd1073fa 100644 --- a/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg +++ b/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg @@ -15,17 +15,63 @@ id="svg2816" version="1.1" inkscape:version="0.48.5 r10040" - sodipodi:docname="Path.svg"> + sodipodi:docname="preferences-path.svg"> + + + + + + + + + + + + + + + + @@ -380,28 +426,6 @@ id="linearGradient3608" xlink:href="#linearGradient3681-3" inkscape:collect="always" /> - - - + + + + + + + + + + + + + + + + + + + + + inkscape:snap-bbox="false" + inkscape:bbox-paths="false" + inkscape:bbox-nodes="false" + inkscape:snap-bbox-edge-midpoints="false" + inkscape:snap-bbox-midpoints="false" + inkscape:object-paths="false" + inkscape:object-nodes="false" + inkscape:window-width="739" + inkscape:window-height="505" + inkscape:window-x="922" + inkscape:window-y="257" + inkscape:window-maximized="0" + inkscape:snap-global="false"> + + @@ -501,27 +634,68 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + style="color:#000000;fill:url(#linearGradient3951);fill-opacity:1;fill-rule:nonzero;stroke:#271903;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 61,47 0,14 -29,0 13,-8 c 0,0 0.05185,-3.282514 0,-6 z" + id="rect4590-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccc" /> + width="46" + height="10" + x="9" + y="3" /> + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/preferences-path.svg b/src/Mod/Path/Gui/Resources/icons/preferences-path.svg index 0a6fa189b249..0c48aa3d5d62 100644 --- a/src/Mod/Path/Gui/Resources/icons/preferences-path.svg +++ b/src/Mod/Path/Gui/Resources/icons/preferences-path.svg @@ -15,17 +15,63 @@ id="svg2816" version="1.1" inkscape:version="0.48.5 r10040" - sodipodi:docname="Path.svg"> + sodipodi:docname="preferences-path.svg"> + + + + + + + + + + + + + + + + @@ -380,28 +426,6 @@ id="linearGradient3608" xlink:href="#linearGradient3681-3" inkscape:collect="always" /> - - - + + + + + + + + + + + + + + + + + + + + + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-global="false"> + + @@ -492,7 +625,7 @@ image/svg+xml - + @@ -501,27 +634,68 @@ inkscape:label="Layer 1" inkscape:groupmode="layer"> + style="color:#000000;fill:url(#linearGradient3951);fill-opacity:1;fill-rule:nonzero;stroke:#271903;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 61,47 0,14 -29,0 13,-8 c 0,0 0.05185,-3.282514 0,-6 z" + id="rect4590-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" /> + + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccc" /> + width="46" + height="10" + x="9" + y="3" /> + + + + + From 570ae66d0d1fcf18dc2ae888dee15a27073173df Mon Sep 17 00:00:00 2001 From: Alexander Gryson Date: Wed, 21 Dec 2016 06:54:08 +0100 Subject: [PATCH 58/60] Integrate forum feedback --- .../Gui/Resources/icons/Path-3DSurface.svg | 14 +- .../Gui/Resources/icons/Path-Compound.svg | 96 ++++- .../Path/Gui/Resources/icons/Path-Contour.svg | 96 ++++- .../Path/Gui/Resources/icons/Path-Copy.svg | 94 ++++- .../Path/Gui/Resources/icons/Path-Dressup.svg | 137 ++++++- .../Gui/Resources/icons/Path-Drilling.svg | 102 +++++- .../Path/Gui/Resources/icons/Path-Engrave.svg | 102 +++++- .../Path/Gui/Resources/icons/Path-Face.svg | 108 +++++- .../Gui/Resources/icons/Path-FacePocket.svg | 102 +++++- .../Gui/Resources/icons/Path-FaceProfile.svg | 98 ++++- .../Path/Gui/Resources/icons/Path-Holding.svg | 102 +++++- src/Mod/Path/Gui/Resources/icons/Path-Hop.svg | 106 +++++- .../Path/Gui/Resources/icons/Path-Inspect.svg | 100 ++++- src/Mod/Path/Gui/Resources/icons/Path-Job.svg | 206 +++++------ .../Gui/Resources/icons/Path-LengthOffset.svg | 14 +- .../Gui/Resources/icons/Path-LoadTool.svg | 14 +- .../Path/Gui/Resources/icons/Path-Machine.svg | 14 +- .../Path/Gui/Resources/icons/Path-Pocket.svg | 98 ++++- .../Resources/icons/Path-Profile-Edges.svg | 98 ++++- .../Gui/Resources/icons/Path-Profile-Face.svg | 100 ++++- .../Path/Gui/Resources/icons/Path-Profile.svg | 96 ++++- .../Path/Gui/Resources/icons/Path-Shape.svg | 98 ++++- .../Gui/Resources/icons/Path-SimpleCopy.svg | 47 ++- .../Path/Gui/Resources/icons/Path-Tags.svg | 102 +++++- .../Gui/Resources/icons/Path-ToolChange.svg | 236 +++++++++--- .../Gui/Resources/icons/Path-ToolTable.svg | 343 ++++++++++++++---- .../Gui/Resources/icons/Path-Toolpath.svg | 140 +++++-- .../Gui/Resources/icons/PathWorkbench.svg | 55 +-- .../Gui/Resources/icons/preferences-path.svg | 24 +- 29 files changed, 2296 insertions(+), 646 deletions(-) diff --git a/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg b/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg index aee8fcbf58ed..42b568561f9b 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg @@ -25,17 +25,17 @@ inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1920" - inkscape:window-height="1057" + inkscape:window-height="1137" id="namedview32" showgrid="true" inkscape:snap-bbox="false" inkscape:snap-nodes="true" inkscape:snap-global="false" inkscape:zoom="11.313709" - inkscape:cx="6.6058236" - inkscape:cy="30.143799" - inkscape:window-x="1912" - inkscape:window-y="-8" + inkscape:cx="11.655185" + inkscape:cy="55.631597" + inkscape:window-x="0" + inkscape:window-y="27" inkscape:window-maximized="1" inkscape:current-layer="layer1"> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg b/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg index a9fcda5b21ee..dae4430da526 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg @@ -719,6 +719,45 @@ offset="1" style="stop-color:#888a85;stop-opacity:1" /> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-39.54617,-2)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg b/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg index 045fd1b0f731..896cd626c94e 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg @@ -643,6 +643,45 @@ y1="10" x2="36" y2="54.227272" /> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-39.54617,-12)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg b/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg index 4774dcb71d6f..88953fa224a2 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg @@ -590,6 +590,45 @@ offset="1" id="stop3866-0" /> + + + + + + + image/svg+xml - + @@ -661,18 +700,6 @@ id="path3923-3-6" inkscape:connector-curvature="0" sodipodi:nodetypes="csccc" /> - - + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg b/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg index 8f7e1f6d4d27..a6ec55dd8fae 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg @@ -573,6 +573,84 @@ offset="1" style="stop-color:#888a85;stop-opacity:1" /> + + + + + + + + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-43.54617,-2)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg b/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg index f63a48f28368..e89a8296cd1b 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg @@ -510,6 +510,45 @@ x2="24" y2="24" gradientUnits="userSpaceOnUse" /> + + + + + + + - - - - + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg b/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg index df7baa45e341..b39c7552098a 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg @@ -15,7 +15,7 @@ id="svg2816" version="1.1" inkscape:version="0.48.5 r10040" - sodipodi:docname="Path-Engrave.svg.2016_12_19_19_43_11.0.svg"> + sodipodi:docname="Path-Engrave.svg"> + + + + + + + image/svg+xml - + @@ -613,20 +652,43 @@ - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-45.54617,-12)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Face.svg b/src/Mod/Path/Gui/Resources/icons/Path-Face.svg index 74816e3088f3..d4e9ee21203e 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Face.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Face.svg @@ -894,6 +894,45 @@ x2="28" y2="7" gradientUnits="userSpaceOnUse" /> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-41.54617,-10)"> + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg b/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg index 67f5271aa2bf..6d80d6cf6a25 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg @@ -542,6 +542,45 @@ x2="26.526834" y2="23.979185" gradientUnits="userSpaceOnUse" /> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-47.546168,-14)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg b/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg index 7c1ddf452439..9a5acd81651e 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg @@ -542,6 +542,45 @@ offset="1" style="stop-color:#888a85;stop-opacity:1" /> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-39.54617,-12)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg b/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg index 476d284dbb3e..605924201e0d 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg @@ -573,6 +573,45 @@ offset="1" id="stop3906-6" /> + + + + + + + - - + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg b/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg index e05b162f2a17..3b8db524c03d 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg @@ -562,6 +562,45 @@ id="linearGradient3097" xlink:href="#linearGradient4031-7" inkscape:collect="always" /> + + + + + + + - - + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg b/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg index 12a63ffc23e1..d9e8750f4caf 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg @@ -824,6 +824,45 @@ id="linearGradient3097" xlink:href="#linearGradient4031" inkscape:collect="always" /> + + + + + + + - + + + + + + + + + + + + @@ -969,11 +1041,5 @@ d="m 18.172698,7.5906005 c -5.154058,0 -9.3276665,4.3135055 -9.3276665,9.6403265 0,1.538408 0.4159866,2.953888 1.0364074,4.244915 1.2395061,0.472182 2.5562071,0.793444 3.9537021,0.793444 6.107521,0 10.985187,-4.972946 11.362096,-11.187539 C 23.484066,8.9893823 21.030475,7.5906005 18.172698,7.5906005 z" id="path4462" /> - diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Job.svg b/src/Mod/Path/Gui/Resources/icons/Path-Job.svg index 4d05961afd87..520758274de2 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Job.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Job.svg @@ -975,6 +975,66 @@ x2="-29.889616" y2="13.966157" gradientUnits="userSpaceOnUse" /> + + + + + + + + + + + + + transform="matrix(1,0,0,1.0853143,-84.000004,-4.2878631)"> + style="fill:#d3d7cf;fill-opacity:1;stroke:#2e3436;stroke-width:1.91978347;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + style="fill:url(#linearGradient3309);fill-opacity:1;stroke:#ffffff;stroke-width:1.91978347;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + transform="matrix(-1.1043925,0,0,1.3262834,-6.8668697,-6.2503528)" + style="stroke:#4e9a06"> + style="stroke:#4e9a06"> - - + width="25.353306" + height="12.063787" + x="-47.869637" + y="21.300388" + ry="2.7387033" /> + d="M -15.272532,40.904043 -31.571085,27.332283" + style="fill:none;stroke:#4e9a06;stroke-width:3.30506563;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + sodipodi:nodetypes="cc" /> - + y="13.760523" + ry="6.5044198" /> + d="m -31.312378,27.332283 -7.761215,0" + style="fill:none;stroke:#4e9a06;stroke-width:3.30506563;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" /> - - - - - - - + inkscape:label="Layer 1" + id="layer1-3" + transform="matrix(0,0.42543722,-0.42543722,0,60.785056,33.723688)"> + inkscape:export-ydpi="4.1683898" + inkscape:export-xdpi="4.1683898" + inkscape:export-filename="/home/yorik/Documents/Lab/Draft/icons/changeprop.png" + sodipodi:nodetypes="cccccccc" + id="path3343" + d="m 35.907323,8.8968626 0,14.1031384 -32.907323,0 10e-8,23.505231 32.9073229,0 0,14.103138 L 64.1136,34.752616 z" + style="fill:url(#linearGradient3012);fill-opacity:1;fill-rule:evenodd;stroke:#280000;stroke-width:4.70104599;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + inkscape:connector-curvature="0" /> + inkscape:export-ydpi="4.1683898" + inkscape:export-xdpi="4.1683898" + inkscape:export-filename="/home/yorik/Documents/Lab/Draft/icons/changeprop.png" + sodipodi:nodetypes="cccccccc" + id="path3343-2" + d="m 40.608369,19.248595 0,8.452452 -32.9073228,0 0,14.103138 32.9073228,0 0,8.06651 16.453662,-15.118079 z" + style="fill:none;stroke:#ef2929;stroke-width:4.70104599;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + inkscape:connector-curvature="0" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg b/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg index 179d496fd0c7..88756d6b85df 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg @@ -507,9 +507,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="5.4999999" - inkscape:cx="16.7707" - inkscape:cy="52.52005" + inkscape:zoom="31.112698" + inkscape:cx="27.432282" + inkscape:cy="35.098338" inkscape:current-layer="layer1" showgrid="true" inkscape:document-units="px" @@ -522,9 +522,9 @@ inkscape:object-paths="true" inkscape:object-nodes="true" inkscape:window-width="1920" - inkscape:window-height="1057" - inkscape:window-x="1912" - inkscape:window-y="-8" + inkscape:window-height="1137" + inkscape:window-x="0" + inkscape:window-y="27" inkscape:window-maximized="1"> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-51.54617,-10)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg index 7fba5598d99b..91340f3e69c6 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg @@ -665,6 +665,45 @@ offset="1" id="stop3875-2" /> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-39.54617,-10)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg index 1d787eb2a645..fa291edf39d3 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg @@ -643,6 +643,45 @@ y1="10" x2="36" y2="54.227272" /> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-39.54617,-10)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg index 78595684101e..023492813d83 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg @@ -643,6 +643,45 @@ y1="10" x2="36" y2="54.227272" /> + + + + + + + - - + id="g3908-1-4" + transform="matrix(1.2383679,0,0,1,-39.54617,-10)"> + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg b/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg index 4a84c2fc5e35..7ec97f96a8bc 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg @@ -556,6 +556,45 @@ offset="1" id="stop3866-5" /> + + + + + + + - - + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg b/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg index d0b0e502f53c..11494621bb67 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg @@ -491,17 +491,6 @@ offset="1" id="stop3866" /> - @@ -560,6 +549,17 @@ offset="1" id="stop3866-5-6" /> + + inkscape:snap-nodes="true" + inkscape:snap-global="true"> - diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg b/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg index 0a84b21d354a..1149d93c148d 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg @@ -573,6 +573,45 @@ offset="1" id="stop3906-6" /> + + + + + + + - - + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg b/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg index fc1c9e9af301..7cfe87906b38 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg @@ -18,6 +18,30 @@ sodipodi:docname="Path-ToolChange.svg"> + + + + + + + + - + x1="35.05999" + y1="53.008698" + x2="27.286415" + y2="7.311924" /> + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg b/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg index 8d3a90bcbc7f..dd400a42af63 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg @@ -18,6 +18,18 @@ sodipodi:docname="Path-ToolTable.svg"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:snap-global="true" + inkscape:snap-nodes="false"> - - + id="g3908" + transform="translate(-20,2)"> + + + + + + + + id="path3906" + d="M 69,11 69,25.53033 79.044194,19.779029 79,11 z" + style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - - + id="g3908-1" + transform="translate(-64,2)"> + + + + + + + + id="path3906-7" + d="M 69,11 69,25.53033 79.044194,19.779029 79,11 z" + style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - - + id="g3908-2" + transform="translate(-41.849711,-4)"> + + + + + + + + id="path3906-1" + d="M 69,11 69,25.53033 79.044194,19.779029 79,11 z" + style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg b/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg index 04fa914903b3..55bd668fe2d5 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg @@ -533,6 +533,72 @@ id="linearGradient3158" xlink:href="#linearGradient4031" inkscape:collect="always" /> + + + + + + + + + + + inkscape:snap-global="true" + inkscape:snap-nodes="false"> - - + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg b/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg index 4d12cd1073fa..323f17337e50 100644 --- a/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg +++ b/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg @@ -15,7 +15,7 @@ id="svg2816" version="1.1" inkscape:version="0.48.5 r10040" - sodipodi:docname="preferences-path.svg"> + sodipodi:docname="PathWorkbench.svg"> + inkscape:window-width="1920" + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-global="true"> image/svg+xml - + @@ -645,12 +645,6 @@ id="rect4590" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc" /> - - + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/preferences-path.svg b/src/Mod/Path/Gui/Resources/icons/preferences-path.svg index 0c48aa3d5d62..f2a9c295330b 100644 --- a/src/Mod/Path/Gui/Resources/icons/preferences-path.svg +++ b/src/Mod/Path/Gui/Resources/icons/preferences-path.svg @@ -589,9 +589,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="7.7781744" - inkscape:cx="41.178348" - inkscape:cy="30.71964" + inkscape:zoom="11" + inkscape:cx="16.312829" + inkscape:cy="25.733609" inkscape:current-layer="layer1" showgrid="true" inkscape:document-units="px" @@ -604,11 +604,11 @@ inkscape:object-paths="false" inkscape:object-nodes="false" inkscape:window-width="1920" - inkscape:window-height="1137" - inkscape:window-x="0" - inkscape:window-y="27" + inkscape:window-height="1057" + inkscape:window-x="1912" + inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:snap-global="false"> + inkscape:snap-global="true"> @@ -693,9 +693,15 @@ y="15" /> + From 6e51d906edee9b26ff5fb76dd511864e2552fb6e Mon Sep 17 00:00:00 2001 From: Alexander Gryson Date: Thu, 22 Dec 2016 09:19:12 +0100 Subject: [PATCH 59/60] Add metadata --- .../Gui/Resources/icons/Path-3DSurface.svg | 305 +--- .../Path/Gui/Resources/icons/Path-Array.svg | 774 ++------- .../Path/Gui/Resources/icons/Path-Axis.svg | 377 +---- .../Gui/Resources/icons/Path-BaseGeometry.svg | 163 +- .../Path/Gui/Resources/icons/Path-Comment.svg | 683 ++------ .../Gui/Resources/icons/Path-Compound.svg | 1124 +++----------- .../Path/Gui/Resources/icons/Path-Contour.svg | 992 ++---------- .../Path/Gui/Resources/icons/Path-Copy.svg | 869 ++--------- .../Path/Gui/Resources/icons/Path-Custom.svg | 703 ++------- .../Path/Gui/Resources/icons/Path-Datums.svg | 444 +----- .../Path/Gui/Resources/icons/Path-Depths.svg | 350 +---- .../Path/Gui/Resources/icons/Path-Dressup.svg | 897 ++--------- .../Gui/Resources/icons/Path-Drilling.svg | 771 ++------- .../Path/Gui/Resources/icons/Path-Engrave.svg | 793 ++-------- .../Path/Gui/Resources/icons/Path-Face.svg | 1212 +++------------ .../Gui/Resources/icons/Path-FacePocket.svg | 829 ++-------- .../Gui/Resources/icons/Path-FaceProfile.svg | 808 ++-------- .../Path/Gui/Resources/icons/Path-Heights.svg | 260 +--- .../Path/Gui/Resources/icons/Path-Holding.svg | 854 ++-------- src/Mod/Path/Gui/Resources/icons/Path-Hop.svg | 837 ++-------- .../Path/Gui/Resources/icons/Path-Inspect.svg | 1244 +++------------ src/Mod/Path/Gui/Resources/icons/Path-Job.svg | 1378 +++-------------- .../Path/Gui/Resources/icons/Path-Kurve.svg | 119 +- .../Gui/Resources/icons/Path-LengthOffset.svg | 702 ++------- .../Gui/Resources/icons/Path-LoadTool.svg | 778 ++-------- .../Resources/icons/Path-Machine-test1.svg | 1175 +++----------- .../Path/Gui/Resources/icons/Path-Machine.svg | 841 ++-------- .../Gui/Resources/icons/Path-MachineLathe.svg | 422 +---- .../Gui/Resources/icons/Path-MachineMill.svg | 286 +--- .../Gui/Resources/icons/Path-OperationA.svg | 607 ++------ .../Gui/Resources/icons/Path-OperationB.svg | 397 +---- .../Path/Gui/Resources/icons/Path-Plane.svg | 325 +--- .../Path/Gui/Resources/icons/Path-Pocket.svg | 914 ++--------- .../Path/Gui/Resources/icons/Path-Post.svg | 528 ++----- .../Resources/icons/Path-Profile-Edges.svg | 1056 +++---------- .../Gui/Resources/icons/Path-Profile-Face.svg | 992 ++---------- .../Path/Gui/Resources/icons/Path-Profile.svg | 992 ++---------- .../Path/Gui/Resources/icons/Path-Sanity.svg | 948 ++---------- .../Gui/Resources/icons/Path-SelectLoop.svg | 788 ++-------- .../Path/Gui/Resources/icons/Path-Shape.svg | 830 ++-------- .../Gui/Resources/icons/Path-SimpleCopy.svg | 742 ++------- .../Path/Gui/Resources/icons/Path-Speed.svg | 331 +--- .../Path/Gui/Resources/icons/Path-Stock.svg | 220 +-- .../Path/Gui/Resources/icons/Path-Stop.svg | 141 +- .../Path/Gui/Resources/icons/Path-Tags.svg | 854 ++-------- .../Gui/Resources/icons/Path-ToolChange.svg | 1012 +++--------- .../Gui/Resources/icons/Path-ToolTable.svg | 1235 +++------------ .../Gui/Resources/icons/Path-Toolpath.svg | 814 ++-------- .../Gui/Resources/icons/PathWorkbench.svg | 815 ++-------- .../Gui/Resources/icons/preferences-path.svg | 812 ++-------- 50 files changed, 6148 insertions(+), 30195 deletions(-) diff --git a/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg b/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg index 42b568561f9b..17d2d4a82a84 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg @@ -1,260 +1,85 @@ - - - + + + - - - - + + + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - - + + + - - - - - - - + + + + + + + - + - + image/svg+xml - - + + + Path-3DSurface + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-3DSurface.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Array.svg b/src/Mod/Path/Gui/Resources/icons/Path-Array.svg index 2c21ace08e0f..a5da4e0bb456 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Array.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Array.svg @@ -1,676 +1,154 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - - + + + + + - + - - + + - + - + image/svg+xml - - + + + Path-Array + 2016-01-19 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Array.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - + + + + + - - - - + + + + - - - - + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg b/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg index 6315e3926157..f5f13fa5156e 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg @@ -1,316 +1,87 @@ - - - - - + + + + - + - + image/svg+xml - - + + + Path-Axis + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Axis.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg b/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg index 8314bc20c2c0..bb3143c37320 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg @@ -1,133 +1,52 @@ - - - + + + - - - - + + + + - - - + + + - - + + - + - + image/svg+xml - - + + + Path-BaseGeometry + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-BaseGeometry.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg b/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg index a74f694df571..35a1aefe32b0 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg @@ -1,559 +1,152 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + image/svg+xml - - + + + Path-Comment + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Comment.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg b/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg index dae4430da526..7040fc457613 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg @@ -1,956 +1,214 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + image/svg+xml - - + + + Path-Compound + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Compound.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - + + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg b/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg index 896cd626c94e..43a62e4f6534 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg @@ -1,866 +1,192 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - - + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Contour + 2016-08-16 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Contour.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg b/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg index 88953fa224a2..5f07ebddd3f9 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg @@ -1,760 +1,169 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Copy + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Copy.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg b/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg index 26e953eb420b..e0f4816d0d3f 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg @@ -1,612 +1,139 @@ - - - - - - + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - + - - + + - + - + image/svg+xml - - + + + Path-Custom + 2016-01-19 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Custom.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg b/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg index fbbef03d8a8d..9dcae29ac87b 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg @@ -1,388 +1,92 @@ - - - - - - + + + + + - - - + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - - + + - + - + image/svg+xml - - + + + Path-Datums + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Datums.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg b/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg index 5bd29ec7bf9c..efcaa8be6dcc 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg @@ -1,297 +1,87 @@ - - - + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - + - + image/svg+xml - - + + + Path-Depths + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Depths.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg b/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg index a6ec55dd8fae..07e2305cf5a0 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg @@ -1,784 +1,177 @@ - - - - - - + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - - - + + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Dressup + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Dressup.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg b/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg index e89a8296cd1b..c61158492735 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg @@ -1,672 +1,155 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Drilling + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Drilling.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg b/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg index b39c7552098a..c0b7bee59d7d 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg @@ -1,693 +1,160 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - - + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Engrave + 2016-02-24 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Engrave.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Face.svg b/src/Mod/Path/Gui/Resources/icons/Path-Face.svg index d4e9ee21203e..a8837f52a371 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Face.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Face.svg @@ -1,1066 +1,212 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Face + 2016-11-07 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path- + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - + + + + + + + + + + + + - + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg b/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg index 6d80d6cf6a25..ded548f0a1d2 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-FacePocket.svg @@ -1,723 +1,164 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-FacePocket + 2016-01-19 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path- + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg b/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg index 9a5acd81651e..74907b5148c9 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-FaceProfile.svg @@ -1,705 +1,161 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-FaceProfile + 2016-01-19 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path- + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg b/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg index 6c950b9a8d6e..b4a48887f810 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg @@ -1,219 +1,73 @@ - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - - - - + + + + + + + - + - + image/svg+xml - - + + + Path-Heights + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Heights.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - + + + - - - - - - - - + + + + + + + + - - + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg b/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg index 605924201e0d..436ec72f5bee 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg @@ -1,746 +1,170 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Holding + 2016-02-24 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Holding.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg b/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg index 3b8db524c03d..59394f01e649 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg @@ -1,731 +1,164 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - + + + + + - - - - - + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Hop + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Hop.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg b/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg index d9e8750f4caf..ab468fc3ff37 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg @@ -1,1045 +1,243 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - + + - + - + image/svg+xml - - + + + Path-Inspect + 2016-01-19 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Inspect.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - + + + + + + + + + + - + - + - - - - - - - - - + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Job.svg b/src/Mod/Path/Gui/Resources/icons/Path-Job.svg index 520758274de2..7bdfd13a4551 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Job.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Job.svg @@ -1,1173 +1,253 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + image/svg+xml - - + + + Path-Job + 2016-06-27 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Job.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - + + + + - - - - - - + + + + + + - - - + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg b/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg index 5388679a8581..81d192c18644 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg @@ -1,96 +1,45 @@ - - - - - + + + + - + - + image/svg+xml - - + + + Path-Kurve + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Kurve.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg b/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg index 88756d6b85df..15c692c25ec3 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg @@ -1,612 +1,136 @@ - - - - - - + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - + + - + - + image/svg+xml - - + + + Path-LengthOffset + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-LengthOffset.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - + + + + + + + + + - - + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg b/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg index 0446d73235c1..83a8eba0950e 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg @@ -1,680 +1,152 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - - - - - + + + + + - - - - - + + + + + - - - + + + - - - - + + + + - - - - + + + + - - + + - + - + image/svg+xml - - + + + Path-LoadTool + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-LoadTool.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - + + + + - - - - - - + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg b/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg index f7b921a114b1..963696394558 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg @@ -1,1030 +1,221 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - + + - + - + image/svg+xml - - + + + Path-Machine-test1 + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Machine-test1.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - + + + + + + - + - - - + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg b/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg index ff5a09d42a08..b4a9e10476eb 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg @@ -1,735 +1,160 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - - - - + + + + + + + - - - + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - - + + - + - + image/svg+xml - - + + + Path-Machine + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Machine.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg b/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg index 93c02097beec..a26922ad8cf6 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg @@ -1,363 +1,103 @@ - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - + - + image/svg+xml - - + + + Path-MachineLathe + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-MachineLathe.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - + + + + + + - - - + + + - - - + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg b/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg index 1dcbb8d11c38..78d375aa1336 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg @@ -1,242 +1,76 @@ - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - + + + + - - - + + + - + - + image/svg+xml - - + + + Path-MachineMill + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-MachineMill.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - + + + + - - - - - - + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-OperationA.svg b/src/Mod/Path/Gui/Resources/icons/Path-OperationA.svg index c746f0686916..0e9b56e91e3a 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-OperationA.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-OperationA.svg @@ -1,544 +1,111 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - - - + + + - - - - - - - - + + + + + + + + - + - + image/svg+xml - - - + + + Mon Mar 12 17:20:03 2012 -0300 @@ -559,7 +126,7 @@ http://www.freecadweb.org/wiki/index.php?title=Artwork - [agryson] Alexander Gryson + [agryson] Alexander Gryson, [agryson] Alexander Gryson Three dots or circles in a horizontal sequence simiar to an ellipsis @@ -572,6 +139,8 @@ ellipsis + Path-OperationA + https://www.gnu.org/copyleft/lesser.html diff --git a/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg b/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg index dbbfb2d13b7b..8a0dba41a161 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg @@ -1,340 +1,101 @@ - - - + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - + - + image/svg+xml - - + + + Path-OperationB + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-OperationB.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - + + + + + - - - - + + + + - - - - + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg b/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg index b190fc468348..2cd1fbc47d6f 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg @@ -1,271 +1,74 @@ - - - - - + + + + - + - + image/svg+xml - - + + + Path-Plane + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Plane.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg b/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg index 0dc9f8902991..816cf713153a 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg @@ -1,798 +1,176 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - - - - - - + + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Pocket + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Pocket.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Post.svg b/src/Mod/Path/Gui/Resources/icons/Path-Post.svg index 899503a69e96..389c1132acce 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Post.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Post.svg @@ -1,454 +1,126 @@ - - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - + + + - - - - - + + + + + - - - - + + + + - - - + + + - - + + - + - + image/svg+xml - - + + + Path-Post + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Post.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - + + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg index 91340f3e69c6..a1fba1e1f459 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg @@ -1,894 +1,198 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + image/svg+xml - - + + + Path-Profile-Edges + 2016-10-19 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Profile-Edges.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg index fa291edf39d3..5645f396ddfc 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile-Face.svg @@ -1,866 +1,192 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - - + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Profile-Face + 2016-10-19 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Profile- + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg b/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg index 023492813d83..ed9f61dcdedc 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg @@ -1,866 +1,192 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - - + + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Profile + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Profile.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svg b/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svg index 692e445a2c08..9156910431e2 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svg @@ -1,786 +1,166 @@ - -image/svg+xml \ No newline at end of file + + + + + image/svg+xml + + + Path-Sanity + 2016-05-15http://www.freecadweb.org/wiki/index.php?title=ArtworkFreeCADFreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Sanity.svgFreeCAD LGPL2+https://www.gnu.org/copyleft/lesser.html[agryson] Alexander Gryson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg b/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg index f9a8af616d09..1e865f233f76 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg @@ -1,686 +1,154 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + - + - + image/svg+xml - - + + + Path-SelectLoop + 2016-10-19 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-SelectLoop.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg b/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg index 7ec97f96a8bc..5f7a311db715 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg @@ -1,725 +1,163 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - + + + + + - - - - + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Shape + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Shape.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg b/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg index 11494621bb67..3b4d5ee92d49 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg @@ -1,647 +1,147 @@ - - - - - - + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - - - + + + + - - - - + + + + - + - - + + - + - + image/svg+xml - - + + + Path-SimpleCopy + 2016-01-23 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-SimpleCopy.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg b/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg index 6df8160d67bb..5fa8e09d0a22 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg @@ -1,280 +1,83 @@ - - - + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - - - - - + + + + + + + - - - - - - + + + + + + - + - + - + image/svg+xml - - + + + Path-Speed + 2016-05-15 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Speed.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg b/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg index 1c722e58b46c..1af75104e002 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg @@ -1,185 +1,65 @@ - - - - - - + + + + + - - - + + + - - - - - - + + + + + + - - - - + + + + - - + + - + - + image/svg+xml - - + + + Path-Stock + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg b/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg index 2012f65ca51d..db9564a2cbc1 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg @@ -1,117 +1,50 @@ - - - - - - + + + + + - + - - + + - + - + image/svg+xml - - + + + Path-Stop + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Stop.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg b/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg index 1149d93c148d..3569ac90354c 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg @@ -1,746 +1,170 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - + + + + - - + + - - + + - + - + image/svg+xml - - + + + Path-Tags + 2016-02-24 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Tags.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg b/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg index 7cfe87906b38..0a01c1feff1b 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg @@ -1,854 +1,202 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + image/svg+xml - - + + + Path-ToolChange + 2016-01-20 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - + + + + + + + - + - + - - - - - - + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg b/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg index dd400a42af63..73007f4209b3 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg @@ -1,1051 +1,232 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + image/svg+xml - - + + + Path-ToolTable + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-ToolTable.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - + + + + + + - + - + - - - - - + + + + + - + - + - - - - - + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg b/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg index 55bd668fe2d5..308bb5764431 100644 --- a/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg +++ b/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg @@ -1,712 +1,158 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - + + + + + - - - - - + + + + + - - + + - + - + image/svg+xml - - + + + Path-Toolpath + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Toolpath.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - + + + + + + + + + + - + - + diff --git a/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg b/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg index 323f17337e50..75589dd3eaf2 100644 --- a/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg +++ b/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg @@ -1,710 +1,161 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - - - + + + + + + + - - - - - + + + + + - + - - + + - + - + image/svg+xml - - + + + PathWorkbench + 2016-02-26 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/PathWorkbench.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/icons/preferences-path.svg b/src/Mod/Path/Gui/Resources/icons/preferences-path.svg index f2a9c295330b..64d5a676e3f0 100644 --- a/src/Mod/Path/Gui/Resources/icons/preferences-path.svg +++ b/src/Mod/Path/Gui/Resources/icons/preferences-path.svg @@ -1,707 +1,159 @@ - - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - - - + + + + + + + - - - - - + + + + + - + - - + + - + - + image/svg+xml - - + + + preferences-path + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/preferences-path.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + - - - - - - - - - - - - + + + + + + + + + + + + From 21f430da2cf3db06ddf7160fbd235170a49cc3ac Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Thu, 22 Dec 2016 17:28:09 -0200 Subject: [PATCH 60/60] Arch: more robust edge ordering in Arch OBJ exporter --- src/Mod/Arch/importOBJ.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Mod/Arch/importOBJ.py b/src/Mod/Arch/importOBJ.py index 58cba4b8be20..f47c7512ef97 100644 --- a/src/Mod/Arch/importOBJ.py +++ b/src/Mod/Arch/importOBJ.py @@ -98,10 +98,7 @@ def getIndices(shape,offset): flist.append(fi) else: fi = "" - # OCC vertices are unsorted. We need to sort in the right order... - edges = Part.__sortEdges__(f.OuterWire.Edges) - #print edges - for e in edges: + for e in f.OuterWire.OrderedEdges: #print e.Vertexes[0].Point,e.Vertexes[1].Point v = e.Vertexes[0] ind = findVert(v,shape.Vertexes)