Upstream Snapshot bb87928bce Import upstream snapshot 80e710700aac9573a2230f74f7ce9e094833a0bc
Upstream: https://github.com/Rhoban/onshape-to-robot
Upstream-Commit: 80e710700aac9573a2230f74f7ce9e094833a0bc
Upstream-Branch: master
2026-08-28 15:42:31 +08:00

255 lines
7.6 KiB
Python

"""
client
======
Convenience functions for working with the Onshape API
"""
from .onshape import Onshape
from .cache import cache_response
def escape(s):
return s.replace("/", "%2f").replace("+", "%2b")
class Client:
"""
Defines methods for testing the Onshape API. Comes with several methods:
- Create a document
- Delete a document
- Get a list of documents
Attributes:
- stack (str, default='https://cad.onshape.com'): Base URL
- logging (bool, default=True): Turn logging on or off
"""
def __init__(
self, stack="https://cad.onshape.com", logging=True, creds="./config.json"
):
"""
Instantiates a new Onshape client.
Args:
- stack (str, default='https://cad.onshape.com'): Base URL
- logging (bool, default=True): Turn logging on or off
"""
self._metadata_cache = {}
self._massproperties_cache = {}
self._stack = stack
self._api = Onshape(stack=stack, logging=logging, creds=creds)
def request(self, url, **kwargs):
return self._api.request("get", url, **kwargs).json()
def request_binary(self, url, **kwargs):
return self._api.request("get", url, **kwargs).content
@cache_response
def get_document(self, did):
"""
Get details for a specified document.
Args:
- did (str): Document ID
Returns:
- requests.Response: Onshape response data
"""
return self.request(f"/api/documents/{escape(did)}")
@cache_response
def list_elements(self, did, wid, wmv="w"):
"""
Get the list of elements in a given document
"""
return self.request(
f"/api/documents/d/{escape(did)}/{escape(wmv)}/{escape(wid)}/elements"
)
@cache_response
def get_assembly(self, did, wmvid, eid, wmv="w", configuration="default"):
"""
Retrieve the assembly structure for a specified document / workspace / element.
"""
return self.request(
f"/api/assemblies/d/{escape(did)}/{escape(wmv)}/{escape(wmvid)}/e/{escape(eid)}",
query={
"includeMateFeatures": "true",
"includeMateConnectors": "true",
"includeNonSolids": "true",
"configuration": configuration,
},
)
@cache_response
def get_features(self, did, wvid, eid, wmv="w", configuration="default"):
"""
Gets the feature list for specified document / workspace / part studio.
Args:
- did (str): Document ID
- mid (str): Microversion
- eid (str): Element ID
Returns:
- requests.Response: Onshape response data
"""
return self.request(
f"/api/assemblies/d/{escape(did)}/{escape(wmv)}/{escape(wvid)}/e/{escape(eid)}/features",
query={"configuration": configuration},
)
@cache_response
def get_sketches(self, did, mid, eid, configuration):
"""
Get sketches for a given document / microversion / element.
"""
return self.request(
f"/api/partstudios/d/{escape(did)}/m/{escape(mid)}/e/{escape(eid)}/sketches",
query={"includeGeometry": "true", "configuration": configuration},
)
@cache_response
def get_parts(self, did, mid, eid, configuration):
"""
Get parts for a given document / microversion / element.
"""
return self.request(
f"/api/parts/d/{escape(did)}/m/{escape(mid)}/e/{escape(eid)}",
query={"configuration": configuration},
)
def find_new_partid(
self, did, mid, eid, partid, configuration_before, configuration
):
before = self.get_parts(did, mid, eid, configuration_before)
name = None
for entry in before:
if entry["partId"] == partid:
name = entry["name"]
if name is not None:
after = self.get_parts(did, mid, eid, configuration)
for entry in after:
if entry["name"] == name:
return entry["partId"]
else:
print("Onshape ERROR: Can't find new partid for " + str(partid))
return partid
@cache_response
def part_studio_stl_m(
self,
did,
wmvid,
eid,
partid="",
wmv="m",
configuration="default",
linked_document_id=None,
):
req_headers = {"Accept": "*/*"}
query = {
"mode": "binary",
"units": "meter",
"configuration": configuration,
}
if linked_document_id is not None:
query["linkDocumentId"] = linked_document_id
return self.request_binary(
f"/api/parts/d/{escape(did)}/{escape(wmv)}/{escape(wmvid)}/e/{escape(eid)}/partid/{escape(partid)}/stl",
query=query,
headers=req_headers,
)
@cache_response
def matevalues(self, did, wmvid, eid, wmv="w", configuration="default"):
return self.request(
f"/api/assemblies/d/{escape(did)}/{wmv}/{escape(wmvid)}/e/{escape(eid)}/matevalues",
query={"configuration": configuration},
)
@cache_response
def part_get_metadata(
self,
did,
wmvid,
eid,
partid,
wmv="m",
configuration="default",
linked_document_id=None,
):
query = {"configuration": configuration}
if linked_document_id is not None:
query["linkDocumentId"] = linked_document_id
return self.request(
f"/api/metadata/d/{escape(did)}/{escape(wmv)}/{escape(wmvid)}/e/{escape(eid)}/p/{escape(partid)}",
query=query,
)
@cache_response
def part_mass_properties(
self,
did,
wmvid,
eid,
partid,
wmv="m",
configuration="default",
linked_document_id=None,
):
query = {
"configuration": configuration,
"useMassPropertyOverrides": True,
}
if linked_document_id is not None:
query["linkDocumentId"] = linked_document_id
return self.request(
f"/api/parts/d/{escape(did)}/{escape(wmv)}/{escape(wmvid)}/e/{escape(eid)}/partid/{escape(partid)}/massproperties",
query=query,
)
@cache_response
def standard_cont_mass_properties(
self, did, vid, eid, partid, linked_document_id, configuration
):
return self.request(
f"/api/parts/d/{escape(did)}/v/{escape(vid)}/e/{escape(eid)}/partid/{escape(partid)}/massproperties",
query={
"configuration": configuration,
"useMassPropertyOverrides": True,
"linkDocumentId": linked_document_id,
"inferMetadataOwner": True,
},
)
@cache_response
def elements_configuration(
self, did, wmvid, eid, wmv, linked_document_id=None, configuration=None
):
query = {}
if linked_document_id is not None:
query["linkDocumentId"] = linked_document_id
return self.request(
f"/api/elements/d/{escape(did)}/{escape(wmv)}/{escape(wmvid)}/e/{escape(eid)}/configuration",
query=query,
)
@cache_response
def get_variables(self, did, wvid, eid, wmv, configuration):
return self.request(
f"/api/variables/d/{escape(did)}/{escape(wmv)}/{escape(wvid)}/e/{escape(eid)}/variables",
query={
"configuration": configuration,
"includeValuesAndReferencedVariables": True,
},
)