Draft: Draft_Layer new Material handling (#13949)

Discussion: #13657.

This PR adds  the ShapeAppearance view property to Draft Layers.

The DefaultShapeColor is used for the DiffuseColor of the ShapeAppearance material. Other material properties are not based on the preferences when a layer is created.

The old ShapeColor and Transparency properties remain (ShapeColor as a hidden property) and are kept in synch with the ShapeAppearance. This is consistent with how ShapeAppearance is implemented in Core.

The gui_layers.py and make_layer.py files do not have to be changed. They manipulate the vobj via the mentioned old properties.
This commit is contained in:
Roy-043
2024-05-28 09:45:05 +02:00
committed by GitHub
parent 3eb45b045c
commit 8bcbeae68b
2 changed files with 82 additions and 28 deletions

View File

@@ -30,6 +30,7 @@
# @{
from PySide.QtCore import QT_TRANSLATE_NOOP
import FreeCAD as App
from draftutils.messages import _wrn
from draftutils.translate import translate
@@ -61,24 +62,35 @@ class Layer:
"""Execute code when the document is restored."""
self.set_properties(obj)
if self.Type != "VisGroup":
return
if not hasattr(obj, "ViewObject"):
return
vobj = obj.ViewObject
if not vobj:
return
self.add_missing_properties_0v19(obj, vobj)
self.Type = "Layer"
def add_missing_properties_0v19(self, obj, vobj):
"""Update view properties."""
# It is not possible to change the property group of obj.Group.
for prop in ("DrawStyle", "LineColor", "LineWidth", "ShapeColor", "Transparency"):
vobj.setGroupOfProperty(prop, "Layer")
# ShapeAppearance property was added in v1.0, obj should be OK if it is present:
if hasattr(vobj, "ShapeAppearance"):
return
if self.Type == "VisGroup": # Type prior to v0.19.
self.Type = "Layer"
# It is not possible to change the property group of vobj.Group.
for prop in ("DrawStyle", "LineColor", "LineWidth", "ShapeColor", "Transparency"):
vobj.setGroupOfProperty(prop, "Layer")
vobj.Proxy.set_properties(vobj)
_wrn("v0.19, " + obj.Label + ", "
+ translate("draft", "added missing view properties"))
material = App.Material() # Material with default v0.21 properties.
material.DiffuseColor = vobj.ShapeColor
material.Transparency = vobj.Transparency / 100
vobj.ShapeAppearance = (material, )
vobj.setPropertyStatus("ShapeColor", "Hidden")
if hasattr(vobj, "OverrideShapeColorChildren"): # v0.19 - v0.21
vobj.OverrideShapeAppearanceChildren = vobj.OverrideShapeColorChildren
vobj.removeProperty("OverrideShapeColorChildren")
_wrn("v1.0, " + obj.Label + ", " + translate("draft", "updated view properties"))
def dumps(self):
"""Return a tuple of objects to save or None."""

View File

@@ -70,16 +70,16 @@ class ViewProviderLayer:
_tip)
vobj.OverrideLineColorChildren = True
if "OverrideShapeColorChildren" not in properties:
if "OverrideShapeAppearanceChildren" not in properties:
_tip = QT_TRANSLATE_NOOP("App::Property",
"If it is true, the objects contained "
"within this layer will adopt "
"the shape color of the layer")
"the shape appearance of the layer")
vobj.addProperty("App::PropertyBool",
"OverrideShapeColorChildren",
"OverrideShapeAppearanceChildren",
"Layer",
_tip)
vobj.OverrideShapeColorChildren = True
vobj.OverrideShapeAppearanceChildren = True
if "UsePrintColor" not in properties:
_tip = QT_TRANSLATE_NOOP("App::Property",
@@ -110,9 +110,22 @@ class ViewProviderLayer:
vobj.addProperty("App::PropertyColor",
"ShapeColor",
"Layer",
_tip)
_tip,
4) # Hidden
vobj.ShapeColor = params.get_param_view("DefaultShapeColor") & 0xFFFFFF00
if "ShapeAppearance" not in properties:
_tip = QT_TRANSLATE_NOOP("App::Property",
"The shape appearance of the objects "
"contained within this layer")
vobj.addProperty("App::PropertyMaterialList",
"ShapeAppearance",
"Layer",
_tip)
material = App.Material()
material.DiffuseColor = params.get_param_view("DefaultShapeColor") & 0xFFFFFF00
vobj.ShapeAppearance = (material, )
if "LineWidth" not in properties:
_tip = QT_TRANSLATE_NOOP("App::Property",
"The line width of the objects contained "
@@ -204,8 +217,8 @@ class ViewProviderLayer:
def updateData(self, obj, prop):
"""Execute when a property from the Proxy class is changed."""
if prop == "Group":
for _prop in ("LineColor", "ShapeColor", "LineWidth",
"DrawStyle", "Transparency", "Visibility"):
for _prop in ("LineColor", "ShapeAppearance", "LineWidth",
"DrawStyle", "Visibility"):
self.onChanged(obj.ViewObject, _prop)
def change_view_properties(self, vobj, prop):
@@ -222,7 +235,7 @@ class ViewProviderLayer:
# If the override properties are not set return without change
if prop == "LineColor" and not vobj.OverrideLineColorChildren:
return
elif prop == "ShapeColor" and not vobj.OverrideShapeColorChildren:
elif prop == "ShapeAppearance" and not vobj.OverrideShapeAppearanceChildren:
return
# This checks that the property exists in the target object,
@@ -243,20 +256,49 @@ class ViewProviderLayer:
def onChanged(self, vobj, prop):
"""Execute when a view property is changed."""
if (prop in ("LineColor", "ShapeColor", "LineWidth",
"DrawStyle", "Transparency", "Visibility")
if not hasattr(vobj, prop):
return
if prop == "ShapeColor":
if hasattr(vobj, "ShapeAppearance"):
material = vobj.ShapeAppearance[0]
if material.DiffuseColor != vobj.ShapeColor:
material.DiffuseColor = vobj.ShapeColor
vobj.ShapeAppearance = (material, )
# The changed ShapeAppearance will do the rest:
return
if prop == "Transparency":
if hasattr(vobj, "ShapeAppearance"):
material = vobj.ShapeAppearance[0]
if material.Transparency != vobj.Transparency / 100:
material.Transparency = vobj.Transparency / 100
vobj.ShapeAppearance = (material, )
# The changed ShapeAppearance will do the rest:
return
if (prop == "ShapeAppearance"
and hasattr(vobj, "ShapeColor")
and hasattr(vobj, "Transparency")):
material = vobj.ShapeAppearance[0]
if material.DiffuseColor != vobj.ShapeColor:
vobj.ShapeColor = material.DiffuseColor
if material.Transparency != vobj.Transparency / 100:
vobj.Transparency = int(material.Transparency * 100)
if (prop in ("LineColor", "ShapeAppearance", "LineWidth",
"DrawStyle", "Visibility")
and hasattr(vobj, "OverrideLineColorChildren")
and hasattr(vobj, "OverrideShapeColorChildren")):
and hasattr(vobj, "OverrideShapeAppearanceChildren")):
self.change_view_properties(vobj, prop)
if (prop in ("LineColor", "ShapeColor")
# Paint the layer icon in the tree view:
if (prop in ("LineColor", "ShapeAppearance")
and hasattr(vobj, "LineColor")
and hasattr(vobj, "ShapeColor")):
# This doesn't do anything to the objects inside the layer,
# it just uses the defined Line and Shape colors
# to paint the layer icon accordingly in the tree view
and hasattr(vobj, "ShapeAppearance")):
l_color = vobj.LineColor
s_color = vobj.ShapeColor
s_color = vobj.ShapeAppearance[0].DiffuseColor
l_color = QtGui.QColor(int(l_color[0] * 255),
int(l_color[1] * 255),