File size: 5,491 Bytes
985c397
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# SPDX-License-Identifier: LGPL-2.1-or-later

# ***************************************************************************
# *   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                                                                   *
# *                                                                         *
# ***************************************************************************
"""Provides functions to create Clone objects."""
## @package make_clone
# \ingroup draftmake
# \brief Provides functions to create Clone objects.

## \addtogroup draftmake
# @{
import FreeCAD as App
from draftobjects.clone import Clone
from draftutils import params
from draftutils import utils
from draftutils import gui_utils

if App.GuiUp:
    from draftviewproviders.view_clone import ViewProviderClone


def make_clone(obj, delta=None, forcedraft=False):
    """clone(obj,[delta,forcedraft])

    Makes a clone of the given object(s).
    The clone is an exact, linked copy of the given object. If the original
    object changes, the final object changes too.

    Parameters
    ----------
    obj :

    delta : Base.Vector
        Delta Vector to move the clone from the original position.

    forcedraft : bool
        If forcedraft is True, the resulting object is a Draft clone
        even if the input object is an Arch object.

    """

    prefix = params.get_param("ClonePrefix")

    cl = None

    if prefix:
        prefix = prefix.strip() + " "

    if not isinstance(obj, list):
        obj = [obj]

    if (
        len(obj) == 1
        and obj[0].isDerivedFrom("Part::Part2DObject")
        and utils.get_type(obj[0]) not in ["BezCurve", "BSpline", "Wire"]
    ):
        # "BezCurve", "BSpline" and "Wire" objects created with < v1.1
        # are "Part::Part2DObject" objects but they need not be 2D.
        cl = App.ActiveDocument.addObject("Part::Part2DObjectPython", "Clone2D")
        cl.Label = prefix + obj[0].Label + " (2D)"
    elif (
        len(obj) == 1
        and (hasattr(obj[0], "CloneOf") or utils.get_type(obj[0]) == "BuildingPart")
        and not forcedraft
    ):
        # arch objects can be clones
        try:
            import Arch
        except:
            # BIM not present
            pass
        else:
            if utils.get_type(obj[0]) == "BuildingPart":
                cl = Arch.makeComponent()
            else:
                try:  # new-style make function
                    cl = getattr(Arch, "make_" + obj[0].Proxy.Type.lower())()
                except Exception:
                    try:  # old-style make function
                        cl = getattr(Arch, "make" + obj[0].Proxy.Type)()
                    except Exception:
                        pass  # not a standard Arch object... Fall back to Draft mode
            if cl:
                base = utils.get_clone_base(obj[0])
                cl.Label = prefix + base.Label
                cl.CloneOf = base
                if utils.get_type(obj[0]) != "BuildingPart":
                    cl.Placement = obj[0].Placement
                for prop in ("Description", "IfcType", "Material", "Subvolume", "Tag"):
                    try:
                        setattr(cl, prop, getattr(base, prop))
                    except Exception:
                        pass
                if App.GuiUp:
                    gui_utils.format_object(cl, base)
                    gui_utils.select(cl)
                return cl

    # fall back to Draft clone mode
    if not cl:
        cl = App.ActiveDocument.addObject("Part::FeaturePython", "Clone")
        cl.addExtension("Part::AttachExtensionPython")
        cl.Label = prefix + obj[0].Label
    Clone(cl)
    cl.Objects = obj
    if delta:
        cl.Placement.move(delta)
    elif (len(obj) == 1) and hasattr(obj[0], "Placement"):
        cl.Placement = obj[0].Placement
    if hasattr(cl, "LongName") and hasattr(obj[0], "LongName"):
        cl.LongName = obj[0].LongName
    if App.GuiUp:
        ViewProviderClone(cl.ViewObject)
        gui_utils.format_object(cl, obj[0])
        gui_utils.select(cl)
    return cl


clone = make_clone

## @}