diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index d2b43fe0a1..16bb0edc80 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -68,6 +68,7 @@ SET(Draft_make_functions draftmake/make_bspline.py draftmake/make_circle.py draftmake/make_clone.py + draftmake/make_ellipse.py draftmake/make_line.py draftmake/make_polygon.py draftmake/make_point.py @@ -83,6 +84,7 @@ SET(Draft_objects draftobjects/circulararray.py draftobjects/circle.py draftobjects/clone.py + draftobjects/ellipse.py draftobjects/orthoarray.py draftobjects/polararray.py draftobjects/arc_3points.py diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 7c831085fd..71b10d8a8f 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -195,6 +195,10 @@ from draftviewproviders.view_base import _ViewProviderDraftPart from draftmake.make_circle import make_circle, makeCircle from draftobjects.circle import Circle, _Circle +# ellipse +from draftmake.make_ellipse import make_ellipse, makeEllipse +from draftobjects.ellipse import Ellipse, _Ellipse + # rectangle from draftmake.make_rectangle import make_rectangle, makeRectangle from draftobjects.rectangle import Rectangle, _Rectangle @@ -599,30 +603,6 @@ def makePointArray(base, ptlst): select(obj) return obj -def makeEllipse(majradius,minradius,placement=None,face=True,support=None): - """makeEllipse(majradius,minradius,[placement],[face],[support]): makes - an ellipse with the given major and minor radius, and optionally - a placement.""" - if not FreeCAD.ActiveDocument: - FreeCAD.Console.PrintError("No active document. Aborting\n") - return - obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython","Ellipse") - _Ellipse(obj) - if minradius > majradius: - majradius,minradius = minradius,majradius - obj.MajorRadius = majradius - obj.MinorRadius = minradius - obj.Support = support - if placement: - obj.Placement = placement - if gui: - _ViewProviderDraft(obj.ViewObject) - #if not face: - # obj.ViewObject.DisplayMode = "Wireframe" - formatObject(obj) - select(obj) - - return obj def extrude(obj,vector,solid=False): """makeExtrusion(object,vector): extrudes the given object @@ -2878,47 +2858,6 @@ class _ViewProviderDraftLink: return obj.ElementList -class _Ellipse(_DraftObject): - """The Circle object""" - - def __init__(self, obj): - _DraftObject.__init__(self,obj,"Ellipse") - obj.addProperty("App::PropertyAngle","FirstAngle","Draft",QT_TRANSLATE_NOOP("App::Property","Start angle of the arc")) - obj.addProperty("App::PropertyAngle","LastAngle","Draft",QT_TRANSLATE_NOOP("App::Property","End angle of the arc (for a full circle, give it same value as First Angle)")) - obj.addProperty("App::PropertyLength","MinorRadius","Draft",QT_TRANSLATE_NOOP("App::Property","The minor radius of the ellipse")) - obj.addProperty("App::PropertyLength","MajorRadius","Draft",QT_TRANSLATE_NOOP("App::Property","The major radius of the ellipse")) - obj.addProperty("App::PropertyBool","MakeFace","Draft",QT_TRANSLATE_NOOP("App::Property","Create a face")) - obj.addProperty("App::PropertyArea","Area","Draft",QT_TRANSLATE_NOOP("App::Property","The area of this object")) - obj.MakeFace = getParam("fillmode",True) - - def execute(self, obj): - import Part - plm = obj.Placement - if obj.MajorRadius.Value < obj.MinorRadius.Value: - FreeCAD.Console.PrintMessage(translate("Draft","Error: Major radius is smaller than the minor radius")) - return - if obj.MajorRadius.Value and obj.MinorRadius.Value: - ell = Part.Ellipse(Vector(0,0,0),obj.MajorRadius.Value,obj.MinorRadius.Value) - shape = ell.toShape() - if hasattr(obj,"FirstAngle"): - if obj.FirstAngle.Value != obj.LastAngle.Value: - a1 = obj.FirstAngle.getValueAs(FreeCAD.Units.Radian) - a2 = obj.LastAngle.getValueAs(FreeCAD.Units.Radian) - shape = Part.ArcOfEllipse(ell,a1,a2).toShape() - shape = Part.Wire(shape) - if shape.isClosed(): - if hasattr(obj,"MakeFace"): - if obj.MakeFace: - shape = Part.Face(shape) - else: - shape = Part.Face(shape) - obj.Shape = shape - if hasattr(obj,"Area") and hasattr(shape,"Area"): - obj.Area = shape.Area - obj.Placement = plm - obj.positionBySupport() - - class _DrawingView(_DraftObject): """The Draft DrawingView object""" def __init__(self, obj): diff --git a/src/Mod/Draft/draftmake/make_ellipse.py b/src/Mod/Draft/draftmake/make_ellipse.py new file mode 100644 index 0000000000..cd6cade68d --- /dev/null +++ b/src/Mod/Draft/draftmake/make_ellipse.py @@ -0,0 +1,85 @@ +# *************************************************************************** +# * Copyright (c) 2009, 2010 Yorik van Havre * +# * Copyright (c) 2009, 2010 Ken Cline * +# * Copyright (c) 2020 FreeCAD Developers * +# * * +# * 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 * +# * * +# *************************************************************************** +"""This module provides the code for Draft make_ellipse function. +""" +## @package make_ellipse +# \ingroup DRAFT +# \brief This module provides the code for Draft make_ellipse function. + +import FreeCAD as App + +from draftutils.gui_utils import format_object +from draftutils.gui_utils import select + +from draftobjects.ellipse import Ellipse +if App.GuiUp: + from draftviewproviders.view_base import ViewProviderDraft + + +def make_ellipse(majradius, minradius, placement=None, face=True, support=None): + """make_ellipse(majradius, minradius, [placement], [face], [support]) + + Makes an ellipse with the given major and minor radius, and optionally + a placement. + + Parameters + ---------- + majradius : + Major radius of the ellipse. + + minradius : + Minor radius of the ellipse. + + placement : Base.Placement + If a placement is given, it is used. + + face : Bool + If face is False, the rectangle is shown as a wireframe, + otherwise as a face. + + support : + TODO: Describe. + """ + if not App.ActiveDocument: + App.Console.PrintError("No active document. Aborting\n") + return + obj = App.ActiveDocument.addObject("Part::Part2DObjectPython", "Ellipse") + Ellipse(obj) + if minradius > majradius: + majradius, minradius = minradius, majradius + obj.MajorRadius = majradius + obj.MinorRadius = minradius + obj.Support = support + if placement: + obj.Placement = placement + if App.GuiUp: + ViewProviderDraft(obj.ViewObject) + #if not face: + # obj.ViewObject.DisplayMode = "Wireframe" + format_object(obj) + select(obj) + + return obj + + +makeEllipse = make_ellipse \ No newline at end of file diff --git a/src/Mod/Draft/draftobjects/ellipse.py b/src/Mod/Draft/draftobjects/ellipse.py new file mode 100644 index 0000000000..7b93bf2636 --- /dev/null +++ b/src/Mod/Draft/draftobjects/ellipse.py @@ -0,0 +1,102 @@ +# *************************************************************************** +# * Copyright (c) 2009, 2010 Yorik van Havre * +# * Copyright (c) 2009, 2010 Ken Cline * +# * Copyright (c) 2020 FreeCAD Developers * +# * * +# * 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 * +# * * +# *************************************************************************** +"""This module provides the object code for Draft Ellipse. +""" +## @package ellipse +# \ingroup DRAFT +# \brief This module provides the object code for Draft Ellipse. + +from PySide.QtCore import QT_TRANSLATE_NOOP + +import FreeCAD as App + +from draftutils.utils import get_param + +from draftobjects.base import DraftObject + + +class Ellipse(DraftObject): + """The Circle object""" + + def __init__(self, obj): + super(Ellipse, self).__init__(obj, "Ellipse") + + _tip = "Start angle of the elliptical arc" + obj.addProperty("App::PropertyAngle", "FirstAngle", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "End angle of the elliptical arc \n\ + (for a full circle, give it same value as First Angle)" + obj.addProperty("App::PropertyAngle", "LastAngle", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Minor radius of the ellipse" + obj.addProperty("App::PropertyLength", "MinorRadius", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Major radius of the ellipse" + obj.addProperty("App::PropertyLength", "MajorRadius", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Create a face" + obj.addProperty("App::PropertyBool", "MakeFace", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Area of this object" + obj.addProperty("App::PropertyArea", "Area", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + obj.MakeFace = get_param("fillmode",True) + + def execute(self, obj): + import Part + plm = obj.Placement + if obj.MajorRadius.Value < obj.MinorRadius.Value: + _err = "Error: Major radius is smaller than the minor radius" + App.Console.PrintMessage(QT_TRANSLATE_NOOP("Draft", _err)) + return + if obj.MajorRadius.Value and obj.MinorRadius.Value: + ell = Part.Ellipse(App.Vector(0, 0, 0), + obj.MajorRadius.Value, + obj.MinorRadius.Value) + shape = ell.toShape() + if hasattr(obj,"FirstAngle"): + if obj.FirstAngle.Value != obj.LastAngle.Value: + a1 = obj.FirstAngle.getValueAs(App.Units.Radian) + a2 = obj.LastAngle.getValueAs(App.Units.Radian) + shape = Part.ArcOfEllipse(ell, a1, a2).toShape() + shape = Part.Wire(shape) + if shape.isClosed(): + if hasattr(obj,"MakeFace"): + if obj.MakeFace: + shape = Part.Face(shape) + else: + shape = Part.Face(shape) + obj.Shape = shape + if hasattr(obj, "Area") and hasattr(shape, "Area"): + obj.Area = shape.Area + obj.Placement = plm + obj.positionBySupport() + + +_Ellipse = Ellipse \ No newline at end of file