Skip to content

Instantly share code, notes, and snippets.

@gwbischof
Last active June 22, 2023 17:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gwbischof/32c2de9e8e5521752d442cef3365d9b4 to your computer and use it in GitHub Desktop.
Save gwbischof/32c2de9e8e5521752d442cef3365d9b4 to your computer and use it in GitHub Desktop.
import requests
import json
from ophyd import Component as Cpt
from ophyd import Device, Signal
from ophyd.sim import NullStatus
class UnrealClient():
"""
Client for Unreal Engine Remote Control API.
Parameters
----------
server_address: string, optional
The address of the Unreal Remote Control http server.
Defaults to the Unreal Remote Control Plugin's default host and port.
"""
def __init__(self, server_address='http://localhost:30010'):
self.server_address = server_address
def get_presets(self):
result = requests.get(f'{self.server_address}/remote/presets')
result_dict = json.loads(result.content)
return [preset['Name'] for preset in result_dict['Presets']]
def get_properties(self, preset_name):
result = requests.get(f'{self.server_address}/remote/preset/{preset_name}')
properties = json.loads(result.content)['Preset']['Groups'][0]['ExposedProperties']
return [prop['DisplayName'] for prop in properties]
def get_functions(self):
result = requests.get(f'{self.server_address}/remote/assets')
return json.loads(result.content)
def get_all_properties(self):
presets = self.get_presets()
exposed_properties = {preset_name: self.get_properties(preset_name) for preset_name in presets}
return exposed_properties
def get_value(self, preset_name, property_name):
result = requests.get(f'{self.server_address}/remote/preset/{preset_name}/property/{property_name}')
value = json.loads(result.content)['PropertyValues'][0]['PropertyValue']
return value
def set_value(self, preset_name, property_name, value):
HEADERS = {'Content-type': 'application/json'}
result = requests.put(f'{self.server_address}/remote/preset/{preset_name}/property/{property_name}',
headers=HEADERS,
data=json.dumps({"PropertyValue": value,
"GenerateTransaction": 1}))
return result
class UnrealSignal(Signal):
"""
Ophyd Signal to interface with Unreal Engine.
Parameters
----------
preset_name: string
The name of the Unreal Remote Control Preset.
A Preset is like a group of Properties.
name: string
The name of the Unreal property
server_address: string, optional
The address of the Unreal Remote Control http server
Defaults to the Unreal Remote Control Plugin's default host and port.
"""
def __init__(self, *args, preset_name, server_address='http://localhost:30010', **kwargs):
super().__init__(*args, **kwargs)
self._client = UnrealClient(server_address)
self._preset_name = preset_name
def set(self, value, *arg, **kwargs):
self._readback = value
self._client.set_value(self._preset_name, self.name, value)
return NullStatus()
def get(self, **kwargs):
return self._client.get_value(self._preset_name, self.name)
def put(self, *args, **kwargs):
self.set(*args, **kwargs).wait()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment