void SketcherValidation::on_highlightButton_clicked() { std::vector<Base::Vector3d> points; TopoDS_Shape shape = sketch->Shape.getValue(); Base::Placement Plm = sketch->Placement.getValue(); Base::Placement invPlm = Plm.inverse(); // build up map vertex->edge TopTools_IndexedDataMapOfShapeListOfShape vertex2Edge; TopExp::MapShapesAndAncestors(shape, TopAbs_VERTEX, TopAbs_EDGE, vertex2Edge); for (int i=1; i<= vertex2Edge.Extent(); ++i) { const TopTools_ListOfShape& los = vertex2Edge.FindFromIndex(i); if (los.Extent() != 2) { const TopoDS_Vertex& vertex = TopoDS::Vertex(vertex2Edge.FindKey(i)); gp_Pnt pnt = BRep_Tool::Pnt(vertex); Base::Vector3d pos; invPlm.multVec(Base::Vector3d(pnt.X(), pnt.Y(), pnt.Z()),pos); points.push_back(pos); } } hidePoints(); if (!points.empty()) showPoints(points); }
App::DocumentObjectExecReturn* ShapeBinder::execute(void) { if (!this->isRestoring()) { Part::Feature* obj = nullptr; std::vector<std::string> subs; ShapeBinder::getFilteredReferences(&Support, obj, subs); //if we have a link we rebuild the shape, but we change nothing if we are a simple copy if (obj) { Part::TopoShape shape = ShapeBinder::buildShapeFromReferences(obj, subs); //now, shape is in object's CS, and includes local Placement of obj but nothing else. if (TraceSupport.getValue()) { //compute the transform, and apply it to the shape. Base::Placement sourceCS = //full placement of container of obj obj->globalPlacement() * obj->Placement.getValue().inverse(); Base::Placement targetCS = //full placement of container of this shapebinder this->globalPlacement() * this->Placement.getValue().inverse(); Base::Placement transform = targetCS.inverse() * sourceCS; shape.setPlacement(transform * shape.getPlacement()); } this->Placement.setValue(shape.getTransform()); this->Shape.setValue(shape); } } return Part::Feature::execute(); }