diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index a9cafa248f..3dd3159dfa 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -60,6 +60,7 @@ SET(Draft_utilities SET(Draft_functions draftfunctions/__init__.py + draftfunctions/fuse.py draftfunctions/heal.py draftfunctions/join.py draftfunctions/mirror.py diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index e7839b90e5..5ff81227b7 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -179,6 +179,8 @@ from draftutils.gui_utils import load_texture # Draft functions #--------------------------------------------------------------------------- +from draftfunctions.fuse import fuse + from draftfunctions.heal import heal from draftfunctions.move import move @@ -510,45 +512,6 @@ def extrude(obj,vector,solid=False): return newobj -def fuse(object1,object2): - """fuse(oject1,object2): returns an object made from - the union of the 2 given objects. If the objects are - coplanar, a special Draft Wire is used, otherwise we use - a standard Part fuse.""" - if not FreeCAD.ActiveDocument: - FreeCAD.Console.PrintError("No active document. Aborting\n") - return - import DraftGeomUtils, Part - # testing if we have holes: - holes = False - fshape = object1.Shape.fuse(object2.Shape) - fshape = fshape.removeSplitter() - for f in fshape.Faces: - if len(f.Wires) > 1: - holes = True - if DraftGeomUtils.isCoplanar(object1.Shape.fuse(object2.Shape).Faces) and not holes: - obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython","Fusion") - _Wire(obj) - if gui: - _ViewProviderWire(obj.ViewObject) - obj.Base = object1 - obj.Tool = object2 - elif holes: - # temporary hack, since Part::Fuse objects don't remove splitters - obj = FreeCAD.ActiveDocument.addObject("Part::Feature","Fusion") - obj.Shape = fshape - else: - obj = FreeCAD.ActiveDocument.addObject("Part::Fuse","Fusion") - obj.Base = object1 - obj.Tool = object2 - if gui: - object1.ViewObject.Visibility = False - object2.ViewObject.Visibility = False - formatObject(obj,object1) - select(obj) - - return obj - def cut(object1,object2): """cut(oject1,object2): returns a cut object made from the difference of the 2 given objects.""" diff --git a/src/Mod/Draft/draftfunctions/fuse.py b/src/Mod/Draft/draftfunctions/fuse.py new file mode 100644 index 0000000000..c659172fae --- /dev/null +++ b/src/Mod/Draft/draftfunctions/fuse.py @@ -0,0 +1,80 @@ +# *************************************************************************** +# * 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 fuse function. +""" +## @package fuse +# \ingroup DRAFT +# \brief This module provides the code for Draft fuse function. + +import FreeCAD as App + +import draftutils.gui_utils as gui_utils +import draftutils.utils as utils + +from draftmake.make_wire import Wire +if App.GuiUp: + from draftviewproviders.view_wire import ViewProviderWire + + +def fuse(object1, object2): + """fuse(oject1, object2) + + Returns an object made from the union of the 2 given objects. + If the objects are coplanar, a special Draft Wire is used, otherwise we use + a standard Part fuse. + + """ + if not App.ActiveDocument: + App.Console.PrintError("No active document. Aborting\n") + return + import Part + import DraftGeomUtils + # testing if we have holes: + holes = False + fshape = object1.Shape.fuse(object2.Shape) + fshape = fshape.removeSplitter() + for f in fshape.Faces: + if len(f.Wires) > 1: + holes = True + if DraftGeomUtils.isCoplanar(object1.Shape.fuse(object2.Shape).Faces) and not holes: + obj = App.ActiveDocument.addObject("Part::Part2DObjectPython","Fusion") + Wire(obj) + if App.GuiUp: + ViewProviderWire(obj.ViewObject) + obj.Base = object1 + obj.Tool = object2 + elif holes: + # temporary hack, since Part::Fuse objects don't remove splitters + obj = App.ActiveDocument.addObject("Part::Feature","Fusion") + obj.Shape = fshape + else: + obj = App.ActiveDocument.addObject("Part::Fuse","Fusion") + obj.Base = object1 + obj.Tool = object2 + if App.GuiUp: + object1.ViewObject.Visibility = False + object2.ViewObject.Visibility = False + gui_utils.format_object(obj,object1) + gui_utils.select(obj) + + return obj