示例#1
0
    def instantiateLED(self):
        self.matrixLEDserie.clear()
        count = 0
        for i in range(self.cubeSize.getSize(Axis.X)):
            self.matrixLEDserie.append([])
            for j in range(self.cubeSize.getSize(Axis.Y)):
                self.matrixLEDserie[i].append([])
                for k in range(self.cubeSize.getSize(Axis.Z)):

                    item = QScatterDataItem(
                        QVector3D(i + 1, k + 1, j + 1)
                    )  # z-axis and y-axis reversed to match representations, purely graphic

                    self.matrixLEDserie[i][j].append(
                        QScatter3DSeries(QScatterDataProxy()))

                    #self.matrixLEDserie[i][j][k].setItemLabelFormat("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel")
                    self.matrixLEDserie[i][j][k].setMeshSmooth(True)
                    self.matrixLEDserie[i][j][k].setName(
                        str(i) + " " + str(j) + " " + str(k))

                    self.m_graph.addSeries(self.matrixLEDserie[i][j][k])

                    self.m_graph.seriesList()[count].dataProxy().addItem(item)
                    self.m_graph.seriesList()[count].setBaseColor(
                        self.nullColor)
                    self.m_graph.seriesList()[count].setItemSize(
                        1.2 / self.cubeSize.max())

                    count = count + 1
示例#2
0
    def __init__(self, scatter):
        super(ScatterDataModifier, self).__init__()

        mesh_dir = QFileInfo(__file__).absolutePath() + '/mesh'

        self.m_graph = scatter
        self.m_rotationTimer = QTimer()
        self.m_fieldLines = 12
        self.m_arrowsPerLine = 16
        self.m_magneticField = QScatter3DSeries()
        self.m_sun = QScatter3DSeries()
        self.m_angleOffset = 0.0
        self.m_angleStep = self.doublePi / self.m_arrowsPerLine / self.animationFrames

        self.m_graph.setShadowQuality(QAbstract3DGraph.ShadowQualityNone)
        self.m_graph.scene().activeCamera().setCameraPreset(
            Q3DCamera.CameraPresetFront)

        # Magnetic field lines use custom narrow arrow.
        self.m_magneticField.setItemSize(0.2)
        self.m_magneticField.setMesh(QAbstract3DSeries.MeshUserDefined)
        self.m_magneticField.setUserDefinedMesh(mesh_dir + '/narrowarrow.obj')
        fieldGradient = QLinearGradient(0, 0, 16, 1024)
        fieldGradient.setColorAt(0.0, Qt.black)
        fieldGradient.setColorAt(1.0, Qt.white)
        self.m_magneticField.setBaseGradient(fieldGradient)
        self.m_magneticField.setColorStyle(Q3DTheme.ColorStyleRangeGradient)

        # For 'sun' we use a custom large sphere.
        self.m_sun.setItemSize(0.2)
        self.m_sun.setName("Sun")
        self.m_sun.setItemLabelFormat("@seriesName")
        self.m_sun.setMesh(QAbstract3DSeries.MeshUserDefined)
        self.m_sun.setUserDefinedMesh(mesh_dir + '/largesphere.obj')
        self.m_sun.setBaseColor(QColor(0xff, 0xbb, 0x00))
        self.m_sun.dataProxy().addItem(QScatterDataItem(QVector3D()))

        self.m_graph.addSeries(self.m_magneticField)
        self.m_graph.addSeries(self.m_sun)

        # Configure the axes according to the data.
        self.m_graph.axisX().setRange(-self.horizontalRange,
                                      self.horizontalRange)
        self.m_graph.axisY().setRange(-self.verticalRange, self.verticalRange)
        self.m_graph.axisZ().setRange(-self.horizontalRange,
                                      self.horizontalRange)
        self.m_graph.axisX().setSegmentCount(self.horizontalRange)
        self.m_graph.axisZ().setSegmentCount(self.horizontalRange)

        self.m_rotationTimer.timeout.connect(self.triggerRotation)

        self.toggleRotation()
        self.generateData()
示例#3
0
    def generateData(self):
        # 生成模拟数据
        magneticFieldArray = []

        for i in range(self.m_fieldLines):
            horizontalAngle = (self.doublePi * i) / self.m_fieldLines
            xCenter = self.ellipse_a * math.cos(horizontalAngle)
            zCenter = self.ellipse_a * math.sin(horizontalAngle)

            # Rotate - arrow is always tangential to the origin.
            # 旋转-箭头始终与原点相切。
            yRotation = QQuaternion.fromAxisAndAngle(
                0.0, 1.0, 0.0, horizontalAngle * self.radiansToDegrees)

            for j in range(self.m_arrowsPerLine):
                # Calculate the point on the ellipse centered on the origin and
                # 计算椭圆上以原点为中心的点
                # parallel to the x-axis.
                # 平行于X轴。
                verticalAngle = ((self.doublePi * j) /
                                 self.m_arrowsPerLine) + self.m_angleOffset
                xUnrotated = self.ellipse_a * math.cos(verticalAngle)
                y = self.ellipse_b * math.sin(verticalAngle)

                # Rotate the ellipse around the y-axis.
                # 围绕Y轴旋转椭圆。
                xRotated = xUnrotated * math.cos(horizontalAngle)
                zRotated = xUnrotated * math.sin(horizontalAngle)

                # Add the offset.
                # 添加偏移量。
                x = xCenter + xRotated
                z = zCenter + zRotated

                zRotation = QQuaternion.fromAxisAndAngle(
                    0.0, 0.0, 1.0, verticalAngle * self.radiansToDegrees)
                totalRotation = yRotation * zRotation

                itm = QScatterDataItem(QVector3D(x, y, z), totalRotation)
                magneticFieldArray.append(itm)

        if self.m_graph.selectedSeries() is self.m_magneticField:
            self.m_graph.clearSelection()

        self.m_magneticField.dataProxy().resetArray(magneticFieldArray)
示例#4
0
    def addData(self):
        dataArray = []

        stream = QTextStream()
        dataFile = QFile(QFileInfo(__file__).absolutePath() + '/data.txt')
        if dataFile.open(QIODevice.ReadOnly | QIODevice.Text):
            stream.setDevice(dataFile)
            while not stream.atEnd():
                line = stream.readLine()
                if line.startswith('#'):
                    continue

                strList = line.split(',')
                # Each line has three data items: xPos, yPos and zPos values.
                if len(strList) < 3:
                    continue

                position = QVector3D(float(strList[0]), float(strList[1]),
                                     float(strList[2]))
                dataArray.append(QScatterDataItem(position))

        self.m_graph.seriesList()[0].dataProxy().resetArray(dataArray)
示例#5
0
    def addData(self):
        self.m_graph.axisX().setTitle("X")
        self.m_graph.axisY().setTitle("Y")
        self.m_graph.axisZ().setTitle("Z")

        dataArray = []

        limit = math.sqrt(self.m_itemCount) / 2.0
        i = -limit
        while i < limit:
            j = -limit
            while j < limit:
                itm = QScatterDataItem(
                    QVector3D(
                        i + 0.5,
                        math.cos(math.radians((i * j) / self.m_curveDivider)),
                        j + 0.5))
                dataArray.append(itm)
                j += 1.0

            i += 1.0

        self.m_graph.seriesList()[0].dataProxy().resetArray(dataArray)
示例#6
0
 def addData(self):
     dataArray = []
     for i in range(10):
         itm = QScatterDataItem(QVector3D(i, i, i))
         dataArray.append(itm)
     self.m_graph.seriesList()[0].dataProxy().resetArray(dataArray)
示例#7
0
    def __init__(self, scatter):
        super(ScatterDataModifier, self).__init__()

        mesh_dir = QFileInfo(__file__).absolutePath() + '/Data/mesh'

        self.m_graph = scatter  # Q3DScatter 对象实例
        self.m_rotationTimer = QTimer()
        self.m_fieldLines = 12  # 初始磁场线数量
        self.m_arrowsPerLine = 16  # 初始箭头数
        self.m_magneticField = QScatter3DSeries()  # 磁场线三维散点图
        self.m_sun = QScatter3DSeries()  # 太阳三维散点图
        self.m_angleOffset = 0.0  # 角度偏移
        self.m_angleStep = self.doublePi / self.m_arrowsPerLine / self.animationFrames

        # 设置阴影质量
        self.m_graph.setShadowQuality(QAbstract3DGraph.ShadowQualityNone)
        # 设置当前场景中的激活的相机预设值
        self.m_graph.scene().activeCamera().setCameraPreset(
            Q3DCamera.CameraPresetFront)

        # Magnetic field lines use custom narrow arrow.
        # 磁力线使用自定义窄箭头。
        self.m_magneticField.setItemSize(0.2)
        self.m_magneticField.setMesh(QAbstract3DSeries.MeshUserDefined)
        self.m_magneticField.setUserDefinedMesh(mesh_dir + '/narrowarrow.obj')
        # 设置渐变颜色
        fieldGradient = QLinearGradient(0, 0, 16, 1024)
        fieldGradient.setColorAt(0.0, Qt.black)
        fieldGradient.setColorAt(1.0, Qt.white)
        self.m_magneticField.setBaseGradient(fieldGradient)
        self.m_magneticField.setColorStyle(Q3DTheme.ColorStyleRangeGradient)

        # For 'sun' we use a custom large sphere.
        # 使用一个自定义的球体代表太阳
        self.m_sun.setItemSize(0.2)
        self.m_sun.setName("Sun")
        self.m_sun.setItemLabelFormat("@seriesName")
        self.m_sun.setMesh(QAbstract3DSeries.MeshUserDefined)
        self.m_sun.setUserDefinedMesh(mesh_dir + '/largesphere.obj')
        self.m_sun.setBaseColor(QColor(0xff, 0xbb, 0x00))
        self.m_sun.dataProxy().addItem(QScatterDataItem(QVector3D()))

        self.m_graph.addSeries(self.m_magneticField)
        self.m_graph.addSeries(self.m_sun)

        # Configure the axes according to the data.
        # 设置x轴的范围值
        self.m_graph.axisX().setRange(-self.horizontalRange,
                                      self.horizontalRange)
        # 设置y轴的范围值
        self.m_graph.axisY().setRange(-self.verticalRange, self.verticalRange)
        # 设置z轴的范围值
        self.m_graph.axisZ().setRange(-self.horizontalRange,
                                      self.horizontalRange)
        # x和z轴上的段数
        # 这表明绘制了多少标签。要绘制的网格线的数量使用公式计算:segments * subsegments + 1。预设默认值为5。该值不能低于1。
        self.m_graph.axisX().setSegmentCount(self.horizontalRange)
        self.m_graph.axisZ().setSegmentCount(self.horizontalRange)

        self.m_rotationTimer.timeout.connect(self.triggerRotation)

        self.toggleRotation()
        self.generateData()