Skip to content

Commit ce39602

Browse files
authored
Merge pull request #92 from Geode-solutions/fix/database
database integration. using id from database of OGW-Microservice's da…
2 parents 862b28a + d3d6cee commit ce39602

38 files changed

+798
-460
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ build
1111
*.egg-info
1212
.coverage*
1313
.mypy_cache
14+
*.db
15+
tests/data
16+
1417
opengeodeweb_viewer_schemas.json

pyproject.toml

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,25 @@ build-backend = "setuptools.build_meta"
77
name = "OpenGeodeWeb-Viewer"
88
version = "0.0.0"
99
dynamic = ["dependencies"]
10-
authors = [
11-
{ name="Geode-solutions", email="[email protected]" },
12-
]
10+
authors = [{ name = "Geode-solutions", email = "[email protected]" }]
1311
description = "OpenGeodeWeb-Viewer is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem"
1412
readme = "README.md"
1513
requires-python = ">=3.9"
1614
classifiers = [
17-
"Programming Language :: Python :: 3",
18-
"License :: OSI Approved :: MIT License",
19-
"Operating System :: OS Independent",
15+
"Programming Language :: Python :: 3",
16+
"License :: OSI Approved :: MIT License",
17+
"Operating System :: OS Independent",
2018
]
2119

2220
[project.urls]
2321
"Homepage" = "https://github.com/Geode-solutions/OpenGeodeWeb-Viewer"
2422
"Bug Tracker" = "https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/issues"
2523

2624
[project.scripts]
27-
opengeodeweb_viewer = "opengeodeweb_viewer.vtkw_server:run_server"
25+
opengeodeweb-viewer = "opengeodeweb_viewer.vtkw_server:run_server"
2826

2927
[tool.setuptools.dynamic]
30-
dependencies = {file = ["requirements.txt"]}
28+
dependencies = { file = ["requirements.txt"] }
3129

3230
[tool.setuptools.packages.find]
3331
where = ["src"]

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,3 @@ wslink==1.12.4
6161
yarl>=1
6262
# via aiohttp
6363

64-
opengeodeweb-microservice==1.*,>=1.0.4rc7

src/opengeodeweb_viewer/config.py

Lines changed: 28 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
import os
2-
import tempfile
32
from shutil import copyfile, copytree
43
from sys import platform
54

65

7-
def default_config():
6+
def default_config() -> None:
87
os.environ["DEFAULT_HOST"] = "localhost"
98
os.environ["DEFAULT_PORT"] = "1234"
109

1110

12-
def prod_config():
11+
def prod_config() -> None:
1312
default_config()
1413
os.environ["DATA_FOLDER_PATH"] = "/data/"
1514

1615

17-
def dev_config():
16+
def dev_config() -> None:
1817
default_config()
1918
if platform == "linux":
2019
os.environ["DATA_FOLDER_PATH"] = "/temp/OpenGeodeWeb_Data/"
@@ -26,51 +25,39 @@ def dev_config():
2625
os.mkdir(os.environ.get("DATA_FOLDER_PATH"))
2726

2827

29-
def test_config(path):
30-
default_config()
31-
32-
tmp_data_root = tempfile.mkdtemp(prefix="ogw_test_data_")
33-
os.environ["DATA_FOLDER_PATH"] = tmp_data_root
34-
35-
src_data = os.path.join(path, "data")
36-
if not os.path.isdir(src_data):
37-
raise FileNotFoundError(f"Test data folder not found: {src_data}")
38-
39-
test_ids = ["123456789", "12345678"]
40-
valid_exts = {".vtp", ".vti", ".vtu", ".vtm"}
41-
42-
project_uuid = "test-project-uuid"
43-
data_uuid = "test-data-uuid"
44-
uploads_directory = os.path.join(tmp_data_root, project_uuid, "uploads")
45-
structure_directory = os.path.join(tmp_data_root, project_uuid, data_uuid)
46-
47-
for directory in [
48-
*test_ids,
49-
uploads_directory,
50-
structure_directory,
51-
]: # create directories for tests
52-
os.makedirs(
53-
(
54-
os.path.join(tmp_data_root, directory)
55-
if isinstance(directory, str)
56-
else directory
57-
),
58-
exist_ok=True,
59-
)
60-
28+
def _copy_test_assets(
29+
src_data: str,
30+
tmp_data_root: str,
31+
test_ids: list[str],
32+
valid_exts: set[str],
33+
uploads_directory: str,
34+
structure_directory: str,
35+
) -> None:
6136
for root, directories, files in os.walk(src_data):
6237
for directory in directories:
63-
dst = os.path.join(tmp_data_root, test_ids[0], directory)
64-
copytree(os.path.join(root, directory), dst, dirs_exist_ok=True)
65-
38+
for test_id in test_ids:
39+
dst = os.path.join(tmp_data_root, test_id, directory)
40+
copytree(os.path.join(root, directory), dst, dirs_exist_ok=True)
6641
for file in files:
6742
if os.path.splitext(file)[1].lower() not in valid_exts:
6843
continue
69-
7044
src = os.path.join(root, file)
7145
for test_id in test_ids:
7246
copyfile(src, os.path.join(tmp_data_root, test_id, file))
7347
copyfile(src, os.path.join(structure_directory, file))
7448
copyfile(src, os.path.join(uploads_directory, file))
7549

76-
print(f"\nDATA_FOLDER_PATH set to: {tmp_data_root}", flush=True)
50+
51+
def test_config() -> None:
52+
default_config()
53+
if "DATA_FOLDER_PATH" not in os.environ:
54+
data_path = os.path.join(os.path.dirname(__file__), "..", "..", "tests", "data")
55+
os.environ["DATA_FOLDER_PATH"] = os.path.abspath(data_path)
56+
57+
data_path = os.environ["DATA_FOLDER_PATH"]
58+
if not os.path.exists(data_path):
59+
os.makedirs(data_path, exist_ok=True)
60+
61+
db_file = os.path.join(data_path, "project.db")
62+
if not os.path.exists(db_file):
63+
open(db_file, "a").close()

src/opengeodeweb_viewer/object/object_methods.py

Lines changed: 57 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,21 @@
55
import vtk
66

77
# Local application imports
8-
from opengeodeweb_viewer.utils_functions import get_schemas_dict, validate_schema
98
from opengeodeweb_viewer.vtk_protocol import VtkView
109

1110

1211
class VtkObjectView(VtkView):
13-
def __init__(self):
12+
def __init__(self) -> None:
1413
super().__init__()
1514

16-
def registerObject(self, id, file_name, reader, filter, mapper):
15+
def registerObject(
16+
self,
17+
id: str,
18+
file_name: str,
19+
reader: vtk.vtkDataReader,
20+
filter: vtk.vtkAlgorithm | None,
21+
mapper: vtk.vtkMapper,
22+
) -> None:
1723
actor = vtk.vtkActor()
1824
self.register_object(id, reader, filter, actor, mapper, {})
1925
reader.SetFileName(os.path.join(self.DATA_FOLDER_PATH, id, file_name))
@@ -30,19 +36,19 @@ def registerObject(self, id, file_name, reader, filter, mapper):
3036
renderWindow.Render()
3137
self.render()
3238

33-
def deregisterObject(self, id):
34-
actor = self.get_object(id)["actor"]
39+
def deregisterObject(self, data_id: str) -> None:
40+
actor = self.get_object(data_id)["actor"]
3541
renderWindow = self.getView("-1")
3642
renderer = renderWindow.GetRenderers().GetFirstRenderer()
3743
renderer.RemoveActor(actor)
38-
self.deregister_object(id)
44+
self.deregister_object(data_id)
3945
self.render()
4046

41-
def applyTextures(self, id, textures):
42-
textures_array = []
43-
images_reader_array = []
47+
def applyTextures(self, data_id: str, textures: list[dict[str, str]]) -> None:
48+
textures_array: list[vtk.vtkTexture] = []
49+
images_reader_array: list[vtk.vtkXMLImageDataReader] = []
4450

45-
data = self.get_object(id)
51+
data = self.get_object(data_id)
4652
mapper = data["mapper"]
4753
actor = data["actor"]
4854
reader = data["reader"]
@@ -52,14 +58,13 @@ def applyTextures(self, id, textures):
5258

5359
for index, value in enumerate(textures):
5460
texture_name = value["texture_name"]
55-
texture_file_name = value["texture_file_name"]
56-
print(f"{texture_name=} {texture_file_name=}", flush=True)
61+
id_texture = value["id"]
62+
print(f"{texture_name=} {id_texture=}", flush=True)
5763

5864
new_texture = vtk.vtkTexture()
5965
image_reader = vtk.vtkXMLImageDataReader()
60-
image_reader.SetFileName(
61-
os.path.join(self.DATA_FOLDER_PATH, id, texture_file_name)
62-
)
66+
texture_path = self.get_data_file_path(data_id, id_texture)
67+
image_reader.SetFileName(texture_path)
6368

6469
shader_texture_name = f"VTK_TEXTURE_UNIT_{index}"
6570
polydata_mapper.MapDataArrayToMultiTextureAttribute(
@@ -87,83 +92,87 @@ def applyTextures(self, id, textures):
8792

8893
self.render()
8994

90-
def SetVisibility(self, id, visibility):
91-
actor = self.get_object(id)["actor"]
95+
def SetVisibility(self, data_id: str, visibility: bool) -> None:
96+
actor = self.get_object(data_id)["actor"]
9297
actor.SetVisibility(visibility)
9398
self.render()
9499

95-
def SetOpacity(self, id, opacity):
96-
actor = self.get_object(id)["actor"]
100+
def SetOpacity(self, data_id: str, opacity: float) -> None:
101+
actor = self.get_object(data_id)["actor"]
97102
actor.GetProperty().SetOpacity(opacity)
98103
self.render()
99104

100-
def SetColor(self, id, red, green, blue):
101-
mapper = self.get_object(id)["mapper"]
105+
def SetColor(self, data_id: str, red: int, green: int, blue: int) -> None:
106+
mapper = self.get_object(data_id)["mapper"]
102107
mapper.ScalarVisibilityOff()
103-
actor = self.get_object(id)["actor"]
108+
actor = self.get_object(data_id)["actor"]
104109
actor.GetProperty().SetColor([red / 255, green / 255, blue / 255])
105110
self.render()
106111

107-
def SetEdgesVisibility(self, id, visibility):
108-
actor = self.get_object(id)["actor"]
109-
max_dimension = self.get_object(id)["max_dimension"]
112+
def SetEdgesVisibility(self, data_id: str, visibility: bool) -> None:
113+
actor = self.get_object(data_id)["actor"]
114+
max_dimension = self.get_object(data_id)["max_dimension"]
110115
if max_dimension == "edges":
111-
self.SetVisibility(id, visibility)
116+
self.SetVisibility(data_id, visibility)
112117
else:
113118
actor.GetProperty().SetEdgeVisibility(visibility)
114119
self.render()
115120

116-
def SetEdgesWidth(self, id, width):
117-
actor = self.get_object(id)["actor"]
121+
def SetEdgesWidth(self, data_id: str, width: float) -> None:
122+
actor = self.get_object(data_id)["actor"]
118123
actor.GetProperty().SetEdgeWidth(width)
119124
self.render()
120125

121-
def SetEdgesColor(self, id, red, green, blue):
122-
actor = self.get_object(id)["actor"]
123-
max_dimension = self.get_object(id)["max_dimension"]
126+
def SetEdgesColor(self, data_id: str, red: int, green: int, blue: int) -> None:
127+
actor = self.get_object(data_id)["actor"]
128+
max_dimension = self.get_object(data_id)["max_dimension"]
124129
if max_dimension == "edges":
125-
self.SetColor(id, red, green, blue)
130+
self.SetColor(data_id, red, green, blue)
126131
else:
127132
actor.GetProperty().SetEdgeColor([red / 255, green / 255, blue / 255])
128133
self.render()
129134

130-
def SetPointsVisibility(self, id, visibility):
131-
actor = self.get_object(id)["actor"]
132-
max_dimension = self.get_object(id)["max_dimension"]
135+
def SetPointsVisibility(self, data_id: str, visibility: bool) -> None:
136+
actor = self.get_object(data_id)["actor"]
137+
max_dimension = self.get_object(data_id)["max_dimension"]
133138
if max_dimension == "points":
134-
self.SetVisibility(id, visibility)
139+
self.SetVisibility(data_id, visibility)
135140
else:
136141
actor.GetProperty().SetVertexVisibility(visibility)
137142
self.render()
138143

139-
def SetPointsSize(self, id, size):
140-
actor = self.get_object(id)["actor"]
144+
def SetPointsSize(self, data_id: str, size: float) -> None:
145+
actor = self.get_object(data_id)["actor"]
141146
actor.GetProperty().SetPointSize(size)
142147
self.render()
143148

144-
def SetPointsColor(self, id, red, green, blue):
145-
actor = self.get_object(id)["actor"]
146-
max_dimension = self.get_object(id)["max_dimension"]
149+
def SetPointsColor(self, data_id: str, red: int, green: int, blue: int) -> None:
150+
actor = self.get_object(data_id)["actor"]
151+
max_dimension = self.get_object(data_id)["max_dimension"]
147152
if max_dimension == "points":
148-
self.SetColor(id, red, green, blue)
153+
self.SetColor(data_id, red, green, blue)
149154
else:
150155
actor.GetProperty().SetVertexColor([red / 255, green / 255, blue / 255])
151156
self.render()
152157

153-
def SetBlocksVisibility(self, id, block_ids, visibility):
154-
mapper = self.get_object(id)["mapper"]
158+
def SetBlocksVisibility(
159+
self, data_id: str, block_ids: list[int], visibility: bool
160+
) -> None:
161+
mapper = self.get_object(data_id)["mapper"]
155162
for block_id in block_ids:
156163
mapper.SetBlockVisibility(block_id, visibility)
157164
self.render()
158165

159-
def SetBlocksColor(self, id, block_ids, red, green, blue):
160-
mapper = self.get_object(id)["mapper"]
166+
def SetBlocksColor(
167+
self, data_id: str, block_ids: list[int], red: int, green: int, blue: int
168+
) -> None:
169+
mapper = self.get_object(data_id)["mapper"]
161170
for block_id in block_ids:
162171
mapper.SetBlockColor(block_id, [red / 255, green / 255, blue / 255])
163172
self.render()
164173

165-
def clearColors(self, id):
166-
db = self.get_object(id)
174+
def clearColors(self, data_id: str) -> None:
175+
db = self.get_object(data_id)
167176
mapper = db["mapper"]
168177
reader = db["reader"]
169178
reader.GetOutput().GetPointData().SetActiveScalars("")

src/opengeodeweb_viewer/py.typed

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
partial
1+
partial

src/opengeodeweb_viewer/rpc/generic/generic_protocols.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,20 @@ def register(self, params):
2727
params, self.generic_schemas_dict["register"], self.generic_prefix
2828
)
2929
viewer_object = params["viewer_object"]
30-
params.pop("viewer_object", None)
30+
specific_params = {"id": params["id"]}
3131
if viewer_object == "mesh":
32-
self.mesh_protocols.registerMesh(params)
32+
self.mesh_protocols.registerMesh(specific_params)
3333
elif viewer_object == "model":
34-
self.model_protocols.registerModel(params)
34+
self.model_protocols.registerModel(specific_params)
3535

3636
@exportRpc(generic_prefix + generic_schemas_dict["deregister"]["rpc"])
3737
def deregister(self, params):
3838
validate_schema(
3939
params, self.generic_schemas_dict["deregister"], self.generic_prefix
4040
)
4141
viewer_object = params["viewer_object"]
42-
params.pop("viewer_object", None)
42+
specific_params = {"id": params["id"]}
4343
if viewer_object == "mesh":
44-
self.mesh_protocols.deregisterMesh(params)
44+
self.mesh_protocols.deregisterMesh(specific_params)
4545
elif viewer_object == "model":
46-
self.model_protocols.deregisterModel(params)
46+
self.model_protocols.deregisterModel(specific_params)

src/opengeodeweb_viewer/rpc/generic/schemas/register.json

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,11 @@
1313
"id": {
1414
"type": "string",
1515
"minLength": 1
16-
},
17-
"file_name": {
18-
"type": "string",
19-
"minLength": 1
2016
}
2117
},
2218
"required": [
2319
"viewer_object",
24-
"id",
25-
"file_name"
20+
"id"
2621
],
2722
"additionalProperties": false
2823
}

0 commit comments

Comments
 (0)