Added Module Loader (#1468)

This commit is contained in:
Prabhat Singh
2021-05-17 05:04:31 +05:30
committed by GitHub
parent 13209b6d03
commit 0f55a98b2f
5 changed files with 74 additions and 35 deletions
+4 -4
View File
@@ -11,16 +11,16 @@ Currently supports BCF version 2.1.
The `bcfxml` module lets you interact with the BCF-XML standard. The `bcfxml` module lets you interact with the BCF-XML standard.
``` ```
from bcf.bcfxml import BcfXml from bcf import bcfxml
bcfxml = BcfXml()
# Load a project # Load a project
project = bcfxml.get_project("/path/to/file.bcf") bcfxml = bcfxml.load("/path/to/file.bcf")
# The project is also stored in the module # The project is also stored in the module
# project == bcfxml.project # project == bcfxml.project
project=bcfxml.get_project()
print(project.name) print(project.name)
# To edit a project, just modify the object directly # To edit a project, just modify the object directly
+39
View File
@@ -0,0 +1,39 @@
import os.path
import zipfile
import tempfile
from xml.dom import minidom
def load(filepath):
filepath = extract_project(filepath)
if os.path.isfile(os.path.join(filepath, "bcf.version")):
version_path = os.path.join(filepath, "bcf.version")
version_id = get_version(version_path)
if version_id == "2.1":
from bcf.v2.bcfxml import BcfXml
bcfxml = BcfXml()
bcfxml.filepath = filepath
return bcfxml
else:
from bcf.v3.bcfxml import BcfXml
bcfxml = BcfXml()
bcfxml.filepath = filepath
return bcfxml
def get_version(version_path):
xmlparse = minidom.parse(version_path)
version_el = xmlparse.getElementsByTagName("Version")[0]
version = version_el.getAttribute("VersionId")
return version
def extract_project(filepath):
if not filepath:
return
zip_file = zipfile.ZipFile(filepath)
filepath = tempfile.mkdtemp()
zip_file.extractall(filepath)
return filepath
+31 -31
View File
@@ -4,7 +4,7 @@ import shutil
import zipfile import zipfile
import logging import logging
import tempfile import tempfile
import bcf.data import bcf.v2.data
from datetime import datetime from datetime import datetime
from xml.dom import minidom from xml.dom import minidom
from xmlschema import XMLSchema from xmlschema import XMLSchema
@@ -30,7 +30,7 @@ class BcfXml:
self.filepath = None self.filepath = None
self.logger = logging.getLogger("bcfxml") self.logger = logging.getLogger("bcfxml")
self.author = "john@doe.com" self.author = "john@doe.com"
self.project = bcf.data.Project() self.project = bcf.v2.data.Project()
self.version = "2.1" self.version = "2.1"
self.topics = {} self.topics = {}
@@ -47,9 +47,6 @@ class BcfXml:
def get_project(self, filepath=None): def get_project(self, filepath=None):
if not filepath: if not filepath:
return self.project return self.project
zip_file = zipfile.ZipFile(filepath)
self.filepath = tempfile.mkdtemp()
zip_file.extractall(self.filepath)
if os.path.isfile(os.path.join(self.filepath, "project.bcfp")): if os.path.isfile(os.path.join(self.filepath, "project.bcfp")):
data = self._read_xml("project.bcfp", "project.xsd") data = self._read_xml("project.bcfp", "project.xsd")
self.project.extension_schema = data["ExtensionSchema"] self.project.extension_schema = data["ExtensionSchema"]
@@ -102,9 +99,9 @@ class BcfXml:
data = self._read_xml(os.path.join(guid, "markup.bcf"), "markup.xsd") data = self._read_xml(os.path.join(guid, "markup.bcf"), "markup.xsd")
if "Header" not in data: if "Header" not in data:
return return
header = bcf.data.Header() header = bcf.v2.data.Header()
for item in data["Header"]["File"]: for item in data["Header"]["File"]:
header_file = bcf.data.HeaderFile() header_file = bcf.v2.data.HeaderFile()
optional_keys = { optional_keys = {
"filename": "Filename", "filename": "Filename",
"date": "Date", "date": "Date",
@@ -124,7 +121,7 @@ class BcfXml:
if guid in self.topics: if guid in self.topics:
return self.topics[guid] return self.topics[guid]
data = self._read_xml(os.path.join(guid, "markup.bcf"), "markup.xsd") data = self._read_xml(os.path.join(guid, "markup.bcf"), "markup.xsd")
topic = bcf.data.Topic() topic = bcf.v2.data.Topic()
self.topics[guid] = topic self.topics[guid] = topic
mandatory_keys = { mandatory_keys = {
@@ -155,7 +152,7 @@ class BcfXml:
setattr(topic, key, data["Topic"][value]) setattr(topic, key, data["Topic"][value])
if "BimSnippet" in data["Topic"]: if "BimSnippet" in data["Topic"]:
bim_snippet = bcf.data.BimSnippet() bim_snippet = bcf.v2.data.BimSnippet()
keys = { keys = {
"snippet_type": "@SnippetType", "snippet_type": "@SnippetType",
"is_external": "@IsExternal", "is_external": "@IsExternal",
@@ -169,7 +166,7 @@ class BcfXml:
if "DocumentReference" in data["Topic"]: if "DocumentReference" in data["Topic"]:
for item in data["Topic"]["DocumentReference"]: for item in data["Topic"]["DocumentReference"]:
document_reference = bcf.data.DocumentReference() document_reference = bcf.v2.data.DocumentReference()
keys = { keys = {
"referenced_document": "ReferencedDocument", "referenced_document": "ReferencedDocument",
"is_external": "@IsExternal", "is_external": "@IsExternal",
@@ -183,14 +180,14 @@ class BcfXml:
if "RelatedTopic" in data["Topic"]: if "RelatedTopic" in data["Topic"]:
for item in data["Topic"]["RelatedTopic"]: for item in data["Topic"]["RelatedTopic"]:
related_topic = bcf.data.RelatedTopic() related_topic = bcf.v2.data.RelatedTopic()
related_topic.guid = item["@Guid"] related_topic.guid = item["@Guid"]
topic.related_topics.append(related_topic) topic.related_topics.append(related_topic)
return topic return topic
def add_topic(self, topic=None): def add_topic(self, topic=None):
if topic is None: if topic is None:
topic = bcf.data.Topic() topic = bcf.v2.data.Topic()
if not topic.guid: if not topic.guid:
topic.guid = str(uuid.uuid4()) topic.guid = str(uuid.uuid4())
if not topic.title: if not topic.title:
@@ -288,9 +285,12 @@ class BcfXml:
"isExternal": f.is_external, "isExternal": f.is_external,
}, },
) )
self._create_element(file_el, "Filename", text=f.filename) if f.filename:
self._create_element(file_el, "Date", text=f.date) self._create_element(file_el, "Filename", text=f.filename)
self._create_element(file_el, "Reference", text=f.reference) if f.date:
self._create_element(file_el, "Date", text=f.date)
if f.reference:
self._create_element(file_el, "Reference", text=f.reference)
def write_comments(self, comments, root): def write_comments(self, comments, root):
for comment in comments.values(): for comment in comments.values():
@@ -310,7 +310,7 @@ class BcfXml:
def add_comment(self, topic, comment=None): def add_comment(self, topic, comment=None):
if comment is None: if comment is None:
comment = bcf.data.Comment() comment = bcf.v2.data.Comment()
if not comment.guid: if not comment.guid:
comment.guid = str(uuid.uuid4()) comment.guid = str(uuid.uuid4())
if not comment.comment: if not comment.comment:
@@ -471,7 +471,7 @@ class BcfXml:
def add_viewpoint(self, topic, viewpoint=None): def add_viewpoint(self, topic, viewpoint=None):
if not viewpoint: if not viewpoint:
viewpoint = bcf.data.Viewpoint() viewpoint = bcf.v2.data.Viewpoint()
if not viewpoint.guid: if not viewpoint.guid:
viewpoint.guid = str(uuid.uuid4()) viewpoint.guid = str(uuid.uuid4())
if not viewpoint.viewpoint: if not viewpoint.viewpoint:
@@ -572,7 +572,7 @@ class BcfXml:
header_file.is_external = False header_file.is_external = False
header_file.date = datetime.utcnow().isoformat() header_file.date = datetime.utcnow().isoformat()
if not topic.header: if not topic.header:
topic.header = bcf.data.Header() topic.header = bcf.v2.data.Header()
topic.header.files.append(header_file) topic.header.files.append(header_file)
self.edit_topic(topic) self.edit_topic(topic)
@@ -582,7 +582,7 @@ class BcfXml:
if "Comment" not in data: if "Comment" not in data:
return comments return comments
for item in data["Comment"]: for item in data["Comment"]:
comment = bcf.data.Comment() comment = bcf.v2.data.Comment()
mandatory_keys = {"guid": "@Guid", "date": "Date", "author": "Author", "comment": "Comment"} mandatory_keys = {"guid": "@Guid", "date": "Date", "author": "Author", "comment": "Comment"}
for key, value in mandatory_keys.items(): for key, value in mandatory_keys.items():
setattr(comment, key, item[value]) setattr(comment, key, item[value])
@@ -591,7 +591,7 @@ class BcfXml:
if value in item: if value in item:
setattr(comment, key, item[value]) setattr(comment, key, item[value])
if "Viewpoint" in item: if "Viewpoint" in item:
viewpoint = bcf.data.Viewpoint() viewpoint = bcf.v2.data.Viewpoint()
viewpoint.guid = item["Viewpoint"]["@Guid"] viewpoint.guid = item["Viewpoint"]["@Guid"]
comment.viewpoint = viewpoint comment.viewpoint = viewpoint
comments[comment.guid] = comment comments[comment.guid] = comment
@@ -610,7 +610,7 @@ class BcfXml:
return viewpoints return viewpoints
def get_viewpoint(self, data, topic_guid): def get_viewpoint(self, data, topic_guid):
viewpoint = bcf.data.Viewpoint() viewpoint = bcf.v2.data.Viewpoint()
viewpoint.guid = data["@Guid"] viewpoint.guid = data["@Guid"]
optional_keys = {"viewpoint": "Viewpoint", "snapshot": "Snapshot", "index": "Index"} optional_keys = {"viewpoint": "Viewpoint", "snapshot": "Snapshot", "index": "Index"}
for key, value in optional_keys.items(): for key, value in optional_keys.items():
@@ -628,10 +628,10 @@ class BcfXml:
def get_viewpoint_components(self, visinfo): def get_viewpoint_components(self, visinfo):
if "Components" not in visinfo: if "Components" not in visinfo:
return None return None
components = bcf.data.Components() components = bcf.v2.data.Components()
data = visinfo["Components"] data = visinfo["Components"]
if "ViewSetupHints" in data: if "ViewSetupHints" in data:
view_setup_hints = bcf.data.ViewSetupHints() view_setup_hints = bcf.v2.data.ViewSetupHints()
optional_keys = { optional_keys = {
"spaces_visible": "@SpacesVisible", "spaces_visible": "@SpacesVisible",
"space_boundaries_visible": "@SpaceBoundariesVisible", "space_boundaries_visible": "@SpaceBoundariesVisible",
@@ -645,7 +645,7 @@ class BcfXml:
for item in data["Selection"]["Component"]: for item in data["Selection"]["Component"]:
components.selection.append(self.get_component(item)) components.selection.append(self.get_component(item))
if "Visibility" in data: if "Visibility" in data:
component_visibility = bcf.data.ComponentVisibility() component_visibility = bcf.v2.data.ComponentVisibility()
if "@DefaultVisibility" in data["Visibility"]: if "@DefaultVisibility" in data["Visibility"]:
component_visibility.default_visibility = data["Visibility"]["@DefaultVisibility"] component_visibility.default_visibility = data["Visibility"]["@DefaultVisibility"]
if "Exceptions" in data["Visibility"] and "Component" in data["Visibility"]["Exceptions"]: if "Exceptions" in data["Visibility"] and "Component" in data["Visibility"]["Exceptions"]:
@@ -654,7 +654,7 @@ class BcfXml:
components.visibility = component_visibility components.visibility = component_visibility
if "Coloring" in data and "Color" in data["Coloring"]: if "Coloring" in data and "Color" in data["Coloring"]:
for item in data["Coloring"]["Color"]: for item in data["Coloring"]["Color"]:
color = bcf.data.Color() color = bcf.v2.data.Color()
color.color = item["@Color"] color.color = item["@Color"]
for item2 in item["Component"]: for item2 in item["Component"]:
color.components.append(self.get_component(item2)) color.components.append(self.get_component(item2))
@@ -664,7 +664,7 @@ class BcfXml:
def get_viewpoint_orthogonal_camera(self, visinfo): def get_viewpoint_orthogonal_camera(self, visinfo):
if "OrthogonalCamera" not in visinfo: if "OrthogonalCamera" not in visinfo:
return None return None
camera = bcf.data.OrthogonalCamera() camera = bcf.v2.data.OrthogonalCamera()
data = visinfo["OrthogonalCamera"] data = visinfo["OrthogonalCamera"]
self.set_vector(camera.camera_view_point, data["CameraViewPoint"]) self.set_vector(camera.camera_view_point, data["CameraViewPoint"])
self.set_vector(camera.camera_direction, data["CameraDirection"]) self.set_vector(camera.camera_direction, data["CameraDirection"])
@@ -675,7 +675,7 @@ class BcfXml:
def get_viewpoint_perspective_camera(self, visinfo): def get_viewpoint_perspective_camera(self, visinfo):
if "PerspectiveCamera" not in visinfo: if "PerspectiveCamera" not in visinfo:
return None return None
camera = bcf.data.PerspectiveCamera() camera = bcf.v2.data.PerspectiveCamera()
data = visinfo["PerspectiveCamera"] data = visinfo["PerspectiveCamera"]
self.set_vector(camera.camera_view_point, data["CameraViewPoint"]) self.set_vector(camera.camera_view_point, data["CameraViewPoint"])
self.set_vector(camera.camera_direction, data["CameraDirection"]) self.set_vector(camera.camera_direction, data["CameraDirection"])
@@ -688,7 +688,7 @@ class BcfXml:
return [] return []
lines = [] lines = []
for item in visinfo["Lines"]["Line"]: for item in visinfo["Lines"]["Line"]:
line = bcf.data.Line() line = bcf.v2.data.Line()
self.set_vector(line.start_point, item["StartPoint"]) self.set_vector(line.start_point, item["StartPoint"])
self.set_vector(line.end_point, item["EndPoint"]) self.set_vector(line.end_point, item["EndPoint"])
lines.append(line) lines.append(line)
@@ -699,7 +699,7 @@ class BcfXml:
return [] return []
planes = [] planes = []
for item in visinfo["ClippingPlanes"]["ClippingPlane"]: for item in visinfo["ClippingPlanes"]["ClippingPlane"]:
plane = bcf.data.ClippingPlane() plane = bcf.v2.data.ClippingPlane()
self.set_vector(plane.location, item["Location"]) self.set_vector(plane.location, item["Location"])
self.set_vector(plane.direction, item["Direction"]) self.set_vector(plane.direction, item["Direction"])
planes.append(plane) planes.append(plane)
@@ -710,7 +710,7 @@ class BcfXml:
return [] return []
bitmaps = [] bitmaps = []
for item in visinfo["Bitmap"]: for item in visinfo["Bitmap"]:
bitmap = bcf.data.Bitmap() bitmap = bcf.v2.data.Bitmap()
bitmap.reference = item["Reference"] bitmap.reference = item["Reference"]
bitmap.bitmap_type = item["Bitmap"].upper() bitmap.bitmap_type = item["Bitmap"].upper()
self.set_vector(bitmap.location, item["Location"]) self.set_vector(bitmap.location, item["Location"])
@@ -726,7 +726,7 @@ class BcfXml:
to_obj.z = from_xml["Z"] to_obj.z = from_xml["Z"]
def get_component(self, data): def get_component(self, data):
component = bcf.data.Component() component = bcf.v2.data.Component()
optional_keys = { optional_keys = {
"originating_system": "OriginatingSystem", "originating_system": "OriginatingSystem",
"authoring_tool_id": "AuthoringToolId", "authoring_tool_id": "AuthoringToolId",
View File