cgse 2024.7.0__py3-none-any.whl → 2025.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +27 -0
- bump.py +85 -0
- cgse-2025.0.2.dist-info/METADATA +38 -0
- cgse-2025.0.2.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
- cgse-2024.7.0.dist-info/COPYING +0 -674
- cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
- cgse-2024.7.0.dist-info/METADATA +0 -144
- cgse-2024.7.0.dist-info/RECORD +0 -660
- cgse-2024.7.0.dist-info/entry_points.txt +0 -75
- cgse-2024.7.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5238
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -627
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -903
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -233
- egse/alert/alertman_ui.py +0 -600
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -122
- egse/alert/gsm/beaglebone_protocol.py +0 -46
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -132
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1058
- egse/confman/confman.yaml +0 -70
- egse/confman/confman_cs.py +0 -240
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -632
- egse/coordinates/__init__.py +0 -534
- egse/coordinates/avoidance.py +0 -100
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -122
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -194
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1240
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -514
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2698
- egse/dpu/ccd_ui.py +0 -514
- egse/dpu/dpu.py +0 -783
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -671
- egse/dpu/fitsgen.py +0 -2096
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/__init__.py +0 -33
- egse/dsi/_libesl.py +0 -232
- egse/dsi/constants.py +0 -296
- egse/dsi/esl.py +0 -630
- egse/dsi/rmap.py +0 -444
- egse/dsi/rmapci.py +0 -39
- egse/dsi/spw.py +0 -335
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -318
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -26
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -37
- egse/fdir/fdir_manager_controller.py +0 -136
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -15
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -30
- egse/fdir/fdir_remote_controller.py +0 -30
- egse/fdir/fdir_remote_cs.py +0 -94
- egse/fdir/fdir_remote_interface.py +0 -9
- egse/fdir/fdir_remote_popup.py +0 -26
- egse/fee/__init__.py +0 -106
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/feesim.py +0 -914
- egse/fee/n_fee_hk.py +0 -768
- egse/fee/nfee.py +0 -188
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -49
- egse/filterwheel/eksma/fw8smc4.py +0 -657
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -115
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -710
- egse/fov/fov_ui.py +0 -859
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -138
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1285
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -587
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/styles.qss +0 -48
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -137
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -195
- egse/hexapod/symetrie/puna_protocol.py +0 -134
- egse/hexapod/symetrie/puna_ui.py +0 -433
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -414
- egse/hexapod/symetrie/zonda_protocol.py +0 -123
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -791
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -179
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -102
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -165
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -834
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -605
- egse/proxy.py +0 -531
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -693
- egse/resource.py +0 -333
- egse/rmap.py +0 -406
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -247
- egse/services.yaml +0 -68
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1181
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -71
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1401
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -245
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -188
- egse/stages/arun/smd3.py +0 -110
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -470
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -920
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -113
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1067
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -79
- egse/storage/storage_cs.py +0 -231
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -417
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1611
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -879
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -180
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
- egse/tempcontrol/beaglebone/beaglebone.py +0 -341
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
- egse/tempcontrol/digalox/digalox.py +0 -115
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -108
- egse/tempcontrol/digalox/digalox_protocol.py +0 -56
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -723
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -867
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -116
- egse/tempcontrol/srs/ptc10_protocol.py +0 -39
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -91
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -124
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -100
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -81
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -313
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -701
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
- egse/vacuum/pfeiffer/tc400.py +0 -87
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -136
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
- egse/vacuum/pfeiffer/tpg261.py +0 -80
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -52
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/check_tcs_calib_coef.py +0 -90
- scripts/correct_ccd_cold_temperature_cal.py +0 -157
- scripts/create_hdf5_report.py +0 -293
- scripts/csl_model.py +0 -420
- scripts/csl_restore_setup.py +0 -229
- scripts/export-grafana-dashboards.py +0 -49
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -10
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
- scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
- scripts/ias/correct_trp_swap_achel.py +0 -199
- scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
- scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/remove_lines_between_matches.py +0 -188
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
- scripts/sron/correct_trp_swap_brigand.py +0 -204
- scripts/sron/gimbal_conversions.py +0 -75
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/coordinates/point.py
DELETED
|
@@ -1,707 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
The point module provides two classes, a `Point` class which simply represents a point
|
|
3
|
-
in the 3D space, and a `Points` class which is a collection of Point objects.
|
|
4
|
-
|
|
5
|
-
A Point is defined with respect to a given reference frame and is given a name.
|
|
6
|
-
|
|
7
|
-
Point objects defined in the same reference frame can be combined with the
|
|
8
|
-
natural `+`, `-` , `+=` and `-=` operations.
|
|
9
|
-
|
|
10
|
-
In order to work with 4x4 transformation matrices, the 3D [x,y,z] coordinates are
|
|
11
|
-
automatically converted to a [x,y,z,1] coordinates array attribute.
|
|
12
|
-
|
|
13
|
-
@author: Pierre Royer
|
|
14
|
-
"""
|
|
15
|
-
import logging
|
|
16
|
-
import random
|
|
17
|
-
import string
|
|
18
|
-
|
|
19
|
-
import numpy as np
|
|
20
|
-
|
|
21
|
-
import egse.coordinates.transform3d_addon as t3add
|
|
22
|
-
|
|
23
|
-
LOGGER = logging.getLogger(__name__)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class Point:
|
|
27
|
-
"""
|
|
28
|
-
A Point object represents a point in 3D space and is defined with respect to
|
|
29
|
-
a given reference frame.
|
|
30
|
-
|
|
31
|
-
.. note::
|
|
32
|
-
There is no check that the randomly generated name is unique, so two Point
|
|
33
|
-
objects can be different but have the same name.
|
|
34
|
-
|
|
35
|
-
"""
|
|
36
|
-
debug = 0
|
|
37
|
-
|
|
38
|
-
def __init__(self, coordinates, ref, name=None):
|
|
39
|
-
"""
|
|
40
|
-
This initializes a Point object in a given reference frame.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
coordinates (numpy.ndarray, list): 1x3 or 1x4 matrix defining this system in "ref" system
|
|
44
|
-
(1x3 being x,y,z + an additional 1 for the affine operations)
|
|
45
|
-
|
|
46
|
-
ref (ReferenceFrame): the reference system in which this Point object will be defined,
|
|
47
|
-
if not given or None the master reference frame will be used
|
|
48
|
-
|
|
49
|
-
"""
|
|
50
|
-
|
|
51
|
-
# Makes sure of format [x,y,z,1] and sets coordinates
|
|
52
|
-
self.setCoordinates(coordinates)
|
|
53
|
-
|
|
54
|
-
# set the reference frame of reference
|
|
55
|
-
if ref is None:
|
|
56
|
-
raise ValueError("A Point shall be defined with a reference frame, ref can not be None.")
|
|
57
|
-
else:
|
|
58
|
-
self.ref = ref
|
|
59
|
-
|
|
60
|
-
self.setName(name)
|
|
61
|
-
|
|
62
|
-
self.definition = [self.coordinates[:-1], self.ref, self.name]
|
|
63
|
-
|
|
64
|
-
def __repr__(self):
|
|
65
|
-
return f"{self.coordinates[:-1]} (ref {self.ref.name})"
|
|
66
|
-
|
|
67
|
-
def __str__(self):
|
|
68
|
-
return f"{self.coordinates[:-1]} (ref {self.ref.name}), name {self.name}"
|
|
69
|
-
|
|
70
|
-
def __eq__(self, other):
|
|
71
|
-
"""
|
|
72
|
-
Re-implements the == operator which by default checks if id(self) == id(other).
|
|
73
|
-
|
|
74
|
-
Two Point objects are equal when:
|
|
75
|
-
|
|
76
|
-
* their coordinates are equal
|
|
77
|
-
* the reference system in which they are defined is equal
|
|
78
|
-
* the name must not be equal
|
|
79
|
-
"""
|
|
80
|
-
if self is other:
|
|
81
|
-
return True
|
|
82
|
-
|
|
83
|
-
if isinstance(other, Point):
|
|
84
|
-
if not np.array_equal(self.coordinates, other.coordinates):
|
|
85
|
-
return False
|
|
86
|
-
if self.ref != other.ref:
|
|
87
|
-
return False
|
|
88
|
-
return True
|
|
89
|
-
return NotImplemented
|
|
90
|
-
|
|
91
|
-
def __hash__(self):
|
|
92
|
-
return id(self.definition) // 16
|
|
93
|
-
|
|
94
|
-
def isSame(self, other):
|
|
95
|
-
"""
|
|
96
|
-
This checks if a Point is the same as another Point in a different reference frame.
|
|
97
|
-
|
|
98
|
-
Two Point objects are the same when their position, i.e. coordinates, are equal
|
|
99
|
-
after they have been expressed in the same reference frame.
|
|
100
|
-
|
|
101
|
-
:param other: a Point object that you want to check
|
|
102
|
-
:type other: Point
|
|
103
|
-
|
|
104
|
-
:returns: True when the two Point objects are the same, False otherwise
|
|
105
|
-
|
|
106
|
-
:raises TypeError: when other is not a compatible type, NotImplemented will returned
|
|
107
|
-
which will result in a ```TypeError: unsupported operand type(s) for +:```.
|
|
108
|
-
"""
|
|
109
|
-
|
|
110
|
-
if isinstance(other, Point):
|
|
111
|
-
if self == other:
|
|
112
|
-
return True
|
|
113
|
-
else:
|
|
114
|
-
if np.array_equal(self.coordinates, other.expressIn(self.ref)):
|
|
115
|
-
return True
|
|
116
|
-
return False
|
|
117
|
-
return NotImplemented
|
|
118
|
-
|
|
119
|
-
@staticmethod
|
|
120
|
-
def __coords__(coordinates):
|
|
121
|
-
"""
|
|
122
|
-
Formats 1x3 or 1x4 input lists or np.arrays into 1x4 np.array coordinates
|
|
123
|
-
Static --> can be called 'from outside', without passing a Point object
|
|
124
|
-
"""
|
|
125
|
-
if isinstance(coordinates, Point):
|
|
126
|
-
return coordinates.coordinates
|
|
127
|
-
elif isinstance(coordinates, (np.ndarray, list)):
|
|
128
|
-
coordinates = list(coordinates)
|
|
129
|
-
if len(coordinates) == 3:
|
|
130
|
-
coordinates.append(1)
|
|
131
|
-
return coordinates
|
|
132
|
-
else:
|
|
133
|
-
raise ValueError("input must be a list, numpy.ndarray or Point")
|
|
134
|
-
|
|
135
|
-
def setName(self, name=None):
|
|
136
|
-
"""
|
|
137
|
-
Set or change the name of a Point object.
|
|
138
|
-
|
|
139
|
-
:param str name: the new name for the Point, if None, a random name will be generated.
|
|
140
|
-
|
|
141
|
-
.. todo:: Should we care about the possibility the the generation of random names does not
|
|
142
|
-
necessarily create a unique name for the Point?
|
|
143
|
-
"""
|
|
144
|
-
if name is None:
|
|
145
|
-
self.name = 'p'+''.join(random.choices(string.ascii_lowercase, k=3))
|
|
146
|
-
else:
|
|
147
|
-
self.name = name
|
|
148
|
-
|
|
149
|
-
def setCoordinates(self, coordinates):
|
|
150
|
-
"""
|
|
151
|
-
Set the coordinates of this Point object.
|
|
152
|
-
"""
|
|
153
|
-
coordinates = Point.__coords__(coordinates)
|
|
154
|
-
self.coordinates = np.array(coordinates)
|
|
155
|
-
|
|
156
|
-
self.x = self.coordinates[0]
|
|
157
|
-
self.y = self.coordinates[1]
|
|
158
|
-
self.z = self.coordinates[2]
|
|
159
|
-
|
|
160
|
-
def getCoordinates(self, ref=None):
|
|
161
|
-
"""
|
|
162
|
-
Returns the coordinates of this Points object.
|
|
163
|
-
|
|
164
|
-
If no reference frame is given, the coordinates of the Point will just be returned,
|
|
165
|
-
other wise this method behaves the same as the ``expressIn(ref)`` method.
|
|
166
|
-
|
|
167
|
-
:param ref: the Reference Frame in which the Point shall be defined
|
|
168
|
-
:type ref: ReferenceFrame
|
|
169
|
-
"""
|
|
170
|
-
if ref is None:
|
|
171
|
-
return self.coordinates
|
|
172
|
-
else:
|
|
173
|
-
return self.expressIn(ref)
|
|
174
|
-
|
|
175
|
-
def distanceTo(self, target):
|
|
176
|
-
"""
|
|
177
|
-
Returns the distance of this Point object to the target. Target can be another Point,
|
|
178
|
-
a ReferenceFrame object or a Numpy dnarray or list with coordinates.
|
|
179
|
-
"""
|
|
180
|
-
from egse.coordinates.referenceFrame import ReferenceFrame
|
|
181
|
-
|
|
182
|
-
if isinstance(target, Point):
|
|
183
|
-
targetCoords = target.expressIn(self.ref)[:3]
|
|
184
|
-
elif isinstance(target, ReferenceFrame):
|
|
185
|
-
return np.linalg.norm(self.expressIn(target)[:3])
|
|
186
|
-
elif isinstance(target, (np.ndarray, list)):
|
|
187
|
-
if len(target) > 3:
|
|
188
|
-
target = target[:3]
|
|
189
|
-
targetCoords = target
|
|
190
|
-
else:
|
|
191
|
-
raise ValueError("input must be a list, numpy.ndarray, Point or ReferenceFrame")
|
|
192
|
-
|
|
193
|
-
LOGGER.info(f"self={self.coordinates[:-1]}, target={targetCoords}")
|
|
194
|
-
|
|
195
|
-
return np.linalg.norm(self.coordinates[:3]-targetCoords)
|
|
196
|
-
|
|
197
|
-
def inPlaneDistanceTo(self,target,plane='xy'):
|
|
198
|
-
"""
|
|
199
|
-
Returns the distance of this Point object to the target, considering 2 coordinates only!
|
|
200
|
-
|
|
201
|
-
target: can be another Point, a ReferenceFrame object or a Numpy dnarray or list with coordinates.
|
|
202
|
-
|
|
203
|
-
plane : must be in ['xy', 'xz', 'yz']
|
|
204
|
-
|
|
205
|
-
NB: The xy, yz or xz plane used to project the points coordinates before
|
|
206
|
-
computing the distances is taken from the coordinate system of "self"
|
|
207
|
-
==> pointA.inPlaneDistanceTo(pointB) != pointB.inPlaneDistanceTo(pointA)
|
|
208
|
-
The first projects on the xy plane of pointA.ref, the second on the xy plane of pointB.ref
|
|
209
|
-
"""
|
|
210
|
-
from egse.coordinates.referenceFrame import ReferenceFrame
|
|
211
|
-
|
|
212
|
-
if isinstance(target, Point):
|
|
213
|
-
targetCoords = target.expressIn(self.ref)
|
|
214
|
-
elif isinstance(target, ReferenceFrame):
|
|
215
|
-
targetCoords = target.getOrigin().expressIn(self)
|
|
216
|
-
elif isinstance(target, (np.ndarray, list)):
|
|
217
|
-
targetCoords = target
|
|
218
|
-
else:
|
|
219
|
-
raise ValueError("input must be a list, numpy.ndarray, Point or ReferenceFrame")
|
|
220
|
-
|
|
221
|
-
LOGGER.info(f"self={self.coordinates[:-1]}, target={targetCoords}")
|
|
222
|
-
|
|
223
|
-
planeSelect = {'xy':[0,1], 'xz':[0,2], 'yz':[1,2]}
|
|
224
|
-
|
|
225
|
-
LOGGER.info(f"self.coordinates[planeSelect[plane]] {self.coordinates[planeSelect[plane]]}")
|
|
226
|
-
LOGGER.info(f"targetCoords[planeSelect[plane]] {targetCoords[planeSelect[plane]]}")
|
|
227
|
-
LOGGER.info(f"Difference {self.coordinates[planeSelect[plane]]-targetCoords[planeSelect[plane]]}")
|
|
228
|
-
|
|
229
|
-
return np.linalg.norm(self.coordinates[planeSelect[plane]]-targetCoords[planeSelect[plane]])
|
|
230
|
-
|
|
231
|
-
def distanceToPlane(self,plane="xy",ref=None):
|
|
232
|
-
"""
|
|
233
|
-
distanceToPlane(self,plane="xy",ref=None)
|
|
234
|
-
|
|
235
|
-
The target plane is defined by one of it coordinate planes: ["xy", "yz", "xz"]
|
|
236
|
-
|
|
237
|
-
:param ref: reference frame
|
|
238
|
-
:type ref: ReferenceFrame
|
|
239
|
-
|
|
240
|
-
:param plane: in ["xy", "xz", "yz"]
|
|
241
|
-
:type plane: str
|
|
242
|
-
|
|
243
|
-
:returns: the distance from self to plane
|
|
244
|
-
"""
|
|
245
|
-
if (ref is None) or (self.ref == ref):
|
|
246
|
-
coordinates = self.coordinates[:-1]
|
|
247
|
-
elif self.ref != ref:
|
|
248
|
-
coordinates = self.expressIn(ref)
|
|
249
|
-
|
|
250
|
-
outOfPlaneIndex = {'xy':2,'xz':1,'yz':0}
|
|
251
|
-
|
|
252
|
-
return coordinates[outOfPlaneIndex[plane]]
|
|
253
|
-
|
|
254
|
-
def __sub__(self,apoint):
|
|
255
|
-
"""
|
|
256
|
-
Takes care for
|
|
257
|
-
newPoint = self + point
|
|
258
|
-
"""
|
|
259
|
-
if isinstance(apoint, Point):
|
|
260
|
-
|
|
261
|
-
try:
|
|
262
|
-
if apoint.ref != self.ref:
|
|
263
|
-
raise ValueError
|
|
264
|
-
except ValueError:
|
|
265
|
-
print("WARNING: The points have different reference frames, returning NotImplemented")
|
|
266
|
-
return NotImplemented
|
|
267
|
-
newCoordinates = self.coordinates - apoint.coordinates
|
|
268
|
-
|
|
269
|
-
elif isinstance(apoint, (np.ndarray, list)):
|
|
270
|
-
|
|
271
|
-
newCoordinates = self.coordinates - Point.__coords__(apoint)
|
|
272
|
-
|
|
273
|
-
# For the affine transforms, the 4th digit must be set to 1 (it has been modified above)
|
|
274
|
-
newCoordinates[-1] = 1
|
|
275
|
-
|
|
276
|
-
return Point(coordinates=newCoordinates,ref=self.ref)
|
|
277
|
-
|
|
278
|
-
def __isub__(self,apoint):
|
|
279
|
-
"""
|
|
280
|
-
Takes care for
|
|
281
|
-
self += coordinates (modifies self in place)
|
|
282
|
-
"""
|
|
283
|
-
if isinstance(apoint, Point):
|
|
284
|
-
|
|
285
|
-
try:
|
|
286
|
-
if apoint.ref != self.ref:
|
|
287
|
-
raise ValueError
|
|
288
|
-
except ValueError:
|
|
289
|
-
print("WARNING: The points have different reference frames, returning NotImplemented")
|
|
290
|
-
return NotImplemented
|
|
291
|
-
newCoordinates = self.coordinates - apoint.coordinates
|
|
292
|
-
|
|
293
|
-
elif isinstance(apoint, (np.ndarray, list)):
|
|
294
|
-
|
|
295
|
-
newCoordinates = self.coordinates - Point.__coords__(apoint)
|
|
296
|
-
|
|
297
|
-
# For the affine transforms, the 4th digit must be set to 1 (it has been modified above)
|
|
298
|
-
newCoordinates[-1] = 1
|
|
299
|
-
|
|
300
|
-
self.coordinates = newCoordinates
|
|
301
|
-
|
|
302
|
-
return self
|
|
303
|
-
|
|
304
|
-
def __add__(self,apoint):
|
|
305
|
-
"""
|
|
306
|
-
Takes care for
|
|
307
|
-
newPoint = self + point
|
|
308
|
-
"""
|
|
309
|
-
if isinstance(apoint, Point):
|
|
310
|
-
|
|
311
|
-
try:
|
|
312
|
-
if apoint.ref != self.ref:
|
|
313
|
-
print(f"DEBUG: {apoint} = {apoint.expressIn(self.ref)}")
|
|
314
|
-
raise ValueError
|
|
315
|
-
except ValueError:
|
|
316
|
-
print("WARNING: The points have different reference frames, returning NotImplemented")
|
|
317
|
-
return NotImplemented
|
|
318
|
-
newCoordinates = self.coordinates + apoint.coordinates
|
|
319
|
-
|
|
320
|
-
elif isinstance(apoint, (np.ndarray, list)):
|
|
321
|
-
|
|
322
|
-
newCoordinates = self.coordinates + Point.__coords__(apoint)
|
|
323
|
-
|
|
324
|
-
else:
|
|
325
|
-
return NotImplemented
|
|
326
|
-
|
|
327
|
-
# For the affine transforms, the 4th digit must be set to 1 (it has been modified above)
|
|
328
|
-
newCoordinates[-1] = 1
|
|
329
|
-
|
|
330
|
-
return Point(coordinates=newCoordinates,ref=self.ref)
|
|
331
|
-
|
|
332
|
-
def __iadd__(self,apoint):
|
|
333
|
-
"""
|
|
334
|
-
Takes care for
|
|
335
|
-
self += coordinates (modifies self in place)
|
|
336
|
-
"""
|
|
337
|
-
if isinstance(apoint, Point):
|
|
338
|
-
|
|
339
|
-
try:
|
|
340
|
-
if apoint.ref != self.ref:
|
|
341
|
-
raise ValueError
|
|
342
|
-
except ValueError:
|
|
343
|
-
print("WARNING: The points have different reference frames, returning NotImplemented")
|
|
344
|
-
return NotImplemented
|
|
345
|
-
newCoordinates = self.coordinates + apoint.coordinates
|
|
346
|
-
|
|
347
|
-
elif isinstance(apoint, (np.ndarray, list)):
|
|
348
|
-
|
|
349
|
-
newCoordinates = self.coordinates + Point.__coords__(apoint)
|
|
350
|
-
|
|
351
|
-
# For the affine transforms, the 4th digit must be set to 1 (it has been modified above)
|
|
352
|
-
newCoordinates[-1] = 1
|
|
353
|
-
|
|
354
|
-
self.coordinates = newCoordinates
|
|
355
|
-
|
|
356
|
-
return self
|
|
357
|
-
|
|
358
|
-
def expressIn(self,targetFrame):
|
|
359
|
-
"""
|
|
360
|
-
expressIn(self,targetFrame)
|
|
361
|
-
"""
|
|
362
|
-
if targetFrame == self.ref:
|
|
363
|
-
"""
|
|
364
|
-
targetFrame == self.ref
|
|
365
|
-
We're after the definition of self
|
|
366
|
-
"""
|
|
367
|
-
result = self.coordinates
|
|
368
|
-
else:
|
|
369
|
-
"""
|
|
370
|
-
We're after the coordinates of self, i.e. the definition of self in targetFrame
|
|
371
|
-
|
|
372
|
-
We know the coordinates in self.ref
|
|
373
|
-
#We need to apply the transformation from targetFrame to self.ref
|
|
374
|
-
self.ref --> self (self.transformation)
|
|
375
|
-
"""
|
|
376
|
-
#transform = targetFrame.getTransformationFrom(self.ref)
|
|
377
|
-
transform = self.ref.getPassiveTransformationTo(targetFrame)
|
|
378
|
-
if self.debug: print("transform \n{0}".format(transform))
|
|
379
|
-
result = np.dot(transform,self.coordinates)
|
|
380
|
-
return result
|
|
381
|
-
|
|
382
|
-
def changeRef(self,targetFrame):
|
|
383
|
-
"""
|
|
384
|
-
We redefine self as attached to another reference frame
|
|
385
|
-
. calculate self's coordinates in the new reference frame
|
|
386
|
-
. update the definition
|
|
387
|
-
"""
|
|
388
|
-
newCoordinates = self.expressIn(targetFrame)
|
|
389
|
-
self.setCoordinates(newCoordinates)
|
|
390
|
-
self.ref = targetFrame
|
|
391
|
-
return
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
class Points():
|
|
397
|
-
"""
|
|
398
|
-
A Points object is a collection of Point objects.
|
|
399
|
-
|
|
400
|
-
Points can be constructed from either a numpy.ndarray of shape 3 x n or 4 x n, or
|
|
401
|
-
a list of Point objects. The coordinates of the Point objects are transferred to
|
|
402
|
-
the desired ReferenceFrame and concatenated in the list order.
|
|
403
|
-
|
|
404
|
-
When automatically generated a Points object name consists in a capital 'P' followed by
|
|
405
|
-
three lower case letters. A Point can be extracted from a Points object by its
|
|
406
|
-
position in the coordinates array (see below).
|
|
407
|
-
|
|
408
|
-
"""
|
|
409
|
-
debug=0
|
|
410
|
-
def __init__(self, coordinates, ref,name=None):
|
|
411
|
-
"""
|
|
412
|
-
Points.__init__(self, coordinates, ref, name=None)
|
|
413
|
-
|
|
414
|
-
Constructor
|
|
415
|
-
|
|
416
|
-
coordinates : must be of one of the following type:
|
|
417
|
-
* numpy.ndarray:
|
|
418
|
-
4xn matrix defining this system in "ref" system
|
|
419
|
-
(3 being x,y,z + an additional 1 for the affine operations)
|
|
420
|
-
* list of Point objects:
|
|
421
|
-
the coordinates of the Point objects are extracted in the order of the list
|
|
422
|
-
and concatenated in a numpy.ndarray
|
|
423
|
-
|
|
424
|
-
ref : reference system in which self is defined
|
|
425
|
-
|
|
426
|
-
Both parameters are mandatory.
|
|
427
|
-
"""
|
|
428
|
-
|
|
429
|
-
# TODO: accept a list made of Point and Points rather than strictly Point
|
|
430
|
-
|
|
431
|
-
if isinstance(coordinates, list):
|
|
432
|
-
coordinateList = []
|
|
433
|
-
for apoint in coordinates:
|
|
434
|
-
if not isinstance(apoint, Point):
|
|
435
|
-
raise ValueError("If the input is a list, all items in it must be Point(s) objects")
|
|
436
|
-
coordinateList.append(apoint.expressIn(ref))
|
|
437
|
-
self.setCoordinates(np.array(coordinateList).T)
|
|
438
|
-
elif isinstance(coordinates, np.ndarray):
|
|
439
|
-
self.setCoordinates(coordinates)
|
|
440
|
-
else:
|
|
441
|
-
raise ValueError("The input must be either a numpy.ndarray or a list of Point objects")
|
|
442
|
-
|
|
443
|
-
self.ref = ref
|
|
444
|
-
|
|
445
|
-
self.setName(name)
|
|
446
|
-
|
|
447
|
-
return
|
|
448
|
-
|
|
449
|
-
def __repr__(self):
|
|
450
|
-
return "{0} (ref {1})".format(self.coordinates[:-1], self.ref.name)
|
|
451
|
-
|
|
452
|
-
def __str__(self):
|
|
453
|
-
return "{1} (ref {2}), name {0}".format(self.name, self.coordinates[:-1], self.ref.name)
|
|
454
|
-
|
|
455
|
-
@staticmethod
|
|
456
|
-
def __coords__(coordinates):
|
|
457
|
-
"""
|
|
458
|
-
Formats 3xn or 4xn input lists or np.arrays into 4xn np.array coordinates
|
|
459
|
-
Static --> can be called 'from outside', without passing a Points object
|
|
460
|
-
"""
|
|
461
|
-
if isinstance(coordinates, Point):
|
|
462
|
-
return coordinates.coordinates
|
|
463
|
-
elif isinstance(coordinates, np.ndarray):
|
|
464
|
-
|
|
465
|
-
if coordinates.shape[0] not in [3,4]:
|
|
466
|
-
raise ValueError("Input coordinates array must be 3 x n or 4 x n")
|
|
467
|
-
|
|
468
|
-
if coordinates.shape[0]==3:
|
|
469
|
-
newCoords = np.ones([4,coordinates.shape[1]])
|
|
470
|
-
newCoords[:3,:] = coordinates
|
|
471
|
-
coordinates = newCoords
|
|
472
|
-
return coordinates
|
|
473
|
-
else:
|
|
474
|
-
raise ValueError("input must be a list, numpy.ndarray or Point")
|
|
475
|
-
|
|
476
|
-
def setName(self,name=None):
|
|
477
|
-
if name is None:
|
|
478
|
-
self.name = 'P'+ ''.join(random.choices(string.ascii_lowercase, k=2))+\
|
|
479
|
-
''.join(random.choices(string.ascii_uppercase, k=1))
|
|
480
|
-
else:
|
|
481
|
-
self.name = name
|
|
482
|
-
|
|
483
|
-
def setCoordinates(self,coordinates):
|
|
484
|
-
#coordinates = list(coordinates)
|
|
485
|
-
#if len(coordinates)==3: coordinates.append(1)
|
|
486
|
-
coordinates = Points.__coords__(coordinates)
|
|
487
|
-
self.coordinates = coordinates
|
|
488
|
-
|
|
489
|
-
self.x = self.coordinates[0,:]
|
|
490
|
-
self.y = self.coordinates[1,:]
|
|
491
|
-
self.z = self.coordinates[2,:]
|
|
492
|
-
|
|
493
|
-
return
|
|
494
|
-
|
|
495
|
-
def getCoordinates(self,ref=None):
|
|
496
|
-
if ref is None:
|
|
497
|
-
return self.coordinates
|
|
498
|
-
else:
|
|
499
|
-
return self.expressIn(ref)
|
|
500
|
-
|
|
501
|
-
def expressIn(self,targetFrame):
|
|
502
|
-
"""
|
|
503
|
-
expressIn(self,targetFrame)
|
|
504
|
-
"""
|
|
505
|
-
if targetFrame == self.ref:
|
|
506
|
-
"""
|
|
507
|
-
targetFrame == self.ref
|
|
508
|
-
We're after the definition of self
|
|
509
|
-
"""
|
|
510
|
-
result = self.coordinates
|
|
511
|
-
else:
|
|
512
|
-
"""
|
|
513
|
-
We're after the coordinates of self, i.e. the definition of self in targetFrame
|
|
514
|
-
|
|
515
|
-
We know the coordinates in self.ref
|
|
516
|
-
#We need to apply the transformation from targetFrame to self.ref
|
|
517
|
-
self.ref --> self (self.transformation)
|
|
518
|
-
"""
|
|
519
|
-
#transform = targetFrame.getTransformationFrom(self.ref)
|
|
520
|
-
transform = self.ref.getPassiveTransformationTo(targetFrame)
|
|
521
|
-
if self.debug: print("transform \n{0}".format(transform))
|
|
522
|
-
result = np.dot(transform,self.coordinates)
|
|
523
|
-
return result
|
|
524
|
-
|
|
525
|
-
def changeRef(self,targetFrame):
|
|
526
|
-
"""
|
|
527
|
-
We redefine self as attached to another reference frame
|
|
528
|
-
. calculate self's coordinates in the new reference frame
|
|
529
|
-
. update the definition
|
|
530
|
-
"""
|
|
531
|
-
newCoordinates = self.expressIn(targetFrame)
|
|
532
|
-
self.setCoordinates(newCoordinates)
|
|
533
|
-
self.ref = targetFrame
|
|
534
|
-
return
|
|
535
|
-
|
|
536
|
-
def getPoint(self,index,name=None):
|
|
537
|
-
"""
|
|
538
|
-
Returns the point with coordinates self.coordinates[:,index], in reference frame pts.ref
|
|
539
|
-
"""
|
|
540
|
-
return Point(self.coordinates[:,index],ref=self.ref,name=name)
|
|
541
|
-
|
|
542
|
-
get = getPoint
|
|
543
|
-
|
|
544
|
-
def bestFittingPlane(self,fitPlane="xy", usesvd=False,verbose=True):
|
|
545
|
-
"""
|
|
546
|
-
bestFittingPlane(self,fitPlane="xy", usesvd=False,verbose=True)
|
|
547
|
-
|
|
548
|
-
fitPlane in ['xy,'yz','zx']
|
|
549
|
-
usesvd see transform3d_addon.affine_matrix_from_points.__doc__
|
|
550
|
-
|
|
551
|
-
OUTPUT
|
|
552
|
-
returns the reference Frame having as X-Y plane the plane best fitting all points in self
|
|
553
|
-
"""
|
|
554
|
-
# Import necessary due to a circular dependency between Point and ReferenceFrame
|
|
555
|
-
from egse.coordinates.referenceFrame import ReferenceFrame
|
|
556
|
-
|
|
557
|
-
debug=True
|
|
558
|
-
|
|
559
|
-
a,b,c = self.fitPlane(fitPlane=fitPlane,verbose=verbose)
|
|
560
|
-
#print (f"a {a}, b {b}, c {c}")
|
|
561
|
-
#print()
|
|
562
|
-
|
|
563
|
-
unitaxes = Points.fromPlaneParameters(a,b,c,ref=self.ref,plane=fitPlane)
|
|
564
|
-
#print(f"Unitaxes coordinates \n{np.round(unitaxes.coordinates,3)}")
|
|
565
|
-
#print()
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
# unitaxes contain 3 unit axes and an origin
|
|
569
|
-
# => the unit vectors do NOT belong to the target plane
|
|
570
|
-
# => they must be translated before
|
|
571
|
-
unitcoords = unitaxes.coordinates
|
|
572
|
-
for ax in range(3):
|
|
573
|
-
unitcoords[:3,ax] += unitcoords[:3,3]
|
|
574
|
-
|
|
575
|
-
newaxes = Points(unitcoords, ref=self.ref)
|
|
576
|
-
|
|
577
|
-
#print(f"newaxes {np.round(newaxes.coordinates,3)}")
|
|
578
|
-
|
|
579
|
-
selfaxes = Points(np.identity(4),ref=self.ref)
|
|
580
|
-
|
|
581
|
-
transform = t3add.affine_matrix_from_points(selfaxes.coordinates[:3,:], newaxes.coordinates[:3,:], shear=False, scale=False, usesvd=usesvd)
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
if debug:
|
|
585
|
-
transform2 = t3add.rigid_transform_3D(selfaxes.coordinates[:3,:], newaxes.coordinates[:3,:], verbose=verbose)
|
|
586
|
-
|
|
587
|
-
if verbose:
|
|
588
|
-
print()
|
|
589
|
-
print(f"Transform \n{np.round(transform,3)}")
|
|
590
|
-
if debug:
|
|
591
|
-
print()
|
|
592
|
-
print(f"Transform2 \n{np.round(transform2,3)}")
|
|
593
|
-
print()
|
|
594
|
-
print(f"Both methods consistent ? {np.allclose(transform, transform2)}")
|
|
595
|
-
|
|
596
|
-
return ReferenceFrame(transformation=transform, ref=self.ref)
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
def fitPlane(self,fitPlane="xy",verbose=True):
|
|
601
|
-
"""
|
|
602
|
-
fitPlane(self,fitPlane="xy",verbose=True)
|
|
603
|
-
|
|
604
|
-
:returns: the best fitting parameters a, b, c corresponding to the fitted plane
|
|
605
|
-
|
|
606
|
-
:param fitPlane: defines the expression of the fitted plane in ['xy','yz','zx']:
|
|
607
|
-
'xy' : z = ax + by + c
|
|
608
|
-
'yz' : x = ay + bz + c
|
|
609
|
-
'zx' : y = az + bx + c
|
|
610
|
-
|
|
611
|
-
:param verbose: default = True
|
|
612
|
-
"""
|
|
613
|
-
xyz = [self.x,self.y,self.z]
|
|
614
|
-
|
|
615
|
-
ndata = len(xyz[0])
|
|
616
|
-
|
|
617
|
-
# Account for cases
|
|
618
|
-
startingIndex={'xy':0,'yz':1,'zx':2}[fitPlane]
|
|
619
|
-
|
|
620
|
-
# System matrix
|
|
621
|
-
A = np.vstack([xyz[startingIndex],xyz[(startingIndex+1)%3], np.ones(ndata)]).T
|
|
622
|
-
|
|
623
|
-
# Solve linear equations
|
|
624
|
-
a, b, c = np.linalg.lstsq(A, xyz[(startingIndex+2)%3],rcond=None)[0]
|
|
625
|
-
|
|
626
|
-
# Print results on screen
|
|
627
|
-
if verbose:
|
|
628
|
-
hprint = {'xy':'z = ax + by + c','yz':'x = ay + bz + c','zx':'y = az + bx + c'}
|
|
629
|
-
print(f'{hprint[fitPlane]} : \n a = {a:7.3e} \n b = {b:7.3e} \n c = {c:7.3e}')
|
|
630
|
-
|
|
631
|
-
return a,b,c
|
|
632
|
-
|
|
633
|
-
@classmethod
|
|
634
|
-
def fromPlaneParameters(cls,a,b,c,ref,plane='xy',verbose=False):
|
|
635
|
-
"""fromPlaneParameters(cls,a,b,c,ref,plane='xy',verbose=False)
|
|
636
|
-
|
|
637
|
-
Returns a Points object describing the unit axes and the origin of the reference frame defined by
|
|
638
|
-
the input parameters.
|
|
639
|
-
|
|
640
|
-
:param plane: The plane definition depends on the "plane" parameter plane must be in ["xy","yz","zx"]
|
|
641
|
-
'xy' : z = ax + by + c (origin defined at x = y = 0)
|
|
642
|
-
'yz' : x = ay + bz + c --> NOT IMPLEMENTED
|
|
643
|
-
'zx' : y = az + bx + c --> NOT IMPLEMENTED
|
|
644
|
-
|
|
645
|
-
:returns: A Points with 4 Point objects corresponding to
|
|
646
|
-
- the 3 unit axes defining a coordinate system with this plane as "plane" plane
|
|
647
|
-
- the origin
|
|
648
|
-
in this order (origin last)
|
|
649
|
-
"""
|
|
650
|
-
if plane != 'xy':
|
|
651
|
-
print(f"WARNING: plane = {plane} NOT IMPLEMENTED")
|
|
652
|
-
# p0 : on the Z-axis
|
|
653
|
-
# x = y = 0
|
|
654
|
-
p0 = np.array([0,0,c])
|
|
655
|
-
|
|
656
|
-
# pxy : on the intersection between target plane and plane // to xy passing through z=c
|
|
657
|
-
if np.abs(b)>1.e-5:
|
|
658
|
-
# z = c, x = 1
|
|
659
|
-
pxy = np.array([1,-a/float(b),c])
|
|
660
|
-
else:
|
|
661
|
-
# z = c, y = 1
|
|
662
|
-
pxy = np.array([-b/float(a),1,c])
|
|
663
|
-
|
|
664
|
-
# pyz : intersection of target plane and Y-Z plane
|
|
665
|
-
# x = 0, y = 1
|
|
666
|
-
pyz = np.array([0,1,b+c])
|
|
667
|
-
|
|
668
|
-
"""
|
|
669
|
-
# pzx : intersection of target plane and Z-X plane
|
|
670
|
-
if np.abs(a)>1.e-3:
|
|
671
|
-
# y = 0, z = 1
|
|
672
|
-
pzx = np.array([(1-c)/float(a),0,1])
|
|
673
|
-
else:
|
|
674
|
-
# y = 0, x = 1
|
|
675
|
-
pzx = np.array([1,0,a+c])
|
|
676
|
-
"""
|
|
677
|
-
#
|
|
678
|
-
# xunit = unit vector from [0,0,0] along the intersection between target plane and plane // to xy passing through z=c
|
|
679
|
-
xunit = (pxy - p0)/np.linalg.norm(pxy-p0)
|
|
680
|
-
# ytemp = unit vector from [0,0,0] along the intersection between target plane and Y-Z plane
|
|
681
|
-
# ytemp is in the target plane, but not perpendicular to xunit
|
|
682
|
-
# its norm doesn't matter
|
|
683
|
-
ytemp = (pyz - p0)#/np.linalg.norm(pyz-p0)
|
|
684
|
-
|
|
685
|
-
# xunit and ytemp are both in the plane
|
|
686
|
-
# => zunit is perpendicular to both
|
|
687
|
-
zunit = np.cross(xunit,ytemp)
|
|
688
|
-
zunit /= np.linalg.norm(zunit)
|
|
689
|
-
|
|
690
|
-
# yunit completes the right handed reference frame
|
|
691
|
-
# The renormalisation shouldn't be necessary...
|
|
692
|
-
yunit = np.cross(zunit,xunit)
|
|
693
|
-
yunit /= np.linalg.norm(yunit)
|
|
694
|
-
|
|
695
|
-
xu = Point(xunit,ref=ref)
|
|
696
|
-
yu = Point(yunit,ref=ref)
|
|
697
|
-
zu = Point(zunit,ref=ref)
|
|
698
|
-
origin = Point(p0,ref=ref)
|
|
699
|
-
|
|
700
|
-
if verbose:
|
|
701
|
-
print(f'xunit {xunit}')
|
|
702
|
-
print(f'yunit {yunit}')
|
|
703
|
-
print(f'zunit {zunit}')
|
|
704
|
-
print(f'origin {p0}')
|
|
705
|
-
print()
|
|
706
|
-
|
|
707
|
-
return cls([xu,yu,zu,origin],ref=ref)
|