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(); }
App::DocumentObjectExecReturn *Body::execute(void) { /* Base::Console().Error("Body '%s':\n", getNameInDocument()); App::DocumentObject* tip = Tip.getValue(); Base::Console().Error(" Tip: %s\n", (tip == NULL) ? "None" : tip->getNameInDocument()); std::vector<App::DocumentObject*> model = Model.getValues(); Base::Console().Error(" Model:\n"); for (std::vector<App::DocumentObject*>::const_iterator m = model.begin(); m != model.end(); m++) { if (*m == NULL) continue; Base::Console().Error(" %s", (*m)->getNameInDocument()); if (Body::isSolidFeature(*m)) { App::DocumentObject* baseFeature = static_cast<PartDesign::Feature*>(*m)->BaseFeature.getValue(); Base::Console().Error(", Base: %s\n", baseFeature == NULL ? "None" : baseFeature->getNameInDocument()); } else { Base::Console().Error("\n"); } } */ App::DocumentObject* tip = Tip.getValue(); Part::TopoShape tipShape; if ( tip ) { if ( !tip->getTypeId().isDerivedFrom ( PartDesign::Feature::getClassTypeId() ) && tip != BaseFeature.getValue () ) { return new App::DocumentObjectExecReturn ( "Linked object is not a PartDesign feature" ); } // get the shape of the tip tipShape = static_cast<Part::Feature *>(tip)->Shape.getShape(); if ( tipShape.getShape().IsNull () ) { return new App::DocumentObjectExecReturn ( "Tip shape is empty" ); } // We should hide here the transformation of the baseFeature tipShape.transformShape (tipShape.getTransform(), true ); } else { tipShape = Part::TopoShape(); } Shape.setValue ( tipShape ); return App::DocumentObject::StdReturn; }