mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 23:36:20 +00:00
Fix #4921. When upgrading to IFC4X3, preprocess the file to remove deprecated style assignments
This commit is contained in:
@@ -48,6 +48,8 @@ class GeoreferenceData:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def coordinate_operation_class(cls):
|
def coordinate_operation_class(cls):
|
||||||
|
if tool.Ifc.get_schema() == "IFC2X3":
|
||||||
|
return []
|
||||||
declaration = tool.Ifc.schema().declaration_by_name("IfcCoordinateOperation")
|
declaration = tool.Ifc.schema().declaration_by_name("IfcCoordinateOperation")
|
||||||
declarations = ifcopenshell.util.schema.get_subtypes(declaration)
|
declarations = ifcopenshell.util.schema.get_subtypes(declaration)
|
||||||
names = [d.name() for d in declarations]
|
names = [d.name() for d in declarations]
|
||||||
|
|||||||
@@ -16,11 +16,9 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
|
||||||
import bpy
|
import bpy
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import blenderbim.core.tool
|
import blenderbim.core.tool
|
||||||
import blenderbim.tool as tool
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import ifcpatch
|
import ifcpatch
|
||||||
@@ -31,6 +29,5 @@ except:
|
|||||||
class Patch(blenderbim.core.tool.Patch):
|
class Patch(blenderbim.core.tool.Patch):
|
||||||
@classmethod
|
@classmethod
|
||||||
def run_migrate_patch(cls, infile, outfile, schema):
|
def run_migrate_patch(cls, infile, outfile, schema):
|
||||||
log = os.path.join(bpy.context.scene.BIMProperties.data_dir, "process.log")
|
|
||||||
output = ifcpatch.execute({"input": infile, "file": ifcopenshell.open(infile), "recipe": "Migrate", "arguments": [schema]})
|
output = ifcpatch.execute({"input": infile, "file": ifcopenshell.open(infile), "recipe": "Migrate", "arguments": [schema]})
|
||||||
ifcpatch.write(output, outfile)
|
ifcpatch.write(output, outfile)
|
||||||
|
|||||||
@@ -223,6 +223,21 @@ class Migrator:
|
|||||||
"User": None,
|
"User": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def preprocess(self, old_file, new_file):
|
||||||
|
if old_file.schema == "IFC4" and new_file.schema == "IFC4X3":
|
||||||
|
# In IFC4 -> IFC4X3, IfcPresentationStyleAssignment is deprecated
|
||||||
|
to_delete = set()
|
||||||
|
for assignment in old_file.by_type("IfcPresentationStyleAssignment"):
|
||||||
|
for styled_item in old_file.get_inverse(assignment):
|
||||||
|
if not styled_item.is_a("IfcStyledItem"):
|
||||||
|
continue
|
||||||
|
styled_item.Styles = [
|
||||||
|
s for s in styled_item.Styles if s.is_a("IfcPresentationStyle")
|
||||||
|
] + list(assignment.Styles)
|
||||||
|
to_delete.add(assignment)
|
||||||
|
for element in to_delete:
|
||||||
|
old_file.remove(element)
|
||||||
|
|
||||||
def migrate(
|
def migrate(
|
||||||
self, element: ifcopenshell.entity_instance, new_file: ifcopenshell.file
|
self, element: ifcopenshell.entity_instance, new_file: ifcopenshell.file
|
||||||
) -> ifcopenshell.entity_instance:
|
) -> ifcopenshell.entity_instance:
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ class Patcher:
|
|||||||
def patch(self):
|
def patch(self):
|
||||||
self.file_patched = ifcopenshell.file(schema=self.schema)
|
self.file_patched = ifcopenshell.file(schema=self.schema)
|
||||||
migrator = ifcopenshell.util.schema.Migrator()
|
migrator = ifcopenshell.util.schema.Migrator()
|
||||||
|
migrator.preprocess(self.file, self.file_patched)
|
||||||
for element in self.file:
|
for element in self.file:
|
||||||
new_element = migrator.migrate(element, self.file_patched)
|
new_element = migrator.migrate(element, self.file_patched)
|
||||||
print("Migrating", element)
|
print("Migrating", element)
|
||||||
|
|||||||
Reference in New Issue
Block a user