~freecad-community/freecad-extras/lattice2

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
143
144
145
146
147
#***************************************************************************
#*                                                                         *
#*   Copyright (c) 2015 - Victor Titov (DeepSOIC)                          *
#*                                               <vv.titov@gmail.com>      *  
#*                                                                         *
#*   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                                                                   *
#*                                                                         *
#***************************************************************************

import FreeCAD, Part
from lattice2Executer import CancelError
if FreeCAD.GuiUp:
    import FreeCADGui
    from PySide import QtCore, QtGui

def translate(context, text, disambig):
    #Lattice2 is not translatable, sorry...
    return text


def getParamRefine():
    return FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Part/Boolean").GetBool("RefineModel")
def getParamPDRefine():
    return FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/PartDesign").GetBool("RefineModel")

def getIconPath(icon_dot_svg):
    return ":/icons/" + icon_dot_svg

class SelectionError(FreeCAD.Base.FreeCADError):
    '''Error that isused inside Gui command code'''
    def __init__(self, title, message):
        self.message = message
        self.args = (message,)
        self.title = title

def msgError(err = None, message = u'{errmsg}'):
    import sys
    if err is None:
        err = sys.exc_info()[1]
    if type(err) is CancelError: return # doesn't work! Why!
    if hasattr(err, "isCancelError") and err.isCancelError: return   #workaround

    # can we get a traceback?
    b_tb =  err is sys.exc_info()[1]
    if b_tb:
        import traceback
        tb = traceback.format_exc()
        import FreeCAD as App
        App.Console.PrintError(tb+'\n')
    
    #make messagebox object
    from PySide import QtGui
    mb = QtGui.QMessageBox()
    mb.setIcon(mb.Icon.Warning)
    
    #fill in message
    errmsg = ''
    if hasattr(err,'message'):
        if isinstance(err.message, dict):
            errmsg = err.message['swhat']
        elif len(err.message) > 0:
            errmsg = err.message
        else: 
            errmsg = str(err)
    else:
        errmsg = str(err)
    mb.setText(message.format(errmsg= errmsg, err= err))
    
    # fill in title
    if hasattr(err, "title"):
        mb.setWindowTitle(err.title)
    else:
        mb.setWindowTitle("Error")
        
    #add traceback button
    if b_tb:
        btnClose = mb.addButton(QtGui.QMessageBox.StandardButton.Close)
        btnCopy = mb.addButton("Copy traceback", QtGui.QMessageBox.ButtonRole.ActionRole)
        mb.setDefaultButton(btnClose)
        
    mb.exec_()
    if b_tb:
        if mb.clickedButton() is btnCopy:
            cb = QtGui.QClipboard()
            cb.setText(tb)
        

def infoMessage(title, message):
    mb = QtGui.QMessageBox()
    mb.setIcon(mb.Icon.Information)
    mb.setText(message)
    mb.setWindowTitle(title)
    mb.exec_()

def deselect(sel):
    '''deselect(sel): remove objects in sel from selection'''
    for selobj in sel:
        FreeCADGui.Selection.removeSelection(selobj.Object)
        
# OCC's Precision::Confusion; should have taken this from FreeCAD but haven't found; unlikely to ever change.
DistConfusion = 1e-7
ParaConfusion = 1e-8

if FreeCAD.GuiUp:
    import lattice2_rc

def screen(feature):
    """screen(feature): protects link properties from being overwritten. 
    This is to be used as workaround for a bug where modifying an object accessed through 
    a link property of another object results in the latter being touched.
    
    returns: feature"""
    if not hasattr(feature,"isDerivedFrom"):
        return feature
    if not feature.isDerivedFrom("App::DocumentObject"):
        return feature
    if feature.Document is None:
        return feature
    feature = getattr(feature.Document, feature.Name)
    return feature

def activeBody():
    if FreeCAD.ActiveDocument is None: return None
    if not hasattr(FreeCADGui.ActiveDocument.ActiveView, 'getActiveObject'): #prevent errors in 0.16
        return None
    return FreeCADGui.ActiveDocument.ActiveView.getActiveObject("pdbody")
    
def bodyOf(feature):
    body = feature.getParentGeoFeatureGroup()
    if body.isDerivedFrom('PartDesign::Body'):
        return body
    else:
        return None