diff --git a/backend_py/primary/primary/routers/dev/router.py b/backend_py/primary/primary/routers/dev/router.py index 5e6782f90..fd54e124a 100644 --- a/backend_py/primary/primary/routers/dev/router.py +++ b/backend_py/primary/primary/routers/dev/router.py @@ -193,7 +193,7 @@ async def ri_surf( grid_service = await UserGrid3dService.create_async(authenticated_user, case_uuid) await grid_service.get_grid_geometry_async(ensemble_name, realization, grid_name, ijk_index_filter) await grid_service.get_mapped_grid_properties_async( - ensemble_name, realization, grid_name, property_name, ijk_index_filter + ensemble_name, realization, grid_name, property_name, None, ijk_index_filter ) return "OK" @@ -227,6 +227,8 @@ async def ri_isect( # fmt:on grid_service = await UserGrid3dService.create_async(authenticated_user, case_uuid) - await grid_service.get_polyline_intersection_async(ensemble_name, realization, grid_name, property_name, xy_arr) + await grid_service.get_polyline_intersection_async( + ensemble_name, realization, grid_name, property_name, None, xy_arr + ) return "OK" diff --git a/backend_py/primary/primary/routers/well/converters.py b/backend_py/primary/primary/routers/well/converters.py index 7cf25682c..f6d01f078 100644 --- a/backend_py/primary/primary/routers/well/converters.py +++ b/backend_py/primary/primary/routers/well/converters.py @@ -1,46 +1,143 @@ -from typing import List - -from primary.services.smda_access.types import WellborePick, StratigraphicUnit +from primary.services.smda_access.types import WellboreHeader, WellboreTrajectory, WellborePick, StratigraphicUnit +from primary.services.ssdl_access.types import ( + WellboreCasing, + WellboreCompletion, + WellboreLogCurveHeader, + WellborePerforation, + WellboreLogCurveData, +) from . import schemas -def convert_wellbore_picks_to_schema(wellbore_picks: List[WellborePick]) -> List[schemas.WellborePick]: - return [ - schemas.WellborePick( - northing=pick.northing, - easting=pick.easting, - tvd=pick.tvd, - tvdMsl=pick.tvd_msl, - md=pick.md, - mdMsl=pick.md_msl, - uniqueWellboreIdentifier=pick.unique_wellbore_identifier, - pickIdentifier=pick.pick_identifier, - confidence=pick.confidence, - depthReferencePoint=pick.depth_reference_point, - mdUnit=pick.md_unit, - ) - for pick in wellbore_picks - ] - - -def convert_stratigraphic_units_to_schema( - stratigraphic_units: List[StratigraphicUnit], -) -> List[schemas.StratigraphicUnit]: - return [ - schemas.StratigraphicUnit( - identifier=unit.identifier, - top=unit.top, - base=unit.base, - stratUnitLevel=unit.strat_unit_level, - stratUnitType=unit.strat_unit_type, - topAge=unit.top_age, - baseAge=unit.base_age, - stratUnitParent=unit.strat_unit_parent, - colorR=unit.color_r, - colorG=unit.color_g, - colorB=unit.color_b, - lithologyType=unit.lithology_type, - ) - for unit in stratigraphic_units - ] +def convert_wellbore_pick_to_schema(wellbore_pick: WellborePick) -> schemas.WellborePick: + return schemas.WellborePick( + northing=wellbore_pick.northing, + easting=wellbore_pick.easting, + tvd=wellbore_pick.tvd, + tvdMsl=wellbore_pick.tvd_msl, + md=wellbore_pick.md, + mdMsl=wellbore_pick.md_msl, + uniqueWellboreIdentifier=wellbore_pick.unique_wellbore_identifier, + pickIdentifier=wellbore_pick.pick_identifier, + confidence=wellbore_pick.confidence, + depthReferencePoint=wellbore_pick.depth_reference_point, + mdUnit=wellbore_pick.md_unit, + ) + + +def convert_stratigraphic_unit_to_schema( + stratigraphic_unit: StratigraphicUnit, +) -> schemas.StratigraphicUnit: + return schemas.StratigraphicUnit( + identifier=stratigraphic_unit.identifier, + top=stratigraphic_unit.top, + base=stratigraphic_unit.base, + stratUnitLevel=stratigraphic_unit.strat_unit_level, + stratUnitType=stratigraphic_unit.strat_unit_type, + topAge=stratigraphic_unit.top_age, + baseAge=stratigraphic_unit.base_age, + stratUnitParent=stratigraphic_unit.strat_unit_parent, + colorR=stratigraphic_unit.color_r, + colorG=stratigraphic_unit.color_g, + colorB=stratigraphic_unit.color_b, + lithologyType=stratigraphic_unit.lithology_type, + ) + + +def convert_wellbore_header_to_schema( + drilled_wellbore_header: WellboreHeader, +) -> schemas.WellboreHeader: + return schemas.WellboreHeader( + wellboreUuid=drilled_wellbore_header.wellbore_uuid, + uniqueWellboreIdentifier=drilled_wellbore_header.unique_wellbore_identifier, + wellUuid=drilled_wellbore_header.well_uuid, + uniqueWellIdentifier=drilled_wellbore_header.unique_well_identifier, + wellEasting=drilled_wellbore_header.well_easting, + wellNorthing=drilled_wellbore_header.well_northing, + depthReferencePoint=drilled_wellbore_header.depth_reference_point, + depthReferenceElevation=drilled_wellbore_header.depth_reference_elevation, + ) + + +def convert_well_trajectory_to_schema( + well_trajectory: WellboreTrajectory, +) -> schemas.WellboreTrajectory: + return schemas.WellboreTrajectory( + wellboreUuid=well_trajectory.wellbore_uuid, + uniqueWellboreIdentifier=well_trajectory.unique_wellbore_identifier, + tvdMslArr=well_trajectory.tvd_msl_arr, + mdArr=well_trajectory.md_arr, + eastingArr=well_trajectory.easting_arr, + northingArr=well_trajectory.northing_arr, + ) + + +def convert_wellbore_completion_to_schema( + wellbore_completion: WellboreCompletion, +) -> schemas.WellboreCompletion: + return schemas.WellboreCompletion( + mdTop=wellbore_completion.md_top, + mdBottom=wellbore_completion.md_bottom, + tvdTop=wellbore_completion.tvd_top, + tvdBottom=wellbore_completion.tvd_bottom, + description=wellbore_completion.description, + symbolName=wellbore_completion.symbol_name, + comment=wellbore_completion.comment, + ) + + +def convert_wellbore_casing_to_schema( + wellbore_casing: WellboreCasing, +) -> schemas.WellboreCasing: + return schemas.WellboreCasing( + itemType=wellbore_casing.item_type, + diameterNumeric=wellbore_casing.diameter_numeric, + diameterInner=wellbore_casing.diameter_inner, + description=wellbore_casing.description, + remark=wellbore_casing.remark, + depthTopMd=wellbore_casing.depth_top_md, + depthBottomMd=wellbore_casing.depth_bottom_md, + totalDepthMd=wellbore_casing.total_depth_md, + startDepth=wellbore_casing.start_depth, + endDepth=wellbore_casing.end_depth, + ) + + +def convert_wellbore_perforation_to_schema( + wellbore_perforation: WellborePerforation, +) -> schemas.WellborePerforation: + return schemas.WellborePerforation( + mdTop=wellbore_perforation.md_top, + mdBottom=wellbore_perforation.md_bottom, + tvdTop=wellbore_perforation.tvd_top, + tvdBottom=wellbore_perforation.tvd_bottom, + status=wellbore_perforation.status, + completionMode=wellbore_perforation.completion_mode, + ) + + +def convert_wellbore_log_curve_header_to_schema( + wellbore_log_curve_header: WellboreLogCurveHeader, +) -> schemas.WellboreLogCurveHeader: + return schemas.WellboreLogCurveHeader( + logName=wellbore_log_curve_header.log_name, + curveName=wellbore_log_curve_header.curve_name, + curveUnit=wellbore_log_curve_header.curve_unit, + ) + + +def convert_wellbore_log_curve_data_to_schema( + wellbore_log_curve_data: WellboreLogCurveData, +) -> schemas.WellboreLogCurveData: + return schemas.WellboreLogCurveData( + indexMin=wellbore_log_curve_data.index_min, + indexMax=wellbore_log_curve_data.index_max, + minCurveValue=wellbore_log_curve_data.min_curve_value, + maxCurveValue=wellbore_log_curve_data.max_curve_value, + dataPoints=wellbore_log_curve_data.DataPoints, + curveAlias=wellbore_log_curve_data.curve_alias, + curveDescription=wellbore_log_curve_data.curve_description, + indexUnit=wellbore_log_curve_data.index_unit, + noDataValue=wellbore_log_curve_data.no_data_value, + ) diff --git a/backend_py/primary/primary/routers/well/router.py b/backend_py/primary/primary/routers/well/router.py index d0faadf6d..2fb2d8cb6 100644 --- a/backend_py/primary/primary/routers/well/router.py +++ b/backend_py/primary/primary/routers/well/router.py @@ -44,9 +44,7 @@ async def get_drilled_wellbore_headers( wellbore_headers = await well_access.get_wellbore_headers(field_identifier=field_identifier) - ret_arr = [schemas.WellboreHeader(**wellbore_header) for wellbore_header in wellbore_headers] - - return ret_arr + return [converters.convert_wellbore_header_to_schema(wellbore_header) for wellbore_header in wellbore_headers] @router.get("/field_well_trajectories/") @@ -71,9 +69,10 @@ async def get_field_well_trajectories( field_identifier=field_identifier, unique_wellbore_identifiers=unique_wellbore_identifiers ) - ret_arr = [schemas.WellboreTrajectory(**wellbore_trajectory) for wellbore_trajectory in wellbore_trajectories] - - return ret_arr + return [ + converters.convert_well_trajectory_to_schema(wellbore_trajectory) + for wellbore_trajectory in wellbore_trajectories + ] @router.get("/well_trajectories/") @@ -94,9 +93,10 @@ async def get_well_trajectories( wellbore_trajectories = await well_access.get_wellbore_trajectories(wellbore_uuids=wellbore_uuids) - ret_arr = [schemas.WellboreTrajectory(**wellbore_trajectory) for wellbore_trajectory in wellbore_trajectories] - - return ret_arr + return [ + converters.convert_well_trajectory_to_schema(wellbore_trajectory) + for wellbore_trajectory in wellbore_trajectories + ] @router.get("/wellbore_picks_and_stratigraphic_units/") @@ -128,8 +128,11 @@ async def get_wellbore_picks_and_stratigraphic_units( wellbore_picks = await well_access.get_all_picks_for_wellbore(wellbore_uuid=wellbore_uuid) return schemas.WellborePicksAndStratigraphicUnits( - wellbore_picks=converters.convert_wellbore_picks_to_schema(wellbore_picks), - stratigraphic_units=converters.convert_stratigraphic_units_to_schema(stratigraphic_units), + wellbore_picks=[converters.convert_wellbore_pick_to_schema(wellbore_pick) for wellbore_pick in wellbore_picks], + stratigraphic_units=[ + converters.convert_stratigraphic_unit_to_schema(stratigraphic_unit) + for stratigraphic_unit in stratigraphic_units + ], ) @@ -149,17 +152,20 @@ async def get_wellbore_completions( well_access = SsdlWellAccess(authenticated_user.get_ssdl_access_token()) wellbore_completions = await well_access.get_completions_for_wellbore(wellbore_uuid=wellbore_uuid) - return wellbore_completions + return [ + converters.convert_wellbore_completion_to_schema(wellbore_completion) + for wellbore_completion in wellbore_completions + ] -@router.get("/wellbore_casing/") -async def get_wellbore_casing( +@router.get("/wellbore_casings/") +async def get_wellbore_casings( # fmt:off authenticated_user: AuthenticatedUser = Depends(AuthHelper.get_authenticated_user), wellbore_uuid: str = Query(description="Wellbore uuid"), # fmt:on ) -> List[schemas.WellboreCasing]: - """Get well bore casing for a single well bore""" + """Get well bore casings for a single well bore""" # Handle DROGON if wellbore_uuid in ["drogon_horizontal", "drogon_vertical"]: @@ -167,9 +173,9 @@ async def get_wellbore_casing( well_access = SsdlWellAccess(authenticated_user.get_ssdl_access_token()) - wellbore_casing = await well_access.get_casing_for_wellbore(wellbore_uuid=wellbore_uuid) + wellbore_casings = await well_access.get_casings_for_wellbore(wellbore_uuid=wellbore_uuid) - return wellbore_casing + return [converters.convert_wellbore_casing_to_schema(wellbore_casing) for wellbore_casing in wellbore_casings] @router.get("/wellbore_perforations/") @@ -189,7 +195,10 @@ async def get_wellbore_perforations( wellbore_perforations = await well_access.get_perforations_for_wellbore(wellbore_uuid=wellbore_uuid) - return wellbore_perforations + return [ + converters.convert_wellbore_perforation_to_schema(wellbore_perforation) + for wellbore_perforation in wellbore_perforations + ] @router.get("/wellbore_log_curve_headers/") @@ -198,7 +207,7 @@ async def get_wellbore_log_curve_headers( authenticated_user: AuthenticatedUser = Depends(AuthHelper.get_authenticated_user), wellbore_uuid: str = Query(description="Wellbore uuid"), # fmt:on -) -> List[schemas.WellboreLogCurveInfo]: +) -> List[schemas.WellboreLogCurveHeader]: """Get all log curve headers for a single well bore""" # Handle DROGON @@ -207,9 +216,12 @@ async def get_wellbore_log_curve_headers( well_access = SsdlWellAccess(authenticated_user.get_ssdl_access_token()) - wellbore_casing = await well_access.get_log_curve_headers_for_wellbore(wellbore_uuid=wellbore_uuid) + wellbore_log_curve_headers = await well_access.get_log_curve_headers_for_wellbore(wellbore_uuid=wellbore_uuid) - return wellbore_casing + return [ + converters.convert_wellbore_log_curve_header_to_schema(wellbore_log_curve_header) + for wellbore_log_curve_header in wellbore_log_curve_headers + ] @router.get("/log_curve_data/") @@ -224,10 +236,10 @@ async def get_log_curve_data( # Handle DROGON if wellbore_uuid in ["drogon_horizontal", "drogon_vertical"]: - return [] + raise NotImplementedError("DROGON log curve data not implemented") well_access = SsdlWellAccess(authenticated_user.get_ssdl_access_token()) log_curve = await well_access.get_log_curve_data(wellbore_uuid=wellbore_uuid, curve_name=log_curve_name) - return log_curve + return converters.convert_wellbore_log_curve_data_to_schema(log_curve) diff --git a/backend_py/primary/primary/routers/well/schemas.py b/backend_py/primary/primary/routers/well/schemas.py index 3ee87509b..8427292d0 100644 --- a/backend_py/primary/primary/routers/well/schemas.py +++ b/backend_py/primary/primary/routers/well/schemas.py @@ -24,23 +24,23 @@ class StratigraphicUnit(BaseModel): class WellboreHeader(BaseModel): - wellbore_uuid: str - unique_wellbore_identifier: str - well_uuid: str - unique_well_identifier: str - well_easting: float - well_northing: float - depth_reference_point: str - depth_reference_elevation: float + wellboreUuid: str + uniqueWellboreIdentifier: str + wellUuid: str + uniqueWellIdentifier: str + wellEasting: float + wellNorthing: float + depthReferencePoint: str + depthReferenceElevation: float class WellboreTrajectory(BaseModel): - wellbore_uuid: str - unique_wellbore_identifier: str - tvd_msl_arr: List[float] - md_arr: List[float] - easting_arr: List[float] - northing_arr: List[float] + wellboreUuid: str + uniqueWellboreIdentifier: str + tvdMslArr: List[float] + mdArr: List[float] + eastingArr: List[float] + northingArr: List[float] class WellborePick(BaseModel): @@ -69,50 +69,50 @@ class WellborePicksAndStratigraphicUnits(BaseModel): class WellboreCompletion(BaseModel): - md_top: float - md_bottom: float - tvd_top: float | None - tvd_bottom: float | None + mdTop: float + mdBottom: float + tvdTop: float | None + tvdBottom: float | None description: str | None - symbol_name: str | None + symbolName: str | None comment: str | None class WellboreCasing(BaseModel): - item_type: str # Casing type - diameter_numeric: float - diameter_inner: float + itemType: str # Casing type + diameterNumeric: float + diameterInner: float description: str | None = None remark: str | None = None - depth_top_md: float - depth_bottom_md: float - total_depth_md: float - start_depth: float - end_depth: float + depthTopMd: float + depthBottomMd: float + totalDepthMd: float + startDepth: float + endDepth: float class WellborePerforation(BaseModel): - md_top: float - md_bottom: float - tvd_top: float - tvd_bottom: float + mdTop: float + mdBottom: float + tvdTop: float + tvdBottom: float status: str - completion_mode: str + completionMode: str -class WellboreLogCurveInfo(BaseModel): - log_name: str - curve_name: str - curve_unit: str +class WellboreLogCurveHeader(BaseModel): + logName: str + curveName: str + curveUnit: str class WellboreLogCurveData(BaseModel): - index_min: float - index_max: float - min_curve_value: float - max_curve_value: float - DataPoints: list[list[float | None]] - curve_alias: str - curve_description: str - index_unit: str - no_data_value: float + indexMin: float + indexMax: float + minCurveValue: float + maxCurveValue: float + dataPoints: list[list[float | None]] + curveAlias: str + curveDescription: str + indexUnit: str + noDataValue: float diff --git a/backend_py/primary/primary/services/ssdl_access/schemas.py b/backend_py/primary/primary/services/ssdl_access/types.py similarity index 94% rename from backend_py/primary/primary/services/ssdl_access/schemas.py rename to backend_py/primary/primary/services/ssdl_access/types.py index 64ba29d0b..7e0660d94 100644 --- a/backend_py/primary/primary/services/ssdl_access/schemas.py +++ b/backend_py/primary/primary/services/ssdl_access/types.py @@ -33,7 +33,7 @@ class WellborePerforation(BaseModel): completion_mode: str -class WellboreLogCurveInfo(BaseModel): +class WellboreLogCurveHeader(BaseModel): log_name: str curve_name: str curve_unit: str @@ -41,7 +41,7 @@ class WellboreLogCurveInfo(BaseModel): class WellboreLogCurveData(BaseModel): index_min: float - index_max: str + index_max: float min_curve_value: float max_curve_value: float DataPoints: list[list[float | None]] diff --git a/backend_py/primary/primary/services/ssdl_access/well_access.py b/backend_py/primary/primary/services/ssdl_access/well_access.py index 9566a1043..acdb4542f 100644 --- a/backend_py/primary/primary/services/ssdl_access/well_access.py +++ b/backend_py/primary/primary/services/ssdl_access/well_access.py @@ -6,71 +6,71 @@ ) from ._ssdl_get_request import fetch_from_ssdl -from . import schemas +from . import types class WellAccess: def __init__(self, access_token: str): self._ssdl_token = access_token - async def get_completions_for_wellbore(self, wellbore_uuid: str) -> List[schemas.WellboreCompletion]: + async def get_completions_for_wellbore(self, wellbore_uuid: str) -> List[types.WellboreCompletion]: endpoint = f"Wellbores/{wellbore_uuid}/completion" params = {"normalized_data": True} ssdl_data = await fetch_from_ssdl(access_token=self._ssdl_token, endpoint=endpoint, params=params) try: - result = [schemas.WellboreCompletion.model_validate(casing) for casing in ssdl_data] + result = [types.WellboreCompletion.model_validate(casing) for casing in ssdl_data] except ValidationError as error: raise InvalidDataError( f"Invalid completion data for wellbore {wellbore_uuid} {error}", Service.SSDL ) from error return result - async def get_casing_for_wellbore(self, wellbore_uuid: str) -> List[schemas.WellboreCasing]: + async def get_casings_for_wellbore(self, wellbore_uuid: str) -> List[types.WellboreCasing]: endpoint = f"Wellbores/{wellbore_uuid}/casing" params = {"source": "dbr"} ssdl_data = await fetch_from_ssdl(access_token=self._ssdl_token, endpoint=endpoint, params=params) try: - result = [schemas.WellboreCasing.model_validate(casing) for casing in ssdl_data] + result = [types.WellboreCasing.model_validate(casing) for casing in ssdl_data] except ValidationError as error: raise InvalidDataError(f"Invalid casing data for wellbore {wellbore_uuid}", Service.SSDL) from error return result - async def get_perforations_for_wellbore(self, wellbore_uuid: str) -> List[schemas.WellborePerforation]: + async def get_perforations_for_wellbore(self, wellbore_uuid: str) -> List[types.WellborePerforation]: endpoint = f"Wellbores/{wellbore_uuid}/perforations" params = {"normalized-data": False, "details": True} ssdl_data = await fetch_from_ssdl(access_token=self._ssdl_token, endpoint=endpoint, params=params) try: - result = [schemas.WellborePerforation.model_validate(casing) for casing in ssdl_data] + result = [types.WellborePerforation.model_validate(casing) for casing in ssdl_data] except ValidationError as error: raise InvalidDataError(f"Invalid casing data for wellbore {wellbore_uuid}", Service.SSDL) from error return result - async def get_log_curve_headers_for_wellbore(self, wellbore_uuid: str) -> List[schemas.WellboreLogCurveInfo]: + async def get_log_curve_headers_for_wellbore(self, wellbore_uuid: str) -> List[types.WellboreLogCurveHeader]: endpoint = f"WellLog/{wellbore_uuid}" ssdl_data = await fetch_from_ssdl(access_token=self._ssdl_token, endpoint=endpoint, params=None) try: - result = [schemas.WellboreLogCurveInfo.model_validate(log_curve) for log_curve in ssdl_data] + result = [types.WellboreLogCurveHeader.model_validate(log_curve) for log_curve in ssdl_data] except ValidationError as error: raise InvalidDataError(f"Invalid log curve headers for wellbore {wellbore_uuid}", Service.SSDL) from error return result - async def get_log_curve_headers_for_field(self, field_uuid: str) -> List[schemas.WellboreLogCurveInfo]: + async def get_log_curve_headers_for_field(self, field_uuid: str) -> List[types.WellboreLogCurveHeader]: endpoint = f"WellLog/field/{field_uuid}" ssdl_data = await fetch_from_ssdl(access_token=self._ssdl_token, endpoint=endpoint, params=None) try: - result = [schemas.WellboreLogCurveInfo.model_validate(log_curve) for log_curve in ssdl_data] + result = [types.WellboreLogCurveHeader.model_validate(log_curve) for log_curve in ssdl_data] except ValidationError as error: raise InvalidDataError(f"Invalid log curve headers for field {field_uuid}", Service.SSDL) from error return result - async def get_log_curve_data(self, wellbore_uuid: str, curve_name: str) -> schemas.WellboreLogCurveData: + async def get_log_curve_data(self, wellbore_uuid: str, curve_name: str) -> types.WellboreLogCurveData: params = {"normalized_data": False} endpoint = f"WellLog/{wellbore_uuid}/{curve_name}" ssdl_data = await fetch_from_ssdl(access_token=self._ssdl_token, endpoint=endpoint, params=params) try: - result = schemas.WellboreLogCurveData.model_validate(ssdl_data) + result = types.WellboreLogCurveData.model_validate(ssdl_data) except ValidationError as error: raise InvalidDataError( f"Invalid log curve data for wellbore {wellbore_uuid} and curve {curve_name}", Service.SSDL diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 46f419993..fb7ba6e3f 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -82,7 +82,7 @@ export type { WellboreCasing as WellboreCasing_api } from './models/WellboreCasi export type { WellboreCompletion as WellboreCompletion_api } from './models/WellboreCompletion'; export type { WellboreHeader as WellboreHeader_api } from './models/WellboreHeader'; export type { WellboreLogCurveData as WellboreLogCurveData_api } from './models/WellboreLogCurveData'; -export type { WellboreLogCurveInfo as WellboreLogCurveInfo_api } from './models/WellboreLogCurveInfo'; +export type { WellboreLogCurveHeader as WellboreLogCurveHeader_api } from './models/WellboreLogCurveHeader'; export type { WellborePerforation as WellborePerforation_api } from './models/WellborePerforation'; export type { WellborePick as WellborePick_api } from './models/WellborePick'; export type { WellborePicksAndStratigraphicUnits as WellborePicksAndStratigraphicUnits_api } from './models/WellborePicksAndStratigraphicUnits'; diff --git a/frontend/src/api/models/WellboreCasing.ts b/frontend/src/api/models/WellboreCasing.ts index 3e5e87295..9c7e693ef 100644 --- a/frontend/src/api/models/WellboreCasing.ts +++ b/frontend/src/api/models/WellboreCasing.ts @@ -3,15 +3,15 @@ /* tslint:disable */ /* eslint-disable */ export type WellboreCasing = { - item_type: string; - diameter_numeric: number; - diameter_inner: number; + itemType: string; + diameterNumeric: number; + diameterInner: number; description: (string | null); remark: (string | null); - depth_top_md: number; - depth_bottom_md: number; - total_depth_md: number; - start_depth: number; + depthTopMd: number; + depthBottomMd: number; + totalDepthMd: number; + startDepth: number; end_depth: number; }; diff --git a/frontend/src/api/models/WellboreCompletion.ts b/frontend/src/api/models/WellboreCompletion.ts index 12371e879..99b4553b1 100644 --- a/frontend/src/api/models/WellboreCompletion.ts +++ b/frontend/src/api/models/WellboreCompletion.ts @@ -3,12 +3,12 @@ /* tslint:disable */ /* eslint-disable */ export type WellboreCompletion = { - md_top: number; - md_bottom: number; - tvd_top: (number | null); - tvd_bottom: (number | null); + mdTop: number; + mdBottom: number; + tvdTop: (number | null); + tvdBottom: (number | null); description: (string | null); - symbol_name: (string | null); + symbolName: (string | null); comment: (string | null); }; diff --git a/frontend/src/api/models/WellboreHeader.ts b/frontend/src/api/models/WellboreHeader.ts index c23872006..adcabe04a 100644 --- a/frontend/src/api/models/WellboreHeader.ts +++ b/frontend/src/api/models/WellboreHeader.ts @@ -3,13 +3,13 @@ /* tslint:disable */ /* eslint-disable */ export type WellboreHeader = { - wellbore_uuid: string; - unique_wellbore_identifier: string; - well_uuid: string; - unique_well_identifier: string; - well_easting: number; - well_northing: number; - depth_reference_point: string; - depth_reference_elevation: number; + wellboreUuid: string; + uniqueWellboreIdentifier: string; + wellUuid: string; + uniqueWellIdentifier: string; + wellEasting: number; + wellNorthing: number; + depthReferencePoint: string; + depthReferenceElevation: number; }; diff --git a/frontend/src/api/models/WellboreLogCurveData.ts b/frontend/src/api/models/WellboreLogCurveData.ts index ec9374e2a..a7137630f 100644 --- a/frontend/src/api/models/WellboreLogCurveData.ts +++ b/frontend/src/api/models/WellboreLogCurveData.ts @@ -3,14 +3,14 @@ /* tslint:disable */ /* eslint-disable */ export type WellboreLogCurveData = { - index_min: number; - index_max: number; - min_curve_value: number; - max_curve_value: number; + indexMin: number; + indexMax: number; + minCurveValue: number; + maxCurveValue: number; DataPoints: Array>; - curve_alias: string; - curve_description: string; - index_unit: string; - no_data_value: number; + curveAlias: string; + curveDescription: string; + indexUnit: string; + noDataValue: number; }; diff --git a/frontend/src/api/models/WellboreLogCurveInfo.ts b/frontend/src/api/models/WellboreLogCurveHeader.ts similarity index 55% rename from frontend/src/api/models/WellboreLogCurveInfo.ts rename to frontend/src/api/models/WellboreLogCurveHeader.ts index 286b597da..12049f97e 100644 --- a/frontend/src/api/models/WellboreLogCurveInfo.ts +++ b/frontend/src/api/models/WellboreLogCurveHeader.ts @@ -2,9 +2,9 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type WellboreLogCurveInfo = { - log_name: string; - curve_name: string; - curve_unit: string; +export type WellboreLogCurveHeader = { + logName: string; + curveName: string; + curveUnit: string; }; diff --git a/frontend/src/api/models/WellborePerforation.ts b/frontend/src/api/models/WellborePerforation.ts index 21433bafa..780c421da 100644 --- a/frontend/src/api/models/WellborePerforation.ts +++ b/frontend/src/api/models/WellborePerforation.ts @@ -3,11 +3,11 @@ /* tslint:disable */ /* eslint-disable */ export type WellborePerforation = { - md_top: number; - md_bottom: number; - tvd_top: number; - tvd_bottom: number; + mdTop: number; + mdBottom: number; + tvdTop: number; + tvdBottom: number; status: string; - completion_mode: string; + completionMode: string; }; diff --git a/frontend/src/api/models/WellboreTrajectory.ts b/frontend/src/api/models/WellboreTrajectory.ts index 655dfa8fb..70aa8f7b3 100644 --- a/frontend/src/api/models/WellboreTrajectory.ts +++ b/frontend/src/api/models/WellboreTrajectory.ts @@ -3,11 +3,11 @@ /* tslint:disable */ /* eslint-disable */ export type WellboreTrajectory = { - wellbore_uuid: string; - unique_wellbore_identifier: string; - tvd_msl_arr: Array; - md_arr: Array; - easting_arr: Array; - northing_arr: Array; + wellboreUuid: string; + uniqueWellboreIdentifier: string; + tvdMslArr: Array; + mdArr: Array; + eastingArr: Array; + northingArr: Array; }; diff --git a/frontend/src/api/services/WellService.ts b/frontend/src/api/services/WellService.ts index 818fd7593..b3be5892c 100644 --- a/frontend/src/api/services/WellService.ts +++ b/frontend/src/api/services/WellService.ts @@ -6,7 +6,7 @@ import type { WellboreCasing } from '../models/WellboreCasing'; import type { WellboreCompletion } from '../models/WellboreCompletion'; import type { WellboreHeader } from '../models/WellboreHeader'; import type { WellboreLogCurveData } from '../models/WellboreLogCurveData'; -import type { WellboreLogCurveInfo } from '../models/WellboreLogCurveInfo'; +import type { WellboreLogCurveHeader } from '../models/WellboreLogCurveHeader'; import type { WellborePerforation } from '../models/WellborePerforation'; import type { WellborePicksAndStratigraphicUnits } from '../models/WellborePicksAndStratigraphicUnits'; import type { WellboreTrajectory } from '../models/WellboreTrajectory'; @@ -126,18 +126,18 @@ export class WellService { }); } /** - * Get Wellbore Casing - * Get well bore casing for a single well bore + * Get Wellbore Casings + * Get well bore casings for a single well bore * @param wellboreUuid Wellbore uuid * @returns WellboreCasing Successful Response * @throws ApiError */ - public getWellboreCasing( + public getWellboreCasings( wellboreUuid: string, ): CancelablePromise> { return this.httpRequest.request({ method: 'GET', - url: '/well/wellbore_casing/', + url: '/well/wellbore_casings/', query: { 'wellbore_uuid': wellboreUuid, }, @@ -171,12 +171,12 @@ export class WellService { * Get Wellbore Log Curve Headers * Get all log curve headers for a single well bore * @param wellboreUuid Wellbore uuid - * @returns WellboreLogCurveInfo Successful Response + * @returns WellboreLogCurveHeader Successful Response * @throws ApiError */ public getWellboreLogCurveHeaders( wellboreUuid: string, - ): CancelablePromise> { + ): CancelablePromise> { return this.httpRequest.request({ method: 'GET', url: '/well/wellbore_log_curve_headers/', diff --git a/frontend/src/framework/components/EsvIntersection/esvIntersection.tsx b/frontend/src/framework/components/EsvIntersection/esvIntersection.tsx index 56cbcf52b..eefa361b3 100644 --- a/frontend/src/framework/components/EsvIntersection/esvIntersection.tsx +++ b/frontend/src/framework/components/EsvIntersection/esvIntersection.tsx @@ -326,6 +326,11 @@ export function EsvIntersection(props: EsvIntersectionProps): React.ReactNode { let newLayerIds = layerIds; automaticChanges.current = true; + // Remove pixi render layer fixup + if (esvController.getLayer("pixi-render")) { + esvController.removeLayer("pixi-render"); + } + // Remove layers that are not in the new list if (prevLayers) { for (const layer of prevLayers) { @@ -362,6 +367,8 @@ export function EsvIntersection(props: EsvIntersectionProps): React.ReactNode { if (layer.options.order !== undefined) { existingLayer.order = layer.options.order + 1; } + existingLayer?.element?.setAttribute("width", containerSize.width.toString()); + existingLayer?.element?.setAttribute("height", containerSize.height.toString()); interactionHandler.removeLayer(layer.id); if (layer.hoverable) { interactionHandler.addLayer(existingLayer); @@ -371,6 +378,12 @@ export function EsvIntersection(props: EsvIntersectionProps): React.ReactNode { } } + // Add pixi render layer fixup + if (!esvController.getLayer("pixi-render")) { + const newLayer = new GeomodelLayerV2(pixiRenderApplication, "pixi-render"); + esvController.addLayer(newLayer); + } + setLayerIds(newLayerIds); setPrevLayers(cloneDeep(props.layers)); } @@ -394,7 +407,7 @@ export function EsvIntersection(props: EsvIntersectionProps): React.ReactNode { const oldOnRescaleFunction = newEsvController.zoomPanHandler.onRescale; newEsvController.zoomPanHandler.onRescale = function handleRescale(event: OnRescaleEvent) { - if (onViewportChange && !automaticChanges.current) { + if (!automaticChanges.current) { const k = event.transform.k; const xSpan = newEsvController.zoomPanHandler.xSpan; const displ = xSpan / k; @@ -433,6 +446,14 @@ export function EsvIntersection(props: EsvIntersectionProps): React.ReactNode { setEsvController(newEsvController); setPixiRenderApplication(newPixiRenderApplication); + const newInteractionHandler = new InteractionHandler(newEsvController, containerRef.current, { + intersectionOptions: { + threshold: props.intersectionThreshold ?? 10, + }, + }); + + setInteractionHandler(newInteractionHandler); + return function handleUnmount() { setEsvController(null); setLayerIds([]); @@ -444,26 +465,21 @@ export function EsvIntersection(props: EsvIntersectionProps): React.ReactNode { setPrevViewport(undefined); setPrevShowAxesLabels(undefined); setPrevShowAxes(undefined); - newPixiRenderApplication.destroy(); + setInteractionHandler(null); + newInteractionHandler.destroy(); newEsvController.removeAllLayers(); newEsvController.destroy(); }; }, - [onViewportChange, props.intersectionThreshold] + [props.intersectionThreshold] ); React.useEffect( function handleReadoutFunctionChange() { - if (!esvController || !containerRef.current) { + if (!interactionHandler) { return; } - const newInteractionHandler = new InteractionHandler(esvController, containerRef.current, { - intersectionOptions: { - threshold: props.intersectionThreshold ?? 10, - }, - }); - function handleReadoutItemsChange( payload: InteractionHandlerTopicPayload[InteractionHandlerTopic.READOUT_ITEMS_CHANGE] ) { @@ -472,18 +488,16 @@ export function EsvIntersection(props: EsvIntersectionProps): React.ReactNode { } } - newInteractionHandler.subscribe(InteractionHandlerTopic.READOUT_ITEMS_CHANGE, handleReadoutItemsChange); - - setInteractionHandler(newInteractionHandler); + const unsubscribe = interactionHandler.subscribe( + InteractionHandlerTopic.READOUT_ITEMS_CHANGE, + handleReadoutItemsChange + ); - return function handleUnmount() { - setInteractionHandler(null); - newInteractionHandler.destroy(); - setLayerIds([]); - setPrevLayers([]); + return function handleRemoveReadoutFunction() { + unsubscribe(); }; }, - [onReadout, props.intersectionThreshold, esvController] + [onReadout, interactionHandler] ); React.useEffect( @@ -508,24 +522,12 @@ export function EsvIntersection(props: EsvIntersectionProps): React.ReactNode { pixiRenderApplication.renderer.resize(size.width, size.height); pixiRenderApplication.render(); } - for (const layerId of layerIds ?? []) { - const layer = esvController.getLayer(layerId); - layer?.element?.setAttribute("width", size.width.toString()); - layer?.element?.setAttribute("height", size.height.toString()); - } const gridLayer = esvController.getLayer("grid"); gridLayer?.element?.setAttribute("width", size.width.toString()); gridLayer?.element?.setAttribute("height", size.height.toString()); } }, - [ - props.intersectionReferenceSystem, - containerSize.width, - containerSize.height, - esvController, - pixiRenderApplication, - layerIds, - ] + [containerSize.width, containerSize.height, esvController, pixiRenderApplication] ); return ( diff --git a/frontend/src/framework/components/EsvIntersection/interaction/HighlightOverlay.ts b/frontend/src/framework/components/EsvIntersection/interaction/HighlightOverlay.ts index d02b3915f..5fcc040d0 100644 --- a/frontend/src/framework/components/EsvIntersection/interaction/HighlightOverlay.ts +++ b/frontend/src/framework/components/EsvIntersection/interaction/HighlightOverlay.ts @@ -152,6 +152,9 @@ export class HighlightOverlay { destroy() { this.removeEventHandlers(); + if (this._indicatorOverlay.parentElement) { + this._indicatorOverlay.parentElement.removeChild(this._indicatorOverlay); + } this._controller.overlay.remove("indicator-overlay"); } diff --git a/frontend/src/framework/components/EsvIntersection/interaction/IntersectionHandler.ts b/frontend/src/framework/components/EsvIntersection/interaction/IntersectionHandler.ts index 678eae955..cee1709ed 100644 --- a/frontend/src/framework/components/EsvIntersection/interaction/IntersectionHandler.ts +++ b/frontend/src/framework/components/EsvIntersection/interaction/IntersectionHandler.ts @@ -30,12 +30,13 @@ export class IntersectionHandler { private _intersectionCalculators: Map = new Map(); private _subscribers: Map void>> = new Map(); private _previousIntersections: Intersection[] = []; + private _overlay: HTMLElement; constructor(controller: Controller, options?: IntersectionHandlerOptions) { this._controller = controller; this._options = options || { threshold: 10 }; - this.makeOverlay(); + this._overlay = this.makeOverlay(); } addIntersectionItem(intersectionItem: IntersectionItem) { @@ -72,10 +73,13 @@ export class IntersectionHandler { } destroy() { + if (this._overlay.parentElement) { + this._overlay.parentElement.removeChild(this._overlay); + } this._controller.overlay.remove("intersection-overlay"); } - private makeOverlay() { + private makeOverlay(): HTMLElement { const overlay = this._controller.overlay.create("intersection-overlay", { onMouseMove: this.handleMouseMove.bind(this), onMouseExit: this.handleMouseExit.bind(this), @@ -90,6 +94,8 @@ export class IntersectionHandler { overlay.style.pointerEvents = "none"; overlay.style.visibility = "hidden"; overlay.style.zIndex = "100"; + + return overlay; } private calcMd(point: number[]): number { diff --git a/frontend/src/modules/3DViewer/settings/atoms/derivedAtoms.ts b/frontend/src/modules/3DViewer/settings/atoms/derivedAtoms.ts index 80314e6cb..af39bf4f3 100644 --- a/frontend/src/modules/3DViewer/settings/atoms/derivedAtoms.ts +++ b/frontend/src/modules/3DViewer/settings/atoms/derivedAtoms.ts @@ -55,7 +55,7 @@ export const selectedWellboreUuidsAtom = atom((get) => { return []; } - return userSelectedWellboreUuids.filter((uuid) => wellboreHeaders.data.some((el) => el.wellbore_uuid === uuid)); + return userSelectedWellboreUuids.filter((uuid) => wellboreHeaders.data.some((el) => el.wellboreUuid === uuid)); }); export const selectedGridModelNameAtom = atom((get) => { const gridModelInfos = get(gridModelInfosQueryAtom); diff --git a/frontend/src/modules/3DViewer/settings/components/wellboreSelector.tsx b/frontend/src/modules/3DViewer/settings/components/wellboreSelector.tsx index acd65ab17..c3ad69d3c 100644 --- a/frontend/src/modules/3DViewer/settings/components/wellboreSelector.tsx +++ b/frontend/src/modules/3DViewer/settings/components/wellboreSelector.tsx @@ -13,7 +13,7 @@ export type WellboreSelectorProps = { export function WellboreSelector(props: WellboreSelectorProps): React.ReactNode { function handleSelectAll() { - props.onSelectedWellboreUuidsChange(props.wellboreHeaders.map((header) => header.wellbore_uuid)); + props.onSelectedWellboreUuidsChange(props.wellboreHeaders.map((header) => header.wellboreUuid)); } function handleUnselectAll() { props.onSelectedWellboreUuidsChange([]); @@ -54,7 +54,7 @@ export function WellboreSelector(props: WellboreSelectorProps): React.ReactNode } function makeWellHeadersOptions(wellHeaders: WellboreHeader_api[]): SelectOption[] { return wellHeaders.map((wellHeader) => ({ - label: wellHeader.unique_wellbore_identifier, - value: wellHeader.wellbore_uuid, + label: wellHeader.uniqueWellboreIdentifier, + value: wellHeader.wellboreUuid, })); } diff --git a/frontend/src/modules/3DViewer/settings/settings.tsx b/frontend/src/modules/3DViewer/settings/settings.tsx index a520b9e1d..e0494df08 100644 --- a/frontend/src/modules/3DViewer/settings/settings.tsx +++ b/frontend/src/modules/3DViewer/settings/settings.tsx @@ -510,8 +510,8 @@ function makeGridParameterDateOrIntervalOptions(datesOrIntervals: (string | null function makeWellHeaderOptions(wellHeaders: WellboreHeader_api[]): SelectOption[] { return wellHeaders.map((wellHeader) => ({ - value: wellHeader.wellbore_uuid, - label: wellHeader.unique_wellbore_identifier, + value: wellHeader.wellboreUuid, + label: wellHeader.uniqueWellboreIdentifier, })); } diff --git a/frontend/src/modules/3DViewer/sharedAtoms/sharedAtoms.ts b/frontend/src/modules/3DViewer/sharedAtoms/sharedAtoms.ts index 4192da3f3..35224d922 100644 --- a/frontend/src/modules/3DViewer/sharedAtoms/sharedAtoms.ts +++ b/frontend/src/modules/3DViewer/sharedAtoms/sharedAtoms.ts @@ -33,9 +33,9 @@ export const selectedHighlightedWellboreUuidAtom = atom((get) => { if ( !userSelectedHighlightedWellboreUuid || - !wellboreHeaders.data.some((el) => el.wellbore_uuid === userSelectedHighlightedWellboreUuid) + !wellboreHeaders.data.some((el) => el.wellboreUuid === userSelectedHighlightedWellboreUuid) ) { - return wellboreHeaders.data[0].wellbore_uuid ?? null; + return wellboreHeaders.data[0].wellboreUuid ?? null; } return userSelectedHighlightedWellboreUuid; diff --git a/frontend/src/modules/3DViewer/view/atoms/derivedAtoms.ts b/frontend/src/modules/3DViewer/view/atoms/derivedAtoms.ts index fb6baa358..ba6b98cb7 100644 --- a/frontend/src/modules/3DViewer/view/atoms/derivedAtoms.ts +++ b/frontend/src/modules/3DViewer/view/atoms/derivedAtoms.ts @@ -34,18 +34,18 @@ export const intersectionReferenceSystemAtom = atom((get) => { } const wellboreTrajectory = fieldWellboreTrajectories.data.find( - (wellbore) => wellbore.wellbore_uuid === wellboreUuid + (wellbore) => wellbore.wellboreUuid === wellboreUuid ); if (wellboreTrajectory) { const path: number[][] = []; - for (const [index, northing] of wellboreTrajectory.northing_arr.entries()) { - const easting = wellboreTrajectory.easting_arr[index]; - const tvd_msl = wellboreTrajectory.tvd_msl_arr[index]; + for (const [index, northing] of wellboreTrajectory.northingArr.entries()) { + const easting = wellboreTrajectory.eastingArr[index]; + const tvd_msl = wellboreTrajectory.tvdMslArr[index]; path.push([easting, northing, tvd_msl]); } - const offset = wellboreTrajectory.tvd_msl_arr[0]; + const offset = wellboreTrajectory.tvdMslArr[0]; const referenceSystem = new IntersectionReferenceSystem(path); referenceSystem.offset = offset; diff --git a/frontend/src/modules/3DViewer/view/queries/wellboreSchematicsQueries.ts b/frontend/src/modules/3DViewer/view/queries/wellboreSchematicsQueries.ts index 76339e0c2..3ed252a16 100644 --- a/frontend/src/modules/3DViewer/view/queries/wellboreSchematicsQueries.ts +++ b/frontend/src/modules/3DViewer/view/queries/wellboreSchematicsQueries.ts @@ -5,10 +5,10 @@ import { UseQueryResult, useQuery } from "@tanstack/react-query"; const STALE_TIME = 60 * 1000; const CACHE_TIME = 60 * 1000; -export function useWellboreCasingQuery(wellUuid: string | undefined): UseQueryResult { +export function useWellboreCasingsQuery(wellUuid: string | undefined): UseQueryResult { return useQuery({ queryKey: ["getWellboreCasing", wellUuid], - queryFn: () => apiService.well.getWellboreCasing(wellUuid ?? ""), + queryFn: () => apiService.well.getWellboreCasings(wellUuid ?? ""), staleTime: STALE_TIME, gcTime: CACHE_TIME, enabled: wellUuid ? true : false, diff --git a/frontend/src/modules/3DViewer/view/utils/layers.ts b/frontend/src/modules/3DViewer/view/utils/layers.ts index ffa9f9cb5..fad245f5b 100644 --- a/frontend/src/modules/3DViewer/view/utils/layers.ts +++ b/frontend/src/modules/3DViewer/view/utils/layers.ts @@ -1,5 +1,5 @@ import { BoundingBox3d_api, WellboreTrajectory_api } from "@api"; -import { Layer, PickingInfo } from "@deck.gl/core/typed"; +import { Layer } from "@deck.gl/core/typed"; import { TGrid3DColoringMode } from "@webviz/subsurface-viewer"; import { AxesLayer, Grid3DLayer, WellsLayer } from "@webviz/subsurface-viewer/dist/layers"; @@ -79,10 +79,6 @@ export function makeIntersectionLayer( showGridLines: boolean, gridMinAndMaxPropValues: [number, number] ): WorkingGrid3dLayer { - function handleHover(pickingInfo: PickingInfo) { - console.debug("Hovering over intersection layer", pickingInfo); - } - const polyData = buildVtkStylePolyDataFromFenceSections(polylineIntersectionData.fenceMeshSections); const grid3dIntersectionLayer = new Grid3DLayer({ id: "grid-3d-intersection-layer", @@ -97,7 +93,6 @@ export function makeIntersectionLayer( gridLines: showGridLines, material: { ambient: 0.4, diffuse: 0.7, shininess: 8, specularColor: [25, 25, 25] }, pickable: false, - onHover: handleHover, }); return grid3dIntersectionLayer as unknown as WorkingGrid3dLayer; } @@ -107,7 +102,7 @@ export function makeWellsLayer( selectedWellboreUuid: string | null ): WellsLayer { const tempWorkingWellsData = fieldWellboreTrajectoriesData.filter( - (el) => el.unique_wellbore_identifier !== "NO 34/4-K-3 AH" + (el) => el.uniqueWellboreIdentifier !== "NO 34/4-K-3 AH" ); const wellLayerDataFeatures = tempWorkingWellsData.map((well) => wellTrajectoryToGeojson(well, selectedWellboreUuid) @@ -157,17 +152,17 @@ export function wellTrajectoryToGeojson( ): Record { const point: Record = { type: "Point", - coordinates: [wellTrajectory.easting_arr[0], wellTrajectory.northing_arr[0], -wellTrajectory.tvd_msl_arr[0]], + coordinates: [wellTrajectory.eastingArr[0], wellTrajectory.northingArr[0], -wellTrajectory.tvdMslArr[0]], }; const coordinates: Record = { type: "LineString", - coordinates: zipCoords(wellTrajectory.easting_arr, wellTrajectory.northing_arr, wellTrajectory.tvd_msl_arr), + coordinates: zipCoords(wellTrajectory.eastingArr, wellTrajectory.northingArr, wellTrajectory.tvdMslArr), }; let color = [150, 150, 150]; let lineWidth = 2; let wellHeadSize = 1; - if (wellTrajectory.wellbore_uuid === selectedWellboreUuid) { + if (wellTrajectory.wellboreUuid === selectedWellboreUuid) { color = [255, 0, 0]; lineWidth = 5; wellHeadSize = 10; @@ -180,11 +175,11 @@ export function wellTrajectoryToGeojson( geometries: [point, coordinates], }, properties: { - uuid: wellTrajectory.wellbore_uuid, - name: wellTrajectory.unique_wellbore_identifier, - uwi: wellTrajectory.unique_wellbore_identifier, + uuid: wellTrajectory.wellboreUuid, + name: wellTrajectory.uniqueWellboreIdentifier, + uwi: wellTrajectory.uniqueWellboreIdentifier, color, - md: [wellTrajectory.md_arr], + md: [wellTrajectory.mdArr], lineWidth, wellHeadSize, }, @@ -209,8 +204,6 @@ interface PolyDataVtk { } function buildVtkStylePolyDataFromFenceSections(fenceSections: FenceMeshSection_trans[]): PolyDataVtk { - const startTS = performance.now(); - // Calculate sizes of typed arrays let totNumVertices = 0; let totNumPolygons = 0; @@ -265,8 +258,6 @@ function buildVtkStylePolyDataFromFenceSections(fenceSections: FenceMeshSection_ propsDstIdx += numPolysInSection; } - console.debug(`buildVtkStylePolyDataFromFenceSections() took: ${(performance.now() - startTS).toFixed(1)}ms`); - return { points: pointsFloat32Arr, polys: polysUint32Arr, diff --git a/frontend/src/modules/3DViewer/view/view.tsx b/frontend/src/modules/3DViewer/view/view.tsx index c139e006c..ad94b7e93 100644 --- a/frontend/src/modules/3DViewer/view/view.tsx +++ b/frontend/src/modules/3DViewer/view/view.tsx @@ -20,7 +20,7 @@ import { useAtom, useAtomValue } from "jotai"; import { SyncedSettingsUpdateWrapper } from "./components/SyncedSettingsUpdateWrapper"; import { useGridParameterQuery, useGridSurfaceQuery } from "./queries/gridQueries"; import { useGridPolylineIntersection as useGridPolylineIntersectionQuery } from "./queries/polylineIntersection"; -import { useWellboreCasingQuery } from "./queries/wellboreSchematicsQueries"; +import { useWellboreCasingsQuery } from "./queries/wellboreSchematicsQueries"; import { makeAxesLayer, makeGrid3DLayer, makeIntersectionLayer, makeWellsLayer } from "./utils/layers"; import { userSelectedCustomIntersectionPolylineIdAtom } from "../settings/atoms/baseAtoms"; @@ -103,7 +103,7 @@ export function View(props: ModuleViewProps): Re displayedWellboreUuid.push(highlightedWellboreUuid); } const filteredFieldWellBoreTrajectories = fieldWellboreTrajectoriesQuery.data?.filter((wellbore) => - displayedWellboreUuid.includes(wellbore.wellbore_uuid) + displayedWellboreUuid.includes(wellbore.wellboreUuid) ); const polylineUtmXy: number[] = []; @@ -115,17 +115,17 @@ export function View(props: ModuleViewProps): Re if (intersectionType === IntersectionType.WELLBORE) { if (filteredFieldWellBoreTrajectories && highlightedWellboreUuid) { const wellboreTrajectory = filteredFieldWellBoreTrajectories.find( - (wellbore) => wellbore.wellbore_uuid === highlightedWellboreUuid + (wellbore) => wellbore.wellboreUuid === highlightedWellboreUuid ); if (wellboreTrajectory) { const path: number[][] = []; - for (const [index, northing] of wellboreTrajectory.northing_arr.entries()) { - const easting = wellboreTrajectory.easting_arr[index]; - const tvd_msl = wellboreTrajectory.tvd_msl_arr[index]; + for (const [index, northing] of wellboreTrajectory.northingArr.entries()) { + const easting = wellboreTrajectory.eastingArr[index]; + const tvd_msl = wellboreTrajectory.tvdMslArr[index]; path.push([easting, northing, tvd_msl]); } - const offset = wellboreTrajectory.tvd_msl_arr[0]; + const offset = wellboreTrajectory.tvdMslArr[0]; intersectionReferenceSystem = new IntersectionReferenceSystem(path); intersectionReferenceSystem.offset = offset; @@ -178,7 +178,7 @@ export function View(props: ModuleViewProps): Re } // Wellbore casing query - const wellboreCasingQuery = useWellboreCasingQuery(highlightedWellboreUuid ?? undefined); + const wellboreCasingQuery = useWellboreCasingsQuery(highlightedWellboreUuid ?? undefined); if (wellboreCasingQuery.isError) { statusWriter.addError(wellboreCasingQuery.error.message); } diff --git a/frontend/src/modules/Intersection/settings/atoms/derivedAtoms.ts b/frontend/src/modules/Intersection/settings/atoms/derivedAtoms.ts index ff22ff1d8..7f4fd9e11 100644 --- a/frontend/src/modules/Intersection/settings/atoms/derivedAtoms.ts +++ b/frontend/src/modules/Intersection/settings/atoms/derivedAtoms.ts @@ -58,20 +58,20 @@ export const selectedWellboreAtom = atom((get) => { return null; } - const userSelectedWellboreHeader = wellboreHeaders.data.find((el) => el.wellbore_uuid === userSelectedWellboreUuid); + const userSelectedWellboreHeader = wellboreHeaders.data.find((el) => el.wellboreUuid === userSelectedWellboreUuid); if (!userSelectedWellboreUuid || !userSelectedWellboreHeader) { if (wellboreHeaders.data.length === 0) { return null; } return { - uuid: wellboreHeaders.data[0].wellbore_uuid, - identifier: wellboreHeaders.data[0].unique_wellbore_identifier, + uuid: wellboreHeaders.data[0].wellboreUuid, + identifier: wellboreHeaders.data[0].uniqueWellboreIdentifier, }; } return { uuid: userSelectedWellboreUuid, - identifier: userSelectedWellboreHeader.unique_wellbore_identifier, + identifier: userSelectedWellboreHeader.uniqueWellboreIdentifier, }; }); diff --git a/frontend/src/modules/Intersection/settings/atoms/layersAtoms.ts b/frontend/src/modules/Intersection/settings/atoms/layersAtoms.ts index 47c39b14f..fe2064162 100644 --- a/frontend/src/modules/Intersection/settings/atoms/layersAtoms.ts +++ b/frontend/src/modules/Intersection/settings/atoms/layersAtoms.ts @@ -14,152 +14,6 @@ import { QueryClient } from "@tanstack/query-core"; import { Getter, WritableAtom, atom } from "jotai"; import { queryClientAtom } from "jotai-tanstack-query"; -/* -export const layersAccessAtom = atom((get) => { - const layers = get(layersAtom); - const adjustedLayers: Layer[] = []; - - for (const layer of layers) { - if (layer.type === LayerType.GRID) { - adjustedLayers.push(fixupGridLayer(layer as GridLayer, get)); - } - if (layer.type === LayerType.SEISMIC) { - adjustedLayers.push(fixupSeismicLayer(layer as SeismicLayer, get)); - } - } - - return adjustedLayers; -}); - -function fixupGridLayer(layer: GridLayer, get: Getter): GridLayer { - const gridModelInfos = get(gridModelInfosQueryAtom); - const adjustedSettings = cloneDeep(layer.settings); - - if (!gridModelInfos.data) { - return layer; - } - - if ( - layer.settings.modelName === null || - !gridModelInfos.data.map((gridModelInfo) => gridModelInfo.grid_name).includes(layer.settings.modelName) - ) { - adjustedSettings.modelName = gridModelInfos.data[0]?.grid_name || null; - } - - const gridModelInfo = gridModelInfos.data.find((info) => info.grid_name === adjustedSettings.modelName); - - if (adjustedSettings.modelName) { - if ( - layer.settings.parameterName === null || - !gridModelInfos.data - .find((gridModelInfo) => gridModelInfo.grid_name === adjustedSettings.modelName) - ?.property_info_arr.some((propertyInfo) => propertyInfo.property_name === layer.settings.parameterName) - ) { - adjustedSettings.parameterName = - gridModelInfos.data.find((gridModelInfo) => gridModelInfo.grid_name === adjustedSettings.modelName) - ?.property_info_arr[0]?.property_name || null; - } - } - - if (adjustedSettings.modelName && adjustedSettings.parameterName) { - if ( - layer.settings.parameterDateOrInterval === null || - !gridModelInfos.data - .find((gridModelInfo) => gridModelInfo.grid_name === adjustedSettings.modelName) - ?.property_info_arr.some( - (propertyInfo) => - propertyInfo.property_name === adjustedSettings.parameterName && - propertyInfo.iso_date_or_interval === layer.settings.parameterDateOrInterval - ) - ) { - adjustedSettings.parameterDateOrInterval = - gridModelInfos.data - .find((gridModelInfo) => gridModelInfo.grid_name === adjustedSettings.modelName) - ?.property_info_arr.find( - (propertyInfo) => propertyInfo.property_name === adjustedSettings.parameterName - )?.iso_date_or_interval || null; - } - } - - let boundingBox = cloneDeep(layer.boundingBox); - if (gridModelInfo) { - boundingBox = { - x: [gridModelInfo.bbox.xmin, gridModelInfo.bbox.xmax], - y: [gridModelInfo.bbox.ymin, gridModelInfo.bbox.ymax], - }; - } - - return { - ...layer, - settings: adjustedSettings, - boundingBox, - }; -} - -function fixupSeismicLayer(layer: SeismicLayer, get: Getter): SeismicLayer { - const adjustedSettings = cloneDeep(layer.settings); - const availableSeismicAttributes = get(availableSeismicAttributesAtom); - const availableSeismicDateOrIntervalStrings = get(availableSeismicDateOrIntervalStringsAtom); - - if (!availableSeismicAttributes.some((el) => el === layer.settings.attribute) || !layer.settings.attribute) { - adjustedSettings.attribute = availableSeismicAttributes[0] || null; - } - - if ( - !availableSeismicDateOrIntervalStrings.some((el) => el === layer.settings.dateOrInterval) || - !layer.settings.dateOrInterval - ) { - adjustedSettings.dateOrInterval = availableSeismicDateOrIntervalStrings[0] || null; - } - - return { - ...layer, - settings: adjustedSettings, - }; -} - -function makeInitialLayerSettings(type: LayerType): Record { - switch (type) { - case LayerType.GRID: - return { - modelName: null, - parameterName: null, - parameterDateOrInterval: null, - colorScale: new ColorScale({ - colorPalette: new ColorPalette({ - name: "Blue to Yellow", - colors: [ - "#115f9a", - "#1984c5", - "#22a7f0", - "#48b5c4", - "#76c68f", - "#a6d75b", - "#c9e52f", - "#d0ee11", - "#f4f100", - ], - id: "blue-to-yellow", - }), - gradientType: ColorScaleGradientType.Sequential, - type: ColorScaleType.Continuous, - steps: 10, - }), - }; - case LayerType.SEISMIC: - return { - surveyType: SeismicSurveyType.THREE_D, - dataType: SeismicDataType.SIMULATED, - attribute: null, - dateOrInterval: null, - }; - default: - return {}; - } -} - -*/ - function makeUniqueLayerName(name: string, layers: BaseLayer[]): string { let potentialName = name; let i = 1; @@ -185,37 +39,6 @@ function makeLayer(type: LayerType, name: string, queryClient: QueryClient): Bas } } -/* -export const layersAtom = atomWithReducer[], LayerActions>([], (prev: BaseLayer[], action: LayerActions) => { - const queryClient = get(queryClientAtom); - switch (action.type) { - case LayerActionType.ADD_LAYER: - return [ - ...prev, - - ]; - case LayerActionType.REMOVE_LAYER: - return prev.filter((layer) => layer.id !== action.payload.id); - case LayerActionType.TOGGLE_LAYER_VISIBILITY: - return prev.map((layer) => - layer.id === action.payload.id ? { ...layer, visible: !layer.visible } : layer - ); - case LayerActionType.TOGGLE_LAYER_SETTINGS_VISIBILITY: - return prev.map((layer) => - layer.id === action.payload.id ? { ...layer, showSettings: !layer.showSettings } : layer - ); - case LayerActionType.UPDATE_SETTING: - return prev.map((layer) => - layer.id === action.payload.id - ? { ...layer, settings: { ...layer.settings, ...action.payload.settings } } - : layer - ); - default: - return prev; - } -}); -*/ - export function atomWithReducerAndGetter( initialValue: Value, reducer: (value: Value, action: Action, get: Getter) => Value @@ -268,6 +91,12 @@ export const layersAtom = atomWithReducerAndGetter[], LayerA return prev; } + if (action.type === LayerActionType.CHANGE_ORDER) { + return action.payload.orderedIds + .map((id) => prev.find((layer) => layer.getId() === id)) + .filter(Boolean) as BaseLayer[]; + } + if (action.type === LayerActionType.MOVE_LAYER) { const layer = prev.find((layer) => layer.getId() === action.payload.id); if (!layer) { diff --git a/frontend/src/modules/Intersection/settings/components/layerSettings/gridLayer.tsx b/frontend/src/modules/Intersection/settings/components/layerSettings/gridLayer.tsx index 6e2fc6c6c..08e6d0e8d 100644 --- a/frontend/src/modules/Intersection/settings/components/layerSettings/gridLayer.tsx +++ b/frontend/src/modules/Intersection/settings/components/layerSettings/gridLayer.tsx @@ -12,12 +12,13 @@ import { PendingWrapper } from "@lib/components/PendingWrapper"; import { Switch } from "@lib/components/Switch"; import { ColorScale } from "@lib/utils/ColorScale"; import { resolveClassNames } from "@lib/utils/resolveClassNames"; +import { useLayerSettings } from "@modules/Intersection/utils/layers/BaseLayer"; import { GridLayer, GridLayerSettings } from "@modules/Intersection/utils/layers/GridLayer"; import { ColorScaleSelector } from "@modules/_shared/components/ColorScaleSelector/colorScaleSelector"; import { isoIntervalStringToDateLabel, isoStringToDateLabel } from "@modules/_shared/utils/isoDatetimeStringFormatting"; import { useQuery } from "@tanstack/react-query"; -import { isEqual } from "lodash"; +import { cloneDeep, isEqual } from "lodash"; import { fixupSetting } from "./utils"; @@ -29,13 +30,13 @@ export type GridLayerSettingsComponentProps = { }; export function GridLayerSettingsComponent(props: GridLayerSettingsComponentProps): React.ReactNode { - const settings = props.layer.getSettings(); - const [newSettings, setNewSettings] = React.useState(props.layer.getSettings()); - const [prevSettings, setPrevSettings] = React.useState(settings); + const settings = useLayerSettings(props.layer); + const [newSettings, setNewSettings] = React.useState(cloneDeep(settings)); + const [prevSettings, setPrevSettings] = React.useState(cloneDeep(settings)); if (!isEqual(settings, prevSettings)) { - setPrevSettings(settings); - setNewSettings(settings); + setPrevSettings(cloneDeep(settings)); + setNewSettings(cloneDeep(settings)); } const ensembleFilterFunc = useEnsembleRealizationFilterFunc(props.workbenchSession); @@ -99,7 +100,7 @@ export function GridLayerSettingsComponent(props: GridLayerSettingsComponentProp React.useEffect( function propagateSettingsChange() { - props.layer.maybeUpdateSettings(newSettings); + props.layer.maybeUpdateSettings(cloneDeep(newSettings)); }, [newSettings, props.layer] ); diff --git a/frontend/src/modules/Intersection/settings/components/layerSettings/seismicLayer.tsx b/frontend/src/modules/Intersection/settings/components/layerSettings/seismicLayer.tsx index 72ae42bd6..3275832c8 100644 --- a/frontend/src/modules/Intersection/settings/components/layerSettings/seismicLayer.tsx +++ b/frontend/src/modules/Intersection/settings/components/layerSettings/seismicLayer.tsx @@ -13,6 +13,7 @@ import { PendingWrapper } from "@lib/components/PendingWrapper"; import { RadioGroup } from "@lib/components/RadioGroup"; import { SelectOption } from "@lib/components/Select"; import { ColorScale } from "@lib/utils/ColorScale"; +import { useLayerSettings } from "@modules/Intersection/utils/layers/BaseLayer"; import { SeismicDataType, SeismicLayer, @@ -23,7 +24,7 @@ import { ColorScaleSelector } from "@modules/_shared/components/ColorScaleSelect import { isoIntervalStringToDateLabel, isoStringToDateLabel } from "@modules/_shared/utils/isoDatetimeStringFormatting"; import { useQuery } from "@tanstack/react-query"; -import { isEqual } from "lodash"; +import { cloneDeep, isEqual } from "lodash"; import { fixupSetting } from "./utils"; @@ -45,9 +46,9 @@ export type SeismicLayerSettingsProps = { }; export function SeismicLayerSettingsComponent(props: SeismicLayerSettingsProps): React.ReactNode { - const [newSettings, setNewSettings] = React.useState(props.layer.getSettings()); - const settings = props.layer.getSettings(); - const [prevSettings, setPrevSettings] = React.useState(settings); + const settings = useLayerSettings(props.layer); + const [newSettings, setNewSettings] = React.useState(cloneDeep(settings)); + const [prevSettings, setPrevSettings] = React.useState(cloneDeep(settings)); if (!isEqual(settings, prevSettings)) { setPrevSettings(settings); @@ -142,7 +143,7 @@ export function SeismicLayerSettingsComponent(props: SeismicLayerSettingsProps): React.useEffect( function propagateSettingsChange() { - props.layer.maybeUpdateSettings(newSettings); + props.layer.maybeUpdateSettings(cloneDeep(newSettings)); }, [newSettings, props.layer] ); diff --git a/frontend/src/modules/Intersection/settings/components/layerSettings/surfaceLayer.tsx b/frontend/src/modules/Intersection/settings/components/layerSettings/surfaceLayer.tsx index 3be21da6b..a1bb60e34 100644 --- a/frontend/src/modules/Intersection/settings/components/layerSettings/surfaceLayer.tsx +++ b/frontend/src/modules/Intersection/settings/components/layerSettings/surfaceLayer.tsx @@ -15,10 +15,11 @@ import { PendingWrapper } from "@lib/components/PendingWrapper"; import { Select } from "@lib/components/Select"; import { ColorPalette } from "@lib/utils/ColorPalette"; import { ColorSet } from "@lib/utils/ColorSet"; +import { useLayerSettings } from "@modules/Intersection/utils/layers/BaseLayer"; import { SurfaceLayer, SurfaceLayerSettings } from "@modules/Intersection/utils/layers/SurfaceLayer"; import { UseQueryResult, useQuery } from "@tanstack/react-query"; -import { isEqual } from "lodash"; +import { cloneDeep, isEqual } from "lodash"; import { fixupSetting } from "./utils"; @@ -30,9 +31,9 @@ export type SurfaceLayerSettingsComponentProps = { }; export function SurfaceLayerSettingsComponent(props: SurfaceLayerSettingsComponentProps): React.ReactNode { - const [newSettings, setNewSettings] = React.useState(props.layer.getSettings()); - const settings = props.layer.getSettings(); - const [prevSettings, setPrevSettings] = React.useState(settings); + const settings = useLayerSettings(props.layer); + const [newSettings, setNewSettings] = React.useState(cloneDeep(settings)); + const [prevSettings, setPrevSettings] = React.useState(cloneDeep(settings)); if (!isEqual(settings, prevSettings)) { setPrevSettings(settings); @@ -103,7 +104,7 @@ export function SurfaceLayerSettingsComponent(props: SurfaceLayerSettingsCompone React.useEffect( function propagateSettingsChange() { - props.layer.maybeUpdateSettings(newSettings); + props.layer.maybeUpdateSettings(cloneDeep(newSettings)); }, [newSettings, props.layer] ); diff --git a/frontend/src/modules/Intersection/settings/components/layerSettings/wellpicksLayer.tsx b/frontend/src/modules/Intersection/settings/components/layerSettings/wellpicksLayer.tsx index 15692a798..153967604 100644 --- a/frontend/src/modules/Intersection/settings/components/layerSettings/wellpicksLayer.tsx +++ b/frontend/src/modules/Intersection/settings/components/layerSettings/wellpicksLayer.tsx @@ -9,8 +9,6 @@ import { Switch } from "@lib/components/Switch"; import { LayerStatus, useLayerStatus } from "@modules/Intersection/utils/layers/BaseLayer"; import { WellpicksLayer, WellpicksLayerSettings } from "@modules/Intersection/utils/layers/WellpicksLayer"; -import { isEqual } from "lodash"; - export type WellpicksLayerSettingsComponentProps = { layer: WellpicksLayer; ensembleSet: EnsembleSet; @@ -19,14 +17,8 @@ export type WellpicksLayerSettingsComponentProps = { }; export function WellpicksLayerSettingsComponent(props: WellpicksLayerSettingsComponentProps): React.ReactNode { - const [newSettings, setNewSettings] = React.useState(props.layer.getSettings()); + const [newSettings, setNewSettings] = React.useState>({}); const settings = props.layer.getSettings(); - const [prevSettings, setPrevSettings] = React.useState(settings); - - if (!isEqual(settings, prevSettings)) { - setPrevSettings(settings); - setNewSettings(settings); - } const status = useLayerStatus(props.layer); @@ -34,6 +26,7 @@ export function WellpicksLayerSettingsComponent(props: WellpicksLayerSettingsCom function propagateSettingsChange() { props.layer.maybeUpdateSettings(newSettings); props.layer.maybeRefetchData(); + setNewSettings({}); }, [newSettings, props.layer] ); @@ -74,7 +67,7 @@ export function WellpicksLayerSettingsComponent(props: WellpicksLayerSettingsCom
Filter picks
- +
@@ -83,11 +76,11 @@ export function WellpicksLayerSettingsComponent(props: WellpicksLayerSettingsCom diff --git a/frontend/src/modules/Intersection/settings/components/layers.tsx b/frontend/src/modules/Intersection/settings/components/layers.tsx index 79fdf5d74..e864064fc 100644 --- a/frontend/src/modules/Intersection/settings/components/layers.tsx +++ b/frontend/src/modules/Intersection/settings/components/layers.tsx @@ -66,6 +66,7 @@ export function Layers(props: LayersProps): React.ReactNode { const [dragPosition, setDragPosition] = React.useState({ x: 0, y: 0 }); const [prevLayers, setPrevLayers] = React.useState[]>(layers); const [currentScrollPosition, setCurrentScrollPosition] = React.useState(0); + const [layerOrder, setLayerOrder] = React.useState(layers.map((layer) => layer.getId())); const parentDivRef = React.useRef(null); const scrollDivRef = React.useRef(null); @@ -74,6 +75,7 @@ export function Layers(props: LayersProps): React.ReactNode { if (!isEqual(prevLayers, layers)) { setPrevLayers(layers); + setLayerOrder(layers.map((layer) => layer.getId())); if (scrollDivRef.current) { scrollDivRef.current.scrollTop = currentScrollPosition; } @@ -99,6 +101,7 @@ export function Layers(props: LayersProps): React.ReactNode { let pointerDownPositionRelativeToElement: Point2D = { x: 0, y: 0 }; let draggingActive: boolean = false; let layerId: string | null = null; + let newLayerOrder: string[] = layers.map((layer) => layer.getId()); let scrollTimeout: ReturnType | null = null; let doScroll: boolean = false; @@ -130,6 +133,30 @@ export function Layers(props: LayersProps): React.ReactNode { document.addEventListener("pointerup", handlePointerUp); } + function moveLayerToIndex(id: string, moveToIndex: number) { + const layer = layers.find((layer) => layer.getId() === id); + if (!layer) { + return; + } + + const index = newLayerOrder.indexOf(layer.getId()); + if (index === moveToIndex) { + return; + } + + if (moveToIndex <= 0) { + newLayerOrder = [id, ...newLayerOrder.filter((el) => el !== id)]; + } else if (moveToIndex >= layers.length - 1) { + newLayerOrder = [...newLayerOrder.filter((el) => el !== id), id]; + } else { + newLayerOrder = [...newLayerOrder]; + newLayerOrder.splice(index, 1); + newLayerOrder.splice(moveToIndex, 0, id); + } + + setLayerOrder(newLayerOrder); + } + function handleElementDrag(id: string, position: Point2D) { if (parentDivRef.current === null) { return; @@ -154,9 +181,9 @@ export function Layers(props: LayersProps): React.ReactNode { } if (position.y <= childBoundingRect.y + childBoundingRect.height / 2) { - dispatch({ type: LayerActionType.MOVE_LAYER, payload: { id, moveToIndex: index } }); + moveLayerToIndex(id, index); } else { - dispatch({ type: LayerActionType.MOVE_LAYER, payload: { id, moveToIndex: index + 1 } }); + moveLayerToIndex(id, index + 1); } index++; } @@ -247,6 +274,7 @@ export function Layers(props: LayersProps): React.ReactNode { setDraggingLayerId(null); document.removeEventListener("pointermove", handlePointerMove); document.removeEventListener("pointerup", handlePointerUp); + dispatch({ type: LayerActionType.CHANGE_ORDER, payload: { orderedIds: newLayerOrder } }); } currentParentDivRef.addEventListener("pointerdown", handlePointerDown); @@ -259,7 +287,7 @@ export function Layers(props: LayersProps): React.ReactNode { setDraggingLayerId(null); }; }, - [dispatch] + [dispatch, layers] ); function handleScroll(e: React.UIEvent) { @@ -312,21 +340,26 @@ export function Layers(props: LayersProps): React.ReactNode { onScroll={handleScroll} >
- {layers.map((layer) => { - return ( - - ); - })} + {layerOrder + .map((id) => layers.find((el) => el.getId() === id)) + .map((layer) => { + if (!layer) { + return null; + } + return ( + + ); + })}
{layers.length === 0 && (
@@ -488,7 +521,7 @@ function LayerItem(props: LayerItemProps): React.ReactNode { return (
diff --git a/frontend/src/modules/Intersection/settings/settings.tsx b/frontend/src/modules/Intersection/settings/settings.tsx index 92c438781..e5dae6ab3 100644 --- a/frontend/src/modules/Intersection/settings/settings.tsx +++ b/frontend/src/modules/Intersection/settings/settings.tsx @@ -183,8 +183,8 @@ export function Settings( function makeWellHeaderOptions(wellHeaders: WellboreHeader_api[]): SelectOption[] { return wellHeaders.map((wellHeader) => ({ - value: wellHeader.wellbore_uuid, - label: wellHeader.unique_wellbore_identifier, + value: wellHeader.wellboreUuid, + label: wellHeader.uniqueWellboreIdentifier, })); } diff --git a/frontend/src/modules/Intersection/sharedAtoms/sharedAtoms.ts b/frontend/src/modules/Intersection/sharedAtoms/sharedAtoms.ts index 9dba12893..1105acb37 100644 --- a/frontend/src/modules/Intersection/sharedAtoms/sharedAtoms.ts +++ b/frontend/src/modules/Intersection/sharedAtoms/sharedAtoms.ts @@ -25,23 +25,23 @@ export const selectedWellboreAtom = atom((get) => { return null; } - const userSelectedWellboreHeader = wellboreHeaders.data.find((el) => el.wellbore_uuid === userSelectedWellboreUuid); + const userSelectedWellboreHeader = wellboreHeaders.data.find((el) => el.wellboreUuid === userSelectedWellboreUuid); if (!userSelectedWellboreUuid || !userSelectedWellboreHeader) { if (wellboreHeaders.data.length === 0) { return null; } return { - uuid: wellboreHeaders.data[0].wellbore_uuid, - identifier: wellboreHeaders.data[0].unique_wellbore_identifier, + uuid: wellboreHeaders.data[0].wellboreUuid, + identifier: wellboreHeaders.data[0].uniqueWellboreIdentifier, }; } return { uuid: userSelectedWellboreUuid, - identifier: userSelectedWellboreHeader.unique_wellbore_identifier, - depthReferencePoint: userSelectedWellboreHeader.depth_reference_point, - depthReferenceElevation: userSelectedWellboreHeader.depth_reference_elevation, + identifier: userSelectedWellboreHeader.uniqueWellboreIdentifier, + depthReferencePoint: userSelectedWellboreHeader.depthReferencePoint, + depthReferenceElevation: userSelectedWellboreHeader.depthReferenceElevation, }; }); diff --git a/frontend/src/modules/Intersection/typesAndEnums.ts b/frontend/src/modules/Intersection/typesAndEnums.ts index 6e7a50788..14f241a57 100644 --- a/frontend/src/modules/Intersection/typesAndEnums.ts +++ b/frontend/src/modules/Intersection/typesAndEnums.ts @@ -27,19 +27,14 @@ export const LAYER_TYPE_TO_STRING_MAPPING = { [LayerType.WELLPICKS]: "Wellpicks", }; -export type LayerBoundingBox = { - x: [number, number]; - y: [number, number]; -}; - export enum LayerActionType { ADD_LAYER = "add-layer", REMOVE_LAYER = "remove-layer", TOGGLE_LAYER_VISIBILITY = "toggle-layer-visibility", TOGGLE_LAYER_SETTINGS_VISIBILITY = "toggle-layer-settings-visibility", UPDATE_SETTING = "update-settings", - UPDATE_BOUNDING_BOX = "update-bounding-box", MOVE_LAYER = "move-layer", + CHANGE_ORDER = "change-order", } export type LayerActionPayloads = { @@ -48,8 +43,8 @@ export type LayerActionPayloads = { [LayerActionType.TOGGLE_LAYER_VISIBILITY]: { id: string }; [LayerActionType.TOGGLE_LAYER_SETTINGS_VISIBILITY]: { id: string }; [LayerActionType.UPDATE_SETTING]: { id: string; settings: Record }; - [LayerActionType.UPDATE_BOUNDING_BOX]: { id: string; boundingBox: LayerBoundingBox }; [LayerActionType.MOVE_LAYER]: { id: string; moveToIndex: number }; + [LayerActionType.CHANGE_ORDER]: { orderedIds: string[] }; }; export type LayerAction = { diff --git a/frontend/src/modules/Intersection/utils/layers/BaseLayer.ts b/frontend/src/modules/Intersection/utils/layers/BaseLayer.ts index 90b07f125..1fe7cae7a 100644 --- a/frontend/src/modules/Intersection/utils/layers/BaseLayer.ts +++ b/frontend/src/modules/Intersection/utils/layers/BaseLayer.ts @@ -1,5 +1,6 @@ import React from "react"; +import { isDevMode } from "@lib/utils/devMode"; import { QueryClient } from "@tanstack/query-core"; import { cloneDeep, isEqual } from "lodash"; @@ -42,6 +43,7 @@ export class BaseLayer { protected _data: TData | null = null; protected _settings: TSettings = {} as TSettings; private _lastDataFetchSettings: TSettings; + private _queryKeys: unknown[][] = []; constructor(name: string, settings: TSettings, queryClient: QueryClient) { this._id = v4(); @@ -118,10 +120,24 @@ export class BaseLayer { } if (Object.keys(patchesToApply).length > 0) { this._settings = { ...this._settings, ...patchesToApply }; + this.maybeCancelQuery(); } + this.notifySubscribers(LayerTopic.SETTINGS); } + protected registerQueryKey(queryKey: unknown[]): void { + this._queryKeys.push(queryKey); + } + + private maybeCancelQuery(): void { + if (this._queryKeys) { + for (const queryKey of this._queryKeys) { + this._queryClient.cancelQueries({ queryKey }); + } + } + } + subscribe(topic: LayerTopic, callback: () => void): () => void { if (!this._subscribers.has(topic)) { this._subscribers.set(topic, new Set()); @@ -170,6 +186,12 @@ export class BaseLayer { this.notifySubscribers(LayerTopic.STATUS); try { this._data = await this.fetchData(); + if (this._queryKeys.length === null && isDevMode()) { + console.warn( + "Did you forget to use 'setQueryKeys' in your layer implementation of 'fetchData'? This will cause the queries to not be cancelled when settings change and might lead to undesired behaviour." + ); + } + this._queryKeys = []; this.notifySubscribers(LayerTopic.DATA); this._status = LayerStatus.SUCCESS; } catch (error) { diff --git a/frontend/src/modules/Intersection/utils/layers/GridLayer.ts b/frontend/src/modules/Intersection/utils/layers/GridLayer.ts index b9e1dfa92..757959255 100644 --- a/frontend/src/modules/Intersection/utils/layers/GridLayer.ts +++ b/frontend/src/modules/Intersection/utils/layers/GridLayer.ts @@ -145,6 +145,8 @@ export class GridLayer extends BaseLayer 0 && + this._settings.polyline.actualSectionLengths.length === + this._settings.polyline.polylineUtmXy.length / 2 - 1 && this._settings.extensionLength !== null ); } @@ -152,9 +154,12 @@ export class GridLayer extends BaseLayer { super.setBoundingBox(null); + const queryKey = ["getGridPolylineIntersection", ...Object.entries(this._settings)]; + this.registerQueryKey(queryKey); + return this._queryClient .fetchQuery({ - queryKey: ["getGridPolylineIntersection", ...Object.entries(this._settings)], + queryKey, queryFn: () => apiService.grid3D.postGetPolylineIntersection( this._settings.ensembleIdent?.getCaseUuid() ?? "", diff --git a/frontend/src/modules/Intersection/utils/layers/SeismicLayer.ts b/frontend/src/modules/Intersection/utils/layers/SeismicLayer.ts index 5abea4deb..fc468076b 100644 --- a/frontend/src/modules/Intersection/utils/layers/SeismicLayer.ts +++ b/frontend/src/modules/Intersection/utils/layers/SeismicLayer.ts @@ -37,13 +37,9 @@ export type SeismicFenceData_trans = Omit 0 && this._settings.attribute !== null && this._settings.dateOrInterval !== null && this._settings.extensionLength > 0 && @@ -321,21 +317,24 @@ export class SeismicLayer extends BaseLayer apiService.seismic.postGetSeismicFence( this._settings.ensembleIdent?.getCaseUuid() ?? "", diff --git a/frontend/src/modules/Intersection/utils/layers/SurfaceLayer.ts b/frontend/src/modules/Intersection/utils/layers/SurfaceLayer.ts index be5416064..a35ac39e7 100644 --- a/frontend/src/modules/Intersection/utils/layers/SurfaceLayer.ts +++ b/frontend/src/modules/Intersection/utils/layers/SurfaceLayer.ts @@ -166,18 +166,21 @@ export class SurfaceLayer extends BaseLayer apiService.surface.postGetSurfaceIntersection( this._settings.ensembleIdent?.getCaseUuid() ?? "", diff --git a/frontend/src/modules/Intersection/utils/layers/WellpicksLayer.ts b/frontend/src/modules/Intersection/utils/layers/WellpicksLayer.ts index e4925337b..c98239aa4 100644 --- a/frontend/src/modules/Intersection/utils/layers/WellpicksLayer.ts +++ b/frontend/src/modules/Intersection/utils/layers/WellpicksLayer.ts @@ -54,7 +54,6 @@ export class WellpicksLayer extends BaseLayer this._settings.selectedUnitPicks.includes(pick.name)), nonUnitPicks: data.nonUnitPicks.filter((pick) => this._settings.selectedNonUnitPicks.includes(pick.identifier) @@ -66,13 +65,16 @@ export class WellpicksLayer extends BaseLayer { + const queryKey = [ + "getWellborePicksAndStratigraphicUnits", + this._settings.ensembleIdent?.getCaseUuid(), + this._settings.wellboreUuid, + ]; + this.registerQueryKey(queryKey); + return this._queryClient .fetchQuery({ - queryKey: [ - "getWellborePicksAndStratigraphicUnits", - this._settings.ensembleIdent?.getCaseUuid(), - this._settings.wellboreUuid, - ], + queryKey, queryFn: () => apiService.well.getWellborePicksAndStratigraphicUnits( this._settings.ensembleIdent?.getCaseUuid() ?? "", diff --git a/frontend/src/modules/Intersection/view/atoms/atomDefinitions.ts b/frontend/src/modules/Intersection/view/atoms/atomDefinitions.ts index ce568a721..c4830d50b 100644 --- a/frontend/src/modules/Intersection/view/atoms/atomDefinitions.ts +++ b/frontend/src/modules/Intersection/view/atoms/atomDefinitions.ts @@ -52,13 +52,13 @@ export function viewAtomsInitialization( if (wellboreTrajectoryQuery) { const path: number[][] = []; - for (const [index, northing] of wellboreTrajectory.northing_arr.entries()) { - const easting = wellboreTrajectory.easting_arr[index]; - const tvd_msl = wellboreTrajectory.tvd_msl_arr[index]; + for (const [index, northing] of wellboreTrajectory.northingArr.entries()) { + const easting = wellboreTrajectory.eastingArr[index]; + const tvd_msl = wellboreTrajectory.tvdMslArr[index]; path.push([easting, northing, tvd_msl]); } - const offset = wellboreTrajectory.md_arr[0]; + const offset = wellboreTrajectory.mdArr[0]; const referenceSystem = new IntersectionReferenceSystem(path); referenceSystem.offset = offset; diff --git a/frontend/src/modules/Intersection/view/components/layersWrapper.tsx b/frontend/src/modules/Intersection/view/components/layersWrapper.tsx index 8112ab76c..1eff23d24 100644 --- a/frontend/src/modules/Intersection/view/components/layersWrapper.tsx +++ b/frontend/src/modules/Intersection/view/components/layersWrapper.tsx @@ -110,14 +110,14 @@ export function LayersWrapper(props: LayersWrapperProps): React.ReactNode { }); if (props.wellboreCasingData) { - const casingData = props.wellboreCasingData.filter((casing) => casing.item_type === "Casing"); + const casingData = props.wellboreCasingData.filter((casing) => casing.itemType === "Casing"); const casings: Casing[] = casingData.map((casing, index) => ({ id: `casing-${index}`, - diameter: casing.diameter_numeric, - start: casing.depth_top_md, - end: casing.depth_bottom_md, - innerDiameter: casing.diameter_inner, + diameter: casing.diameterNumeric, + start: casing.depthTopMd, + end: casing.depthBottomMd, + innerDiameter: casing.diameterInner, kind: "casing", hasShoe: false, })); diff --git a/frontend/src/modules/Intersection/view/components/readoutWrapper.tsx b/frontend/src/modules/Intersection/view/components/readoutWrapper.tsx index 39d5f7ca3..a6a525329 100644 --- a/frontend/src/modules/Intersection/view/components/readoutWrapper.tsx +++ b/frontend/src/modules/Intersection/view/components/readoutWrapper.tsx @@ -39,44 +39,59 @@ export type ReadoutWrapperProps = { export function ReadoutWrapper(props: ReadoutWrapperProps): React.ReactNode { const [readoutItems, setReadoutItems] = React.useState([]); - const [hoveredMd, setHoveredMd] = React.useState(null); - const [prevHoveredMd, setPrevHoveredMd] = React.useState(null); - const syncedHoveredMd = useSubscribedValue( + const [syncedHoveredMd, setSyncedHoveredMd] = React.useState(null); + const [readoutMd, setReadoutMd] = React.useState(null); + const [prevSyncedHoveredMd, setPrevSyncedHoveredMd] = React.useState< + GlobalTopicDefinitions["global.hoverMd"] | null + >(null); + + const syncedHoverMd = useSubscribedValue( "global.hoverMd", props.workbenchServices, props.viewContext.getInstanceIdString() ); - if (!isEqual(syncedHoveredMd, prevHoveredMd)) { - setPrevHoveredMd(syncedHoveredMd); - if (syncedHoveredMd?.wellboreUuid === props.wellboreHeaderUuid) { - setHoveredMd(syncedHoveredMd?.md ?? null); + if (!isEqual(syncedHoveredMd, prevSyncedHoveredMd)) { + setPrevSyncedHoveredMd(syncedHoverMd); + if (syncedHoverMd?.wellboreUuid === props.wellboreHeaderUuid) { + setSyncedHoveredMd(syncedHoverMd?.md ?? null); } else { - setHoveredMd(null); + setSyncedHoveredMd(null); } } const moduleInstanceId = props.viewContext.getInstanceIdString(); - const handleReadoutItemsChange = React.useCallback( - function handleReadoutItemsChange(event: EsvIntersectionReadoutEvent): void { - setReadoutItems(event.readoutItems); - const items = event.readoutItems; - const wellboreReadoutItem = items.find((item) => isWellborepathLayer(item.layer)); - const md = wellboreReadoutItem?.md; - if (!md || !props.wellboreHeaderUuid) { + React.useEffect( + function propagateReadoutMdChange() { + if (!readoutMd || !props.wellboreHeaderUuid) { props.workbenchServices.publishGlobalData("global.hoverMd", null); return; } props.workbenchServices.publishGlobalData( "global.hoverMd", - { wellboreUuid: props.wellboreHeaderUuid, md: md }, + { wellboreUuid: props.wellboreHeaderUuid, md: readoutMd }, moduleInstanceId ); + + return function resetPublishedHoverMd() { + props.workbenchServices.publishGlobalData("global.hoverMd", null, moduleInstanceId); + }; }, - [moduleInstanceId, props.wellboreHeaderUuid, props.workbenchServices] + [readoutMd, props.workbenchServices, props.viewContext, props.wellboreHeaderUuid, moduleInstanceId] ); + const handleReadoutItemsChange = React.useCallback(function handleReadoutItemsChange( + event: EsvIntersectionReadoutEvent + ): void { + setReadoutItems(event.readoutItems); + const items = event.readoutItems; + const wellboreReadoutItem = items.find((item) => isWellborepathLayer(item.layer)); + const md = wellboreReadoutItem?.md; + setReadoutMd(md ?? null); + }, + []); + const makeLabelFromLayer = React.useCallback( function makeLabelFromLayer(layer: Layer): string | null { return props.layerIdToNameMap[layer.id] ?? null; @@ -85,8 +100,8 @@ export function ReadoutWrapper(props: ReadoutWrapperProps): React.ReactNode { ); const highlightItems: HighlightItem[] = []; - if (props.referenceSystem && hoveredMd) { - const point = props.referenceSystem.project(hoveredMd); + if (props.referenceSystem && syncedHoveredMd) { + const point = props.referenceSystem.project(syncedHoveredMd); highlightItems.push({ point: [point[0], point[1]], color: "red", diff --git a/frontend/src/modules/Intersection/view/queries/wellboreSchematicsQueries.ts b/frontend/src/modules/Intersection/view/queries/wellboreSchematicsQueries.ts index 76339e0c2..3ed252a16 100644 --- a/frontend/src/modules/Intersection/view/queries/wellboreSchematicsQueries.ts +++ b/frontend/src/modules/Intersection/view/queries/wellboreSchematicsQueries.ts @@ -5,10 +5,10 @@ import { UseQueryResult, useQuery } from "@tanstack/react-query"; const STALE_TIME = 60 * 1000; const CACHE_TIME = 60 * 1000; -export function useWellboreCasingQuery(wellUuid: string | undefined): UseQueryResult { +export function useWellboreCasingsQuery(wellUuid: string | undefined): UseQueryResult { return useQuery({ queryKey: ["getWellboreCasing", wellUuid], - queryFn: () => apiService.well.getWellboreCasing(wellUuid ?? ""), + queryFn: () => apiService.well.getWellboreCasings(wellUuid ?? ""), staleTime: STALE_TIME, gcTime: CACHE_TIME, enabled: wellUuid ? true : false, diff --git a/frontend/src/modules/Intersection/view/view.tsx b/frontend/src/modules/Intersection/view/view.tsx index 5c4a9c03d..e85bf2703 100644 --- a/frontend/src/modules/Intersection/view/view.tsx +++ b/frontend/src/modules/Intersection/view/view.tsx @@ -4,12 +4,15 @@ import { ModuleViewProps } from "@framework/Module"; import { useViewStatusWriter } from "@framework/StatusWriter"; import { useEnsembleSet } from "@framework/WorkbenchSession"; import { IntersectionType } from "@framework/types/intersection"; +import { CircularProgress } from "@lib/components/CircularProgress"; +import { resolveClassNames } from "@lib/utils/resolveClassNames"; import { useAtomValue } from "jotai"; import { ViewAtoms } from "./atoms/atomDefinitions"; +import { wellboreTrajectoryQueryAtom } from "./atoms/queryAtoms"; import { LayersWrapper } from "./components/layersWrapper"; -import { useWellboreCasingQuery } from "./queries/wellboreSchematicsQueries"; +import { useWellboreCasingsQuery } from "./queries/wellboreSchematicsQueries"; import { SettingsToViewInterface } from "../settingsToViewInterface"; import { selectedWellboreAtom } from "../sharedAtoms/sharedAtoms"; @@ -25,6 +28,7 @@ export function View( const ensembleIdent = props.viewContext.useSettingsToViewInterfaceValue("ensembleIdent"); const intersectionReferenceSystem = props.viewContext.useViewAtomValue("intersectionReferenceSystemAtom"); const wellboreHeader = useAtomValue(selectedWellboreAtom); + const wellboreTrajectoryQuery = useAtomValue(wellboreTrajectoryQueryAtom); const layers = props.viewContext.useViewAtomValue("layers"); const layersStatuses = useLayersStatuses(layers); @@ -61,27 +65,35 @@ export function View( } // Wellbore casing query - const wellboreCasingQuery = useWellboreCasingQuery(wellboreHeader?.uuid ?? undefined); + const wellboreCasingQuery = useWellboreCasingsQuery(wellboreHeader?.uuid ?? undefined); // Set loading status - statusWriter.setLoading( - wellboreCasingQuery.isFetching || layersStatuses.some((status) => status.status === LayerStatus.LOADING) - ); + const mainElementsLoading = + wellboreTrajectoryQuery.isFetching || layersStatuses.some((status) => status.status === LayerStatus.LOADING); + statusWriter.setLoading(mainElementsLoading || wellboreCasingQuery.isFetching); const potentialIntersectionExtensionLength = intersectionType === IntersectionType.WELLBORE ? intersectionExtensionLength : 0; return ( -
+
+
+ +
diff --git a/frontend/src/modules/SeismicIntersection/settings.tsx b/frontend/src/modules/SeismicIntersection/settings.tsx index 3013a9469..c1e43819e 100644 --- a/frontend/src/modules/SeismicIntersection/settings.tsx +++ b/frontend/src/modules/SeismicIntersection/settings.tsx @@ -134,8 +134,8 @@ export function Settings({ settingsContext, workbenchSession, workbenchServices const availableWellboreList: Wellbore[] = wellHeadersQuery.data?.map((wellbore) => ({ type: WELLBORE_TYPE, - uwi: wellbore.unique_wellbore_identifier, - uuid: wellbore.wellbore_uuid, + uwi: wellbore.uniqueWellboreIdentifier, + uuid: wellbore.wellboreUuid, })) || []; const computedWellboreAddress = fixupSyncedOrSelectedOrFirstWellbore( syncedWellBore || null, diff --git a/frontend/src/modules/SeismicIntersection/utils/esvIntersectionDataConversion.ts b/frontend/src/modules/SeismicIntersection/utils/esvIntersectionDataConversion.ts index d17ea5c1e..a6218e464 100644 --- a/frontend/src/modules/SeismicIntersection/utils/esvIntersectionDataConversion.ts +++ b/frontend/src/modules/SeismicIntersection/utils/esvIntersectionDataConversion.ts @@ -115,9 +115,9 @@ function addStartAndEndPointsToTrajectoryForVerticalLine( * @returns Array of 3D coordinates [x,y,z] - with [x,y,z] = [easting, northing, tvd_msl] */ export function makeTrajectoryXyzPointsFromWellboreTrajectory(wellboreTrajectory: WellboreTrajectory_api): number[][] { - const eastingArr = wellboreTrajectory.easting_arr; - const northingArr = wellboreTrajectory.northing_arr; - const tvdArr = wellboreTrajectory.tvd_msl_arr; + const eastingArr = wellboreTrajectory.eastingArr; + const northingArr = wellboreTrajectory.northingArr; + const tvdArr = wellboreTrajectory.tvdMslArr; if (eastingArr.length !== northingArr.length && northingArr.length !== tvdArr.length) { throw new Error("Wellbore trajectory coordinate arrays are not of same length"); diff --git a/frontend/src/modules/StructuralUncertaintyIntersection/settings.tsx b/frontend/src/modules/StructuralUncertaintyIntersection/settings.tsx index 44cb5f544..64bcf670f 100644 --- a/frontend/src/modules/StructuralUncertaintyIntersection/settings.tsx +++ b/frontend/src/modules/StructuralUncertaintyIntersection/settings.tsx @@ -95,8 +95,8 @@ export function Settings({ const availableWellboreList: Wellbore[] = wellHeadersQuery.data?.map((wellbore) => ({ type: wellboreType, - uwi: wellbore.unique_wellbore_identifier, - uuid: wellbore.wellbore_uuid, + uwi: wellbore.uniqueWellboreIdentifier, + uuid: wellbore.wellboreUuid, })) || []; const computedWellboreAddress = fixupSyncedOrSelectedOrFirstWellbore( syncedWellBore || null, diff --git a/frontend/src/modules/SubsurfaceMap/_utils/subsurfaceMap.ts b/frontend/src/modules/SubsurfaceMap/_utils/subsurfaceMap.ts index f8202b2f4..dff51a55f 100644 --- a/frontend/src/modules/SubsurfaceMap/_utils/subsurfaceMap.ts +++ b/frontend/src/modules/SubsurfaceMap/_utils/subsurfaceMap.ts @@ -131,11 +131,11 @@ export function createWellboreTrajectoryLayer(wellTrajectories: WellboreTrajecto export function wellTrajectoryToGeojson(wellTrajectory: WellboreTrajectory_api): Record { const point: Record = { type: "Point", - coordinates: [wellTrajectory.easting_arr[0], wellTrajectory.northing_arr[0], -wellTrajectory.tvd_msl_arr[0]], + coordinates: [wellTrajectory.eastingArr[0], wellTrajectory.northingArr[0], -wellTrajectory.tvdMslArr[0]], }; const coordinates: Record = { type: "LineString", - coordinates: zipCoords(wellTrajectory.easting_arr, wellTrajectory.northing_arr, wellTrajectory.tvd_msl_arr), + coordinates: zipCoords(wellTrajectory.eastingArr, wellTrajectory.northingArr, wellTrajectory.tvdMslArr), }; const geometryCollection: Record = { type: "Feature", @@ -144,12 +144,12 @@ export function wellTrajectoryToGeojson(wellTrajectory: WellboreTrajectory_api): geometries: [point, coordinates], }, properties: { - uuid: wellTrajectory.wellbore_uuid, - name: wellTrajectory.unique_wellbore_identifier, - uwi: wellTrajectory.unique_wellbore_identifier, + uuid: wellTrajectory.wellboreUuid, + name: wellTrajectory.uniqueWellboreIdentifier, + uwi: wellTrajectory.uniqueWellboreIdentifier, color: [0, 0, 0, 100], - md: [wellTrajectory.md_arr], + md: [wellTrajectory.mdArr], }, }; @@ -158,11 +158,11 @@ export function wellTrajectoryToGeojson(wellTrajectory: WellboreTrajectory_api): export function createWellBoreHeaderLayer(wellTrajectories: WellboreTrajectory_api[]): Record { const data: Record[] = wellTrajectories.map((wellTrajectory) => { return wellHeaderMarkerToGeojson( - wellTrajectory.easting_arr[0], - wellTrajectory.northing_arr[0], - -wellTrajectory.tvd_msl_arr[0], - wellTrajectory.unique_wellbore_identifier, - wellTrajectory.wellbore_uuid + wellTrajectory.eastingArr[0], + wellTrajectory.northingArr[0], + -wellTrajectory.tvdMslArr[0], + wellTrajectory.uniqueWellboreIdentifier, + wellTrajectory.wellboreUuid ); }); diff --git a/frontend/src/modules/SubsurfaceMap/settings.tsx b/frontend/src/modules/SubsurfaceMap/settings.tsx index 271942825..b81e5a67a 100644 --- a/frontend/src/modules/SubsurfaceMap/settings.tsx +++ b/frontend/src/modules/SubsurfaceMap/settings.tsx @@ -372,8 +372,8 @@ export function Settings({ settingsContext, workbenchSession, workbenchServices if (wellHeadersQuery.data) { wellHeaderOptions = wellHeadersQuery.data.map((header) => ({ - label: header.unique_wellbore_identifier, - value: header.wellbore_uuid, + label: header.uniqueWellboreIdentifier, + value: header.wellboreUuid, })); } diff --git a/frontend/src/modules/SubsurfaceMap/view.tsx b/frontend/src/modules/SubsurfaceMap/view.tsx index 445565029..5ad55e77d 100644 --- a/frontend/src/modules/SubsurfaceMap/view.tsx +++ b/frontend/src/modules/SubsurfaceMap/view.tsx @@ -155,7 +155,7 @@ export function View({ viewContext, workbenchSettings, workbenchServices }: Modu } if (wellTrajectoriesQuery.data) { const wellTrajectories: WellboreTrajectory_api[] = wellTrajectoriesQuery.data.filter((well) => - selectedWellUuids.includes(well.wellbore_uuid) + selectedWellUuids.includes(well.wellboreUuid) ); const wellTrajectoryLayer: Record = createWellboreTrajectoryLayer(wellTrajectories); const wellBoreHeaderLayer: Record = createWellBoreHeaderLayer(wellTrajectories); diff --git a/frontend/src/modules/_shared/utils/wellbore.ts b/frontend/src/modules/_shared/utils/wellbore.ts index 0cc1020de..fea1dde59 100644 --- a/frontend/src/modules/_shared/utils/wellbore.ts +++ b/frontend/src/modules/_shared/utils/wellbore.ts @@ -148,8 +148,6 @@ function transformFenceMeshSection(apiData: FenceMeshSection_api): FenceMeshSect } export function transformPolylineIntersection(apiData: PolylineIntersection_api): PolylineIntersection_trans { - const startTS = performance.now(); - const { fence_mesh_sections, ...untransformedData } = apiData; const transMeshSections: FenceMeshSection_trans[] = []; @@ -159,8 +157,6 @@ export function transformPolylineIntersection(apiData: PolylineIntersection_api) transMeshSections.push(transformedSection); } - console.debug(`transformPolylineIntersection() took: ${(performance.now() - startTS).toFixed(1)}ms`); - return { ...untransformedData, fenceMeshSections: transMeshSections, @@ -181,10 +177,7 @@ export function transformPolylineIntersectionResult( polylineIntersection: PolylineIntersection_trans, actualSectionLengths: number[] ): AdjustedPolylineIntersection { - const startTS = performance.now(); - const fenceMeshSections: AdjustedFenceMeshSection[] = []; - let totalError = 0; // Section with a length of 0 are not included in the results - remove const adjustedActualSectionLengths = actualSectionLengths.filter((length) => length > 0); @@ -204,8 +197,6 @@ export function transformPolylineIntersectionResult( const scale = actualSectionLength / simplifiedSectionLength; - totalError += actualSectionLength - simplifiedSectionLength; - let minZ = Number.MAX_VALUE; let maxZ = Number.MIN_VALUE; for (let i = 0; i < section.verticesUzFloat32Arr.length; i += 2) { @@ -223,10 +214,6 @@ export function transformPolylineIntersectionResult( }); } - console.debug(`Total error: ${totalError.toFixed(2)}`); - - console.debug(`transformPolylineIntersectionResult() took: ${(performance.now() - startTS).toFixed(1)}ms`); - return { ...polylineIntersection, fenceMeshSections,