📄 owmoleculevisualizer.py
字号:
"""<name>Molecule visualizer</name>"""
import orange
import orngChem
from OWWidget import *
from qt import *
import OWGUI
import sys, os
import vis
from openeye.oechem import *
class DrawContext:
def __init__(self, molecule="", fragment="", size=200, imageprefix="", imagename="", title=""):
self.molecule=molecule
self.fragment=fragment
self.size=size
self.imageprefix=imageprefix
self.imagename=imagename
self.title=title
class BigImage(QDialog):
def __init__(self, context, *args):
apply(QDialog.__init__, (self,)+args)
self.context=context
self.label=QLabel(self)
self.imagename=context.imagename or context.imageprefix+"_big.bmp"
self.imageSize=400
self.renderImage()
def renderImage(self):
if self.context.fragment:
vis.moleculeFragment2BMP(self.context.molecule, self.context.fragment, self.imagename, self.imageSize, self.context.title)
else:
vis.molecule2BMP(self.context.molecule, self.imagename, self.imageSize, self.context.title)
pix=QPixmap()
pix.load(self.imagename)
self.label.setPixmap(pix)
self.label.resize(pix.width(), pix.height())
def resizeEvent(self, event):
apply(QDialog.resizeEvent, (self, event))
self.imageSize=min(event.size().width(), event.size().height())
self.renderImage()
class MolImage(QLabel):
def __init__(self, master, parent, context):
apply(QLabel.__init__,(self, parent))
#print filename
self.context=context
self.master=master
imagename=context.imagename or context.imageprefix+".bmp"
if context.fragment:
vis.moleculeFragment2BMP(context.molecule, context.fragment, imagename, context.size, context.title)
else:
vis.molecule2BMP(context.molecule, imagename, context.size, context.title)
self.load(imagename)
self.selected=False
self.setFrameStyle(QFrame.Panel | QFrame.Raised)
def load(self, filename):
self.pix=QPixmap()
if not self.pix.load(filename):
print "Failed to load "+filename
return
self.resize(self.pix.width(), self.pix.height())
self.setPixmap(self.pix)
def paintEvent(self, event):
apply(QLabel.paintEvent,(self, event))
if self.selected:
painter=QPainter(self)
painter.setPen(QPen(Qt.red, 2))
painter.drawRect(2, 2, self.width()-3, self.height()-3)
def mousePressEvent(self, event):
self.master.mouseAction(self, event)
def mouseDoubleClickEvent(self, event):
d=BigImage(self.context, self)
d.show()
class ScrollView(QScrollView):
def __init__(self, master, *args):
apply(QScrollView.__init__, (self,)+args)
self.master=master
self.viewport().setMouseTracking(True)
self.setMouseTracking(True)
def resizeEvent(self, event):
apply(QScrollView.resizeEvent, (self, event))
size=event.size()
w,h=size.width(), size.height()
oldNumColumns=self.master.numColumns
numColumns=min(w/self.master.imageSize or 1, 100)
if numColumns!=oldNumColumns:
self.master.numColumns=numColumns
self.master.redrawImages()
class OWMoleculeVisualizer(OWWidget):
settingsList=["colorFragmets","showFragments"]
def __init__(self, parent=None, signalManager=None, name="Molecule visualizer"):
apply(OWWidget.__init__,(self, parent, signalManager, name))
self.inputs=[("Molecules", ExampleTable, self.setMoleculeTable), ("Fragments", ExampleTable, self.setFragmentTable)]
self.outputs=[("Selected Molecules", ExampleTable)]
self.colorFragments=1
self.showFragments=0
self.selectedFragment=""
self.moleculeSmiles=[]
self.fragmentSmiles=[]
self.defFragmentSmiles=[]
self.moleculeSmilesAttr=0
self.moleculeTitleAttr=0
self.fragmentSmilesAttr=0
self.imageSize=200
self.numColumns=4
self.commitOnChange=0
##GUI
box=OWGUI.radioButtonsInBox(self.controlArea, self, "showFragments", ["Show molecules", "Show fragments"], "Show", callback=self.showImages)
OWGUI.checkBox(box, self, "colorFragments", "Mark fragments", callback=self.redrawImages)
box.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum))
self.moleculeSmilesCombo=OWGUI.comboBox(self.controlArea, self, "moleculeSmilesAttr", "Molecule SMILES attribute",callback=self.showImages)
self.moleculeSmilesCombo.box.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum))
self.moleculeTitleCombo=OWGUI.comboBox(self.controlArea, self, "moleculeTitleAttr", "Molecule title attribute", callback=self.redrawImages)
self.moleculeTitleCombo.box.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum))
self.fragmentSmilesCombo=OWGUI.comboBox(self.controlArea, self, "fragmentSmilesAttr", "Fragment SMILES attribute", callback=self.updateFragmentsListBox)
self.fragmentSmilesCombo.box.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum))
box=OWGUI.spin(self.controlArea, self, "imageSize", 50, 500, 50, box="Image size", callback=self.redrawImages)
box.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum))
box=OWGUI.widgetBox(self.controlArea,"Selection")
OWGUI.checkBox(box, self, "commitOnChange", "Commit on change")
OWGUI.button(box, self, "&Select marked molecules", self.selectMarked)
OWGUI.button(box, self, "&Commit", callback=self.commit)
OWGUI.rubber(self.controlArea)
self.mainAreaLayout=QVBoxLayout(self.mainArea, QVBoxLayout.TopToBottom)
spliter=QSplitter(Qt.Vertical, self.mainArea)
self.scrollView=ScrollView(self, spliter)
self.scrollView.setHScrollBarMode(QScrollView.Auto)
self.scrollView.setVScrollBarMode(QScrollView.Auto)
self.molWidget=QWidget(self.scrollView.viewport())
self.scrollView.addChild(self.molWidget)
self.mainAreaLayout.addWidget(spliter)
self.gridLayout=QGridLayout(self.molWidget,10,100,2,2)
self.gridLayout.setAutoAdd(False)
self.listBox=QListBox(spliter)
self.connect(self.listBox, SIGNAL("highlighted(int)"), self.fragmentSelection)
self.imageprefix=os.path.split(__file__)[0]
if self.imageprefix:
self.imageprefix+="\molimages\image"
else:
self.imageprefix="molimages\image"
self.imageWidgets=[]
self.candidateMolSmilesAttr=[]
self.candidateMolTitleAttr=[None]
self.candidateFragSmilesAttr=[None]
self.molData=None
self.fragData=None
self.ctrlPressed=FALSE
self.resize(600,600)
self.listBox.setMaximumHeight(150)
def setMoleculeTable(self, data):
self.molData=data
if data:
self.setMoleculeSmilesCombo()
self.setMoleculeTitleCombo()
self.setFragmentSmilesCombo()
self.updateFragmentsListBox()
self.showImages()
else:
self.moleculeSmilesCombo.clear()
self.moleculeTitleCombo.clear()
self.defFragmentSmiles=[]
if not self.fragmentSmilesAttr:
self.listBox.clear()
self.destroyImageWidgets()
self.send("Selected Molecules", None)
def setFragmentTable(self, data):
self.fragData=data
if data:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -