From a34ca76a4ea99ff8120bec153f4a36843683a557 Mon Sep 17 00:00:00 2001 From: carlopav Date: Sat, 25 Apr 2020 15:43:54 +0200 Subject: [PATCH] Draft: split circle from Draft.py . . --- src/Mod/Draft/CMakeLists.txt | 2 + src/Mod/Draft/Draft.py | 91 ++--------------- src/Mod/Draft/draftmake/make_circle.py | 135 +++++++++++++++++++++++++ src/Mod/Draft/draftobjects/circle.py | 98 ++++++++++++++++++ 4 files changed, 241 insertions(+), 85 deletions(-) create mode 100644 src/Mod/Draft/draftmake/make_circle.py create mode 100644 src/Mod/Draft/draftobjects/circle.py diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index 9fce83e768ff..82dfa77c667a 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -64,12 +64,14 @@ SET(Draft_functions SET(Draft_make_functions draftmake/__init__.py + draftmake/make_circle.py ) SET(Draft_objects draftobjects/__init__.py draftobjects/base.py draftobjects/circulararray.py + draftobjects/circle.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 89861a8c8704..3d2f0f032ba2 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -191,6 +191,12 @@ from draftviewproviders.view_base import ViewProviderDraftPart from draftviewproviders.view_base import _ViewProviderDraftPart +# circle +from draftmake.make_circle import make_circle, makeCircle +from draftobjects.circle import Circle, _Circle + + + #--------------------------------------------------------------------------- # Draft annotation objects #--------------------------------------------------------------------------- @@ -259,63 +265,6 @@ def convertDraftTexts(textslist=[]): FreeCAD.ActiveDocument.removeObject(n) - -def makeCircle(radius, placement=None, face=None, startangle=None, endangle=None, support=None): - """makeCircle(radius,[placement,face,startangle,endangle]) - or makeCircle(edge,[face]): - Creates a circle object with given radius. If placement is given, it is - used. If face is False, the circle is shown as a - wireframe, otherwise as a face. If startangle AND endangle are given - (in degrees), they are used and the object appears as an arc. If an edge - is passed, its Curve must be a Part.Circle""" - if not FreeCAD.ActiveDocument: - FreeCAD.Console.PrintError("No active document. Aborting\n") - return - import Part, DraftGeomUtils - if placement: typecheck([(placement,FreeCAD.Placement)], "makeCircle") - if startangle != endangle: - n = "Arc" - else: - n = "Circle" - obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython",n) - _Circle(obj) - if face != None: - obj.MakeFace = face - if isinstance(radius,Part.Edge): - edge = radius - if DraftGeomUtils.geomType(edge) == "Circle": - obj.Radius = edge.Curve.Radius - placement = FreeCAD.Placement(edge.Placement) - delta = edge.Curve.Center.sub(placement.Base) - placement.move(delta) - # Rotation of the edge - rotOk = FreeCAD.Rotation(edge.Curve.XAxis, edge.Curve.YAxis, edge.Curve.Axis, "ZXY") - placement.Rotation = rotOk - if len(edge.Vertexes) > 1: - v0 = edge.Curve.XAxis - v1 = (edge.Vertexes[0].Point).sub(edge.Curve.Center) - v2 = (edge.Vertexes[-1].Point).sub(edge.Curve.Center) - # Angle between edge.Curve.XAxis and the vector from center to start of arc - a0 = math.degrees(FreeCAD.Vector.getAngle(v0, v1)) - # Angle between edge.Curve.XAxis and the vector from center to end of arc - a1 = math.degrees(FreeCAD.Vector.getAngle(v0, v2)) - obj.FirstAngle = a0 - obj.LastAngle = a1 - else: - obj.Radius = radius - if (startangle != None) and (endangle != None): - if startangle == -0: startangle = 0 - obj.FirstAngle = startangle - obj.LastAngle = endangle - obj.Support = support - if placement: obj.Placement = placement - if gui: - _ViewProviderDraft(obj.ViewObject) - formatObject(obj) - select(obj) - - return obj - def makeRectangle(length, height, placement=None, face=None, support=None): """makeRectangle(length,width,[placement],[face]): Creates a Rectangle object with length in X direction and height in Y direction. @@ -3248,34 +3197,6 @@ def __init__(self,vobj): _ViewProviderDraft.__init__(self,vobj) vobj.addProperty("App::PropertyFile","TextureImage","Draft",QT_TRANSLATE_NOOP("App::Property","Defines a texture image (overrides hatch patterns)")) -class _Circle(_DraftObject): - """The Circle object""" - - def __init__(self, obj): - _DraftObject.__init__(self,obj,"Circle") - 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","Radius","Draft",QT_TRANSLATE_NOOP("App::Property","Radius of the circle")) - 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 - shape = Part.makeCircle(obj.Radius.Value,Vector(0,0,0),Vector(0,0,1),obj.FirstAngle.Value,obj.LastAngle.Value) - if obj.FirstAngle.Value == obj.LastAngle.Value: - shape = Part.Wire(shape) - 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 _Ellipse(_DraftObject): """The Circle object""" diff --git a/src/Mod/Draft/draftmake/make_circle.py b/src/Mod/Draft/draftmake/make_circle.py new file mode 100644 index 000000000000..5950e0cb8cb3 --- /dev/null +++ b/src/Mod/Draft/draftmake/make_circle.py @@ -0,0 +1,135 @@ +# *************************************************************************** +# * 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_circle function. +""" +## @package make circle +# \ingroup DRAFT +# \brief This module provides the code for Draft make_circle. + + +import math + +import FreeCAD as App + +import Part +import DraftGeomUtils + +from draftutils.gui_utils import format_object +from draftutils.gui_utils import select + +from draftutils.utils import type_check + +from draftobjects.circle import Circle +if App.GuiUp: + from draftviewproviders.view_base import ViewProviderDraft + + +def make_circle(radius, placement=None, face=None, startangle=None, endangle=None, support=None): + """make_circle(radius, [placement, face, startangle, endangle]) + or make_circle(edge,[face]): + + Creates a circle object with given parameters. + + Parameters + ---------- + radius : the radius of the circle. + + placement : + If placement is given, it is used. + + face : Bool + If face is False, the circle is shown as a wireframe, + otherwise as a face. + + startangle : start angle of the arc (in degrees) + + endangle : end angle of the arc (in degrees) + if startangle and endangle are equal, a circle is created, + if they are different an arc is created + + edge : edge.Curve must be a 'Part.Circle' + the circle is created from the given edge + + support : + TODO: Describe + """ + + if not App.ActiveDocument: + App.Console.PrintError("No active document. Aborting\n") + return + + if placement: type_check([(placement,App.Placement)], "make_circle") + + if startangle != endangle: + _name = "Arc" + else: + _name = "Circle" + + obj = App.ActiveDocument.addObject("Part::Part2DObjectPython", _name) + + Circle(obj) + + if face != None: + obj.MakeFace = face + + if isinstance(radius,Part.Edge): + edge = radius + if DraftGeomUtils.geomType(edge) == "Circle": + obj.Radius = edge.Curve.Radius + placement = App.Placement(edge.Placement) + delta = edge.Curve.Center.sub(placement.Base) + placement.move(delta) + # Rotation of the edge + rotOk = App.Rotation(edge.Curve.XAxis, edge.Curve.YAxis, edge.Curve.Axis, "ZXY") + placement.Rotation = rotOk + if len(edge.Vertexes) > 1: + v0 = edge.Curve.XAxis + v1 = (edge.Vertexes[0].Point).sub(edge.Curve.Center) + v2 = (edge.Vertexes[-1].Point).sub(edge.Curve.Center) + # Angle between edge.Curve.XAxis and the vector from center to start of arc + a0 = math.degrees(App.Vector.getAngle(v0, v1)) + # Angle between edge.Curve.XAxis and the vector from center to end of arc + a1 = math.degrees(App.Vector.getAngle(v0, v2)) + obj.FirstAngle = a0 + obj.LastAngle = a1 + else: + obj.Radius = radius + if (startangle != None) and (endangle != None): + if startangle == -0: startangle = 0 + obj.FirstAngle = startangle + obj.LastAngle = endangle + + obj.Support = support + + if placement: + obj.Placement = placement + + if App.GuiUp: + ViewProviderDraft(obj.ViewObject) + format_object(obj) + select(obj) + + return obj + + +makeCircle = make_circle \ No newline at end of file diff --git a/src/Mod/Draft/draftobjects/circle.py b/src/Mod/Draft/draftobjects/circle.py new file mode 100644 index 000000000000..2762a3799420 --- /dev/null +++ b/src/Mod/Draft/draftobjects/circle.py @@ -0,0 +1,98 @@ +# *************************************************************************** +# * 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 Circle. +""" +## @package circle +# \ingroup DRAFT +# \brief This module provides the object code for Draft Circle. + +from PySide.QtCore import QT_TRANSLATE_NOOP + +import FreeCAD as App + +from draftutils.utils import get_param + +from draftobjects.base import DraftObject + + +class Circle(DraftObject): + """The Circle object""" + + def __init__(self, obj): + super(Circle, self).__init__(obj, "Circle") + + _tip = "Start angle of the arc" + obj.addProperty("App::PropertyAngle", "FirstAngle", + "Draft", QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "End angle of the arc (for a full circle, \ + give it same value as First Angle)" + obj.addProperty("App::PropertyAngle","LastAngle", + "Draft", QT_TRANSLATE_NOOP("App::Property", _tip)) + + _tip = "Radius of the circle" + obj.addProperty("App::PropertyLength", "Radius", + "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) + + + def execute(self, obj): + """This method is run when the object is created or recomputed.""" + import Part + + plm = obj.Placement + + shape = Part.makeCircle(obj.Radius.Value, + App.Vector(0,0,0), + App.Vector(0,0,1), + obj.FirstAngle.Value, + obj.LastAngle.Value) + + if obj.FirstAngle.Value == obj.LastAngle.Value: + shape = Part.Wire(shape) + 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() + + +_Circle = Circle \ No newline at end of file