Repository: Esri/pyprt-examples (language: python)

Issue:
Fixes for Jupyter Notebook examples



Discussion / hints:

Fix patch:
diff --git a/LICENSE b/LICENSE
index 5392b65..913b86d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,201 +1,201 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2012-2020 Esri R&D Center Zurich
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2012-2023 Esri R&D Center Zurich
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README.md b/README.md
index 295bb11..376a153 100644
--- a/README.md
+++ b/README.md
@@ -24,19 +24,16 @@ This repo contains examples of PyPRT usage. You can find installation instructio
 
 ## Requirements
 
-* Windows 10 64bit or Linux 64bit (RHEL7/CentOS7 compatible distro)
-* Python 3.7 64bit or later. Please note, we currently provide PyPRT builds for Python 3.8, 3.9 and 3.10(*) (as well as 3.7 on Windows). For other Python versions, please [build](https://github.com/Esri/pyprt) PyPRT yourself.
-* Packages (see `envs` directory): pyprt, arcgis, notebook, vispy, pyqt, pandas, scipy, pyvista, ipyvtklink, tornado, shapely
+* Windows 10/11 64bit or Linux 64bit (RHEL 7/8/9 and compatible distributions)
+* Python 3.7 64bit or later. Please note, we currently provide PyPRT builds for Python 3.7 (only Windows), 3.8, 3.9 and 3.10(*). For other Python versions, please [build](https://github.com/Esri/pyprt) PyPRT yourself.
+* Required Python packages: see `envs` directory
 
-(*) A note regarding Python 3.10: The arcgis package for Python 3.10 is not yet available, therefore the examples 8, 9 and 10 are not yet supported with Python 3.10.
+(*) A note regarding Python 3.10: The arcgis package is [not yet available for Python 3.10](https://developers.arcgis.com/python/guide/system-requirements/), therefore the examples 8, 9 and 10 are not yet supported with Python 3.10.
 
 ## Running the examples
 
 PyPRT can be installed with `pip install pyprt` or `conda install -c esri pyprt`. To run the examples a few more packages are required, so please read on! :-)
 
-Notes regarding Conda:
- - To open the Jupyter notebook examples, run `conda update --all` before calling `jupyter notebook` in the Anaconda prompt. This will make sure the packages are up to date.
-
 ### Using virtualenv and pip
 
 1. Open a shell and change to the root of this example repository.
@@ -62,9 +59,16 @@ Notes regarding Conda:
 1. Open the Anaconda prompt and change to the directory where you checked out this repository.
 1. Ensure you have a working Anaconda Python 3.8, 3.9 or 3.10 64bit installation (or additionally Python 3.7 on Windows). For other Python versions, please [build](https://github.com/Esri/pyprt) PyPRT yourself at the moment.
 1. Run `conda env create --prefix env --file envs/environment-py38.yml` to install PyPRT and all dependencies for the examples (replace `py38` with the used Python version).
+   * In case `conda env create` takes very long or runs into errors, try to remove `arcgis` from `environment-pyXX.yml` and manually call `conda install --prefix env -c esri arcgis`. 
 1. Activate the Anaconda environment: `conda activate ./env`
 1. Now run e.g. `python ex1_python_encoder.py` to execute the corresponding Python script. For the examples based on Jupyter Notebooks, first run `jupyter notebook` and open the desired example notebook in the opening browser page.
 
+### In case of issues with Jupyter Notebook
+* If the map widgets in e.g. example 8 do not show up, try to [manually enable](https://developers.arcgis.com/python/guide/install-and-set-up/#install-offline) the corresponding notebook extensions:
+   * `jupyter nbextension enable --py --sys-prefix widgetsnbextension`
+   * `jupyter nbextension enable --py --sys-prefix arcgis`
+* If the notebook examples do not open correctly in a Conda environment, try to run `conda update --all` before running `jupyter notebook`. This will make sure the packages are up-to-date.
+
 ## Available Examples
 
 <table style="width:100%">
diff --git a/data/candler.rpk b/data/candler.rpk
index f61007f..c583f30 100644
Binary files a/data/candler.rpk and b/data/candler.rpk differ
diff --git a/data/envelope2002.rpk b/data/envelope2002.rpk
index 3bb6943..ee42f21 100644
Binary files a/data/envelope2002.rpk and b/data/envelope2002.rpk differ
diff --git a/data/extrusion_rule.rpk b/data/extrusion_rule.rpk
index 99d3c50..bd51c71 100644
Binary files a/data/extrusion_rule.rpk and b/data/extrusion_rule.rpk differ
diff --git a/data/noRule.rpk b/data/noRule.rpk
index e762178..6382df8 100644
Binary files a/data/noRule.rpk and b/data/noRule.rpk differ
diff --git a/data/translateModel.rpk b/data/translateModel.rpk
index fc5efc0..b5a11e9 100644
Binary files a/data/translateModel.rpk and b/data/translateModel.rpk differ
diff --git a/envs/environment-py310.yml b/envs/environment-py310.yml
index a816b03..be5e059 100644
--- a/envs/environment-py310.yml
+++ b/envs/environment-py310.yml
@@ -8,6 +8,8 @@ dependencies:
   - conda-forge::vispy
   - conda-forge::pyvista
   - conda-forge::ipyvtklink
+  - conda-forge::trame
   - notebook
   - pandas
   - pyqt
+  - numpy<1.24.0
diff --git a/envs/environment-py37.yml b/envs/environment-py37.yml
index c95e697..fdb3217 100644
--- a/envs/environment-py37.yml
+++ b/envs/environment-py37.yml
@@ -10,5 +10,7 @@ dependencies:
   - conda-forge::vispy
   - conda-forge::pyvista
   - conda-forge::ipyvtklink
+  - conda-forge::trame
   - notebook
   - pyqt
+  - numpy<1.24.0
diff --git a/envs/environment-py38.yml b/envs/environment-py38.yml
index 7832b32..8987c69 100644
--- a/envs/environment-py38.yml
+++ b/envs/environment-py38.yml
@@ -10,5 +10,7 @@ dependencies:
   - conda-forge::vispy
   - conda-forge::pyvista
   - conda-forge::ipyvtklink
+  - conda-forge::trame
   - notebook
   - pyqt
+  - numpy<1.24.0
diff --git a/envs/environment-py39.yml b/envs/environment-py39.yml
index 7636371..6503cb1 100644
--- a/envs/environment-py39.yml
+++ b/envs/environment-py39.yml
@@ -10,5 +10,7 @@ dependencies:
   - conda-forge::vispy
   - conda-forge::pyvista
   - conda-forge::ipyvtklink
+  - conda-forge::trame
   - notebook
   - pyqt
+  - numpy<1.24.0
diff --git a/envs/linux/requirements-py310.txt b/envs/linux/requirements-py310.txt
index 907e1cd..1bb0670 100644
--- a/envs/linux/requirements-py310.txt
+++ b/envs/linux/requirements-py310.txt
@@ -1,9 +1,11 @@
 ipyvtklink
 notebook
+nbextensions
 pandas
 PyPRT
 PyQt5
 pyvista
+trame
 scipy
 tornado
 vispy
diff --git a/envs/linux/requirements-py38.txt b/envs/linux/requirements-py38.txt
index 87660d8..cf47418 100644
--- a/envs/linux/requirements-py38.txt
+++ b/envs/linux/requirements-py38.txt
@@ -1,11 +1,14 @@
 arcgis
+urllib3<1.26.0
 ipyvtklink
 notebook
+nbextensions
 PyPRT
 PyQt5
 pyvista
+trame
 scipy
 Shapely
 tornado
 vispy
-numpy==1.21.6
+numpy<1.24.0
\ No newline at end of file
diff --git a/envs/linux/requirements-py39.txt b/envs/linux/requirements-py39.txt
index 87660d8..cf47418 100644
--- a/envs/linux/requirements-py39.txt
+++ b/envs/linux/requirements-py39.txt
@@ -1,11 +1,14 @@
 arcgis
+urllib3<1.26.0
 ipyvtklink
 notebook
+nbextensions
 PyPRT
 PyQt5
 pyvista
+trame
 scipy
 Shapely
 tornado
 vispy
-numpy==1.21.6
+numpy<1.24.0
\ No newline at end of file
diff --git a/envs/windows/requirements-py310.txt b/envs/windows/requirements-py310.txt
index 907e1cd..1bb0670 100644
--- a/envs/windows/requirements-py310.txt
+++ b/envs/windows/requirements-py310.txt
@@ -1,9 +1,11 @@
 ipyvtklink
 notebook
+nbextensions
 pandas
 PyPRT
 PyQt5
 pyvista
+trame
 scipy
 tornado
 vispy
diff --git a/envs/windows/requirements-py37.txt b/envs/windows/requirements-py37.txt
index 0724da1..cf47418 100644
--- a/envs/windows/requirements-py37.txt
+++ b/envs/windows/requirements-py37.txt
@@ -1,10 +1,14 @@
 arcgis
+urllib3<1.26.0
 ipyvtklink
 notebook
+nbextensions
 PyPRT
 PyQt5
 pyvista
+trame
 scipy
 Shapely
 tornado
 vispy
+numpy<1.24.0
\ No newline at end of file
diff --git a/envs/windows/requirements-py38.txt b/envs/windows/requirements-py38.txt
index 87660d8..cf47418 100644
--- a/envs/windows/requirements-py38.txt
+++ b/envs/windows/requirements-py38.txt
@@ -1,11 +1,14 @@
 arcgis
+urllib3<1.26.0
 ipyvtklink
 notebook
+nbextensions
 PyPRT
 PyQt5
 pyvista
+trame
 scipy
 Shapely
 tornado
 vispy
-numpy==1.21.6
+numpy<1.24.0
\ No newline at end of file
diff --git a/envs/windows/requirements-py39.txt b/envs/windows/requirements-py39.txt
index 87660d8..9ecff8a 100644
--- a/envs/windows/requirements-py39.txt
+++ b/envs/windows/requirements-py39.txt
@@ -1,11 +1,14 @@
 arcgis
+urllib3<1.26.0
 ipyvtklink
 notebook
+nbextensions
 PyPRT
 PyQt5
 pyvista
+trame
 scipy
 Shapely
 tornado
 vispy
-numpy==1.21.6
+numpy<1.24.0
diff --git a/ex10_update_scene_layer_package.py b/ex10_update_scene_layer_package.py
index 447405a..bb0e0ae 100644
--- a/ex10_update_scene_layer_package.py
+++ b/ex10_update_scene_layer_package.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2012-2022 Esri R&D Center Zurich
+# Copyright (c) 2012-2023 Esri R&D Center Zurich
 
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -52,7 +52,7 @@
 SOURCE_FEATURE_LAYER_WKID = '3857'
 TARGET_SCENE_LAYER_ID = '0'
 TARGET_SCENE_LAYER_DEFAULT_NAME = 'PyPRT_Ex10_Scene_Layer'
-RULE_PACKAGE_ITEM_ID = '5ea3e57d47224c21b2678069cd325f84'
+RULE_PACKAGE_ITEM_ID = '4ab3503cd32c46e3ab129aa976b4f373'
 
 POPULATION_DENSITY_MODE = 'linear'  # or 'logarithmic'
 
diff --git a/ex1_python_encoder.py b/ex1_python_encoder.py
index 3660813..4a7e6e7 100644
--- a/ex1_python_encoder.py
+++ b/ex1_python_encoder.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2012-2022 Esri R&D Center Zurich
+# Copyright (c) 2012-2023 Esri R&D Center Zurich
 
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/ex2_obj_initial_shape.py b/ex2_obj_initial_shape.py
index f3a4a01..69ef65b 100644
--- a/ex2_obj_initial_shape.py
+++ b/ex2_obj_initial_shape.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2012-2022 Esri R&D Center Zurich
+# Copyright (c) 2012-2023 Esri R&D Center Zurich
 
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/ex3_format_exporter.py b/ex3_format_exporter.py
index 56d6996..daa7e43 100644
--- a/ex3_format_exporter.py
+++ b/ex3_format_exporter.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2012-2022 Esri R&D Center Zurich
+# Copyright (c) 2012-2023 Esri R&D Center Zurich
 
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/ex4_multi_generations.py b/ex4_multi_generations.py
index 6955955..6384462 100644
--- a/ex4_multi_generations.py
+++ b/ex4_multi_generations.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2012-2022 Esri R&D Center Zurich
+# Copyright (c) 2012-2023 Esri R&D Center Zurich
 
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/ex5_dataset_collection.ipynb b/ex5_dataset_collection.ipynb
index e3030eb..d4bd2c7 100644
--- a/ex5_dataset_collection.ipynb
+++ b/ex5_dataset_collection.ipynb
@@ -4,7 +4,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Copyright (c) 2012-2022 Esri R&D Center Zurich\n",
+    "Copyright (c) 2012-2023 Esri R&D Center Zurich\n",
     "\n",
     "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
     "you may not use this file except in compliance with the License.\n",
diff --git a/ex6_3d_visualization_vispy.py b/ex6_3d_visualization_vispy.py
index fd56188..80272d4 100644
--- a/ex6_3d_visualization_vispy.py
+++ b/ex6_3d_visualization_vispy.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2012-2022 Esri R&D Center Zurich
+# Copyright (c) 2012-2023 Esri R&D Center Zurich
 
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/ex7_building_modeling_optimization.ipynb b/ex7_building_modeling_optimization.ipynb
index 1a9e4f2..76c5138 100644
--- a/ex7_building_modeling_optimization.ipynb
+++ b/ex7_building_modeling_optimization.ipynb
@@ -4,7 +4,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Copyright (c) 2012-2022 Esri R&D Center Zurich\n",
+    "Copyright (c) 2012-2023 Esri R&D Center Zurich\n",
     "\n",
     "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
     "you may not use this file except in compliance with the License.\n",
@@ -66,9 +66,20 @@
     "from scipy import optimize\n",
     "import numpy as np\n",
     "import pyvista\n",
+    "import trame\n",
     "from vtkmodules.vtkIOImport import vtkGLTFImporter"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "CWD = os.getcwd() # workaround: PyPRT initialization unexpectedly changes current working directory\n",
+    "DATA = os.path.join(CWD, 'data')"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -123,10 +134,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "rpk_green = os.path.join(os.getcwd(), 'data', 'envelope2002.rpk')\n",
+    "rpk_green = os.path.join(DATA, 'envelope2002.rpk')\n",
     "attrs_green = {'report_but_not_display_green': True, 'seed': 666}\n",
-    "shape_geo = pyprt.InitialShape(os.path.join(\n",
-    "    os.getcwd(), 'data', 'building_parcel.obj'))"
+    "shape_geo = pyprt.InitialShape(os.path.join(DATA, 'building_parcel.obj'))"
    ]
   },
   {
@@ -245,7 +255,7 @@
    "source": [
     "export_file_name = 'ex7_optimalmodel1'\n",
     "enc_options = {'baseName': export_file_name,\n",
-    "               'outputPath': os.path.join(os.getcwd(), 'ex7_output')}\n",
+    "               'outputPath': os.path.join(CWD, 'ex7_output')}\n",
     "os.makedirs(enc_options['outputPath'], exist_ok=True)\n",
     "\n",
     "attrs_green[input_attr_green[0]] = res_green.x[0]\n",
diff --git a/ex8_3d_gis_content_generation.ipynb b/ex8_3d_gis_content_generation.ipynb
index 4153645..dd76629 100644
--- a/ex8_3d_gis_content_generation.ipynb
+++ b/ex8_3d_gis_content_generation.ipynb
@@ -4,7 +4,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Copyright (c) 2012-2022 Esri R&D Center Zurich\n",
+    "Copyright (c) 2012-2023 Esri R&D Center Zurich\n",
     "\n",
     "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
     "you may not use this file except in compliance with the License.\n",
@@ -47,6 +47,15 @@
     "gis = GIS(username='my_username') # Enter your AGOL username."
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "CWD = os.getcwd() # workaround: PyPRT initialization unexpectedly changes current working directory"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -244,7 +253,7 @@
     "    'layerTextureMaxDimension': [2048], \n",
     "    'layerFeatureGranularity': ['0'], \n",
     "    'layerBackfaceCulling': [False], \n",
-    "    'outputPath': os.path.join(os.getcwd(), 'ex8_output')}\n",
+    "    'outputPath': os.path.join(CWD, 'ex8_output')}\n",
     "os.makedirs(enc_optionsSLPK['outputPath'], exist_ok=True)"
    ]
   },
@@ -316,7 +325,7 @@
    "outputs": [],
    "source": [
     "map3 = gis.map(mode='3D')\n",
-    "map3.basemap = 'dark-gray' \n",
+    "map3.basemap = 'arcgis-dark-gray' \n",
     "map3.add_layer(published_item)\n",
     "map3.add_layer(existing)\n",
     "map3.zoom_to_layer(item=filtered_parks_set)\n",
diff --git a/ex9_model_vis_web.py b/ex9_model_vis_web.py
index 0fb8010..3bdfaa1 100644
--- a/ex9_model_vis_web.py
+++ b/ex9_model_vis_web.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2012-2022 Esri R&D Center Zurich
+# Copyright (c) 2012-2023 Esri R&D Center Zurich
 
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.


Test patch:
diff --git a/test_venv.py b/test_venv.py
new file mode 100644
index 0000000..b65fd28
--- /dev/null
+++ b/test_venv.py
@@ -0,0 +1,73 @@
+# Copyright (c) 2012-2023 Esri R&D Center Zurich
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#   https://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# A copy of the license is available in the repository's LICENSE file.
+
+import os
+import sys
+import tempfile
+import platform
+import venv
+import argparse
+
+
+def get_python_cmd(venv_dir):
+    bin_segment = "Scripts" if platform.system() == "Windows" else "bin"
+    py_cmd = os.path.join(venv_dir, bin_segment, 'python')
+    return py_cmd
+
+
+def setup_venv_from_requirements(venv_dir, env_py):
+    venv.create(venv_dir, with_pip=True)
+
+    py_cmd = get_python_cmd(venv_dir)
+    os.system(f"{py_cmd} -m pip install --upgrade pip")
+    os.system(f"{py_cmd} -m pip install --upgrade wheel")
+
+    env_os = "windows" if platform.system() == "Windows" else "linux"
+    os.system(f"{py_cmd} -m pip install -r envs/{env_os}/requirements-{env_py}.txt")
+
+
+def add_custom_pyprt_wheel(venv_dir, pyprt_wheel_path):
+    py_cmd = get_python_cmd(venv_dir)
+    os.system(f"{py_cmd} -m pip install --trusted-host zrh-code.esri.com --upgrade {pyprt_wheel_path}")
+
+
+def run_examples(venv_dir):
+    py_cmd = get_python_cmd(venv_dir)
+    os.system(f"{py_cmd} ex1_python_encoder.py")
+    os.system(f"{py_cmd} ex2_obj_initial_shape.py")
+    os.system(f"{py_cmd} ex3_format_exporter.py")
+    os.system(f"{py_cmd} ex4_multi_generations.py")
+
+
+def main():
+    env_py = f"py{sys.version_info[0]}{sys.version_info[1]}"
+
+    parser = argparse.ArgumentParser(description='PyPRT venv tests for examples')
+    parser.add_argument(
+        '--pyprt_wheel', help='custom pyprt build to use in venv test', type=str, required=False)
+    parser.add_argument('--venv_path', help='use specific venv location and keep it around', type=str, required=False)
+    args = parser.parse_args()
+
+    venv_dir = tempfile.TemporaryDirectory(
+        prefix=f'pyprt-venv-test-py{env_py}') if not args.venv_path else args.venv_path
+
+    setup_venv_from_requirements(venv_dir, env_py)
+    if args.pyprt_wheel:
+        add_custom_pyprt_wheel(venv_dir, args.pyprt_wheel)
+    run_examples(venv_dir)
+
+
+if __name__ == '__main__':
+    main()