我想将诸如标签,刻度和值之类的轴信息添加到使用pyqtgraph.opengl.GLViewWidget模块创建的3D场景中。 GLAxisItem已经有一个非常简单的轴绘制选项,但是通过此方法,您只能控制轴的长度。
我已经扩展了GLAxisItem来更改轴的颜色,但是看不到包括这些其他功能的方法。
这是一个例子:
template<auto F = 0, auto L = -1, typename Container,
typename Container::size_type First = F,
typename Container::size_type Last = (L == -1) ? Container::size() : L>
void do_something(const Container& containter)
{}
如果这些功能没有随着缩放而改变大小,那将是完美的。
从here开始,我了解了如何创建自定义文本项,并扩展了Custom3DAxis类以包括X,Y和Z标签(上面的代码已更新)。我想这就是进一步包含价值观和其他东西的方法。
但是,由于这3个文本项,此解决方案使渲染在每个旋转/跨度(即在每个场景更新)时变得非常慢!
有人知道这是为什么吗?我应该怎么做才能避免这种情况?
答案 0 :(得分:1)
好的,我有一个合理的解决方案:为每个标签和要添加的值创建文本项。造成问题变慢的原因是,在问题代码中,每次场景更新时都添加了更多的新项目(而不仅仅是更新初始项目)。这是解决问题的代码:
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.opengl as gl
import pyqtgraph as pg
import OpenGL.GL as ogl
import numpy as np
class CustomTextItem(gl.GLGraphicsItem.GLGraphicsItem):
def __init__(self, X, Y, Z, text):
gl.GLGraphicsItem.GLGraphicsItem.__init__(self)
self.text = text
self.X = X
self.Y = Y
self.Z = Z
def setGLViewWidget(self, GLViewWidget):
self.GLViewWidget = GLViewWidget
def setText(self, text):
self.text = text
self.update()
def setX(self, X):
self.X = X
self.update()
def setY(self, Y):
self.Y = Y
self.update()
def setZ(self, Z):
self.Z = Z
self.update()
def paint(self):
self.GLViewWidget.qglColor(QtCore.Qt.black)
self.GLViewWidget.renderText(self.X, self.Y, self.Z, self.text)
class Custom3DAxis(gl.GLAxisItem):
"""Class defined to extend 'gl.GLAxisItem'."""
def __init__(self, parent, color=(0,0,0,.6)):
gl.GLAxisItem.__init__(self)
self.parent = parent
self.c = color
def add_labels(self):
"""Adds axes labels."""
x,y,z = self.size()
#X label
self.xLabel = CustomTextItem(X=x/2, Y=-y/20, Z=-z/20, text="X")
self.xLabel.setGLViewWidget(self.parent)
self.parent.addItem(self.xLabel)
#Y label
self.yLabel = CustomTextItem(X=-x/20, Y=y/2, Z=-z/20, text="Y")
self.yLabel.setGLViewWidget(self.parent)
self.parent.addItem(self.yLabel)
#Z label
self.zLabel = CustomTextItem(X=-x/20, Y=-y/20, Z=z/2, text="Z")
self.zLabel.setGLViewWidget(self.parent)
self.parent.addItem(self.zLabel)
def add_tick_values(self, xticks=[], yticks=[], zticks=[]):
"""Adds ticks values."""
x,y,z = self.size()
xtpos = np.linspace(0, x, len(xticks))
ytpos = np.linspace(0, y, len(yticks))
ztpos = np.linspace(0, z, len(zticks))
#X label
for i, xt in enumerate(xticks):
val = CustomTextItem(X=xtpos[i], Y=-y/20, Z=-z/20, text=str(xt))
val.setGLViewWidget(self.parent)
self.parent.addItem(val)
#Y label
for i, yt in enumerate(yticks):
val = CustomTextItem(X=-x/20, Y=ytpos[i], Z=-z/20, text=str(yt))
val.setGLViewWidget(self.parent)
self.parent.addItem(val)
#Z label
for i, zt in enumerate(zticks):
val = CustomTextItem(X=-x/20, Y=-y/20, Z=ztpos[i], text=str(zt))
val.setGLViewWidget(self.parent)
self.parent.addItem(val)
def paint(self):
self.setupGLState()
if self.antialias:
ogl.glEnable(ogl.GL_LINE_SMOOTH)
ogl.glHint(ogl.GL_LINE_SMOOTH_HINT, ogl.GL_NICEST)
ogl.glBegin(ogl.GL_LINES)
x,y,z = self.size()
#Draw Z
ogl.glColor4f(self.c[0], self.c[1], self.c[2], self.c[3])
ogl.glVertex3f(0, 0, 0)
ogl.glVertex3f(0, 0, z)
#Draw Y
ogl.glColor4f(self.c[0], self.c[1], self.c[2], self.c[3])
ogl.glVertex3f(0, 0, 0)
ogl.glVertex3f(0, y, 0)
#Draw X
ogl.glColor4f(self.c[0], self.c[1], self.c[2], self.c[3])
ogl.glVertex3f(0, 0, 0)
ogl.glVertex3f(x, 0, 0)
ogl.glEnd()
app = QtGui.QApplication([])
fig1 = gl.GLViewWidget()
background_color = app.palette().color(QtGui.QPalette.Background)
fig1.setBackgroundColor(background_color)
n = 51
y = np.linspace(-10,10,n)
x = np.linspace(-10,10,100)
for i in range(n):
yi = np.array([y[i]]*100)
d = (x**2 + yi**2)**0.5
z = 10 * np.cos(d) / (d+1)
pts = np.vstack([x,yi,z]).transpose()
plt = gl.GLLinePlotItem(pos=pts, color=pg.glColor((i,n*1.3)), width=(i+1)/10., antialias=True)
fig1.addItem(plt)
axis = Custom3DAxis(fig1, color=(0.2,0.2,0.2,.6))
axis.setSize(x=12, y=12, z=12)
# Add axes labels
axis.add_labels()
# Add axes tick values
axis.add_tick_values(xticks=[0,4,8,12], yticks=[0,6,12], zticks=[0,3,6,9,12])
fig1.addItem(axis)
fig1.opts['distance'] = 40
fig1.show()
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
答案 1 :(得分:0)
好的,请忍受我,因为我一生从未写过任何课。但是我确实“借用”了您的代码并进行了一些修改以添加更多功能。
Here是我添加到pyQtGraph文件夹中的所有“ GL项目”文件所在的修改后的GLTextItem文件。
here是经过修改的GLAxisItem文件,我使用了您的代码,并在pyQtGraph文件夹中的原始GLAxisItem文件中添加了更多功能。
here是我用来调试轴和文本项的文件。
请查看这些文件并尝试运行它们。我在GLAxisItem中有一个错误,没有指定轴标签时会显示默认标签。但是,当我创建轴对象并使用setAxisLabel()方法指定轴标签及其位置时,仍显示默认文本,它不会消失……对此有任何解决办法吗?
Here's完整的回购链接。