def get_objects_within_range( req ):
  rospy.loginfo( "SEMAP DB SRVs: get_objects_within_range" )
  res = GetObjectsWithinRangeResponse()

  tar_obj = aliased( ObjectInstance )
  tar_geo = aliased( GeometryModel )

  if req.target_object_types:
    tar_ids = any_obj_types_ids(tar_obj, req.target_object_types)
  else:
    tar_ids = any_obj_ids(tar_obj)

  if req.fully_within:
    operator = ST_3DDFullyWithin(fromPoint3D(req.reference_point), tar_geo.geometry, req.distance)
  else:
    operator = ST_3DDWithin(fromPoint3D(req.reference_point), tar_geo.geometry, req.distance)

  results = db().query( tar_obj.id, ST_3DDistance( fromPoint3D(req.reference_point), tar_geo.geometry), ST_3DMaxDistance( fromPoint3D(req.reference_point), tar_geo.geometry), ST_3DClosestPoint(tar_geo.geometry, fromPoint3D(req.reference_point)) ).\
                  filter( tar_obj.id.in_( tar_ids ), tar_obj.absolute_description_id == tar_geo.abstraction_desc, tar_geo.type == req.target_object_geometry_type, operator).\
                  order_by( ST_3DDistance( fromPoint3D(req.reference_point), tar_geo.geometry) ).all()

  for i, min, max, point in results:
    print i, min, max, point
    pair = ObjectPair()
    pair.reference_id = -1
    pair.target_id = i
    pair.max_dist = max
    pair.max_dist_line[0] = req.reference_point
    pair.max_dist_line[1] = toPoint3D( point )
    pair.min_dist = min
    pair.min_dist_line[0] = req.reference_point
    pair.min_dist_line[1] = toPoint3D( point )
    res.pairs.append(pair)

  return res
def get_objects_within_range(req):
    rospy.loginfo("SEMAP DB SRVs: get_objects_within_range")
    res = GetObjectsWithinRangeResponse()

    tar_obj = aliased(ObjectInstance)
    tar_geo = aliased(GeometryModel)

    if req.target_object_types:
        tar_ids = any_obj_types_ids(tar_obj, req.target_object_types)
    else:
        tar_ids = any_obj_ids(tar_obj)

    if req.fully_within:
        operator = ST_3DDFullyWithin(fromPoint3D(req.reference_point),
                                     tar_geo.geometry, req.distance)
    else:
        operator = ST_3DDWithin(fromPoint3D(req.reference_point),
                                tar_geo.geometry, req.distance)

    results = db().query( tar_obj.id, ST_3DDistance( fromPoint3D(req.reference_point), tar_geo.geometry), ST_3DMaxDistance( fromPoint3D(req.reference_point), tar_geo.geometry), ST_3DClosestPoint(tar_geo.geometry, fromPoint3D(req.reference_point)) ).\
                    filter( tar_obj.id.in_( tar_ids ), tar_obj.absolute_description_id == tar_geo.abstraction_desc, tar_geo.type == req.target_object_geometry_type, operator).\
                    order_by( ST_3DDistance( fromPoint3D(req.reference_point), tar_geo.geometry) ).all()

    for i, min, max, point in results:
        print i, min, max, point
        pair = ObjectPair()
        pair.reference_id = -1
        pair.target_id = i
        pair.max_dist = max
        pair.max_dist_line[0] = req.reference_point
        pair.max_dist_line[1] = toPoint3D(point)
        pair.min_dist = min
        pair.min_dist_line[0] = req.reference_point
        pair.min_dist_line[1] = toPoint3D(point)
        res.pairs.append(pair)

    return res
def get_distance_between_objects( req ):
  rospy.loginfo( "SEMAP DB SRVs: get_distance_between_objects3d" )
  res = GetDistanceBetweenObjectsResponse()

  ref_obj = aliased( ObjectInstance )
  ref_geo = aliased( GeometryModel )

  tar_obj = aliased( ObjectInstance )
  tar_geo = aliased( GeometryModel )

  if req.reference_object_geometry_type not in ["Position3D", "AxisAligned3D", "BoundingBox",  "BoundingHull", "Body"]:
    rospy.logerr("SEMAP DB SRVs: get_distance_between_objects3d was called with %s which is not a valid 2D geometry type" % req.reference_object_geometry_type)
  else:
    if req.reference_object_types:
      ref_ids = any_obj_types_ids(ref_obj, req.reference_object_types)
    else:
      ref_ids = any_obj_ids(ref_obj)

    if req.target_object_types:
      tar_ids = any_obj_types_ids(tar_obj, req.target_object_types)
    else:
      tar_ids = any_obj_ids(tar_obj)

    if req.max_distance:
      distance = ST_3DMaxDistance(ref_geo.geometry, tar_geo.geometry)
      line = ST_3DLongestLine(ref_geo.geometry, tar_geo.geometry)
    else:
      distance = ST_3DDistance(ref_geo.geometry, tar_geo.geometry)
      line = ST_3DShortestLine(ref_geo.geometry, tar_geo.geometry)

    if req.return_points:
      query = db().query( ref_obj.id, tar_obj.id, distance, line).\
                   filter( ref_obj.id.in_( ref_ids ), tar_obj.id.in_( tar_ids ), \
                           ref_obj.absolute_description_id == ref_geo.abstraction_desc,
                           tar_obj.absolute_description_id == tar_geo.abstraction_desc,
                           ref_geo.type == req.reference_object_geometry_type,
                           tar_geo.type == req.target_object_geometry_type )
    else:
      query = db().query( ref_obj.id, tar_obj.id, distance).\
           filter( ref_obj.id.in_( ref_ids ), tar_obj.id.in_( tar_ids ), \
                   ref_obj.absolute_description_id == ref_geo.abstraction_desc,
                   tar_obj.absolute_description_id == tar_geo.abstraction_desc,
                   ref_geo.type == req.reference_object_geometry_type,
                   tar_geo.type == req.target_object_geometry_type )

    if req.min_range:
      query = query.filter( distance > req.min_range )

    if req.min_range:
      query = query.filter( distance < req.max_range )

    if req.sort_descending:
      query = query.order_by( desc(distance) )
    else:
      query = query.order_by( distance )

    results = query.all()

    if req.return_points:
      for i, j, dist, points in results:
        pair = ObjectPair()
        pair.reference_id = i
        pair.target_id = j
        if req.max_distance:
          pair.max_dist = dist
          pair.max_dist_line[0] = toPoint3D( db().execute( ST_PointN( points, 1 ) ).scalar() )
          pair.max_dist_line[1] = toPoint3D( db().execute( ST_PointN( points, 2 ) ).scalar() )
        else:
          pair.min_dist = dist
          pair.min_dist_line[0] = toPoint3D( db().execute( ST_PointN( points, 1 ) ).scalar() )
          pair.min_dist_line[1] = toPoint3D( db().execute( ST_PointN( points, 2 ) ).scalar() )
        res.pairs.append(pair)
    else:
      for i, j, dist in results:
        pair = ObjectPair()
        pair.reference_id = i
        pair.target_id = j
        if req.max_distance:
          pair.max_dist = dist
        else:
          pair.min_dist = dist
        res.pairs.append(pair)

  return res
def get_distance_between_objects(req):
    rospy.loginfo("SEMAP DB SRVs: get_distance_between_objects3d")
    res = GetDistanceBetweenObjectsResponse()

    ref_obj = aliased(ObjectInstance)
    ref_geo = aliased(GeometryModel)

    tar_obj = aliased(ObjectInstance)
    tar_geo = aliased(GeometryModel)

    if req.reference_object_geometry_type not in [
            "Position3D", "AxisAligned3D", "BoundingBox", "BoundingHull",
            "Body"
    ]:
        rospy.logerr(
            "SEMAP DB SRVs: get_distance_between_objects3d was called with %s which is not a valid 2D geometry type"
            % req.reference_object_geometry_type)
    else:
        if req.reference_object_types:
            ref_ids = any_obj_types_ids(ref_obj, req.reference_object_types)
        else:
            ref_ids = any_obj_ids(ref_obj)

        if req.target_object_types:
            tar_ids = any_obj_types_ids(tar_obj, req.target_object_types)
        else:
            tar_ids = any_obj_ids(tar_obj)

        if req.max_distance:
            distance = ST_3DMaxDistance(ref_geo.geometry, tar_geo.geometry)
            line = ST_3DLongestLine(ref_geo.geometry, tar_geo.geometry)
        else:
            distance = ST_3DDistance(ref_geo.geometry, tar_geo.geometry)
            line = ST_3DShortestLine(ref_geo.geometry, tar_geo.geometry)

        if req.return_points:
            query = db().query( ref_obj.id, tar_obj.id, distance, line).\
                         filter( ref_obj.id.in_( ref_ids ), tar_obj.id.in_( tar_ids ), \
                                 ref_obj.absolute_description_id == ref_geo.abstraction_desc,
                                 tar_obj.absolute_description_id == tar_geo.abstraction_desc,
                                 ref_geo.type == req.reference_object_geometry_type,
                                 tar_geo.type == req.target_object_geometry_type )
        else:
            query = db().query( ref_obj.id, tar_obj.id, distance).\
                 filter( ref_obj.id.in_( ref_ids ), tar_obj.id.in_( tar_ids ), \
                         ref_obj.absolute_description_id == ref_geo.abstraction_desc,
                         tar_obj.absolute_description_id == tar_geo.abstraction_desc,
                         ref_geo.type == req.reference_object_geometry_type,
                         tar_geo.type == req.target_object_geometry_type )

        if req.min_range:
            query = query.filter(distance > req.min_range)

        if req.min_range:
            query = query.filter(distance < req.max_range)

        if req.sort_descending:
            query = query.order_by(desc(distance))
        else:
            query = query.order_by(distance)

        results = query.all()

        if req.return_points:
            for i, j, dist, points in results:
                pair = ObjectPair()
                pair.reference_id = i
                pair.target_id = j
                if req.max_distance:
                    pair.max_dist = dist
                    pair.max_dist_line[0] = toPoint3D(db().execute(
                        ST_PointN(points, 1)).scalar())
                    pair.max_dist_line[1] = toPoint3D(db().execute(
                        ST_PointN(points, 2)).scalar())
                else:
                    pair.min_dist = dist
                    pair.min_dist_line[0] = toPoint3D(db().execute(
                        ST_PointN(points, 1)).scalar())
                    pair.min_dist_line[1] = toPoint3D(db().execute(
                        ST_PointN(points, 2)).scalar())
                res.pairs.append(pair)
        else:
            for i, j, dist in results:
                pair = ObjectPair()
                pair.reference_id = i
                pair.target_id = j
                if req.max_distance:
                    pair.max_dist = dist
                else:
                    pair.min_dist = dist
                res.pairs.append(pair)

    return res