View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000622 | PartDesign | Feature | public | 2012-03-05 21:17 | 2021-02-06 06:43 |
Reporter | electronlibre | Assigned To | |||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | confirmed | Resolution | open | ||
Product Version | 0.12 | ||||
Target Version | 0.20 | ||||
Summary | 0000622: Add taper angle feature in pad and pocket | ||||
Description | It would be nice to have a taper angle option in pad and pocket tools (Part design workbench), similar to that on Extrude (Part WB). | ||||
Tags | No tags attached. | ||||
FreeCAD Information | |||||
2012-04-29 05:53
|
TaperAngle_Pad.patch (27,938 bytes)
From a5036f1b89097d597cde84d6ff4605eca17120fe Mon Sep 17 00:00:00 2001 From: Jonathan Hahn <Jonathan.Hahn@t-online.de> Date: Sun, 29 Apr 2012 09:45:19 +0200 Subject: [PATCH 1/2] adds TaperAngle to Pad --- src/Mod/PartDesign/App/FeaturePad.cpp | 421 +++++++++++++++----------- src/Mod/PartDesign/App/FeaturePad.h | 1 + src/Mod/PartDesign/Gui/TaskPadParameters.cpp | 39 ++- src/Mod/PartDesign/Gui/TaskPadParameters.h | 12 +- src/Mod/PartDesign/Gui/TaskPadParameters.ui | 35 ++- 5 files changed, 308 insertions(+), 200 deletions(-) diff --git a/src/Mod/PartDesign/App/FeaturePad.cpp b/src/Mod/PartDesign/App/FeaturePad.cpp index 1a12c45..80075be 100644 --- a/src/Mod/PartDesign/App/FeaturePad.cpp +++ b/src/Mod/PartDesign/App/FeaturePad.cpp @@ -1,184 +1,239 @@ -/*************************************************************************** - * Copyright (c) 2010 Juergen Riegel <FreeCAD@juergen-riegel.net> * - * * - * This file is part of the FreeCAD CAx development system. * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Library General Public * - * License as published by the Free Software Foundation; either * - * version 2 of the License, or (at your option) any later version. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU Library General Public License for more details. * - * * - * You should have received a copy of the GNU Library General Public * - * License along with this library; see the file COPYING.LIB. If not, * - * write to the Free Software Foundation, Inc., 59 Temple Place, * - * Suite 330, Boston, MA 02111-1307, USA * - * * - ***************************************************************************/ - - -#include "PreCompiled.h" -#ifndef _PreComp_ -//# include <Bnd_Box.hxx> -//# include <gp_Pln.hxx> -# include <BRep_Builder.hxx> -# include <BRepBndLib.hxx> -# include <BRepPrimAPI_MakePrism.hxx> -# include <BRepBuilderAPI_Copy.hxx> -# include <BRepBuilderAPI_MakeFace.hxx> -//# include <Geom_Plane.hxx> -# include <Handle_Geom_Surface.hxx> -# include <TopoDS.hxx> -# include <TopoDS_Solid.hxx> -# include <TopoDS_Face.hxx> -# include <TopoDS_Wire.hxx> -# include <TopExp_Explorer.hxx> -# include <BRepAlgoAPI_Fuse.hxx> -# include <Precision.hxx> -#endif - -#include <Base/Placement.h> -#include <Mod/Part/App/Part2DObject.h> - -#include "FeaturePad.h" - - -using namespace PartDesign; - -PROPERTY_SOURCE(PartDesign::Pad, PartDesign::Additive) - -Pad::Pad() -{ - ADD_PROPERTY(Length,(100.0)); - ADD_PROPERTY(Reversed,(0)); - ADD_PROPERTY(MirroredExtent,(0)); -} - -short Pad::mustExecute() const -{ - if (Placement.isTouched() || - Sketch.isTouched() || - Length.isTouched() || - MirroredExtent.isTouched() || - Reversed.isTouched()) - return 1; - return 0; -} - -App::DocumentObjectExecReturn *Pad::execute(void) -{ - double L = Length.getValue(); - if (L < Precision::Confusion()) - return new App::DocumentObjectExecReturn("Length of pad too small"); - App::DocumentObject* link = Sketch.getValue(); - if (!link) - return new App::DocumentObjectExecReturn("No sketch linked"); - if (!link->getTypeId().isDerivedFrom(Part::Part2DObject::getClassTypeId())) - return new App::DocumentObjectExecReturn("Linked object is not a Sketch or Part2DObject"); - TopoDS_Shape shape = static_cast<Part::Part2DObject*>(link)->Shape.getShape()._Shape; - if (shape.IsNull()) - return new App::DocumentObjectExecReturn("Linked shape object is empty"); - - // this is a workaround for an obscure OCC bug which leads to empty tessellations - // for some faces. Making an explicit copy of the linked shape seems to fix it. - // The error almost happens when re-computing the shape but sometimes also for the - // first time - BRepBuilderAPI_Copy copy(shape); - shape = copy.Shape(); - if (shape.IsNull()) - return new App::DocumentObjectExecReturn("Linked shape object is empty"); - - TopExp_Explorer ex; - std::vector<TopoDS_Wire> wires; - for (ex.Init(shape, TopAbs_WIRE); ex.More(); ex.Next()) { - wires.push_back(TopoDS::Wire(ex.Current())); - } - if (/*shape.ShapeType() != TopAbs_WIRE*/wires.empty()) // there can be several wires - return new App::DocumentObjectExecReturn("Linked shape object is not a wire"); - - // get the Sketch plane - Base::Placement SketchPos = static_cast<Part::Part2DObject*>(link)->Placement.getValue(); - Base::Rotation SketchOrientation = SketchPos.getRotation(); - Base::Vector3d SketchOrientationVector(0,0,1); - if (Reversed.getValue()) // negative direction - SketchOrientationVector *= -1; - SketchOrientation.multVec(SketchOrientationVector,SketchOrientationVector); - - // get the support of the Sketch if any - App::DocumentObject* SupportLink = static_cast<Part::Part2DObject*>(link)->Support.getValue(); - Part::Feature *SupportObject = 0; - if (SupportLink && SupportLink->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) - SupportObject = static_cast<Part::Feature*>(SupportLink); - - TopoDS_Shape aFace = makeFace(wires); - if (aFace.IsNull()) - return new App::DocumentObjectExecReturn("Creating a face from sketch failed"); - - // lengthen the vector - SketchOrientationVector *= L; - - this->positionBySketch(); - TopLoc_Location invObjLoc = this->getLocation().Inverted(); - - try { - // extrude the face to a solid - gp_Vec vec(SketchOrientationVector.x,SketchOrientationVector.y,SketchOrientationVector.z); - vec.Transform(invObjLoc.Transformation()); - BRepPrimAPI_MakePrism PrismMaker(aFace.Moved(invObjLoc),vec,0,1); - if (PrismMaker.IsDone()) { - // if the sketch has a support fuse them to get one result object (PAD!) - if (SupportObject) { - // At this point the prism can be a compound - TopoDS_Shape result = PrismMaker.Shape(); - // set the additive shape property for later usage in e.g. pattern - this->AddShape.setValue(result); - - const TopoDS_Shape& support = SupportObject->Shape.getValue(); - bool isSolid = false; - if (!support.IsNull()) { - TopExp_Explorer xp; - xp.Init(support,TopAbs_SOLID); - for (;xp.More(); xp.Next()) { - isSolid = true; - break; - } - } - if (isSolid) { - // Let's call algorithm computing a fuse operation: - BRepAlgoAPI_Fuse mkFuse(support.Moved(invObjLoc), result); - // Let's check if the fusion has been successful - if (!mkFuse.IsDone()) - return new App::DocumentObjectExecReturn("Fusion with support failed"); - result = mkFuse.Shape(); - // we have to get the solids (fuse create seldomly compounds) - TopoDS_Shape solRes = this->getSolid(result); - // lets check if the result is a solid - if (solRes.IsNull()) - return new App::DocumentObjectExecReturn("Resulting shape is not a solid"); - this->Shape.setValue(solRes); - } - else - return new App::DocumentObjectExecReturn("Support is not a solid"); - } - else { - TopoDS_Shape result = this->getSolid(PrismMaker.Shape()); - // set the additive shape property for later usage in e.g. pattern - this->AddShape.setValue(result); - this->Shape.setValue(result); +/*************************************************************************** + * Copyright (c) 2010 Juergen Riegel <FreeCAD@juergen-riegel.net> * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" +#ifndef _PreComp_ +//# include <Bnd_Box.hxx> +//# include <gp_Pln.hxx> +# include <cmath> +# include <BRep_Builder.hxx> +# include <BRepBndLib.hxx> +# include <BRepPrimAPI_MakePrism.hxx> +# include <BRepBuilderAPI_Copy.hxx> +# include <BRepBuilderAPI_MakeFace.hxx> +# include <BRepOffsetAPI_MakeOffset.hxx> +# include <BRepBuilderAPI_Transform.hxx> +# include <BRepOffsetAPI_ThruSections.hxx> +//# include <Geom_Plane.hxx> +# include <Handle_Geom_Surface.hxx> +# include <ShapeAnalysis.hxx> +# include <TopoDS.hxx> +# include <TopoDS_Solid.hxx> +# include <TopoDS_Face.hxx> +# include <TopoDS_Wire.hxx> +# include <TopExp_Explorer.hxx> +# include <BRepAlgoAPI_Fuse.hxx> +# include <Precision.hxx> +#endif + +#include <Base/Placement.h> +#include <Base/Tools.h> +#include <Mod/Part/App/Part2DObject.h> + +#include "FeaturePad.h" + + +using namespace PartDesign; + +PROPERTY_SOURCE(PartDesign::Pad, PartDesign::Additive) + +Pad::Pad() +{ + ADD_PROPERTY(Length,(100.0)); + ADD_PROPERTY(Reversed,(0)); + ADD_PROPERTY(MirroredExtent,(0)); + ADD_PROPERTY(TaperAngle,(0.0f)); +} + +short Pad::mustExecute() const +{ + if (Placement.isTouched() || + Sketch.isTouched() || + Length.isTouched() || + MirroredExtent.isTouched() || + Reversed.isTouched()|| + TaperAngle.isTouched()) + return 1; + return 0; +} + +App::DocumentObjectExecReturn *Pad::execute(void) +{ + double L = Length.getValue(); + if (L < Precision::Confusion()) + return new App::DocumentObjectExecReturn("Length of pad too small"); + App::DocumentObject* link = Sketch.getValue(); + if (!link) + return new App::DocumentObjectExecReturn("No sketch linked"); + if (!link->getTypeId().isDerivedFrom(Part::Part2DObject::getClassTypeId())) + return new App::DocumentObjectExecReturn("Linked object is not a Sketch or Part2DObject"); + TopoDS_Shape shape = static_cast<Part::Part2DObject*>(link)->Shape.getShape()._Shape; + if (shape.IsNull()) + return new App::DocumentObjectExecReturn("Linked shape object is empty"); + + // this is a workaround for an obscure OCC bug which leads to empty tessellations + // for some faces. Making an explicit copy of the linked shape seems to fix it. + // The error almost happens when re-computing the shape but sometimes also for the + // first time + BRepBuilderAPI_Copy copy(shape); + shape = copy.Shape(); + if (shape.IsNull()) + return new App::DocumentObjectExecReturn("Linked shape object is empty"); + + TopExp_Explorer ex; + std::vector<TopoDS_Wire> wires; + for (ex.Init(shape, TopAbs_WIRE); ex.More(); ex.Next()) { + wires.push_back(TopoDS::Wire(ex.Current())); + } + if (/*shape.ShapeType() != TopAbs_WIRE*/wires.empty()) // there can be several wires + return new App::DocumentObjectExecReturn("Linked shape object is not a wire"); + + // get the Sketch plane + Base::Placement SketchPos = static_cast<Part::Part2DObject*>(link)->Placement.getValue(); + Base::Rotation SketchOrientation = SketchPos.getRotation(); + Base::Vector3d SketchOrientationVector(0,0,1); + if (Reversed.getValue()) // negative direction + SketchOrientationVector *= -1; + SketchOrientation.multVec(SketchOrientationVector,SketchOrientationVector); + + // get the support of the Sketch if any + App::DocumentObject* SupportLink = static_cast<Part::Part2DObject*>(link)->Support.getValue(); + Part::Feature *SupportObject = 0; + if (SupportLink && SupportLink->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) + SupportObject = static_cast<Part::Feature*>(SupportLink); + + TopoDS_Shape aFace = makeFace(wires); + if (aFace.IsNull()) + return new App::DocumentObjectExecReturn("Creating a face from sketch failed"); + + // lengthen the vector + SketchOrientationVector *= L; + + this->positionBySketch(); + TopLoc_Location invObjLoc = this->getLocation().Inverted(); + + gp_Vec vec(SketchOrientationVector.x,SketchOrientationVector.y,SketchOrientationVector.z); + vec.Transform(invObjLoc.Transformation()); + + float taperAngle = TaperAngle.getValue(); + + TopoDS_Shape result; + + try { + + if (std::fabs(taperAngle) >= Precision::Confusion()) { + + //get outer Wire + TopoDS_Wire outerWire = ShapeAnalysis::OuterWire(TopoDS::Face(aFace)); + + double distance = std::tan(Base::toRadians(taperAngle)) * vec.Magnitude(); + + std::list<TopoDS_Wire> wire_list; + + wire_list.push_back(outerWire); + + BRepOffsetAPI_MakeOffset mkOffset; + + mkOffset.AddWire(outerWire); + + mkOffset.Perform(distance); + + gp_Trsf mat; + mat.SetTranslation(vec); + BRepBuilderAPI_Transform mkTransform(mkOffset.Shape(),mat); + + wire_list.push_back(TopoDS::Wire(mkTransform.Shape())); + + BRepOffsetAPI_ThruSections mkGenerator(Standard_True); + + for (std::list<TopoDS_Wire>::const_iterator it = wire_list.begin(); it != wire_list.end(); ++it) { + const TopoDS_Wire &wire = *it; + mkGenerator.AddWire(wire); } - } - else - return new App::DocumentObjectExecReturn("Could not extrude the sketch!"); - - return App::DocumentObject::StdReturn; - } - catch (Standard_Failure) { - Handle_Standard_Failure e = Standard_Failure::Caught(); - return new App::DocumentObjectExecReturn(e->GetMessageString()); - } -} - + mkGenerator.Build(); + + result = mkGenerator.Shape(); + + + } + //no taperAngle same as before + else{ + + // extrude the face to a solid + BRepPrimAPI_MakePrism PrismMaker(aFace.Moved(invObjLoc),vec,0,1); + if (PrismMaker.IsDone()) { + + result = PrismMaker.Shape(); + } + else + return new App::DocumentObjectExecReturn("Could not extrude the sketch!"); + } + + // if the sketch has a support fuse them to get one result object (PAD!) + if (SupportObject) { + // set the additive shape property for later usage in e.g. pattern + this->AddShape.setValue(result); + const TopoDS_Shape& support = SupportObject->Shape.getValue(); + bool isSolid = false; + if (!support.IsNull()) { + TopExp_Explorer xp; + xp.Init(support,TopAbs_SOLID); + for (;xp.More(); xp.Next()) { + isSolid = true; + break; + } + } + if (isSolid) { + // Let's call algorithm computing a fuse operation: + BRepAlgoAPI_Fuse mkFuse(support.Moved(invObjLoc), result); + // Let's check if the fusion has been successful + if (!mkFuse.IsDone()) + return new App::DocumentObjectExecReturn("Fusion with support failed"); + result = mkFuse.Shape(); + // we have to get the solids (fuse create seldomly compounds) + TopoDS_Shape solRes = this->getSolid(result); + // lets check if the result is a solid + if (solRes.IsNull()) + return new App::DocumentObjectExecReturn("Resulting shape is not a solid"); + this->Shape.setValue(solRes); + } + else + return new App::DocumentObjectExecReturn("Support is not a solid"); + } + else { + // set the additive shape property for later usage in e.g. pattern + this->AddShape.setValue(result); + this->Shape.setValue(result); + } + + return App::DocumentObject::StdReturn; + } + catch (Standard_Failure) { + Handle_Standard_Failure e = Standard_Failure::Caught(); + return new App::DocumentObjectExecReturn(e->GetMessageString()); + } +} + + + + diff --git a/src/Mod/PartDesign/App/FeaturePad.h b/src/Mod/PartDesign/App/FeaturePad.h index c758c94..dfaa1f6 100644 --- a/src/Mod/PartDesign/App/FeaturePad.h +++ b/src/Mod/PartDesign/App/FeaturePad.h @@ -42,6 +42,7 @@ public: //App::PropertyEnumeration Side; App::PropertyBool Reversed; App::PropertyBool MirroredExtent; + App::PropertyAngle TaperAngle; /** @name methods override feature */ //@{ diff --git a/src/Mod/PartDesign/Gui/TaskPadParameters.cpp b/src/Mod/PartDesign/Gui/TaskPadParameters.cpp index 8a902b2..71f23e6 100644 --- a/src/Mod/PartDesign/Gui/TaskPadParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPadParameters.cpp @@ -62,14 +62,17 @@ TaskPadParameters::TaskPadParameters(ViewProviderPad *PadView,QWidget *parent) connect(ui->checkBoxMirrored, SIGNAL(toggled(bool)), this, SLOT(onMirrored(bool))); connect(ui->checkBoxReversed, SIGNAL(toggled(bool)), - this, SLOT(onReversed(bool))); + this, SLOT(onReversed(bool))); + connect(ui->taperAngle, SIGNAL(valueChanged(double)), + this, SLOT(onTaperAngleChanged(double))); this->groupLayout()->addWidget(proxy); PartDesign::Pad* pcPad = static_cast<PartDesign::Pad*>(PadView->getObject()); double l = pcPad->Length.getValue(); bool mirrored = pcPad->MirroredExtent.getValue(); - bool reversed = pcPad->Reversed.getValue(); + bool reversed = pcPad->Reversed.getValue(); + double ta = pcPad->TaperAngle.getValue(); ui->doubleSpinBox->setMinimum(0); ui->doubleSpinBox->setValue(l); @@ -77,11 +80,13 @@ TaskPadParameters::TaskPadParameters(ViewProviderPad *PadView,QWidget *parent) ui->checkBoxMirrored->setChecked(mirrored); // According to bug #0000521 the reversed option // shouldn't be de-activated if the pad has a support face - ui->checkBoxReversed->setChecked(reversed); + ui->checkBoxReversed->setChecked(reversed); + + ui->taperAngle->setValue(ta); // Make sure that the spin box has the focus to get key events // Calling setFocus() directly doesn't work because the spin box is not - // yet visible. + // yet visible. QMetaObject::invokeMethod(ui->doubleSpinBox, "setFocus", Qt::QueuedConnection); } @@ -104,6 +109,13 @@ void TaskPadParameters::onReversed(bool on) PartDesign::Pad* pcPad = static_cast<PartDesign::Pad*>(PadView->getObject()); pcPad->Reversed.setValue(on); pcPad->getDocument()->recomputeFeature(pcPad); +} + +void TaskPadParameters::onTaperAngleChanged(double ta) +{ + PartDesign::Pad* pcPad = static_cast<PartDesign::Pad*>(PadView->getObject()); + pcPad->TaperAngle.setValue(static_cast<float>(ta)); + pcPad->getDocument()->recomputeFeature(pcPad); } double TaskPadParameters::getLength(void) const @@ -119,6 +131,12 @@ bool TaskPadParameters::getReversed(void) const bool TaskPadParameters::getMirroredExtent(void) const { return ui->checkBoxMirrored->isChecked(); +} + +float TaskPadParameters::getTaperAngle(void) const +{ + float t = static_cast<float>(ui->taperAngle->value()); + return static_cast<float>(ui->taperAngle->value()); } TaskPadParameters::~TaskPadParameters() @@ -158,12 +176,12 @@ TaskDlgPadParameters::~TaskDlgPadParameters() void TaskDlgPadParameters::open() { - + } void TaskDlgPadParameters::clicked(int) { - + } bool TaskDlgPadParameters::accept() @@ -174,7 +192,8 @@ bool TaskDlgPadParameters::accept() //Gui::Command::openCommand("Pad changed"); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Length = %f",name.c_str(),parameter->getLength()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Reversed = %i",name.c_str(),parameter->getReversed()?1:0); - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.MirroredExtent = %i",name.c_str(),parameter->getMirroredExtent()?1:0); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.MirroredExtent = %i",name.c_str(),parameter->getMirroredExtent()?1:0); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.TaperAngle = %f",name.c_str(),parameter->getTaperAngle()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.recompute()"); if (!PadView->getObject()->isValid()) throw Base::Exception(PadView->getObject()->getStatusString()); @@ -192,18 +211,18 @@ bool TaskDlgPadParameters::accept() bool TaskDlgPadParameters::reject() { // get the support and Sketch - PartDesign::Pad* pcPad = static_cast<PartDesign::Pad*>(PadView->getObject()); + PartDesign::Pad* pcPad = static_cast<PartDesign::Pad*>(PadView->getObject()); Sketcher::SketchObject *pcSketch; App::DocumentObject *pcSupport; if (pcPad->Sketch.getValue()) { - pcSketch = static_cast<Sketcher::SketchObject*>(pcPad->Sketch.getValue()); + pcSketch = static_cast<Sketcher::SketchObject*>(pcPad->Sketch.getValue()); pcSupport = pcSketch->Support.getValue(); } // role back the done things Gui::Command::abortCommand(); Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().resetEdit()"); - + // if abort command deleted the object the support is visible again if (!Gui::Application::Instance->getViewProvider(pcPad)) { if (pcSketch && Gui::Application::Instance->getViewProvider(pcSketch)) diff --git a/src/Mod/PartDesign/Gui/TaskPadParameters.h b/src/Mod/PartDesign/Gui/TaskPadParameters.h index c16493c..d3f4a87 100644 --- a/src/Mod/PartDesign/Gui/TaskPadParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPadParameters.h @@ -40,7 +40,7 @@ namespace Gui { class ViewProvider; } -namespace PartDesignGui { +namespace PartDesignGui { @@ -54,12 +54,14 @@ public: double getLength(void) const; bool getReversed(void) const; - bool getMirroredExtent(void) const; + bool getMirroredExtent(void) const; + float getTaperAngle(void) const; private Q_SLOTS: void onLengthChanged(double); void onMirrored(bool); - void onReversed(bool); + void onReversed(bool); + void onTaperAngleChanged(double); protected: void changeEvent(QEvent *e); @@ -94,11 +96,11 @@ public: virtual bool accept(); /// is called by the framework if the dialog is rejected (Cancel) virtual bool reject(); - /// is called by the framework if the user presses the help button + /// is called by the framework if the user presses the help button virtual bool isAllowedAlterDocument(void) const { return false; } - /// returns for Close and Help button + /// returns for Close and Help button virtual QDialogButtonBox::StandardButtons getStandardButtons(void) const { return QDialogButtonBox::Ok|QDialogButtonBox::Cancel; } diff --git a/src/Mod/PartDesign/Gui/TaskPadParameters.ui b/src/Mod/PartDesign/Gui/TaskPadParameters.ui index d407bbf..5048e66 100644 --- a/src/Mod/PartDesign/Gui/TaskPadParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskPadParameters.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>158</width> - <height>116</height> + <width>206</width> + <height>138</height> </rect> </property> <property name="windowTitle"> @@ -62,6 +62,30 @@ </layout> </item> <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Taper Angle:</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="taperAngle"> + <property name="minimum"> + <double>-180.000000000000000</double> + </property> + <property name="maximum"> + <double>180.000000000000000</double> + </property> + <property name="singleStep"> + <double>5.000000000000000</double> + </property> + </widget> + </item> + </layout> + </item> + <item> <widget class="QCheckBox" name="checkBoxMirrored"> <property name="enabled"> <bool>false</bool> @@ -80,6 +104,13 @@ </item> </layout> </widget> + <tabstops> + <tabstop>changeMode</tabstop> + <tabstop>doubleSpinBox</tabstop> + <tabstop>taperAngle</tabstop> + <tabstop>checkBoxMirrored</tabstop> + <tabstop>checkBoxReversed</tabstop> + </tabstops> <resources/> <connections/> </ui> -- 1.7.9.5 From b5761db235d803e5d0020ea2c7fc15747759b148 Mon Sep 17 00:00:00 2001 From: Jonathan Hahn <Jonathan.Hahn@t-online.de> Date: Sun, 29 Apr 2012 09:52:17 +0200 Subject: [PATCH 2/2] removes TabStop changes --- src/Mod/PartDesign/Gui/TaskPadParameters.ui | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskPadParameters.ui b/src/Mod/PartDesign/Gui/TaskPadParameters.ui index 5048e66..5623a40 100644 --- a/src/Mod/PartDesign/Gui/TaskPadParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskPadParameters.ui @@ -104,13 +104,6 @@ </item> </layout> </widget> - <tabstops> - <tabstop>changeMode</tabstop> - <tabstop>doubleSpinBox</tabstop> - <tabstop>taperAngle</tabstop> - <tabstop>checkBoxMirrored</tabstop> - <tabstop>checkBoxReversed</tabstop> - </tabstops> <resources/> <connections/> </ui> -- 1.7.9.5 |
|
Patch applied to Assembly branch! Works well! To be done -> Use code in Pocket |
|
in progress |
|
V0.13 now has a PartDesign::Draft feature which allows to select faces and apply a draft angle to them. This is not the same functionality as that requested, but will lead to the same result. I am not sure whether we should put even more options into the Pad/Pocket features. When I modelled for customers from the German automative industry, they insisted on always having draft in a separate feature. |
|
Draft can be done Pocket/Pad for easy and simple cases. If you want to have more control Pad/Pocket get for sure overloaded. I think both make sense. A one angle solution in the basic features and a own feature for the more sophisticated (future) solutions.. I have generally no problem if there are overlapping features functionality. May the better win! |
|
This ticket has been migrated to GitHub as issue 5553. |
Date Modified | Username | Field | Change |
---|---|---|---|
2012-03-05 21:17 | electronlibre | New Issue | |
2012-03-09 06:07 |
|
Status | new => assigned |
2012-03-09 06:07 |
|
Assigned To | => Jriegel |
2012-04-29 05:53 | helo10 | File Added: TaperAngle_Pad.patch | |
2012-05-05 18:00 | yorik | Project | FreeCAD => PartDesign |
2012-05-18 10:38 |
|
Note Added: 0002058 | |
2012-06-08 11:26 | helo10 | Note Added: 0002156 | |
2013-01-13 14:32 | jrheinlaender | Note Added: 0002845 | |
2013-01-13 14:39 |
|
Note Added: 0002846 | |
2017-05-31 00:23 | Kunda1 | Assigned To | Jriegel => |
2017-05-31 00:23 | Kunda1 | Status | assigned => confirmed |
2021-02-06 06:43 | abdullah | Target Version | => 0.20 |