mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 06:57:28 -06:00
Merge pull request #3089 from fieldOfView/feature_support_mesh_enhancements
Support Mesh enhancements
This commit is contained in:
commit
4751de00ae
4 changed files with 115 additions and 27 deletions
|
@ -18,6 +18,9 @@ Item {
|
||||||
width: childrenRect.width;
|
width: childrenRect.width;
|
||||||
height: childrenRect.height;
|
height: childrenRect.height;
|
||||||
|
|
||||||
|
property var all_categories_except_support: [ "machine_settings", "resolution", "shell", "infill", "material", "speed",
|
||||||
|
"travel", "cooling", "platform_adhesion", "dual", "meshfix", "blackmagic", "experimental"]
|
||||||
|
|
||||||
Column
|
Column
|
||||||
{
|
{
|
||||||
id: items
|
id: items
|
||||||
|
@ -39,6 +42,13 @@ Item {
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UM.SettingPropertyProvider
|
||||||
|
{
|
||||||
|
id: meshTypePropertyProvider
|
||||||
|
containerStackId: Cura.MachineManager.activeMachineId
|
||||||
|
watchedProperties: [ "enabled" ]
|
||||||
|
}
|
||||||
|
|
||||||
ComboBox
|
ComboBox
|
||||||
{
|
{
|
||||||
id: meshTypeSelection
|
id: meshTypeSelection
|
||||||
|
@ -49,36 +59,55 @@ Item {
|
||||||
model: ListModel
|
model: ListModel
|
||||||
{
|
{
|
||||||
id: meshTypeModel
|
id: meshTypeModel
|
||||||
Component.onCompleted:
|
Component.onCompleted: meshTypeSelection.populateModel()
|
||||||
|
}
|
||||||
|
|
||||||
|
function populateModel()
|
||||||
{
|
{
|
||||||
meshTypeModel.append({
|
meshTypeModel.append({
|
||||||
type: "",
|
type: "",
|
||||||
text: catalog.i18nc("@label", "Normal model")
|
text: catalog.i18nc("@label", "Normal model")
|
||||||
});
|
});
|
||||||
|
meshTypePropertyProvider.key = "support_mesh";
|
||||||
|
if(meshTypePropertyProvider.properties.enabled == "True")
|
||||||
|
{
|
||||||
meshTypeModel.append({
|
meshTypeModel.append({
|
||||||
type: "support_mesh",
|
type: "support_mesh",
|
||||||
text: catalog.i18nc("@label", "Print as support")
|
text: catalog.i18nc("@label", "Print as support")
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
meshTypePropertyProvider.key = "anti_overhang_mesh";
|
||||||
|
if(meshTypePropertyProvider.properties.enabled == "True")
|
||||||
|
{
|
||||||
meshTypeModel.append({
|
meshTypeModel.append({
|
||||||
type: "anti_overhang_mesh",
|
type: "anti_overhang_mesh",
|
||||||
text: catalog.i18nc("@label", "Don't support overlap with other models")
|
text: catalog.i18nc("@label", "Don't support overlap with other models")
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
meshTypePropertyProvider.key = "cutting_mesh";
|
||||||
|
if(meshTypePropertyProvider.properties.enabled == "True")
|
||||||
|
{
|
||||||
meshTypeModel.append({
|
meshTypeModel.append({
|
||||||
type: "cutting_mesh",
|
type: "cutting_mesh",
|
||||||
text: catalog.i18nc("@label", "Modify settings for overlap with other models")
|
text: catalog.i18nc("@label", "Modify settings for overlap with other models")
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
meshTypePropertyProvider.key = "infill_mesh";
|
||||||
|
if(meshTypePropertyProvider.properties.enabled == "True")
|
||||||
|
{
|
||||||
meshTypeModel.append({
|
meshTypeModel.append({
|
||||||
type: "infill_mesh",
|
type: "infill_mesh",
|
||||||
text: catalog.i18nc("@label", "Modify settings for infill of other models")
|
text: catalog.i18nc("@label", "Modify settings for infill of other models")
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
meshTypeSelection.updateCurrentIndex();
|
meshTypeSelection.updateCurrentIndex();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
function updateCurrentIndex()
|
function updateCurrentIndex()
|
||||||
{
|
{
|
||||||
var mesh_type = UM.ActiveTool.properties.getValue("MeshType");
|
var mesh_type = UM.ActiveTool.properties.getValue("MeshType");
|
||||||
|
meshTypeSelection.currentIndex = -1;
|
||||||
for(var index=0; index < meshTypeSelection.model.count; index++)
|
for(var index=0; index < meshTypeSelection.model.count; index++)
|
||||||
{
|
{
|
||||||
if(meshTypeSelection.model.get(index).type == mesh_type)
|
if(meshTypeSelection.model.get(index).type == mesh_type)
|
||||||
|
@ -91,6 +120,16 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connections
|
||||||
|
{
|
||||||
|
target: Cura.MachineManager
|
||||||
|
onGlobalContainerChanged:
|
||||||
|
{
|
||||||
|
meshTypeSelection.model.clear();
|
||||||
|
meshTypeSelection.populateModel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Connections
|
Connections
|
||||||
{
|
{
|
||||||
target: UM.Selection
|
target: UM.Selection
|
||||||
|
@ -106,7 +145,7 @@ Item {
|
||||||
id: currentSettings
|
id: currentSettings
|
||||||
property int maximumHeight: 200 * screenScaleFactor
|
property int maximumHeight: 200 * screenScaleFactor
|
||||||
height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight)
|
height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight)
|
||||||
visible: ["support_mesh", "anti_overhang_mesh"].indexOf(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) == -1
|
visible: meshTypeSelection.model.get(meshTypeSelection.currentIndex).type != "anti_overhang_mesh"
|
||||||
|
|
||||||
ScrollView
|
ScrollView
|
||||||
{
|
{
|
||||||
|
@ -124,7 +163,15 @@ Item {
|
||||||
id: addedSettingsModel;
|
id: addedSettingsModel;
|
||||||
containerId: Cura.MachineManager.activeDefinitionId
|
containerId: Cura.MachineManager.activeDefinitionId
|
||||||
expanded: [ "*" ]
|
expanded: [ "*" ]
|
||||||
exclude: [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]
|
exclude: {
|
||||||
|
var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ];
|
||||||
|
|
||||||
|
if(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh")
|
||||||
|
{
|
||||||
|
excluded_settings = excluded_settings.concat(base.all_categories_except_support);
|
||||||
|
}
|
||||||
|
return excluded_settings;
|
||||||
|
}
|
||||||
|
|
||||||
visibilityHandler: Cura.PerObjectSettingVisibilityHandler
|
visibilityHandler: Cura.PerObjectSettingVisibilityHandler
|
||||||
{
|
{
|
||||||
|
@ -306,7 +353,18 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onClicked: settingPickDialog.visible = true;
|
onClicked:
|
||||||
|
{
|
||||||
|
settingPickDialog.visible = true;
|
||||||
|
if (meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh")
|
||||||
|
{
|
||||||
|
settingPickDialog.additional_excluded_settings = base.all_categories_except_support;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
settingPickDialog.additional_excluded_settings = []
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,9 +373,10 @@ Item {
|
||||||
id: settingPickDialog
|
id: settingPickDialog
|
||||||
|
|
||||||
title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
|
title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
|
||||||
width: screenScaleFactor * 360;
|
width: screenScaleFactor * 360
|
||||||
|
|
||||||
property string labelFilter: ""
|
property string labelFilter: ""
|
||||||
|
property var additional_excluded_settings
|
||||||
|
|
||||||
onVisibilityChanged:
|
onVisibilityChanged:
|
||||||
{
|
{
|
||||||
|
@ -396,7 +455,12 @@ Item {
|
||||||
}
|
}
|
||||||
visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
|
visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
|
||||||
expanded: [ "*" ]
|
expanded: [ "*" ]
|
||||||
exclude: [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]
|
exclude:
|
||||||
|
{
|
||||||
|
var excluded_settings = [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ];
|
||||||
|
excluded_settings = excluded_settings.concat(settingPickDialog.additional_excluded_settings);
|
||||||
|
return excluded_settings;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
delegate:Loader
|
delegate:Loader
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,6 +28,7 @@ class SolidView(View):
|
||||||
self._enabled_shader = None
|
self._enabled_shader = None
|
||||||
self._disabled_shader = None
|
self._disabled_shader = None
|
||||||
self._non_printing_shader = None
|
self._non_printing_shader = None
|
||||||
|
self._support_mesh_shader = None
|
||||||
|
|
||||||
self._extruders_model = ExtrudersModel()
|
self._extruders_model = ExtrudersModel()
|
||||||
self._theme = None
|
self._theme = None
|
||||||
|
@ -54,6 +55,11 @@ class SolidView(View):
|
||||||
self._non_printing_shader.setUniformValue("u_diffuseColor", Color(*self._theme.getColor("model_non_printing").getRgb()))
|
self._non_printing_shader.setUniformValue("u_diffuseColor", Color(*self._theme.getColor("model_non_printing").getRgb()))
|
||||||
self._non_printing_shader.setUniformValue("u_opacity", 0.6)
|
self._non_printing_shader.setUniformValue("u_opacity", 0.6)
|
||||||
|
|
||||||
|
if not self._support_mesh_shader:
|
||||||
|
self._support_mesh_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader"))
|
||||||
|
self._support_mesh_shader.setUniformValue("u_vertical_stripes", True)
|
||||||
|
self._support_mesh_shader.setUniformValue("u_width", 5.0)
|
||||||
|
|
||||||
global_container_stack = Application.getInstance().getGlobalContainerStack()
|
global_container_stack = Application.getInstance().getGlobalContainerStack()
|
||||||
if global_container_stack:
|
if global_container_stack:
|
||||||
support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value")
|
support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value")
|
||||||
|
@ -117,6 +123,16 @@ class SolidView(View):
|
||||||
renderer.queueNode(node, shader = self._non_printing_shader, transparent = True)
|
renderer.queueNode(node, shader = self._non_printing_shader, transparent = True)
|
||||||
elif getattr(node, "_outside_buildarea", False):
|
elif getattr(node, "_outside_buildarea", False):
|
||||||
renderer.queueNode(node, shader = self._disabled_shader)
|
renderer.queueNode(node, shader = self._disabled_shader)
|
||||||
|
elif per_mesh_stack and per_mesh_stack.getProperty("support_mesh", "value"):
|
||||||
|
# Render support meshes with a vertical stripe that is darker
|
||||||
|
shade_factor = 0.6
|
||||||
|
uniforms["diffuse_color_2"] = [
|
||||||
|
uniforms["diffuse_color"][0] * shade_factor,
|
||||||
|
uniforms["diffuse_color"][1] * shade_factor,
|
||||||
|
uniforms["diffuse_color"][2] * shade_factor,
|
||||||
|
1.0
|
||||||
|
]
|
||||||
|
renderer.queueNode(node, shader = self._support_mesh_shader, uniforms = uniforms)
|
||||||
else:
|
else:
|
||||||
renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms)
|
renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms)
|
||||||
if node.callDecoration("isGroup") and Selection.isSelected(node):
|
if node.callDecoration("isGroup") and Selection.isSelected(node):
|
||||||
|
|
|
@ -4233,6 +4233,18 @@
|
||||||
"limit_to_extruder": "support_infill_extruder_nr",
|
"limit_to_extruder": "support_infill_extruder_nr",
|
||||||
"enabled": "support_enable and support_use_towers",
|
"enabled": "support_enable and support_use_towers",
|
||||||
"settable_per_mesh": true
|
"settable_per_mesh": true
|
||||||
|
},
|
||||||
|
"support_mesh_drop_down":
|
||||||
|
{
|
||||||
|
"label": "Drop Down Support Mesh",
|
||||||
|
"description": "Make support everywhere below the support mesh, so that there's no overhang in the support mesh.",
|
||||||
|
"type": "bool",
|
||||||
|
"default_value": true,
|
||||||
|
"enabled": "support_mesh",
|
||||||
|
"settable_per_mesh": true,
|
||||||
|
"settable_per_extruder": false,
|
||||||
|
"settable_per_meshgroup": false,
|
||||||
|
"settable_globally": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -5261,18 +5273,6 @@
|
||||||
"settable_per_meshgroup": false,
|
"settable_per_meshgroup": false,
|
||||||
"settable_globally": false
|
"settable_globally": false
|
||||||
},
|
},
|
||||||
"support_mesh_drop_down":
|
|
||||||
{
|
|
||||||
"label": "Drop Down Support Mesh",
|
|
||||||
"description": "Make support everywhere below the support mesh, so that there's no overhang in the support mesh.",
|
|
||||||
"type": "bool",
|
|
||||||
"default_value": true,
|
|
||||||
"enabled": "support_mesh",
|
|
||||||
"settable_per_mesh": true,
|
|
||||||
"settable_per_extruder": false,
|
|
||||||
"settable_per_meshgroup": false,
|
|
||||||
"settable_globally": false
|
|
||||||
},
|
|
||||||
"anti_overhang_mesh":
|
"anti_overhang_mesh":
|
||||||
{
|
{
|
||||||
"label": "Anti Overhang Mesh",
|
"label": "Anti Overhang Mesh",
|
||||||
|
|
|
@ -32,6 +32,7 @@ fragment =
|
||||||
uniform highp vec3 u_viewPosition;
|
uniform highp vec3 u_viewPosition;
|
||||||
|
|
||||||
uniform mediump float u_width;
|
uniform mediump float u_width;
|
||||||
|
uniform mediump bool u_vertical_stripes;
|
||||||
|
|
||||||
varying highp vec3 v_position;
|
varying highp vec3 v_position;
|
||||||
varying highp vec3 v_vertex;
|
varying highp vec3 v_vertex;
|
||||||
|
@ -40,7 +41,9 @@ fragment =
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
mediump vec4 finalColor = vec4(0.0);
|
mediump vec4 finalColor = vec4(0.0);
|
||||||
mediump vec4 diffuseColor = (mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2;
|
mediump vec4 diffuseColor = u_vertical_stripes ?
|
||||||
|
(((mod(v_vertex.x, u_width) < (u_width / 2.)) ^^ (mod(v_vertex.z, u_width) < (u_width / 2.))) ? u_diffuseColor1 : u_diffuseColor2) :
|
||||||
|
((mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2);
|
||||||
|
|
||||||
/* Ambient Component */
|
/* Ambient Component */
|
||||||
finalColor += u_ambientColor;
|
finalColor += u_ambientColor;
|
||||||
|
@ -98,6 +101,7 @@ fragment41core =
|
||||||
uniform highp vec3 u_viewPosition;
|
uniform highp vec3 u_viewPosition;
|
||||||
|
|
||||||
uniform mediump float u_width;
|
uniform mediump float u_width;
|
||||||
|
uniform mediump bool u_vertical_stripes;
|
||||||
|
|
||||||
in highp vec3 v_position;
|
in highp vec3 v_position;
|
||||||
in highp vec3 v_vertex;
|
in highp vec3 v_vertex;
|
||||||
|
@ -108,7 +112,9 @@ fragment41core =
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
mediump vec4 finalColor = vec4(0.0);
|
mediump vec4 finalColor = vec4(0.0);
|
||||||
mediump vec4 diffuseColor = (mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2;
|
mediump vec4 diffuseColor = u_vertical_stripes ?
|
||||||
|
(((mod(v_vertex.x, u_width) < (u_width / 2.)) ^^ (mod(v_vertex.z, u_width) < (u_width / 2.))) ? u_diffuseColor1 : u_diffuseColor2) :
|
||||||
|
((mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2);
|
||||||
|
|
||||||
/* Ambient Component */
|
/* Ambient Component */
|
||||||
finalColor += u_ambientColor;
|
finalColor += u_ambientColor;
|
||||||
|
@ -138,6 +144,7 @@ u_diffuseColor2 = [0.5, 0.5, 0.5, 1.0]
|
||||||
u_specularColor = [0.4, 0.4, 0.4, 1.0]
|
u_specularColor = [0.4, 0.4, 0.4, 1.0]
|
||||||
u_shininess = 20.0
|
u_shininess = 20.0
|
||||||
u_width = 5.0
|
u_width = 5.0
|
||||||
|
u_vertical_stripes = 0
|
||||||
|
|
||||||
[bindings]
|
[bindings]
|
||||||
u_modelMatrix = model_matrix
|
u_modelMatrix = model_matrix
|
||||||
|
@ -145,7 +152,8 @@ u_viewProjectionMatrix = view_projection_matrix
|
||||||
u_normalMatrix = normal_matrix
|
u_normalMatrix = normal_matrix
|
||||||
u_viewPosition = view_position
|
u_viewPosition = view_position
|
||||||
u_lightPosition = light_0_position
|
u_lightPosition = light_0_position
|
||||||
u_diffuseColor = diffuse_color
|
u_diffuseColor1 = diffuse_color
|
||||||
|
u_diffuseColor2 = diffuse_color_2
|
||||||
|
|
||||||
[attributes]
|
[attributes]
|
||||||
a_vertex = vertex
|
a_vertex = vertex
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue