From d938189b67fcaa85a55b08a038be8d03de63c974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Hyv=C3=B6nen?= <petrus.hyvonen@sscspace.com> Date: Mon, 1 Apr 2024 12:57:42 +0200 Subject: [PATCH] WIP pyhelpers --- orekit_jpype/__init__.py | 3 +- orekit_jpype/pyhelpers.py | 82 ++++++++++++++++++++++++++++++++++----- 2 files changed, 75 insertions(+), 10 deletions(-) diff --git a/orekit_jpype/__init__.py b/orekit_jpype/__init__.py index 53d9440..5d096e8 100644 --- a/orekit_jpype/__init__.py +++ b/orekit_jpype/__init__.py @@ -1,5 +1,6 @@ from .orekit_jpype import initVM -from jpype import JArray, JDouble +from jpype import JArray, JDouble, JByte, JShort, JInt, JLong, JFloat, JChar, JBoolean, JString, JObject, JClass +from jpype import JException # JArray_double = JArray(JDouble) \ No newline at end of file diff --git a/orekit_jpype/pyhelpers.py b/orekit_jpype/pyhelpers.py index ca65e97..a4e8920 100644 --- a/orekit_jpype/pyhelpers.py +++ b/orekit_jpype/pyhelpers.py @@ -22,6 +22,8 @@ from datetime import datetime import math import os from typing import List, Union + +# JVM needs to have been started before importing these, run initVM prior to the imports! from java.io import File from org.orekit.data import DataProvidersManager, ZipJarCrawler, DirectoryCrawler, DataContext, LazyLoadedDataContext from org.orekit.time import TimeScalesFactory, AbsoluteDate @@ -57,7 +59,13 @@ def download_orekit_data_curdir(filename='orekit-data.zip'): print('Downloading file from:', url) shutil.copyfileobj(response, out_file) - +def clear_data_context(dpm: DataProvidersManager): + """Clear the data context for the provided data Provider manager""" + dpm.clearProviders() + dpm.clearLoadedDataNames() + dpm.resetFiltersToDefault() + dpm.clearLoadedDataNames() + def clear_factory_maps(factory_class): for field in factory_class.getDeclaredFields(): @@ -72,6 +80,37 @@ def clear_factories(): clear_factory_maps(FramesFactory.class_) +def add_orekitdata_library(dpm: DataProvidersManager): + try: + import orekitdata + datafile = File(orekitdata.__path__[0]) + if not datafile.exists(): + print(f"""Unable to find orekitdata module library folder""") + raise ImportError + + except ImportError: + print(f"""Failed to load orekitdata library. + Install with `pip install git+https://gitlab.orekit.org/orekit/orekit-data.git` + Will try to load Orekit data using the folder or filename {filename}""") + raise ImportError + + crawler = DirectoryCrawler(datafile) + dpm.addProvider(crawler) + +def add_orekit_file_or_folder(dp: DataProvidersManager, filename: str): + """Add a file or folder to the data providers manager""" + if os.path.isdir(filename): + crawler = DirectoryCrawler(File(filename)) + elif os.path.isfile(filename): + crawler = ZipJarCrawler(File(filename)) + else: + print('filename ', filename, ' is neither a file nor a folder') + raise FileNotFoundError + + dp.addProvider(crawler) + + + def setup_orekit_curdir(filename: str='orekit-data.zip', from_pip_library: bool=False): @@ -97,7 +136,7 @@ s """ - DM = DataContext.getDefault().getDataProvidersManager() + DM: DataProvidersManager = DataContext.getDefault().getDataProvidersManager() data_load_from_library_sucessful = False if from_pip_library: @@ -142,16 +181,29 @@ s crawler = ZipJarCrawler(datafile) else: print('filename ', filename, ' is neither a file nor a folder') - DM.clearProviders() - DM.clearLoadedDataNames() - DM.resetFiltersToDefault() + + clear_data_context(DM) DM.addProvider(crawler) -def setup_orekit_data(filenames: Union[str, List[str], None] = None, from_pip_library: bool = True) -> None: +def setup_orekit_data(filenames: Union[str, List[str], None] = None, from_pip_library: bool = False) -> None: """ - Sets up the orekit data from a file, folder or list of files/folders. - Can also load the data from the `orekitdata` python library. (default) + A convenience function that: + - Clear old orekit data + - Sets up the orekit data from file, folder(s) and list of files/folders + - Can also load the data from the `orekitdata` python library. + + If several arguments are given, they are all loaded. + + This function can load the orekit data from a common orekit-data.zip format that is downloaded with the + conviencience function `download_orekit_data_curdir()` + + The filenames can be a string or a list of strings. If a list is given, all files/folders are loaded. + + In order to install the orekitdata python package, use the following command: + `pip install git+https://gitlab.orekit.org/orekit/orekit-data.git` + + The JVM needs to be initiated prior to calling this function with the .initVM() method. Args: filenames (Union[str, List[str]]): Name of zip or folder with orekit data. Default filename is 'orekit-data.zip' @@ -159,8 +211,20 @@ def setup_orekit_data(filenames: Union[str, List[str], None] = None, from_pip_li """ - setup_orekit_curdir(filename=filenames, from_pip_library=from_pip_library) + dpm = DataContext.getDefault().getDataProvidersManager() + + clear_data_context(dpm) + + if filenames is not None: + if isinstance(filenames, str): + filenames = [filenames] + for filename in filenames: + add_orekit_file_or_folder(dpm, filename) + if from_pip_library: + add_orekitdata_library(dpm) + + def absolutedate_to_datetime(orekit_absolutedate: AbsoluteDate) -> datetime: -- GitLab