def mouseReleaseEvent(self, event): if self._active_button != event.button(): return if self._start_plane_attitude is not None and self._node_status is not None: group = self._model.getSelectionGroup() group.removeAllNodes() target_plane_attitude = self._node_status.getPlaneAttitude() if target_plane_attitude != self._start_plane_attitude: c = CommandMovePlane(self._plane, self._start_plane_attitude, target_plane_attitude) self._undo_redo_stack.push(c) elif self._node_status is not None: # do undo redo command for adding a node or moving a node node_id = self._node_status.getNodeIdentifier() node = self._model.getNodeByIdentifier(node_id) group = self._model.getSelectionGroup() group.removeNode(node) node_location = self._model.getNodeLocation(node) plane_attitude = self._plane.getAttitude() node_status = SegmentPointStatus(node_id, node_location, plane_attitude) c = CommandPointCloudNode(self._model, self._node_status, node_status) self._undo_redo_stack.push(c) else: super(Point, self).mouseReleaseEvent(event) self._active_button = QtCore.Qt.NoButton
def mousePressEvent(self, event): if self._active_button != QtCore.Qt.NoButton: return self._active_button = event.button() self._node_status = None self._start_plane_attitude = None if (event.modifiers() & QtCore.Qt.CTRL) and event.button() == QtCore.Qt.LeftButton: node = self._zinc_view.getNearestNode(event.x(), event.y()) if node and node.isValid(): # node exists at this location so select it group = self._model.getSelectionGroup() group.removeAllNodes() group.addNode(node) node_location = self._model.getNodeLocation(node) plane_attitude = self._model.getNodePlaneAttitude(node.getIdentifier()) self._start_plane_attitude = self._plane.getAttitude() else: node_location = None plane_attitude = None point_on_plane = self._calculatePointOnPlane(event.x(), event.y()) region = self._model.getRegion() fieldmodule = region.getFieldmodule() fieldmodule.beginChange() node = self._model.createNode() group = self._model.getPointCloudGroup() group.addNode(node) self._model.setNodeLocation(node, point_on_plane) fieldmodule.endChange() self._node_status = SegmentPointStatus(node.getIdentifier(), node_location, plane_attitude) else: super(Point, self).mousePressEvent(event)
def mouseMoveEvent(self, event): if self._node_status is not None: self._start_plane_attitude = None node = self._model.getNodeByIdentifier( self._node_status.getNodeIdentifier()) point_on_plane = self._calculatePointOnPlane(event.x(), event.y()) self._model.setNodeLocation(node, point_on_plane) if self._streaming_create: node_id = -1 plane_attitude = self._plane.getAttitude() fake_status = SegmentPointStatus(node_id, None, None) node_status = SegmentPointStatus(node_id, point_on_plane, plane_attitude) c = CommandPointCloudNode(self._model, fake_status, node_status) self._undo_redo_stack.push(c) else: super(Point, self).mouseMoveEvent(event)
def mousePressEvent(self, event): if self._active_button != QtCore.Qt.NoButton: return self._active_button = event.button() self._node_status = None self._start_plane_attitude = None if (event.modifiers() & QtCore.Qt.CTRL) and event.button() == QtCore.Qt.LeftButton: node = self._zinc_view.getNearestNode(event.x(), event.y()) if node and node.isValid(): # node exists at this location so select it group = self._model.getSelectionGroup() group.removeAllNodes() group.addNode(node) node_location = self._model.getNodeLocation(node) plane_attitude = self._model.getNodePlaneAttitude( node.getIdentifier()) self._start_plane_attitude = self._plane.getAttitude() else: node_location = None plane_attitude = None point_on_plane = self._calculatePointOnPlane( event.x(), event.y()) region = self._model.getRegion() fieldmodule = region.getFieldmodule() fieldmodule.beginChange() node = self._model.createNode() group = self._model.getPointCloudGroup() group.addNode(node) self._model.setNodeLocation(node, point_on_plane) fieldmodule.endChange() self._node_status = SegmentPointStatus(node.getIdentifier(), node_location, plane_attitude) else: super(Point, self).mousePressEvent(event)
class Point(AbstractSelection): def __init__(self, plane, undo_redo_stack): super(Point, self).__init__(plane, undo_redo_stack) self._mode_type = ViewMode.SEGMENT_POINT self._model = None self._streaming_create = False self._node_status = None def setModel(self, model): self._model = model def setStreamingCreate(self, state): self._streaming_create = state def enter(self): super(Point, self).enter() def leave(self): super(Point, self).leave() def mousePressEvent(self, event): if self._active_button != QtCore.Qt.NoButton: return self._active_button = event.button() self._node_status = None self._start_plane_attitude = None if (event.modifiers() & QtCore.Qt.CTRL) and event.button() == QtCore.Qt.LeftButton: node = self._zinc_view.getNearestNode(event.x(), event.y()) if node and node.isValid(): # node exists at this location so select it group = self._model.getSelectionGroup() group.removeAllNodes() group.addNode(node) node_location = self._model.getNodeLocation(node) plane_attitude = self._model.getNodePlaneAttitude( node.getIdentifier()) self._start_plane_attitude = self._plane.getAttitude() else: node_location = None plane_attitude = None point_on_plane = self._calculatePointOnPlane( event.x(), event.y()) region = self._model.getRegion() fieldmodule = region.getFieldmodule() fieldmodule.beginChange() node = self._model.createNode() group = self._model.getPointCloudGroup() group.addNode(node) self._model.setNodeLocation(node, point_on_plane) fieldmodule.endChange() self._node_status = SegmentPointStatus(node.getIdentifier(), node_location, plane_attitude) else: super(Point, self).mousePressEvent(event) def mouseMoveEvent(self, event): if self._node_status is not None: self._start_plane_attitude = None node = self._model.getNodeByIdentifier( self._node_status.getNodeIdentifier()) point_on_plane = self._calculatePointOnPlane(event.x(), event.y()) self._model.setNodeLocation(node, point_on_plane) if self._streaming_create: node_id = -1 plane_attitude = self._plane.getAttitude() fake_status = SegmentPointStatus(node_id, None, None) node_status = SegmentPointStatus(node_id, point_on_plane, plane_attitude) c = CommandPointCloudNode(self._model, fake_status, node_status) self._undo_redo_stack.push(c) else: super(Point, self).mouseMoveEvent(event) def mouseReleaseEvent(self, event): if self._active_button != event.button(): return if self._start_plane_attitude is not None and self._node_status is not None: group = self._model.getSelectionGroup() group.removeAllNodes() target_plane_attitude = self._node_status.getPlaneAttitude() if target_plane_attitude != self._start_plane_attitude: c = CommandMovePlane(self._plane, self._start_plane_attitude, target_plane_attitude) self._undo_redo_stack.push(c) elif self._node_status is not None: # do undo redo command for adding a node or moving a node node_id = self._node_status.getNodeIdentifier() node = self._model.getNodeByIdentifier(node_id) group = self._model.getSelectionGroup() group.removeNode(node) node_location = self._model.getNodeLocation(node) plane_attitude = self._plane.getAttitude() node_status = SegmentPointStatus(node_id, node_location, plane_attitude) c = CommandPointCloudNode(self._model, self._node_status, node_status) self._undo_redo_stack.push(c) else: super(Point, self).mouseReleaseEvent(event) self._active_button = QtCore.Qt.NoButton def _calculatePointOnPlane(self, x, y): far_plane_point = self._zinc_view.unproject(x, -y, -1.0) near_plane_point = self._zinc_view.unproject(x, -y, 1.0) point_on_plane = calculateLinePlaneIntersection( near_plane_point, far_plane_point, self._plane.getRotationPoint(), self._plane.getNormal()) return point_on_plane
def getNodeStatus(self, node_id): node = self.getNodeByIdentifier(node_id) node_status = SegmentPointStatus(node_id, self.getNodeLocation(node), self.getNodePlaneAttitude(node_id)) return node_status
class Point(AbstractSelection): def __init__(self, plane, undo_redo_stack): super(Point, self).__init__(plane, undo_redo_stack) self._mode_type = ViewMode.SEGMENT_POINT self._model = None self._streaming_create = False self._node_status = None def setModel(self, model): self._model = model def setStreamingCreate(self, state): self._streaming_create = state def enter(self): super(Point, self).enter() def leave(self): super(Point, self).leave() def mousePressEvent(self, event): if self._active_button != QtCore.Qt.NoButton: return self._active_button = event.button() self._node_status = None self._start_plane_attitude = None if (event.modifiers() & QtCore.Qt.CTRL) and event.button() == QtCore.Qt.LeftButton: node = self._zinc_view.getNearestNode(event.x(), event.y()) if node and node.isValid(): # node exists at this location so select it group = self._model.getSelectionGroup() group.removeAllNodes() group.addNode(node) node_location = self._model.getNodeLocation(node) plane_attitude = self._model.getNodePlaneAttitude(node.getIdentifier()) self._start_plane_attitude = self._plane.getAttitude() else: node_location = None plane_attitude = None point_on_plane = self._calculatePointOnPlane(event.x(), event.y()) region = self._model.getRegion() fieldmodule = region.getFieldmodule() fieldmodule.beginChange() node = self._model.createNode() group = self._model.getPointCloudGroup() group.addNode(node) self._model.setNodeLocation(node, point_on_plane) fieldmodule.endChange() self._node_status = SegmentPointStatus(node.getIdentifier(), node_location, plane_attitude) else: super(Point, self).mousePressEvent(event) def mouseMoveEvent(self, event): if self._node_status is not None: self._start_plane_attitude = None node = self._model.getNodeByIdentifier(self._node_status.getNodeIdentifier()) point_on_plane = self._calculatePointOnPlane(event.x(), event.y()) self._model.setNodeLocation(node, point_on_plane) if self._streaming_create: node_id = -1 plane_attitude = self._plane.getAttitude() fake_status = SegmentPointStatus(node_id, None, None) node_status = SegmentPointStatus(node_id, point_on_plane, plane_attitude) c = CommandPointCloudNode(self._model, fake_status, node_status) self._undo_redo_stack.push(c) else: super(Point, self).mouseMoveEvent(event) def mouseReleaseEvent(self, event): if self._active_button != event.button(): return if self._start_plane_attitude is not None and self._node_status is not None: group = self._model.getSelectionGroup() group.removeAllNodes() target_plane_attitude = self._node_status.getPlaneAttitude() if target_plane_attitude != self._start_plane_attitude: c = CommandMovePlane(self._plane, self._start_plane_attitude, target_plane_attitude) self._undo_redo_stack.push(c) elif self._node_status is not None: # do undo redo command for adding a node or moving a node node_id = self._node_status.getNodeIdentifier() node = self._model.getNodeByIdentifier(node_id) group = self._model.getSelectionGroup() group.removeNode(node) node_location = self._model.getNodeLocation(node) plane_attitude = self._plane.getAttitude() node_status = SegmentPointStatus(node_id, node_location, plane_attitude) c = CommandPointCloudNode(self._model, self._node_status, node_status) self._undo_redo_stack.push(c) else: super(Point, self).mouseReleaseEvent(event) self._active_button = QtCore.Qt.NoButton def _calculatePointOnPlane(self, x, y): far_plane_point = self._zinc_view.unproject(x, -y, -1.0) near_plane_point = self._zinc_view.unproject(x, -y, 1.0) point_on_plane = calculateLinePlaneIntersection(near_plane_point, far_plane_point, self._plane.getRotationPoint(), self._plane.getNormal()) return point_on_plane