Skip to content

Commit

Permalink
Draft: split Polygon from Draft.py
Browse files Browse the repository at this point in the history
.


.


.


.
  • Loading branch information
carlopav authored and yorikvanhavre committed Apr 29, 2020
1 parent 96b2dde commit 4eab0bb
Show file tree
Hide file tree
Showing 4 changed files with 219 additions and 82 deletions.
2 changes: 2 additions & 0 deletions src/Mod/Draft/CMakeLists.txt
Expand Up @@ -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
)

Expand All @@ -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
Expand Down
86 changes: 4 additions & 82 deletions src/Mod/Draft/Draft.py
Expand Up @@ -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



#---------------------------------------------------------------------------
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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"""
Expand Down
91 changes: 91 additions & 0 deletions src/Mod/Draft/draftmake/make_polygon.py
@@ -0,0 +1,91 @@
# ***************************************************************************
# * Copyright (c) 2009, 2010 Yorik van Havre <yorik@uncreated.net> *
# * Copyright (c) 2009, 2010 Ken Cline <cline@frii.com> *
# * 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
122 changes: 122 additions & 0 deletions src/Mod/Draft/draftobjects/polygon.py
@@ -0,0 +1,122 @@
# ***************************************************************************
# * Copyright (c) 2009, 2010 Yorik van Havre <yorik@uncreated.net> *
# * Copyright (c) 2009, 2010 Ken Cline <cline@frii.com> *
# * 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

0 comments on commit 4eab0bb

Please sign in to comment.