From: tma Date: Thu, 31 Oct 2019 13:57:29 +0000 (+0300) Subject: refs #1279: Application hangs up on update of the view X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=7c48e61c9486546ee0127047df3579c6d5aa24fa;p=occt-copy.git refs #1279: Application hangs up on update of the view Improve performance of the storage of the transparent state of the assembly leafs (cherry picked from commit 0252a0a4fb5136cb5817035b5acbc6d0ffbf47eb) --- diff --git a/src/XCAFDoc/XCAFDoc_View.cxx b/src/XCAFDoc/XCAFDoc_View.cxx index 2eda98d9ee..21f4f1e894 100644 --- a/src/XCAFDoc/XCAFDoc_View.cxx +++ b/src/XCAFDoc/XCAFDoc_View.cxx @@ -29,6 +29,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_View, TDF_Attribute) @@ -166,10 +167,8 @@ void XCAFDoc_View::SetObject (const Handle(XCAFView_Object)& theObject) if (theObject->HasEnabledShapes()) { TDF_Label aShapeTranspLabel = Label().FindChild(ChildLab_EnabledShapes); - for (Standard_Integer i = 1; i <= theObject->NbEnabledShapes(); i++) { - Standard_Integer aValue = theObject->EnabledShape(i) ? 1 : 0; - TDataStd_Integer::Set(aShapeTranspLabel.FindChild(i), aValue); - } + Handle(TDataStd_IntegerArray) array = TDataStd_IntegerArray::Set(aShapeTranspLabel, 1, theObject->NbEnabledShapes()); + array->ChangeArray(theObject->GetEnabledShapes(), Standard_False); } //note points if (theObject->HasNotePoints()) @@ -189,149 +188,174 @@ Handle(XCAFView_Object) XCAFDoc_View::GetObject() const { Handle(XCAFView_Object) anObj = new XCAFView_Object(); - // Name - Handle(TDataStd_AsciiString) aName; - if (Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), aName)) - { - anObj->SetName(new TCollection_HAsciiString(aName->Get())); - } - - // Type - Handle(TDataStd_Integer) aType; - if (Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType)) - { - anObj->SetType((XCAFView_ProjectionType)aType->Get()); - } - - // Projection point - Handle(TDataXtd_Point) aPointAttr; - if (Label().FindChild(ChildLab_ProjectionPoint).FindAttribute(TDataXtd_Point::GetID(), aPointAttr)) { - gp_Pnt aPoint; - TDataXtd_Geometry::Point(aPointAttr->Label(), aPoint); - anObj->SetProjectionPoint(aPoint); - } - - // View direction - Handle(TDataXtd_Axis) aViewDirAttr; - if (Label().FindChild(ChildLab_ViewDirection).FindAttribute(TDataXtd_Axis::GetID(), aViewDirAttr)) { - gp_Ax1 aDir; - TDataXtd_Geometry::Axis(aViewDirAttr->Label(), aDir); - anObj->SetViewDirection(aDir.Direction()); - } - - // Up direction - Handle(TDataXtd_Axis) anUpDirAttr; - if (Label().FindChild(ChildLab_UpDirection).FindAttribute(TDataXtd_Axis::GetID(), anUpDirAttr)) { - gp_Ax1 aDir; - TDataXtd_Geometry::Axis(anUpDirAttr->Label(), aDir); - anObj->SetUpDirection(aDir.Direction()); - } - - // Zoom factor - Handle(TDataStd_Real) aZoomFactor; - if (Label().FindChild(ChildLab_ZoomFactor).FindAttribute(TDataStd_Real::GetID(), aZoomFactor)) - { - anObj->SetZoomFactor(aZoomFactor->Get()); - } - - // Window horizontal size - Handle(TDataStd_Real) aWindowHorizontalSize; - if (Label().FindChild(ChildLab_WindowHorizontalSize).FindAttribute(TDataStd_Real::GetID(), aWindowHorizontalSize)) - { - anObj->SetWindowHorizontalSize(aWindowHorizontalSize->Get()); - } - - // Window vertical size - Handle(TDataStd_Real) aWindowVerticalSize; - if (Label().FindChild(ChildLab_WindowVerticalSize).FindAttribute(TDataStd_Real::GetID(), aWindowVerticalSize)) - { - anObj->SetWindowVerticalSize(aWindowVerticalSize->Get()); - } - - // Front plane clipping - Handle(TDataStd_Real) aFrontPlaneDistance; - if (Label().FindChild(ChildLab_FrontPlaneDistance).FindAttribute(TDataStd_Real::GetID(), aFrontPlaneDistance)) - { - anObj->SetFrontPlaneDistance(aFrontPlaneDistance->Get()); - } - - // Back plane clipping - Handle(TDataStd_Real) aBackPlaneDistance; - if (Label().FindChild(ChildLab_BackPlaneDistance).FindAttribute(TDataStd_Real::GetID(), aBackPlaneDistance)) - { - anObj->SetBackPlaneDistance(aBackPlaneDistance->Get()); - } - - // View volume sides clipping - Handle(TDataStd_Integer) aViewVolumeSidesClipping; - if (Label().FindChild(ChildLab_ViewVolumeSidesClipping).FindAttribute(TDataStd_Integer::GetID(), aViewVolumeSidesClipping)) - { - Standard_Boolean aValue = (aViewVolumeSidesClipping->Get() == 1); - anObj->SetViewVolumeSidesClipping(aValue); - } - - // Name - Handle(TDataStd_AsciiString) aClippingExpression; - if (Label().FindChild(ChildLab_ClippingExpression).FindAttribute(TDataStd_AsciiString::GetID(), aClippingExpression)) + TDF_ChildIterator it(Label(), false); + for ( ; it.More(); it.Next()) { - anObj->SetClippingExpression(new TCollection_HAsciiString(aClippingExpression->Get())); - } - - // GDT Points - if (!Label().FindChild(ChildLab_GDTPoints, Standard_False).IsNull()) { - TDF_Label aPointsLabel = Label().FindChild(ChildLab_GDTPoints); - - // Find out the number of stored GDT-points in Ocaf tree. - Standard_Integer aNbGDTPoints = 0; - Handle(TDataXtd_Point) aGDTPointAttr; - TDF_ChildIterator anItrPnts (aPointsLabel, Standard_False); - for (; anItrPnts.More(); anItrPnts.Next()) { - if (anItrPnts.Value().FindAttribute (TDataXtd_Point::GetID(), aGDTPointAttr)) - aNbGDTPoints++; + TDF_Label aLabel = it.Value(); + ChildLab aTag = static_cast(aLabel.Tag()); + if (aTag == ChildLab_Name) + { + // Name + Handle(TDataStd_AsciiString) aName; + if (aLabel.FindAttribute(TDataStd_AsciiString::GetID(), aName)) + { + anObj->SetName(new TCollection_HAsciiString(aName->Get())); + } } - - // Allocate the GDT-points and fill them in from Ocaf tree. - if (aNbGDTPoints) { - anObj->CreateGDTPoints (aNbGDTPoints); - const Standard_Integer aNbChildren = aPointsLabel.NbChildren(); - for (Standard_Integer aLabelIndex = 1, aPointIndex = 1; aLabelIndex <= aNbChildren; aLabelIndex++) { + else if (aTag == ChildLab_Type) + { + // Type + Handle(TDataStd_Integer) aType; + if (aLabel.FindAttribute(TDataStd_Integer::GetID(), aType)) + { + anObj->SetType((XCAFView_ProjectionType)aType->Get()); + } + } + else if (aTag == ChildLab_ProjectionPoint) + { + // Projection point + Handle(TDataXtd_Point) aPointAttr; + if (aLabel.FindAttribute(TDataXtd_Point::GetID(), aPointAttr)) + { gp_Pnt aPoint; - if (aPointsLabel.FindChild (aLabelIndex).FindAttribute (TDataXtd_Point::GetID(), aGDTPointAttr)) { - TDataXtd_Geometry::Point (aGDTPointAttr->Label(), aPoint); - anObj->SetGDTPoint (aPointIndex++, aPoint); + TDataXtd_Geometry::Point(aPointAttr->Label(), aPoint); + anObj->SetProjectionPoint(aPoint); + } + } + else if (aTag == ChildLab_ViewDirection) + { + // View direction + Handle(TDataXtd_Axis) aViewDirAttr; + if (aLabel.FindAttribute(TDataXtd_Axis::GetID(), aViewDirAttr)) + { + gp_Ax1 aDir; + TDataXtd_Geometry::Axis(aViewDirAttr->Label(), aDir); + anObj->SetViewDirection(aDir.Direction()); + } + } + else if (aTag == ChildLab_UpDirection) + { + // Up direction + Handle(TDataXtd_Axis) anUpDirAttr; + if (aLabel.FindAttribute(TDataXtd_Axis::GetID(), anUpDirAttr)) + { + gp_Ax1 aDir; + TDataXtd_Geometry::Axis(anUpDirAttr->Label(), aDir); + anObj->SetUpDirection(aDir.Direction()); + } + } + else if (aTag == ChildLab_ZoomFactor) + { + // Zoom factor + Handle(TDataStd_Real) aZoomFactor; + if (aLabel.FindAttribute(TDataStd_Real::GetID(), aZoomFactor)) + { + anObj->SetZoomFactor(aZoomFactor->Get()); + } + } + else if (aTag == ChildLab_WindowHorizontalSize) + { + // Window horizontal size + Handle(TDataStd_Real) aWindowHorizontalSize; + if (aLabel.FindAttribute(TDataStd_Real::GetID(), aWindowHorizontalSize)) + { + anObj->SetWindowHorizontalSize(aWindowHorizontalSize->Get()); + } + } + else if (aTag == ChildLab_WindowVerticalSize) + { + // Window vertical size + Handle(TDataStd_Real) aWindowVerticalSize; + if (aLabel.FindAttribute(TDataStd_Real::GetID(), aWindowVerticalSize)) + { + anObj->SetWindowVerticalSize(aWindowVerticalSize->Get()); + } + } + else if (aTag == ChildLab_FrontPlaneDistance) + { + // Front plane clipping + Handle(TDataStd_Real) aFrontPlaneDistance; + if (aLabel.FindAttribute(TDataStd_Real::GetID(), aFrontPlaneDistance)) + { + anObj->SetFrontPlaneDistance(aFrontPlaneDistance->Get()); + } + } + else if (aTag == ChildLab_BackPlaneDistance) + { + // Back plane clipping + Handle(TDataStd_Real) aBackPlaneDistance; + if (aLabel.FindAttribute(TDataStd_Real::GetID(), aBackPlaneDistance)) + { + anObj->SetBackPlaneDistance(aBackPlaneDistance->Get()); + } + } + else if (aTag == ChildLab_ViewVolumeSidesClipping) + { + // View volume sides clipping + Handle(TDataStd_Integer) aViewVolumeSidesClipping; + if (aLabel.FindAttribute(TDataStd_Integer::GetID(), aViewVolumeSidesClipping)) + { + Standard_Boolean aValue = (aViewVolumeSidesClipping->Get() == 1); + anObj->SetViewVolumeSidesClipping(aValue); + } + } + else if (aTag == ChildLab_ClippingExpression) + { + // Name + Handle(TDataStd_AsciiString) aClippingExpression; + if (aLabel.FindAttribute(TDataStd_AsciiString::GetID(), aClippingExpression)) + { + anObj->SetClippingExpression(new TCollection_HAsciiString(aClippingExpression->Get())); + } + } + else if (aTag == ChildLab_GDTPoints) + { + // GDT Points + if (!aLabel.IsNull()) + { + anObj->CreateGDTPoints(aLabel.NbChildren()); + for (Standard_Integer i = 1; i <= aLabel.NbChildren(); i++) + { + gp_Pnt aPoint; + Handle(TDataXtd_Point) aGDTPointAttr; + aLabel.FindChild(i).FindAttribute(TDataXtd_Point::GetID(), aGDTPointAttr); + TDataXtd_Geometry::Point(aGDTPointAttr->Label(), aPoint); + anObj->SetGDTPoint(i, aPoint); } } } - } - //Image - Handle(TDataStd_ByteArray) anArr; - if (Label().FindChild(ChildLab_Image).FindAttribute(TDataStd_ByteArray::GetID(), anArr)) { - anObj->SetImage(anArr->InternalArray()); - } - - // Shapes transparency - if (!Label().FindChild(ChildLab_EnabledShapes, Standard_False).IsNull()) { - TDF_Label aShapesTranspLabel = Label().FindChild(ChildLab_EnabledShapes); - anObj->CreateEnabledShapes(aShapesTranspLabel.NbChildren()); - for (Standard_Integer i = 1; i <= aShapesTranspLabel.NbChildren(); i++) { - gp_Pnt aPoint; - Handle(TDataStd_Integer) aTranspAttr; - aShapesTranspLabel.FindChild(i).FindAttribute(TDataStd_Integer::GetID(), aTranspAttr); - Standard_Boolean aValue = (aTranspAttr->Get() == 1); - anObj->SetEnabledShape(i, aValue); + else if (aTag == ChildLab_Image) + { + //Image + Handle(TDataStd_ByteArray) anArr; + if (aLabel.FindAttribute(TDataStd_ByteArray::GetID(), anArr)) + { + anObj->SetImage(anArr->InternalArray()); + } } - } - - // Note Points - if (!Label().FindChild(ChildLab_NotePoints, Standard_False).IsNull()) { - TDF_Label aPointsLabel = Label().FindChild(ChildLab_NotePoints); - anObj->CreateNotePoints(aPointsLabel.NbChildren()); - for (Standard_Integer i = 1; i <= aPointsLabel.NbChildren(); i++) { - gp_Pnt aPoint; - Handle(TDataXtd_Point) aPointAttr; - aPointsLabel.FindChild(i).FindAttribute(TDataXtd_Point::GetID(), aPointAttr); - TDataXtd_Geometry::Point(aPointAttr->Label(), aPoint); - anObj->SetNotePoint(i, aPoint); + else if (aTag == ChildLab_EnabledShapes) + { + // Shapes transparency + Handle(TDataStd_IntegerArray) anArr; + if (aLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anArr)) + { + anObj->SetEnabledShapes(anArr->Array()); + } + } + else if (aTag == ChildLab_NotePoints) + { + // Note Points + anObj->CreateNotePoints(aLabel.NbChildren()); + TDF_ChildIterator itPoints(aLabel); + int index = 1; + for (; itPoints.More(); itPoints.Next(), ++index) + { + gp_Pnt aPoint; + Handle(TDataXtd_Point) aPointAttr; + itPoints.Value().FindAttribute(TDataXtd_Point::GetID(), aPointAttr); + TDataXtd_Geometry::Point(aPointAttr->Label(), aPoint); + anObj->SetNotePoint(index, aPoint); + } } } return anObj; diff --git a/src/XCAFView/XCAFView_Object.cxx b/src/XCAFView/XCAFView_Object.cxx index bf86ecbb03..616e47bd94 100644 --- a/src/XCAFView/XCAFView_Object.cxx +++ b/src/XCAFView/XCAFView_Object.cxx @@ -54,7 +54,7 @@ XCAFView_Object::XCAFView_Object(const Handle(XCAFView_Object)& theObj) myViewVolumeSidesClipping = theObj->myViewVolumeSidesClipping; myGDTPoints = NULL; myImage = theObj->myImage; - myEnabledShapes = NULL; + myEnabledShapes = theObj->myEnabledShapes; myGDTPoints = NULL; } diff --git a/src/XCAFView/XCAFView_Object.hxx b/src/XCAFView/XCAFView_Object.hxx index 9baf129f2a..85ee2034fc 100644 --- a/src/XCAFView/XCAFView_Object.hxx +++ b/src/XCAFView/XCAFView_Object.hxx @@ -27,7 +27,7 @@ #include #include #include -#include +#include class XCAFView_Object; DEFINE_STANDARD_HANDLE(XCAFView_Object, Standard_Transient) @@ -238,7 +238,17 @@ public: Standard_EXPORT void CreateEnabledShapes(const Standard_Integer theLenght) { if (theLenght > 0) - myEnabledShapes = new TColStd_HArray1OfBoolean(1, theLenght); + myEnabledShapes = new TColStd_HArray1OfInteger(1, theLenght); + } + + Standard_EXPORT void SetEnabledShapes(Handle(TColStd_HArray1OfInteger) theArray) + { + myEnabledShapes = theArray; + } + + const Handle(TColStd_HArray1OfInteger)& GetEnabledShapes() const + { + return myEnabledShapes; } Standard_EXPORT Standard_Boolean HasEnabledShapes() @@ -253,7 +263,7 @@ public: return myEnabledShapes->Length(); } - Standard_EXPORT void SetEnabledShape(const Standard_Integer theIndex, const bool theVal) + Standard_EXPORT void SetEnabledShape(const Standard_Integer theIndex, const Standard_Boolean theVal) { if (myEnabledShapes.IsNull()) return; @@ -261,15 +271,16 @@ public: myEnabledShapes->SetValue(theIndex, theVal); } - Standard_EXPORT bool EnabledShape(const Standard_Integer theIndex) + Standard_EXPORT Standard_Boolean EnabledShape(const Standard_Integer theIndex) { if (myEnabledShapes.IsNull()) return Standard_False; if (theIndex > 0 && theIndex <= myEnabledShapes->Length()) - return myEnabledShapes->Value(theIndex); + return myEnabledShapes->Value(theIndex) == 1; else return Standard_False; } + Standard_EXPORT void CreateNotePoints(const Standard_Integer theLenght) { if (theLenght > 0) @@ -326,7 +337,7 @@ private: Standard_Boolean myViewVolumeSidesClipping; Handle(TColgp_HArray1OfPnt) myGDTPoints; // Point for each GDT to describe position of GDT frame in View. Handle(TColStd_HArray1OfByte) myImage; - Handle(TColStd_HArray1OfBoolean) myEnabledShapes; + Handle(TColStd_HArray1OfInteger) myEnabledShapes; Handle(TColgp_HArray1OfPnt) myNotePoints; };