diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index a253a4cf70..30c9558311 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -64,6 +64,7 @@ SET(Draft_functions draftfunctions/move.py draftfunctions/rotate.py draftfunctions/scale.py + draftfunctions/split.py ) SET(Draft_make_functions diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 96c51f5605..61b71d9927 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -192,6 +192,8 @@ from draftfunctions.join import join_wires as joinWires from draftfunctions.join import join_two_wires from draftfunctions.join import join_two_wires as joinTwoWires +from draftfunctions.split import split + #--------------------------------------------------------------------------- # Draft objects #--------------------------------------------------------------------------- @@ -502,39 +504,6 @@ def extrude(obj,vector,solid=False): return newobj -def split(wire, newPoint, edgeIndex): - if getType(wire) != "Wire": - return - elif wire.Closed: - splitClosedWire(wire, edgeIndex) - else: - splitOpenWire(wire, newPoint, edgeIndex) - -def splitClosedWire(wire, edgeIndex): - wire.Closed = False - if edgeIndex == len(wire.Points): - makeWire([wire.Placement.multVec(wire.Points[0]), - wire.Placement.multVec(wire.Points[-1])], placement=wire.Placement) - else: - makeWire([wire.Placement.multVec(wire.Points[edgeIndex-1]), - wire.Placement.multVec(wire.Points[edgeIndex])], placement=wire.Placement) - wire.Points = list(reversed(wire.Points[0:edgeIndex])) + list(reversed(wire.Points[edgeIndex:])) - -def splitOpenWire(wire, newPoint, edgeIndex): - wire1Points = [] - wire2Points = [] - for index, point in enumerate(wire.Points): - if index == edgeIndex: - wire1Points.append(wire.Placement.inverse().multVec(newPoint)) - wire2Points.append(newPoint) - wire2Points.append(wire.Placement.multVec(point)) - elif index < edgeIndex: - wire1Points.append(point) - elif index > edgeIndex: - wire2Points.append(wire.Placement.multVec(point)) - wire.Points = wire1Points - makeWire(wire2Points, placement=wire.Placement) - def fuse(object1,object2): """fuse(oject1,object2): returns an object made from the union of the 2 given objects. If the objects are diff --git a/src/Mod/Draft/draftfunctions/split.py b/src/Mod/Draft/draftfunctions/split.py new file mode 100644 index 0000000000..16f55c79e4 --- /dev/null +++ b/src/Mod/Draft/draftfunctions/split.py @@ -0,0 +1,73 @@ +# *************************************************************************** +# * 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 split functions. +""" +## @package split +# \ingroup DRAFT +# \brief This module provides the code for Draft split functions. + +import draftutils.utils as utils + +from draftmake.make_wire import make_wire + + +def split(wire, newPoint, edgeIndex): + if utils.get_type(wire) != "Wire": + return + elif wire.Closed: + split_closed_wire(wire, edgeIndex) + else: + split_open_wire(wire, newPoint, edgeIndex) + + +def split_closed_wire(wire, edgeIndex): + wire.Closed = False + if edgeIndex == len(wire.Points): + make_wire([wire.Placement.multVec(wire.Points[0]), + wire.Placement.multVec(wire.Points[-1])], placement=wire.Placement) + else: + make_wire([wire.Placement.multVec(wire.Points[edgeIndex-1]), + wire.Placement.multVec(wire.Points[edgeIndex])], placement=wire.Placement) + wire.Points = list(reversed(wire.Points[0:edgeIndex])) + list(reversed(wire.Points[edgeIndex:])) + + +splitClosedWire = split_closed_wire + + +def split_open_wire(wire, newPoint, edgeIndex): + wire1Points = [] + wire2Points = [] + for index, point in enumerate(wire.Points): + if index == edgeIndex: + wire1Points.append(wire.Placement.inverse().multVec(newPoint)) + wire2Points.append(newPoint) + wire2Points.append(wire.Placement.multVec(point)) + elif index < edgeIndex: + wire1Points.append(point) + elif index > edgeIndex: + wire2Points.append(wire.Placement.multVec(point)) + wire.Points = wire1Points + make_wire(wire2Points, placement=wire.Placement) + + +splitOpenWire = split_open_wire \ No newline at end of file