add_mesh_representation - option to force faceted breps

This commit is contained in:
Andrej730
2024-03-21 14:42:42 +05:00
parent 1b1eccb0c1
commit a5daf4177a
2 changed files with 28 additions and 5 deletions
@@ -20,7 +20,7 @@ import ifcopenshell.util.unit
class Usecase: class Usecase:
def __init__(self, file, **settings): def __init__(self, file: ifcopenshell.file, **settings):
self.file = file self.file = file
self.settings = { self.settings = {
"context": None, # IfcGeometricRepresentationContext "context": None, # IfcGeometricRepresentationContext
@@ -33,6 +33,7 @@ class Usecase:
"faces": None, # A list of polygons, represented by vertex indices "faces": None, # A list of polygons, represented by vertex indices
"coordinate_offset": None, # Optionally apply a vector offset to all coordinates "coordinate_offset": None, # Optionally apply a vector offset to all coordinates
"unit_scale": None, # A scale factor to apply for all vectors in case the unit is different "unit_scale": None, # A scale factor to apply for all vectors in case the unit is different
"force_faceted_brep": False, # Force using IfcFacetedBreps instead of IfcPolygonalFaceSets
} }
for key, value in settings.items(): for key, value in settings.items():
self.settings[key] = value self.settings[key] = value
@@ -43,7 +44,7 @@ class Usecase:
return self.create_mesh_representation() return self.create_mesh_representation()
def create_mesh_representation(self): def create_mesh_representation(self):
if self.file.schema == "IFC2X3": if self.settings["force_faceted_brep"] or self.file.schema == "IFC2X3":
return self.create_faceted_brep() return self.create_faceted_brep()
return self.create_polygonal_face_set() return self.create_polygonal_face_set()
@@ -17,14 +17,24 @@
# along with IfcPatch. If not, see <http://www.gnu.org/licenses/>. # along with IfcPatch. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell import ifcopenshell
import ifcopenshell.api
import ifcopenshell.geom import ifcopenshell.geom
import ifcopenshell.util.selector import ifcopenshell.util.selector
import ifcopenshell.util.shape
import ifcopenshell.util.representation import ifcopenshell.util.representation
import multiprocessing import multiprocessing
from logging import Logger
class Patcher: class Patcher:
def __init__(self, src, file, logger, query="IfcBeam"): def __init__(
self,
src: str,
file: ifcopenshell.file,
logger: Logger,
query: str = "IfcBeam",
force_faceted_brep: bool = False,
):
"""Convert element body representations to tessellations or faceted breps """Convert element body representations to tessellations or faceted breps
Some software have bugs that result in incorrect geometry being Some software have bugs that result in incorrect geometry being
@@ -35,16 +45,23 @@ class Patcher:
See example bug: https://github.com/Autodesk/revit-ifc/issues/707 See example bug: https://github.com/Autodesk/revit-ifc/issues/707
:param query: Query string to filter out elements to convert, defaults to "IfcBeam"
:type query: str
:param force_faceted_brep: Force using IfcFacetedBreps instead of IfcPolygonalFaceSets,
defaults to `False`
:type force_faceted_brep: bool
Example: Example:
.. code:: python .. code:: python
ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "TessellateElements", "arguments": ["IfcBeam"]}) ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "TessellateElements", "arguments": ["IfcBeam", False]})
""" """
self.src = src self.src = src
self.file = file self.file = file
self.logger = logger self.logger = logger
self.query = query self.query = query
self.force_faceted_brep = force_faceted_brep
def patch(self): def patch(self):
context = ifcopenshell.util.representation.get_context(self.file, "Model", "Body", "MODEL_VIEW") context = ifcopenshell.util.representation.get_context(self.file, "Model", "Body", "MODEL_VIEW")
@@ -68,7 +85,12 @@ class Patcher:
for element, geometry in replacements.items(): for element, geometry in replacements.items():
v, f = geometry v, f = geometry
mesh = ifcopenshell.api.run( mesh = ifcopenshell.api.run(
"geometry.add_mesh_representation", self.file, context=context, vertices=v, faces=f "geometry.add_mesh_representation",
self.file,
context=context,
vertices=v,
faces=f,
force_faceted_brep=self.force_faceted_brep,
) )
representations = element.Representation.Representations representations = element.Representation.Representations
representations = [r for r in representations if r.ContextOfItems != context] representations = [r for r in representations if r.ContextOfItems != context]