Skip to content
Open
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions python_sdk/coverage.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from reality_capture.specifications.mesh_sampling import (MeshSamplingSpecificationsCreate, MeshSamplingInputs,
MeshSamplingOptions, MeshSamplingFormat)

inputs = MeshSamplingInputs(meshes=["dbad181b-5079-4224-8561-96ad218bcfc9", "ea881e3e-b0e3-4b23-bc3f-4ee8e9acdf61"])
options = MeshSamplingOptions(outputFormat=MeshSamplingFormat.THREE_D_TILES_GLBC)

specs = MeshSamplingSpecificationsCreate(inputs=inputs, options=options)
8 changes: 8 additions & 0 deletions python_sdk/docs/specifications/examples/pc_conv_specs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from reality_capture.specifications.point_cloud_conversion import (PointCloudConversionSpecificationsCreate,
PCConversionInputs, PCConversionOptions,
PCConversionFormat)

inputs = PCConversionInputs(pointCloud="e3e12e4f-9fe0-4169-9571-41ecebd8c229")
options = PCConversionOptions(outputFormat=PCConversionFormat.LAS)

specs = PointCloudConversionSpecificationsCreate(inputs=inputs, options=options)
9 changes: 9 additions & 0 deletions python_sdk/docs/specifications/examples/pc_optim_specs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from reality_capture.specifications.point_cloud_optimization import (PCOptimizationSpecificationsCreate,
PCOptimizationFormat, PCOptimizationInputs,
PCOptimizationOptions)

inputs = PCOptimizationInputs(pointClouds=["dbad181b-5079-4224-8561-96ad218bcfc9",
"ea881e3e-b0e3-4b23-bc3f-4ee8e9acdf61"])
options = PCOptimizationOptions(outputFormat=PCOptimizationFormat.THREE_D_TILES_GLBC)

specs = PCOptimizationSpecificationsCreate(inputs=inputs, options=options)
9 changes: 9 additions & 0 deletions python_sdk/docs/specifications/examples/tm_optimization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from reality_capture.specifications.tile_map_optimization import (TileMapOptimizationSpecificationsCreate,
TileMapOptimizationInputs, TileMapOptimizationOptions,
TileMapOptimizationFormat)

inputs = TileMapOptimizationInputs(tileMaps=["dbad181b-5079-4224-8561-96ad218bcfc9",
"ea881e3e-b0e3-4b23-bc3f-4ee8e9acdf61"])
options = TileMapOptimizationOptions(outputFormat=TileMapOptimizationFormat.XYZ_TILE_MAP, backgroundColor="#000000")

specs = TileMapOptimizationSpecificationsCreate(inputs=inputs, options=options)
9 changes: 9 additions & 0 deletions python_sdk/docs/specifications/examples/vector_optim.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from reality_capture.specifications.vector_optimization import (VectorOptimizationSpecificationsCreate,
VectorOptimizationInputs, VectorOptimizationOptions,
VectorOptimizationFormat)

inputs = VectorOptimizationInputs(vectors=["dbad181b-5079-4224-8561-96ad218bcfc9",
"ea881e3e-b0e3-4b23-bc3f-4ee8e9acdf61"])
options = VectorOptimizationOptions(outputFormat=VectorOptimizationFormat.FEATURE_DB, featureClassDisplayName="Road")

specs = VectorOptimizationSpecificationsCreate(inputs=inputs, options=options)
16 changes: 12 additions & 4 deletions python_sdk/docs/specifications/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ Specifications regroup all the settings used to create jobs with our APIs.
eval_s3d
eval_sortho
clearance

pc_conversion
pc_optimization
mesh_sampling
tile_map_optimization
vector_optimization

Modeling
========
Expand All @@ -61,10 +65,14 @@ Analysis
* :doc:`/specifications/eval_o2d`, :doc:`/specifications/eval_o3d`, :doc:`/specifications/eval_s2d`, :doc:`/specifications/eval_s3d` and :doc:`/specifications/eval_sortho` will compare a prediction to a reference for a specific detection.
* :doc:`/specifications/clearance` uses a 3D model and a footprint to compute clearance information.

.. Conversion
.. ==========
Conversion
==========

.. * :doc:`/specifications/point_cloud_conversion` will convert point clouds from one format to another.
* :doc:`/specifications/pc_conversion` will convert a single point cloud from one format to another.
* :doc:`/specifications/pc_optimization` will consolidate multiple point cloud to a given format.
* :doc:`/specifications/mesh_sampling` will sample meshes and consolidate them to a given format.
* :doc:`/specifications/tile_map_optimization` will consolidate tile maps to a given format.
* :doc:`/specifications/vector_optimization` will consolidate vector data to a given format.

Utilities
=========
Expand Down
37 changes: 37 additions & 0 deletions python_sdk/docs/specifications/mesh_sampling.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
=============
Mesh sampling
=============

The *mesh sampling* job takes one or multiple reality data meshes as an input and will sample and consolidate them into a single point cloud.

.. contents:: Quick access
:local:
:depth: 2

Examples
========

In this example, we create a specification for submitting a mesh sampling job to 3D Tiles format:

.. literalinclude:: examples/mesh_sampling_specs.py
:language: Python

Classes
=======

.. currentmodule:: reality_capture.specifications.mesh_sampling

.. autopydantic_model:: MeshSamplingSpecificationsCreate

.. autopydantic_model:: MeshSamplingSpecifications

.. autopydantic_model:: MeshSamplingInputs
:model-show-json: False

.. autopydantic_model:: MeshSamplingOptions
:model-show-json: False

.. autoclass:: MeshSamplingFormat
:show-inheritance:
:members:
:undoc-members:
38 changes: 38 additions & 0 deletions python_sdk/docs/specifications/pc_conversion.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
======================
Point cloud conversion
======================

The *point cloud conversion* job takes a reality data point cloud as an input and will convert it in the selected format.
Should multiple point clouds be present in the reality data, each point cloud will be converted to a different file.

.. contents:: Quick access
:local:
:depth: 2

Examples
========

In this example, we create a specification for submitting a point cloud conversion job to LAS format:

.. literalinclude:: examples/pc_conv_specs.py
:language: Python

Classes
=======

.. currentmodule:: reality_capture.specifications.point_cloud_conversion

.. autopydantic_model:: PointCloudConversionSpecificationsCreate

.. autopydantic_model:: PointCloudConversionSpecifications

.. autopydantic_model:: PCConversionInputs
:model-show-json: False

.. autopydantic_model:: PCConversionOptions
:model-show-json: False

.. autoclass:: PCConversionFormat
:show-inheritance:
:members:
:undoc-members:
37 changes: 37 additions & 0 deletions python_sdk/docs/specifications/pc_optimization.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
========================
Point cloud optimization
========================

The *point cloud optimization* job takes one or multiple reality data point cloud as an input and will consolidate them into a single point cloud.

.. contents:: Quick access
:local:
:depth: 2

Examples
========

In this example, we create a specification for submitting a point cloud optimization job to 3D Tiles format:

.. literalinclude:: examples/pc_optim_specs.py
:language: Python

Classes
=======

.. currentmodule:: reality_capture.specifications.point_cloud_optimization

.. autopydantic_model:: PCOptimizationSpecificationsCreate

.. autopydantic_model:: PCOptimizationSpecifications

.. autopydantic_model:: PCOptimizationInputs
:model-show-json: False

.. autopydantic_model:: PCOptimizationOptions
:model-show-json: False

.. autoclass:: PCOptimizationFormat
:show-inheritance:
:members:
:undoc-members:
42 changes: 42 additions & 0 deletions python_sdk/docs/specifications/tile_map_optimization.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
=====================
Tile map optimization
=====================

The *tile map optimization* job takes one or multiple reality data tile maps as an input and will consolidate them into a single tile map.

.. contents:: Quick access
:local:
:depth: 2

Examples
========

In this example, we create a specification for submitting a tile map optimization job to XYZ format:

.. literalinclude:: examples/tm_optimization.py
:language: Python

Classes
=======

.. currentmodule:: reality_capture.specifications.tile_map_optimization

.. autopydantic_model:: TileMapOptimizationSpecificationsCreate

.. autopydantic_model:: TileMapOptimizationSpecifications

.. autopydantic_model:: TileMapOptimizationInputs
:model-show-json: False

.. autopydantic_model:: TileMapOptimizationOptions
:model-show-json: False

.. autoclass:: TileMapOptimizationFormat
:show-inheritance:
:members:
:undoc-members:

.. autoclass:: TileMapImageFormat
:show-inheritance:
:members:
:undoc-members:
37 changes: 37 additions & 0 deletions python_sdk/docs/specifications/vector_optimization.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
===================
Vector optimization
===================

The *vector optimization* job takes one or multiple reality data vectors as an input and will consolidate them into a vector data.

.. contents:: Quick access
:local:
:depth: 2

Examples
========

In this example, we create a specification for submitting a vector optimization job to the Bentley Feature Database:

.. literalinclude:: examples/vector_optim.py
:language: Python

Classes
=======

.. currentmodule:: reality_capture.specifications.vector_optimization

.. autopydantic_model:: VectorOptimizationSpecificationsCreate

.. autopydantic_model:: VectorOptimizationSpecifications

.. autopydantic_model:: VectorOptimizationInputs
:model-show-json: False

.. autopydantic_model:: VectorOptimizationOptions
:model-show-json: False

.. autoclass:: VectorOptimizationFormat
:show-inheritance:
:members:
:undoc-members:
46 changes: 40 additions & 6 deletions python_sdk/src/reality_capture/service/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,17 @@
TouchUpExportSpecifications, TouchUpExportSpecificationsCreate)
from reality_capture.specifications.water_constraints import (WaterConstraintsSpecifications,
WaterConstraintsSpecificationsCreate)
"""from reality_capture.specifications.point_cloud_conversion import (PointCloudConversionSpecificationsCreate,
PointCloudConversionSpecifications)"""
from reality_capture.specifications.point_cloud_conversion import (PointCloudConversionSpecificationsCreate,
PointCloudConversionSpecifications)
from reality_capture.specifications.point_cloud_optimization import (PCOptimizationSpecificationsCreate,
PCOptimizationSpecifications)
from reality_capture.specifications.mesh_sampling import MeshSamplingSpecificationsCreate, MeshSamplingSpecifications
from reality_capture.specifications.tile_map_optimization import (TileMapOptimizationSpecificationsCreate,
TileMapOptimizationSpecifications)
from reality_capture.specifications.vector_optimization import (VectorOptimizationSpecificationsCreate,
VectorOptimizationSpecifications)
# from reality_capture.specifications.cs_tiler import (ContextSceneTilerSpecifications,
# ContextSceneTilerSpecificationsCreate)

from reality_capture.specifications.gaussian_splats import (GaussianSplatsSpecificationsCreate,
GaussianSplatsSpecifications)
Expand Down Expand Up @@ -64,12 +73,18 @@ class JobType(Enum):
TOUCH_UP_EXPORT = "TouchUpExport"
WATER_CONSTRAINTS = "WaterConstraints"
CLEARANCE_CALCULATION = "ClearanceCalculation"
# POINT_CLOUD_CONVERSION = "PointCloudConversion"
POINT_CLOUD_CONVERSION = "PointCloudConversion"
POINT_CLOUD_OPTIMIZATION = "PointCloudOptimization"
MESH_SAMPLING = "MeshSampling"
TILE_MAP_OPTIMIZATION = "TileMapOptimization"
VECTOR_OPTIMIZATION = "VectorOptimization"
# CONTEXTSCENE_TILER = "ContextSceneTiler"


class Service(Enum):
MODELING = "Modeling"
ANALYSIS = "Analysis"
# CONVERSION = "Conversion"
CONVERSION = "Conversion"


def _get_appropriate_service(jt: JobType):
Expand All @@ -81,7 +96,9 @@ def _get_appropriate_service(jt: JobType):
JobType.CHANGE_DETECTION, JobType.EVAL_O2D, JobType.EVAL_O3D, JobType.EVAL_S2D,
JobType.EVAL_S3D, JobType.EVAL_SORTHO, JobType.CLEARANCE_CALCULATION]:
return Service.ANALYSIS
# return Service.CONVERSION
if jt in [JobType.POINT_CLOUD_CONVERSION, JobType.POINT_CLOUD_OPTIMIZATION, JobType.MESH_SAMPLING,
JobType.TILE_MAP_OPTIMIZATION, JobType.VECTOR_OPTIMIZATION]: # JobType.CONTEXTSCENE_TILER
return Service.CONVERSION
raise NotImplementedError("Other services not yet implemented")


Expand All @@ -98,7 +115,6 @@ class JobState(Enum):
class JobCreate(BaseModel):
name: Optional[str] = Field(None, description="Displayable job name.", min_length=3)
type: JobType = Field(description="Type of job.")
# TODO : PointCloudConversionSpecificationsCreate,
specifications: Union[CalibrationSpecificationsCreate, ChangeDetectionSpecificationsCreate,
ConstraintsSpecificationsCreate,
EvalO2DSpecificationsCreate, EvalO3DSpecificationsCreate,
Expand All @@ -110,6 +126,9 @@ class JobCreate(BaseModel):
Segmentation3DSpecificationsCreate, SegmentationOrthophotoSpecificationsCreate,
TilingSpecificationsCreate, TouchUpExportSpecificationsCreate,
TouchUpImportSpecificationsCreate, WaterConstraintsSpecificationsCreate,
PointCloudConversionSpecificationsCreate, PCOptimizationSpecificationsCreate,
MeshSamplingSpecificationsCreate, TileMapOptimizationSpecificationsCreate,
VectorOptimizationSpecificationsCreate, # ContextSceneTilerSpecificationsCreate,
ClearanceSpecificationsCreate] = (
Field(description="Specifications aligned with the job type."))
itwin_id: str = Field(description="iTwin ID, used by the service for finding "
Expand Down Expand Up @@ -155,6 +174,9 @@ class Job(BaseModel):
Segmentation3DSpecifications, SegmentationOrthophotoSpecifications,
TilingSpecifications, TouchUpExportSpecifications,
TouchUpImportSpecifications, WaterConstraintsSpecifications,
PointCloudConversionSpecifications, PCOptimizationSpecifications,
MeshSamplingSpecifications, TileMapOptimizationSpecifications,
VectorOptimizationSpecifications, # ContextSceneTilerSpecifications,
ClearanceSpecifications] = (
Field(description="Specifications aligned with the job type."))

Expand Down Expand Up @@ -209,6 +231,18 @@ def set_specification_validation_model(cls, raw_dict: dict[str, Any], validation
specifications = WaterConstraintsSpecifications(**raw_dict)
elif job_type == JobType.CLEARANCE_CALCULATION:
specifications = ClearanceSpecifications(**raw_dict)
elif job_type == JobType.POINT_CLOUD_CONVERSION:
specifications = PointCloudConversionSpecifications(**raw_dict)
elif job_type == JobType.POINT_CLOUD_OPTIMIZATION:
specifications = PCOptimizationSpecifications(**raw_dict)
elif job_type == JobType.MESH_SAMPLING:
specifications = MeshSamplingSpecifications(**raw_dict)
elif job_type == JobType.TILE_MAP_OPTIMIZATION:
specifications = TileMapOptimizationSpecifications(**raw_dict)
elif job_type == JobType.VECTOR_OPTIMIZATION:
specifications = VectorOptimizationSpecifications(**raw_dict)
# elif job_type == JobType.CONTEXTSCENE_TILER:
# specifications = ContextSceneTilerSpecifications(**raw_dict)
else:
raise ValueError(f"Unsupported job type: {job_type}")

Expand Down
5 changes: 5 additions & 0 deletions python_sdk/src/reality_capture/service/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,16 @@ def _get_modeling_url(self) -> str:
def _get_analysis_url(self) -> str:
return self._service_url + "reality-analysis/"

def _get_conversion_url(self) -> str:
return self._service_url + "reality-conversion/"

def _get_correct_url(self, service: Service) -> str:
if service == Service.MODELING:
return self._get_modeling_url()
if service == Service.ANALYSIS:
return self._get_analysis_url()
if service == Service.CONVERSION:
return self._get_conversion_url()
raise NotImplementedError("Other services not yet implemented")

@staticmethod
Expand Down
Loading
Loading