void ViewProviderBody::slotChangedObjectApp ( const App::DocumentObject& obj, const App::Property& prop ) { if (!obj.isDerivedFrom ( Part::Feature::getClassTypeId () ) || obj.isDerivedFrom ( Part::BodyBase::getClassTypeId () ) ) { // we are intrested only in Part::Features and not in bodies return; } const Part::Feature *feat = static_cast <const Part::Feature *>(&obj); if ( &feat->Shape != &prop && &feat->Placement != &prop) { // react only on changes in shapes and placement return; } PartDesign::Body *body = static_cast<PartDesign::Body*> ( getObject() ); if ( body && body->hasFeature (&obj ) ) { updateOriginDatumSize (); } }
const QByteArray TaskSketchBasedParameters::onFaceName(const QString& text) { if (text.length() == 0) return QByteArray(); QStringList parts = text.split(QChar::fromLatin1(':')); if (parts.length() < 2) parts.push_back(QString::fromLatin1("")); // Check whether this is the name of an App::Plane or Part::Datum feature App::DocumentObject* obj = vp->getObject()->getDocument()->getObject(parts[0].toLatin1()); if (obj == NULL) return QByteArray(); PartDesign::Body* activeBody = Gui::Application::Instance->activeView()->getActiveObject<PartDesign::Body*>(PDBODYKEY); if (obj->getTypeId().isDerivedFrom(App::Plane::getClassTypeId())) { // everything is OK (we assume a Part can only have exactly 3 App::Plane objects located at the base of the feature tree) return QByteArray(); } else if (obj->getTypeId().isDerivedFrom(Part::Datum::getClassTypeId())) { if (!activeBody->hasFeature(obj)) return QByteArray(); return QByteArray(); } else { // We must expect that "text" is the translation of "Face" followed by an ID. QString name; QTextStream str(&name); str << "^" << tr("Face") << "(\\d+)$"; QRegExp rx(name); if (text.indexOf(rx) < 0) { return QByteArray(); } int faceId = rx.cap(1).toInt(); std::stringstream ss; ss << "Face" << faceId; std::vector<std::string> upToFaces(1,ss.str()); PartDesign::ProfileBased* pcSketchBased = static_cast<PartDesign::ProfileBased*>(vp->getObject()); pcSketchBased->UpToFace.setValue(obj, upToFaces); recomputeFeature(); return QByteArray(ss.str().c_str()); } }
void ViewProviderBody::slotChangedObjectGui ( const Gui::ViewProviderDocumentObject& vp, const App::Property& prop ) { if (&vp.Visibility != &prop) { // react only on visability changes return; } if ( !vp.isDerivedFrom ( Gui::ViewProviderOrigin::getClassTypeId () ) && !vp.isDerivedFrom ( Gui::ViewProviderOriginFeature::getClassTypeId () ) ) { // Ignore origins to avoid infinite recursion (not likely in a well-formed document, // but may happen in documents designed in old versions of assembly branch ) return; } PartDesign::Body *body = static_cast<PartDesign::Body*> ( getObject() ); App::DocumentObject *obj = vp.getObject (); if ( body && obj && body->hasFeature ( obj ) ) { updateOriginDatumSize (); } }
bool ReferenceSelection::allow(App::Document* pDoc, App::DocumentObject* pObj, const char* sSubName) { // TODO review this function (2015-09-04, Fat-Zer) PartDesign::Body *body; App::GeoFeatureGroup *geoGroup; if ( support ) { body = PartDesign::Body::findBodyOf (support); } else { body = PartDesignGui::getBody (false); } if ( body ) { // Search for Part of the body geoGroup = App::GeoFeatureGroup::getGroupOfObject ( body ) ; } else if ( support ) { // if no body search part for support geoGroup = App::GeoFeatureGroup::getGroupOfObject ( support ) ; } else { // fallback to active part geoGroup = PartDesignGui::getActivePart ( ); } // Don't allow selection in other document if ( support && pDoc != support->getDocument() ) { return false; } // Enable selection from origin of current part/ if ( pObj->getTypeId().isDerivedFrom(App::OriginFeature::getClassTypeId()) ) { bool fits = false; if ( plane && pObj->getTypeId().isDerivedFrom(App::Plane::getClassTypeId()) ) { fits = true; } else if ( edge && pObj->getTypeId().isDerivedFrom(App::Line::getClassTypeId()) ) { fits = true; } if (fits) { // check that it is actually belongs to the choosen body or part try { // here are some throwers if (body) { if (body->getOrigin ()->hasObject (pObj) ) { return true; } } else if (geoGroup && geoGroup->isDerivedFrom ( App::OriginGroup::getClassTypeId () ) ) { if ( static_cast<App::OriginGroup *>(geoGroup)->getOrigin ()->hasObject (pObj) ) { return true; } } } catch (const Base::Exception) { } } return false; // The Plane/Axis doesn't fits our needs } if (pObj->getTypeId().isDerivedFrom(Part::Datum::getClassTypeId())) { if (!body) { // Allow selecting Part::Datum features from the active Body return false; } else if (!allowOtherBody && !body->hasFeature(pObj)) { return false; } if (plane && (pObj->getTypeId().isDerivedFrom(PartDesign::Plane::getClassTypeId()))) return true; if (edge && (pObj->getTypeId().isDerivedFrom(PartDesign::Line::getClassTypeId()))) return true; if (point && (pObj->getTypeId().isDerivedFrom(PartDesign::Point::getClassTypeId()))) return true; return false; } // Handle selection of geometry elements if (!sSubName || sSubName[0] == '\0') return false; if (!allowOtherBody) { if (support == NULL) return false; if (pObj != support) return false; } std::string subName(sSubName); if (edge && subName.size() > 4 && subName.substr(0,4) == "Edge") { const Part::TopoShape &shape = static_cast<const Part::Feature*>(pObj)->Shape.getValue(); TopoDS_Shape sh = shape.getSubShape(subName.c_str()); const TopoDS_Edge& edge = TopoDS::Edge(sh); if (!edge.IsNull()) { if (planar) { BRepAdaptor_Curve adapt(edge); if (adapt.GetType() == GeomAbs_Line) return true; } else { return true; } } } if (plane && subName.size() > 4 && subName.substr(0,4) == "Face") { const Part::TopoShape &shape = static_cast<const Part::Feature*>(pObj)->Shape.getValue(); TopoDS_Shape sh = shape.getSubShape(subName.c_str()); const TopoDS_Face& face = TopoDS::Face(sh); if (!face.IsNull()) { if (planar) { BRepAdaptor_Surface adapt(face); if (adapt.GetType() == GeomAbs_Plane) return true; } else { return true; } } } if (point && subName.size() > 6 && subName.substr(0,6) == "Vertex") { return true; } return false; }
void Workbench::setupContextMenu(const char* recipient, Gui::MenuItem* item) const { auto selection = Gui::Selection().getSelection(); // Add move Tip Command if ( selection.size () >= 1 ) { App::DocumentObject *feature = selection.front().pObject; PartDesign::Body *body = PartDesignGui::getBodyFor ( feature, false ); // lote of assertion so feature sould be marked as a tip if ( selection.size () == 1 && feature && ( feature->isDerivedFrom ( PartDesign::Body::getClassTypeId () ) || ( feature->isDerivedFrom ( PartDesign::Feature::getClassTypeId () ) && body ) || ( feature->isDerivedFrom ( Part::Feature::getClassTypeId () ) && body && body->BaseFeature.getValue() == feature ) ) ) { *item << "PartDesign_MoveTip"; } if (strcmp(recipient, "Tree") == 0) { Gui::MDIView *activeView = Gui::Application::Instance->activeView(); if ( selection.size () > 0 && activeView ) { bool docHaveBodies = activeView->getAppDocument()->countObjectsOfType ( PartDesign::Body::getClassTypeId () ) > 0; if ( docHaveBodies ) { bool addMoveFeature = true; bool addMoveFeatureInTree = (body != nullptr); for (auto sel: selection) { // if at least one selected feature cannot be moved to a body // disable the entry if ( addMoveFeature && !PartDesign::Body::isAllowed ( sel.pObject ) ) { addMoveFeature = false; } // if all at lest one selected feature doesn't belongs to the same body // disable the menu entry if ( addMoveFeatureInTree && !body->hasFeature ( sel.pObject ) ) { addMoveFeatureInTree = false; } if ( !addMoveFeatureInTree && !addMoveFeature ) { break; } } if (addMoveFeature) { *item << "PartDesign_MoveFeature"; } if (addMoveFeatureInTree) { *item << "PartDesign_MoveFeatureInTree"; } } } if (Gui::Selection().countObjectsOfType(PartDesign::Transformed::getClassTypeId()) - Gui::Selection().countObjectsOfType(PartDesign::MultiTransform::getClassTypeId()) == 1 ) *item << "PartDesign_MultiTransform"; } } }