diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index 0e0cc5c184c7..96c7a0de3b49 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -65,6 +65,7 @@ SET(Draft_functions SET(Draft_make_functions draftmake/__init__.py draftmake/make_circle.py + draftmake/make_polygon.py draftmake/make_rectangle.py ) @@ -79,6 +80,7 @@ SET(Draft_objects draftobjects/draft_annotation.py draftobjects/label.py draftobjects/dimension.py + draftobjects/polygon.py draftobjects/rectangle.py draftobjects/text.py draftobjects/README.md diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index c14f1b2a9248..e3aeab23a572 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -202,6 +202,10 @@ from draftviewproviders.view_rectangle import ViewProviderRectangle from draftviewproviders.view_rectangle import _ViewProviderRectangle +# polygon +from draftmake.make_polygon import make_polygon, makePolygon +from draftobjects.polygon import Polygon, _Polygon + #--------------------------------------------------------------------------- @@ -317,35 +321,6 @@ def makeWire(pointslist,closed=False,placement=None,face=None,support=None,bs2wi return obj -def makePolygon(nfaces,radius=1,inscribed=True,placement=None,face=None,support=None): - """makePolgon(nfaces,[radius],[inscribed],[placement],[face]): Creates a - polygon object with the given number of faces and the radius. - if inscribed is False, the polygon is circumscribed around a circle - with the given radius, otherwise it is inscribed. If face is True, - the resulting shape is displayed as a face, otherwise as a wireframe. - """ - if not FreeCAD.ActiveDocument: - FreeCAD.Console.PrintError("No active document. Aborting\n") - return - if nfaces < 3: return None - obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython","Polygon") - _Polygon(obj) - obj.FacesNumber = nfaces - obj.Radius = radius - if face != None: - obj.MakeFace = face - if inscribed: - obj.DrawMode = "inscribed" - else: - obj.DrawMode = "circumscribed" - obj.Support = support - if placement: obj.Placement = placement - if gui: - _ViewProviderDraft(obj.ViewObject) - formatObject(obj) - select(obj) - - return obj def makeLine(p1,p2=None): """makeLine(p1,p2): Creates a line between p1 and p2. @@ -3391,59 +3366,6 @@ def flatten(self): from DraftTools import translate FreeCAD.Console.PrintMessage(translate("Draft","This Wire is already flat")+"\n") -class _Polygon(_DraftObject): - """The Polygon object""" - - def __init__(self, obj): - _DraftObject.__init__(self,obj,"Polygon") - obj.addProperty("App::PropertyInteger","FacesNumber","Draft",QT_TRANSLATE_NOOP("App::Property","Number of faces")) - obj.addProperty("App::PropertyLength","Radius","Draft",QT_TRANSLATE_NOOP("App::Property","Radius of the control circle")) - obj.addProperty("App::PropertyEnumeration","DrawMode","Draft",QT_TRANSLATE_NOOP("App::Property","How the polygon must be drawn from the control circle")) - obj.addProperty("App::PropertyLength","FilletRadius","Draft",QT_TRANSLATE_NOOP("App::Property","Radius to use to fillet the corners")) - obj.addProperty("App::PropertyLength","ChamferSize","Draft",QT_TRANSLATE_NOOP("App::Property","Size of the chamfer to give to the corners")) - 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) - obj.DrawMode = ['inscribed','circumscribed'] - obj.FacesNumber = 0 - obj.Radius = 1 - - def execute(self, obj): - if (obj.FacesNumber >= 3) and (obj.Radius.Value > 0): - import Part, DraftGeomUtils - plm = obj.Placement - angle = (math.pi*2)/obj.FacesNumber - if obj.DrawMode == 'inscribed': - delta = obj.Radius.Value - else: - delta = obj.Radius.Value/math.cos(angle/2.0) - pts = [Vector(delta,0,0)] - for i in range(obj.FacesNumber-1): - ang = (i+1)*angle - pts.append(Vector(delta*math.cos(ang),delta*math.sin(ang),0)) - pts.append(pts[0]) - shape = Part.makePolygon(pts) - if "ChamferSize" in obj.PropertiesList: - if obj.ChamferSize.Value != 0: - w = DraftGeomUtils.filletWire(shape,obj.ChamferSize.Value,chamfer=True) - if w: - shape = w - if "FilletRadius" in obj.PropertiesList: - if obj.FilletRadius.Value != 0: - w = DraftGeomUtils.filletWire(shape,obj.FilletRadius.Value) - if w: - shape = w - 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""" diff --git a/src/Mod/Draft/draftmake/make_polygon.py b/src/Mod/Draft/draftmake/make_polygon.py new file mode 100644 index 000000000000..9e6a178dea15 --- /dev/null +++ b/src/Mod/Draft/draftmake/make_polygon.py @@ -0,0 +1,91 @@ +# *************************************************************************** +# * 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 make_rectangle function. +""" +## @package make_rectangle +# \ingroup DRAFT +# \brief This module provides the code for Draft make_rectangle function. + +import FreeCAD as App + +from draftutils.gui_utils import format_object +from draftutils.gui_utils import select + +from draftutils.utils import type_check + +from draftobjects.polygon import Polygon +from draftviewproviders.view_base import ViewProviderDraft + + + +def make_polygon(nfaces, radius=1, inscribed=True, placement=None, face=None, support=None): + """makePolgon(edges,[radius],[inscribed],[placement],[face]) + + Creates a polygon object with the given number of edges and radius. + + Parameters + ---------- + edges : int + Number of edges of the polygon. + + radius : + Radius of the control circle. + + inscribed : bool + Defines is the polygon is inscribed or not into the control circle. + + placement : Base.Placement + If placement is given, it is used. + + face : bool + If face is True, the resulting shape is displayed as a face, + otherwise as a wireframe. + + support : + TODO: Describe + """ + if not App.ActiveDocument: + App.Console.PrintError("No active document. Aborting\n") + return + if nfaces < 3: return None + obj = App.ActiveDocument.addObject("Part::Part2DObjectPython","Polygon") + Polygon(obj) + obj.FacesNumber = nfaces + obj.Radius = radius + if face != None: + obj.MakeFace = face + if inscribed: + obj.DrawMode = "inscribed" + else: + obj.DrawMode = "circumscribed" + obj.Support = support + if placement: obj.Placement = placement + if App.GuiUp: + ViewProviderDraft(obj.ViewObject) + format_object(obj) + select(obj) + + return obj + + +makePolygon = make_polygon \ No newline at end of file diff --git a/src/Mod/Draft/draftobjects/polygon.py b/src/Mod/Draft/draftobjects/polygon.py new file mode 100644 index 000000000000..1d6e1810cfeb --- /dev/null +++ b/src/Mod/Draft/draftobjects/polygon.py @@ -0,0 +1,122 @@ +# *************************************************************************** +# * 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 Polygon. +""" +## @package polygon +# \ingroup DRAFT +# \brief This module provides the object code for Draft Polygon. + +import math + +from PySide.QtCore import QT_TRANSLATE_NOOP + +import FreeCAD as App + +import DraftGeomUtils + +from draftutils.utils import get_param + +from draftobjects.base import DraftObject + + +class Polygon(DraftObject): + """The Polygon object""" + + def __init__(self, obj): + super(Polygon, self).__init__(obj, "Polygon") + + _tip = "Number of faces" + obj.addProperty("App::PropertyInteger", "FacesNumber", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Radius of the control circle" + obj.addProperty("App::PropertyLength", "Radius", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "How the polygon must be drawn from the control circle" + obj.addProperty("App::PropertyEnumeration", "DrawMode", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Radius to use to fillet the corners" + obj.addProperty("App::PropertyLength", "FilletRadius", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Size of the chamfer to give to the corners" + obj.addProperty("App::PropertyLength", "ChamferSize", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Create a face" + obj.addProperty("App::PropertyBool", "MakeFace", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "The area of this object" + obj.addProperty("App::PropertyArea", "Area", + "Draft",QT_TRANSLATE_NOOP("App::Property", _tip)) + + obj.MakeFace = get_param("fillmode",True) + obj.DrawMode = ['inscribed','circumscribed'] + obj.FacesNumber = 0 + obj.Radius = 1 + + def execute(self, obj): + if (obj.FacesNumber >= 3) and (obj.Radius.Value > 0): + import Part + plm = obj.Placement + angle = (math.pi * 2) / obj.FacesNumber + if obj.DrawMode == 'inscribed': + delta = obj.Radius.Value + else: + delta = obj.Radius.Value / math.cos(angle / 2.0) + pts = [App.Vector(delta, 0, 0)] + for i in range(obj.FacesNumber - 1): + ang = (i + 1) * angle + pts.append(App.Vector(delta * math.cos(ang), + delta*math.sin(ang), + 0)) + pts.append(pts[0]) + shape = Part.makePolygon(pts) + if "ChamferSize" in obj.PropertiesList: + if obj.ChamferSize.Value != 0: + w = DraftGeomUtils.filletWire(shape,obj.ChamferSize.Value, + chamfer=True) + if w: + shape = w + if "FilletRadius" in obj.PropertiesList: + if obj.FilletRadius.Value != 0: + w = DraftGeomUtils.filletWire(shape, + obj.FilletRadius.Value) + if w: + shape = w + 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() + + +_Polygon = Polygon \ No newline at end of file