def populate(self): """ Populate the table with the data """ self.clear() numAttr = self.data.numAttributes() numParticles = self.data.numParticles() self.attrs = getAttrs(self.data.numAttributes, self.data.attributeInfo, True) self.setColumnCount(numAttr) self.setRowCount(numParticles) self.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive) for col, (_, attr) in enumerate(self.attrs): item = QTableWidgetItem(attr.name) tooltip = '<p><tt> Name: {}<br> Type: {}<br>Count: {}</tt></p>'.\ format(attr.name, partio.TypeName(attr.type), attr.count) item.setToolTip(tooltip) self.setHorizontalHeaderItem(col, item) self.horizontalHeader().setStretchLastSection(False) self.setVerticalHeaderLabels( [str(pnum) for pnum in range(numParticles)]) self.setTabKeyNavigation(True) self.horizontalHeader().setSectionsMovable(False) # Populate it with the particle data self.widgets = [] for pnum in range(numParticles): self.populateParticle(pnum) self.horizontalHeader().resizeSections(QHeaderView.ResizeToContents) self.verticalHeader().resizeSections(QHeaderView.ResizeToContents)
def toJson(particleSet): """ Converts a particle set to json """ data = {} # Put types in json just for readability data['__types__'] = {i: partio.TypeName(i) for i in range(5)} # Convert fixed attributes fixedAttributes = {} fixedIndexedStrings = {} for i in range(particleSet.numFixedAttributes()): attr = particleSet.fixedAttributeInfo(i) fixedAttributes[attr.name] = { 'type': attr.type, 'count': attr.count, 'value': particleSet.getFixed(attr), } # Convert indexed string attributse if attr.type == partio.INDEXEDSTR: fixedIndexedStrings[attr.name] = particleSet.fixedIndexedStrs(attr) if fixedAttributes: data['fixedAttributes'] = fixedAttributes if fixedIndexedStrings: data['fixedIndexedStrings'] = fixedIndexedStrings # Convert particle attributes attributes = {} attrs = [] indexedStrings = {} for i in range(particleSet.numAttributes()): attr = particleSet.attributeInfo(i) attrs.append(attr) attributes[attr.name] = {'type': attr.type, 'count': attr.count} # Convert indexed string attributse if attr.type == partio.INDEXEDSTR: indexedStrings[attr.name] = particleSet.indexedStrs(attr) if attributes: data['attributes'] = attributes if indexedStrings: data['indexedStrings'] = indexedStrings # Convert particles to an indexed dictionary particles = {} for i in range(particleSet.numParticles()): particle = {} for attr in attrs: particle[attr.name] = particleSet.get(attr, i) # Add an index purely for readability & debugging (not consumed converting back) particles[i] = particle if particles: data['particles'] = particles return data
def populate(self): """ Populates the table of fixed attributes """ self.widgets = [] # If no widgets, just drop that in numAttrs = self.data.numFixedAttributes() if not numAttrs: self.table.hide() self.noAttrLabel.show() return self.table.show() self.noAttrLabel.hide() self.table.setColumnCount(1) self.table.setRowCount(numAttrs) self.attrs = getAttrs(self.data.numFixedAttributes, self.data.fixedAttributeInfo, True) for row, (_, attr) in enumerate(self.attrs): item = QTableWidgetItem(attr.name) tooltip = '<p><tt> Name: {}<br> Type: {}<br>Count: {}</tt></p>'.\ format(attr.name, partio.TypeName(attr.type), attr.count) item.setToolTip(tooltip) self.table.setVerticalHeaderItem(row, item) value = self.data.getFixed(attr) widget = getWidget(value, self.data, attr) self.table.setCellWidget(row, 0, widget) self.widgets.append(widget) self.table.horizontalHeader().setStretchLastSection(False) self.table.setTabKeyNavigation(True) self.table.horizontalHeader().setSectionsMovable(False) self.table.horizontalHeader().resizeSections( QHeaderView.ResizeToContents) self.table.verticalHeader().resizeSections( QHeaderView.ResizeToContents)
def addAttributeSlot(self): """ Adds a new attribute (column) to the table """ dialog = QDialog(self) dialog.setModal(True) dialog.setWindowTitle('Add Attribute') layout = QVBoxLayout() dialog.setLayout(layout) form = QFormLayout() nameBox = QLineEdit() typeCombo = QComboBox() for attrType in _attrTypes: typeName = partio.TypeName(attrType) typeCombo.addItem(typeName) typeCombo.setCurrentIndex(partio.FLOAT) countBox = QLineEdit() countBox.setValidator(QIntValidator()) countBox.setText('1') fixedCheckbox = QCheckBox() valueBox = QLineEdit() valueBox.setText('0') form.addRow('Name:', nameBox) form.addRow('Type:', typeCombo) form.addRow('Count:', countBox) form.addRow('Fixed:', fixedCheckbox) form.addRow('Default Value:', valueBox) layout.addLayout(form) buttons = QHBoxLayout() layout.addLayout(buttons) add = QPushButton('Add') add.clicked.connect(dialog.accept) buttons.addWidget(add) cancel = QPushButton('Cancel') cancel.clicked.connect(dialog.reject) buttons.addWidget(cancel) if not dialog.exec_(): return name = str(nameBox.text()) if not name: print('Please supply a name for the new attribute') # TODO: prompt return attrType = typeCombo.currentIndex() count = int(countBox.text()) fixed = fixedCheckbox.isChecked() values = list(str(valueBox.text()).strip().split()) for i in range(count): if i < len(values): value = values[i] else: value = values[-1] if attrType == partio.INT or attrType == partio.INDEXEDSTR: values[i] = int(value) elif attrType == partio.FLOAT or attrType == partio.VECTOR: values[i] = float(value) # pylint:disable=R0204 else: values[i] = 0.0 # pylint:disable=R0204 value = tuple(values) self.data.addAttribute(name, attrType, count, fixed, value)