From 5da9197bc594baf37480f46f4612867880136972 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 Jan 2020 11:39:36 +1100 Subject: [PATCH] Import transparent and IFC4 colours --- src/Mod/Arch/importIFC.py | 7 +++++-- src/Mod/Arch/importIFCHelper.py | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Mod/Arch/importIFC.py b/src/Mod/Arch/importIFC.py index 57f530837f..bd6e343660 100644 --- a/src/Mod/Arch/importIFC.py +++ b/src/Mod/Arch/importIFC.py @@ -799,9 +799,12 @@ def insert(filename,docname,skip=[],only=[],root=None,preferences=None): # color - if FreeCAD.GuiUp and (pid in colors) and hasattr(obj.ViewObject,"ShapeColor"): + if FreeCAD.GuiUp and (pid in colors) and colors[pid]: # if preferences['DEBUG']: print(" setting color: ",int(colors[pid][0]*255),"/",int(colors[pid][1]*255),"/",int(colors[pid][2]*255)) - obj.ViewObject.ShapeColor = colors[pid] + if hasattr(obj.ViewObject,"ShapeColor"): + obj.ViewObject.ShapeColor = tuple(colors[pid][0:3]) + if hasattr(obj.ViewObject,"Transparency"): + obj.ViewObject.Transparency = colors[pid][3] # if preferences['DEBUG'] is on, recompute after each shape if preferences['DEBUG']: FreeCAD.ActiveDocument.recompute() diff --git a/src/Mod/Arch/importIFCHelper.py b/src/Mod/Arch/importIFCHelper.py index d825142314..74e346e2ac 100644 --- a/src/Mod/Arch/importIFCHelper.py +++ b/src/Mod/Arch/importIFCHelper.py @@ -347,6 +347,7 @@ def getColorFromStyledItem(styled_item): return None rgb_color = None + transparency = None # print(styled_item) # The IfcStyledItem holds presentation style information for products, @@ -370,7 +371,11 @@ def getColorFromStyledItem(styled_item): # never seen an ifc with more than one Styles in IfcStyledItem else: # get the IfcPresentationStyleAssignment, there should only be one, see above - assign_style = styled_item.Styles[0] + if styled_item.Styles[0].is_a('IfcPresentationStyleAssignment'): + assign_style = styled_item.Styles[0] + else: + # IfcPresentationStyleAssignment is deprecated in IFC4. + assign_style = styled_item # print(assign_style) # IfcPresentationStyleAssignment # IfcPresentationStyleAssignment can hold various kinde and count of styles @@ -380,6 +385,10 @@ def getColorFromStyledItem(styled_item): # print(assign_style.Styles[0].Styles[0]) # IfcSurfaceStyleRendering rgb_color = assign_style.Styles[0].Styles[0].SurfaceColour # IfcColourRgb # print(rgb_color) + if assign_style.Styles[0].Styles[0].is_a('IfcSurfaceStyleShading') \ + and hasattr(assign_style.Styles[0].Styles[0], 'Transparency') \ + and assign_style.Styles[0].Styles[0].Transparency: + transparency = assign_style.Styles[0].Styles[0].Transparency * 100 elif assign_style.Styles[0].is_a("IfcCurveStyle"): if ( len(assign_style.Styles) == 2 @@ -398,7 +407,8 @@ def getColorFromStyledItem(styled_item): rgb_color = assign_style.Styles[0].CurveColour if rgb_color is not None: - col = rgb_color.Red, rgb_color.Green, rgb_color.Blue + col = [rgb_color.Red, rgb_color.Green, rgb_color.Blue] + col.append(int(transparency) if transparency else 0) # print(col) else: col = None