| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <BRepBuilderAPI_Sewing.hxx> |
| | #include <Precision.hxx> |
| | #include <TopoDS.hxx> |
| |
|
| |
|
| | #include "FeatureSewing.h" |
| |
|
| |
|
| | using namespace Surface; |
| |
|
| | PROPERTY_SOURCE(Surface::Sewing, Part::Feature) |
| |
|
| | |
| |
|
| | Sewing::Sewing() |
| | { |
| | ADD_PROPERTY_TYPE(ShapeList, (nullptr, ""), "Sewing", App::Prop_None, "Input shapes"); |
| | ADD_PROPERTY_TYPE(Tolerance, (Precision::Confusion()), "Sewing", App::Prop_None, "Sewing tolerance"); |
| | ADD_PROPERTY_TYPE(SewingOption, (true), "Sewing", App::Prop_None, "Sewing option"); |
| | ADD_PROPERTY_TYPE(DegenerateShape, (true), "Sewing", App::Prop_None, "Analysis of degenerated shapes"); |
| | ADD_PROPERTY_TYPE(CutFreeEdges, (true), "Sewing", App::Prop_None, "Cutting of free edges"); |
| | ADD_PROPERTY_TYPE(Nonmanifold, (false), "Sewing", App::Prop_None, "Non-manifold processing"); |
| |
|
| | ShapeList.setScope(App::LinkScope::Global); |
| | } |
| |
|
| | short Sewing::mustExecute() const |
| | { |
| | if (ShapeList.isTouched() || Tolerance.isTouched() || SewingOption.isTouched() |
| | || DegenerateShape.isTouched() || CutFreeEdges.isTouched() || Nonmanifold.isTouched()) { |
| | return 1; |
| | } |
| | return 0; |
| | } |
| |
|
| | App::DocumentObjectExecReturn* Sewing::execute() |
| | { |
| | |
| | double atol = Tolerance.getValue(); |
| | bool opt1 = SewingOption.getValue(); |
| | bool opt2 = DegenerateShape.getValue(); |
| | bool opt3 = CutFreeEdges.getValue(); |
| | bool opt4 = Nonmanifold.getValue(); |
| |
|
| | try { |
| | BRepBuilderAPI_Sewing builder(atol, opt1, opt2, opt3, opt4); |
| |
|
| | std::vector<App::PropertyLinkSubList::SubSet> subset = ShapeList.getSubListValues(); |
| | for (const auto& it : subset) { |
| | |
| | |
| | if (it.first->isDerivedFrom<Part::Feature>()) { |
| | |
| | Part::TopoShape ts = static_cast<Part::Feature*>(it.first)->Shape.getShape(); |
| |
|
| | |
| | for (const auto& jt : it.second) { |
| | TopoDS_Shape sub = ts.getSubShape(jt.c_str()); |
| | builder.Add(sub); |
| | } |
| | } |
| | else { |
| | Standard_Failure::Raise("Shape item not from Part::Feature"); |
| | } |
| | } |
| |
|
| | builder.Perform(); |
| |
|
| | TopoDS_Shape aShape = builder.SewedShape(); |
| | if (aShape.IsNull()) { |
| | return new App::DocumentObjectExecReturn("Resulting shape is null"); |
| | } |
| | this->Shape.setValue(aShape); |
| | return StdReturn; |
| | } |
| | catch (Standard_Failure& e) { |
| |
|
| | return new App::DocumentObjectExecReturn(e.GetMessageString()); |
| | } |
| | } |
| |
|