diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index c4a02358cc..4d9601a5c1 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -16,6 +16,7 @@ SET(Draft_SRCS DraftGeomUtils.py DraftLayer.py DraftEdit.py + DraftFillet.py WorkingPlane.py getSVG.py importDXF.py diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 563c9195fb..bff3d09f25 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -76,6 +76,10 @@ _VisGroup = DraftLayer.Layer _ViewProviderVisGroup = DraftLayer.ViewProviderLayer makeLayer = DraftLayer.makeLayer +# import DraftFillet +# Fillet = DraftFillet.Fillet +# makeFillet = DraftFillet.makeFillet + #--------------------------------------------------------------------------- # General functions #--------------------------------------------------------------------------- diff --git a/src/Mod/Draft/DraftFillet.py b/src/Mod/Draft/DraftFillet.py new file mode 100644 index 0000000000..aad0839188 --- /dev/null +++ b/src/Mod/Draft/DraftFillet.py @@ -0,0 +1,121 @@ +import FreeCAD +from FreeCAD import Console as FCC +import Draft +import DraftGeomUtils + +if FreeCAD.GuiUp: + import FreeCADGui + import DraftGui + from PySide.QtCore import QT_TRANSLATE_NOOP + from DraftTools import translate + from DraftTools import Line +else: + def QT_TRANSLATE_NOOP(context, text): + return text + + def translate(context, text): + return text + + +def makeFillet(edge_list, radius=100, chamfer=False): + """Create a fillet between two lines or edges. + + Parameters + ---------- + edge_list : list + List of two objects of type wire, or edges. + radius : float, optional + It defaults to 100 mm. The curvature of the fillet. + chamfer : bool + Create the chamfer. + + Returns + ------- + Part::Feature + The objects of type Fillet. + """ + if len(edge_list) > 2: + FCC.PrintError("makeFillet: edge_list too many elements") + e1, e2 = edge_list + if "Proxy" in e1.PropertiesList: + if hasattr(e1.Proxy, "Type"): + if e1.Proxy.Type in "Wire": + e1 = e1.Shape.Edges[0] + elif "Shape" in e1.PropertiesList: + if e1.Shape.ShapeType in "Edge": + e1 = e1.Shape + if "Proxy" in e2.PropertiesList: + if hasattr(e2.Proxy, "Type"): + if e2.Proxy.Type in "Wire": + e2 = e2.Shape.Edges[0] + elif "Shape" in e2.PropertiesList: + if e2.Shape.ShapeType in "Edge": + e2 = e2.Shape + + edges = DraftGeomUtils.fillet([e1, e2], radius, chamfer) + add, delete = Draft.upgrade(edges, delete=True) + newobj = add[0] + obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython", + "LineFillet") + Fillet(obj) + obj.Shape = newobj.Shape + if FreeCAD.GuiUp: + Draft._ViewProviderWire(obj.ViewObject) + Draft.formatObject(obj) + Draft.select(obj) + return obj + + +class Fillet(Draft._DraftObject): + """The fillet object""" + + def __init__(self, obj): + Draft._DraftObject.__init__(self, obj, "Fillet") + obj.addProperty("App::PropertyVectorDistance", "Start", "Draft", QT_TRANSLATE_NOOP("App::Property", "The start point of this line")) + obj.addProperty("App::PropertyVectorDistance", "End", "Draft", QT_TRANSLATE_NOOP("App::Property", "The end point of this line")) + obj.addProperty("App::PropertyLength", "Length", "Draft", QT_TRANSLATE_NOOP("App::Property", "The length of this line")) + obj.addProperty("App::PropertyLength", "FilletRadius", "Draft", QT_TRANSLATE_NOOP("App::Property", "Radius to use to fillet the corners")) + + def execute(self, obj): + pass + + def onChanged(self, obj, prop): + # Change the radius of fillet + pass + + +class CommandFillet(Line): + def __init__(self): + Line.__init__(self, wiremode=True) + + def GetResources(self): + return {'Pixmap': 'Draft_Wire', + 'MenuText': QT_TRANSLATE_NOOP("draft", "Fillet"), + 'ToolTip': QT_TRANSLATE_NOOP("draft", "Creates a fillet between two wires or edges.") + } + + def Activated(self): + if len(FreeCADGui.Selection.getSelection()) > 1: + edges = [] + edges = FreeCADGui.Selection.getSelection() + for o in edges: + # Choose only Wires + if Draft.getType(o) != "Wire": + edges = [] + break + # edges.extend(o.Shape.Edges) + FCC.PrintMessage("makeFillet: " + Draft.getType(o) + "\n") + if edges: + if len(edges) > 2: + FCC.PrintError("CommandFillet: too many elements") + doc = 'FreeCAD.ActiveDocument.' + _edges = '[' + doc + edges[0].Name + ', ' + doc + edges[1].Name + ']' + rems = [doc + 'removeObject("' + o.Name + '")' for o in FreeCADGui.Selection.getSelection()] + FreeCADGui.addModule("Draft") + func = translate("draft", "Create fillet") + arg = ['arc = DraftFillet.makeFillet(' + _edges + ')'] + rems + ['Draft.autogroup(arc)', 'FreeCAD.ActiveDocument.recompute()'] + DraftGui.todo.delayCommit([(func, arg)]) + + +if FreeCAD.GuiUp: + FreeCADGui.addCommand('Draft_Fillet', CommandFillet()) diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 65f3e0855e..8a32ab927b 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -51,6 +51,7 @@ from pivy import coin #--------------------------------------------------------------------------- import DraftEdit +#import DraftFillet #--------------------------------------------------------------------------- # Preflight stuff diff --git a/src/Mod/Draft/InitGui.py b/src/Mod/Draft/InitGui.py index a4449fe1e0..e7283fd35d 100644 --- a/src/Mod/Draft/InitGui.py +++ b/src/Mod/Draft/InitGui.py @@ -73,7 +73,7 @@ class DraftWorkbench(Workbench): FreeCAD.Console.PrintError("Error: Initializing one or more of the Draft modules failed, Draft will not work as expected.\n") # setup menus - self.cmdList = ["Draft_Line", "Draft_Wire", "Draft_Circle", + self.cmdList = ["Draft_Line", "Draft_Wire", "Draft_Fillet", "Draft_Circle", "Draft_ArcTools", "Draft_Ellipse", "Draft_Polygon", "Draft_Rectangle", "Draft_Text", "Draft_Dimension", "Draft_BSpline", "Draft_Point",