def snap_special_or_self(self, p) : for q in self.special_canvas : diff = q - p dist = QPointF.dotProduct(diff,diff) if dist < self.err_dist : return q return p
def mousePressEvent(self, event): if event.button() == Qt.LeftButton and not self._is_dragging: point = event.pos() diff = self.param_canvas - point dist = QPointF.dotProduct(diff,diff) if dist < self.err_dist : self._is_dragging = True self._drag_diff = diff else : self._jump_click = True;
def closestPoint(self, pos: QPointF): d = -1 p = None p1 = self._firstPoint prev = -1 for i in range(len(self._midPoints)): p2 = self._midPoints[i] l = QLineF(p1, p2) x = QPointF.dotProduct(pos - p1, p2 - p1) / l.length() if x < 0: paux = p1 elif x > 1: paux = p2 else: paux = l.pointAt(x) aux = QLineF(paux, pos).length() if p is None or aux < d: p = paux d = aux prev = i p1 = p2 p2 = self._lastPoint l = QLineF(p1, p2) x = QPointF.dotProduct(pos - p1, p2 - p1) / (l.length() * l.length()) if x < 0: paux = p1 elif x > 1: paux = p2 else: paux = l.pointAt(x) aux = QLineF(paux, pos).length() if p is None or aux < d: p = paux d = aux prev = -1 return p, prev
def updateMouseXY(self, sceneXY): self.target_point = EarthCoords.fromRadarCoords( RadarCoords.fromQPointF(sceneXY)) p_acft = self.acft.coords().toRadarCoords() acft_qpoint = p_acft.toQPointF() # Get node route sequence if QPointF.dotProduct( sceneXY - acft_qpoint, sceneXY - acft_qpoint ) < min_taxi_drag * min_taxi_drag: # min mouse move not reached self.node_route = None else: # get route end nodes src_node = None dest_node = None if env.airport_data != None: src_node = env.airport_data.ground_net.closestNode( self.acft.coords()) if src_node != None: dest_node = env.airport_data.ground_net.closestNode( self.target_point, maxdist=taxi_tool_snap_dist) if src_node == None or dest_node == None: self.node_route = None else: try: self.node_route = env.airport_data.ground_net.shortestTaxiRoute( src_node, dest_node, settings.taxi_instructions_avoid_runways) p_src = env.airport_data.ground_net.nodePosition( src_node).toRadarCoords() if self.node_route == []: # src and dest nodes are identical if p_acft.distanceTo( p_src) > groundnet_pos_taxi_precision: self.node_route = [src_node] else: # first node of list is the one following src; check if we must insert src p_next = env.airport_data.ground_net.nodePosition( self.node_route[0]).toRadarCoords() if not p_acft.isBetween(p_src, p_next, groundnet_pos_taxi_precision): self.node_route.insert(0, src_node) except ValueError: # no taxi route found self.node_route = None # Get parking position self.parking_position = None if self.node_route == None or self.node_route == []: d_max_snap = taxi_tool_snap_dist else: d_last_node = env.airport_data.ground_net.nodePosition( self.node_route[-1]).distanceTo(self.target_point) d_max_snap = min(taxi_tool_snap_dist, d_last_node) self.parking_position = env.airport_data.ground_net.closestParkingPosition( self.target_point, maxdist=d_max_snap) # Update bounding box and specify the lines to draw self.prepareGeometryChange() if self.node_route == None and self.parking_position == None: self.snapped_OK = False line_tip = sceneXY - acft_qpoint self.lines = [(QPointF(0, 0), line_tip)] self.bbox = QRectF(QPointF(0, 0), line_tip).normalized() else: self.snapped_OK = True self.lines = [] self.bbox = QRectF(0, 0, 0, 0) prev = QPointF(0, 0) if self.node_route != None: for n in self.node_route: p = env.airport_data.ground_net.nodePosition( n).toQPointF() - acft_qpoint self.lines.append((prev, p)) self.bbox |= QRectF(prev, p).normalized() prev = p if self.parking_position != None: pk_point = env.airport_data.ground_net.parkingPosition( self.parking_position).toQPointF() - acft_qpoint self.lines.append((prev, pk_point)) self.bbox |= QRectF(prev, pk_point).normalized() self.update()