diff --git a/V3Schema b/V3Schema index 38f63b2..34f9cdc 160000 --- a/V3Schema +++ b/V3Schema @@ -1 +1 @@ -Subproject commit 38f63b25d57ef9263393a5039e04612774e34233 +Subproject commit 34f9cdcaae462bf05f1b65c29f171b6f212e65c2 diff --git a/three/MF/V3/Descriptors/ProtocolInfo.py b/three/MF/V3/Descriptors/ProtocolInfo.py new file mode 100644 index 0000000..3a8e76f --- /dev/null +++ b/three/MF/V3/Descriptors/ProtocolInfo.py @@ -0,0 +1,23 @@ +from typing import List + + +class ProtocolInfo: + """ + Desktop-processing protocol capability descriptor, returned by the + `GetProtocolInfo` task. Lets a desktop engine detect what a connected + scanner supports and degrade gracefully against older firmware. + """ + def __init__(self, version: int, capabilities: List[str] = None): + # Desktop-processing protocol version. + self.version = version + """ + Capability tokens supported by this server. + + Known capabilities: + - "scanCaptureStreaming": the server can stream raw scan captures to a + client for desktop processing (see the `SetProcessingDevices` task + and the `ScanCapture` descriptor). + """ + self.capabilities = capabilities + + diff --git a/three/MF/V3/Descriptors/ScanCapture.py b/three/MF/V3/Descriptors/ScanCapture.py new file mode 100644 index 0000000..a06144f --- /dev/null +++ b/three/MF/V3/Descriptors/ScanCapture.py @@ -0,0 +1,36 @@ +class ScanCapture: + """ + Raw scan capture image descriptor streamed to clients that process scans + themselves (`SetProcessingDevices` client processing). Each stereo capture + is sent as two buffers, one per camera, described by this descriptor. + + The buffer payload is the raw image data: `rows` rows of `step` bytes, + pixel format given by the OpenCV type code in `type`. + """ + def __init__(self, rows: int, cols: int, type: int, step: int, camera: int, focus: int, index: int, orientation: int, frequency: int, phase: int, angle: float, texture: bool): + # Image rows. + self.rows = rows + # Image columns. + self.cols = cols + # OpenCV Mat type code (e.g. CV_8UC1). + self.type = type + # Row step in bytes. + self.step = step + # Camera index (0 or 1). + self.camera = camera + # Camera focus. + self.focus = focus + # Capture (turntable angle) index. + self.index = index + # Pattern orientation, or -1 for texture captures. + self.orientation = orientation + # Pattern frequency, or -1 for texture captures. + self.frequency = frequency + # Pattern phase, or -1 for texture captures. + self.phase = phase + # Turntable angle in radians. + self.angle = angle + # True if this is a texture capture. + self.texture = texture + + diff --git a/three/MF/V3/Descriptors/ScannerList.py b/three/MF/V3/Descriptors/ScannerList.py new file mode 100644 index 0000000..88455c2 --- /dev/null +++ b/three/MF/V3/Descriptors/ScannerList.py @@ -0,0 +1,30 @@ +from typing import List + + +class ScannerList: + """ + Scanners discovered on the local network, returned by the + `DiscoverScanners` task. + """ + class Scanner: + + """ + A discovered scanner. + """ + def __init__(self, name: str, host: str, ip: str, port: int, version: str): + # The scanner's advertised name (e.g. "THREE"). + self.name = name + # The scanner's mDNS host name (e.g. "matterandform.local"). + self.host = host + # The scanner's IPv4 address. + self.ip = ip + # The scanner's server port. + self.port = port + # The scanner's advertised server version. Empty if not advertised. + self.version = version + + def __init__(self, scanners: List['Scanner'] = None): + # The discovered scanners. + self.scanners = scanners + + diff --git a/three/MF/V3/Descriptors/ScannerStatus.py b/three/MF/V3/Descriptors/ScannerStatus.py new file mode 100644 index 0000000..3560650 --- /dev/null +++ b/three/MF/V3/Descriptors/ScannerStatus.py @@ -0,0 +1,14 @@ +class ScannerStatus: + """ + The desktop engine's scanner connection status. + + Returned by the `GetScannerStatus` task and pushed to every client as a + `{"ScannerStatus": {...}}` message whenever the connection state changes. + """ + def __init__(self, connected: bool, host: str): + # True if the engine is connected to a scanner. + self.connected = connected + # The connected scanner's host name or IP address. Empty when not connected. + self.host = host + + diff --git a/three/MF/V3/Descriptors/StorageInfo.py b/three/MF/V3/Descriptors/StorageInfo.py new file mode 100644 index 0000000..049c97f --- /dev/null +++ b/three/MF/V3/Descriptors/StorageInfo.py @@ -0,0 +1,23 @@ +class StorageInfo: + """ + Storage space of the desktop engine's local workspace and, when a scanner + is connected, of the scanner. Returned by the `StorageInfo` task. + """ + class Space: + + """ + Storage space of one side. + """ + def __init__(self, available: int, capacity: int): + # Available bytes. + self.available = available + # Total capacity in bytes. + self.capacity = capacity + + def __init__(self, local: 'Space', scanner: 'Space' = None): + # The engine's local workspace storage. + self.local = local + # The connected scanner's storage. Absent when no scanner is connected. + self.scanner = scanner + + diff --git a/three/MF/V3/Descriptors/__init__.py b/three/MF/V3/Descriptors/__init__.py index b145d8d..4de642c 100644 --- a/three/MF/V3/Descriptors/__init__.py +++ b/three/MF/V3/Descriptors/__init__.py @@ -7,9 +7,14 @@ from MF.V3.Descriptors.Merge import * from MF.V3.Descriptors.Project import * from MF.V3.Descriptors.ProjectActions import * +from MF.V3.Descriptors.ProtocolInfo import * from MF.V3.Descriptors.RemoveVertices import * +from MF.V3.Descriptors.ScanCapture import * from MF.V3.Descriptors.ScanData import * +from MF.V3.Descriptors.ScannerList import * +from MF.V3.Descriptors.ScannerStatus import * from MF.V3.Descriptors.Software import * +from MF.V3.Descriptors.StorageInfo import * from MF.V3.Descriptors.System import * from MF.V3.Descriptors.Transform import * from MF.V3.Descriptors.VideoFrame import * diff --git a/three/MF/V3/Tasks/ConnectScanner.py b/three/MF/V3/Tasks/ConnectScanner.py new file mode 100644 index 0000000..e600533 --- /dev/null +++ b/three/MF/V3/Tasks/ConnectScanner.py @@ -0,0 +1,61 @@ +from MF.V3.Task import TaskState as MF_V3_Task_TaskState + + +class ConnectScanner: + """* + Connect the desktop engine to a scanner (desktop engine only). + + The engine negotiates capabilities with `GetProtocolInfo`, enables client + processing, and downloads the scanner's calibration into its local + workspace. A `ScannerStatus` message is pushed to every client when the + connection state changes. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"ConnectScanner", "Input":"matterandform.local" } + } + ``` + + > Response example: + + ```json + { + "Task":{ "Index":1, "Type":"ConnectScanner", "Output":true, "State":"Completed" } + } + ``` + """ + class Request: + + """ + Client request for the `ConnectScanner` task. + """ + def __init__(self, Index: int, Type: str, Input: str): + # A unique identifier generated by the client. + self.Index = Index + # "ConnectScanner" + self.Type = Type + # The scanner host name or IPv4 address. + self.Input = Input + + class Response: + + """ + Server response for the `ConnectScanner` task. + """ + def __init__(self, Index: int, Type: str, Output: bool = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "ConnectScanner" + self.Type = Type + # True if the connection was established. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/DisconnectScanner.py b/three/MF/V3/Tasks/DisconnectScanner.py new file mode 100644 index 0000000..3610da8 --- /dev/null +++ b/three/MF/V3/Tasks/DisconnectScanner.py @@ -0,0 +1,54 @@ +from MF.V3.Task import TaskState as MF_V3_Task_TaskState + + +class DisconnectScanner: + """* + Disconnect the desktop engine from its scanner (desktop engine only). + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"DisconnectScanner" } + } + ``` + + > Response example: + + ```json + { + "Task":{ "Index":1, "Type":"DisconnectScanner", "Output":true, "State":"Completed" } + } + ``` + """ + class Request: + + """ + Client request for the `DisconnectScanner` task. + """ + def __init__(self, Index: int, Type: str): + # A unique identifier generated by the client. + self.Index = Index + # "DisconnectScanner" + self.Type = Type + + class Response: + + """ + Server response for the `DisconnectScanner` task. + """ + def __init__(self, Index: int, Type: str, Output: bool = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "DisconnectScanner" + self.Type = Type + # Always true. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/DiscoverScanners.py b/three/MF/V3/Tasks/DiscoverScanners.py new file mode 100644 index 0000000..65c8a29 --- /dev/null +++ b/three/MF/V3/Tasks/DiscoverScanners.py @@ -0,0 +1,65 @@ +from MF.V3.Descriptors.ScannerList import ScannerList +from MF.V3.Task import TaskState as MF_V3_Task_TaskState + + +class DiscoverScanners: + """* + Discover scanners on the local network (desktop engine only). + + The engine browses mDNS for advertised scanners and additionally resolves + the default scanner host name, so scanners running older firmware that does + not advertise a service record are still found. The search runs for a few + seconds before the result is returned; run the task again to refresh. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"DiscoverScanners" } + } + ``` + + > Response example: + + ```json + { + "Task":{ + "Index":1, + "Type":"DiscoverScanners", + "Output":{ "scanners":[{ "name":"THREE", "host":"matterandform.local", "ip":"192.168.50.115", "port":8081 }] }, + "State":"Completed" + } + } + ``` + """ + class Request: + + """ + Client request for the `DiscoverScanners` task. + """ + def __init__(self, Index: int, Type: str): + # A unique identifier generated by the client. + self.Index = Index + # "DiscoverScanners" + self.Type = Type + + class Response: + + """ + Server response for the `DiscoverScanners` task. + """ + def __init__(self, Index: int, Type: str, Output: ScannerList = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "DiscoverScanners" + self.Type = Type + # The discovered scanners. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/DownloadScannerProject.py b/three/MF/V3/Tasks/DownloadScannerProject.py new file mode 100644 index 0000000..003889f --- /dev/null +++ b/three/MF/V3/Tasks/DownloadScannerProject.py @@ -0,0 +1,59 @@ +from MF.V3.Task import TaskState as MF_V3_Task_TaskState + + +class DownloadScannerProject: + """* + Download a project archive from the connected scanner (desktop engine + only). + + The archive is sent to the client as a task buffer whose descriptor is the + suggested file name. The counterpart of `DownloadProject`, which archives a + local project. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"DownloadScannerProject", "Input":2 } + } + ``` + + > Response example: + + ```json + { + "Task":{ "Index":1, "Type":"DownloadScannerProject", "State":"Completed" } + } + ``` + """ + class Request: + + """ + Client request for the `DownloadScannerProject` task. + """ + def __init__(self, Index: int, Type: str, Input: int): + # A unique identifier generated by the client. + self.Index = Index + # "DownloadScannerProject" + self.Type = Type + # The scanner project index to download. + self.Input = Input + + class Response: + + """ + Server response for the `DownloadScannerProject` task. + """ + def __init__(self, Index: int, Type: str, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "DownloadScannerProject" + self.Type = Type + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/GetProtocolInfo.py b/three/MF/V3/Tasks/GetProtocolInfo.py new file mode 100644 index 0000000..c14329a --- /dev/null +++ b/three/MF/V3/Tasks/GetProtocolInfo.py @@ -0,0 +1,63 @@ +from MF.V3.Descriptors.ProtocolInfo import ProtocolInfo +from MF.V3.Task import TaskState as MF_V3_Task_TaskState + + +class GetProtocolInfo: + """* + Get the desktop-processing protocol version and capabilities. + + Older firmware does not implement this task; clients treat a failure as a + server without desktop-processing capabilities. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"GetProtocolInfo" } + } + ``` + + > Response example: + + ```json + { + "Task":{ + "Index":1, + "Type":"GetProtocolInfo", + "Output":{ "version":1, "capabilities":["scanCaptureStreaming"] }, + "State":"Completed" + } + } + ``` + """ + class Request: + + """ + Client request for the `GetProtocolInfo` task. + """ + def __init__(self, Index: int, Type: str): + # A unique identifier generated by the client. + self.Index = Index + # "GetProtocolInfo" + self.Type = Type + + class Response: + + """ + Server response for the `GetProtocolInfo` task. + """ + def __init__(self, Index: int, Type: str, Output: ProtocolInfo = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "GetProtocolInfo" + self.Type = Type + # The protocol capability descriptor. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/GetScannerStatus.py b/three/MF/V3/Tasks/GetScannerStatus.py new file mode 100644 index 0000000..44f42ae --- /dev/null +++ b/three/MF/V3/Tasks/GetScannerStatus.py @@ -0,0 +1,60 @@ +from MF.V3.Descriptors.ScannerStatus import ScannerStatus +from MF.V3.Task import TaskState as MF_V3_Task_TaskState + + +class GetScannerStatus: + """* + Get the desktop engine's scanner connection status (desktop engine only). + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"GetScannerStatus" } + } + ``` + + > Response example: + + ```json + { + "Task":{ + "Index":1, + "Type":"GetScannerStatus", + "Output":{ "connected":true, "host":"192.168.50.115" }, + "State":"Completed" + } + } + ``` + """ + class Request: + + """ + Client request for the `GetScannerStatus` task. + """ + def __init__(self, Index: int, Type: str): + # A unique identifier generated by the client. + self.Index = Index + # "GetScannerStatus" + self.Type = Type + + class Response: + + """ + Server response for the `GetScannerStatus` task. + """ + def __init__(self, Index: int, Type: str, Output: ScannerStatus = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "GetScannerStatus" + self.Type = Type + # The scanner connection status. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/ListScannerProjects.py b/three/MF/V3/Tasks/ListScannerProjects.py new file mode 100644 index 0000000..7d702fa --- /dev/null +++ b/three/MF/V3/Tasks/ListScannerProjects.py @@ -0,0 +1,63 @@ +from MF.V3.Descriptors.Project import Project +from MF.V3.Task import TaskState as MF_V3_Task_TaskState +from typing import List + + +class ListScannerProjects: + """* + List the projects on the connected scanner (desktop engine only). + + The counterpart of `ListProjects`, which lists the engine's local projects. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"ListScannerProjects" } + } + ``` + + > Response example: + + ```json + { + "Task":{ + "Index":1, + "Type":"ListScannerProjects", + "Output":[{ "index":1, "name":"MyProject", "size":90010153, "modified":[2026,7,13,11,42,28] }], + "State":"Completed" + } + } + ``` + """ + class Request: + + """ + Client request for the `ListScannerProjects` task. + """ + def __init__(self, Index: int, Type: str): + # A unique identifier generated by the client. + self.Index = Index + # "ListScannerProjects" + self.Type = Type + + class Response: + + """ + Server response for the `ListScannerProjects` task. + """ + def __init__(self, Index: int, Type: str, Output: List[Project.Brief] = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "ListScannerProjects" + self.Type = Type + # The scanner's project list. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/PullProject.py b/three/MF/V3/Tasks/PullProject.py new file mode 100644 index 0000000..192cfad --- /dev/null +++ b/three/MF/V3/Tasks/PullProject.py @@ -0,0 +1,68 @@ +from MF.V3.Descriptors.Project import Project +from MF.V3.Task import TaskState as MF_V3_Task_TaskState +from typing import List + + +class PullProject: + """* + Copy a project from the connected scanner into the local workspace + (desktop engine only). + + The engine downloads the scanner project's archive and imports it as a new + local copy (it always receives a new project index). Progress covers the + archive, transfer and extraction phases as one range. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"PullProject", "Input":2 } + } + ``` + + > Response example: + + ```json + { + "Task":{ + "Index":1, + "Type":"PullProject", + "Output":[{ "index":4, "name":"MyProject", "size":90010153, "modified":[2026,7,13,11,42,28] }], + "State":"Completed" + } + } + ``` + """ + class Request: + + """ + Client request for the `PullProject` task. + """ + def __init__(self, Index: int, Type: str, Input: int): + # A unique identifier generated by the client. + self.Index = Index + # "PullProject" + self.Type = Type + # The scanner project index to copy to the local workspace. + self.Input = Input + + class Response: + + """ + Server response for the `PullProject` task. + """ + def __init__(self, Index: int, Type: str, Output: List[Project.Brief] = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "PullProject" + self.Type = Type + # The engine's updated local project list. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/PushProject.py b/three/MF/V3/Tasks/PushProject.py new file mode 100644 index 0000000..a4d6f45 --- /dev/null +++ b/three/MF/V3/Tasks/PushProject.py @@ -0,0 +1,67 @@ +from MF.V3.Descriptors.Project import Project +from MF.V3.Task import TaskState as MF_V3_Task_TaskState +from typing import List + + +class PushProject: + """* + Copy a local project to the connected scanner (desktop engine only). + + The engine archives the local project, uploads it to the scanner, and the + scanner imports it as a new copy (it always receives a new project index). + Progress covers the archive, transfer and extraction phases as one range. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"PushProject", "Input":3 } + } + ``` + + > Response example: + + ```json + { + "Task":{ + "Index":1, + "Type":"PushProject", + "Output":[{ "index":1, "name":"MyProject", "size":90010153, "modified":[2026,7,13,11,42,28] }], + "State":"Completed" + } + } + ``` + """ + class Request: + + """ + Client request for the `PushProject` task. + """ + def __init__(self, Index: int, Type: str, Input: int): + # A unique identifier generated by the client. + self.Index = Index + # "PushProject" + self.Type = Type + # The local project index to copy to the scanner. + self.Input = Input + + class Response: + + """ + Server response for the `PushProject` task. + """ + def __init__(self, Index: int, Type: str, Output: List[Project.Brief] = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "PushProject" + self.Type = Type + # The scanner's updated project list. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/RemoveScannerProjects.py b/three/MF/V3/Tasks/RemoveScannerProjects.py new file mode 100644 index 0000000..e2f36b7 --- /dev/null +++ b/three/MF/V3/Tasks/RemoveScannerProjects.py @@ -0,0 +1,65 @@ +from MF.V3.Descriptors.Project import Project +from MF.V3.Task import TaskState as MF_V3_Task_TaskState +from typing import List + + +class RemoveScannerProjects: + """* + Remove projects on the connected scanner (desktop engine only). + + The counterpart of `RemoveProjects`, which removes local projects. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"RemoveScannerProjects", "Input":[2, 3] } + } + ``` + + > Response example: + + ```json + { + "Task":{ + "Index":1, + "Type":"RemoveScannerProjects", + "Output":[{ "index":1, "name":"MyProject", "size":90010153, "modified":[2026,7,13,11,42,28] }], + "State":"Completed" + } + } + ``` + """ + class Request: + + """ + Client request for the `RemoveScannerProjects` task. + """ + def __init__(self, Index: int, Type: str, Input: List[int] = None): + # A unique identifier generated by the client. + self.Index = Index + # "RemoveScannerProjects" + self.Type = Type + # The scanner project indices to remove. + self.Input = Input + + class Response: + + """ + Server response for the `RemoveScannerProjects` task. + """ + def __init__(self, Index: int, Type: str, Output: List[Project.Brief] = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "RemoveScannerProjects" + self.Type = Type + # The scanner's updated project list. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/SetProcessingDevices.py b/three/MF/V3/Tasks/SetProcessingDevices.py new file mode 100644 index 0000000..cb19473 --- /dev/null +++ b/three/MF/V3/Tasks/SetProcessingDevices.py @@ -0,0 +1,60 @@ +from MF.V3.Task import TaskState as MF_V3_Task_TaskState +from typing import List + + +class SetProcessingDevices: + """* + Select which side processes scan captures for this connection. + + The input is a pair of booleans `[server, client]`. With client processing + enabled the server streams raw scan captures (see the `ScanCapture` + descriptor) to this connection during `NewScan` instead of processing them + on-device. The setting is per-connection: other clients are unaffected. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"SetProcessingDevices", "Input":[false, true] } + } + ``` + + > Response example: + + ```json + { + "Task":{ "Index":1, "Type":"SetProcessingDevices", "State":"Completed" } + } + ``` + """ + class Request: + + """ + Client request for the `SetProcessingDevices` task. + """ + def __init__(self, Index: int, Type: str, Input: List[bool] = None): + # A unique identifier generated by the client. + self.Index = Index + # "SetProcessingDevices" + self.Type = Type + # Processing device flags: [server, client]. + self.Input = Input + + class Response: + + """ + Server response for the `SetProcessingDevices` task. + """ + def __init__(self, Index: int, Type: str, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "SetProcessingDevices" + self.Type = Type + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/StorageInfo.py b/three/MF/V3/Tasks/StorageInfo.py new file mode 100644 index 0000000..3af73fe --- /dev/null +++ b/three/MF/V3/Tasks/StorageInfo.py @@ -0,0 +1,65 @@ +from MF.V3.Descriptors.StorageInfo import StorageInfo +from MF.V3.Task import TaskState as MF_V3_Task_TaskState + + +class StorageInfo: + """* + Get the local and scanner storage space (desktop engine only). + + The scanner space is absent when no scanner is connected. + + > Request example: + + ```json + { + "Task":{ "Index":1, "Type":"StorageInfo" } + } + ``` + + > Response example: + + ```json + { + "Task":{ + "Index":1, + "Type":"StorageInfo", + "Output":{ + "local":{ "available":349709045760, "capacity":750199750656 }, + "scanner":{ "available":19096510464, "capacity":30482370560 } + }, + "State":"Completed" + } + } + ``` + """ + class Request: + + """ + Client request for the `StorageInfo` task. + """ + def __init__(self, Index: int, Type: str): + # A unique identifier generated by the client. + self.Index = Index + # "StorageInfo" + self.Type = Type + + class Response: + + """ + Server response for the `StorageInfo` task. + """ + def __init__(self, Index: int, Type: str, Output: StorageInfo = None, State: MF_V3_Task_TaskState = None, Error: str = None): + # The unique identifier generated by the client. + self.Index = Index + # "StorageInfo" + self.Type = Type + # The local and scanner storage space. + self.Output = Output + # The current state of the task. + self.State = State + # A string describing the error if the task has failed. + self.Error = Error + + def __init__(self): + pass + diff --git a/three/MF/V3/Tasks/__init__.py b/three/MF/V3/Tasks/__init__.py index 9a77b6f..e121048 100644 --- a/three/MF/V3/Tasks/__init__.py +++ b/three/MF/V3/Tasks/__init__.py @@ -9,11 +9,15 @@ from MF.V3.Tasks.CaptureImage import * from MF.V3.Tasks.ClearSettings import * from MF.V3.Tasks.CloseProject import * +from MF.V3.Tasks.ConnectScanner import * from MF.V3.Tasks.ConnectWifi import * from MF.V3.Tasks.CopyGroups import * from MF.V3.Tasks.DepthMap import * from MF.V3.Tasks.DetectCalibrationCard import * +from MF.V3.Tasks.DisconnectScanner import * +from MF.V3.Tasks.DiscoverScanners import * from MF.V3.Tasks.DownloadProject import * +from MF.V3.Tasks.DownloadScannerProject import * from MF.V3.Tasks.Export import * from MF.V3.Tasks.ExportFactoryCalibrationLogs import * from MF.V3.Tasks.ExportHeatMap import * @@ -22,6 +26,8 @@ from MF.V3.Tasks.FactoryReset import * from MF.V3.Tasks.FlattenGroup import * from MF.V3.Tasks.ForgetWifi import * +from MF.V3.Tasks.GetProtocolInfo import * +from MF.V3.Tasks.GetScannerStatus import * from MF.V3.Tasks.HasCameras import * from MF.V3.Tasks.HasProjector import * from MF.V3.Tasks.HasTurntable import * @@ -31,6 +37,7 @@ from MF.V3.Tasks.ListGroups import * from MF.V3.Tasks.ListNetworkInterfaces import * from MF.V3.Tasks.ListProjects import * +from MF.V3.Tasks.ListScannerProjects import * from MF.V3.Tasks.ListScans import * from MF.V3.Tasks.ListSettings import * from MF.V3.Tasks.ListWifi import * @@ -42,15 +49,19 @@ from MF.V3.Tasks.NewScan import * from MF.V3.Tasks.OpenProject import * from MF.V3.Tasks.PopSettings import * +from MF.V3.Tasks.PullProject import * +from MF.V3.Tasks.PushProject import * from MF.V3.Tasks.PushSettings import * from MF.V3.Tasks.Reboot import * from MF.V3.Tasks.RemoveGroups import * from MF.V3.Tasks.RemoveProjects import * +from MF.V3.Tasks.RemoveScannerProjects import * from MF.V3.Tasks.RestoreFactoryCalibration import * from MF.V3.Tasks.RotateTurntable import * from MF.V3.Tasks.ScanData import * from MF.V3.Tasks.SetCameras import * from MF.V3.Tasks.SetGroup import * +from MF.V3.Tasks.SetProcessingDevices import * from MF.V3.Tasks.SetProject import * from MF.V3.Tasks.SetProjector import * from MF.V3.Tasks.Shutdown import * @@ -58,6 +69,7 @@ from MF.V3.Tasks.SplitGroup import * from MF.V3.Tasks.StartVideo import * from MF.V3.Tasks.StopVideo import * +from MF.V3.Tasks.StorageInfo import * from MF.V3.Tasks.SystemInfo import * from MF.V3.Tasks.TransformGroup import * from MF.V3.Tasks.TurntableCalibration import * diff --git a/three/MF/V3/Three.py b/three/MF/V3/Three.py index 8e42d7e..c80c29e 100644 --- a/three/MF/V3/Three.py +++ b/three/MF/V3/Three.py @@ -38,11 +38,15 @@ from MF.V3.Tasks.CaptureImage import CaptureImage as MF_V3_Tasks_CaptureImage from MF.V3.Tasks.ClearSettings import ClearSettings as MF_V3_Tasks_ClearSettings from MF.V3.Tasks.CloseProject import CloseProject as MF_V3_Tasks_CloseProject +from MF.V3.Tasks.ConnectScanner import ConnectScanner as MF_V3_Tasks_ConnectScanner from MF.V3.Tasks.ConnectWifi import ConnectWifi as MF_V3_Tasks_ConnectWifi from MF.V3.Tasks.CopyGroups import CopyGroups as MF_V3_Tasks_CopyGroups from MF.V3.Tasks.DepthMap import DepthMap as MF_V3_Tasks_DepthMap from MF.V3.Tasks.DetectCalibrationCard import DetectCalibrationCard as MF_V3_Tasks_DetectCalibrationCard +from MF.V3.Tasks.DisconnectScanner import DisconnectScanner as MF_V3_Tasks_DisconnectScanner +from MF.V3.Tasks.DiscoverScanners import DiscoverScanners as MF_V3_Tasks_DiscoverScanners from MF.V3.Tasks.DownloadProject import DownloadProject as MF_V3_Tasks_DownloadProject +from MF.V3.Tasks.DownloadScannerProject import DownloadScannerProject as MF_V3_Tasks_DownloadScannerProject from MF.V3.Tasks.Export import Export as MF_V3_Tasks_Export from MF.V3.Tasks.ExportFactoryCalibrationLogs import ExportFactoryCalibrationLogs as MF_V3_Tasks_ExportFactoryCalibrationLogs from MF.V3.Tasks.ExportHeatMap import ExportHeatMap as MF_V3_Tasks_ExportHeatMap @@ -51,6 +55,8 @@ from MF.V3.Tasks.FactoryReset import FactoryReset as MF_V3_Tasks_FactoryReset from MF.V3.Tasks.FlattenGroup import FlattenGroup as MF_V3_Tasks_FlattenGroup from MF.V3.Tasks.ForgetWifi import ForgetWifi as MF_V3_Tasks_ForgetWifi +from MF.V3.Tasks.GetProtocolInfo import GetProtocolInfo as MF_V3_Tasks_GetProtocolInfo +from MF.V3.Tasks.GetScannerStatus import GetScannerStatus as MF_V3_Tasks_GetScannerStatus from MF.V3.Tasks.HasCameras import HasCameras as MF_V3_Tasks_HasCameras from MF.V3.Tasks.HasProjector import HasProjector as MF_V3_Tasks_HasProjector from MF.V3.Tasks.HasTurntable import HasTurntable as MF_V3_Tasks_HasTurntable @@ -60,6 +66,7 @@ from MF.V3.Tasks.ListGroups import ListGroups as MF_V3_Tasks_ListGroups from MF.V3.Tasks.ListNetworkInterfaces import ListNetworkInterfaces as MF_V3_Tasks_ListNetworkInterfaces from MF.V3.Tasks.ListProjects import ListProjects as MF_V3_Tasks_ListProjects +from MF.V3.Tasks.ListScannerProjects import ListScannerProjects as MF_V3_Tasks_ListScannerProjects from MF.V3.Tasks.ListScans import ListScans as MF_V3_Tasks_ListScans from MF.V3.Tasks.ListSettings import ListSettings as MF_V3_Tasks_ListSettings from MF.V3.Tasks.ListWifi import ListWifi as MF_V3_Tasks_ListWifi @@ -71,15 +78,19 @@ from MF.V3.Tasks.NewScan import NewScan as MF_V3_Tasks_NewScan from MF.V3.Tasks.OpenProject import OpenProject as MF_V3_Tasks_OpenProject from MF.V3.Tasks.PopSettings import PopSettings as MF_V3_Tasks_PopSettings +from MF.V3.Tasks.PullProject import PullProject as MF_V3_Tasks_PullProject +from MF.V3.Tasks.PushProject import PushProject as MF_V3_Tasks_PushProject from MF.V3.Tasks.PushSettings import PushSettings as MF_V3_Tasks_PushSettings from MF.V3.Tasks.Reboot import Reboot as MF_V3_Tasks_Reboot from MF.V3.Tasks.RemoveGroups import RemoveGroups as MF_V3_Tasks_RemoveGroups from MF.V3.Tasks.RemoveProjects import RemoveProjects as MF_V3_Tasks_RemoveProjects +from MF.V3.Tasks.RemoveScannerProjects import RemoveScannerProjects as MF_V3_Tasks_RemoveScannerProjects from MF.V3.Tasks.RestoreFactoryCalibration import RestoreFactoryCalibration as MF_V3_Tasks_RestoreFactoryCalibration from MF.V3.Tasks.RotateTurntable import RotateTurntable as MF_V3_Tasks_RotateTurntable from MF.V3.Tasks.ScanData import ScanData as MF_V3_Tasks_ScanData from MF.V3.Tasks.SetCameras import SetCameras as MF_V3_Tasks_SetCameras from MF.V3.Tasks.SetGroup import SetGroup as MF_V3_Tasks_SetGroup +from MF.V3.Tasks.SetProcessingDevices import SetProcessingDevices as MF_V3_Tasks_SetProcessingDevices from MF.V3.Tasks.SetProject import SetProject as MF_V3_Tasks_SetProject from MF.V3.Tasks.SetProjector import SetProjector as MF_V3_Tasks_SetProjector from MF.V3.Tasks.Shutdown import Shutdown as MF_V3_Tasks_Shutdown @@ -87,6 +98,7 @@ from MF.V3.Tasks.SplitGroup import SplitGroup as MF_V3_Tasks_SplitGroup from MF.V3.Tasks.StartVideo import StartVideo as MF_V3_Tasks_StartVideo from MF.V3.Tasks.StopVideo import StopVideo as MF_V3_Tasks_StopVideo +from MF.V3.Tasks.StorageInfo import StorageInfo as MF_V3_Tasks_StorageInfo from MF.V3.Tasks.SystemInfo import SystemInfo as MF_V3_Tasks_SystemInfo from MF.V3.Tasks.TransformGroup import TransformGroup as MF_V3_Tasks_TransformGroup from MF.V3.Tasks.TurntableCalibration import TurntableCalibration as MF_V3_Tasks_TurntableCalibration @@ -1575,5 +1587,227 @@ def shutdown(self) -> Task: return task +def get_protocol_info(self) -> Task: + + """ + Get the desktop-processing protocol version and capabilities. + """ + get_protocol_info_request = MF_V3_Tasks_GetProtocolInfo.Request( + Index=0, + Type="GetProtocolInfo" + ) + get_protocol_info_response = MF_V3_Tasks_GetProtocolInfo.Response( + Index=0, + Type="GetProtocolInfo" + ) + task = Task(Index=0, Type="GetProtocolInfo", Input=get_protocol_info_request, Output=get_protocol_info_response) + self.SendTask(task) + return task + + +def set_processing_devices(self, Input: List[bool] = None) -> Task: + + """ + Select the scan processing devices (server and/or client processing). + """ + set_processing_devices_request = MF_V3_Tasks_SetProcessingDevices.Request( + Index=0, + Type="SetProcessingDevices", + Input=Input + ) + set_processing_devices_response = MF_V3_Tasks_SetProcessingDevices.Response( + Index=0, + Type="SetProcessingDevices" + ) + task = Task(Index=0, Type="SetProcessingDevices", Input=set_processing_devices_request, Output=set_processing_devices_response) + self.SendTask(task) + return task + + +def connect_scanner(self, Input: str) -> Task: + + """ + Connect the desktop engine to a scanner (desktop engine only). + """ + connect_scanner_request = MF_V3_Tasks_ConnectScanner.Request( + Index=0, + Type="ConnectScanner", + Input=Input + ) + connect_scanner_response = MF_V3_Tasks_ConnectScanner.Response( + Index=0, + Type="ConnectScanner" + ) + task = Task(Index=0, Type="ConnectScanner", Input=connect_scanner_request, Output=connect_scanner_response) + self.SendTask(task) + return task + + +def disconnect_scanner(self) -> Task: + + """ + Disconnect the desktop engine from its scanner (desktop engine only). + """ + disconnect_scanner_request = MF_V3_Tasks_DisconnectScanner.Request( + Index=0, + Type="DisconnectScanner" + ) + disconnect_scanner_response = MF_V3_Tasks_DisconnectScanner.Response( + Index=0, + Type="DisconnectScanner" + ) + task = Task(Index=0, Type="DisconnectScanner", Input=disconnect_scanner_request, Output=disconnect_scanner_response) + self.SendTask(task) + return task + + +def get_scanner_status(self) -> Task: + + """ + Get the desktop engine's scanner connection status (desktop engine only). + """ + get_scanner_status_request = MF_V3_Tasks_GetScannerStatus.Request( + Index=0, + Type="GetScannerStatus" + ) + get_scanner_status_response = MF_V3_Tasks_GetScannerStatus.Response( + Index=0, + Type="GetScannerStatus" + ) + task = Task(Index=0, Type="GetScannerStatus", Input=get_scanner_status_request, Output=get_scanner_status_response) + self.SendTask(task) + return task + + +def list_scanner_projects(self) -> Task: + + """ + List the projects on the connected scanner (desktop engine only). + """ + list_scanner_projects_request = MF_V3_Tasks_ListScannerProjects.Request( + Index=0, + Type="ListScannerProjects" + ) + list_scanner_projects_response = MF_V3_Tasks_ListScannerProjects.Response( + Index=0, + Type="ListScannerProjects" + ) + task = Task(Index=0, Type="ListScannerProjects", Input=list_scanner_projects_request, Output=list_scanner_projects_response) + self.SendTask(task) + return task + + +def push_project(self, Input: int) -> Task: + + """ + Copy a local project to the connected scanner (desktop engine only). + """ + push_project_request = MF_V3_Tasks_PushProject.Request( + Index=0, + Type="PushProject", + Input=Input + ) + push_project_response = MF_V3_Tasks_PushProject.Response( + Index=0, + Type="PushProject" + ) + task = Task(Index=0, Type="PushProject", Input=push_project_request, Output=push_project_response) + self.SendTask(task) + return task + + +def pull_project(self, Input: int) -> Task: + + """ + Copy a project from the connected scanner into the local workspace (desktop engine only). + """ + pull_project_request = MF_V3_Tasks_PullProject.Request( + Index=0, + Type="PullProject", + Input=Input + ) + pull_project_response = MF_V3_Tasks_PullProject.Response( + Index=0, + Type="PullProject" + ) + task = Task(Index=0, Type="PullProject", Input=pull_project_request, Output=pull_project_response) + self.SendTask(task) + return task + + +def remove_scanner_projects(self, Input: List[int] = None) -> Task: + + """ + Remove projects on the connected scanner (desktop engine only). + """ + remove_scanner_projects_request = MF_V3_Tasks_RemoveScannerProjects.Request( + Index=0, + Type="RemoveScannerProjects", + Input=Input + ) + remove_scanner_projects_response = MF_V3_Tasks_RemoveScannerProjects.Response( + Index=0, + Type="RemoveScannerProjects" + ) + task = Task(Index=0, Type="RemoveScannerProjects", Input=remove_scanner_projects_request, Output=remove_scanner_projects_response) + self.SendTask(task) + return task + + +def download_scanner_project(self, Input: int) -> Task: + + """ + Download a project archive from the connected scanner (desktop engine only). + """ + download_scanner_project_request = MF_V3_Tasks_DownloadScannerProject.Request( + Index=0, + Type="DownloadScannerProject", + Input=Input + ) + download_scanner_project_response = MF_V3_Tasks_DownloadScannerProject.Response( + Index=0, + Type="DownloadScannerProject" + ) + task = Task(Index=0, Type="DownloadScannerProject", Input=download_scanner_project_request, Output=download_scanner_project_response) + self.SendTask(task) + return task + + +def storage_info(self) -> Task: + + """ + Get the local and scanner storage space (desktop engine only). + """ + storage_info_request = MF_V3_Tasks_StorageInfo.Request( + Index=0, + Type="StorageInfo" + ) + storage_info_response = MF_V3_Tasks_StorageInfo.Response( + Index=0, + Type="StorageInfo" + ) + task = Task(Index=0, Type="StorageInfo", Input=storage_info_request, Output=storage_info_response) + self.SendTask(task) + return task + + +def discover_scanners(self) -> Task: + + """ + Discover scanners on the local network (desktop engine only). + """ + discover_scanners_request = MF_V3_Tasks_DiscoverScanners.Request( + Index=0, + Type="DiscoverScanners" + ) + discover_scanners_response = MF_V3_Tasks_DiscoverScanners.Response( + Index=0, + Type="DiscoverScanners" + ) + task = Task(Index=0, Type="DiscoverScanners", Input=discover_scanners_request, Output=discover_scanners_response) + self.SendTask(task) + return task + + diff --git a/three/scanner.py b/three/scanner.py index a29bfbf..493e5d0 100644 --- a/three/scanner.py +++ b/three/scanner.py @@ -425,6 +425,10 @@ def close_project(self) -> 'Task': """Close the current open project.""" return Three.close_project(self) + def connect_scanner(self, Input: 'str') -> 'Task': + """Connect the desktop engine to a scanner (desktop engine only).""" + return Three.connect_scanner(self, Input) + def connect_wifi(self, ssid: 'str', password: 'str') -> 'Task': """Connect to a wifi network.""" return Three.connect_wifi(self, ssid, password) @@ -441,10 +445,22 @@ def detect_calibration_card(self, Input: 'int') -> 'Task': """Detect the calibration card on one or both cameras.""" return Three.detect_calibration_card(self, Input) + def disconnect_scanner(self) -> 'Task': + """Disconnect the desktop engine from its scanner (desktop engine only).""" + return Three.disconnect_scanner(self) + + def discover_scanners(self) -> 'Task': + """Discover scanners on the local network (desktop engine only).""" + return Three.discover_scanners(self) + def download_project(self, Input: 'int') -> 'Task': """Download a project from the scanner.""" return Three.download_project(self, Input) + def download_scanner_project(self, Input: 'int') -> 'Task': + """Download a project archive from the connected scanner (desktop engine only).""" + return Three.download_scanner_project(self, Input) + def export(self, selection: 'ScanSelection' = None, texture: 'bool' = None, merge: 'bool' = None, format: 'Export.Format' = None, scale: 'float' = None, color: 'Export.Color' = None) -> 'Task': """Export a group of scans.""" return Three.export(self, selection, texture, merge, format, scale, color) @@ -477,6 +493,14 @@ def forget_wifi(self) -> 'Task': """Forget all wifi connections.""" return Three.forget_wifi(self) + def get_protocol_info(self) -> 'Task': + """Get the desktop-processing protocol version and capabilities.""" + return Three.get_protocol_info(self) + + def get_scanner_status(self) -> 'Task': + """Get the desktop engine's scanner connection status (desktop engine only).""" + return Three.get_scanner_status(self) + def has_cameras(self) -> 'Task': """Check if the scanner has working cameras.""" return Three.has_cameras(self) @@ -513,6 +537,10 @@ def list_projects(self) -> 'Task': """List all projects.""" return Three.list_projects(self) + def list_scanner_projects(self) -> 'Task': + """List the projects on the connected scanner (desktop engine only).""" + return Three.list_scanner_projects(self) + def list_scans(self) -> 'Task': """List the scans in the current open project.""" return Three.list_scans(self) @@ -557,6 +585,14 @@ def pop_settings(self, Input: 'bool' = None) -> 'Task': """Pop and restore scanner settings from the settings stack.""" return Three.pop_settings(self, Input) + def pull_project(self, Input: 'int') -> 'Task': + """Copy a project from the connected scanner into the local workspace (desktop engine only).""" + return Three.pull_project(self, Input) + + def push_project(self, Input: 'int') -> 'Task': + """Copy a local project to the connected scanner (desktop engine only).""" + return Three.push_project(self, Input) + def push_settings(self) -> 'Task': """Push the current scanner settings to the settings stack.""" return Three.push_settings(self) @@ -573,6 +609,10 @@ def remove_projects(self, Input: 'list[int]' = None) -> 'Task': """Remove selected projects.""" return Three.remove_projects(self, Input) + def remove_scanner_projects(self, Input: 'list[int]' = None) -> 'Task': + """Remove projects on the connected scanner (desktop engine only).""" + return Three.remove_scanner_projects(self, Input) + def restore_factory_calibration(self) -> 'Task': """Restore factory calibration.""" return Three.restore_factory_calibration(self) @@ -593,6 +633,10 @@ def set_group(self, index: 'int', name: 'str' = None, color: 'list[float]' = Non """Set scan group properties.""" return Three.set_group(self, index, name, color, visible, collapsed, rotation, translation) + def set_processing_devices(self, Input: 'list[bool]' = None) -> 'Task': + """Select the scan processing devices (server and/or client processing).""" + return Three.set_processing_devices(self, Input) + def set_project(self, index: 'int' = None, name: 'str' = None) -> 'Task': """Apply settings to the current open project.""" return Three.set_project(self, index, name) @@ -621,6 +665,10 @@ def stop_video(self) -> 'Task': """Stop the video stream.""" return Three.stop_video(self) + def storage_info(self) -> 'Task': + """Get the local and scanner storage space (desktop engine only).""" + return Three.storage_info(self) + def system_info(self, updateMajor: 'bool' = None, updateNightly: 'bool' = None) -> 'Task': """Get system information.""" return Three.system_info(self, updateMajor, updateNightly) diff --git a/three/scanner.pyi b/three/scanner.pyi index 683b1af..b4aa0bc 100644 --- a/three/scanner.pyi +++ b/three/scanner.pyi @@ -165,6 +165,9 @@ class Scanner: def close_project(self) -> MF.V3.Task.Task: """Close the current open project.""" ... + def connect_scanner(self, Input: str) -> MF.V3.Task.Task: + """Connect the desktop engine to a scanner (desktop engine only).""" + ... def connect_wifi(self, ssid: str, password: str) -> MF.V3.Task.Task: """Connect to a wifi network.""" ... @@ -174,9 +177,18 @@ class Scanner: def detect_calibration_card(self, Input: int) -> MF.V3.Task.Task: """Detect the calibration card on one or both cameras.""" ... + def disconnect_scanner(self) -> MF.V3.Task.Task: + """Disconnect the desktop engine from its scanner (desktop engine only).""" + ... + def discover_scanners(self) -> MF.V3.Task.Task: + """Discover scanners on the local network (desktop engine only).""" + ... def download_project(self, Input: int) -> MF.V3.Task.Task: """Download a project from the scanner.""" ... + def download_scanner_project(self, Input: int) -> MF.V3.Task.Task: + """Download a project archive from the connected scanner (desktop engine only).""" + ... def export(self, selection: MF.V3.Settings.ScanSelection.ScanSelection = None, texture: bool = None, merge: bool = None, format: MF.V3.Settings.Export.Export.Format = None, scale: float = None) -> MF.V3.Task.Task: """Export a group of scans.""" ... @@ -192,6 +204,12 @@ class Scanner: def forget_wifi(self) -> MF.V3.Task.Task: """Forget all wifi connections.""" ... + def get_protocol_info(self) -> MF.V3.Task.Task: + """Get the desktop-processing protocol version and capabilities.""" + ... + def get_scanner_status(self) -> MF.V3.Task.Task: + """Get the desktop engine's scanner connection status (desktop engine only).""" + ... def has_cameras(self) -> MF.V3.Task.Task: """Check if the scanner has working cameras.""" ... @@ -213,6 +231,9 @@ class Scanner: def list_projects(self) -> MF.V3.Task.Task: """List all projects.""" ... + def list_scanner_projects(self) -> MF.V3.Task.Task: + """List the projects on the connected scanner (desktop engine only).""" + ... def list_scans(self) -> MF.V3.Task.Task: """List the scans in the current open project.""" ... @@ -246,6 +267,12 @@ class Scanner: def pop_settings(self, Input: bool = None) -> MF.V3.Task.Task: """Pop and restore scanner settings from the settings stack.""" ... + def pull_project(self, Input: int) -> MF.V3.Task.Task: + """Copy a project from the connected scanner into the local workspace (desktop engine only).""" + ... + def push_project(self, Input: int) -> MF.V3.Task.Task: + """Copy a local project to the connected scanner (desktop engine only).""" + ... def push_settings(self) -> MF.V3.Task.Task: """Push the current scanner settings to the settings stack.""" ... @@ -258,6 +285,9 @@ class Scanner: def remove_projects(self, Input: List[int] = None) -> MF.V3.Task.Task: """Remove selected projects.""" ... + def remove_scanner_projects(self, Input: List[int] = None) -> MF.V3.Task.Task: + """Remove projects on the connected scanner (desktop engine only).""" + ... def restore_factory_calibration(self) -> MF.V3.Task.Task: """Restore factory calibration.""" ... @@ -273,6 +303,9 @@ class Scanner: def set_group(self, index: int, name: str = None, color: List[float] = None, visible: bool = None, collapsed: bool = None, rotation: List[float] = None, translation: List[float] = None) -> MF.V3.Task.Task: """Set scan group properties.""" ... + def set_processing_devices(self, Input: List[bool] = None) -> MF.V3.Task.Task: + """Select the scan processing devices (server and/or client processing).""" + ... def set_project(self, index: int = None, name: str = None) -> MF.V3.Task.Task: """Apply settings to the current open project.""" ... @@ -291,6 +324,9 @@ class Scanner: def stop_video(self) -> MF.V3.Task.Task: """Stop the video stream.""" ... + def storage_info(self) -> MF.V3.Task.Task: + """Get the local and scanner storage space (desktop engine only).""" + ... def system_info(self, updateMajor: bool = None, updateNightly: bool = None) -> MF.V3.Task.Task: """Get system information.""" ...