Skip to content

Commit b6caf06

Browse files
committed
Fix IfcOpenShell#3001. User can now specify join criteria in drawings. Only elements where all the criteria have the same values are merged.
1 parent 5b4449e commit b6caf06

2 files changed

Lines changed: 22 additions & 7 deletions

File tree

src/blenderbim/blenderbim/bim/data/pset/EPset_Drawing.ifc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ FILE_NAME('EPset_Drawing.ifc','2020-01-01T00:00:00',(),(),'EPset_Drawing','EPset
55
FILE_SCHEMA(('IFC4'));
66
ENDSEC;
77
DATA;
8-
#1=IFCPROPERTYSETTEMPLATE('2JhNIvqZrFnAgxfhK0XVQX',$,'EPset_Drawing','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,#16,#17,#18));
8+
#1=IFCPROPERTYSETTEMPLATE('2JhNIvqZrFnAgxfhK0XVQX',$,'EPset_Drawing','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19));
99
#2=IFCSIMPLEPROPERTYTEMPLATE('23JavTMk98ZxXhrUEnjAcf',$,'TargetView','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
10-
#3=IFCSIMPLEPROPERTYTEMPLATE('1yVWUt5H9DAOuu0OaMMLpe',$,'Scale','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
11-
#4=IFCSIMPLEPROPERTYTEMPLATE('3gsuPBtU93b8f0gg1pjkq6',$,'HumanScale','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
10+
#3=IFCSIMPLEPROPERTYTEMPLATE('1yVWUt5H9DAOuu0OaMMLpe',$,'Scale','The scale of this drawing represented as a numerator and denominator, such as 1/100',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
11+
#4=IFCSIMPLEPROPERTYTEMPLATE('3gsuPBtU93b8f0gg1pjkq6',$,'HumanScale','The scale of this drawing in human readable format, such as 1:100',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
1212
#5=IFCSIMPLEPROPERTYTEMPLATE('0AK5C2UpL4$eaac2LszAx$',$,'HasUnderlay','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
1313
#6=IFCSIMPLEPROPERTYTEMPLATE('2j2ZEZR8X5tONm7kli5hM6',$,'HasLinework','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
1414
#7=IFCSIMPLEPROPERTYTEMPLATE('1ttChRysH9UuEX2FeMj5Hu',$,'HasAnnotation','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
@@ -23,5 +23,6 @@ DATA;
2323
#16=IFCSIMPLEPROPERTYTEMPLATE('1$xfo9EVb26QLqmPll2_RK',$,'MetricPrecision','',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.);
2424
#17=IFCSIMPLEPROPERTYTEMPLATE('38uAtrp9nD_901NO42zd$7',$,'ImperialPrecision','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
2525
#18=IFCSIMPLEPROPERTYTEMPLATE('1MX0uffTL6TOvtvEJpxFmk',$,'DecimalPlaces','',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.);
26+
#19=IFCSIMPLEPROPERTYTEMPLATE('0joEq0Rd10cxweEh0NeHT6',$,'JoinCriteria','Comma separated selection keys which determine what cut objects are to be joined.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
2627
ENDSEC;
2728
END-ISO-10303-21;

src/blenderbim/blenderbim/bim/module/drawing/operator.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,13 @@ def get_svg_classes(self, element):
816816
return classes
817817

818818
def merge_linework_and_add_metadata(self, root):
819+
join_criteria = ifcopenshell.util.element.get_pset(self.camera_element, "EPset_Drawing", "JoinCriteria")
820+
if join_criteria:
821+
join_criteria = join_criteria.split(",")
822+
else:
823+
# Drawing convention states that same objects classes with the same material are merged when cut.
824+
join_criteria = ["class", "material.Name", 'r"Pset.*Common"."Status"']
825+
819826
group = root.findall(".//{http://www.w3.org/2000/svg}g")[0]
820827
joined_paths = {}
821828

@@ -827,11 +834,18 @@ def merge_linework_and_add_metadata(self, root):
827834

828835
el.set("class", " ".join(classes))
829836

830-
material_name = [c for c in classes if c.split("-")[0] == "material"][0]
837+
keys = []
838+
for query in join_criteria:
839+
key = ifcopenshell.util.selector.get_element_value(element, query)
840+
if isinstance(key, (list, tuple)):
841+
keys.extend(key)
842+
else:
843+
keys.append(key)
844+
845+
hash_keys = hash(tuple(keys))
831846

832-
# Drawing convention states that objects with the same material are merged when cut.
833-
if material_name != "material-null" and el.findall("{http://www.w3.org/2000/svg}path"):
834-
joined_paths.setdefault(material_name, []).append(el)
847+
if el.findall("{http://www.w3.org/2000/svg}path"):
848+
joined_paths.setdefault(hash_keys, []).append(el)
835849

836850
for key, els in joined_paths.items():
837851
polygons = []

0 commit comments

Comments
 (0)