diff --git a/src/Mod/PartDesign/App/FeatureHole.cpp b/src/Mod/PartDesign/App/FeatureHole.cpp
index 3ab0b56bdb..136b4e7e93 100644
--- a/src/Mod/PartDesign/App/FeatureHole.cpp
+++ b/src/Mod/PartDesign/App/FeatureHole.cpp
@@ -637,9 +637,23 @@ void Hole::onChanged(const App::Property *prop)
ThreadFit.setReadOnly(Threaded.getValue());
ThreadClass.setReadOnly(!Threaded.getValue());
Diameter.setReadOnly(true);
- HoleCutDiameter.setReadOnly(true);
- HoleCutDepth.setReadOnly(true);
- HoleCutCountersinkAngle.setReadOnly(true);
+
+ if (holeCutType == "None") {
+ HoleCutDiameter.setReadOnly(true);
+ HoleCutDepth.setReadOnly(true);
+ HoleCutCountersinkAngle.setReadOnly(true);
+ }
+ else if (holeCutType == "Counterbore") {
+ HoleCutDiameter.setReadOnly(true);
+ HoleCutDepth.setReadOnly(false);
+ HoleCutCountersinkAngle.setReadOnly(true);
+
+ }
+ else if (holeCutType == "Countersink") {
+ HoleCutDiameter.setReadOnly(false);
+ HoleCutDepth.setReadOnly(true);
+ HoleCutCountersinkAngle.setReadOnly(true);
+ }
}
else if ( type == "ISOMetricFineProfile" ) {
ThreadSize.setEnums(ThreadSize_ISOmetricfine_Enums);
@@ -652,9 +666,23 @@ void Hole::onChanged(const App::Property *prop)
ThreadFit.setReadOnly(Threaded.getValue());
ThreadClass.setReadOnly(!Threaded.getValue());
Diameter.setReadOnly(true);
- HoleCutDiameter.setReadOnly(true);
- HoleCutDepth.setReadOnly(true);
- HoleCutCountersinkAngle.setReadOnly(true);
+
+ if (holeCutType == "None") {
+ HoleCutDiameter.setReadOnly(true);
+ HoleCutDepth.setReadOnly(true);
+ HoleCutCountersinkAngle.setReadOnly(true);
+ }
+ else if (holeCutType == "Counterbore") {
+ HoleCutDiameter.setReadOnly(true);
+ HoleCutDepth.setReadOnly(false);
+ HoleCutCountersinkAngle.setReadOnly(true);
+
+ }
+ else if (holeCutType == "Countersink") {
+ HoleCutDiameter.setReadOnly(false);
+ HoleCutDepth.setReadOnly(true);
+ HoleCutCountersinkAngle.setReadOnly(true);
+ }
}
else if ( type == "UNC" ) {
ThreadSize.setEnums(ThreadSize_UNC_Enums);
@@ -824,21 +852,28 @@ void Hole::onChanged(const App::Property *prop)
threadType = ThreadType.getValueAsString();
if (HoleCutType.isValid())
holeCutType = HoleCutType.getValueAsString();
- bool holeCutEnable = ( threadType != "ISOMetricProfile" &&
- threadType !="ISOMetricFineProfile" &&
- (holeCutType != "None"));
-
- HoleCutDiameter.setReadOnly(!holeCutEnable);
+ bool holeCutEnable = (holeCutType != "None");
+
+ // HoleCutDiameter is only allowed for countersinks or counterbores with UTS or no profile
+ if (holeCutType == "None")
+ HoleCutDiameter.setReadOnly(true);
+ else if (threadType != "ISOMetricProfile" && threadType != "ISOMetricFineProfile")
+ HoleCutDiameter.setReadOnly(false);
+ else if (holeCutType == "Countersink" || holeCutType == "Countersink socket screw")
+ HoleCutDiameter.setReadOnly(false);
+ else
+ HoleCutDiameter.setReadOnly(true);
+ // HoleCutDepth can always be changed if there is a cut
if (holeCutType == "Countersink" || holeCutType == "Countersink socket screw")
HoleCutDepth.setReadOnly(true);
else
HoleCutDepth.setReadOnly(!holeCutEnable);
-
- if (holeCutType != "Countersink" && holeCutType != "Countersink socket screw")
- HoleCutCountersinkAngle.setReadOnly(true);
- else
- HoleCutCountersinkAngle.setReadOnly(!holeCutEnable);
+ // HoleCutCountersinkAngle is only allowed for countersinks with UTS or no profile
+ HoleCutCountersinkAngle.setReadOnly(true);
+ if ((holeCutType == "Countersink" || holeCutType == "Countersink socket screw")
+ && (threadType != "ISOMetricProfile" && threadType != "ISOMetricFineProfile"))
+ HoleCutCountersinkAngle.setReadOnly(false);
updateHoleCutParams();
}
diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp b/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp
index 733ba79920..f5ea93da86 100644
--- a/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp
+++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp
@@ -105,10 +105,16 @@ TaskHoleParameters::TaskHoleParameters(ViewProviderHole *HoleView, QWidget *pare
// Fit is only enabled (sensible) if not threaded
ui->ThreadFit->setEnabled(!pcHole->Threaded.getValue());
ui->Diameter->setValue(pcHole->Diameter.getValue());
+ // Diameter is only enabled if ThreadType is None
+ if (pcHole->ThreadType.getValue() != 0L)
+ ui->Diameter->setEnabled(false);
if (pcHole->ThreadDirection.getValue() == 0L)
ui->directionRightHand->setChecked(true);
else
ui->directionLeftHand->setChecked(true);
+ // ThreadDirection is only sensible if there is a thread
+ ui->directionRightHand->setEnabled(pcHole->Threaded.getValue());
+ ui->directionLeftHand->setEnabled(pcHole->Threaded.getValue());
ui->HoleCutType->clear();
cursor = pcHole->HoleCutType.getEnums();
while (*cursor) {
@@ -119,6 +125,32 @@ TaskHoleParameters::TaskHoleParameters(ViewProviderHole *HoleView, QWidget *pare
ui->HoleCutDiameter->setValue(pcHole->HoleCutDiameter.getValue());
ui->HoleCutDepth->setValue(pcHole->HoleCutDepth.getValue());
ui->HoleCutCountersinkAngle->setValue(pcHole->HoleCutCountersinkAngle.getValue());
+
+ // only enable allowed values for hole cuts:
+ bool holeCutEnable = (pcHole->HoleCutType.getValue() != 0L);
+ QByteArray TypeClass = ui->ThreadType->itemData(pcHole->ThreadType.getValue()).toByteArray();
+
+ // HoleCutDiameter is only allowed for countersinks or counterbores with UTS or no profile
+ if (pcHole->HoleCutType.getValue() == 0L) // no cut
+ ui->HoleCutDiameter->setEnabled(false);
+ else if (TypeClass != QByteArray("ISO"))
+ ui->HoleCutDiameter->setEnabled(true);
+ else if (pcHole->HoleCutType.getValue() == 2L || pcHole->HoleCutType.getValue() == 4L) {
+ ui->HoleCutDiameter->setEnabled(true);
+ }
+ else
+ ui->HoleCutDiameter->setEnabled(false);
+ // HoleCutDepth can always be changed if there is a cut
+ if (pcHole->HoleCutType.getValue() == 2L || pcHole->HoleCutType.getValue() == 4L)
+ ui->HoleCutDepth->setEnabled(false);
+ else
+ ui->HoleCutDepth->setEnabled(holeCutEnable);
+ // HoleCutCountersinkAngle is only allowed for countersinks with UTS or no profile
+ ui->HoleCutCountersinkAngle->setEnabled(false);
+ if ((pcHole->HoleCutType.getValue() == 2L || pcHole->HoleCutType.getValue() == 4L)
+ && TypeClass != QByteArray("ISO"))
+ ui->HoleCutCountersinkAngle->setEnabled(true);
+
ui->DepthType->setCurrentIndex(pcHole->DepthType.getValue());
ui->Depth->setValue(pcHole->Depth.getValue());
if (pcHole->DrillPoint.getValue() == 0L)
diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.ui b/src/Mod/PartDesign/Gui/TaskHoleParameters.ui
index 14ab5d8fd2..2127434a3d 100644
--- a/src/Mod/PartDesign/Gui/TaskHoleParameters.ui
+++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.ui
@@ -14,43 +14,55 @@
Task Hole Parameters
- -
-
-
-
-
- Standard fit
-
-
- -
-
- Close fit
-
-
-
-
- -
-
+
-
+
- Countersink angle
+ <b>Misc</b>
- -
-
-
- -
-
+
-
+
false
- mm
+ deg
- -
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Type
+
+
+
+ -
+ -
+
+
+
+ 0
+ 0
+
+
+
+ <b>Drill point</b>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+
+
+
-
@@ -58,7 +70,7 @@
- -
+
-
false
@@ -68,30 +80,61 @@
- -
-
-
-
- 0
- 0
-
+
-
+
+
+ false
- Direction
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+ Cutoff outer
- -
-
-
- Threaded
+
-
+
+
+ false
+
+
+ mm
- -
+
-
+
+
+ false
+
+
+ Cutoff inner
+
+
+
+ -
+
+
+ mm
+
+
+
+ -
+
+
+ mm
+
+
+
+ -
+
+
+ Qt::NoContextMenu
+
+
+ mm
+
+
+
+ -
@@ -149,11 +192,8 @@
- -
-
-
- -
-
+
-
+
false
@@ -162,10 +202,17 @@
- -
-
+
-
+
+
+ mm
+
+
+
+ -
+
- <b>Misc</b>
+ Reversed
@@ -182,47 +229,7 @@
- -
-
-
- Reversed
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Size
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Profile
-
-
-
- -
-
-
- Diameter
-
-
-
- -
+
-
@@ -235,13 +242,6 @@
- -
-
-
- mm
-
-
-
-
@@ -255,10 +255,119 @@
- -
-
+
-
+
+
+ Diameter
+
+
+
+ -
+
+
+ <b>Threading and size</b>
+
+
+
+ -
+
- mm
+ deg
+
+
+
+ -
+
+
+ Tolerance class for threaded holes according to the hole profile
+
+
+
+ -
+
+
+ deg
+
+
+
+ -
+
+
+ Threaded
+
+
+
+ -
+
+
+ Tapered
+
+
+
+ -
+
+
+ false
+
+
+ Angle
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
-
+
+ Dimension
+
+
+ -
+
+ Through all
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ Type
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+
+
+
+ -
+
+
+ Countersink angle
+
+
+
+ -
+
+
+ Depth
+
+
+
+ -
+
+
+ <b>Hole cut</b>
@@ -272,14 +381,36 @@
- -
-
+
-
+
+
+
+ 0
+ 0
+
+
- <b>Hole cut</b>
+ Profile
- -
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Direction
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+
+
+
+ -
@@ -314,35 +445,25 @@
- -
-
-
- Depth
-
-
-
- -
-
-
-
- 0
- 0
-
+
-
+
+
+ Hole fit, only available for holes without thread
-
- Dimension
+ Standard fit
-
- Through all
+ Close fit
- -
-
+
-
+
0
@@ -350,81 +471,11 @@
- <b>Drill point</b>
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+ Size
- -
-
-
- false
-
-
- Cutoff inner
-
-
-
- -
-
-
- false
-
-
- Angle
-
-
-
- -
-
-
- false
-
-
- Cutoff outer
-
-
-
- -
-
-
- -
-
-
- Tapered
-
-
-
- -
-
-
- mm
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Type
-
-
-
- -
-
-
- <b>Threading and size</b>
-
-
-
- -
+
-
false
@@ -434,46 +485,18 @@
- -
-
-
- deg
+
-
+
+
+ Qt::Horizontal
-
-
- -
-
-
- false
+
+
+ 40
+ 20
+
-
- deg
-
-
-
- -
-
-
- Type
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
-
-
-
- -
-
-
- deg
-
-
-
- -
-
-
- mm
-
-
+