コード例 #1
0
 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
コード例 #2
0
 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;
コード例 #3
0
ファイル: relation.py プロジェクト: caiofattori/PyPFSDesign
 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
コード例 #4
0
 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()