---
title: "PUT /v2/floorplans/{plan_id}/calculate-fov/"
method: PUT
path: "/v2/floorplans/{plan_id}/calculate-fov/"
tags: ["Floorplans"]
---

# PUT /v2/floorplans/{plan_id}/calculate-fov/

`PUT /v2/floorplans/{plan_id}/calculate-fov/`

## Request

- Base URL: `https://api.density.io`
- URL: `https://api.density.io/v2/floorplans/{plan_id}/calculate-fov/`
- Auth: API key in header `Authorization`

Given a plan id:
        1. Fetch the PlanSensors and WallSegments in that Plan
        2. Publish the PlanSensor to the sensor_fov service
        3. Validate the output, AKA clipped FOV polygon
        4. Save the new clipped FOV to PlanSensoe
        5. Publish a websocket message
        6. Make sure the

    Raises exections if Plan or PlanSensors do not exist, or if
    the resulting clipped FOV is invalid (as per shapely). Note that
    it's business as usual if there are no wall segments in this plan.

## Request body

- FloorPlanDetail
  - `id` integer
  - `floor` PlanFloorSerializerV2
    - `id` integer
    - `name` string, required
    - `parent_id` integer, nullable
    - `status` 'planning' | 'live'
  - `floor_id` integer, required
  - `image_key` string
  - `image_url` string, uri
  - `source_pdf_key` string, nullable
  - `source_pdf_page` integer, nullable
  - `source_pdf_url` string, uri
  - `image_width_pixels` integer
  - `image_height_pixels` integer
  - `image_pixels_per_meter` number, required
  - `origin_x_pixels` number
  - `origin_y_pixels` number
  - `origin_angle_degrees` number
  - `floorplan_cad_origin_x` number
  - `floorplan_cad_origin_y` number
  - `floorplan_cad_rotation_degrees` number
  - `measurement_point_a_x_pixels` number, nullable
  - `measurement_point_a_y_pixels` number, nullable
  - `measurement_point_b_x_pixels` number, nullable
  - `measurement_point_b_y_pixels` number, nullable
  - `measurement_computed_length_meters` number, nullable
  - `measurement_user_entered_length_inches` string, nullable
  - `measurement_user_entered_length_feet` string, nullable
  - `last_oa_sensor_index` integer
  - `last_entry_sensor_index` integer
  - `ceiling_raster_key` string, nullable
  - `ceiling_raster_url` string, uri
  - `ceiling_raster_floorplan_origin_x` number
  - `ceiling_raster_floorplan_origin_y` number
  - `ceiling_raster_floorplan_angle_degrees` number
  - `ceiling_raster_opacity_percent` integer
  - `ceiling_raster_notes` string
  - `ceiling_raster_min_height_limit_meters` number
  - `ceiling_raster_max_height_limit_meters` number
  - `point_cloud_transformation_matrix` object, nullable
  - `point_cloud_transformation_steps` object, nullable
  - `active_dxf_id` integer, nullable
  - `active_dxf_full_raster_url` string
  - `latest_dxf` string
  - `created_at` string, date-time
  - `updated_at` string, date-time

## Response `200`

Updated

- OptionalFloorPlanDetailSerializer
  - `id` integer
  - `floor` PlanFloorSerializerV2
    - `id` integer
    - `name` string, required
    - `parent_id` integer, nullable
    - `status` 'planning' | 'live'
  - `floor_id` integer, required
  - `image_key` string
  - `image_url` string, uri
  - `source_pdf_key` string, nullable
  - `source_pdf_page` integer, nullable
  - `source_pdf_url` string, uri
  - `image_width_pixels` integer
  - `image_height_pixels` integer
  - `image_pixels_per_meter` number
  - `origin_x_pixels` number
  - `origin_y_pixels` number
  - `origin_angle_degrees` number
  - `floorplan_cad_origin_x` number
  - `floorplan_cad_origin_y` number
  - `floorplan_cad_rotation_degrees` number
  - `measurement_point_a_x_pixels` number, nullable
  - `measurement_point_a_y_pixels` number, nullable
  - `measurement_point_b_x_pixels` number, nullable
  - `measurement_point_b_y_pixels` number, nullable
  - `measurement_computed_length_meters` number, nullable
  - `measurement_user_entered_length_inches` string, nullable
  - `measurement_user_entered_length_feet` string, nullable
  - `last_oa_sensor_index` integer
  - `last_entry_sensor_index` integer
  - `ceiling_raster_key` string, nullable
  - `ceiling_raster_url` string, uri
  - `ceiling_raster_floorplan_origin_x` number
  - `ceiling_raster_floorplan_origin_y` number
  - `ceiling_raster_floorplan_angle_degrees` number
  - `ceiling_raster_opacity_percent` integer
  - `ceiling_raster_notes` string
  - `ceiling_raster_min_height_limit_meters` number
  - `ceiling_raster_max_height_limit_meters` number
  - `point_cloud_transformation_matrix` object, nullable
  - `point_cloud_transformation_steps` object, nullable
  - `active_dxf_id` integer, nullable
  - `active_dxf_full_raster_url` string
  - `latest_dxf` string
  - `created_at` string, date-time
  - `updated_at` string, date-time

## Other responses

- `400`: Bad Request
- `403`: Forbidden

---

[API](https://skmtc.dev/density/apis/your-project-api.md) · [All operations](https://skmtc.dev/density/apis/your-project-api/llms.txt) · [OpenAPI document](https://skmtc.dev/density/apis/your-project-api/revisions/3c729bb581d5?raw)
