IanYeo's picture
tidy code
5babdb9
#!/usr/bin/env python
# coding: utf-8
import os
import shutil
import tempfile
import zipfile
import requests
import streamlit as st
import xml.etree.ElementTree as ET
def elevation_change(bcf_list, z_error_correction_in_metres: float):
update_data_list = []
for individual_file in file_list:
if 'viewpoint' in individual_file:
bcf_guid = individual_file.split('/', 1)[0]
parsed_markup_file = file_open.open(bcf_guid + '/markup.bcf')
xml_tree_markup = ET.parse(parsed_markup_file)
xml_root_markup = xml_tree_markup.getroot()
for topic_data in xml_root_markup.iter('Topic'):
component_guids = []
component_batids = []
parsed_viewpoint_file = file_open.open(individual_file)
xml_tree_viewpoint = ET.parse(parsed_viewpoint_file)
xml_root_viewpoint = xml_tree_viewpoint.getroot()
updateZValue(xml_root_viewpoint, 'CameraViewPoint', z_error_correction_in_metres)
for bitmap_data in xml_root_viewpoint.iter('Bitmap'):
updateZValue(bitmap_data, 'Location', z_error_correction_in_metres)
for clipping_plane_data in xml_root_viewpoint.iter('ClippingPlane'):
updateZValue(clipping_plane_data, 'Location', z_error_correction_in_metres)
for line_data in xml_root_viewpoint.iter('Line'):
updateZValue(line_data, 'StartPoint', z_error_correction_in_metres)
updateZValue(line_data, 'EndPoint', z_error_correction_in_metres)
individual_xml_update = {
'individual_file':individual_file,
'xml_string_update': ET.tostring(xml_root_viewpoint)
}
update_data_list.append(individual_xml_update)
return update_data_list
def updateZip(zipname, filename, data):
# generate a temp file
tmpfd, tmpname = tempfile.mkstemp(dir=os.path.dirname(zipname))
os.close(tmpfd)
# create a temp copy of the archive without filename
with zipfile.ZipFile(zipname, 'r') as zin:
with zipfile.ZipFile(tmpname, 'w') as zout:
zout.comment = zin.comment # preserve the comment
for item in zin.infolist():
if item.filename != filename:
zout.writestr(item, zin.read(item.filename))
# replace with the temp archive
os.remove(zipname)
os.rename(tmpname, zipname)
# now add filename with its new data
with zipfile.ZipFile(zipname, mode='a', compression=zipfile.ZIP_DEFLATED) as zf:
zf.writestr(filename, data)
def updateZipForMultipleFiles(file_names_and_data, zipname='temp.zip'):
# generate a temp file
# test_dataset.save_to_disk("test.hf")
tmpfd, tmpname = tempfile.mkstemp(dir=os.path.dirname(zipname))
os.close(tmpfd)
# create a temp copy of the archive without filename
with zipfile.ZipFile(zipname, 'r') as zin:
with zipfile.ZipFile(tmpname, 'w') as zout:
zout.comment = zin.comment # preserve the comment
for item in zin.infolist():
if not 'viewpoint' in item.filename:
zout.writestr(item, zin.read(item.filename))
# replace with the temp archive
os.remove(zipname)
os.rename(tmpname, zipname)
# now add filename with its new data
for individual_update in file_names_and_data:
with zipfile.ZipFile(zipname, mode='a', compression=zipfile.ZIP_DEFLATED) as zf:
zf.writestr(individual_update['individual_file'], individual_update['xml_string_update'])
return True
def updateZValue(xml_data, xml_element_to_iterate, z_error_correction_in_metres):
for location_data in xml_data.iter(xml_element_to_iterate):
existing_z = float(location_data.find('Z').text)
new_z = existing_z + z_error_correction_in_metres
location_data.find('Z').text = str(new_z)
st.markdown(
'''
# Adjust the height of all issues in a BCF file
Provide any bcf file.
Select the height adjustment in metres.
'''
)
bcf_file_button = st.text_input(
"Dropbox link to BCF file",
key="bcf_file_button"
)
# In[ ]:
if bcf_file_button:
bcf_file_path = st.session_state.bcf_file_button
path_original = 'original.zip'
path_updated = 'temp.zip'
if '=0' in bcf_file_path:
bcf_file_path = bcf_file_path.replace('=0', '=1')
if '.bcf' in bcf_file_path:
updated = False
partial_filename = bcf_file_path.rsplit('/')[-1]
filename = partial_filename.split('.bcf')[0]
bcf_file_path = bcf_file_path.replace('.bcf', '.zip')
r = requests.get(bcf_file_path, stream=True)
if r.status_code == 200:
with open(path_original, 'wb') as f:
for chunk in r:
f.write(chunk)
shutil.copy2(path_original, path_updated)
file_open = zipfile.ZipFile(path_original)
file_list = file_open.namelist()
height_change_button = st.number_input(
"Height of the sheet to be returned",
format="%.3f",
value=0.000,
min_value=-1000.0,
max_value=1000.0,
step=0.001,
key="height_change_button"
)
if height_change_button:
height_change = st.session_state.height_change_button
update_bcf_info = elevation_change(
file_list,
height_change,
)
updated = updateZipForMultipleFiles(
update_bcf_info,
)
if updated:
with open(path_updated, "rb") as fp:
btn = st.download_button(
label="Download BCF file",
data=fp,
file_name=f"{filename}_height_{height_change}.bcf",
mime="application/zip"
)
else:
st.write('Please provide a valid BCF file')