General Process Overview
To upload a file to a component or a case, follow these general steps:
- Acquire a Pre-signed URL: This is the URL where the file will be uploaded.
- Upload the File: Use the provided
upload_file
function to send the file to the pre-signed URL. - Finalize the Upload: Depending on the file type, use either the
convert_file
orinitialize_file
function to complete the process.
Uploading Files for a Specific Component
Purpose: Upload and render a STEP file for a single component.
Steps:
- Get a pre-signed URL using the
get_file_upload_url
method. - Upload the file using the
upload_file
method. - Convert the file using the
convert_file
method, which will generate an STL file for visualization.
Automation: These steps are wrapped in the upload_component_file
method.
Uploading a Complete Case File
Purpose: Upload and render a full geometry STEP file that contains all regions.
Steps:
- Obtain a pre-signed URL (similar to the component upload).
- Upload the file using the
upload_file
method. - Initialize the file using the
initialize_file
method (instead of converting it).
Automation: These steps are combined in the upload_complete_file
method.
Uploading an STL File
Purpose: Upload an STL file for a component.
Steps:
- Obtain a pre-signed URL as in previous uploads.
- Upload the file using the
upload_file
method.
Automation: These steps are encapsulated in the upload_stl_file
method.
Detailed Methods Overview
get_file_upload_url
The first step in the file upload process, creating an entry in the cloud and returning the pre-signed URL.
API call function:
def get_file_upload_url(self, case_Id, file_name, size, component_Id=None) -> Dict:
"""
Returns: a json object with meta data for the file entry in the cloud
:param int case_Id: id of the case you want to upload a file to
:param string file_name: the name of the file
:param int size: the size of the file in bytes
:param int component_Id: optional parameter, id of the component that you want to upload a file for. Leave this parameter open if you want to upload a step file containging all components.
"""
file_url = self.fileserver_url + "/cases/" + str(case_Id) + "/files"
payload = json.dumps({"fileName": file_name,"fileSize": size, "caseComponentId": component_Id})
response = requests.post(file_url, data=payload, headers=self.put_header)
if(response.ok):
print("url acquired: \n", response.text, "\n")
return response.json()
else:
logger.error(f"failed to acquire url: {response.content}")
raise Exception
upload_file
Handling the actual file upload to the pre-signed URL.
API call function:
def upload_file(self, presigned_url, file_path):
"""
:param string presigned_url: a pre signed url to where you want to upload your file
:param string file_path: path to the file you want to upload
"""
with open(file_path, 'rb') as file:
file_data = file.read()
#response = requests.put(presigned_url, data=file_data, headers={'Content-Type': 'application/octet-stream'})
response = requests.put(presigned_url, data=file_data, headers=self.url_post_header)
if(response.ok):
print("file upload successful \n")
else:
logger.error(f"file upload failed: {response.content}")
raise Exception
convert_file
Converting the uploaded STEP file into an STL file, necessary for visualizing the file in the system.
API call function:
def convert_file(self, case_Id, file_Id, file_url) -> Dict:
"""
Returns: a json object with meta data for the job
:param int case_Id: id of the case you want a step file to be visualized in
:param int file_Id: id of the file you want to convert (visualize)
:param string file_url: url to the file you want to convert. This url is obtained in a previous step (the 'get_file_url' method). This is the normal url, not the pre-signed one
"""
file_url_server = self.caseserver_url + "/jobs/convert"
payload = json.dumps({"caseId": case_Id, "fileId": file_Id, "fileURL": file_url})
response = requests.post(file_url_server, data=payload, headers=self.put_header)
if(response.ok):
print("file conversion successful: \n", response.text, "\n")
return response.json()
else:
if b"Job already runs for case" in response.content:
print("A job is already running, please wait while the program tries again")
while not response.ok:
time.sleep(2)
response = requests.post(file_url_server, data=payload, headers=self.put_header)
if(response.ok):
print("file conversion successful: \n", response.text, "\n")
return response.json()
else:
logger.error(f"file conversion failed: {response.content}")
raise Exception
initialize_file
Converts a previously uploaded file. This will generate an stl file, which will visualize the step file.
API call function:
def initialize_file(self, case_Id, file_Id, file_url) -> Dict:
"""
Returns: a json object with meta data for the job
:param int case_Id: id of the case you want a step file to be visualized in
:param int file_Id: id of the file you want to convert (visualize)
:param string file_url: url to the file you want to convert. This url is obtained in a previous step (the 'get_file_url' method). This is the normal url, not the pre-signed one
"""
url = self.caseserver_url + "/jobs/initialize"
payload = json.dumps({"caseId": case_Id, "fileId": file_Id, "fileURL": file_url})
response = requests.post(url, data=payload, headers=self.put_header)
if(response.ok):
print("file initialization successful: \n", response.text, "\n")
return response.json()
else:
logger.error(f"file initialization failed: {response.content}")
raise Exception