if (aShapeNew.IsNull())
return; // null shape inside
aBuilder.Modify(aShapeOld, aShapeNew);
- if (theDecomposeSolidsTag && aShapeNew.ShapeType() == TopAbs_COMPOUND) {
- // make sub elements as subs
-
- // register name if it is possible
- TCollection_AsciiString aName;
- if(!aBuilder.NamedShape()->IsEmpty()) {
- Handle(TDataStd_Name) anAttr;
- if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) {
- aName = TCollection_AsciiString(anAttr->Get()).ToCString();
- }
- }
-
- TopoDS_Iterator aSubIter(aShapeNew);
- for(int aTag = theDecomposeSolidsTag; aSubIter.More(); aSubIter.Next()) {
- const TopoDS_Shape& aShape = aSubIter.Value();
- Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aShape, aShapeLab);
- if(!aNS.IsNull() && !aNS->IsEmpty()) {
- // This shape is already in document, don't add it.
- continue;
- }
- TNaming_Builder aSubBuilder(aShapeLab.FindChild(aTag++));
- aSubBuilder.Generated(aSubIter.Value());
- if(!aName.IsEmpty()) {
- TCollection_AsciiString aShapeType = aShape.ShapeType() == TopAbs_EDGE ? "_Edge_" :
- aShape.ShapeType() == TopAbs_FACE ? "_Face_" :
- aShape.ShapeType() == TopAbs_SOLID ? "_Solid_" :
- "_Shape_";
- std::string aSolidName =
- (aName + aShapeType + TCollection_AsciiString(aTag - theDecomposeSolidsTag))
- .ToCString();
- std::shared_ptr<Model_Document> aDoc =
- std::dynamic_pointer_cast<Model_Document>(document());
- aDoc->addNamingName(aSubBuilder.NamedShape()->Label(), aSolidName);
- TDataStd_Name::Set(aSubBuilder.NamedShape()->Label(), aSolidName.c_str());
- }
- }
- } else if(!aBuilder.NamedShape()->IsEmpty()) {
+ if(!aBuilder.NamedShape()->IsEmpty()) {
Handle(TDataStd_Name) anAttr;
if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) {
std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString());
for (; aSubIter != aSubs.end(); aSubIter++)
subDoc(*aSubIter)->abortOperation();
// references may be changed because they are set in attributes on the fly
- myObjs->synchronizeFeatures(aDeltaLabels, true, false, isRoot());
+ myObjs->synchronizeFeatures(aDeltaLabels, true, false, false, isRoot());
}
bool Model_Document::isOperation() const
}
// after undo of all sub-documents to avoid updates on not-modified data (issue 370)
if (theSynchronize) {
- myObjs->synchronizeFeatures(aDeltaLabels, true, false, isRoot());
+ myObjs->synchronizeFeatures(aDeltaLabels, true, false, false, isRoot());
// update the current features status
setCurrentFeature(currentFeature(false), false);
}
subDoc(*aSubIter)->redo();
// after redo of all sub-documents to avoid updates on not-modified data (issue 370)
- myObjs->synchronizeFeatures(aDeltaLabels, true, false, isRoot());
+ myObjs->synchronizeFeatures(aDeltaLabels, true, false, false, isRoot());
// update the current features status
setCurrentFeature(currentFeature(false), false);
}
myDoc = theDoc;
// update all fields and recreate features and result objects if needed
TDF_LabelList aNoUpdated;
- synchronizeFeatures(aNoUpdated, true, true, true);
+ synchronizeFeatures(aNoUpdated, true, true, true, true);
myHistory.clear();
}
void Model_Objects::synchronizeFeatures(
const TDF_LabelList& theUpdated, const bool theUpdateReferences,
- const bool theOpen, const bool theFlush)
+ const bool theExecuteFeatures, const bool theOpen, const bool theFlush)
{
Model_Document* anOwner = std::dynamic_pointer_cast<Model_Document>(myDoc).get();
if (!anOwner) // this may happen on creation of document: nothing there, so nothing to synchronize
myHistory.clear();
}
- if (theOpen)
+ if (theExecuteFeatures)
anOwner->executeFeatures() = false;
aLoop->activateFlushes(isActive);
aLoop->flush(aRedispEvent);
aLoop->flush(aToHideEvent);
}
- if (theOpen)
+ if (theExecuteFeatures)
anOwner->executeFeatures() = true;
}
//! Synchronizes myFeatures list with the updated document
//! \param theUpdated list of labels that are marked as modified, so featrues must be also
//! \param theUpdateReferences causes the update of back-references
+ //! \param theExecuteFeatures requires re-execute modified persistent features
+ //! (not needed on undo/redo/abort/open)
//! \param theOpen - on open nothing must be reexecuted, except not persistent results
//! \param theFlush makes flush all events in the end of all modifications of this method
void synchronizeFeatures(const TDF_LabelList& theUpdated, const bool theUpdateReferences,
- const bool theOpen, const bool theFlush);
+ const bool theOpen, const bool theExecuteFeatures, const bool theFlush);
//! Synchronizes the BackReferences list in Data of Features and Results
void synchronizeBackRefs();
bool aWasChecked = myCheckTransactions;
setCheckTransactions(false);
TDF_LabelList anEmptyUpdated;
- aDoc->objects()->synchronizeFeatures(anEmptyUpdated, true, true, true);
+ aDoc->objects()->synchronizeFeatures(anEmptyUpdated, true, true, false, true);
if (aWasChecked)
setCheckTransactions(true);
}
TDF_CopyTool::Copy(aDS, aRT);
TDF_LabelList anEmptyUpdated;
- aNew->objects()->synchronizeFeatures(anEmptyUpdated, true, true, true);
+ aNew->objects()->synchronizeFeatures(anEmptyUpdated, true, true, true, true);
return aNew;
}
} else {
QList<ModuleBase_ViewerPrsPtr> aList =
theSelection->getSelected(ModuleBase_ISelection::Viewer);
- return (aList.count() == 1);
+ int aCount = 0;
+ foreach (ModuleBase_ViewerPrsPtr aPrs, aList) {
+ ObjectPtr aObj = aPrs->object();
+ if (aObj.get()) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
+ if (aFeature.get()) {
+ CompositeFeaturePtr aComp = ModelAPI_Tools::compositeOwner(aFeature);
+ if (aComp.get() && (aComp->getKind() == SketchPlugin_Sketch::ID()))
+ aCount++;
+ }
+ }
+ }
+ return (aCount == 1);
}
}
// 2. if the planes were displayed, change the view projection
const GeomShapePtr& aShape = thePrs->shape();
std::shared_ptr<GeomAPI_Shape> aGShape;
- std::shared_ptr<GeomAPI_Shape> aBaseShape;
DataPtr aData = feature()->data();
AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
// selection happens in OCC viewer
if (aShape.get() && !aShape->isNull()) {
aGShape = aShape;
-
- if (aSelAttr && aSelAttr->context()) {
- aBaseShape = aSelAttr->context()->shape();
- }
}
else { // selection happens in OCC viewer(on body) of in the OB browser
if (aSelAttr) {
aGShape = aSelAttr->value();
}
}
+ // If the selected object is a sketch then use its plane
+ std::shared_ptr<GeomAPI_Pln> aPlane;
+ ObjectPtr aObj = thePrs->object();
+ if (aObj.get()) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
+ if (aFeature.get() && (aFeature != feature())) {
+ if (aFeature->getKind() == SketchPlugin_Sketch::ID()) {
+ CompositeFeaturePtr aSketch =
+ std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aFeature);
+ aPlane = PartSet_Tools::sketchPlane(aSketch);
+ }
+ }
+ }
if (aGShape.get() != NULL) {
// get plane parameters
- std::shared_ptr<GeomAPI_Face> aFace(new GeomAPI_Face(aGShape));
- std::shared_ptr<GeomAPI_Pln> aPlane = aFace->getPlane();
+ if (!aPlane.get()) {
+ std::shared_ptr<GeomAPI_Face> aFace(new GeomAPI_Face(aGShape));
+ aPlane = aFace->getPlane();
+ }
+ if (!aPlane.get())
+ return;
std::shared_ptr<GeomAPI_Dir> aDir = aPlane->direction();
gp_XYZ aXYZ = aDir->impl<gp_Dir>().XYZ();
double aTwist = 0.0;
bool PartSet_WidgetSketchLabel::setSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs)
{
- return fillSketchPlaneBySelection(feature(), thePrs);
+ return fillSketchPlaneBySelection(thePrs);
}
bool PartSet_WidgetSketchLabel::canFillSketch(const ModuleBase_ViewerPrsPtr& thePrs)
return aCanFillSketch;
}
-bool PartSet_WidgetSketchLabel::fillSketchPlaneBySelection(const FeaturePtr& theFeature,
- const ModuleBase_ViewerPrsPtr& thePrs)
+bool PartSet_WidgetSketchLabel::fillSketchPlaneBySelection(const ModuleBase_ViewerPrsPtr& thePrs)
{
bool isOwnerSet = false;
const GeomShapePtr& aShape = thePrs->shape();
std::shared_ptr<GeomAPI_Dir> aDir;
- if (thePrs->object() && (theFeature != thePrs->object())) {
- DataPtr aData = theFeature->data();
+ if (thePrs->object() && (feature() != thePrs->object())) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(thePrs->object());
+ if (aFeature.get() && (aFeature != feature())) {
+ if (aFeature->getKind() == SketchPlugin_Sketch::ID()) {
+ CompositeFeaturePtr aSketch =
+ std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aFeature);
+ std::shared_ptr<GeomAPI_Pln> aPlane = PartSet_Tools::sketchPlane(aSketch);
+ if (aPlane.get()) {
+ aDir = setSketchPlane(aPlane);
+ return aDir.get();
+ }
+ }
+ }
+ DataPtr aData = feature()->data();
AttributeSelectionPtr aSelAttr =
std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
(aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
}
else if (aShape.get() && !aShape->isNull()) {
const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
- aDir = setSketchPlane(theFeature, aTDShape);
+ aDir = setSketchPlane(aTDShape);
isOwnerSet = aDir.get();
}
return isOwnerSet;
activateSelection(true);
- //myLabel->setText(myText);
- //myLabel->setToolTip(myTooltip);
-
connect(XGUI_Tools::workshop(myWorkshop)->selector(), SIGNAL(selectionChanged()),
this, SLOT(onSelectionChanged()));
activateFilters(true);
}
-std::shared_ptr<GeomAPI_Dir> PartSet_WidgetSketchLabel::setSketchPlane(const FeaturePtr& theFeature,
- const TopoDS_Shape& theShape)
+std::shared_ptr<GeomAPI_Dir>
+ PartSet_WidgetSketchLabel::setSketchPlane(const TopoDS_Shape& theShape)
{
if (theShape.IsNull())
return std::shared_ptr<GeomAPI_Dir>();
std::shared_ptr<GeomAPI_Shape> aGShape(new GeomAPI_Shape);
aGShape->setImpl(new TopoDS_Shape(theShape));
-
-
// get plane parameters
std::shared_ptr<GeomAPI_Face> aFace(new GeomAPI_Face(aGShape));
std::shared_ptr<GeomAPI_Pln> aPlane = aFace->getPlane();
if (!aPlane.get())
return std::shared_ptr<GeomAPI_Dir>();
+ return setSketchPlane(aPlane);
+}
+std::shared_ptr<GeomAPI_Dir>
+ PartSet_WidgetSketchLabel::setSketchPlane(std::shared_ptr<GeomAPI_Pln> thePlane)
+{
// set plane parameters to feature
- std::shared_ptr<ModelAPI_Data> aData = theFeature->data();
+ std::shared_ptr<ModelAPI_Data> aData = feature()->data();
double anA, aB, aC, aD;
- aPlane->coefficients(anA, aB, aC, aD);
+ thePlane->coefficients(anA, aB, aC, aD);
// calculate attributes of the sketch
std::shared_ptr<GeomAPI_Dir> aNormDir(new GeomAPI_Dir(anA, aB, aC));
std::shared_ptr<GeomDataAPI_Dir> aDirX = std::dynamic_pointer_cast<GeomDataAPI_Dir>(
aData->attribute(SketchPlugin_Sketch::DIRX_ID()));
aDirX->setValue(aXDir);
- std::shared_ptr<GeomAPI_Dir> aDir = aPlane->direction();
+ std::shared_ptr<GeomAPI_Dir> aDir = thePlane->direction();
return aDir;
}
/// \param thePrs a presentation
static bool canFillSketch(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
- /// Set sketch plane from selected object
- /// \param theFeature a feature of sketch
- /// \param thePrs a presentation
- static bool fillSketchPlaneBySelection(const FeaturePtr& theFeature,
- const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
-
signals:
/// Signal on plane selection
void planeSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
/// \param thePrs a selected presentation
void updateByPlaneSelected(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
+ /// Set sketch plane from selected object
+ /// \param theFeature a feature of sketch
+ /// \param thePrs a presentation
+ bool fillSketchPlaneBySelection(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
+
protected:
/// Activate or deactivate selection
void activateSelection(bool toActivate);
private:
/// Set sketch plane by shape
/// \param theShape a planar face
- static std::shared_ptr<GeomAPI_Dir> setSketchPlane(const FeaturePtr& theFeature,
- const TopoDS_Shape& theShape);
+ std::shared_ptr<GeomAPI_Dir> setSketchPlane(const TopoDS_Shape& theShape);
+ /// Set sketch plane
+ /// \param thePlane a plane
+ std::shared_ptr<GeomAPI_Dir> setSketchPlane(std::shared_ptr<GeomAPI_Pln> thePlane);
private:
/// class to show/hide preview planes
{
setAllEnabled();
XGUI_Selection* aSelection = myWorkshop->selector()->selection();
- if (aSelection->getSelected(ModuleBase_ISelection::Viewer).size() > 0)
+ //if (aSelection->getSelected(ModuleBase_ISelection::Viewer).size() > 0)
+ if (aSelection->getSelected().size() > 0)
updateOnViewSelection();
FeaturePtr anActiveFeature = FeaturePtr();
QObjectPtrList XGUI_Selection::selectedObjects() const
{
- return myWorkshop->objectBrowser()->selectedObjects();
+ if (myWorkshop->objectBrowser())
+ return myWorkshop->objectBrowser()->selectedObjects();
+ return QObjectPtrList();
}
void XGUI_Selection::setSelectedObjects( const QObjectPtrList& theObjects ) const