Exemplo n.º 1
0
class BuildingUI(QtWidgets.QDialog):
    levels = 6
    width = 10
    depth = 5

    def __init__(self):
        super().__init__()
        self.buildingLib = Building()

        self.buildUI()

    def buildUI(self):
        layout = QtWidgets.QVBoxLayout(self)

        buildWidget = QtWidgets.QWidget()
        buildLayout = QtWidgets.QHBoxLayout(buildWidget)
        layout.addWidget(buildWidget)

        self.buildNameField = QtWidgets.QLineEdit()
        self.buildNameField.setText('house')
        buildLayout.addWidget(self.buildNameField)

        buildBtn = QtWidgets.QPushButton('1. Create')
        buildBtn.clicked.connect(self.create)
        buildLayout.addWidget(buildBtn)

        mergeBtn = QtWidgets.QPushButton('2. Merge')
        mergeBtn.clicked.connect(self.merge)
        buildLayout.addWidget(mergeBtn)

        levelWidget = QtWidgets.QWidget()
        levelLayout = QtWidgets.QHBoxLayout(levelWidget)
        layout.addWidget(levelWidget)

        lblLevel = QtWidgets.QLabel('Levels')
        lblLevel.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        levelLayout.addWidget(lblLevel)

        self.slLevel = QtWidgets.QSlider(QtCore.Qt.Horizontal)
        self.slLevel.setMinimum(1)
        self.slLevel.setMaximum(30)
        self.slLevel.setValue(self.levels)
        self.slLevel.setTickPosition(QtWidgets.QSlider.TicksBelow)
        self.slLevel.setTickInterval(5)
        self.slLevel.valueChanged.connect(self.levelChanged)
        levelLayout.addWidget(self.slLevel)

        self.txtLevel = QtWidgets.QLabel(str(self.levels))
        lblLevel.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        levelLayout.addWidget(self.txtLevel)

        widthWidget = QtWidgets.QWidget()
        widthLayout = QtWidgets.QHBoxLayout(widthWidget)
        layout.addWidget(widthWidget)

        lblWidth = QtWidgets.QLabel('Width')
        lblWidth.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        widthLayout.addWidget(lblWidth)

        self.slWidth = QtWidgets.QSlider(QtCore.Qt.Horizontal)
        self.slWidth.setMinimum(1)
        self.slWidth.setMaximum(30)
        self.slWidth.setValue(self.width)
        self.slWidth.setTickPosition(QtWidgets.QSlider.TicksBelow)
        self.slWidth.setTickInterval(5)
        self.slWidth.valueChanged.connect(self.widthChanged)
        widthLayout.addWidget(self.slWidth)

        self.txtWidth = QtWidgets.QLabel(str(self.width))
        self.txtWidth.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        widthLayout.addWidget(self.txtWidth)

        depthWidget = QtWidgets.QWidget()
        depthLayout = QtWidgets.QHBoxLayout(depthWidget)
        layout.addWidget(depthWidget)

        lblDepth = QtWidgets.QLabel('Depth')
        lblDepth.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        depthLayout.addWidget(lblDepth)

        self.slDepth = QtWidgets.QSlider(QtCore.Qt.Horizontal)
        self.slDepth.setMinimum(1)
        self.slDepth.setMaximum(30)
        self.slDepth.setValue(self.depth)
        self.slDepth.setTickPosition(QtWidgets.QSlider.TicksBelow)
        self.slDepth.setTickInterval(5)
        self.slDepth.valueChanged.connect(self.depthChanged)
        depthLayout.addWidget(self.slDepth)

        self.txtDepth = QtWidgets.QLabel(str(self.depth))
        self.txtDepth.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        depthLayout.addWidget(self.txtDepth)

        # colorWinFrameWidget = QtWidgets.QWidget()
        # colorWinFrameLayout = QtWidgets.QHBoxLayout(colorWinFrameWidget)
        # layout.addWidget(colorWinFrameWidget)

        # lblWinFrame = QtWidgets.QLabel('Window Frame Color')
        # lblWinFrame.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        # colorWinFrameLayout.addWidget(lblWinFrame)

        # self.colorWinFrameBtn = QtWidgets.QPushButton(self)
        # self.colorWinFrameBtn.clicked.connect(lambda x: self.openColorDialog('matWindowFrame', btn=self.colorWinFrameBtn))
        # colorWF = [c * 255 for c in self.buildingLib._defaultColors['matWindowFrame']]
        # self.colorWinFrameBtn.setStyleSheet(f"background-color: rgba({colorWF[0]},{colorWF[1]},{colorWF[2]}, {colorWF[3]})")
        # colorWinFrameLayout.addWidget(self.colorWinFrameBtn)

        self.colorBtns = {}
        self.addColorBtn('matWindowFrame', 'Window Frame Color',
                         self.colorBtns, layout)
        self.addColorBtn('matWindowPane', 'Window Pane Color', self.colorBtns,
                         layout)
        self.addColorBtn('matDoorFrame', 'Door Frame Color', self.colorBtns,
                         layout)
        self.addColorBtn('matDoor', 'Door Color', self.colorBtns, layout)
        self.addColorBtn('matWall', 'Wall Color', self.colorBtns, layout)
        self.addColorBtn('matRoof', 'Roof Color', self.colorBtns, layout)

    def create(self):
        self.buildingLib.CreateStackedLevels(nLevels=self.levels,
                                             width=self.width,
                                             depth=self.depth,
                                             name=self.buildNameField.text())

    def merge(self):
        self.buildingLib.CombineAndMerge(
            f"{self.buildNameField.text()}_merged")

    def levelChanged(self, level):
        self.levels = level
        self.txtLevel.setText(str(level))

    def widthChanged(self, value):
        self.width = value
        self.txtWidth.setText(str(value))

    def depthChanged(self, value):
        self.depth = value
        self.txtDepth.setText(str(value))

    def openColorDialog(self,
                        materialName,
                        btn,
                        defaultColor=[1.0, 1.0, 1.0, 1.0]):
        initial = self.buildingLib._defaultColors[materialName] or defaultColor
        initialColor = QtGui.QColor(initial[0] * 255.0, initial[1] * 255.0,
                                    initial[2] * 255.0, initial[3] * 255.0)

        # print(initial[0]*255.0,initial[1]*255.0,initial[2]*255.0,initial[3]*255.0)
        # print(initial,initialColor.getRgb())

        color = QtWidgets.QColorDialog.getColor(
            initial=initialColor,
            options=QtWidgets.QColorDialog.ShowAlphaChannel)

        if color.isValid():
            self.buildingLib.SetMaterialColor(materialName,
                                              color.red() / 255.0,
                                              color.green() / 255.0,
                                              color.blue() / 255.0,
                                              alpha=color.alpha() / 255.0)
            btn.setStyleSheet(
                f"background-color: rgba({color.red()},{color.green()},{color.blue()}, {color.alpha()})"
            )

    def addColorBtn(self, id, title, btns, parentLayout):

        colorWidget = QtWidgets.QWidget()
        colorLayout = QtWidgets.QHBoxLayout(colorWidget)
        parentLayout.addWidget(colorWidget)

        label = QtWidgets.QLabel(title)
        label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        colorLayout.addWidget(label)

        btns[id] = QtWidgets.QPushButton(self)
        btns[id].clicked.connect(
            lambda x: self.openColorDialog(id, btn=btns[id]))
        colorWF = [c * 255 for c in self.buildingLib._defaultColors[id]]
        btns[id].setStyleSheet(
            f"background-color: rgba({colorWF[0]},{colorWF[1]},{colorWF[2]}, {colorWF[3]})"
        )
        colorLayout.addWidget(btns[id])