diff --git a/.gitignore b/.gitignore index 19ee478..8a512a7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ __pycache__/ latest_logs schemas.json build +src/tests/tests_output/ *.egg-info diff --git a/CHANGELOG.md b/CHANGELOG.md index cbe5129..e688d76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,456 +1,180 @@ # CHANGELOG -## v0.3.0 (2024-11-06) - -### Unknown +## v1.0.0-rc.4 (2024-11-29) -* Merge pull request #28 from Geode-solutions/next +### Bug Fixes -Next ([`f2bca53`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/f2bca537d3a1d04eaa8f7a1046f15ba4b1937b7a)) +- **schemas**: Export generic schemas in package + ([`88e87a0`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/88e87a044f1152ea30bd14a02337ac9f80759780)) -## v0.3.0-rc.1 (2024-10-31) +## v1.0.0-rc.3 (2024-11-29) -### Features +### Bug Fixes -* feat(screenshot): new rpc -missing unit tests ([`9e0c637`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/9e0c63729574144ed55af1633883e2496b4dd7aa)) +- **schemas**: Generic rpc in global final schema + ([`cb101e5`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/cb101e5b895d589ef3ff6b6476a4c077b36cd0db)) -### Unknown -* Merge pull request #27 from Geode-solutions/feat/screenshot +## v1.0.0-rc.2 (2024-11-28) -feat(screenshot): new rpc ([`c12723d`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c12723dd8c77cfb2301a106f9948b062ee3e5917)) +### Bug Fixes -* Update src/tests/conftest.py +- **viewer schemas**: Remove 'viewer' prefix + ([`f2fdc20`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/f2fdc20e16fe73b5c7ca30b45f3c7ddc511aa85b)) -Co-authored-by: Arnaud Botella ([`becbd80`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/becbd80025c6c4ce8a875fc0ac58000314c5b068)) -* fix tests ([`3bd2b77`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/3bd2b77231e4dccbd13c8de869f5d56a3d7f83a2)) +## v1.0.0-rc.1 (2024-11-28) -* fix get_response for bytes response ([`0586102`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/0586102a1ac50f2d022098cede23fca786458d96)) -* update unit tests ([`0371651`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/03716512c3f9441f0c21fd81ccbe7c8e3cd9d060)) +## v0.4.0-rc.2 (2024-11-28) -* more options : filename/output_extention/background ([`f9a547c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/f9a547c0be68b320292c6c1f2f62bcef94d377ee)) +### Features -* ([`8ef5d85`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8ef5d856295d40b5bc915be59e540e5b36ef6bff)) +- **new rpcs**: Refactor rpcs + ([`c2fb4e7`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c2fb4e75b83a862267ed4641e41e9344e6a2d70f)) +BREAKING CHANGE: change some rpc names in schemas -## v0.2.1 (2024-10-22) +- **generic rpcs**: Refactor all classes/tests + ([`563f41b`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/563f41bc0741ab1dae9e5df9244e545e6ba47993)) -### Unknown +- **generic rpcs**: Refactor all classes/tests + ([`297b005`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/297b0050e4ab47817659021c3a099e715fba6a87)) -* Merge pull request #26 from Geode-solutions/next -Next ([`1ce50d5`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/1ce50d5a60d01f3aa2ba736341e5c7f37955f04d)) +## v0.4.0-rc.1 (2024-11-25) +### Features -## v0.2.1-rc.2 (2024-10-21) +- **rpc**: Set_opacity + ([`66836bc`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/66836bcce1c276145a673b9d3ad3d4bfbea97b65)) -### Bug Fixes +- **rpc**: Set_viewer_background_color + ([`06992c6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/06992c6db8e3d8471dd9c3b90ab4663a8e4f1a3c)) -* fix(typo): typo if not "host" in args: ([`fd59543`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/fd59543f92a52758a8d6530894e7b8b6a82748ef)) +## v0.3.0 (2024-11-06) -## v0.2.1-rc.1 (2024-10-21) -### Bug Fixes +## v0.3.0-rc.1 (2024-10-31) -* fix(host): default localhost ([`c698b56`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c698b561209d8c07a4e895845a013af4d33e2ff2)) +### Features -### Unknown +- **screenshot**: New rpc + ([`9e0c637`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/9e0c63729574144ed55af1633883e2496b4dd7aa)) -* Merge pull request #25 from Geode-solutions/fix/host -Fix/host ([`3ff4710`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/3ff4710b2f609ed62bb10beacbc624e224c71b84)) +## v0.2.1 (2024-10-22) -* typo ([`a8d54a8`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/a8d54a88fef494f7985cc6266a9106bec69a6d40)) -* args.port ([`5dd2f7c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/5dd2f7ce5b49bc9907db1e1e3ee7639ea94ccdda)) +## v0.2.1-rc.2 (2024-10-21) -* test remove host argument ([`ed2b895`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/ed2b895e3a5759e21afc55a6fdda74c1c19b12f4)) +### Bug Fixes -* remove python-dotenv ([`7f68516`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/7f68516bfe48e62fe5eb8ab38188053a8862f47d)) +- **typo**: Typo if not "host" in args: + ([`fd59543`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/fd59543f92a52758a8d6530894e7b8b6a82748ef)) -* ([`1667c3f`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/1667c3f7c37ad2512b82865e2a61bc8677475048)) +## v0.2.1-rc.1 (2024-10-21) -## v0.2.0 (2024-07-16) +### Bug Fixes -### Unknown +- **host**: Default localhost + ([`c698b56`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c698b561209d8c07a4e895845a013af4d33e2ff2)) -* Merge pull request #23 from Geode-solutions/next -Next ([`74896fb`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/74896fb0feef987866f0e17bdcdfe4d54fb05a45)) +## v0.2.0 (2024-07-16) ## v0.2.0-rc.2 (2024-07-16) ### Bug Fixes -* fix(gpu_mode): hardcode vtk version in gpu mode ([`20f3828`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/20f382897bad7a3e3c62cb0fe7a308ab73dc9625)) - -### Unknown - -* Merge pull request #24 from Geode-solutions/fix/hardcode_vtk_version - -fix(gpu_mode): hardcode vtk version in gpu mode ([`7666c0d`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/7666c0dbfa50eda45aed6673f06c9b90827b49f4)) +- **gpu_mode**: Hardcode vtk version in gpu mode + ([`20f3828`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/20f382897bad7a3e3c62cb0fe7a308ab73dc9625)) ## v0.2.0-rc.1 (2024-06-28) ### Features -* feat(vtkw_server): dynamic port and data_folder_path ([`d1e71a6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/d1e71a6d480e9156cc4ff957baa38365dcf11404)) - -### Unknown - -* Merge pull request #22 from Geode-solutions/feat/dynamic_run_arguments - -feat(vtkw_server): dynamic port and data_folder_path ([`6f8bf75`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6f8bf756d4ab319e72ddf6660ad544ab70e32d58)) - -* ([`9d49a8f`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/9d49a8f036d4bab72a56710002e72752cc3fdefd)) +- **vtkw_server**: Dynamic port and data_folder_path + ([`d1e71a6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/d1e71a6d480e9156cc4ff957baa38365dcf11404)) ## v0.1.2 (2024-05-03) -### Unknown - -* Merge pull request #21 from Geode-solutions/next - -Next ([`fe20c68`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/fe20c689cff02a723b6d58e3ccd17ab1cd770657)) - ## v0.1.2-rc.1 (2024-05-03) ### Bug Fixes -* fix(actions): admin token for actions ([`35e2a56`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/35e2a56bed848908400dde04e466f93cc6d6a56f)) - -### Unknown - -* Merge pull request #20 from Geode-solutions/fix/admin_token - -fix(actions): admin token for actions ([`2bc881c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/2bc881ccee9636469a3edbdfcc4934099be2c08b)) - -* ([`b7a6367`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/b7a63678c77bba82cf36fc13cdea1237e1c33a6d)) +- **actions**: Admin token for actions + ([`35e2a56`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/35e2a56bed848908400dde04e466f93cc6d6a56f)) ## v0.1.1 (2024-03-13) -### Unknown - -* Merge pull request #19 from Geode-solutions/next - -Next ([`e749534`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/e7495349145826e1ecc874f387a03c0963369e3f)) - ## v0.1.1-rc.2 (2024-03-13) ### Bug Fixes -* fix(CPU): handle vtk cpu ([`9fc05dc`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/9fc05dc37c37a7692850e57d5a7a2feea13aef76)) - -### Unknown - -* Merge pull request #18 from Geode-solutions/vtk-cpu - -fix(CPU): handle vtk cpu ([`4cc9f76`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/4cc9f7653b571065538723b4502603ef0d8f88ac)) - -* test ([`6ba1ce5`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6ba1ce5c73f1f59a980aee2e8bbb938dc2036838)) +- **CPU**: Handle vtk cpu + ([`9fc05dc`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/9fc05dc37c37a7692850e57d5a7a2feea13aef76)) ## v0.1.1-rc.1 (2024-03-13) ### Bug Fixes -* fix(tests): tests in src and fix paths ([`2688759`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/2688759121f1176bca6b1cec7aa9e054b8f4fd26)) - -### Unknown - -* Merge pull request #17 from Geode-solutions/fix/github_actions - -Fix/GitHub actions ([`24b50ee`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/24b50ee0a684590a5cfb6195430c908eec1542ee)) - -* test remove tests data in package ([`fbc4a97`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/fbc4a973d5ce0e93b7fad0491a908883a3c52896)) - -* gpu mode ([`27c12ef`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/27c12ef4369888b403a928798bbcd4266bd4bed8)) - -* test test_config path ([`b2ba02a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/b2ba02a4426fbdc2a6f6600177907d6c3e08446f)) - -* test optional-dependencies ([`ba98f64`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/ba98f641b2d537b940d0f5421bdb16d23a1ed509)) - -* test without vtk ([`21758c6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/21758c636719aa72b3da4d9dfded1f5c3c59322a)) - -* test on all branches build on next/master ([`37e0234`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/37e0234520a3d07a3117860c3a269b6abb50e691)) - -* test ([`6b0128c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6b0128cd41ea3af740447524317cc72c318636d3)) - -* test ([`b12f219`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/b12f2193a1757ac30821823f27c4cd3583765cd6)) - -* no pip install . ([`de9b14c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/de9b14ccc5edd5539c00f8d0339a5fdc3a6d9a2b)) - -* container ([`58ddf2f`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/58ddf2f24b4f5de35f811b786a1b9bdf7943a32a)) - -* test print ([`8a2f131`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8a2f131a01371eb6e5d1b10dc8dbd6607d9ef221)) - -* test remove timeout ([`f9680d2`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/f9680d2ff167b912dae7ea3be15d30433b8406a6)) - -* install python-dotenv ([`2c1d428`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/2c1d428487f4fc5b5ab04ea23fdd1a56644eb104)) - -* install pytest-xprocess ([`8769f65`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8769f6588be2604fd8bbe372ecd39249088127bf)) - -* install xprocess ([`1bd3aaa`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/1bd3aaa887cf3683028229f98a1b66f8df88de28)) - -* add websocket-client ([`2de61bb`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/2de61bbe6a349ea83807774f71d14267074cdd9d)) - -* test pip install . ([`b86f686`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/b86f68652b87928066f9167978b992f9c6ff52ae)) - -* Merge pull request #16 from Geode-solutions/fix/tests - -Fix/tests ([`5f20bf7`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/5f20bf7d64746cc4bcbfc7f71eae1f492cd55c63)) - -* pyproject.toml ([`617833e`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/617833e071e264a08450e582498c7d7827919eb0)) - -* remove CI ([`e629346`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/e629346646f3556196cd0110f96b87cda6d4556a)) - -* Merge branch 'fix/tests' of https://github.com/Geode-solutions/OpenGeodeWeb-Viewer into fix/tests ([`7fabf4a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/7fabf4a1632eb9bd6c37bdd93915608ece00e156)) - -* Update pyproject.toml - -Co-authored-by: Arnaud Botella ([`19fb81b`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/19fb81b78c4c731788f8aeae06d2d170f1d14f45)) - -* change start command ([`44b7c51`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/44b7c51c3dd7f98b53001871b69033246aac1fdf)) - -* CICD pipeline ([`32dddc6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/32dddc67d0bb07fa80bc763c37ffffdb8a55ae3e)) - -* script ([`fb81a0c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/fb81a0c6cefc9b2db8953b238e67501e7942d2d8)) - -* relative imports ([`c3a4f1e`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c3a4f1e97791ee688069e15f5d9a1f0223a19c45)) - -* add CI ([`c1cb848`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c1cb848f8ad6b4adb3db85d8fc26d5c09ebf8e42)) - -* add datas ([`0d512f8`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/0d512f8c835367f9ef13f1dab58bf11ceb3929fd)) - -* uncomment tests ([`bb7f263`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/bb7f2639285fdc996dd5b72b2e60238b26caebe2)) - -* ([`25e758c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/25e758c1a340ef92aed8ae60300548fdc507d9da)) +- **tests**: Tests in src and fix paths + ([`2688759`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/2688759121f1176bca6b1cec7aa9e054b8f4fd26)) ## v0.1.0 (2024-03-07) -### Unknown - -* Merge pull request #14 from Geode-solutions/next - -Next ([`6492fa9`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6492fa998cd2ff5d2f5bd48006e796c2a5da2bf0)) - ## v0.1.0-rc.2 (2024-03-07) ### Bug Fixes -* fix(dependencies): add forgotten dependencies ([`8426ea4`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8426ea49d0e5b97a42c37292b2e3c48afde27455)) - -### Unknown - -* Merge pull request #15 from Geode-solutions/fix/dependencies - -Fix/dependencies ([`4be8888`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/4be888818c48996ad5634306c43016c8bebec1ea)) - -* args ([`df57ea2`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/df57ea2431743c30acdec5a695488c9803a8f39e)) - -* cleanup code 2 ([`9721838`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/9721838b87944cd498851dd11c4664b4e0fa5b9a)) - -* cleanup code ([`94516bd`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/94516bdc2e92701531f04d3b04b94b34388c0506)) - -* remove log ([`c75ef6f`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c75ef6f4ff183152eadaa6c6eb7700f126acb1f6)) - -* save ([`bd25d0f`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/bd25d0f1eea38f90f2728f6fbcb84de80e57fe21)) - -* CC Attribution ([`f27d64c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/f27d64cf63208bb67e67958d119c14ba883dd735)) - -* Merge pull request #13 from Geode-solutions/feat/unit_tests - -Feat/unit tests ([`48e800f`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/48e800fdac30485df0a9a252be9aff6ff90bfa34)) - -* fix protocols self.render() ([`b2bbc8c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/b2bbc8c4d2a715d385b084cb4ba43212ef4e3ff4)) - -* remove unused datas ([`212930c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/212930c5dda15ef51a0f2fd8a8dc7f83391569a5)) - -* delete penguin ([`ddb87c6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/ddb87c6971afe104855c92549a8331c2f4e39e1b)) - -* cleanup ([`41e5ac1`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/41e5ac11e16d3f1491a0f4ddd0425241221812cf)) - -* full from next ([`0e6316d`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/0e6316d136e3f167454802f938714959444aa67d)) +- **dependencies**: Add forgotten dependencies + ([`8426ea4`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8426ea49d0e5b97a42c37292b2e3c48afde27455)) ## v0.1.0-rc.1 (2024-03-05) ### Bug Fixes -* fix(schemas): delete image docker ([`ebd416b`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/ebd416b5eceaecfce61d3c5e136cc3d6ed36184b)) +- **schemas**: Delete image docker + ([`ebd416b`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/ebd416b5eceaecfce61d3c5e136cc3d6ed36184b)) -* fix(license): add copyleft file ([`a0cfd33`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/a0cfd3335e0b12913947917b631b5e13889a9107)) +- **license**: Add copyleft file + ([`a0cfd33`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/a0cfd3335e0b12913947917b631b5e13889a9107)) ### Chores -* chore(licence): happy new year 2024 ([`a69cefe`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/a69cefe053e43a170db48ea31bbc3619feb49bc6)) +- **licence**: Happy new year 2024 + ([`a69cefe`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/a69cefe053e43a170db48ea31bbc3619feb49bc6)) ### Features -* feat(schemas): remove dockerfile + a few changes ([`e81296a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/e81296af2510c975c1d98034f269a5c94e4b89f5)) - -* feat(schemas): test2 ([`53dfa45`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/53dfa45953b098f8ecda5d8773e37fe064b4e7e3)) - -* feat(schemas): test ([`6088534`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6088534e990f44559575f2d4631bc731210e2243)) - -* feat(unit tests): run server ([`11291b8`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/11291b8e808e52e1f4e6d0ab11b739ffd1542ecb)) - -* feat(delete_object_pipeline): add rpc - -Enables an object to be deleted from the viewer ([`5a4df6a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/5a4df6a5d20451491fe27d89886459d9a38f78cd)) - -### Unknown - -* Merge pull request #12 from Geode-solutions/json_import_viewer - -Json import viewer ([`cd3b4a0`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/cd3b4a0b8e564b81d15dafac82469c9b4ac974d3)) - -* remove dockerignore ([`ea38690`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/ea386903ac824235764b36e5b38fcb299557ccc1)) - -* edit generate_schemas ([`8a9ddc2`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8a9ddc2bca30d8ec58af76fa99c1823cb765c99d)) - -* test ([`1c878be`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/1c878be022ab96cffb7d146f38ffbd5241d264d2)) - -* shemas rpc's ([`e45df6a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/e45df6a560a5a8d087f72ad6d1070ba003b8f665)) - -* added new path into the dockerfile ([`9ce3c0c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/9ce3c0cf5f3d143ed6fd10cf4815b80c834d2cfe)) - -* updates json files ([`415f263`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/415f2630ad2053b51e688b46c133c0e714b16698)) - -* updates json files ([`da04546`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/da0454656e505f52d3b3570fbb5eb3655baee3c7)) - -* rpc changes ([`ceefe04`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/ceefe04853f4ce96ea7465065a27e0ea3b501758)) - -* import json ([`1922ae3`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/1922ae3887db7a2a4e8c52b7c6b3282c5932bfb2)) - -* test_get_point_position ([`c244ca4`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c244ca461385d2ad212496cc4ca945ea98c45e96)) - -* Add datas ([`b704167`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/b70416763096d0b999a5b0c21ba93cc4c524f5f1)) - -* test_apply_textures working ([`07e9ed7`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/07e9ed736246ddf56907d7e6a40a2be3321ff548)) - -* delete ([`b980258`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/b9802586c302af7e1248eae71c78848193b8f2d6)) - -* tests ([`7268b09`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/7268b09f82d820402a7f7a6e8733bb402510aaad)) - -* log ([`8d8a8d5`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8d8a8d55aabdfda90a88db160c00179b867652e8)) - -* move json imports ([`f6e3414`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/f6e3414687bb171f80561c04972c6210fecb830f)) - -* fix schemas ([`4da951a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/4da951a4e1bc11ad3468cecfc00dda94d36f7428)) - -* remove print ([`954d2c5`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/954d2c53decbcc5cf3419d82263806e63f94357d)) - -* schemas ([`1f62048`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/1f62048fe00335b7d34c298a09e0c0729b7f2cb2)) - -* test ([`c01871b`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/c01871b30b7916f057dd36d80a9fc1157611f07a)) - -* route becomes rpc ([`6bacedb`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6bacedb228f2cda86a8ea093e82dcfb84558ca42)) - -* dynamic args ([`a40af27`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/a40af270486d894677ea1cf14a6b4b58acaf6edb)) - -* dotenv ([`b4fd9a7`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/b4fd9a7f2a230589219e11af57354b67e1d18771)) - -* os.mkdir(DATA_FOLDER_PATH) ([`dcf7d15`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/dcf7d156310c4aacb2f186a7fe87bdbdf10da79a)) - -* test_delete_object_pipeline ([`99751e6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/99751e6de5f75b164185d74a3c54e68aca83f2db)) - -* fix some tests ([`75c1ed4`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/75c1ed4d8192feb080586acf9ab3fe59c70cb07b)) - -* clean config ([`6013ae8`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6013ae8014319a1c170051ee2c2ea574b6eb123f)) - -* ENV variables ([`a3c104a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/a3c104a5e209585791a84e92a8d9297788e1c201)) - -* save create_object_pipeline fail ([`5bb82c0`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/5bb82c02f74d7de349701d9ea7c468ca41067db2)) - -* class tests ([`f599345`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/f599345018e4aee08bc5a433a57cf47995c7b04a)) - -* tests ([`bd78c83`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/bd78c83ff6ffe10a9131a0f960b03505995d6781)) - -* unit tests ([`bd661a8`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/bd661a86445a1442e55e66eae5be7b8c7f2cb8fc)) - -* import schemas ([`aecdf1e`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/aecdf1e643ed8bf1b53eeb43dc894a9344d245be)) - -* rename vtkw_server.py ([`31a0265`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/31a0265c4b8786a0007bdf39a21f1d495e841703)) - -* schemas ([`ac2abe3`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/ac2abe3b392cf91200fe69c94d96cfd5f18e0dc0)) - -* Merge pull request #10 from Geode-solutions/next - -Next ([`7fe2621`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/7fe2621e30cc9d38d3acf60cff61e16946be608f)) - -* Merge pull request #9 from Geode-solutions/chore/update_licence - -Chore/update licence ([`6ab1ce7`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6ab1ce7eb6c6234bb7a6f74567e90b4cb5190b9b)) - -* Merge pull request #7 from Geode-solutions/next - -Next ([`708f7b0`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/708f7b092c8cac96893b38046ad20a26155c2ff9)) - -* Merge pull request #6 from Geode-solutions/feat_delete_object_pipeline - -Feat delete object pipeline ([`364da90`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/364da90a845d1d7549ba748e521cc43f7c3a321d)) - -* revert .dockerignore ([`a4d4454`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/a4d4454d8cd4ffdabfd6d3fce4e48ae33772f5de)) - -* image_name: 'opengeodeweb-viewer' ([`129f762`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/129f762db2bab2eabbf1c089835039208916a647)) - -* Merge pull request #5 from Geode-solutions/next - -Next ([`5ee9742`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/5ee97423d576dd2c393fafe5b35726dce2568503)) - -* Merge pull request #4 from Geode-solutions/add_copyleft - -fix(license): add copyleft file ([`8185c9d`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8185c9d8ac096f2db6b44945b3b79ce6615a9c0b)) - -* Merge pull request #3 from Geode-solutions/next - -Next ([`6f6d6c6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6f6d6c63ee268adb731291daa2eab434368d94c6)) - -* update data and attributes ([`dc1c26d`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/dc1c26d0d0b0990242ae7cc77a8e0484dc276860)) - -* no marker interaction ([`d1863ba`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/d1863ba610d29f0617c94ebce38419903ce46889)) - -* add marker ([`4bf740c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/4bf740ced3679b92e9299b3458d8d4befde0a9a2)) - -* add vertex attribute ([`11f0774`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/11f077451b7b6b7a42f95ca15b8d3d028d45de9e)) - -* Merge pull request #2 from Geode-solutions/fix/pipeline - -composite mapper ([`30c3004`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/30c3004efadb48cb87e1990d34a11c91a6437613)) - -* composite mapper ([`7e7d79c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/7e7d79c1d8fd5b418f92fd641036ecbb65018426)) - -* update visibility ([`bf1652a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/bf1652a885dc6c0e605c3da11a84d28afef5cb36)) - -* removed CD ([`4877be8`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/4877be897a022889b4ba15d181a3b8090d70e9a4)) - -* Initialisation ([`eeb263c`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/eeb263c85bbdd99bb711557e017cdcde53371db0)) - -* Merge pull request #1 from Geode-solutions/Clemamolette-patch-1 - -Update Branch-protection.yml ([`fb00bc3`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/fb00bc33bfa7815f4e6ce40a7f152648c8ec4ac1)) +- **schemas**: Remove dockerfile + a few changes + ([`e81296a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/e81296af2510c975c1d98034f269a5c94e4b89f5)) -* Update Branch-protection.yml ([`5225e0a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/5225e0abb283c9216ab8504822eacb2692e5e6a5)) +- **schemas**: Test2 + ([`53dfa45`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/53dfa45953b098f8ecda5d8773e37fe064b4e7e3)) -* add vtk_protocols ([`7dc827f`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/7dc827f186033a348e66da463b33dd41e54e48df)) +- **schemas**: Test + ([`6088534`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/6088534e990f44559575f2d4631bc731210e2243)) -* Add all ([`1cb965b`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/1cb965bf9ff1f7b99298f96ac189b4835ae11f64)) +- **unit tests**: Run server + ([`11291b8`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/11291b8e808e52e1f4e6d0ab11b739ffd1542ecb)) -* add branch protection ([`8ef784e`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8ef784eb4174bb449b084df2ae2a4b5e33ccacb2)) +- **delete_object_pipeline**: Add rpc + ([`5a4df6a`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/5a4df6a5d20451491fe27d89886459d9a38f78cd)) -* Initial commit ([`8293eb6`](https://github.com/Geode-solutions/OpenGeodeWeb-Viewer/commit/8293eb6973493de95e9f718554b42728d8271a06)) +Enables an object to be deleted from the viewer diff --git a/generate_schemas.js b/generate_schemas.js index 7c7c536..8cf4f74 100644 --- a/generate_schemas.js +++ b/generate_schemas.js @@ -62,7 +62,7 @@ function return_json_schema(directoryPath, folder_path, project_name) { return acc; }, folders_schemas); } else { - var new_folder_path = folder_path + "/" + folder.name; + var new_folder_path = folder_path + "." + folder.name; var test = return_json_schema(folder.path, new_folder_path, project_name); folders_schemas[folder.name] = test; } diff --git a/package.json b/package.json index 8272fba..803a6b0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "name": "@geode/opengeodeweb-viewer", "scripts": { - "json": "node generate_schemas.js" + "json": "node generate_schemas.js", + "test": "npm run json && pytest" }, "dependencies": { "glob": "^10.3.10" diff --git a/pyproject.toml b/pyproject.toml index 55ec009..f04d171 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "OpenGeodeWeb-Viewer" -version = "0.3.0" +version = "1.0.0-rc.4" dynamic = ["dependencies"] authors = [ { name="Geode-solutions", email="team-web@geode-solutions.com" }, @@ -36,7 +36,11 @@ dependencies = {file = ["requirements.txt"]} where = ["src"] [tool.setuptools.package-data] -"opengeodeweb_viewer.rpc.schemas" = ["*.json"] +"opengeodeweb_viewer.rpc.generic.schemas" = ["*.json"] +"opengeodeweb_viewer.rpc.mesh.schemas" = ["*.json"] +"opengeodeweb_viewer.rpc.model.schemas" = ["*.json"] +"opengeodeweb_viewer.rpc.viewer.schemas" = ["*.json"] + [tool.semantic_release] version_toml = [ diff --git a/src/opengeodeweb_viewer/__init__.py b/src/opengeodeweb_viewer/__init__.py index 6089725..22c86b5 100644 --- a/src/opengeodeweb_viewer/__init__.py +++ b/src/opengeodeweb_viewer/__init__.py @@ -1,3 +1,3 @@ from .config import * -from .function import * +from .utils_functions import * from .vtk_protocol import * diff --git a/src/opengeodeweb_viewer/config.py b/src/opengeodeweb_viewer/config.py index 7e0d38d..7779e9e 100644 --- a/src/opengeodeweb_viewer/config.py +++ b/src/opengeodeweb_viewer/config.py @@ -24,9 +24,11 @@ def dev_config(): os.mkdir(os.environ.get("DATA_FOLDER_PATH")) -def test_config(): +def test_config(path): default_config() print(f"{os.path.dirname(__file__)=}", flush=True) - os.environ["DATA_FOLDER_PATH"] = os.path.join( - os.path.dirname(__file__), "..", "tests", "data" + os.environ["DATA_FOLDER_PATH"] = os.path.join(path, + "data" ) + + print(f"{os.environ.get('DATA_FOLDER_PATH')=}", flush=True) diff --git a/src/opengeodeweb_viewer/function.py b/src/opengeodeweb_viewer/function.py deleted file mode 100644 index 44322fd..0000000 --- a/src/opengeodeweb_viewer/function.py +++ /dev/null @@ -1,17 +0,0 @@ -from jsonschema import validate -from jsonschema.exceptions import ValidationError - - -def validate_schemas(params, schema): - try: - validate(instance=params, schema=schema) - except ValidationError as e: - print(f"Validation error: {e.message}", flush=True) - raise Exception( - { - "code": 400, - "route": schema["rpc"], - "name": "Bad request", - "description": e.message, - } - ) diff --git a/src/opengeodeweb_viewer/object/object_methods.py b/src/opengeodeweb_viewer/object/object_methods.py new file mode 100644 index 0000000..11a3c33 --- /dev/null +++ b/src/opengeodeweb_viewer/object/object_methods.py @@ -0,0 +1,123 @@ +# Standard library imports +import os + +# Third party imports +import vtk + +# Local application imports +from opengeodeweb_viewer.utils_functions import get_schemas_dict, validate_schema +from opengeodeweb_viewer.vtk_protocol import VtkView + +class VtkObjectView(VtkView): + def __init__(self): + super().__init__() + + def registerObject(self, id, file_name, reader, filter, mapper): + actor = vtk.vtkActor() + self.register_object(id, reader, filter, actor, mapper, {}) + + reader.SetFileName(os.path.join(self.DATA_FOLDER_PATH, file_name)) + + actor.SetMapper(mapper) + mapper.SetColorModeToMapScalars() + mapper.SetResolveCoincidentTopologyLineOffsetParameters(1, -0.1) + mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(2, 0) + mapper.SetResolveCoincidentTopologyPointOffsetParameter(-2) + + renderWindow = self.getView("-1") + renderer = renderWindow.GetRenderers().GetFirstRenderer() + renderer.AddActor(actor) + renderer.ResetCamera() + renderWindow.Render() + self.render() + + def deregisterObject(self, id): + actor = self.get_object(id)["actor"] + renderWindow = self.getView("-1") + renderer = renderWindow.GetRenderers().GetFirstRenderer() + renderer.RemoveActor(actor) + self.deregister_object(id) + self.render() + + def applyTextures(self, id, textures): + textures_array = [] + images_reader_array = [] + + data = self.get_object(id) + mapper = data["mapper"] + actor = data["actor"] + reader = data["reader"] + + polydata_mapper = mapper.GetPolyDataMapper() + poly_data = reader.GetPolyDataOutput() + + for index, value in enumerate(textures): + texture_name = value["texture_name"] + texture_file_name = value["texture_file_name"] + print(f"{texture_name=} {texture_file_name=}", flush=True) + + new_texture = vtk.vtkTexture() + image_reader = vtk.vtkXMLImageDataReader() + image_reader.SetFileName( + os.path.join(self.DATA_FOLDER_PATH, texture_file_name) + ) + + shader_texture_name = f"VTK_TEXTURE_UNIT_{index}" + polydata_mapper.MapDataArrayToMultiTextureAttribute( + shader_texture_name, + texture_name, + vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS, + ) + + if index == 0: + new_texture.SetBlendingMode( + vtk.vtkTexture.VTK_TEXTURE_BLENDING_MODE_REPLACE + ) + else: + new_texture.SetBlendingMode( + vtk.vtkTexture.VTK_TEXTURE_BLENDING_MODE_ADD + ) + + images_reader_array.append(image_reader) + new_texture.SetInputConnection(image_reader.GetOutputPort()) + + actor.GetProperty().SetTexture(shader_texture_name, new_texture) + + textures_array.append(new_texture) + images_reader_array.append(image_reader) + + self.render() + + + def SetVisibility(self, id, visibility): + actor = self.get_object(id)["actor"] + actor.SetVisibility(visibility) + self.render() + + def SetOpacity(self, id, opacity): + actor = self.get_object(id)["actor"] + actor.GetProperty().SetOpacity(opacity) + self.render() + + def SetColor(self, id, red, green, blue): + reader = self.get_object(id)["reader"] + mapper = self.get_object(id)["mapper"] + mapper.ScalarVisibilityOff() + actor = self.get_object(id)["actor"] + actor.GetProperty().SetColor([red, green, blue]) + self.render() + + def SetEdgeVisibility(self, id, visibility): + actor = self.get_object(id)["actor"] + actor.GetProperty().SetEdgeVisibility(visibility) + self.render() + + def SetVertexVisibility(self, id, visibility): + actor = self.get_object(id)["actor"] + actor.GetProperty().SetVertexVisibility(visibility) + self.render() + + def SetPointSize(self, id, size): + actor = self.get_object(id)["actor"] + actor.GetProperty().SetPointSize(size) + self.render() \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py new file mode 100644 index 0000000..e8d8ec0 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py @@ -0,0 +1,48 @@ +# Standard library imports +import json +import os + +# Third party imports +import vtk +from vtk.web import protocols as vtk_protocols +from wslink import register as exportRpc + +# Local application imports +from opengeodeweb_viewer.vtk_protocol import VtkView +from opengeodeweb_viewer.rpc.mesh.mesh_protocols import VtkMeshView +from opengeodeweb_viewer.rpc.model.model_protocols import VtkModelView +from opengeodeweb_viewer.utils_functions import get_schemas_dict, validate_schema + +class VtkGenericView(VtkView): + prefix = "opengeodeweb_viewer.generic." + schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas")) + + def __init__(self, mesh_protocols, model_protocols): + super().__init__() + self.mesh_protocols = mesh_protocols + self.model_protocols = model_protocols + + @exportRpc(prefix + schemas_dict["register"]["rpc"]) + def register(self, params): + print(self.schemas_dict["register"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["register"]) + viewer_object = params["viewer_object"] + params.pop('viewer_object', None) + print(f"{params=}", flush=True) + if viewer_object == "mesh": + self.mesh_protocols.registerMesh(params) + elif viewer_object == "model": + self.model_protocols.registerModel(params) + + @exportRpc(prefix + schemas_dict["deregister"]["rpc"]) + def deregister(self, params): + print(self.schemas_dict["deregister"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["deregister"]) + viewer_object = params["viewer_object"] + params.pop('viewer_object', None) + if viewer_object == "mesh": + self.mesh_protocols.deregisterMesh(params) + elif viewer_object == "model": + self.model_protocols.deregisterModel(params) + + diff --git a/src/opengeodeweb_viewer/rpc/generic/schemas/deregister.json b/src/opengeodeweb_viewer/rpc/generic/schemas/deregister.json new file mode 100644 index 0000000..61715c4 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/generic/schemas/deregister.json @@ -0,0 +1,18 @@ +{ + "rpc": "deregister", + "type": "object", + "properties": { + "viewer_object": { + "type": "string", + "enum": ["mesh", "model"] + }, + "id": { + "type": "string" + } + }, + "required": [ + "viewer_object", + "id" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/generic/schemas/register.json b/src/opengeodeweb_viewer/rpc/generic/schemas/register.json new file mode 100644 index 0000000..93a5ac2 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/generic/schemas/register.json @@ -0,0 +1,22 @@ +{ + "rpc": "register", + "type": "object", + "properties": { + "viewer_object": { + "type": "string", + "enum": ["mesh", "model"] + }, + "id": { + "type": "string" + }, + "file_name": { + "type": "string" + } + }, + "required": [ + "viewer_object", + "id", + "file_name" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py new file mode 100644 index 0000000..26f93be --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -0,0 +1,123 @@ +# Standard library imports +import json +import os + +# Third party imports +import vtk +from vtk.web import protocols as vtk_protocols +from vtkmodules.vtkIOImage import vtkPNGWriter, vtkJPEGWriter +from vtkmodules.vtkRenderingCore import (vtkWindowToImageFilter) +from wslink import register as exportRpc + +# Local application imports +from opengeodeweb_viewer.utils_functions import get_schemas_dict, validate_schema +from opengeodeweb_viewer.object.object_methods import VtkObjectView + +class VtkMeshView(VtkObjectView): + prefix = "opengeodeweb_viewer.mesh." + schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas")) + + def __init__(self): + super().__init__() + + @exportRpc(prefix + schemas_dict["register"]["rpc"]) + def registerMesh(self, params): + print(self.schemas_dict["register"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["register"]) + id = params["id"] + file_name = params["file_name"] + try: + reader = vtk.vtkXMLGenericDataObjectReader() + filter = {} + mapper = vtk.vtkDataSetMapper() + mapper.SetInputConnection(reader.GetOutputPort()) + self.registerObject(id, file_name, reader, filter, mapper) + except Exception as e: + print("error : ", str(e), flush=True) + + @exportRpc(prefix + schemas_dict["deregister"]["rpc"]) + def deregisterMesh(self, params): + print(self.schemas_dict["deregister"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["deregister"]) + id = params["id"] + self.deregisterObject(id) + + @exportRpc(prefix + schemas_dict["set_visibility"]["rpc"]) + def SetMeshVisibility(self, params): + print(self.schemas_dict["set_visibility"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_visibility"]) + id = params["id"] + visibility = bool(params["visibility"]) + self.SetVisibility(id, visibility) + + @exportRpc(prefix + schemas_dict["set_opacity"]["rpc"]) + def setMeshOpacity(self, params): + print(self.schemas_dict["set_opacity"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_opacity"]) + id = params["id"] + opacity = float(params["opacity"]) + self.SetOpacity(id, opacity) + + @exportRpc(prefix + schemas_dict["set_edge_visibility"]["rpc"]) + def setMeshEdgeVisibility(self, params): + print(self.schemas_dict["set_edge_visibility"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_edge_visibility"]) + id = params["id"] + visibility = bool(params["visibility"]) + self.SetEdgeVisibility(id, visibility) + + @exportRpc(prefix + schemas_dict["set_point_visibility"]["rpc"]) + def setMeshPointVisibility(self, params): + print(self.schemas_dict["set_point_visibility"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_point_visibility"]) + id = params["id"] + visibility = bool(params["visibility"]) + self.SetVertexVisibility(id, visibility) + + @exportRpc(prefix + schemas_dict["set_point_size"]["rpc"]) + def setMeshPointSize(self, params): + print(self.schemas_dict["set_point_size"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_point_size"]) + id = params["id"] + size = float(params["size"]) + self.SetPointSize(id, size) + + @exportRpc(prefix + schemas_dict["set_color"]["rpc"]) + def setMeshColor(self, params): + print(self.schemas_dict["set_color"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_color"]) + id = params["id"] + red = params["red"] + green = params["green"] + blue = params["blue"] + self.SetColor(id, red, green, blue) + + @exportRpc(prefix + schemas_dict["display_vertex_attribute"]["rpc"]) + def setVertexAttribute(self, params): + print(self.schemas_dict["display_vertex_attribute"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["display_vertex_attribute"]) + id = params["id"] + name = params["name"] + reader = self.get_object(id)["reader"] + points = reader.GetOutput().GetPointData() + points.SetActiveScalars(name) + mapper = self.get_object(id)["mapper"] + mapper.ScalarVisibilityOn() + mapper.SetScalarModeToUsePointData() + mapper.SetScalarRange(points.GetScalars().GetRange()) + self.render() + + @exportRpc(prefix + schemas_dict["display_polygon_attribute"]["rpc"]) + def setPolygonAttribute(self, params): + print(self.schemas_dict["display_polygon_attribute"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["display_polygon_attribute"]) + id = params["id"] + name = params["name"] + reader = self.get_object(id)["reader"] + cells = reader.GetOutput().GetCellData() + cells.SetActiveScalars(name) + mapper = self.get_object(id)["mapper"] + mapper.ScalarVisibilityOn() + mapper.SetScalarModeToUseCellData() + mapper.SetScalarRange(cells.GetScalars().GetRange()) + self.render() \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/apply_textures.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/apply_textures.json similarity index 78% rename from src/opengeodeweb_viewer/rpc/schemas/apply_textures.json rename to src/opengeodeweb_viewer/rpc/mesh/schemas/apply_textures.json index 8204907..e7fd44f 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/apply_textures.json +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/apply_textures.json @@ -17,12 +17,18 @@ "type": "string" } }, - "required": ["texture_name", "texture_file_name"], + "required": [ + "texture_name", + "texture_file_name" + ], "additionalProperties": false }, "minItems": 1 } }, - "required": ["id", "textures"], + "required": [ + "id", + "textures" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/delete_object_pipeline.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/deregister.json similarity index 66% rename from src/opengeodeweb_viewer/rpc/schemas/delete_object_pipeline.json rename to src/opengeodeweb_viewer/rpc/mesh/schemas/deregister.json index 5be7643..f87e93b 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/delete_object_pipeline.json +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/deregister.json @@ -1,11 +1,13 @@ { - "rpc": "delete_object_pipeline", + "rpc": "deregister", "type": "object", "properties": { "id": { "type": "string" } }, - "required": ["id"], + "required": [ + "id" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/display_polygon_attribute.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/display_polygon_attribute.json new file mode 100644 index 0000000..75591ad --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/display_polygon_attribute.json @@ -0,0 +1,17 @@ +{ + "rpc": "display_polygon_attribute", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/set_vertex_attribute.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/display_vertex_attribute.json similarity index 66% rename from src/opengeodeweb_viewer/rpc/schemas/set_vertex_attribute.json rename to src/opengeodeweb_viewer/rpc/mesh/schemas/display_vertex_attribute.json index 9f970bc..6b21bbd 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/set_vertex_attribute.json +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/display_vertex_attribute.json @@ -1,5 +1,5 @@ { - "rpc": "set_vertex_attribute", + "rpc": "display_vertex_attribute", "type": "object", "properties": { "id": { @@ -9,6 +9,9 @@ "type": "string" } }, - "required": ["id", "name"], + "required": [ + "id", + "name" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/create_object_pipeline.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/register.json similarity index 69% rename from src/opengeodeweb_viewer/rpc/schemas/create_object_pipeline.json rename to src/opengeodeweb_viewer/rpc/mesh/schemas/register.json index 6ed4a7d..593d2b2 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/create_object_pipeline.json +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/register.json @@ -1,5 +1,5 @@ { - "rpc": "create_object_pipeline", + "rpc": "register", "type": "object", "properties": { "id": { @@ -9,6 +9,9 @@ "type": "string" } }, - "required": ["id", "file_name"], + "required": [ + "id", + "file_name" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/set_color.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_color.json similarity index 85% rename from src/opengeodeweb_viewer/rpc/schemas/set_color.json rename to src/opengeodeweb_viewer/rpc/mesh/schemas/set_color.json index 716f903..32789f3 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/set_color.json +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_color.json @@ -21,6 +21,11 @@ "maximum": 255 } }, - "required": ["id", "red", "green", "blue"], + "required": [ + "id", + "red", + "green", + "blue" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/toggle_edge_visibility.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_edge_visibility.json similarity index 67% rename from src/opengeodeweb_viewer/rpc/schemas/toggle_edge_visibility.json rename to src/opengeodeweb_viewer/rpc/mesh/schemas/set_edge_visibility.json index 7bc05a4..4ca1d7b 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/toggle_edge_visibility.json +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_edge_visibility.json @@ -1,5 +1,5 @@ { - "rpc": "toggle_edge_visibility", + "rpc": "set_edge_visibility", "type": "object", "properties": { "id": { @@ -9,6 +9,9 @@ "type": "boolean" } }, - "required": ["id", "visibility"], + "required": [ + "id", + "visibility" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/set_opacity.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_opacity.json new file mode 100644 index 0000000..28a9ede --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_opacity.json @@ -0,0 +1,19 @@ +{ + "rpc": "set_opacity", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "opacity": { + "type": "number", + "min": 0, + "max": 1 + } + }, + "required": [ + "id", + "opacity" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/point_size.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_point_size.json similarity index 69% rename from src/opengeodeweb_viewer/rpc/schemas/point_size.json rename to src/opengeodeweb_viewer/rpc/mesh/schemas/set_point_size.json index 4747b89..5745e44 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/point_size.json +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_point_size.json @@ -1,5 +1,5 @@ { - "rpc": "point_size", + "rpc": "set_point_size", "type": "object", "properties": { "id": { @@ -9,6 +9,9 @@ "type": "number" } }, - "required": ["id", "size"], + "required": [ + "id", + "size" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/mesh/schemas/set_point_visibility.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_point_visibility.json new file mode 100644 index 0000000..fa8f2c3 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_point_visibility.json @@ -0,0 +1,17 @@ +{ + "rpc": "set_point_visibility", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "visibility": { + "type": "boolean" + } + }, + "required": [ + "id", + "visibility" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/toggle_point_visibility.json b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_visibility.json similarity index 68% rename from src/opengeodeweb_viewer/rpc/schemas/toggle_point_visibility.json rename to src/opengeodeweb_viewer/rpc/mesh/schemas/set_visibility.json index 773abf0..eed641c 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/toggle_point_visibility.json +++ b/src/opengeodeweb_viewer/rpc/mesh/schemas/set_visibility.json @@ -1,5 +1,5 @@ { - "rpc": "toggle_point_visibility", + "rpc": "set_visibility", "type": "object", "properties": { "id": { @@ -9,6 +9,9 @@ "type": "boolean" } }, - "required": ["id", "visibility"], + "required": [ + "id", + "visibility" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py new file mode 100644 index 0000000..640388f --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -0,0 +1,76 @@ +# Standard library imports +import json +import os + +# Third party imports +import vtk +from vtk.web import protocols as vtk_protocols +from wslink import register as exportRpc + +# Local application imports +from opengeodeweb_viewer.utils_functions import get_schemas_dict, validate_schema +from opengeodeweb_viewer.object.object_methods import VtkObjectView + +class VtkModelView(VtkObjectView): + prefix = "opengeodeweb_viewer.model." + schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas")) + + def __init__(self): + super().__init__() + + @exportRpc(prefix + schemas_dict["register"]["rpc"]) + def registerModel(self, params): + print(self.schemas_dict["register"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["register"]) + id = params["id"] + file_name = params["file_name"] + try: + reader = vtk.vtkXMLMultiBlockDataReader() + filter = vtk.vtkGeometryFilter() + filter.SetInputConnection(reader.GetOutputPort()) + mapper = vtk.vtkCompositePolyDataMapper() + mapper.SetInputConnection(filter.GetOutputPort()) + self.registerObject(id, file_name, reader, filter, mapper) + except Exception as e: + print("error : ", str(e), flush=True) + + @exportRpc(prefix + schemas_dict["deregister"]["rpc"]) + def deregisterModel(self, params): + print(self.schemas_dict["deregister"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["deregister"]) + id = params["id"] + self.deregisterObject(id) + + @exportRpc(prefix + schemas_dict["set_mesh_visibility"]["rpc"]) + def setMeshVisibility(self, params): + print(self.schemas_dict["set_mesh_visibility"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_mesh_visibility"]) + id = params["id"] + visibility = bool(params["visibility"]) + self.SetEdgeVisibility(id, visibility) + + @exportRpc(prefix + schemas_dict["set_components_visibility"]["rpc"]) + def setComponentsVisibility(self, params): + print(self.schemas_dict["set_components_visibility"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_components_visibility"]) + id = params["id"] + visibility = bool(params["visibility"]) + self.SetVisibility(id, visibility) + + @exportRpc(prefix + schemas_dict["set_components_color"]["rpc"]) + def setComponentsColor(self, params): + print(self.schemas_dict["set_components_color"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_components_color"]) + id = params["id"] + red = params["red"] + green = params["green"] + blue = params["blue"] + self.SetColor(id, red, green, blue) + + @exportRpc(prefix + schemas_dict["set_corners_size"]["rpc"]) + def setCornersSize(self, params): + print(self.schemas_dict["set_corners_size"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_corners_size"]) + id = params["id"] + size = float(params["size"]) + self.SetPointSize(id, size) \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/apply_textures.json b/src/opengeodeweb_viewer/rpc/model/schemas/apply_textures.json new file mode 100644 index 0000000..e7fd44f --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/apply_textures.json @@ -0,0 +1,34 @@ +{ + "rpc": "apply_textures", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "textures": { + "type": "array", + "elements": { + "type": "object", + "properties": { + "texture_name": { + "type": "string" + }, + "texture_file_name": { + "type": "string" + } + }, + "required": [ + "texture_name", + "texture_file_name" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "id", + "textures" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/deregister.json b/src/opengeodeweb_viewer/rpc/model/schemas/deregister.json new file mode 100644 index 0000000..f87e93b --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/deregister.json @@ -0,0 +1,13 @@ +{ + "rpc": "deregister", + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/register.json b/src/opengeodeweb_viewer/rpc/model/schemas/register.json new file mode 100644 index 0000000..593d2b2 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/register.json @@ -0,0 +1,17 @@ +{ + "rpc": "register", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "file_name": { + "type": "string" + } + }, + "required": [ + "id", + "file_name" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/set_components_color.json b/src/opengeodeweb_viewer/rpc/model/schemas/set_components_color.json new file mode 100644 index 0000000..3704832 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/set_components_color.json @@ -0,0 +1,31 @@ +{ + "rpc": "set_components_color", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "red": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "green": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "blue": { + "type": "integer", + "minimum": 0, + "maximum": 255 + } + }, + "required": [ + "id", + "red", + "green", + "blue" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/set_components_visibility.json b/src/opengeodeweb_viewer/rpc/model/schemas/set_components_visibility.json new file mode 100644 index 0000000..3f1e7ac --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/set_components_visibility.json @@ -0,0 +1,17 @@ +{ + "rpc": "set_components_visibility", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "visibility": { + "type": "boolean" + } + }, + "required": [ + "id", + "visibility" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/model/schemas/set_corners_size.json b/src/opengeodeweb_viewer/rpc/model/schemas/set_corners_size.json new file mode 100644 index 0000000..7ae8809 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/model/schemas/set_corners_size.json @@ -0,0 +1,17 @@ +{ + "rpc": "set_corners_size", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "size": { + "type": "integer" + } + }, + "required": [ + "id", + "size" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/toggle_object_visibility.json b/src/opengeodeweb_viewer/rpc/model/schemas/set_mesh_visibility.json similarity index 59% rename from src/opengeodeweb_viewer/rpc/schemas/toggle_object_visibility.json rename to src/opengeodeweb_viewer/rpc/model/schemas/set_mesh_visibility.json index f2503dc..bb09ac8 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/toggle_object_visibility.json +++ b/src/opengeodeweb_viewer/rpc/model/schemas/set_mesh_visibility.json @@ -1,14 +1,17 @@ { - "rpc": "toggle_object_visibility", + "rpc": "set_mesh_visibility", "type": "object", "properties": { "id": { "type": "string" }, - "is_visible": { + "visibility": { "type": "boolean" } }, - "required": ["id", "is_visible"], + "required": [ + "id", + "visibility" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/create_visualization.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/create_visualization.json similarity index 98% rename from src/opengeodeweb_viewer/rpc/schemas/create_visualization.json rename to src/opengeodeweb_viewer/rpc/viewer/schemas/create_visualization.json index da45212..532d711 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/create_visualization.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/create_visualization.json @@ -4,4 +4,4 @@ "properties": {}, "required": [], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/get_point_position.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/get_point_position.json similarity index 83% rename from src/opengeodeweb_viewer/rpc/schemas/get_point_position.json rename to src/opengeodeweb_viewer/rpc/viewer/schemas/get_point_position.json index 560a473..95d6be1 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/get_point_position.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/get_point_position.json @@ -9,6 +9,9 @@ "type": "integer" } }, - "required": ["x", "y"], + "required": [ + "x", + "y" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/reset.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/reset.json similarity index 100% rename from src/opengeodeweb_viewer/rpc/schemas/reset.json rename to src/opengeodeweb_viewer/rpc/viewer/schemas/reset.json diff --git a/src/opengeodeweb_viewer/rpc/schemas/reset_camera.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/reset_camera.json similarity index 98% rename from src/opengeodeweb_viewer/rpc/schemas/reset_camera.json rename to src/opengeodeweb_viewer/rpc/viewer/schemas/reset_camera.json index 13520cf..7938467 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/reset_camera.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/reset_camera.json @@ -4,4 +4,4 @@ "properties": {}, "required": [], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/viewer/schemas/set_background_color.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/set_background_color.json new file mode 100644 index 0000000..714c9c7 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/set_background_color.json @@ -0,0 +1,27 @@ +{ + "rpc": "set_background_color", + "type": "object", + "properties": { + "red": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "green": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "blue": { + "type": "integer", + "minimum": 0, + "maximum": 255 + } + }, + "required": [ + "red", + "green", + "blue" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/take_screenshot.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/take_screenshot.json similarity index 100% rename from src/opengeodeweb_viewer/rpc/schemas/take_screenshot.json rename to src/opengeodeweb_viewer/rpc/viewer/schemas/take_screenshot.json diff --git a/src/opengeodeweb_viewer/rpc/schemas/update_data.json b/src/opengeodeweb_viewer/rpc/viewer/schemas/update_data.json similarity index 82% rename from src/opengeodeweb_viewer/rpc/schemas/update_data.json rename to src/opengeodeweb_viewer/rpc/viewer/schemas/update_data.json index fd22756..0efef11 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/update_data.json +++ b/src/opengeodeweb_viewer/rpc/viewer/schemas/update_data.json @@ -6,6 +6,8 @@ "type": "string" } }, - "required": ["id"], + "required": [ + "id" + ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py new file mode 100644 index 0000000..32051e7 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -0,0 +1,144 @@ +# Standard library imports +import json +import os +from pathlib import Path + +# Third party imports +import vtk +from vtk.web import protocols as vtk_protocols +from vtkmodules.vtkIOImage import vtkPNGWriter, vtkJPEGWriter +from vtkmodules.vtkRenderingCore import vtkWindowToImageFilter +from wslink import register as exportRpc + +# Local application imports +from opengeodeweb_viewer.utils_functions import get_schemas_dict, validate_schema +from opengeodeweb_viewer.vtk_protocol import VtkView + +class VtkViewerView(VtkView): + prefix = "opengeodeweb_viewer.viewer." + schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas")) + + def __init__(self): + super().__init__() + + @exportRpc(prefix + schemas_dict["create_visualization"]["rpc"]) + def createVisualization(self, params): + print(self.schemas_dict["create_visualization"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["create_visualization"]) + renderWindow = self.getView("-1") + renderer = renderWindow.GetRenderers().GetFirstRenderer() + renderer.SetBackground([180 / 255, 180 / 255, 180 / 255]) + renderer.ResetCamera() + renderWindow.Render() + self.render() + + @exportRpc(prefix + schemas_dict["set_background_color"]["rpc"]) + def setBackgroundColor(self, params): + print(self.schemas_dict["set_background_color"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["set_background_color"]) + renderWindow = self.getView("-1") + renderer = renderWindow.GetRenderers().GetFirstRenderer() + red = params["red"] + green = params["green"] + blue = params["blue"] + + renderer.SetBackground([red, green, blue]) + renderer.ResetCamera() + renderWindow.Render() + self.render() + + @exportRpc(prefix + schemas_dict["reset_camera"]["rpc"]) + def resetCamera(self, params): + print(self.schemas_dict["reset_camera"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["reset_camera"]) + renderWindow = self.getView("-1") + renderWindow.GetRenderers().GetFirstRenderer().ResetCamera() + renderWindow.Render() + self.render() + + @exportRpc(prefix + schemas_dict["take_screenshot"]["rpc"]) + def takeScreenshot(self, params): + print(self.schemas_dict["take_screenshot"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["take_screenshot"]) + filename = params["filename"] + output_extension = params["output_extension"] + include_background = params["include_background"] + renderWindow = self.getView("-1") + renderer = self.get_renderer() + + w2if = vtkWindowToImageFilter() + + if not include_background: + renderWindow.SetAlphaBitPlanes(1) + w2if.SetInputBufferTypeToRGBA() + else: + renderWindow.SetAlphaBitPlanes(0) + w2if.SetInputBufferTypeToRGB() + + renderWindow.Render() + + w2if.SetInput(renderWindow) + w2if.ReadFrontBufferOff() + w2if.Update() + + if output_extension == "png": + writer = vtkPNGWriter() + elif output_extension in ["jpg", "jpeg"]: + if not include_background: + raise Exception("output_extension not supported with background") + writer = vtkJPEGWriter() + else: + raise Exception("output_extension not supported") + + new_filename = filename + '.' + output_extension + file_path = os.path.join(self.DATA_FOLDER_PATH, new_filename) + writer.SetFileName(file_path) + writer.SetInputConnection(w2if.GetOutputPort()) + writer.Write() + + with open(file_path, "rb") as file: + file_content = file.read() + + return {"blob": self.addAttachment(file_content)} + + + @exportRpc(prefix + schemas_dict["update_data"]["rpc"]) + def updateData(self, params): + print(self.schemas_dict["update_data"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["update_data"]) + id = params["id"] + + data = self.get_object(id) + reader = data["reader"] + reader.Update() + mapper = data["mapper"] + tag = vtk.reference(0) + scalars = vtk.vtkAbstractMapper.GetAbstractScalars( + reader.GetOutput(), + mapper.GetScalarMode(), + mapper.GetArrayAccessMode(), + mapper.GetArrayId(), + mapper.GetArrayName(), + tag, + ) + mapper.SetScalarRange(scalars.GetRange()) + self.render() + + @exportRpc(prefix + schemas_dict["get_point_position"]["rpc"]) + def getPointPosition(self, params): + print(self.schemas_dict["get_point_position"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["get_point_position"]) + x = float(params["x"]) + y = float(params["y"]) + xyz = [x, y, 0.0] + picker = vtk.vtkWorldPointPicker() + picker.Pick(xyz, self.get_renderer()) + ppos = picker.GetPickPosition() + return {"x": ppos[0], "y": ppos[1], "z": ppos[2]} + + @exportRpc(prefix + schemas_dict["reset"]["rpc"]) + def reset(self, params): + print(self.schemas_dict["reset"]["rpc"], f"{params=}", flush=True) + validate_schema(params, self.schemas_dict["reset"]) + renderWindow = self.getView("-1") + renderWindow.GetRenderers().GetFirstRenderer().RemoveAllViewProps() diff --git a/src/opengeodeweb_viewer/utils_functions.py b/src/opengeodeweb_viewer/utils_functions.py new file mode 100644 index 0000000..0f27859 --- /dev/null +++ b/src/opengeodeweb_viewer/utils_functions.py @@ -0,0 +1,32 @@ +# Standard library imports +import os +import json + +# Third party imports +from jsonschema import validate +from jsonschema.exceptions import ValidationError + + +def get_schemas_dict(path): + json_files = os.listdir(path) + schemas_dict = {} + for json_file in json_files: + filename = json_file.split(".")[0] + with open(os.path.join(path, json_file), "r") as file: + file_content = json.load(file) + schemas_dict[filename] = file_content + return schemas_dict + +def validate_schema(params, schema): + try: + validate(instance=params, schema=schema) + except ValidationError as e: + print(f"Validation error: {e.message}", flush=True) + raise Exception( + { + "code": 400, + "route": schema["rpc"], + "name": "Bad request", + "description": e.message, + } + ) diff --git a/src/opengeodeweb_viewer/vtk_override_protocols.py b/src/opengeodeweb_viewer/vtk_override_protocols.py index 5cb4d3b..9b6e4be 100644 --- a/src/opengeodeweb_viewer/vtk_override_protocols.py +++ b/src/opengeodeweb_viewer/vtk_override_protocols.py @@ -55,9 +55,9 @@ def pushRender(self, vId, ignoreAnimation = False): if reply["image"]: # depending on whether the app has encoding enabled: if self.decode: - reply["image"] = base64.standard_b64decode(reply["image"]); + reply["image"] = base64.standard_b64decode(reply["image"]) - reply["image"] = self.addAttachment(reply["image"]); + reply["image"] = self.addAttachment(reply["image"]) reply["format"] = "jpeg" # save mtime for next call. self.trackingViews[vId]["mtime"] = reply["mtime"] diff --git a/src/opengeodeweb_viewer/vtk_protocol.py b/src/opengeodeweb_viewer/vtk_protocol.py index 91d9d71..9ce1efc 100644 --- a/src/opengeodeweb_viewer/vtk_protocol.py +++ b/src/opengeodeweb_viewer/vtk_protocol.py @@ -1,332 +1,19 @@ # Standard library imports -import json import os # Third party imports import vtk from vtk.web import protocols as vtk_protocols -from vtkmodules.vtkIOImage import vtkPNGWriter, vtkJPEGWriter -from vtkmodules.vtkRenderingCore import (vtkWindowToImageFilter) -from wslink import register as exportRpc # Local application imports -from .function import validate_schemas - - - -schemas = os.path.join(os.path.dirname(__file__), "rpc/schemas") - -with open(os.path.join(schemas, "create_visualization.json"), "r") as file: - create_visualization_json = json.load(file) -with open(os.path.join(schemas, "reset_camera.json"), "r") as file: - reset_camera_json = json.load(file) -with open(os.path.join(schemas, "create_object_pipeline.json"), "r") as file: - create_object_pipeline_json = json.load(file) -with open(os.path.join(schemas, "delete_object_pipeline.json"), "r") as file: - delete_object_pipeline_json = json.load(file) -with open(os.path.join(schemas, "toggle_object_visibility.json"), "r") as file: - toggle_object_visibility_json = json.load(file) -with open(os.path.join(schemas, "apply_textures.json"), "r") as file: - apply_textures_json = json.load(file) -with open(os.path.join(schemas, "update_data.json"), "r") as file: - update_data_json = json.load(file) -with open(os.path.join(schemas, "get_point_position.json"), "r") as file: - get_point_position_json = json.load(file) -with open(os.path.join(schemas, "reset.json"), "r") as file: - reset_json = json.load(file) -with open(os.path.join(schemas, "toggle_edge_visibility.json"), "r") as file: - toggle_edge_visibility_json = json.load(file) -with open(os.path.join(schemas, "point_size.json"), "r") as file: - point_size_json = json.load(file) -with open(os.path.join(schemas, "toggle_point_visibility.json"), "r") as file: - toggle_point_visibility_json = json.load(file) -with open(os.path.join(schemas, "set_color.json"), "r") as file: - set_color_json = json.load(file) -with open(os.path.join(schemas, "set_vertex_attribute.json"), "r") as file: - set_vertex_attribute_json = json.load(file) -with open(os.path.join(schemas, "take_screenshot.json"), "r") as file: - take_screenshot_json = json.load(file) - class VtkView(vtk_protocols.vtkWebProtocol): def __init__(self): + super().__init__() self.DATA_FOLDER_PATH = os.getenv("DATA_FOLDER_PATH") self.DataReader = vtk.vtkXMLPolyDataReader() self.ImageReader = vtk.vtkXMLImageDataReader() - @exportRpc(create_visualization_json["rpc"]) - def create_visualization(self, params): - validate_schemas(params, create_visualization_json) - renderWindow = self.getView("-1") - renderer = renderWindow.GetRenderers().GetFirstRenderer() - renderer.SetBackground([180 / 255, 180 / 255, 180 / 255]) - renderer.ResetCamera() - renderWindow.Render() - self.render() - - @exportRpc(reset_camera_json["rpc"]) - def reset_camera(self, params): - print(f"{params=}", flush=True) - validate_schemas(params, reset_camera_json) - renderWindow = self.getView("-1") - renderWindow.GetRenderers().GetFirstRenderer().ResetCamera() - renderWindow.Render() - self.render() - - @exportRpc(create_object_pipeline_json["rpc"]) - def create_object_pipeline(self, params): - validate_schemas(params, create_object_pipeline_json) - try: - id = params["id"] - file_name = params["file_name"] - FOLDER_PATH = os.path.dirname(__file__) - - actor = vtk.vtkActor() - if ".vtm" in file_name: - reader = vtk.vtkXMLMultiBlockDataReader() - filter = vtk.vtkGeometryFilter() - filter.SetInputConnection(reader.GetOutputPort()) - mapper = vtk.vtkCompositePolyDataMapper() - mapper.SetInputConnection(filter.GetOutputPort()) - self.register_object(id, reader, filter, actor, mapper, {}) - else: - reader = vtk.vtkXMLGenericDataObjectReader() - mapper = vtk.vtkDataSetMapper() - mapper.SetInputConnection(reader.GetOutputPort()) - self.register_object(id, reader, {}, actor, mapper, {}) - - reader.SetFileName(os.path.join(self.DATA_FOLDER_PATH, file_name)) - - actor.SetMapper(mapper) - mapper.SetColorModeToMapScalars() - mapper.SetResolveCoincidentTopologyLineOffsetParameters(1, -0.1) - mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(2, 0) - mapper.SetResolveCoincidentTopologyPointOffsetParameter(-2) - - renderWindow = self.getView("-1") - renderer = renderWindow.GetRenderers().GetFirstRenderer() - renderer.AddActor(actor) - renderer.ResetCamera() - renderWindow.Render() - self.render() - except Exception as e: - print("error : ", str(e), flush=True) - - @exportRpc(delete_object_pipeline_json["rpc"]) - def delete_object_pipeline(self, params): - validate_schemas(params, delete_object_pipeline_json) - print(f"{params=}", flush=True) - id = params["id"] - object = self.get_object(id) - actor = object["actor"] - renderWindow = self.getView("-1") - renderer = renderWindow.GetRenderers().GetFirstRenderer() - renderer.RemoveActor(actor) - print(f"{object=}", flush=True) - self.deregister_object(id) - self.render() - - @exportRpc(toggle_object_visibility_json["rpc"]) - def toggle_object_visibility(self, params): - validate_schemas(params, toggle_object_visibility_json) - print(f"{params=}", flush=True) - id = params["id"] - is_visible = params["is_visible"] - object = self.get_object(id) - actor = object["actor"] - actor.SetVisibility(is_visible) - self.render() - - @exportRpc(apply_textures_json["rpc"]) - def apply_textures(self, params): - validate_schemas(params, apply_textures_json) - print(f"{params=}", flush=True) - id = params["id"] - textures = params["textures"] - textures_array = [] - images_reader_array = [] - - data = self.get_object(id) - mapper = data["mapper"] - actor = data["actor"] - reader = data["reader"] - - polydata_mapper = mapper.GetPolyDataMapper() - poly_data = reader.GetPolyDataOutput() - - for index, value in enumerate(textures): - texture_name = value["texture_name"] - texture_file_name = value["texture_file_name"] - print(f"{texture_name=} {texture_file_name=}", flush=True) - - new_texture = vtk.vtkTexture() - image_reader = vtk.vtkXMLImageDataReader() - image_reader.SetFileName( - os.path.join(self.DATA_FOLDER_PATH, texture_file_name) - ) - - shader_texture_name = f"VTK_TEXTURE_UNIT_{index}" - polydata_mapper.MapDataArrayToMultiTextureAttribute( - shader_texture_name, - texture_name, - vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS, - ) - - if index == 0: - new_texture.SetBlendingMode( - vtk.vtkTexture.VTK_TEXTURE_BLENDING_MODE_REPLACE - ) - else: - new_texture.SetBlendingMode( - vtk.vtkTexture.VTK_TEXTURE_BLENDING_MODE_ADD - ) - - images_reader_array.append(image_reader) - new_texture.SetInputConnection(image_reader.GetOutputPort()) - - actor.GetProperty().SetTexture(shader_texture_name, new_texture) - - textures_array.append(new_texture) - images_reader_array.append(image_reader) - - self.render() - - @exportRpc(update_data_json["rpc"]) - def update_data(self, params): - validate_schemas(params, update_data_json) - print(f"{params=}", flush=True) - id = params["id"] - - data = self.get_object(id) - reader = data["reader"] - reader.Update() - mapper = data["mapper"] - tag = vtk.reference(0) - scalars = vtk.vtkAbstractMapper.GetAbstractScalars( - reader.GetOutput(), - mapper.GetScalarMode(), - mapper.GetArrayAccessMode(), - mapper.GetArrayId(), - mapper.GetArrayName(), - tag, - ) - mapper.SetScalarRange(scalars.GetRange()) - self.render() - - @exportRpc(get_point_position_json["rpc"]) - def get_point_position(self, params): - validate_schemas(params, get_point_position_json) - x = float(params["x"]) - y = float(params["y"]) - xyz = [x, y, 0.0] - picker = vtk.vtkWorldPointPicker() - picker.Pick(xyz, self.get_renderer()) - ppos = picker.GetPickPosition() - return {"x": ppos[0], "y": ppos[1], "z": ppos[2]} - - @exportRpc(reset_json["rpc"]) - def reset(self, params): - validate_schemas(params, reset_json) - renderWindow = self.getView("-1") - renderWindow.GetRenderers().GetFirstRenderer().RemoveAllViewProps() - - @exportRpc(toggle_edge_visibility_json["rpc"]) - def setEdgeVisibility(self, params): - validate_schemas(params, toggle_edge_visibility_json) - print(f"{params=}", flush=True) - id = params["id"] - visibility = bool(params["visibility"]) - actor = self.get_object(id)["actor"] - actor.GetProperty().SetEdgeVisibility(visibility) - self.render() - - @exportRpc(toggle_point_visibility_json["rpc"]) - def setPointVisibility(self, params): - validate_schemas(params, toggle_point_visibility_json) - id = params["id"] - visibility = bool(params["visibility"]) - actor = self.get_object(id)["actor"] - actor.GetProperty().SetVertexVisibility(visibility) - self.render() - - @exportRpc(point_size_json["rpc"]) - def setPointSize(self, params): - validate_schemas(params, point_size_json) - id = params["id"] - size = float(params["size"]) - actor = self.get_object(id)["actor"] - actor.GetProperty().SetPointSize(size) - self.render() - - @exportRpc(set_color_json["rpc"]) - def setColor(self, params): - validate_schemas(params, set_color_json) - id = params["id"] - red = params["red"] - green = params["green"] - blue = params["blue"] - self.get_object(id)["mapper"].ScalarVisibilityOff() - actor = self.get_object(id)["actor"] - actor.GetProperty().SetColor(red, green, blue) - self.render() - - @exportRpc(set_vertex_attribute_json["rpc"]) - def setVertexAttribute(self, params): - validate_schemas(params, set_vertex_attribute_json) - print(f"{params=}", flush=True) - id = params["id"] - name = params["name"] - mapper = self.get_object(id)["mapper"] - mapper.SelectColorArray(name) - mapper.ScalarVisibilityOn() - mapper.SetScalarModeToUsePointFieldData() - self.render() - - @exportRpc(take_screenshot_json["rpc"]) - def takeScreenshot(self, params): - validate_schemas(params, take_screenshot_json) - print(f"{params=}", flush=True) - filename = params["filename"] - output_extension = params["output_extension"] - include_background = params["include_background"] - renderWindow = self.getView("-1") - renderer = self.get_renderer() - - w2if = vtkWindowToImageFilter() - - if not include_background: - renderWindow.SetAlphaBitPlanes(1) - w2if.SetInputBufferTypeToRGBA() - else: - renderWindow.SetAlphaBitPlanes(0) - w2if.SetInputBufferTypeToRGB() - - renderWindow.Render() - - w2if.SetInput(renderWindow) - w2if.ReadFrontBufferOff() - w2if.Update() - - if output_extension == "png": - writer = vtkPNGWriter() - elif output_extension in ["jpg", "jpeg"]: - if not include_background: - raise Exception("output_extension not supported with background") - writer = vtkJPEGWriter() - else: - raise Exception("output_extension not supported") - - new_filename = filename + '.' + output_extension - file_path = os.path.join(self.DATA_FOLDER_PATH, new_filename) - writer.SetFileName(file_path) - writer.SetInputConnection(w2if.GetOutputPort()) - writer.Write() - - with open(file_path, "rb") as file: - file_content = file.read() - - return {"blob": self.addAttachment(file_content)} - def get_data_base(self): return self.getSharedObject("db") @@ -355,3 +42,15 @@ def register_object(self, id, reader, filter, actor, mapper, textures): def deregister_object(self, id): del self.get_data_base()[id] + + + + + + + + + + + + \ No newline at end of file diff --git a/src/opengeodeweb_viewer/vtkw_server.py b/src/opengeodeweb_viewer/vtkw_server.py index 26feaa9..067459d 100644 --- a/src/opengeodeweb_viewer/vtkw_server.py +++ b/src/opengeodeweb_viewer/vtkw_server.py @@ -1,14 +1,21 @@ -import sys +# Standard library imports import argparse import os +import sys -from wslink import server +# Third party imports +import vtk from vtk.web import wslink as vtk_wslink from vtk.web import protocols as vtk_protocols -import vtk -from .vtk_protocol import VtkView -import dotenv +from wslink import server + +# Local application imports from .config import * +from .vtk_protocol import VtkView +from .rpc.viewer.viewer_protocols import VtkViewerView +from .rpc.mesh.mesh_protocols import VtkMeshView +from .rpc.model.model_protocols import VtkModelView +from .rpc.generic.generic_protocols import VtkGenericView # ============================================================================= @@ -43,7 +50,13 @@ def initialize(self): self.setSharedObject("db", dict()) # Custom API + mesh_protocols = VtkMeshView() + model_protocols = VtkModelView() self.registerVtkWebProtocol(VtkView()) + self.registerVtkWebProtocol(VtkViewerView()) + self.registerVtkWebProtocol(mesh_protocols) + self.registerVtkWebProtocol(model_protocols) + self.registerVtkWebProtocol(VtkGenericView(mesh_protocols,model_protocols)) # tell the C++ web app to use no encoding. # ParaViewWebPublishImageDelivery must be set to decode=False to match. diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 7553434..43bf870 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -126,6 +126,7 @@ def get_xprocess_args(self): class Starter(ProcessStarter): terminate_on_interrupt = True pattern = "wslink: Starting factory" + timeout = 5 # command to start process args = [ @@ -143,10 +144,10 @@ class Starter(ProcessStarter): def server(xprocess): name, Starter, Monitor = HELPER.get_xprocess_args() os.environ["PYTHON_ENV"] = "test" - config.test_config() + config.test_config(os.path.dirname(__file__)) + print("server", os.environ.get("DATA_FOLDER_PATH"), flush=True) _, log = xprocess.ensure(name, Starter) print(log) - print("server", os.environ.get("DATA_FOLDER_PATH"), flush=True) monitor = Monitor(log) yield monitor diff --git a/src/tests/data/CrossSection.vtm b/src/tests/data/CrossSection.vtm new file mode 100644 index 0000000..0476bc0 --- /dev/null +++ b/src/tests/data/CrossSection.vtm @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/data/CrossSection/Corner_00000000-054b-4eb1-8000-0000b351de2c.vtp b/src/tests/data/CrossSection/Corner_00000000-054b-4eb1-8000-0000b351de2c.vtp new file mode 100644 index 0000000..a3baef3 --- /dev/null +++ b/src/tests/data/CrossSection/Corner_00000000-054b-4eb1-8000-0000b351de2c.vtp @@ -0,0 +1,18 @@ + + + + + + 4.9 3.1 + 24 + + + 4.9 3.1 0 + + + 0 + 1 + + + + diff --git a/src/tests/data/CrossSection/Corner_00000000-1a02-45a2-8000-0000247024f4.vtp b/src/tests/data/CrossSection/Corner_00000000-1a02-45a2-8000-0000247024f4.vtp new file mode 100644 index 0000000..3135d1f --- /dev/null +++ b/src/tests/data/CrossSection/Corner_00000000-1a02-45a2-8000-0000247024f4.vtp @@ -0,0 +1,18 @@ + + + + + + 11 + 7 10 + + + 7 10 0 + + + 0 + 1 + + + + diff --git a/src/tests/data/CrossSection/Corner_00000000-3dd3-4c0c-8000-0000ed24e132.vtp b/src/tests/data/CrossSection/Corner_00000000-3dd3-4c0c-8000-0000ed24e132.vtp new file mode 100644 index 0000000..7724ab6 --- /dev/null +++ b/src/tests/data/CrossSection/Corner_00000000-3dd3-4c0c-8000-0000ed24e132.vtp @@ -0,0 +1,18 @@ + + + + + + 10.6 8.5 + 15 + + + 10.6 8.5 0 + + + 0 + 1 + + + + diff --git a/src/tests/data/CrossSection/Corner_00000000-9655-449f-8000-000006885621.vtp b/src/tests/data/CrossSection/Corner_00000000-9655-449f-8000-000006885621.vtp new file mode 100644 index 0000000..f165e8a --- /dev/null +++ b/src/tests/data/CrossSection/Corner_00000000-9655-449f-8000-000006885621.vtp @@ -0,0 +1,18 @@ + + + + + + 6.1 7 + 13 + + + 6.1 7 0 + + + 0 + 1 + + + + diff --git a/src/tests/data/CrossSection/Corner_00000000-a61f-4b8c-8000-00001ba48a80.vtp b/src/tests/data/CrossSection/Corner_00000000-a61f-4b8c-8000-00001ba48a80.vtp new file mode 100644 index 0000000..a1396b9 --- /dev/null +++ b/src/tests/data/CrossSection/Corner_00000000-a61f-4b8c-8000-00001ba48a80.vtp @@ -0,0 +1,18 @@ + + + + + + 1.1 4.5 + 0 + + + 1.1 4.5 0 + + + 0 + 1 + + + + diff --git a/src/tests/data/CrossSection/Corner_00000000-ab98-49bf-8000-0000d2111233.vtp b/src/tests/data/CrossSection/Corner_00000000-ab98-49bf-8000-0000d2111233.vtp new file mode 100644 index 0000000..a65fdec --- /dev/null +++ b/src/tests/data/CrossSection/Corner_00000000-ab98-49bf-8000-0000d2111233.vtp @@ -0,0 +1,18 @@ + + + + + + 3 + 5.8 5.8 + + + 5.8 5.8 0 + + + 0 + 1 + + + + diff --git a/src/tests/data/CrossSection/Line_00000000-00c7-4cbd-8000-00002888c528.vtp b/src/tests/data/CrossSection/Line_00000000-00c7-4cbd-8000-00002888c528.vtp new file mode 100644 index 0000000..e2d2cd8 --- /dev/null +++ b/src/tests/data/CrossSection/Line_00000000-00c7-4cbd-8000-00002888c528.vtp @@ -0,0 +1,21 @@ + + + + + + 5.8 5.8 4.9 3.1 5.35 4.45 + 3 24 31 + + + 5.8 5.8 0 4.9 3.1 0 5.35 4.45 0 + + + 0 2 2 1 + + + 0 2 2 1 + 2 4 + + + + diff --git a/src/tests/data/CrossSection/Line_00000000-5800-40ae-8000-00008671fc57.vtp b/src/tests/data/CrossSection/Line_00000000-5800-40ae-8000-00008671fc57.vtp new file mode 100644 index 0000000..e8aac9d --- /dev/null +++ b/src/tests/data/CrossSection/Line_00000000-5800-40ae-8000-00008671fc57.vtp @@ -0,0 +1,21 @@ + + + + + + 7 10 5.9 7.7 6.1 7 + 11 12 13 + + + 7 10 0 5.9 7.7 0 6.1 7 0 + + + 0 1 1 2 + + + 0 1 1 2 + 2 4 + + + + diff --git a/src/tests/data/CrossSection/Line_00000000-898c-47ff-8000-0000a5f2b19e.vtp b/src/tests/data/CrossSection/Line_00000000-898c-47ff-8000-0000a5f2b19e.vtp new file mode 100644 index 0000000..e63f3ca --- /dev/null +++ b/src/tests/data/CrossSection/Line_00000000-898c-47ff-8000-0000a5f2b19e.vtp @@ -0,0 +1,21 @@ + + + + + + 1.1 4.5 3 5 5 5.5 5.8 5.8 + 0 1 2 3 + + + 1.1 4.5 0 3 5 0 5 5.5 0 5.8 5.8 0 + + + 0 1 1 2 2 3 + + + 0 1 1 2 2 3 + 2 4 6 + + + + diff --git a/src/tests/data/CrossSection/Line_00000000-be29-45fb-8000-000036904028.vtp b/src/tests/data/CrossSection/Line_00000000-be29-45fb-8000-000036904028.vtp new file mode 100644 index 0000000..1a5203b --- /dev/null +++ b/src/tests/data/CrossSection/Line_00000000-be29-45fb-8000-000036904028.vtp @@ -0,0 +1,21 @@ + + + + + + 6.1 7 5.8 5.8 + 13 3 + + + 6.1 7 0 5.8 5.8 0 + + + 0 1 + + + 0 1 + 2 + + + + diff --git a/src/tests/data/CrossSection/Line_00000000-c4af-4187-8000-00004fd7d673.vtp b/src/tests/data/CrossSection/Line_00000000-c4af-4187-8000-00004fd7d673.vtp new file mode 100644 index 0000000..ecc0b9e --- /dev/null +++ b/src/tests/data/CrossSection/Line_00000000-c4af-4187-8000-00004fd7d673.vtp @@ -0,0 +1,21 @@ + + + + + + 0 4 6 7 8 9 11 + 1.1 4.5 1.2 6 1.1 8.3 2 10 4 10 6 10 7 10 + + + 1.1 4.5 0 1.2 6 0 1.1 8.3 0 2 10 0 4 10 0 6 10 0 7 10 0 + + + 0 1 1 2 2 3 3 4 4 5 5 6 + + + 0 1 1 2 2 3 3 4 4 5 5 6 + 2 4 6 8 10 12 + + + + diff --git a/src/tests/data/CrossSection/Line_00000000-eef0-4e70-8000-0000d39ca40d.vtp b/src/tests/data/CrossSection/Line_00000000-eef0-4e70-8000-0000d39ca40d.vtp new file mode 100644 index 0000000..406fff3 --- /dev/null +++ b/src/tests/data/CrossSection/Line_00000000-eef0-4e70-8000-0000d39ca40d.vtp @@ -0,0 +1,21 @@ + + + + + + 7 10 9.5 10 10.5 9.8 10.6 8.5 + 11 17 16 15 + + + 7 10 0 9.5 10 0 10.5 9.8 0 10.6 8.5 0 + + + 0 1 1 2 2 3 + + + 0 1 1 2 2 3 + 2 4 6 + + + + diff --git a/src/tests/data/CrossSection/Line_00000000-f0b7-4f93-8000-000061178f38.vtp b/src/tests/data/CrossSection/Line_00000000-f0b7-4f93-8000-000061178f38.vtp new file mode 100644 index 0000000..c95af5e --- /dev/null +++ b/src/tests/data/CrossSection/Line_00000000-f0b7-4f93-8000-000061178f38.vtp @@ -0,0 +1,21 @@ + + + + + + 6.1 7 8 7.5 10.6 8.5 + 13 14 15 + + + 6.1 7 0 8 7.5 0 10.6 8.5 0 + + + 0 1 1 2 + + + 0 1 1 2 + 2 4 + + + + diff --git a/src/tests/data/CrossSection/Line_00000000-f3c7-4f58-8000-00002d5cbee6.vtp b/src/tests/data/CrossSection/Line_00000000-f3c7-4f58-8000-00002d5cbee6.vtp new file mode 100644 index 0000000..c28f191 --- /dev/null +++ b/src/tests/data/CrossSection/Line_00000000-f3c7-4f58-8000-00002d5cbee6.vtp @@ -0,0 +1,21 @@ + + + + + + 1.1 4.5 1.1 1.5 4.5 1.4 6.4 1.7 8.2 1.9 11 2 10.9 4 10.7 6.9 10.6 8.5 + 0 18 19 20 21 22 27 30 15 + + + 1.1 4.5 0 1.1 1.5 0 4.5 1.4 0 6.4 1.7 0 8.2 1.9 0 11 2 0 10.9 4 0 10.7 6.9 0 10.6 8.5 0 + + + 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 + + + 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 + 2 4 6 8 10 12 14 16 + + + + diff --git a/src/tests/data/CrossSection/Surface_00000000-2329-4cf6-8000-0000f98922e7.vtp b/src/tests/data/CrossSection/Surface_00000000-2329-4cf6-8000-0000f98922e7.vtp new file mode 100644 index 0000000..84b48a5 --- /dev/null +++ b/src/tests/data/CrossSection/Surface_00000000-2329-4cf6-8000-0000f98922e7.vtp @@ -0,0 +1,22 @@ + + + + + + 1.1 4.5 3 5 1.2 6 3 8 5 8.2 5 5.5 1.1 8.3 2 10 4 10 6 10 7 10 5.9 7.7 6.1 7 5.8 5.8 + 0 1 4 5 10 2 6 7 8 9 11 12 13 3 + + + 1.1 4.5 0 3 5 0 1.2 6 0 3 8 0 5 8.2 0 5 5.5 0 1.1 8.3 0 2 10 0 4 10 0 6 10 0 7 10 0 5.9 7.7 0 6.1 7 0 5.8 5.8 0 + + + 4.29497e+09 1 4.29497e+09 2 4 0 3 7 1 4.29497e+09 12 2 1 5 4.29497e+09 6 4.29497e+09 4 7 4.29497e+09 5 2 8 6 9 4.29497e+09 7 10 4.29497e+09 8 11 4.29497e+09 9 12 4.29497e+09 10 13 11 3 4.29497e+09 4.29497e+09 12 + 0 1 2 1 3 2 1 4 3 1 5 4 2 3 6 3 7 6 3 8 7 3 4 8 4 9 8 4 10 9 4 11 10 4 12 11 5 12 4 5 13 12 + + + 0 1 2 1 3 2 1 4 3 1 5 4 2 3 6 3 7 6 3 8 7 3 4 8 4 9 8 4 10 9 4 11 10 4 12 11 5 12 4 5 13 12 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 + + + + diff --git a/src/tests/data/CrossSection/Surface_00000000-c4b6-47e6-8000-0000a9040e04.vtp b/src/tests/data/CrossSection/Surface_00000000-c4b6-47e6-8000-0000a9040e04.vtp new file mode 100644 index 0000000..77d76a0 --- /dev/null +++ b/src/tests/data/CrossSection/Surface_00000000-c4b6-47e6-8000-0000a9040e04.vtp @@ -0,0 +1,22 @@ + + + + + + 18 19 23 24 20 25 21 26 22 27 30 29 15 14 28 3 0 1 2 13 3 31 31 + 1.1 1.5 4.5 1.4 2.9 3 4.9 3.1 6.4 1.7 6.3 4 8.2 1.9 8.5 4 11 2 10.9 4 10.7 6.9 9.4 6 10.6 8.5 8 7.5 7 5.95 5.8 5.8 1.1 4.5 3 5 5 5.5 6.1 7 5.8 5.8 5.35 4.45 5.35 4.45 + + + 1.1 1.5 0 4.5 1.4 0 2.9 3 0 4.9 3.1 0 6.4 1.7 0 6.3 4 0 8.2 1.9 0 8.5 4 0 11 2 0 10.9 4 0 10.7 6.9 0 9.4 6 0 10.6 8.5 0 8 7.5 0 7 5.95 0 5.8 5.8 0 1.1 4.5 0 3 5 0 5 5.5 0 6.1 7 0 5.8 5.8 0 5.35 4.45 0 5.35 4.45 0 + + + 0 1 2 1 3 2 1 4 3 4 5 3 4 6 5 6 7 5 6 8 7 8 9 7 9 10 11 10 12 11 11 12 13 7 9 11 14 11 13 7 11 14 5 7 14 5 14 20 0 2 16 16 2 17 2 3 17 3 18 17 20 14 19 14 13 19 20 21 5 21 3 5 3 22 18 22 15 18 + 4.29497e+09 1 16 2 18 0 4.29497e+09 3 1 4 23 2 4.29497e+09 5 3 6 14 4 4.29497e+09 7 5 4.29497e+09 11 6 4.29497e+09 9 11 4.29497e+09 10 8 9 4.29497e+09 12 7 8 13 13 10 21 11 12 14 5 13 15 14 20 22 0 17 4.29497e+09 16 18 4.29497e+09 1 19 17 24 4.29497e+09 18 15 21 4.29497e+09 12 4.29497e+09 20 4.29497e+09 23 15 4.29497e+09 3 22 4.29497e+09 25 19 4.29497e+09 4.29497e+09 24 + + + 0 1 2 1 3 2 1 4 3 4 5 3 4 6 5 6 7 5 6 8 7 8 9 7 9 10 11 10 12 11 11 12 13 7 9 11 14 11 13 7 11 14 5 7 14 5 14 20 0 2 16 16 2 17 2 3 17 3 18 17 20 14 19 14 13 19 20 21 5 21 3 5 3 22 18 22 15 18 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 + + + + diff --git a/src/tests/data/CrossSection/Surface_00000000-e7bf-47ac-8000-00006f6e7f4f.vtp b/src/tests/data/CrossSection/Surface_00000000-e7bf-47ac-8000-00006f6e7f4f.vtp new file mode 100644 index 0000000..d51ee53 --- /dev/null +++ b/src/tests/data/CrossSection/Surface_00000000-e7bf-47ac-8000-00006f6e7f4f.vtp @@ -0,0 +1,22 @@ + + + + + + 13 14 11 15 16 17 12 + 6.1 7 8 7.5 7 10 10.6 8.5 10.5 9.8 9.5 10 5.9 7.7 + + + 6.1 7 0 8 7.5 0 7 10 0 10.6 8.5 0 10.5 9.8 0 9.5 10 0 5.9 7.7 0 + + + 4.29497e+09 1 4 4.29497e+09 3 0 4.29497e+09 4.29497e+09 3 2 4.29497e+09 1 0 4.29497e+09 4.29497e+09 + 0 1 2 1 3 2 3 4 5 3 5 2 0 2 6 + + + 0 1 2 1 3 2 3 4 5 3 5 2 0 2 6 + 3 6 9 12 15 + + + + diff --git a/src/tests/data/images/apply_textures.jpeg b/src/tests/data/images/mesh/apply_textures.jpeg similarity index 100% rename from src/tests/data/images/apply_textures.jpeg rename to src/tests/data/images/mesh/apply_textures.jpeg diff --git a/src/tests/data/images/delete_object_pipeline.jpeg b/src/tests/data/images/mesh/deregister.jpeg similarity index 100% rename from src/tests/data/images/delete_object_pipeline.jpeg rename to src/tests/data/images/mesh/deregister.jpeg diff --git a/src/tests/data/images/mesh/display_polygon_attribute_1.jpeg b/src/tests/data/images/mesh/display_polygon_attribute_1.jpeg new file mode 100644 index 0000000..6433ce8 Binary files /dev/null and b/src/tests/data/images/mesh/display_polygon_attribute_1.jpeg differ diff --git a/src/tests/data/images/mesh/display_polygon_attribute_2.jpeg b/src/tests/data/images/mesh/display_polygon_attribute_2.jpeg new file mode 100644 index 0000000..eb92bfe Binary files /dev/null and b/src/tests/data/images/mesh/display_polygon_attribute_2.jpeg differ diff --git a/src/tests/data/images/mesh/display_vertex_attribute_1.jpeg b/src/tests/data/images/mesh/display_vertex_attribute_1.jpeg new file mode 100644 index 0000000..ee7e056 Binary files /dev/null and b/src/tests/data/images/mesh/display_vertex_attribute_1.jpeg differ diff --git a/src/tests/data/images/mesh/display_vertex_attribute_2.jpeg b/src/tests/data/images/mesh/display_vertex_attribute_2.jpeg new file mode 100644 index 0000000..4b4dbf2 Binary files /dev/null and b/src/tests/data/images/mesh/display_vertex_attribute_2.jpeg differ diff --git a/src/tests/data/images/mesh/display_vertex_attribute_3.jpeg b/src/tests/data/images/mesh/display_vertex_attribute_3.jpeg new file mode 100644 index 0000000..c73c3af Binary files /dev/null and b/src/tests/data/images/mesh/display_vertex_attribute_3.jpeg differ diff --git a/src/tests/data/images/create_object_pipeline.jpeg b/src/tests/data/images/mesh/register.jpeg similarity index 100% rename from src/tests/data/images/create_object_pipeline.jpeg rename to src/tests/data/images/mesh/register.jpeg diff --git a/src/tests/data/images/set_color.jpeg b/src/tests/data/images/mesh/set_color.jpeg similarity index 100% rename from src/tests/data/images/set_color.jpeg rename to src/tests/data/images/mesh/set_color.jpeg diff --git a/src/tests/data/images/toggle_edge_visibility.jpeg b/src/tests/data/images/mesh/set_edge_visibility.jpeg similarity index 100% rename from src/tests/data/images/toggle_edge_visibility.jpeg rename to src/tests/data/images/mesh/set_edge_visibility.jpeg diff --git a/src/tests/data/images/mesh/set_opacity.jpeg b/src/tests/data/images/mesh/set_opacity.jpeg new file mode 100644 index 0000000..0cfce8b Binary files /dev/null and b/src/tests/data/images/mesh/set_opacity.jpeg differ diff --git a/src/tests/data/images/toggle_object_visibility_1.jpeg b/src/tests/data/images/mesh/toggle_object_visibility_1.jpeg similarity index 100% rename from src/tests/data/images/toggle_object_visibility_1.jpeg rename to src/tests/data/images/mesh/toggle_object_visibility_1.jpeg diff --git a/src/tests/data/images/toggle_object_visibility_2.jpeg b/src/tests/data/images/mesh/toggle_object_visibility_2.jpeg similarity index 100% rename from src/tests/data/images/toggle_object_visibility_2.jpeg rename to src/tests/data/images/mesh/toggle_object_visibility_2.jpeg diff --git a/src/tests/data/images/toggle_object_visiblity.jpeg b/src/tests/data/images/mesh/toggle_object_visiblity.jpeg similarity index 100% rename from src/tests/data/images/toggle_object_visiblity.jpeg rename to src/tests/data/images/mesh/toggle_object_visiblity.jpeg diff --git a/src/tests/data/images/mesh/toggle_point_visibility.jpeg b/src/tests/data/images/mesh/toggle_point_visibility.jpeg new file mode 100644 index 0000000..8b0cf16 Binary files /dev/null and b/src/tests/data/images/mesh/toggle_point_visibility.jpeg differ diff --git a/src/tests/data/images/model/deregister.jpeg b/src/tests/data/images/model/deregister.jpeg new file mode 100644 index 0000000..7eb6779 Binary files /dev/null and b/src/tests/data/images/model/deregister.jpeg differ diff --git a/src/tests/data/images/model/register.jpeg b/src/tests/data/images/model/register.jpeg new file mode 100644 index 0000000..e790246 Binary files /dev/null and b/src/tests/data/images/model/register.jpeg differ diff --git a/src/tests/data/images/model/set_components_color.jpeg b/src/tests/data/images/model/set_components_color.jpeg new file mode 100644 index 0000000..8773175 Binary files /dev/null and b/src/tests/data/images/model/set_components_color.jpeg differ diff --git a/src/tests/data/images/model/set_components_visibility.jpeg b/src/tests/data/images/model/set_components_visibility.jpeg new file mode 100644 index 0000000..7eb6779 Binary files /dev/null and b/src/tests/data/images/model/set_components_visibility.jpeg differ diff --git a/src/tests/data/images/model/set_mesh_visibility.jpeg b/src/tests/data/images/model/set_mesh_visibility.jpeg new file mode 100644 index 0000000..c2b6a04 Binary files /dev/null and b/src/tests/data/images/model/set_mesh_visibility.jpeg differ diff --git a/src/tests/data/images/create_visualization.jpeg b/src/tests/data/images/viewer/create_visualization.jpeg similarity index 100% rename from src/tests/data/images/create_visualization.jpeg rename to src/tests/data/images/viewer/create_visualization.jpeg diff --git a/src/tests/data/images/reset.jpeg b/src/tests/data/images/viewer/reset.jpeg similarity index 100% rename from src/tests/data/images/reset.jpeg rename to src/tests/data/images/viewer/reset.jpeg diff --git a/src/tests/data/images/reset_camera.jpeg b/src/tests/data/images/viewer/reset_camera.jpeg similarity index 100% rename from src/tests/data/images/reset_camera.jpeg rename to src/tests/data/images/viewer/reset_camera.jpeg diff --git a/src/tests/data/images/viewer/set_background_color.jpeg b/src/tests/data/images/viewer/set_background_color.jpeg new file mode 100644 index 0000000..d3ae7fd Binary files /dev/null and b/src/tests/data/images/viewer/set_background_color.jpeg differ diff --git a/src/tests/data/images/take_screenshot_with_background.jpg b/src/tests/data/images/viewer/take_screenshot_with_background.jpg similarity index 100% rename from src/tests/data/images/take_screenshot_with_background.jpg rename to src/tests/data/images/viewer/take_screenshot_with_background.jpg diff --git a/src/tests/data/images/take_screenshot_with_background.png b/src/tests/data/images/viewer/take_screenshot_with_background.png similarity index 100% rename from src/tests/data/images/take_screenshot_with_background.png rename to src/tests/data/images/viewer/take_screenshot_with_background.png diff --git a/src/tests/data/images/take_screenshot_without_background.png b/src/tests/data/images/viewer/take_screenshot_without_background.png similarity index 100% rename from src/tests/data/images/take_screenshot_without_background.png rename to src/tests/data/images/viewer/take_screenshot_without_background.png diff --git a/src/tests/data/polygon_attribute.vtp b/src/tests/data/polygon_attribute.vtp new file mode 100644 index 0000000..09e313a --- /dev/null +++ b/src/tests/data/polygon_attribute.vtp @@ -0,0 +1,25 @@ + + + + + + -5.03873 -3.56819 -3.29213 -0.379219 0.386424 -1.97966 -0.310684 1.50807 1.80048 2.25409 2.56229 0.235826 -0.162775 -1.4339 + 1.1 4.5 3 5 1.2 6 3 8 5 8.2 5 5.5 1.1 8.3 2 10 4 10 6 10 7 10 5.9 7.7 6.1 7 5.8 5.8 + 32 33 36 37 42 34 38 39 40 41 43 44 45 35 + 0.441452 1.06497 0 0.509268 1.09401 0 0.451134 1.22395 0 0.244789 1.03019 0 0.306431 0.898241 0 0.520398 0.854144 0 0.0558145 0.936744 0 0.17577 1.03026 0 0.179188 0.94981 0 0.242737 0.863881 0 0.312089 0.886676 0 0.328556 0.855054 0 nan nan nan 0.353402 0.897993 0 + + + 1.1 4.5 0 3 5 0 1.2 6 0 3 8 0 5 8.2 0 5 5.5 0 1.1 8.3 0 2 10 0 4 10 0 6 10 0 7 10 0 5.9 7.7 0 6.1 7 0 5.8 5.8 0 + + + 0 1 2 1 3 2 1 4 3 1 5 4 2 3 6 3 7 6 3 8 7 3 4 8 4 9 8 4 10 9 4 11 10 4 12 11 5 12 4 5 13 12 + 4.29497e+09 1 4.29497e+09 2 4 0 3 7 1 4.29497e+09 12 2 1 5 4.29497e+09 6 4.29497e+09 4 7 4.29497e+09 5 2 8 6 9 4.29497e+09 7 10 4.29497e+09 8 11 4.29497e+09 9 12 4.29497e+09 10 13 11 3 4.29497e+09 4.29497e+09 12 + -3.96635 -2.41318 -1.18699 -1.72048 -1.32735 0.272721 0.976443 0.602562 1.48033 1.73427 1.06151 0.153159 -0.585337 -1.19211 + + + 0 1 2 1 3 2 1 4 3 1 5 4 2 3 6 3 7 6 3 8 7 3 4 8 4 9 8 4 10 9 4 11 10 4 12 11 5 12 4 5 13 12 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 + + + + diff --git a/src/tests/data/take_screenshot_with_background.jpg b/src/tests/data/take_screenshot_with_background.jpg new file mode 100644 index 0000000..0faecaf Binary files /dev/null and b/src/tests/data/take_screenshot_with_background.jpg differ diff --git a/src/tests/data/take_screenshot_with_background.png b/src/tests/data/take_screenshot_with_background.png new file mode 100644 index 0000000..4af1e65 Binary files /dev/null and b/src/tests/data/take_screenshot_with_background.png differ diff --git a/src/tests/data/take_screenshot_without_background.png b/src/tests/data/take_screenshot_without_background.png new file mode 100644 index 0000000..4af1e65 Binary files /dev/null and b/src/tests/data/take_screenshot_without_background.png differ diff --git a/src/tests/data/vertex_attribute.vtp b/src/tests/data/vertex_attribute.vtp new file mode 100644 index 0000000..dfe9f19 --- /dev/null +++ b/src/tests/data/vertex_attribute.vtp @@ -0,0 +1,25 @@ + + + + + + -4.81986 -4.24426 -3.08307 -2.67472 -3.78427 -1.72952 -3.51395 -1.54156 -3.26163 -1.37705 1.49282 0.476446 3.07847 1.81965 0.15148 -0.00219692 -2.03758 -1.21643 -0.392793 1.04446 -0.159125 -1.41509 -1.36066 + 1.1 1.5 4.5 1.4 2.9 3 4.9 3.1 6.4 1.7 6.3 4 8.2 1.9 8.5 4 11 2 10.9 4 10.7 6.9 9.4 6 10.6 8.5 8 7.5 7 5.95 5.8 5.8 1.1 4.5 3 5 5 5.5 6.1 7 5.8 5.8 5.35 4.45 5.35 4.45 + 0.212913 0.898437 0 0.17411 0.88882 0 0.188674 0.91656 0 0.129386 0.902004 0 0.0522603 0.892251 0 0.0913028 0.902984 0 0.0494319 0.925332 0 0.0790874 0.944317 0 0.0630148 0.926847 0 0.0606951 0.95661 0 0.0916888 0.990159 0 0.102275 0.986827 0 0.0910002 0.997784 0 0.149679 1.01122 0 0.129961 0.95844 0 nan nan nan 0.18944 0.925768 0 0.188704 0.925194 0 0.172618 0.985506 0 0.149488 0.967933 0 0.14023 0.965619 0 0.0974158 0.875532 0 nan nan nan + 50 51 55 56 52 57 53 58 54 59 62 61 47 46 60 35 32 33 34 45 35 63 63 + + + 1.1 1.5 0 4.5 1.4 0 2.9 3 3 4.9 3.1 0 6.4 1.7 0 6.3 4 0 8.2 1.9 0 8.5 4 0 11 2 0 10.9 4 3 10.7 6.9 0 9.4 6 0 10.6 8.5 0 8 7.5 0 7 5.95 0 5.8 5.8 0 1.1 4.5 0 3 5 0 5 5.5 0 6.1 7 3 5.8 5.8 0 5.35 4.45 0 5.35 4.45 0 + + + -4.04907 -3.33402 -3.56775 -2.7295 -3.00925 -2.26168 -2.77238 -2.06008 0.197405 1.68258 1.79152 -0.814056 0.815858 -0.304546 -1.03987 -0.579057 -3.3135 -2.11236 -2.32474 -1.42798 0.345606 1.0052 -1.10125 -1.93978 -1.47606 -0.585217 + 4.29497e+09 1 16 2 18 0 4.29497e+09 3 1 4 23 2 4.29497e+09 5 3 6 14 4 4.29497e+09 7 5 4.29497e+09 11 6 4.29497e+09 9 11 4.29497e+09 10 8 9 4.29497e+09 12 7 8 13 13 10 21 11 12 14 5 13 15 14 20 22 0 17 4.29497e+09 16 18 4.29497e+09 1 19 17 24 4.29497e+09 18 15 21 4.29497e+09 12 4.29497e+09 20 4.29497e+09 23 15 4.29497e+09 3 22 4.29497e+09 25 19 4.29497e+09 4.29497e+09 24 + 0 1 2 1 3 2 1 4 3 4 5 3 4 6 5 6 7 5 6 8 7 8 9 7 9 10 11 10 12 11 11 12 13 7 9 11 14 11 13 7 11 14 5 7 14 5 14 20 0 2 16 16 2 17 2 3 17 3 18 17 20 14 19 14 13 19 20 21 5 21 3 5 3 22 18 22 15 18 + + + 0 1 2 1 3 2 1 4 3 4 5 3 4 6 5 6 7 5 6 8 7 8 9 7 9 10 11 10 12 11 11 12 13 7 9 11 14 11 13 7 11 14 5 7 14 5 14 20 0 2 16 16 2 17 2 3 17 3 18 17 20 14 19 14 13 19 20 21 5 21 3 5 3 22 18 22 15 18 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 + + + + diff --git a/src/tests/data/verts.vtp b/src/tests/data/verts.vtp new file mode 100644 index 0000000..5cd44fd --- /dev/null +++ b/src/tests/data/verts.vtp @@ -0,0 +1,17 @@ + + + + + + 930 930 -500 930 930 -600 930 930 -700 + + + 930 930 -500 930 930 -600 930 930 -700 + + + 0 1 2 + 1 2 3 + + + + diff --git a/src/tests/test_generic_protocols.py b/src/tests/test_generic_protocols.py new file mode 100644 index 0000000..5c1f27c --- /dev/null +++ b/src/tests/test_generic_protocols.py @@ -0,0 +1,21 @@ +from opengeodeweb_viewer.rpc.generic.generic_protocols import VtkGenericView + +def test_register_mesh(server): + server.call(VtkGenericView.prefix + VtkGenericView.schemas_dict["register"]["rpc"], [{"viewer_object": "mesh", "id": "123456789", "file_name": "hat.vtp"}]) + assert server.compare_image(3, "mesh/register.jpeg") == True + +def test_register_model(server): + server.call(VtkGenericView.prefix + VtkGenericView.schemas_dict["register"]["rpc"], [{"viewer_object": "model", "id": "123456789", "file_name": "CrossSection.vtm"}]) + assert server.compare_image(3, "model/register.jpeg") == True + +def test_deregister_mesh(server): + test_register_mesh(server) + + server.call(VtkGenericView.prefix + VtkGenericView.schemas_dict["deregister"]["rpc"], [{"viewer_object": "mesh", "id": "123456789"}]) + assert server.compare_image(3, "mesh/deregister.jpeg") == True + +def test_deregister_model(server): + test_register_model(server) + + server.call(VtkGenericView.prefix + VtkGenericView.schemas_dict["deregister"]["rpc"], [{"viewer_object": "model", "id": "123456789"}]) + assert server.compare_image(3, "model/deregister.jpeg") == True \ No newline at end of file diff --git a/src/tests/test_mesh_protocols.py b/src/tests/test_mesh_protocols.py new file mode 100644 index 0000000..0091b5d --- /dev/null +++ b/src/tests/test_mesh_protocols.py @@ -0,0 +1,83 @@ + + +from opengeodeweb_viewer.rpc.mesh.mesh_protocols import VtkMeshView + +def test_register_mesh(server): + + server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["register"]["rpc"], [{"id": "123456789", "file_name": "hat.vtp"}]) + assert server.compare_image(3, "mesh/register.jpeg") == True + +def test_deregister_mesh(server): + + test_register_mesh(server) + + server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["deregister"]["rpc"], [{"id": "123456789"}]) + assert server.compare_image(3, "mesh/deregister.jpeg") == True + +def test_set_opacity(server): + + test_register_mesh(server) + + server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["set_opacity"]["rpc"], [{"id": "123456789", "opacity": 0.1}]) + assert server.compare_image(3, "mesh/set_opacity.jpeg") == True + +def test_set_edge_visibility(server): + + test_register_mesh(server) + + server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["set_edge_visibility"]["rpc"], [{"id": "123456789", "visibility": True}]) + assert server.compare_image(3, "mesh/set_edge_visibility.jpeg") == True + +# def test_set_point_visibility(server): + +# test_register_mesh(server) + +# server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["set_point_visibility"]["rpc"], [{"id": "123456789", "visibility": True}]) +# assert server.compare_image(3, "mesh/set_point_visibility.jpeg") == True + +# def test_set_point_size(server): + +# server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["register"]["rpc"], [{"id": "123456789", "file_name": "vertex_attribute.vtp"}]) +# assert server.compare_image(3, "mesh/set_point_size_1.jpeg") == True + + # server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["set_point_visibility"]["rpc"], [{"id": "123456789", "visibility": True}]) + # assert server.compare_image(3, "mesh/set_point_size_2.jpeg") == True + + # server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["set_point_size"]["rpc"], [{"id": "123456789", "size": 10}]) + # assert server.compare_image(3, "mesh/set_point_size_3.jpeg") == True + + +def test_set_color(server): + + test_register_mesh(server) + + server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["set_color"]["rpc"], [{"id": "123456789", "red": 50, "green": 2, "blue": 250}]) + assert server.compare_image(3, "mesh/set_color.jpeg") == True + + +def test_display_vertex_attribute(server): + server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["register"]["rpc"], [{"id": "123456789", "file_name": "vertex_attribute.vtp"}]) + assert server.compare_image(3, "mesh/display_vertex_attribute_1.jpeg") == True + + server.call( + VtkMeshView.prefix + VtkMeshView.schemas_dict["display_vertex_attribute"]["rpc"], + [{"id": "123456789", "name": "geode_implicit_attribute"}], + ) + assert server.compare_image(3, "mesh/display_vertex_attribute_2.jpeg") == True + + + server.call( + VtkMeshView.prefix + VtkMeshView.schemas_dict["set_color"]["rpc"], + [{"id": "123456789", "red": 250, "green": 0, "blue": 0}], + ) + assert server.compare_image(3, "mesh/display_vertex_attribute_3.jpeg") == True + +def test_display_polygon_attribute(server): + server.call(VtkMeshView.prefix + VtkMeshView.schemas_dict["register"]["rpc"], [{"id": "123456789", "file_name": "polygon_attribute.vtp"}]) + assert server.compare_image(3, "mesh/display_polygon_attribute_1.jpeg") == True + + server.call( + VtkMeshView.prefix + VtkMeshView.schemas_dict["display_polygon_attribute"]["rpc"], + [{"id": "123456789", "name": "implicit_on_polygons"}], + ) + assert server.compare_image(3, "mesh/display_polygon_attribute_2.jpeg") == True \ No newline at end of file diff --git a/src/tests/test_model_protocols.py b/src/tests/test_model_protocols.py new file mode 100644 index 0000000..2212d7d --- /dev/null +++ b/src/tests/test_model_protocols.py @@ -0,0 +1,35 @@ +from opengeodeweb_viewer.rpc.model.model_protocols import VtkModelView + +def test_register_model(server): + + server.call(VtkModelView.prefix + VtkModelView.schemas_dict["register"]["rpc"], [{"id": "123456789", "file_name": "CrossSection.vtm"}]) + assert server.compare_image(3, "model/register.jpeg") == True + +def test_deregister_model(server): + + test_register_model(server) + + server.call(VtkModelView.prefix + VtkModelView.schemas_dict["deregister"]["rpc"], [{"id": "123456789"}]) + assert server.compare_image(3, "model/deregister.jpeg") == True + + +def test_set_mesh_visibility(server): + + test_register_model(server) + + server.call(VtkModelView.prefix + VtkModelView.schemas_dict["set_mesh_visibility"]["rpc"], [{"id": "123456789", "visibility": True}]) + assert server.compare_image(3, "model/set_mesh_visibility.jpeg") == True + +def test_set_components_visibility(server): + + test_register_model(server) + + server.call(VtkModelView.prefix + VtkModelView.schemas_dict["set_components_visibility"]["rpc"], [{"id": "123456789", "visibility": False}]) + assert server.compare_image(3, "model/set_components_visibility.jpeg") == True + +def test_set_components_color(server): + + test_register_model(server) + + server.call(VtkModelView.prefix + VtkModelView.schemas_dict["set_components_color"]["rpc"], [{"id": "123456789", "red": 255, "green": 0, "blue": 0}]) + assert server.compare_image(3, "model/set_components_color.jpeg") == True \ No newline at end of file diff --git a/src/tests/test_protocol.py b/src/tests/test_protocol.py deleted file mode 100644 index f9f09ee..0000000 --- a/src/tests/test_protocol.py +++ /dev/null @@ -1,174 +0,0 @@ -import os - - -def test_create_visualization(server): - server.call("create_visualization") - assert server.compare_image(3, "create_visualization.jpeg") == True - - -def test_reset_camera(server): - server.call("reset_camera") - assert server.compare_image(3, "reset_camera.jpeg") == True - - -def test_create_object_pipeline(server): - server.call("create_object_pipeline", [{"id": "123456", "file_name": "hat.vtp"}]) - assert server.compare_image(3, "create_object_pipeline.jpeg") == True - - -def test_delete_object_pipeline(server): - server.call("create_object_pipeline", [{"id": "123456789", "file_name": "hat.vtp"}]) - assert server.compare_image(3, "create_object_pipeline.jpeg") == True - - server.call("delete_object_pipeline", [{"id": "123456789"}]) - assert server.compare_image(3, "delete_object_pipeline.jpeg") == True - - -def test_toggle_object_visibility(server): - server.call("create_object_pipeline", [{"id": "123456789", "file_name": "hat.vtp"}]) - assert server.compare_image(3, "create_object_pipeline.jpeg") == True - - server.call("toggle_object_visibility", [{"id": "123456789", "is_visible": False}]) - assert server.compare_image(3, "toggle_object_visibility_1.jpeg") == True - - server.call("toggle_object_visibility", [{"id": "123456789", "is_visible": True}]) - assert server.compare_image(3, "toggle_object_visibility_2.jpeg") == True - - -def test_apply_textures(server): - - server.call( - "create_object_pipeline", - [{"id": "123456789", "file_name": "hat.vtp"}], - ) - assert server.compare_image(3, "create_object_pipeline.jpeg") == True - - server.call( - "apply_textures", - [ - { - "id": "123456789", - "textures": [ - { - "texture_name": "lambert2SG", - "texture_file_name": "hat_lambert2SG.vti", - } - ], - } - ], - ) - assert server.compare_image(3, "apply_textures.jpeg") == True - - -def test_get_point_position(server): - - server.call( - "create_object_pipeline", - [{"id": "123456789", "file_name": "hat.vtp"}], - ) - assert server.compare_image(3, "create_object_pipeline.jpeg") == True - - server.call("get_point_position", [{"x": 0, "y": 0}]) - response = server.get_response() - assert "x" in response["result"] - assert "y" in response["result"] - assert "z" in response["result"] - x = response["result"]["x"] - y = response["result"]["y"] - z = response["result"]["z"] - assert type(x) is float - assert type(y) is float - assert type(z) is float - - -def test_toggle_edge_visibility(server): - - server.call( - "create_object_pipeline", - [{"id": "123456789", "file_name": "hat.vtp"}], - ) - assert server.compare_image(3, "create_object_pipeline.jpeg") == True - - server.call("toggle_edge_visibility", [{"id": "123456789", "visibility": True}]) - assert server.compare_image(3, "toggle_edge_visibility.jpeg") == True - - -def test_set_color(server): - - server.call( - "create_object_pipeline", - [{"id": "123456789", "file_name": "hat.vtp"}], - ) - assert server.compare_image(3, "create_object_pipeline.jpeg") == True - - server.call("set_color", [{"id": "123456789", "red": 50, "green": 2, "blue": 250}]) - assert server.compare_image(3, "set_color.jpeg") == True - - - -def test_take_screenshot(server): - # Create an object - server.call( - "create_object_pipeline", - [{"id": "123456789", "file_name": "hat.vtp"}], - ) - assert server.compare_image(3, "create_object_pipeline.jpeg") == True - - - # Take a screenshot with background jpg - server.call( - "take_screenshot", - [{"filename": "take_screenshot_with_background", "output_extension": "jpg", "include_background": True}], - ) - - response = server.get_response() - blob = server.get_response() - assert type(blob) is bytes - - with open(os.path.join(server.test_output_dir, "test.jpg"), "wb") as f: - f.write(blob) - f.close() - first_image_path = os.path.join(server.test_output_dir, "test.jpg") - second_image_path = os.path.join(server.images_dir_path, "take_screenshot_with_background.jpg") - - assert server.images_diff(first_image_path, second_image_path) == 0.0 - - # Take a screenshot without background png - server.call( - "take_screenshot", - [{"filename": "take_screenshot_without_background", "output_extension": "png", "include_background": True}], - ) - - response = server.get_response() - response = server.get_response() - blob = server.get_response() - print(f"{blob=}", flush=True) - assert type(blob) is bytes - - with open(os.path.join(server.test_output_dir, "test.png"), "wb") as f: - f.write(blob) - f.close() - first_image_path = os.path.join(server.test_output_dir, "test.png") - second_image_path = os.path.join(server.images_dir_path, "take_screenshot_without_background.png") - - assert server.images_diff(first_image_path, second_image_path) == 0.0 - - # Take a screenshot with background png - server.call( - "take_screenshot", - [{"filename": "take_screenshot_with_background", "output_extension": "png", "include_background": True}], - ) - - response = server.get_response() - response = server.get_response() - blob = server.get_response() - print(f"{blob=}", flush=True) - assert type(blob) is bytes - - with open(os.path.join(server.test_output_dir, "test.png"), "wb") as f: - f.write(blob) - f.close() - first_image_path = os.path.join(server.test_output_dir, "test.png") - second_image_path = os.path.join(server.images_dir_path, "take_screenshot_with_background.png") - - assert server.images_diff(first_image_path, second_image_path) == 0.0 diff --git a/src/tests/test_viewer_protocols.py b/src/tests/test_viewer_protocols.py new file mode 100644 index 0000000..d60b01e --- /dev/null +++ b/src/tests/test_viewer_protocols.py @@ -0,0 +1,99 @@ +# Standard library imports +import os + +# Third party imports +from opengeodeweb_viewer.rpc.viewer.viewer_protocols import VtkViewerView + +# Local application imports +from .test_mesh_protocols import test_register_mesh + +def test_create_visualization(server): + server.call(VtkViewerView.prefix + VtkViewerView.schemas_dict["create_visualization"]["rpc"]) + assert server.compare_image(3, "viewer/create_visualization.jpeg") == True + +def test_reset_camera(server): + server.call(VtkViewerView.prefix + VtkViewerView.schemas_dict["reset_camera"]["rpc"]) + assert server.compare_image(3, "viewer/reset_camera.jpeg") == True + +def test_set_viewer_background_color(server): + server.call(VtkViewerView.prefix + VtkViewerView.schemas_dict["set_background_color"]["rpc"], [{"red": 0, "green": 0, "blue": 255}]) + assert server.compare_image(3, "viewer/set_background_color.jpeg") == True + +def test_get_point_position(server): + + test_register_mesh(server) + + server.call(VtkViewerView.prefix + VtkViewerView.schemas_dict["get_point_position"]["rpc"], [{"x": 0, "y": 0}]) + response = server.get_response() + assert "x" in response["result"] + assert "y" in response["result"] + assert "z" in response["result"] + x = response["result"]["x"] + y = response["result"]["y"] + z = response["result"]["z"] + assert type(x) is float + assert type(y) is float + assert type(z) is float + + +def test_take_screenshot(server): + # Create an object + test_register_mesh(server) + + # Take a screenshot with background jpg + server.call( + VtkViewerView.prefix + VtkViewerView.schemas_dict["take_screenshot"]["rpc"], + [{"filename": "take_screenshot_with_background", "output_extension": "jpg", "include_background": True}], + ) + + response = server.get_response() + blob = server.get_response() + assert type(blob) is bytes + + with open(os.path.join(server.test_output_dir, "test.jpg"), "wb") as f: + f.write(blob) + f.close() + first_image_path = os.path.join(server.test_output_dir, "test.jpg") + second_image_path = os.path.join(server.images_dir_path, "viewer/take_screenshot_with_background.jpg") + + assert server.images_diff(first_image_path, second_image_path) == 0.0 + + # Take a screenshot without background png + server.call( + VtkViewerView.prefix + VtkViewerView.schemas_dict["take_screenshot"]["rpc"], + [{"filename": "take_screenshot_without_background", "output_extension": "png", "include_background": True}], + ) + + response = server.get_response() + response = server.get_response() + blob = server.get_response() + print(f"{blob=}", flush=True) + assert type(blob) is bytes + + with open(os.path.join(server.test_output_dir, "test.png"), "wb") as f: + f.write(blob) + f.close() + first_image_path = os.path.join(server.test_output_dir, "test.png") + second_image_path = os.path.join(server.images_dir_path, "viewer/take_screenshot_without_background.png") + + assert server.images_diff(first_image_path, second_image_path) == 0.0 + + # Take a screenshot with background png + server.call( + VtkViewerView.prefix + VtkViewerView.schemas_dict["take_screenshot"]["rpc"], + [{"filename": "take_screenshot_with_background", "output_extension": "png", "include_background": True}], + ) + + response = server.get_response() + response = server.get_response() + blob = server.get_response() + print(f"{blob=}", flush=True) + assert type(blob) is bytes + + with open(os.path.join(server.test_output_dir, "test.png"), "wb") as f: + f.write(blob) + f.close() + first_image_path = os.path.join(server.test_output_dir, "test.png") + second_image_path = os.path.join(server.images_dir_path, "viewer/take_screenshot_with_background.png") + + assert server.images_diff(first_image_path, second_image_path) == 0.0 diff --git a/src/tests/tests_output/test.jpeg b/src/tests/tests_output/test.jpeg index 6b2509f..ee7e056 100644 Binary files a/src/tests/tests_output/test.jpeg and b/src/tests/tests_output/test.jpeg differ