From d29fd7d9cb9fb280a1eb47f55e3c73c46d637ba2 Mon Sep 17 00:00:00 2001 From: helaslo Date: Mon, 22 Feb 2021 19:57:43 +0100 Subject: [PATCH] [OpenSCAD] Fix colors not working correctly when polygons are extruded --- src/Mod/OpenSCAD/importCSG.py | 69 +++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/src/Mod/OpenSCAD/importCSG.py b/src/Mod/OpenSCAD/importCSG.py index 07f33ff1b9..9cc14792e4 100644 --- a/src/Mod/OpenSCAD/importCSG.py +++ b/src/Mod/OpenSCAD/importCSG.py @@ -50,13 +50,46 @@ from OpenSCADUtils import * params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD") printverbose = params.GetBool('printVerbose',False) - +hassetcolor=[] +alreadyhidden=[] printverbose = True # Get the token map from the lexer. This is required. import tokrules from tokrules import tokens +def shallHide(subject): + for obj in subject.OutListRecursive: + if "Matrix_Union" in str(obj.FullName): + return False + if "Extrude" in str(obj.FullName): + return True + return False + +def setColorRecursively(obj,color,transp): + if(obj.TypeId=="Part::Fuse" or obj.TypeId=="Part::MultiFuse"): + for currentObject in obj.OutList: + if (currentObject.TypeId=="Part::Fuse" or currentObject.TypeId=="Part::MultiFuse"): + setColorRecursively(currentObject,color,transp) + else: + print("Fixing up colors for: "+str(currentObject.FullName)) + if(currentObject not in hassetcolor): + currentObject.ViewObject.ShapeColor=color + currentObject.ViewObject.Transparency=transp + setColorRecursively(currentObject,color,transp) + else: + setColorRecursively(currentObject,color,transp) + +def fixVisibility(): + for obj in FreeCAD.ActiveDocument.Objects: + if(( obj.TypeId=="Part::Fuse" or obj.TypeId=="Part::MultiFuse") and shallHide(obj)): + if "Group" in obj.FullName: + alreadyhidden.append(obj) + obj.ViewObject.Visibility=False + for currentObject in obj.OutList: + if(currentObject not in alreadyhidden): + currentObject.ViewObject.Visibility=True + if gui: try: _encoding = QtGui.QApplication.UnicodeUTF8 @@ -146,6 +179,9 @@ def processcsg(filename): if printverbose: print('End Parser') print(result) + fixVisibility() + hassetcolor.clear() + alreadyhidden.clear() FreeCAD.Console.PrintMessage('End processing CSG file\n') doc.recompute() @@ -179,6 +215,7 @@ def p_group_action1(p): else : p[0] = p[5] + def p_group_action2(p) : 'group_action2 : group LPAREN RPAREN SEMICOL' if printverbose: print("Group2") @@ -490,8 +527,27 @@ def p_color_action(p): transp = 100 - int(math.floor(100*float(p[3][3]))) #Alpha if gui: for obj in p[6]: - obj.ViewObject.ShapeColor =color - obj.ViewObject.Transparency = transp + if shallHide(obj): + if "Group" in obj.FullName: + obj.ViewObject.Visibility=False + alreadyhidden.append(obj) + if(obj.TypeId=="Part::Fuse" or obj.TypeId=="Part::MultiFuse"): + for currentObject in obj.OutList: + if (currentObject.TypeId=="Part::Fuse" or currentObject.TypeId=="Part::MultiFuse"): + setColorRecursively(currentObject,color,transp) + if(currentObject not in hassetcolor): + currentObject.ViewObject.ShapeColor=color + currentObject.ViewObject.Transparency=transp + setColorRecursively(currentObject,color,transp) + else: + setColorRecursively(currentObject,color,transp) + else: + obj.ViewObject.ShapeColor =color + obj.ViewObject.Transparency = transp + else: + obj.ViewObject.ShapeColor =color + obj.ViewObject.Transparency = transp + hassetcolor.append(obj) p[0] = p[6] # Error rule for syntax errors @@ -794,6 +850,10 @@ def p_multmatrix_action(p): transform_matrix = FreeCAD.Matrix() if printverbose: print("Multmatrix") if printverbose: print(p[3]) + if gui: + parentcolor=p[6][0].ViewObject.ShapeColor + parenttransparency=p[6][0].ViewObject.Transparency + m1l=sum(p[3],[]) if any('x' in me for me in m1l): #hexfloats m1l=[float.fromhex(me) for me in m1l] @@ -873,6 +933,9 @@ def p_multmatrix_action(p): p[0] = [newobj] else : p[0] = [new_part] + if gui: + new_part.ViewObject.ShapeColor=parentcolor + new_part.ViewObject.Transparency = parenttransparency if printverbose: print("Multmatrix applied") def p_matrix(p):