1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

refs #1279: Application hangs up on update of the view

Improve performance of the storage of the transparent state of the assembly leafs
This commit is contained in:
tma
2019-10-31 16:57:29 +03:00
parent b4baade508
commit 0252a0a4fb
3 changed files with 182 additions and 147 deletions

View File

@@ -29,6 +29,7 @@
#include <TColStd_HArray1OfReal.hxx> #include <TColStd_HArray1OfReal.hxx>
#include <XCAFDoc.hxx> #include <XCAFDoc.hxx>
#include <XCAFView_Object.hxx> #include <XCAFView_Object.hxx>
#include <TDataStd_IntegerArray.hxx>
IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_View, TDF_Attribute) IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_View, TDF_Attribute)
@@ -166,10 +167,8 @@ void XCAFDoc_View::SetObject (const Handle(XCAFView_Object)& theObject)
if (theObject->HasEnabledShapes()) if (theObject->HasEnabledShapes())
{ {
TDF_Label aShapeTranspLabel = Label().FindChild(ChildLab_EnabledShapes); TDF_Label aShapeTranspLabel = Label().FindChild(ChildLab_EnabledShapes);
for (Standard_Integer i = 1; i <= theObject->NbEnabledShapes(); i++) { Handle(TDataStd_IntegerArray) array = TDataStd_IntegerArray::Set(aShapeTranspLabel, 1, theObject->NbEnabledShapes());
Standard_Integer aValue = theObject->EnabledShape(i) ? 1 : 0; array->ChangeArray(theObject->GetEnabledShapes(), Standard_False);
TDataStd_Integer::Set(aShapeTranspLabel.FindChild(i), aValue);
}
} }
//note points //note points
if (theObject->HasNotePoints()) if (theObject->HasNotePoints())
@@ -189,149 +188,174 @@ Handle(XCAFView_Object) XCAFDoc_View::GetObject() const
{ {
Handle(XCAFView_Object) anObj = new XCAFView_Object(); Handle(XCAFView_Object) anObj = new XCAFView_Object();
// Name TDF_ChildIterator it(Label(), false);
Handle(TDataStd_AsciiString) aName; for ( ; it.More(); it.Next())
if (Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), aName))
{ {
anObj->SetName(new TCollection_HAsciiString(aName->Get())); TDF_Label aLabel = it.Value();
} ChildLab aTag = static_cast<ChildLab>(aLabel.Tag());
if (aTag == ChildLab_Name)
// Type {
Handle(TDataStd_Integer) aType; // Name
if (Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType)) Handle(TDataStd_AsciiString) aName;
{ if (aLabel.FindAttribute(TDataStd_AsciiString::GetID(), aName))
anObj->SetType((XCAFView_ProjectionType)aType->Get()); {
} anObj->SetName(new TCollection_HAsciiString(aName->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))
{
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++;
} }
else if (aTag == ChildLab_Type)
// Allocate the GDT-points and fill them in from Ocaf tree. {
if (aNbGDTPoints) { // Type
anObj->CreateGDTPoints (aNbGDTPoints); Handle(TDataStd_Integer) aType;
const Standard_Integer aNbChildren = aPointsLabel.NbChildren(); if (aLabel.FindAttribute(TDataStd_Integer::GetID(), aType))
for (Standard_Integer aLabelIndex = 1, aPointIndex = 1; aLabelIndex <= aNbChildren; aLabelIndex++) { {
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; gp_Pnt aPoint;
if (aPointsLabel.FindChild (aLabelIndex).FindAttribute (TDataXtd_Point::GetID(), aGDTPointAttr)) { TDataXtd_Geometry::Point(aPointAttr->Label(), aPoint);
TDataXtd_Geometry::Point (aGDTPointAttr->Label(), aPoint); anObj->SetProjectionPoint(aPoint);
anObj->SetGDTPoint (aPointIndex++, 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);
} }
} }
} }
} else if (aTag == ChildLab_Image)
//Image {
Handle(TDataStd_ByteArray) anArr; //Image
if (Label().FindChild(ChildLab_Image).FindAttribute(TDataStd_ByteArray::GetID(), anArr)) { Handle(TDataStd_ByteArray) anArr;
anObj->SetImage(anArr->InternalArray()); if (aLabel.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_EnabledShapes)
{
// Note Points // Shapes transparency
if (!Label().FindChild(ChildLab_NotePoints, Standard_False).IsNull()) { Handle(TDataStd_IntegerArray) anArr;
TDF_Label aPointsLabel = Label().FindChild(ChildLab_NotePoints); if (aLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anArr))
anObj->CreateNotePoints(aPointsLabel.NbChildren()); {
for (Standard_Integer i = 1; i <= aPointsLabel.NbChildren(); i++) { anObj->SetEnabledShapes(anArr->Array());
gp_Pnt aPoint; }
Handle(TDataXtd_Point) aPointAttr; }
aPointsLabel.FindChild(i).FindAttribute(TDataXtd_Point::GetID(), aPointAttr); else if (aTag == ChildLab_NotePoints)
TDataXtd_Geometry::Point(aPointAttr->Label(), aPoint); {
anObj->SetNotePoint(i, aPoint); // 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; return anObj;

View File

@@ -54,7 +54,7 @@ XCAFView_Object::XCAFView_Object(const Handle(XCAFView_Object)& theObj)
myViewVolumeSidesClipping = theObj->myViewVolumeSidesClipping; myViewVolumeSidesClipping = theObj->myViewVolumeSidesClipping;
myGDTPoints = NULL; myGDTPoints = NULL;
myImage = theObj->myImage; myImage = theObj->myImage;
myEnabledShapes = NULL; myEnabledShapes = theObj->myEnabledShapes;
myGDTPoints = NULL; myGDTPoints = NULL;
} }

View File

@@ -27,7 +27,7 @@
#include <TCollection_HAsciiString.hxx> #include <TCollection_HAsciiString.hxx>
#include <XCAFView_ProjectionType.hxx> #include <XCAFView_ProjectionType.hxx>
#include <TColStd_HArray1OfByte.hxx> #include <TColStd_HArray1OfByte.hxx>
#include <TColStd_HArray1OfBoolean.hxx> #include <TColStd_HArray1OfInteger.hxx>
class XCAFView_Object; class XCAFView_Object;
DEFINE_STANDARD_HANDLE(XCAFView_Object, Standard_Transient) DEFINE_STANDARD_HANDLE(XCAFView_Object, Standard_Transient)
@@ -238,7 +238,17 @@ public:
Standard_EXPORT void CreateEnabledShapes(const Standard_Integer theLenght) Standard_EXPORT void CreateEnabledShapes(const Standard_Integer theLenght)
{ {
if (theLenght > 0) 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() Standard_EXPORT Standard_Boolean HasEnabledShapes()
@@ -253,7 +263,7 @@ public:
return myEnabledShapes->Length(); 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()) if (myEnabledShapes.IsNull())
return; return;
@@ -261,15 +271,16 @@ public:
myEnabledShapes->SetValue(theIndex, theVal); myEnabledShapes->SetValue(theIndex, theVal);
} }
Standard_EXPORT bool EnabledShape(const Standard_Integer theIndex) Standard_EXPORT Standard_Boolean EnabledShape(const Standard_Integer theIndex)
{ {
if (myEnabledShapes.IsNull()) if (myEnabledShapes.IsNull())
return Standard_False; return Standard_False;
if (theIndex > 0 && theIndex <= myEnabledShapes->Length()) if (theIndex > 0 && theIndex <= myEnabledShapes->Length())
return myEnabledShapes->Value(theIndex); return myEnabledShapes->Value(theIndex) == 1;
else else
return Standard_False; return Standard_False;
} }
Standard_EXPORT void CreateNotePoints(const Standard_Integer theLenght) Standard_EXPORT void CreateNotePoints(const Standard_Integer theLenght)
{ {
if (theLenght > 0) if (theLenght > 0)
@@ -326,7 +337,7 @@ private:
Standard_Boolean myViewVolumeSidesClipping; Standard_Boolean myViewVolumeSidesClipping;
Handle(TColgp_HArray1OfPnt) myGDTPoints; // Point for each GDT to describe position of GDT frame in View. Handle(TColgp_HArray1OfPnt) myGDTPoints; // Point for each GDT to describe position of GDT frame in View.
Handle(TColStd_HArray1OfByte) myImage; Handle(TColStd_HArray1OfByte) myImage;
Handle(TColStd_HArray1OfBoolean) myEnabledShapes; Handle(TColStd_HArray1OfInteger) myEnabledShapes;
Handle(TColgp_HArray1OfPnt) myNotePoints; Handle(TColgp_HArray1OfPnt) myNotePoints;
}; };