Пример #1
0
 def __init__(self):
 	"""
     Plots Morh's Circles for given datapoints
 	"""
     QtGui.QWidget.__init__(self)
     self.s1 = []
     self.s3 = []
     self.nData = 0
     self.nEnvelopes = 0
     self.dCButtons = {}
     self.eCButtons = {}
     self.eBoxes = {}
     self.dNames = [] # names of Datasets
     self.eNames = [] # envelope names
     self.eTypes = {} # envelope types
     self.fBoxes = {} # boxes with friction angle values
     self.cBoxes = {} # boxes with cohesion values
     self.eItemNames = [] # item names inside envelope menus
     self.setupGUI()
     self.edit = EditEnvelopeWidget()
     self.addEnvelopeButton.clicked.connect(self.callEditWidget)
     self.edit.okButton.clicked.connect(self.callAddEnvelope)
Пример #2
0
 def __init__(self):
     """
     Plots Morh's Circles for given datapoints
 	"""
     QtGui.QWidget.__init__(self)
     self.s1 = []
     self.s3 = []
     self.nData = 0
     self.nEnvelopes = 0
     self.dCButtons = {}
     self.eCButtons = {}
     self.eBoxes = {}
     self.dNames = []  # names of Datasets
     self.eNames = []  # envelope names
     self.eTypes = {}  # envelope types
     self.fBoxes = {}  # boxes with friction angle values
     self.cBoxes = {}  # boxes with cohesion values
     self.eItemNames = []  # item names inside envelope menus
     self.setupGUI()
     self.edit = EditEnvelopeWidget()
     self.addEnvelopeButton.clicked.connect(self.callEditWidget)
     self.edit.okButton.clicked.connect(self.callAddEnvelope)
Пример #3
0
class MohrCircles(QtGui.QWidget):
    def __init__(self):
        """
        Plots Morh's Circles for given datapoints
    	"""
        QtGui.QWidget.__init__(self)
        self.s1 = []
        self.s3 = []
        self.nData = 0
        self.nEnvelopes = 0
        self.dCButtons = {}
        self.eCButtons = {}
        self.eBoxes = {}
        self.dNames = []  # names of Datasets
        self.eNames = []  # envelope names
        self.eTypes = {}  # envelope types
        self.fBoxes = {}  # boxes with friction angle values
        self.cBoxes = {}  # boxes with cohesion values
        self.eItemNames = []  # item names inside envelope menus
        self.setupGUI()
        self.edit = EditEnvelopeWidget()
        self.addEnvelopeButton.clicked.connect(self.callEditWidget)
        self.edit.okButton.clicked.connect(self.callAddEnvelope)

    def callEditWidget(self):
        name = "Env_%d" % (self.nEnvelopes)
        self.edit.setDefaultName(name)
        self.edit.show()
        self.edit.activateWindow()

    def callAddEnvelope(self):
        name = self.edit.nameBox.text()
        self.addEnvelope(etype=self.edit.value(), name=name)
        self.edit.hide()

    def setupGUI(self):
        pg.setConfigOption("background", (255, 255, 255))
        pg.setConfigOption("foreground", (0, 0, 0))
        self.setWindowIcon(QtGui.QIcon("../images/Logo.png"))
        self.setGeometry(80, 30, 1000, 700)
        # layout is the main layout widget
        self.layout = QtGui.QVBoxLayout()
        # sublayout is a widget we add plot window to
        self.sublayout = pg.GraphicsLayoutWidget()
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setSpacing(0)
        self.setLayout(self.layout)
        # split window into two halfs
        self.splitter = QtGui.QSplitter()
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.layout.addWidget(self.splitter)

        self.tree = pg.TreeWidget()
        self.splitter.addWidget(self.tree)
        self.splitter.addWidget(self.sublayout)
        self.plt = self.sublayout.addPlot()
        setup_plot(self.plt)
        pg.setConfigOptions(antialias=True)

        self.tree.setHeaderHidden(True)
        self.tree.setDragEnabled(False)
        self.tree.setIndentation(10)
        self.tree.setColumnCount(4)
        self.tree.setColumnWidth(0, 150)
        self.tree.setColumnWidth(1, 20)
        self.tree.setColumnWidth(2, 90)
        self.tree.setColumnWidth(3, 50)
        # self.tree.setColumnWidth(3, 50)
        self.fpoints = pg.TreeWidgetItem(["Failure Points"])
        self.envelopes = pg.TreeWidgetItem(["Failure Envelopes"])
        self.tree.addTopLevelItem(self.fpoints)
        self.tree.addTopLevelItem(self.envelopes)
        self.tree.setDragEnabled(False)
        self.fpoints.setExpanded(True)
        self.envelopes.setExpanded(True)
        addEnvelopeItem = pg.TreeWidgetItem([""])
        self.tree.addTopLevelItem(addEnvelopeItem)
        self.addEnvelopeButton = QtGui.QPushButton("Add Envelope")
        addEnvelopeItem.setWidget(0, self.addEnvelopeButton)

    def addData(self, s1, s3, name=None):
        if name is None:
            name = "Untitled_%d" % (self.nData)
        self.s1.append(s1)
        self.s3.append(s3)
        item = pg.TreeWidgetItem([name])
        self.dNames.append(name)
        self.fpoints.addChild(item)
        # self.tree.addTopLevelItem(item)
        color = (0, 0, 0)
        colorButton = ColorButton()
        item.setWidget(2, colorButton)
        self.dCButtons[name] = colorButton
        colorButton.setColor(color)
        colorButton.sigColorChanged.connect(self.plot)
        self.nData += 1

    def start(self):
        """
        all the data is loaded 
        and it's time to work
        """
        self.generateCircles()
        self.addEnvelope()

    def addEnvelope(self, etype="Coulomb", name="Env"):
        item = pg.TreeWidgetItem([name])
        self.envelopes.addChild(item)
        self.eNames.append(name)
        self.eTypes[name] = etype
        typeLabel = QtGui.QLabel(etype)
        item.setWidget(2, typeLabel)
        colorButton = ColorButton()
        self.eCButtons[name] = colorButton
        color = get_color()
        colorButton.setColor(color)
        item.setExpanded(True)
        self.eBoxes[name] = {}
        colorItem = pg.TreeWidgetItem(["Color"])
        if etype == "Coulomb":
            item1 = pg.TreeWidgetItem(["Friction Angle"])
            item2 = pg.TreeWidgetItem(["Cohesion"])
            step1 = 1
            step2 = 50
        elif etype == "Brown":
            item1 = pg.TreeWidgetItem(["m"])
            item2 = pg.TreeWidgetItem(["UCS"])
            step1 = 1
            step2 = 1
        else:
            print etype
            return 0
        item.addChild(colorItem)
        item.addChild(item1)
        item.addChild(item2)
        frictionBox = pg.SpinBox(value=50, step=step1)
        cohesionBox = pg.SpinBox(value=1e3, step=step2)
        frictionBox.sigValueChanged.connect(self.plot)
        cohesionBox.sigValueChanged.connect(self.plot)
        colorItem.setWidget(2, colorButton)
        item1.setWidget(2, frictionBox)
        item2.setWidget(2, cohesionBox)
        self.fBoxes[name] = frictionBox
        self.cBoxes[name] = cohesionBox
        for dname in self.dNames:
            child = pg.TreeWidgetItem([dname])
            item.addChild(child)
            box = CheckBox()
            child.setWidget(2, box)
            self.eBoxes[name][dname] = box
            box.click()
            box.clicked.connect(lambda: self.getEnvelope(name))
        removeEnvelopeItem = pg.TreeWidgetItem([""])
        item.addChild(removeEnvelopeItem)
        removeButton = QtGui.QPushButton("Remove")
        removeEnvelopeItem.setWidget(2, removeButton)
        removeButton.clicked.connect(lambda: self.removeEnvelope(item))
        colorButton.sigColorChanged.connect(self.plot)
        self.nEnvelopes += 1
        self.getEnvelope(eName=name)

    def removeEnvelope(self, envelope):
        """
        removes Current Envelopes
        """
        name = envelope.text(0)
        index = self.envelopes.indexOfChild(envelope)
        self.envelopes.takeChild(index)
        del self.eBoxes[name], self.eCButtons[name]
        del self.cBoxes[name], self.fBoxes[name]
        self.eNames.pop(index)
        self.plot()

    def getEnvelope(self, eName=None):
        if eName == None:
            eName = self.eNames[0]
        etype = self.eTypes[eName]
        s1 = []
        s3 = []
        for dName in self.dNames:
            val = self.eBoxes[eName][dName].value()
            if val:
                index = self.dNames.index(dName)
                s1.append(self.s1[index])
                s3.append(self.s3[index])
        if len(s1) == 1:
            s1.append(500)
            s3.append(0)
        if (s1 != []) and (s3 != []):
            par1, par2 = self.computeEnvelope(s1, s3, etype)
            self.fBoxes[eName].setValue(par1)
            self.cBoxes[eName].setValue(par2)

    def computeEnvelope(self, s1, s3, etype="Coulomb"):
        s1 = np.array(s1)
        s3 = np.array(s3)
        if etype == "Coulomb":
            popt, pcov = curve_fit(morh_coulomb, s3, s1, maxfev=int(1e5))
            a = popt[0]
            b = popt[1]
            phi = np.arcsin((a - 1.0) / (a + 1.0))
            cohesion = b / (2 * np.cos(phi)) * (1 - np.sin(phi))
            angle = np.degrees(phi)
            return angle, cohesion
        elif etype == "Brown":
            popt, pcov = curve_fit(hoek_brown, s3, s1, maxfev=int(1e5))
            return popt[0], popt[1]

    def generateCircles(self, npoints=1e4):
        self.s1 = np.array(self.s1)
        self.s3 = np.array(self.s3)
        self.centers = (self.s1 + self.s3) / 2
        self.radii = abs(self.s1 - self.s3) / 2
        # x and y of Mohr's circles
        self.x = {}
        self.y = {}
        self.env_x = {}
        for i in range(len(self.dNames)):
            R = self.radii[i]
            C = self.centers[i]
            x = np.linspace(self.s3[i], self.s1[i], npoints)
            self.x[self.dNames[i]] = x
            self.y[self.dNames[i]] = (R ** 2 - (x - C) ** 2) ** 0.5
        minstess = min(np.minimum(self.s1, self.s3))
        maxstess = max(np.maximum(self.s1, self.s3))
        self.env_x = np.linspace(min(0, minstess), maxstess, npoints)

    def plot(self):
        self.plt.clear()
        self.plt.showGrid(x=True, y=True)
        self.plt.setYRange(0, max(self.s1))
        self.plt.setXRange(self.env_x.min(), self.env_x.max())
        for dName in self.dNames:
            color = self.dCButtons[dName].color()
            pen = pg.mkPen(color=color, width=2)
            self.plt.plot(self.x[dName], self.y[dName], pen=pen)
        for eName in self.eNames:
            color = self.eCButtons[eName].color()
            pen = pg.mkPen(color=color, width=2)
            a = self.fBoxes[eName].value()
            b = self.cBoxes[eName].value()
            x = self.env_x
            if self.eTypes[eName] == "Coulomb":
                tan_phi = np.tan(np.radians(a))
                y = tan_phi * x + b
            elif self.eTypes[eName] == "Brown":
                x, y = hoek_on_mohr_plane(x, a, b)

            self.plt.plot(x, y, pen=pen)
Пример #4
0
class MohrCircles(QtGui.QWidget):
    def __init__(self):
    	"""
        Plots Morh's Circles for given datapoints
    	"""
        QtGui.QWidget.__init__(self)
        self.s1 = []
        self.s3 = []
        self.nData = 0
        self.nEnvelopes = 0
        self.dCButtons = {}
        self.eCButtons = {}
        self.eBoxes = {}
        self.dNames = [] # names of Datasets
        self.eNames = [] # envelope names
        self.eTypes = {} # envelope types
        self.fBoxes = {} # boxes with friction angle values
        self.cBoxes = {} # boxes with cohesion values
        self.eItemNames = [] # item names inside envelope menus
        self.setupGUI()
        self.edit = EditEnvelopeWidget()
        self.addEnvelopeButton.clicked.connect(self.callEditWidget)
        self.edit.okButton.clicked.connect(self.callAddEnvelope)

    def callEditWidget(self):
        name = 'Env_%d'%(self.nEnvelopes)
        self.edit.setDefaultName(name)
        self.edit.show()
        self.edit.activateWindow()
    def callAddEnvelope(self):
        name = self.edit.nameBox.text()
        self.addEnvelope(etype=self.edit.value(),name=name)
        self.edit.hide()
    def setupGUI(self):
        pg.setConfigOption('background', (255,255,255))
        pg.setConfigOption('foreground',(0,0,0))
        self.setWindowIcon(QtGui.QIcon('../images/Logo.png')) 
        self.setGeometry(80, 30, 1000, 700)
        # layout is the main layout widget
        self.layout = QtGui.QVBoxLayout()
        # sublayout is a widget we add plot window to
        self.sublayout = pg.GraphicsLayoutWidget()
        self.layout.setContentsMargins(0,0,0,0)
        self.layout.setSpacing(0)
        self.setLayout(self.layout)
        # split window into two halfs
        self.splitter = QtGui.QSplitter()
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.layout.addWidget(self.splitter)

        self.tree = pg.TreeWidget()
        self.splitter.addWidget(self.tree)
        self.splitter.addWidget(self.sublayout)
        self.plt = self.sublayout.addPlot()
        setup_plot(self.plt)
        pg.setConfigOptions(antialias=True)

        self.tree.setHeaderHidden(True)
        self.tree.setDragEnabled(False)
        self.tree.setIndentation(10)
        self.tree.setColumnCount(4)
        self.tree.setColumnWidth(0, 150)
        self.tree.setColumnWidth(1, 20)
        self.tree.setColumnWidth(2, 90)
        self.tree.setColumnWidth(3, 50)
        # self.tree.setColumnWidth(3, 50)
        self.fpoints = pg.TreeWidgetItem(['Failure Points'])
        self.envelopes = pg.TreeWidgetItem(['Failure Envelopes'])
        self.tree.addTopLevelItem(self.fpoints)
        self.tree.addTopLevelItem(self.envelopes)
        self.tree.setDragEnabled(False)
        self.fpoints.setExpanded(True)
        self.envelopes.setExpanded(True)
        addEnvelopeItem = pg.TreeWidgetItem([''])
        self.tree.addTopLevelItem(addEnvelopeItem)
        self.addEnvelopeButton = QtGui.QPushButton('Add Envelope')
        addEnvelopeItem.setWidget(0,self.addEnvelopeButton)
        

    def addData(self,s1,s3,name=None):
        if name is None:
            name = 'Untitled_%d'%(self.nData)
        self.s1.append(s1)
        self.s3.append(s3)
        item = pg.TreeWidgetItem([name])
        self.dNames.append(name)
        self.fpoints.addChild(item)
        # self.tree.addTopLevelItem(item)
        color = (0,0,0)
        colorButton = ColorButton()
        item.setWidget(2,colorButton)
        self.dCButtons[name] = colorButton
        colorButton.setColor(color)
        colorButton.sigColorChanged.connect(self.plot)
        self.nData += 1
    def start(self):
        '''
        all the data is loaded 
        and it's time to work
        '''
        self.generateCircles()
        self.addEnvelope()
    def addEnvelope(self,etype='Coulomb',name='Env'):
        item = pg.TreeWidgetItem([name])
        self.envelopes.addChild(item)
        self.eNames.append(name)
        self.eTypes[name] = etype
        typeLabel = QtGui.QLabel(etype)
        item.setWidget(2,typeLabel)
        colorButton = ColorButton()
        self.eCButtons[name] = colorButton
        color = get_color()
        colorButton.setColor(color)
        item.setExpanded(True)
        self.eBoxes[name] = {}
        colorItem = pg.TreeWidgetItem(['Color'])
        if etype == 'Coulomb':
            item1 = pg.TreeWidgetItem(['Friction Angle'])
            item2 = pg.TreeWidgetItem(['Cohesion'])
            step1 = 1
            step2 = 50
        elif etype == 'Brown':
            item1 = pg.TreeWidgetItem(['m'])
            item2 = pg.TreeWidgetItem(['UCS'])
            step1 = 1
            step2 = 1
        else:
            print etype
            return 0
        item.addChild(colorItem)
        item.addChild(item1)
        item.addChild(item2)
        frictionBox = pg.SpinBox(value=50, step=step1)
        cohesionBox = pg.SpinBox(value=1e3, step=step2)
        frictionBox.sigValueChanged.connect(self.plot)
        cohesionBox.sigValueChanged.connect(self.plot)
        colorItem.setWidget(2,colorButton)
        item1.setWidget(2,frictionBox)
        item2.setWidget(2,cohesionBox)
        self.fBoxes[name] = frictionBox
        self.cBoxes[name] = cohesionBox
        for dname in self.dNames:
            child = pg.TreeWidgetItem([dname])
            item.addChild(child)
            box = CheckBox()
            child.setWidget(2,box)
            self.eBoxes[name][dname] = box
            box.click()
            box.clicked.connect(lambda:self.getEnvelope(name))
        removeEnvelopeItem = pg.TreeWidgetItem([''])
        item.addChild(removeEnvelopeItem)
        removeButton = QtGui.QPushButton('Remove')
        removeEnvelopeItem.setWidget(2,removeButton)
        removeButton.clicked.connect(lambda:self.removeEnvelope(item))
        colorButton.sigColorChanged.connect(self.plot)
        self.nEnvelopes += 1
        self.getEnvelope(eName=name)
    def removeEnvelope(self,envelope):
        '''
        removes Current Envelopes
        '''
        name = envelope.text(0)
        index = self.envelopes.indexOfChild(envelope)
        self.envelopes.takeChild(index)
        del self.eBoxes[name],self.eCButtons[name]
        del self.cBoxes[name],self.fBoxes[name]
        self.eNames.pop(index)
        self.plot()
    def getEnvelope(self,eName=None):
        if eName == None: eName = self.eNames[0]
        etype = self.eTypes[eName]
        s1 = []
        s3 = []
        for dName in self.dNames:
            val = self.eBoxes[eName][dName].value()
            if val:
                index = self.dNames.index(dName)
                s1.append(self.s1[index])
                s3.append(self.s3[index])
        if len(s1)==1:
            s1.append(500)
            s3.append(0)
        if (s1!=[]) and (s3!=[]):
            par1,par2 = self.computeEnvelope(s1,s3,etype)
            self.fBoxes[eName].setValue(par1)
            self.cBoxes[eName].setValue(par2)
    def computeEnvelope(self,s1,s3,etype='Coulomb'):
        s1 = np.array(s1)
        s3 = np.array(s3)
        if etype == 'Coulomb':
            popt, pcov = curve_fit(morh_coulomb,
             s3, s1,maxfev=int(1e5))
            a = popt[0]; b = popt[1]
            phi = np.arcsin((a-1.)/(a+1.))        
            cohesion = b/(2*np.cos(phi))*(1-np.sin(phi))
            angle = np.degrees(phi)
            return angle,cohesion
        elif etype == 'Brown':
            popt, pcov = curve_fit(hoek_brown,
             s3, s1,maxfev=int(1e5))
            return popt[0],popt[1]
        

    def generateCircles(self,npoints=1e4):
        self.s1 = np.array(self.s1)
        self.s3 = np.array(self.s3)
        self.centers = (self.s1 + self.s3)/2
        self.radii = abs(self.s1 - self.s3)/2
        # x and y of Mohr's circles
        self.x = {}
        self.y = {}
        self.env_x = {}
        for i in range(len(self.dNames)):
            R = self.radii[i]
            C = self.centers[i]
            x = np.linspace(self.s3[i],self.s1[i],npoints)
            self.x[self.dNames[i]] = x
            self.y[self.dNames[i]] = (R**2-(x-C)**2)**0.5
        minstess = min(np.minimum(self.s1,self.s3))
        maxstess = max(np.maximum(self.s1,self.s3))
        self.env_x = np.linspace(min(0,minstess),maxstess,npoints)

    def plot(self):
        self.plt.clear()
        self.plt.showGrid(x=True, y=True)
        self.plt.setYRange(0,max(self.s1))
        self.plt.setXRange(self.env_x.min(),self.env_x.max())
        for dName in self.dNames:
            color = self.dCButtons[dName].color()
            pen = pg.mkPen(color=color, width=2)
            self.plt.plot(self.x[dName],self.y[dName],pen=pen)
        for eName in self.eNames:
            color = self.eCButtons[eName].color()
            pen = pg.mkPen(color=color, width=2)
            a = self.fBoxes[eName].value()
            b = self.cBoxes[eName].value()
            x = self.env_x
            if self.eTypes[eName]=='Coulomb':
                tan_phi = np.tan(np.radians(a))
                y = tan_phi*x + b
            elif self.eTypes[eName]=='Brown':
                x,y = hoek_on_mohr_plane(x,a,b)

            self.plt.plot(x,y,pen=pen)