Use .Name instead of .Description if IFC2X3 for sheets #4576

As Description was added only in IFC4
This commit is contained in:
Andrej730
2024-04-24 15:41:33 +05:00
parent 716a33f347
commit e14d96e6ee
6 changed files with 97 additions and 46 deletions
@@ -1241,12 +1241,14 @@ class AddDrawingToSheet(bpy.types.Operator, Operator):
return return
reference = tool.Ifc.run("document.add_reference", information=sheet) reference = tool.Ifc.run("document.add_reference", information=sheet)
id_attr = "ItemReference" if tool.Ifc.get_schema() == "IFC2X3" else "Identification" attributes = tool.Drawing.generate_reference_attributes(
attributes = { reference,
id_attr: str(len([r for r in references if r.Description in ("DRAWING", "SCHEDULE")]) + 1), Identification=str(
"Location": drawing_reference.Location, len([r for r in references if tool.Drawing.get_reference_description(r) in ("DRAWING", "SCHEDULE")]) + 1
"Description": "DRAWING", ),
} Location=drawing_reference.Location,
Description="DRAWING",
)
tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes) tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes)
sheet_builder = sheeter.SheetBuilder() sheet_builder = sheeter.SheetBuilder()
sheet_builder.data_dir = context.scene.BIMProperties.data_dir sheet_builder.data_dir = context.scene.BIMProperties.data_dir
@@ -1314,9 +1316,10 @@ class CreateSheets(bpy.types.Operator, Operator):
has_sheet_reference = False has_sheet_reference = False
for reference in tool.Drawing.get_document_references(sheet): for reference in tool.Drawing.get_document_references(sheet):
if reference.Description == "SHEET": reference_description = tool.Drawing.get_reference_description(reference)
if reference == "SHEET":
has_sheet_reference = True has_sheet_reference = True
elif reference.Description == "RASTER": elif reference == "RASTER":
if reference.Location in raster_references: if reference.Location in raster_references:
raster_references.remove(reference.Location) raster_references.remove(reference.Location)
else: else:
@@ -1327,7 +1330,9 @@ class CreateSheets(bpy.types.Operator, Operator):
tool.Ifc.run( tool.Ifc.run(
"document.edit_reference", "document.edit_reference",
reference=reference, reference=reference,
attributes={"Location": tool.Ifc.get_relative_uri(svg), "Description": "SHEET"}, attributes=tool.Drawing.generate_reference_attributes(
reference, Location=tool.Ifc.get_relative_uri(svg), Description="SHEET"
),
) )
for raster_reference in raster_references: for raster_reference in raster_references:
@@ -1335,7 +1340,9 @@ class CreateSheets(bpy.types.Operator, Operator):
tool.Ifc.run( tool.Ifc.run(
"document.edit_reference", "document.edit_reference",
reference=reference, reference=reference,
attributes={"Location": tool.Ifc.get_relative_uri(raster_reference), "Description": "RASTER"}, attributes=tool.Drawing.generate_reference_attributes(
reference, Location=tool.Ifc.get_relative_uri(raster_reference), Description="RASTER"
),
) )
svg2pdf_command = context.preferences.addons["blenderbim"].preferences.svg2pdf_command svg2pdf_command = context.preferences.addons["blenderbim"].preferences.svg2pdf_command
@@ -1988,12 +1995,14 @@ class AddScheduleToSheet(bpy.types.Operator, Operator):
return return
reference = tool.Ifc.run("document.add_reference", information=sheet) reference = tool.Ifc.run("document.add_reference", information=sheet)
id_attr = "ItemReference" if tool.Ifc.get_schema() == "IFC2X3" else "Identification" attributes = tool.Drawing.generate_reference_attributes(
attributes = { reference,
id_attr: str(len([r for r in references if r.Description in ("DRAWING", "SCHEDULE")]) + 1), Identification=str(
"Location": schedule_location, len([r for r in references if tool.Drawing.get_reference_description(r) in ("DRAWING", "SCHEDULE")]) + 1
"Description": "SCHEDULE", ),
} Location=schedule_location,
Description="SCHEDULE",
)
tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes) tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes)
sheet_builder = sheeter.SheetBuilder() sheet_builder = sheeter.SheetBuilder()
@@ -2042,12 +2051,15 @@ class AddReferenceToSheet(bpy.types.Operator, Operator):
return return
reference = tool.Ifc.run("document.add_reference", information=sheet) reference = tool.Ifc.run("document.add_reference", information=sheet)
id_attr = "ItemReference" if tool.Ifc.get_schema() == "IFC2X3" else "Identification" attributes = tool.Drawing.generate_reference_attributes(
attributes = { reference,
id_attr: str(len([r for r in references if r.Description in ("DRAWING", "REFERENCE")]) + 1), Identification=str(
"Location": extref_location, len([r for r in references if tool.Drawing.get_reference_description(r) in ("DRAWING", "REFERENCE")])
"Description": "REFERENCE", + 1
} ),
Location=extref_location,
Description="REFERENCE",
)
tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes) tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes)
sheet_builder = sheeter.SheetBuilder() sheet_builder = sheeter.SheetBuilder()
@@ -2393,7 +2405,7 @@ class EditSheet(bpy.types.Operator, Operator):
self.document_type = "SHEET" self.document_type = "SHEET"
self.name = sheet.Name self.name = sheet.Name
self.identification = sheet.Identification self.identification = sheet.Identification
elif sheet.is_a("IfcDocumentReference") and sheet.Description == "TITLEBLOCK": elif sheet.is_a("IfcDocumentReference") and tool.Drawing.get_reference_description(sheet) == "TITLEBLOCK":
self.document_type = "TITLEBLOCK" self.document_type = "TITLEBLOCK"
else: else:
self.document_type = "EMBEDDED" self.document_type = "EMBEDDED"
@@ -2419,7 +2431,7 @@ class EditSheet(bpy.types.Operator, Operator):
if self.document_type == "SHEET": if self.document_type == "SHEET":
core.rename_sheet(tool.Ifc, tool.Drawing, sheet=sheet, identification=self.identification, name=self.name) core.rename_sheet(tool.Ifc, tool.Drawing, sheet=sheet, identification=self.identification, name=self.name)
elif self.document_type == "EMBEDDED": elif self.document_type == "EMBEDDED":
core.rename_reference(tool.Ifc, reference=sheet, identification=self.identification) core.rename_reference(tool.Ifc, tool.Drawing, reference=sheet, identification=self.identification)
elif self.document_type == "TITLEBLOCK": elif self.document_type == "TITLEBLOCK":
titleblock = self.props.titleblock titleblock = self.props.titleblock
reference = sheet reference = sheet
@@ -726,7 +726,8 @@ class SvgWriter:
reference = tool.Drawing.get_drawing_reference(drawing) reference = tool.Drawing.get_drawing_reference(drawing)
if reference: if reference:
for sheet_reference in tool.Ifc.get().by_type("IfcDocumentReference"): for sheet_reference in tool.Ifc.get().by_type("IfcDocumentReference"):
if sheet_reference.Description != "DRAWING" or sheet_reference.Location != reference.Location: reference_description = tool.Drawing.get_reference_description(reference)
if reference_description != "DRAWING" or sheet_reference.Location != reference.Location:
continue continue
sheet = tool.Drawing.get_reference_document(sheet_reference) sheet = tool.Drawing.get_reference_document(sheet_reference)
if sheet: if sheet:
+12 -10
View File
@@ -77,16 +77,17 @@ def add_sheet(ifc, drawing, titleblock=None):
else: else:
attributes = {"Identification": identification, "Name": "UNTITLED", "Scope": "SHEET"} attributes = {"Identification": identification, "Name": "UNTITLED", "Scope": "SHEET"}
ifc.run("document.edit_information", information=sheet, attributes=attributes) ifc.run("document.edit_information", information=sheet, attributes=attributes)
ifc.run(
"document.edit_reference", attributes = drawing.generate_reference_attributes(
reference=layout, layout, Location=drawing.get_default_layout_path(identification, "UNTITLED"), Description="LAYOUT"
attributes={"Location": drawing.get_default_layout_path(identification, "UNTITLED"), "Description": "LAYOUT"},
) )
ifc.run( ifc.run("document.edit_reference", reference=layout, attributes=attributes)
"document.edit_reference",
reference=titleblock_reference, attributes = drawing.generate_reference_attributes(
attributes={"Location": drawing.get_default_titleblock_path(titleblock), "Description": "TITLEBLOCK"}, layout, Location=drawing.get_default_titleblock_path(titleblock), Description="TITLEBLOCK"
) )
ifc.run("document.edit_reference", reference=titleblock_reference, attributes=attributes)
drawing.create_svg_sheet(sheet, titleblock) drawing.create_svg_sheet(sheet, titleblock)
drawing.import_sheets() drawing.import_sheets()
@@ -138,8 +139,9 @@ def rename_sheet(ifc, drawing, sheet=None, identification=None, name=None):
drawing.move_file(old_location, ifc.resolve_uri(new_location)) drawing.move_file(old_location, ifc.resolve_uri(new_location))
def rename_reference(ifc, reference=None, identification=None): def rename_reference(ifc, drawing, reference=None, identification=None):
ifc.run("document.edit_reference", reference=reference, attributes={"Identification": identification}) attributes = drawing.generate_reference_attributes(reference, Identifiaction=identification)
ifc.run("document.edit_reference", reference=reference, attributes=attributes)
def load_schedules(drawing): def load_schedules(drawing):
+1
View File
@@ -329,6 +329,7 @@ class Drawing:
def get_name(cls, element): pass def get_name(cls, element): pass
def get_path_filename(cls, uri): pass def get_path_filename(cls, uri): pass
def get_reference_description(cls, reference): pass def get_reference_description(cls, reference): pass
def generate_reference_attributes(cls, reference, **attributes): pass
def get_reference_document(cls, reference): pass def get_reference_document(cls, reference): pass
def get_reference_location(cls, reference): pass def get_reference_location(cls, reference): pass
def get_references_with_location(cls, location): pass def get_references_with_location(cls, location): pass
+27 -6
View File
@@ -254,9 +254,10 @@ class Drawing(blenderbim.core.tool.Drawing):
sheet_reference = None sheet_reference = None
drawing_names = [] drawing_names = []
for reference in cls.get_document_references(sheet): for reference in cls.get_document_references(sheet):
if reference.Description == "LAYOUT": reference_description = cls.get_reference_description(reference)
if reference_description == "LAYOUT":
sheet_reference = reference sheet_reference = reference
elif reference.Description == "DRAWING": elif reference_description == "DRAWING":
drawing_names.append(Path(reference.Location).stem) drawing_names.append(Path(reference.Location).stem)
for annotation in [e for e in tool.Ifc.get().by_type("IfcAnnotation") if e.ObjectType == "DRAWING"]: for annotation in [e for e in tool.Ifc.get().by_type("IfcAnnotation") if e.ObjectType == "DRAWING"]:
if annotation.Name in drawing_names: if annotation.Name in drawing_names:
@@ -421,7 +422,7 @@ class Drawing(blenderbim.core.tool.Drawing):
else: else:
references = document.HasDocumentReferences references = document.HasDocumentReferences
for reference in references: for reference in references:
if description and reference.Description != description: if description and cls.get_reference_description(reference) != description:
continue continue
location = cls.get_document_uri(reference) location = cls.get_document_uri(reference)
if location: if location:
@@ -823,7 +824,8 @@ class Drawing(blenderbim.core.tool.Drawing):
continue continue
for reference in cls.get_document_references(sheet): for reference in cls.get_document_references(sheet):
if reference.Description in ("SHEET", "LAYOUT", "RASTER"): reference_description = cls.get_reference_description(reference)
if reference_description in ("SHEET", "LAYOUT", "RASTER"):
# These references are an internal detail and should not be visible to users # These references are an internal detail and should not be visible to users
continue continue
new = props.sheets.add() new = props.sheets.add()
@@ -836,7 +838,7 @@ class Drawing(blenderbim.core.tool.Drawing):
new.identification = reference.Identification or "" new.identification = reference.Identification or ""
new.name = os.path.basename(reference.Location) new.name = os.path.basename(reference.Location)
new.reference_type = reference.Description new.reference_type = reference_description
@classmethod @classmethod
def get_active_sheet(cls, context): def get_active_sheet(cls, context):
@@ -1568,9 +1570,28 @@ class Drawing(blenderbim.core.tool.Drawing):
tree.write(uri, pretty_print=True, xml_declaration=True, encoding="utf-8") tree.write(uri, pretty_print=True, xml_declaration=True, encoding="utf-8")
@classmethod @classmethod
def get_reference_description(cls, reference): def get_reference_description(cls, reference: ifcopenshell.entity_instance) -> Union[str, None]:
if reference.file.schema == "IFC2X3":
return reference.Name
return reference.Description return reference.Description
@classmethod
def generate_reference_attributes(cls, reference: ifcopenshell.entity_instance, **attributes: Any) -> dict[str, Any]:
"""will automatically convert attributes below for IFC2X3 compatibility:
- Identification -> ItemReference
- Description -> Name
"""
if reference.file.schema == "IFC2X3":
if "Description" in attributes:
attributes["Name"] = attributes["Description"]
del attributes["Description"]
if "Identification" in attributes:
attributes["ItemReference"] = attributes["Identification"]
del attributes["Identification"]
return attributes
@classmethod @classmethod
def get_reference_location(cls, reference): def get_reference_location(cls, reference):
return reference.Location return reference.Location
+19 -5
View File
@@ -95,15 +95,21 @@ class TestAddSheet:
information="sheet", information="sheet",
attributes={"Identification": "u_identification", "Name": "UNTITLED", "Scope": "SHEET"}, attributes={"Identification": "u_identification", "Name": "UNTITLED", "Scope": "SHEET"},
).should_be_called() ).should_be_called()
drawing.generate_reference_attributes(
"reference", Location="layout_path", Description="LAYOUT"
).should_be_called().will_return("attributes")
ifc.run( ifc.run(
"document.edit_reference", "document.edit_reference",
reference="reference", reference="reference",
attributes={"Location": "layout_path", "Description": "LAYOUT"}, attributes="attributes",
).should_be_called() ).should_be_called()
drawing.generate_reference_attributes(
"reference", Location="titleblock_path", Description="TITLEBLOCK"
).should_be_called().will_return("attributes2")
ifc.run( ifc.run(
"document.edit_reference", "document.edit_reference",
reference="reference", reference="reference",
attributes={"Location": "titleblock_path", "Description": "TITLEBLOCK"}, attributes="attributes2",
).should_be_called() ).should_be_called()
drawing.create_svg_sheet("sheet", "titleblock").should_be_called() drawing.create_svg_sheet("sheet", "titleblock").should_be_called()
drawing.import_sheets().should_be_called() drawing.import_sheets().should_be_called()
@@ -122,15 +128,21 @@ class TestAddSheet:
information="sheet", information="sheet",
attributes={"DocumentId": "u_identification", "Name": "UNTITLED", "Scope": "SHEET"}, attributes={"DocumentId": "u_identification", "Name": "UNTITLED", "Scope": "SHEET"},
).should_be_called() ).should_be_called()
drawing.generate_reference_attributes(
"reference", Location="layout_path", Description="LAYOUT"
).should_be_called().will_return("attributes")
ifc.run( ifc.run(
"document.edit_reference", "document.edit_reference",
reference="reference", reference="reference",
attributes={"Location": "layout_path", "Description": "LAYOUT"}, attributes="attributes",
).should_be_called() ).should_be_called()
drawing.generate_reference_attributes(
"reference", Location="titleblock_path", Description="TITLEBLOCK"
).should_be_called().will_return("attributes2")
ifc.run( ifc.run(
"document.edit_reference", "document.edit_reference",
reference="reference", reference="reference",
attributes={"Location": "titleblock_path", "Description": "TITLEBLOCK"}, attributes="attributes2",
).should_be_called() ).should_be_called()
drawing.create_svg_sheet("sheet", "titleblock").should_be_called() drawing.create_svg_sheet("sheet", "titleblock").should_be_called()
drawing.import_sheets().should_be_called() drawing.import_sheets().should_be_called()
@@ -490,7 +502,9 @@ class TestUpdateDrawingName:
) )
ifc.resolve_uri("relative_layout_uri").should_be_called().will_return("absolute_layout_uri") ifc.resolve_uri("relative_layout_uri").should_be_called().will_return("absolute_layout_uri")
drawing.does_file_exist("absolute_layout_uri").should_be_called().will_return(True) drawing.does_file_exist("absolute_layout_uri").should_be_called().will_return(True)
drawing.update_embedded_svg_location("absolute_layout_uri", "reference_with_old_location", "new_uri").should_be_called() drawing.update_embedded_svg_location(
"absolute_layout_uri", "reference_with_old_location", "new_uri"
).should_be_called()
drawing.is_editing_sheets().should_be_called().will_return(True) drawing.is_editing_sheets().should_be_called().will_return(True)
drawing.import_sheets().should_be_called() drawing.import_sheets().should_be_called()