-TModelingData TKShapeView
+TModelingData TKShapeView TKMessageModel TKMessageView
TVisualization TKView TKVInspector
TApplicationFramework TKTreeModel TKTInspectorAPI TKDFBrowser
TTool TKTInspector TKToolsDraw TInspectorEXE
\ No newline at end of file
(*fp) (theDI);
}
+
+//=======================================================================
+//function : ParseOnOff
+//purpose :
+//=======================================================================
+Standard_Boolean Draw::ParseOnOff (Standard_CString theArg,
+ Standard_Boolean& theIsOn)
+{
+ TCollection_AsciiString aFlag(theArg);
+ aFlag.LowerCase();
+ if (aFlag == "on"
+ || aFlag == "1")
+ {
+ theIsOn = Standard_True;
+ return Standard_True;
+ }
+ else if (aFlag == "off"
+ || aFlag == "0")
+ {
+ theIsOn = Standard_False;
+ return Standard_True;
+ }
+ return Standard_False;
+}
//! Defines Draw unit commands
Standard_EXPORT static void UnitCommands (Draw_Interpretor& I);
+ //! Defines Draw message commands
+ Standard_EXPORT static void MessageCommands (Draw_Interpretor& I);
+ //! Parses boolean argument.
+ //! Handles either flag specified by 0|1 or on|off.
+ Standard_EXPORT static Standard_Boolean ParseOnOff (Standard_CString theArg,
+ Standard_Boolean& theIsOn);
protected:
Draw::GraphicCommands(theCommands);
Draw::PloadCommands(theCommands);
Draw::UnitCommands(theCommands);
+ Draw::MessageCommands(theCommands);
}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Draw.hxx>
+#include <Message.hxx>
+#include <Message_Gravity.hxx>
+#include <Message_Report.hxx>
+#include <TCollection_AsciiString.hxx>
+
+//==============================================================================
+//function : ActivateReport
+//purpose :
+//==============================================================================
+
+static Standard_Integer ActivateReport (Draw_Interpretor&, Standard_Integer theArgsNb, const char** theArgVec)
+{
+ bool isActiveMode = true;
+ bool isGravityDefined = false;
+ Standard_Integer aGravity = -1;
+ for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
+ {
+ const TCollection_AsciiString anArg = theArgVec[anArgIt];
+ TCollection_AsciiString anArgCase = anArg;
+ anArgCase.LowerCase();
+ if (anArgCase == "-mode")
+ {
+ if (anArgIt + 1 < theArgsNb
+ && Draw::ParseOnOff (theArgVec[anArgIt + 1], isActiveMode))
+ {
+ ++anArgIt;
+ }
+ }
+ if (anArgCase == "-gravity")
+ {
+ if (anArgIt + 1 < theArgsNb)
+ {
+ Message_Gravity aGravityType;
+ isGravityDefined = Message::GravityFromString (theArgVec[anArgIt + 1], aGravityType);
+ aGravity = (Standard_Integer)aGravityType;
+ ++anArgIt;
+ }
+ }
+ else
+ {
+ std::cout << "Syntax error: unknown argument " << anArg << ".\n";
+ return 1;
+ }
+ }
+
+ Handle(Message_Report) aCurrentReport = Message_Report::CurrentReport (isActiveMode);
+ if (!aCurrentReport.IsNull())
+ aCurrentReport->SetActive(isActiveMode, aGravity);
+
+ return 0;
+}
+
+//==============================================================================
+//function : ClearReport
+//purpose :
+//==============================================================================
+
+static Standard_Integer ClearReport (Draw_Interpretor&, Standard_Integer, const char**)
+{
+ Handle(Message_Report) aCurrentReport = Message_Report::CurrentReport (Standard_False);
+ if (!aCurrentReport.IsNull())
+ aCurrentReport->Clear();
+
+ return 0;
+}
+
+//=======================================================================
+//function : PloadCommands
+//purpose :
+//=======================================================================
+
+void Draw::MessageCommands(Draw_Interpretor& theCommands)
+{
+ static Standard_Boolean Done = Standard_False;
+ if (Done) return;
+ Done = Standard_True;
+
+ const char* g = "DRAW Message Commands";
+
+ theCommands.Add("activateReport" ,
+ "activateReport [-mode {-on|-off}=-on]"
+ "[-gravity {trace|info|warning|alarm|fail}]"
+ "Activates default Message_Report object" ,
+ __FILE__, ActivateReport, g);
+
+ theCommands.Add("clearReport" , "clearReport: Clears content of default Message_Report object" ,
+ __FILE__, ClearReport, g);
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Draw_Report.hxx>
+
+#include <Draw_Display.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(Draw_Report,Draw_Drawable3D)
+
+//=======================================================================
+//function : Copy
+//purpose :
+//=======================================================================
+Handle(Draw_Drawable3D) Draw_Report::Copy()const
+{
+ Handle(Draw_Report) aReport = new Draw_Report (myReport);
+ return aReport;
+}
+
+//=======================================================================
+//function : Dump
+//purpose :
+//=======================================================================
+void Draw_Report::Dump (Standard_OStream& S)const
+{
+ (void)S;
+ //S << myReport;
+}
+
+
+//=======================================================================
+//function : Whatis
+//purpose :
+//=======================================================================
+void Draw_Report::Whatis (Draw_Interpretor& S)const
+{
+ S << "Draw_Report";
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Draw_Report_HeaderFile
+#define _Draw_Report_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_Type.hxx>
+
+#include <Message_Report.hxx>
+#include <Draw_Drawable3D.hxx>
+#include <Standard_OStream.hxx>
+#include <Draw_Interpretor.hxx>
+
+#include <Draw_Display.hxx>
+
+class Draw_Report;
+DEFINE_STANDARD_HANDLE(Draw_Report, Draw_Drawable3D)
+
+//! To store nummbers in variables.
+class Draw_Report : public Draw_Drawable3D
+{
+
+public:
+
+ Standard_EXPORT Draw_Report (const Handle(Message_Report)& theReport) : myReport (theReport) {}
+
+ Standard_EXPORT const Handle(Message_Report)& GetReport() const { return myReport; }
+
+ Standard_EXPORT void SetReport (const Handle(Message_Report)& theReport) { myReport = theReport; }
+
+ //! Does nothhing.
+ Standard_EXPORT void DrawOn (Draw_Display& dis) const Standard_OVERRIDE { (void)dis; }
+
+ //! For variable copy.
+ Standard_EXPORT virtual Handle(Draw_Drawable3D) Copy() const Standard_OVERRIDE;
+
+ //! For variable dump.
+ Standard_EXPORT virtual void Dump (Standard_OStream& S) const Standard_OVERRIDE;
+
+ //! For variable whatis command. Set as a result the
+ //! type of the variable.
+ Standard_EXPORT virtual void Whatis (Draw_Interpretor& I) const Standard_OVERRIDE;
+
+ DEFINE_STANDARD_RTTIEXT(Draw_Report,Draw_Drawable3D)
+
+private:
+ Handle(Message_Report) myReport;
+};
+
+
+
+
+
+
+
+#endif // _Draw_Report_HeaderFile
Draw_Marker3D.cxx
Draw_Marker3D.hxx
Draw_MarkerShape.hxx
+Draw_MessageCommands.cxx
Draw_Number.cxx
Draw_Number.hxx
Draw_PInterp.hxx
Draw_ProgressIndicator.cxx
Draw_ProgressIndicator.hxx
Draw_Replace.tcl
+Draw_Report.cxx
+Draw_Report.hxx
Draw_Segment2D.cxx
Draw_Segment2D.hxx
Draw_Segment3D.cxx
+GeomAbs.cxx
+GeomAbs.hxx
GeomAbs_BSplKnotDistribution.hxx
GeomAbs_CurveForm.hxx
GeomAbs_CurveType.hxx
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <GeomAbs.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+namespace
+{
+ static Standard_CString GeomAbs_Table_PrintSurfaceTypeEnum[11] =
+ {
+ "Plane", "Cylinder", "Cone", "Sphere", "Torus", "BezierSurface", "BSplineSurface",
+ "SurfaceOfRevolution", "SurfaceOfExtrusion", "OffsetSurface", "OtherSurface"
+ };
+}
+
+//=======================================================================
+//function : SurfaceTypeToString
+//purpose :
+//=======================================================================
+
+Standard_CString GeomAbs::SurfaceTypeToString (const GeomAbs_SurfaceType theValue)
+{
+ return GeomAbs_Table_PrintSurfaceTypeEnum[theValue];
+}
+
+//=======================================================================
+//function : SurfaceTypeFromString
+//purpose :
+//=======================================================================
+
+Standard_Boolean GeomAbs::SurfaceTypeFromString (const Standard_CString theString,
+ GeomAbs_SurfaceType& theType)
+{
+ TCollection_AsciiString aName (theString);
+ //aName.UpperCase();
+ for (Standard_Integer aTypeIter = GeomAbs_Plane; aTypeIter <= GeomAbs_OtherSurface; ++aTypeIter)
+ {
+ Standard_CString aTypeName = GeomAbs_Table_PrintSurfaceTypeEnum[aTypeIter];
+ if (aName == aTypeName)
+ {
+ theType = GeomAbs_SurfaceType (aTypeIter);
+ return Standard_True;
+ }
+ }
+ return Standard_False;
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _GeomAbs_HeaderFile
+#define _GeomAbs_HeaderFile
+
+#include <GeomAbs_SurfaceType.hxx>
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+//! Defines
+//! - tools to work with geomAbs
+class GeomAbs
+{
+public:
+
+ DEFINE_STANDARD_ALLOC
+
+ //! Returns the string name for a type.
+ //! @param surface type
+ //! @return string identifier from the enumeration
+ Standard_EXPORT static Standard_CString SurfaceTypeToString (const GeomAbs_SurfaceType theSurfaceType);
+
+ //! Returns the surface type from the given string identifier (using case-insensitive comparison).
+ //! @param theString string identifier
+ //! @return type or GeomAbs_OtherSurface if string identifier is invalid
+ static GeomAbs_SurfaceType SurfaceTypeFromString (const Standard_CString theString)
+ {
+ GeomAbs_SurfaceType aSurfaceType = GeomAbs_OtherSurface;
+ SurfaceTypeFromString (theString, aSurfaceType);
+ return aSurfaceType;
+ }
+
+ //! Determines the surface type from the given string identifier (using case-insensitive comparison).
+ //! @param theString string identifier
+ //! @param theSurfaceType detected surface type
+ //! @return TRUE if string identifier is known
+ Standard_EXPORT static Standard_Boolean SurfaceTypeFromString (const Standard_CString theString,
+ GeomAbs_SurfaceType& theType);
+};
+
+#endif // _GeomAbs_HeaderFile
#include <IntTools_Tools.hxx>
#include <IntTools_TopolTool.hxx>
#include <IntTools_WLineTool.hxx>
+#include <Message_Alerts.hxx>
#include <ProjLib_Plane.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
mbspc.Knots(),
mbspc.Multiplicities(),
mbspc.Degree());
+ MESSAGE_INFO_OBJECT(BS, "IntTools_FaceFace::MakeCurve", "", 0, NULL);
GeomLib_CheckBSplineCurve Check(BS,TOLCHECK,TOLANGCHECK);
Check.FixTangent(Standard_True,Standard_True);
//
Message.cxx
Message.hxx
+Message_Alert.cxx
+Message_Alert.hxx
+Message_AlertNode.cxx
+Message_AlertNode.hxx
+Message_Alerts.hxx
Message_Algorithm.cxx
Message_Algorithm.hxx
Message_Algorithm.lxx
+Message_Attribute.hxx
+Message_Attribute.cxx
+Message_AttributeObject.hxx
+Message_AttributeObject.cxx
+Message_AttributeVectorOfReal.hxx
+Message_AttributeVectorOfReal.cxx
+Message_AttributeVectorOfRealVec3.hxx
+Message_AttributeVectorOfRealVec3.cxx
Message_ExecStatus.hxx
Message_Gravity.hxx
Message_HArrayOfMsg.hxx
Message_Msg.lxx
Message_MsgFile.cxx
Message_MsgFile.hxx
+Message_PerfMeter.cxx
+Message_PerfMeter.hxx
Message_Printer.cxx
Message_Printer.hxx
Message_PrinterOStream.cxx
Message_SequenceOfProgressScale.hxx
Message_Status.hxx
Message_StatusType.hxx
-Message_Alert.cxx
-Message_Alert.hxx
Message_ListOfAlert.hxx
Message_Report.cxx
Message_Report.hxx
+Message_ReportCallBack.cxx
+Message_ReportCallBack.hxx
Sprintf (t, "%.2fs", second);
return TCollection_AsciiString (t);
}
+
+namespace
+{
+ static Standard_CString Message_Table_PrintGravityEnum[5] =
+ {
+ "TRACE", "INFO", "WARNING", "ALARM", "FAIL"
+ };
+}
+
+//=======================================================================
+//function : GravityToString
+//purpose :
+//=======================================================================
+
+Standard_CString Message::GravityToString (const Message_Gravity theGravity)
+{
+ return Message_Table_PrintGravityEnum[theGravity];
+}
+
+//=======================================================================
+//function : GravityFromString
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message::GravityFromString (const Standard_CString theGravityString,
+ Message_Gravity& theGravity)
+{
+ TCollection_AsciiString aName (theGravityString);
+ aName.UpperCase();
+ for (Standard_Integer aGravityIter = 0; aGravityIter <= Message_Fail; ++aGravityIter)
+ {
+ Standard_CString aGravityName = Message_Table_PrintGravityEnum[aGravityIter];
+ if (aName == aGravityName)
+ {
+ theGravity = Message_Gravity (aGravityIter);
+ return Standard_True;
+ }
+ }
+ return Standard_False;
+}
#ifndef _Message_HeaderFile
#define _Message_HeaderFile
+#include <Message_Gravity.hxx>
+
#include <Standard.hxx>
#include <Standard_DefineAlloc.hxx>
#include <Standard_Handle.hxx>
//! 3. (0, 0, 4.5 ) returns "4.50s"
Standard_EXPORT static TCollection_AsciiString FillTime (const Standard_Integer Hour, const Standard_Integer Minute, const Standard_Real Second);
+ //! Returns the string name for a given gravity.
+ //! @param Gravity gravity type
+ //! @return string identifier from the list Message_Trace, Message_Info, Message_Warning, Message_Alarm and Message_Fail
+ Standard_EXPORT static Standard_CString GravityToString (const Message_Gravity theGravity);
+
+ //! Returns the gravity type from the given string identifier (using case-insensitive comparison).
+ //! @param theGravityString string identifier
+ //! @return gravity or Message_Trace if string identifier is invalid
+ static Message_Gravity GravityFromString (const Standard_CString theGravityString)
+ {
+ Message_Gravity aGravity = Message_Trace;
+ GravityFromString (theGravityString, aGravity);
+ return aGravity;
+ }
+
+ //! Determines the gravity from the given string identifier (using case-insensitive comparison).
+ //! @param theGravityString string identifier
+ //! @param theGravity detected type
+ //! @return TRUE if string identifier is known
+ Standard_EXPORT static Standard_Boolean GravityFromString (const Standard_CString theGravityString,
+ Message_Gravity& theGravity);
// by default, merge trivially
return Standard_True;
}
+
+//=======================================================================
+//function : IsEqual
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_Alert::IsSame(const Handle(Message_Alert)& theAlert)
+{
+ return IsEqual (GetMessageKey(), theAlert->GetMessageKey());
+}
//! Base implementation always returns true.
virtual Standard_EXPORT Standard_Boolean Merge (const Handle(Message_Alert)& theTarget);
+ //! Return true if the current and parameter alert have the same content
+ //! \param theAlert an alert to compare
+ //! @return True if equal.
+ virtual Standard_EXPORT Standard_Boolean IsSame (const Handle(Message_Alert)& theAlert);
+
// OCCT RTTI
DEFINE_STANDARD_RTTIEXT(Message_Alert,Standard_Transient)
};
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Message_AlertNode.hxx>
+#include <Message_Attribute.hxx>
+#include <Message_Report.hxx>
+
+#include <Standard_Assert.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(Message_AlertNode,Message_Alert)
+
+//=======================================================================
+//function : GetMessageKey
+//purpose :
+//=======================================================================
+
+Standard_CString Message_AlertNode::GetMessageKey () const
+{
+ if (myAttribute.IsNull())
+ return Message_Alert::GetMessageKey();
+
+ return myAttribute->GetMessageKey();
+}
+
+//=======================================================================
+//function : AddAlert
+//purpose :
+//=======================================================================
+
+Handle(Message_Alert) Message_AlertNode::AddAlert (const Handle(Message_Report)& theReport,
+ const Handle(Message_Attribute)& theAttribute,
+ Message_PerfMeter* thePerfMeter,
+ const Handle(Message_Alert)& theParentAlert)
+{
+ if (!theReport->IsActive (Message_Info))
+ return Handle(Message_Alert)();
+
+ Handle(Message_AlertNode) anAlert = new Message_AlertNode();
+ anAlert->SetAttribute (theAttribute);
+ theReport->AddAlert (Message_Info, anAlert, thePerfMeter, theParentAlert);
+
+ return anAlert;
+}
+
+//=======================================================================
+//function : HasAlerts
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_AlertNode::HasAlert (const Handle(Message_Alert)& theAlert)
+{
+ for (int iGravity = Message_Trace; iGravity <= Message_Fail; ++iGravity)
+ {
+ Message_ListOfAlert& anAlerts = GetAlerts ((Message_Gravity)iGravity);
+ if (anAlerts.Contains (theAlert))
+ return Standard_True;
+ }
+ return Standard_False;
+}
+
+//=======================================================================
+//function : IsSame
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_AlertNode::IsSame (const Handle(Message_Alert)& theAlert)
+{
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (aNodeAlert.IsNull())
+ return Standard_False;
+
+ if (Attribute().IsNull() && aNodeAlert->Attribute().IsNull())
+ return Standard_True;
+
+ return Attribute()->IsSame (aNodeAlert->Attribute());
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Message_AlertNode_HeaderFile
+#define _Message_AlertNode_HeaderFile
+
+#include <Message_Alert.hxx>
+#include <Message_Gravity.hxx>
+#include <Message_ListOfAlert.hxx>
+#include <TCollection_AsciiString.hxx>
+
+class Message_Attribute;
+class Message_PerfMeter;
+class Message_Report;
+
+DEFINE_STANDARD_HANDLE(Message_AlertNode, Message_Alert)
+
+//! Inherited class of Message_Alert with some additional information.
+//!
+//! It has Message_Attributes to provide the alert name, description and
+//! other custom information
+//!
+//! It is possible to set performance meter into alert to store time
+//! spent between the next alert adding. Also time of child alerts are collected
+//!
+//! It has a container of composite alerts
+//!
+
+class Message_AlertNode : public Message_Alert
+{
+public:
+ //! Empty constructor
+ Standard_EXPORT Message_AlertNode()
+ : Message_Alert(), myCumulativeTime (GetUndefinedTime()) {}
+
+ //! Return a C string to be used as a key for generating text user
+ //! messages describing this alert.
+ //! The messages are generated with help of Message_Msg class, in
+ //! Message_Report::Dump().
+ //! Base implementation returns dynamic type name of the instance.
+ virtual Standard_EXPORT Standard_CString GetMessageKey () const;
+
+ //! Sets container of the alert attributes
+ //! \param theAttributes an attribute values
+ void SetAttribute (const Handle(Message_Attribute)& theAttribute) { myAttribute = theAttribute; }
+
+ //! Returns container of the alert attributes
+ //! \param theAttributes an attribute values
+ const Handle(Message_Attribute)& Attribute () const { return myAttribute; }
+
+ //! Returns list of collected alerts with specified gravity
+ Standard_EXPORT Message_ListOfAlert& GetAlerts (const Message_Gravity theGravity)
+ { return myChildAlerts[theGravity]; }
+
+ //! Returns performance meter
+ //! \return instance or NULL
+ Message_PerfMeter* GetPerfMeter() { return myPerfMeter; }
+
+ //! Returns the alert cumulative time. It includes times of sub alerts
+ //! @return value
+ Standard_Real GetCumulativeTime() const { return myCumulativeTime; }
+
+ //! Sets cumulative time of alert
+ //! \param theCumulativeTime time of the alert
+ void SetCumulativeTime (const Standard_Real theCumulativeTime) { myCumulativeTime = theCumulativeTime; }
+
+ //! Return true if this type of alert can be merged with other
+ //! of the same type to avoid duplication.
+ //! Basis implementation returns true.
+ virtual Standard_EXPORT Standard_Boolean SupportsMerge () const { return Standard_False; }
+
+ //! Returns default value of the time when it is not defined
+ //! \return integer value
+ static Standard_Integer GetUndefinedTime() { return -1; }
+
+ //! Creates new instance of the alert and put it into report with Message_Info gravity.
+ //! It does nothing if such kind of gravity is not active in the report
+ //! @param theReport the message report where new alert is placed
+ //! @param theAttribute container of additional values of the alert
+ //! @param thePerfMeter performance meter calculates the alert spent time and participate in searching the last alert if needed
+ //! @param theParentAlert parent for the new alert, or alert is placed under the report
+ //! @return created alert or NULL if Message_Info is not active in report
+ static Standard_EXPORT Handle(Message_Alert) AddAlert (const Handle(Message_Report)& theReport,
+ const Handle(Message_Attribute)& theAttribute,
+ Message_PerfMeter* thePerfMeter = 0,
+ const Handle(Message_Alert)& theParentAlert = Handle(Message_Alert)());
+
+ //! Returns true if the alert belong the list of the child alerts.
+ //! \param theAlert an alert to be checked as a child alert
+ //! \return true if the alert is found in a container of children
+ Standard_EXPORT Standard_Boolean HasAlert (const Handle(Message_Alert)& theAlert);
+
+ //! Return true if the current and parameter alert have the same content
+ //! \param theAlert an alert to compare
+ //! @return True if equal.
+ virtual Standard_EXPORT Standard_Boolean IsSame (const Handle(Message_Alert)& theAlert);
+
+ // OCCT RTTI
+ DEFINE_STANDARD_RTTIEXT(Message_AlertNode, Message_Alert)
+
+protected:
+ //! Sets performance meter
+ //! \param theMeter instance pointer or NULL
+ void SetPerfMeter (Message_PerfMeter* theMeter) { myPerfMeter = theMeter; }
+
+protected:
+
+ // store messages in a lists sorted by gravity;
+ // here we rely on knowledge that Message_Fail is the last element of the enum
+ Message_ListOfAlert myChildAlerts[Message_Fail + 1];
+
+ Handle(Message_Attribute) myAttribute; //!< container of the alert attributes
+
+ Message_PerfMeter* myPerfMeter; //!< performance meter
+ Standard_Real myCumulativeTime; //!< alert cumulative time
+
+ friend Message_PerfMeter;
+};
+
+#endif // _Message_Alert_HeaderFile
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Message_Alerts_HeaderFile
+#define _Message_Alerts_HeaderFile
+
+#include <Message_AlertNode.hxx>
+#include <Message_AttributeObject.hxx>
+#include <Message_AttributeVectorOfReal.hxx>
+#include <Message_AttributeVectorOfRealVec3.hxx>
+#include <Message_Gravity.hxx>
+#include <Message_Report.hxx>
+
+static Handle(Message_Alert) OCCT_Message_Alert;
+
+#define MESSAGE_INFO(Name, Description, PerfMeter, ParentAlert) \
+ { \
+ if (!Message_Report::CurrentReport().IsNull() && \
+ Message_Report::CurrentReport()->IsActive (Message_Info)) \
+ { \
+ OCCT_Message_Alert = Message_AlertNode::AddAlert (Message_Report::CurrentReport(), \
+ new Message_Attribute (Name, Description), PerfMeter, ParentAlert); \
+ } \
+ }
+
+#define MESSAGE_INFO_OBJECT(Object, Name, Description, PerfMeter, ParentAlert) \
+ { \
+ if (!Message_Report::CurrentReport().IsNull() && \
+ Message_Report::CurrentReport()->IsActive (Message_Info)) \
+ { \
+ OCCT_Message_Alert = Message_AlertNode::AddAlert (Message_Report::CurrentReport(), \
+ new Message_AttributeObject (Object, Name, Description), PerfMeter, ParentAlert ); \
+ } \
+ }
+
+#define MESSAGE_INFO_VECTOR_OF_REAL(Vector, ColumnCount, Name, Description, PerfMeter, ParentAlert) \
+ { \
+ if (!Message_Report::CurrentReport().IsNull() && \
+ Message_Report::CurrentReport()->IsActive (Message_Info)) \
+ { \
+ OCCT_Message_Alert = Message_AlertNode::AddAlert (Message_Report::CurrentReport(), \
+ new Message_AttributeVectorOfReal (Vector, ColumnCount, Name, Description), PerfMeter, ParentAlert ); \
+ } \
+ }
+
+#define MESSAGE_INFO_VECTOR_OF_REAL_VEC3(Vector, ColumnCount, Name, Description, PerfMeter, ParentAlert) \
+ { \
+ if (!Message_Report::CurrentReport().IsNull() && \
+ Message_Report::CurrentReport()->IsActive (Message_Info)) \
+ { \
+ OCCT_Message_Alert = Message_AlertNode::AddAlert (Message_Report::CurrentReport(), \
+ new Message_AttributeVectorOfRealVec3 (Vector, ColumnCount, Name, Description), PerfMeter, ParentAlert); \
+ } \
+ }
+
+#endif // _Message_Alerts_HeaderFile
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Message_Attribute.hxx>
+
+#include <Standard_Assert.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient)
+
+//=======================================================================
+//function : GetMessageKey
+//purpose :
+//=======================================================================
+
+Standard_CString Message_Attribute::GetMessageKey () const
+{
+ return !myName.IsEmpty() ? myName.ToCString() : "";
+}
+
+//=======================================================================
+//function : IsSame
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_Attribute::IsSame (const Handle(Message_Attribute)& theAttribute)
+{
+ if (theAttribute.IsNull())
+ return Standard_False;
+
+ return myName.IsEqual(theAttribute->GetName()) && myDescription.IsEqual (theAttribute->GetName());
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Message_Attribute_HeaderFile
+#define _Message_Attribute_HeaderFile
+
+#include <Standard_Transient.hxx>
+#include <TCollection_AsciiString.hxx>
+
+DEFINE_STANDARD_HANDLE(Message_Attribute, Standard_Transient)
+
+//! Additional information of extended alert attribute
+//! To provide other custom attribute container, it might be redefined.
+class Message_Attribute : public Standard_Transient
+{
+public:
+ //! Empty constructor
+ Standard_EXPORT Message_Attribute (const TCollection_AsciiString& theName = TCollection_AsciiString(),
+ const TCollection_AsciiString& theDescription = TCollection_AsciiString())
+ : myName (theName), myDescription (theDescription) {}
+
+ //! Return a C string to be used as a key for generating text user
+ //! messages describing this alert.
+ //! The messages are generated with help of Message_Msg class, in
+ //! Message_Report::Dump().
+ //! Base implementation returns dynamic type name of the instance.
+ virtual Standard_EXPORT Standard_CString GetMessageKey () const;
+
+ //! Returns custom name of alert if it is set
+ //! @return alert name
+ const TCollection_AsciiString& GetName() const { return myName; }
+
+ //! Sets the custom name of alert
+ //! @param theName a name for the alert
+ void SetName (const TCollection_AsciiString& theName) { myName = theName; }
+
+ //! Sets desription of alert
+ //! @param theName a name for the alert
+ void SetDescription (const TCollection_AsciiString& theDescription) { myDescription = theDescription; }
+
+ //! Returns description of alert if it is set
+ //! @return alert description
+ virtual const TCollection_AsciiString& GetDescription() const { return myDescription; }
+
+ //! Return true if the current and parameter alert have the same content
+ //! \param theAttribute an attribute to compare
+ //! @return True if equal.
+ virtual Standard_EXPORT Standard_Boolean IsSame (const Handle(Message_Attribute)& theAttribute);
+
+ // OCCT RTTI
+ DEFINE_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient)
+
+private:
+
+ TCollection_AsciiString myName; //!< alert name, if defined is used in GetMessageKey
+ TCollection_AsciiString myDescription; //!< alert description if defined
+
+};
+
+#endif // _Message_Attribute_HeaderFile
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Message_AttributeObject.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeObject, Message_Attribute)
+
+//=======================================================================
+//function : Message_AttributeObject
+//purpose :
+//=======================================================================
+
+Message_AttributeObject::Message_AttributeObject (const Handle(Standard_Transient)& theObject,
+ const TCollection_AsciiString& theName,
+ const TCollection_AsciiString& theDescription)
+: Message_Attribute (theName, theDescription)
+{
+ myObject = theObject;
+}
+
+//=======================================================================
+//function : IsSame
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_AttributeObject::IsSame (const Handle(Message_Attribute)& theAttribute)
+{
+ if (!Message_Attribute::IsSame (theAttribute))
+ return Standard_False;
+
+ Handle(Message_AttributeObject) anAttribute = Handle(Message_AttributeObject)::DownCast (theAttribute);
+ if (anAttribute.IsNull())
+ return Standard_False;
+
+ if (myObject.IsNull() != anAttribute->GetObject().IsNull())
+ return Standard_False;
+
+ return Standard_True;
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Message_AttributeObject_HeaderFile
+#define _Message_AttributeObject_HeaderFile
+
+#include <Message_Attribute.hxx>
+
+#include <Message_AlertNode.hxx>
+#include <TCollection_AsciiString.hxx>
+
+//! Alert object storing Transient object in its field
+class Message_AttributeObject : public Message_Attribute
+{
+public:
+ //! Constructor with string argument
+ Standard_EXPORT Message_AttributeObject (const Handle(Standard_Transient)& theObject,
+ const TCollection_AsciiString& theName = TCollection_AsciiString(),
+ const TCollection_AsciiString& theDescription = TCollection_AsciiString());
+
+ //! Sets the object
+ //! @param theObject an instance
+ void SetObject (const Handle(Standard_Transient)& theObject) { myObject = theObject; }
+
+ //! Returns object
+ Handle(Standard_Transient) GetObject() const { return myObject; }
+
+ //! Return true if the current and parameter alert have the same content
+ //! \param theAttribute an attribute to compare
+ //! @return True if equal.
+ virtual Standard_EXPORT Standard_Boolean IsSame (const Handle(Message_Attribute)& theAttribute) Standard_OVERRIDE;
+
+ // OCCT RTTI
+ DEFINE_STANDARD_RTTIEXT(Message_AttributeObject, Message_Attribute)
+
+private:
+ Handle(Standard_Transient) myObject;
+};
+
+#endif // _Message_AttributeObject_HeaderFile
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Message_AttributeVectorOfReal.hxx>
+
+#include <Message_Msg.hxx>
+#include <Message_PerfMeter.hxx>
+
+#include <Message_Report.hxx>
+
+#include <Precision.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeVectorOfReal, Message_Attribute)
+
+//=======================================================================
+//function : Message_AttributeVectorOfReal
+//purpose :
+//=======================================================================
+
+Message_AttributeVectorOfReal::Message_AttributeVectorOfReal (const NCollection_Vector<Standard_Real>& theValues,
+ const Standard_Integer& theColumnCount,
+ const TCollection_AsciiString& theName,
+ const TCollection_AsciiString& theDescription)
+: Message_Attribute(theName, theDescription), myColumnCount (theColumnCount)
+{
+ SetValues (theValues);
+}
+
+//=======================================================================
+//function : SetValues
+//purpose :
+//=======================================================================
+
+void Message_AttributeVectorOfReal::SetValues (const NCollection_Vector<Standard_Real>& theValues)
+{
+ myValues = theValues;
+
+ int aLength = (Standard_Integer)myValues.Length();
+ if (aLength < 2)
+ return;
+
+ if (myColumnCount <= 0)
+ myCachedValue = TCollection_AsciiString ("[") + aLength + "] : ";
+ else
+ myCachedValue = TCollection_AsciiString ("[") + (aLength / myColumnCount) + ", " + myColumnCount + "] : ";
+
+ myCachedValue += myValues.First();
+ myCachedValue += " ... ";
+ myCachedValue += myValues.Last();
+}
+
+//=======================================================================
+//function : GetDescription
+//purpose :
+//=======================================================================
+
+const TCollection_AsciiString& Message_AttributeVectorOfReal::GetDescription() const
+{
+ if (!Message_Attribute::GetDescription().IsEmpty())
+ return Message_Attribute::GetDescription();
+
+ return myCachedValue;
+}
+
+//=======================================================================
+//function : IsSame
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_AttributeVectorOfReal::IsSame (const Handle(Message_Attribute)& theAttribute)
+{
+ if (!Message_Attribute::IsSame (theAttribute))
+ return Standard_False;
+
+ Handle(Message_AttributeVectorOfReal) anAttribute = Handle(Message_AttributeVectorOfReal)::DownCast (theAttribute);
+ if (anAttribute.IsNull())
+ return Standard_False;
+
+ if (GetColumnCount() != anAttribute->GetColumnCount() ||
+ GetValues().Length() != anAttribute->GetValues().Length())
+ return Standard_False;
+
+ NCollection_Vector<Standard_Real>::Iterator anIterator (GetValues());
+ NCollection_Vector<Standard_Real>::Iterator anOtherIterator (anAttribute->GetValues());
+ for (; anIterator.More() && anOtherIterator.More(); anIterator.Next(), anOtherIterator.Next())
+ {
+ if (fabs (anIterator.Value() - anOtherIterator.Value()) > Precision::Confusion())
+ return Standard_False;
+ }
+ return Standard_True;
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Message_AttributeVectorOfReal_HeaderFile
+#define _Message_AttributeVectorOfReal_HeaderFile
+
+#include <Message_Attribute.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#include <NCollection_Vector.hxx>
+
+class Message_PerfMeter;
+class Message_Report;
+
+//! Alert object storing container of Standard_Real values in its field
+//! Values might be presented as table if column size is defined
+class Message_AttributeVectorOfReal : public Message_Attribute
+{
+public:
+
+ //! Constructor with string argument
+ Standard_EXPORT Message_AttributeVectorOfReal (const NCollection_Vector<Standard_Real>& theValues,
+ const Standard_Integer& theColumnCount,
+ const TCollection_AsciiString& theName = TCollection_AsciiString(),
+ const TCollection_AsciiString& theDescription = TCollection_AsciiString());
+
+ //! Sets the values
+ //! @param theValues container of values
+ Standard_EXPORT void SetValues (const NCollection_Vector<Standard_Real>& theValues);
+
+ //! Returns values
+ //! @return values
+ const NCollection_Vector<Standard_Real>& GetValues() const { return myValues; }
+
+ //! Sets value to present values in a table view
+ //! \param theValue value of division the values on sub-containers
+ void SetColumnCount (const Standard_Integer& theValue) { myColumnCount = theValue; }
+
+ //! Gets value to present values in a table view
+ //! \param theSubSize value of division the values on sub-containers
+ Standard_Integer GetColumnCount() const { return myColumnCount; }
+
+ //! Returns description of alert if it is set
+ //! @return alert description
+ virtual const TCollection_AsciiString& GetDescription() const;
+
+ //! Return true if the current and parameter alert have the same content
+ //! \param theAttribute an attribute to compare
+ //! @return True if equal.
+ virtual Standard_EXPORT Standard_Boolean IsSame (const Handle(Message_Attribute)& theAttribute) Standard_OVERRIDE;
+
+ // OCCT RTTI
+ DEFINE_STANDARD_RTTIEXT(Message_AttributeVectorOfReal, Message_Attribute)
+
+private:
+ NCollection_Vector<Standard_Real> myValues; //!< container of values
+ Standard_Integer myColumnCount; //!< value to present container of values into table
+
+ TCollection_AsciiString myCachedValue; //!< short description of the values in form: [size] : first ... last
+};
+
+#endif // _Message_AttributeVectorOfReal_HeaderFile
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Message_AttributeVectorOfRealVec3.hxx>
+
+#include <Message_Msg.hxx>
+#include <Message_PerfMeter.hxx>
+#include <Message_Report.hxx>
+
+#include <Precision.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeVectorOfRealVec3, Message_Attribute)
+
+//=======================================================================
+//function : Message_AttributeVectorOfRealVec3
+//purpose :
+//=======================================================================
+
+Message_AttributeVectorOfRealVec3::Message_AttributeVectorOfRealVec3 (const NCollection_Vector<NCollection_Vec3<Standard_Real>>& theValues,
+ const Standard_Integer& theColumnCount,
+ const TCollection_AsciiString& theName,
+ const TCollection_AsciiString& theDescription)
+: Message_Attribute (theName, theDescription), myColumnCount (theColumnCount)
+{
+ SetValues (theValues);
+}
+
+//=======================================================================
+//function : SetValues
+//purpose :
+//=======================================================================
+
+void Message_AttributeVectorOfRealVec3::SetValues (const NCollection_Vector<NCollection_Vec3<Standard_Real>>& theValues)
+{
+ myValues = theValues;
+
+ int aLength = (Standard_Integer)myValues.Length();
+ if (aLength < 2)
+ return;
+
+ if (myColumnCount <= 0)
+ myCachedValue = TCollection_AsciiString ("[") + aLength + "] : ";
+ else
+ myCachedValue = TCollection_AsciiString ("[") + (aLength / myColumnCount) + ", " + myColumnCount + "] : ";
+
+ NCollection_Vec3<Standard_Real> aValue = myValues.First();
+ myCachedValue = myCachedValue + "(" + aValue.x() + "," + aValue.y() + "," + aValue.z() + ")";
+ myCachedValue += " ... ";
+ aValue = myValues.Last();
+ myCachedValue = myCachedValue + "(" + aValue.x() + "," + aValue.y() + "," + aValue.z() + ")";
+}
+
+//=======================================================================
+//function : GetDescription
+//purpose :
+//=======================================================================
+
+const TCollection_AsciiString& Message_AttributeVectorOfRealVec3::GetDescription() const
+{
+ if (!Message_Attribute::GetDescription().IsEmpty())
+ return Message_Attribute::GetDescription();
+
+ return myCachedValue;
+}
+
+//=======================================================================
+//function : IsSame
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_AttributeVectorOfRealVec3::IsSame (const Handle(Message_Attribute)& theAttribute)
+{
+ if (!Message_Attribute::IsSame (theAttribute))
+ return Standard_False;
+
+ Handle(Message_AttributeVectorOfRealVec3) anAttribute = Handle(Message_AttributeVectorOfRealVec3)::DownCast (theAttribute);
+ if (anAttribute.IsNull())
+ return Standard_False;
+
+ NCollection_Vector<NCollection_Vec3<Standard_Real> >::Iterator anIterator (GetValues());
+ NCollection_Vector<NCollection_Vec3<Standard_Real> >::Iterator anOtherIterator (anAttribute->GetValues());
+ for (; anIterator.More() && anOtherIterator.More(); anIterator.Next(), anOtherIterator.Next())
+ {
+ if (fabs (anIterator.Value().x() - anOtherIterator.Value().x()) > Precision::Confusion() ||
+ fabs (anIterator.Value().y() - anOtherIterator.Value().y()) > Precision::Confusion() ||
+ fabs (anIterator.Value().z() - anOtherIterator.Value().z()) > Precision::Confusion())
+ return Standard_False;
+ }
+ return Standard_True;
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Message_AttributeVectorOfRealVec3_HeaderFile
+#define _Message_AttributeVectorOfRealVec3_HeaderFile
+
+#include <Message_Attribute.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#include <NCollection_Vector.hxx>
+#include <NCollection_Vec3.hxx>
+
+//! Alert object storing container of three Standard_Real values in its field
+//! Values might be presented as table if column size is defined
+class Message_AttributeVectorOfRealVec3 : public Message_Attribute
+{
+public:
+
+ //! Constructor with string argument
+ Standard_EXPORT Message_AttributeVectorOfRealVec3 (const NCollection_Vector<NCollection_Vec3<Standard_Real>>& theValues,
+ const Standard_Integer& theColumnCount,
+ const TCollection_AsciiString& theName = TCollection_AsciiString(),
+ const TCollection_AsciiString& theDescription = TCollection_AsciiString());
+
+ //! Sets the values
+ //! @param theValues container of values
+ Standard_EXPORT void SetValues (const NCollection_Vector<NCollection_Vec3<Standard_Real>>& theValues);
+
+ //! Returns values
+ //! @return values
+ const NCollection_Vector<NCollection_Vec3<Standard_Real>>& GetValues() const { return myValues; }
+
+ //! Sets value to present values in a table view
+ //! \param theValue value of division the values on sub-containers
+ void SetColumnCount (const Standard_Integer& theValue) { myColumnCount = theValue; }
+
+ //! Gets value to present values in a table view
+ //! \param theSubSize value of division the values on sub-containers
+ Standard_Integer GetColumnCount() const { return myColumnCount; }
+
+ //! Returns description of alert if it is set
+ //! @return alert description
+ virtual const TCollection_AsciiString& GetDescription() const;
+
+ //! Return true if the current and parameter alert have the same content
+ //! \param theAttribute an attribute to compare
+ //! @return True if equal.
+ virtual Standard_EXPORT Standard_Boolean IsSame (const Handle(Message_Attribute)& theAttribute) Standard_OVERRIDE;
+
+ // OCCT RTTI
+ DEFINE_STANDARD_RTTIEXT(Message_AttributeVectorOfRealVec3, Message_Attribute)
+
+private:
+ NCollection_Vector<NCollection_Vec3<Standard_Real> > myValues; //!< container of values
+ Standard_Integer myColumnCount; //!< value to present container of values into table
+ TCollection_AsciiString myCachedValue;
+ TCollection_AsciiString myDescription; //!< short description of the values in form: [size] : first ... last
+};
+
+#endif // _Message_AttributeVectorOfRealVec3_HeaderFile
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Message_PerfMeter.hxx>
+
+#include <Message_AlertNode.hxx>
+
+#include <OSD_Chronometer.hxx>
+
+//=======================================================================
+//function : Destructor
+//purpose :
+//=======================================================================
+
+Message_PerfMeter::~Message_PerfMeter()
+{
+ releaseAlert (0);
+}
+
+//=======================================================================
+//function : GetAlert
+//purpose :
+//=======================================================================
+
+Handle(Message_AlertNode) Message_PerfMeter::GetAlert (const Standard_Integer theLevelId) const
+{
+ if (!myActiveAlerts.IsBound (theLevelId))
+ return Handle(Message_AlertNode)();
+
+ return myActiveAlerts.Find (theLevelId).myAlert;
+}
+
+//=======================================================================
+//function : AddAlert
+//purpose :
+//=======================================================================
+
+void Message_PerfMeter::AddAlert (const Handle(Message_Alert)& theAlert)
+{
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (aNodeAlert.IsNull())
+ return;
+
+ if (myActiveAlerts.IsEmpty())
+ {
+ setAlert (0, theAlert);
+ return;
+ }
+
+ Standard_Integer aSize = myActiveAlerts.Size();
+ // looking for the parent of the parameter alert to release the previous alert
+ for (Standard_Integer aLevelId = 0; aLevelId < aSize; aLevelId++)
+ {
+ Handle(Message_AlertNode) anAlert = GetAlert (aLevelId);
+ if (!anAlert->HasAlert (theAlert))
+ continue;
+ // parent alert is found
+ if (myActiveAlerts.IsBound (aLevelId + 1))
+ releaseAlert (aLevelId + 1);
+
+ setAlert (aLevelId + 1, theAlert);
+ return;
+ }
+ Standard_Boolean isDone = Standard_True;
+ Standard_ASSERT_RETURN (!isDone, "Alert should be processed above",);
+}
+
+//=======================================================================
+//function : setAlert
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_PerfMeter::setAlert (const Standard_Integer theLevelId,
+ const Handle(Message_Alert)& theAlert)
+{
+ if (!GetAlert (theLevelId).IsNull())
+ return Standard_False;
+
+ Handle(Message_AlertNode) anAlertExtended = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (anAlertExtended.IsNull())
+ return Standard_False;
+
+ myActiveAlerts.Bind (theLevelId, AlertInfo (anAlertExtended, getCurrentTime()));
+ anAlertExtended->SetPerfMeter (this);
+ return Standard_True;
+}
+
+//=======================================================================
+//function : releaseAlert
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_PerfMeter::releaseAlert (const Standard_Integer theLevelId)
+{
+ // release alerts from the tail till the given alert
+ for (Standard_Integer aLevelId = myActiveAlerts.Extent() - 1; aLevelId >= theLevelId; aLevelId--)
+ {
+ if (!myActiveAlerts.IsBound (aLevelId))
+ continue;
+ stopAlert (aLevelId);
+ }
+
+ return Standard_True;
+}
+
+//=======================================================================
+//function : stopAlert
+//purpose :
+//=======================================================================
+
+Standard_Boolean Message_PerfMeter::stopAlert (const Standard_Integer theLevelId)
+{
+ if (!myActiveAlerts.IsBound (theLevelId))
+ return Standard_False;
+
+ AlertInfo anAlertInfo = myActiveAlerts.Find (theLevelId);
+ Handle(Message_AlertNode) aNodeAlert = anAlertInfo.myAlert;
+
+ aNodeAlert->SetCumulativeTime (getCurrentTime() - anAlertInfo.myStartTime);
+ aNodeAlert->SetPerfMeter (0);
+ myActiveAlerts.UnBind (theLevelId);
+
+ return Standard_True;
+}
+
+//=======================================================================
+//function : getLevel
+//purpose :
+//=======================================================================
+
+Standard_Integer Message_PerfMeter::getLevel (const Handle(Message_Alert)& theAlert)
+{
+ for (NCollection_DataMap<Standard_Integer, AlertInfo>::Iterator anIterator (myActiveAlerts);
+ anIterator.More(); anIterator.Next())
+ {
+ if (anIterator.Value().myAlert == theAlert)
+ return anIterator.Key();
+ }
+ return -1;
+}
+
+//=======================================================================
+//function : getCurrentTime
+//purpose :
+//=======================================================================
+
+Standard_Real Message_PerfMeter::getCurrentTime()
+{
+ Standard_Real aSystemSeconds, aCurrentSeconds;
+ OSD_Chronometer::GetThreadCPU (aCurrentSeconds, aSystemSeconds);
+
+ return aCurrentSeconds;
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Message_PerfMeter_HeaderFile
+#define _Message_PerfMeter_HeaderFile
+
+#include <Message_AlertNode.hxx>
+#include <Message_Gravity.hxx>
+
+#include <NCollection_DataMap.hxx>
+#include <Standard.hxx>
+
+//! This class is performance meter for message alerts. The usage is create the simple instance of it (not a pointer)
+//! in a method. Finalizing of the method will call destructor of the meter and store time into alert.
+class Message_PerfMeter
+{
+
+public:
+ //! Constructs and starts (if autoStart is true) the named meter
+ //! One string key is used for all alert meters. The perf meter is not started automatically, it will be done in
+ //! AddAlert method
+ Message_PerfMeter() : myGravity (Message_Info) {}
+
+ //! Assures stopping upon destruction
+ Standard_EXPORT ~Message_PerfMeter();
+
+ //! Returns message alert on the level, by default the upper alert is returned
+ //! \param theLevelId a level of child position inside the upper alert of performance meter
+ //! \return alert instance or NULL
+ Handle(Message_AlertNode) GetAlert (const Standard_Integer theLevelId = 0) const;
+
+ //! Processes the parameter alert. There are some variants:
+ //! - current alert is NULL, the alert becomes the current one and perf meter is started
+ //! - last alert of the current alert is stopped (perf meter becomes NULL, time is calculated),
+ //! the parameter alert is started (perf meter becomes the current one)
+ Standard_EXPORT void AddAlert (const Handle(Message_Alert)& theAlert);
+
+protected:
+
+ //! Sets message alert on the level
+ //! \param theLevelId a level of child position inside the upper alert of performance meter
+ //! \param theAlert an alert to be stored
+ //! \return true if succeeded, false if there is stored alert on the given level
+ Standard_Boolean setAlert (const Standard_Integer theLevelId, const Handle(Message_Alert)& theAlert);
+
+ //! Stop alert, store time into the alert and last child alert
+ //! \param theLevelId a level of child position inside the upper alert of performance meter
+ Standard_Boolean releaseAlert (const Standard_Integer theLevelId);
+
+ //! Sets NULL perf meter and parameter time into the alert
+ //! \param theLevelId a level of child position inside the upper alert of performance meter
+ Standard_Boolean stopAlert (const Standard_Integer theLevelId);
+
+ //! Returns level of given alert if it participates in the performance meter
+ //! \param theAlert modified alert
+ //! \return level value or -1
+ Standard_Integer getLevel (const Handle(Message_Alert)& theAlert);
+
+ //! Returns cumulative time of the performance meter
+ //! \param theMeterId a performance meter index
+ //! \return time value
+ static Standard_Real getCurrentTime();
+
+protected:
+ //! Struct to store start time for the alert
+ struct AlertInfo
+ {
+ AlertInfo (const Handle(Message_AlertNode)& theAlert, Standard_Real theStartTime)
+ : myAlert (theAlert), myStartTime (theStartTime) {}
+
+ Handle(Message_AlertNode) myAlert; //!< an alert
+ Standard_Real myStartTime; //!< start time of the alert
+ };
+
+ NCollection_DataMap<Standard_Integer, AlertInfo> myActiveAlerts; //!< container of current alerts
+ Message_Gravity myGravity; //!< perf meter alert gravity
+};
+
+
+#endif // _Message_PerfMeter_HeaderFile
// commercial license or contractual agreement.
#include <Message_Report.hxx>
+
+#include <Message_AlertNode.hxx>
#include <Message_Msg.hxx>
#include <Message_Messenger.hxx>
+#include <Message_PerfMeter.hxx>
+#include <Message_ReportCallBack.hxx>
+
#include <NCollection_Map.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_Report,Standard_Transient)
+static Handle(Message_Report) MyReport;
+
//=======================================================================
//function : Message_Report
//purpose :
//=======================================================================
Message_Report::Message_Report ()
+: myIsUsePerfMeter (Standard_False), myLimit (-1)
{
+ SetActive (Standard_True);
+}
+
+//=======================================================================
+//function : CurrentReport
+//purpose :
+//=======================================================================
+
+Handle(Message_Report) Message_Report::CurrentReport(const Standard_Boolean theToCreate)
+{
+ if (MyReport.IsNull() && theToCreate)
+ MyReport = new Message_Report();
+
+ return MyReport;
}
//=======================================================================
void Message_Report::AddAlert (Message_Gravity theGravity, const Handle(Message_Alert)& theAlert)
{
+ if (!IsActive (theGravity))
+ return;
+
Standard_ASSERT_RETURN (! theAlert.IsNull(), "Attempt to add null alert",);
Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]),
"Adding alert with gravity not in valid range",);
// if not merged, just add to the list
aList.Append (theAlert);
+
+ if (!myCallBack.IsNull())
+ myCallBack->Update (theAlert);
+}
+
+//=======================================================================
+//function : AddAlert
+//purpose :
+//=======================================================================
+
+void Message_Report::AddAlert (const Message_Gravity theGravity, const Handle(Message_Alert)& theAlert,
+ Message_PerfMeter* thePerfMeter, const Handle(Message_Alert)& theParentAlert)
+{
+ if (!IsActive (theGravity))
+ return;
+
+ Standard_ASSERT_RETURN (!theAlert.IsNull(), "Attempt to add null alert",);
+ Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]),
+ "Adding alert with gravity not in valid range",);
+
+ Standard_Mutex::Sentry aSentry (myMutex);
+
+ // iterate by already recorded alerts and try to merge new one with one of those
+ Handle(Message_Alert) aParentAlert = theParentAlert;
+ if (aParentAlert.IsNull() && thePerfMeter)
+ aParentAlert = thePerfMeter->GetAlert();
+ if (aParentAlert.IsNull())
+ aParentAlert = getLastAlert(theGravity);
+
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast(aParentAlert);
+ Message_ListOfAlert& aList = !aNodeAlert.IsNull() ? aNodeAlert->GetAlerts (theGravity) : myAlerts[theGravity];
+
+ if (theAlert->SupportsMerge() && !aList.IsEmpty())
+ {
+ // merge is performed only for alerts of exactly same type and same name
+ const Handle(Standard_Type)& aType = theAlert->DynamicType();
+ for (Message_ListOfAlert::Iterator anIt(aList); anIt.More(); anIt.Next())
+ {
+ // if merged successfully, just return
+ if (aType == anIt.Value()->DynamicType() && theAlert->Merge (anIt.Value()))
+ return;
+ }
+ }
+
+ // if not merged, just add to the list
+ aList.Append (theAlert);
+ // remove alerts under the report only
+ if (theParentAlert.IsNull() && aParentAlert.IsNull() && myLimit > 0 && aList.Extent() >= myLimit)
+ aList.RemoveFirst();
+
+ if (thePerfMeter)
+ thePerfMeter->AddAlert (theAlert);
+
+ if (!myCallBack.IsNull())
+ myCallBack->Update(theAlert);
}
//=======================================================================
return myAlerts[theGravity];
}
+//=======================================================================
+//function : getLastAlert
+//purpose :
+//=======================================================================
+
+Handle(Message_Alert) Message_Report::getLastAlert (const Message_Gravity theGravity)
+{
+ if (!IsActive (theGravity))
+ return Handle(Message_Alert)();
+
+ const Message_ListOfAlert& anAlerts = GetAlerts (theGravity);
+ if (anAlerts.IsEmpty())
+ return Handle(Message_Alert)();
+
+ Handle(Message_Alert) aLastAlert = anAlerts.Last();
+
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (aLastAlert);
+ if (aNodeAlert.IsNull())
+ return aLastAlert;
+ Handle(Message_AlertNode) aParentExtendedAlert = aNodeAlert;
+
+ Standard_Boolean aHasPerfMeter = aNodeAlert->GetPerfMeter() != NULL;
+ if (!aHasPerfMeter) // the alert has finished and is not the last alert anymore
+ return Handle(Message_Alert)();
+
+ while (!aParentExtendedAlert.IsNull() && !aParentExtendedAlert->GetAlerts (theGravity).IsEmpty())
+ {
+ Handle(Message_Alert) anAlert = aParentExtendedAlert->GetAlerts (theGravity).Last();
+
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (anAlert);
+ if (aNodeAlert.IsNull())
+ {
+ if (!aHasPerfMeter) // if there is a perf meter, use alert of it
+ aLastAlert = anAlert;
+ break;
+ }
+
+ if (!aHasPerfMeter)
+ aHasPerfMeter = aNodeAlert->GetPerfMeter() != NULL;
+ else if (!aNodeAlert->GetPerfMeter())
+ break; // last alert is the previous alert where perf meter is not NULL
+
+ aLastAlert = aNodeAlert;
+ aParentExtendedAlert = aNodeAlert;
+ }
+
+ // if alert has perf meter, use as the last alert, an alert of the perf meter
+ aNodeAlert = Handle(Message_AlertNode)::DownCast (aLastAlert);
+ if (aNodeAlert.IsNull())
+ return aLastAlert;
+ if (aNodeAlert->GetPerfMeter())
+ aLastAlert = aNodeAlert->GetPerfMeter()->GetAlert();
+
+ return aLastAlert;
+}
+
//=======================================================================
//function : HasAlert
//purpose :
AddAlert (theGravity, anIt.Value());
}
}
+
+//=======================================================================
+//function : SetActive
+//purpose :
+//=======================================================================
+
+void Message_Report::SetActive (const Standard_Boolean theActive, const Standard_Integer theGravity)
+{
+ if (theGravity < 0)
+ {
+ for (int iGravity = Message_Trace; iGravity <= Message_Fail; ++iGravity)
+ SetActive (theActive, iGravity);
+ return;
+ }
+
+ Standard_ASSERT_RETURN (theGravity >= 0 && size_t (theGravity) < sizeof (myAlerts) / sizeof (myAlerts[0]),
+ "Set active report with gravity not in valid range", );
+ myIsActive[theGravity] = theActive;
+}
#include <Standard_Mutex.hxx>
class Message_Messenger;
-
+class Message_PerfMeter;
class Message_Report;
-DEFINE_STANDARD_HANDLE(Message_Report, MMgt_TShared)
+class Message_ReportCallBack;
+
+DEFINE_STANDARD_HANDLE(Message_Report, Standard_Transient)
//! Container for alert messages, sorted according to their gravity.
//!
//! Empty constructor
Standard_EXPORT Message_Report ();
+
+ //! returns the only one instance of Report
+ //! When theToCreate is true - automatically creates message report when not exist.
+ //! that has been created.
+ Standard_EXPORT static Handle(Message_Report) CurrentReport (const Standard_Boolean theToCreate = Standard_False);
+
//! Add alert with specified gravity.
//! This method is thread-safe, i.e. alerts can be added from parallel threads safely.
Standard_EXPORT void AddAlert (Message_Gravity theGravity, const Handle(Message_Alert)& theAlert);
+ //! Add alert with specified gravity. The alert is a sub-alert of report or another alert
+ //! The parent alert is the parameter alert or the last alert if found else report.
+ //! \param theGravity a message gravity
+ //! \param theAlert a new alert to be added
+ //! \param thePerfMeter performance meter calculates the alert spent time and participate in searching the last alert if needed
+ //! \param theParentAlert if not NULL specifies parent alert where the alert should be placed, if the parent is an extednded alert
+ Standard_EXPORT void AddAlert (const Message_Gravity theGravity, const Handle(Message_Alert)& theAlert,
+ Message_PerfMeter* thePerfMeter, const Handle(Message_Alert)& theParentAlert = Handle(Message_Alert)());
+
//! Returns list of collected alerts with specified gravity
Standard_EXPORT const Message_ListOfAlert& GetAlerts (Message_Gravity theGravity) const;
//! Merges alerts with specified gravity from theOther report into this
Standard_EXPORT void Merge (const Handle(Message_Report)& theOther, Message_Gravity theGravity);
+ //! Returns a state whether the report is active
+ //! \return the state
+ Standard_Boolean IsActive (const Message_Gravity theGravity) const { return myIsActive[theGravity]; }
+
+ //! Starts a timer to compute time between messages. If a timer has already been started, it will be stopped
+ //! \param theActive new state of report active
+ //! \param theGravity gravity type, if '-1', apply value for all gravity kinds
+ Standard_EXPORT void SetActive (const Standard_Boolean theActive, const Standard_Integer theGravity = -1);
+
+ //! Sets a state whether the time of each alert should be stored
+ //! \param theValue boolean state
+ //! \return the previous state
+ Standard_EXPORT void UsePerfMeter (const Standard_Boolean theValue)
+ { myIsUsePerfMeter = theValue; }
+
+ //! Returns a state whether the time of each alert is stored
+ //! \return the state
+ Standard_EXPORT Standard_Boolean IsUsePerfMeter () const
+ { return myIsUsePerfMeter; }
+
+ //! Returns maximum number of collecting alerts. If the limit is achieved,
+ //! adding of a new alert after removing the first cached alert.
+ //! \return the limit value
+ Standard_EXPORT Standard_Integer GetLimit() const { return myLimit; }
+
+ //! Sets maximum number of collecting alerts.
+ //! \return theLimit limit value
+ Standard_EXPORT void SetLimit(const Standard_Integer theLimit) { myLimit = theLimit; }
+
+ //! Sets a listener for the report events
+ void SetCallBack(const Handle(Message_ReportCallBack)& theCallBack) { myCallBack = theCallBack; }
+
+ //! Returns listener of the reports events
+ const Handle(Message_ReportCallBack)& GetCallBack() const { return myCallBack; }
+
// OCCT RTTI
DEFINE_STANDARD_RTTIEXT(Message_Report,Standard_Transient)
+protected:
+ //! Returns last alert in list of report alerts or last alert in hierarchical tree of alerts provided by
+ //! the last alert
+ //! \parm theGravity a message gravity
+ Standard_EXPORT Handle(Message_Alert) getLastAlert (const Message_Gravity theGravity);
+
protected:
Standard_Mutex myMutex;
// store messages in a lists sorted by gravity;
// here we rely on knowledge that Message_Fail is the last element of the enum
Message_ListOfAlert myAlerts[Message_Fail + 1];
+
+ Standard_Boolean myIsActive[Message_Fail + 1];
+ Standard_Boolean myIsUsePerfMeter; //! If true, each alert will store time
+ Standard_Integer myLimit; //! Maximum number of collected alerts
+
+ Handle(Message_ReportCallBack) myCallBack; //! signal about performed modifications
};
#endif // _Message_Report_HeaderFile
--- /dev/null
+// Created on: 2017-12-01
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include "Message_ReportCallBack.hxx"
+
+IMPLEMENT_STANDARD_RTTIEXT(Message_ReportCallBack, Standard_Transient)
+
+Message_ReportCallBack::Message_ReportCallBack ()
+{
+}
--- /dev/null
+// Created on: 2017-12-01
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Message_ReportCallBack_HeaderFile
+#define _Message_ReportCallBack_HeaderFile
+
+#include <Standard_Handle.hxx>
+#include <Standard_Transient.hxx>
+#include <Standard_Type.hxx>
+
+class Message_Alert;
+class Message_ReportCallBack;
+DEFINE_STANDARD_HANDLE(Message_ReportCallBack, Standard_Transient)
+
+//! Interface to have possibility of processing message report events.
+class Message_ReportCallBack : public Standard_Transient
+{
+public:
+
+ //! Empty constructor
+ Standard_EXPORT Message_ReportCallBack ();
+ ~Message_ReportCallBack () {}
+
+ //! Interface to be implemented in the child to process the message report event
+ //! \param theAlert created or modified message alert
+ virtual void Update(const Handle(Message_Alert)& theAlert) = 0;
+
+ //! OCCT RTTI
+ DEFINE_STANDARD_RTTIEXT(Message_ReportCallBack, Standard_Transient)
+};
+
+#endif // _Message_ReportCallBack_HeaderFile
TopoDS.hxx
TopoDS.lxx
+TopoDS_AlertAttribute.hxx
+TopoDS_AlertAttribute.cxx
TopoDS_Builder.cxx
TopoDS_Builder.hxx
TopoDS_Builder.lxx
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <TopoDS_AlertAttribute.hxx>
+
+#include <Message_Msg.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(TopoDS_AlertAttribute, Message_Attribute)
+
+//=======================================================================
+//function : IsSame
+//purpose :
+//=======================================================================
+
+Standard_Boolean TopoDS_AlertAttribute::IsSame (const Handle(Message_Attribute)& theAttribute)
+{
+ if (!Message_Attribute::IsSame (theAttribute))
+ return Standard_False;
+
+ Handle(TopoDS_AlertAttribute) anAttribute = Handle(TopoDS_AlertAttribute)::DownCast (theAttribute);
+ if (anAttribute.IsNull())
+ return Standard_False;
+
+ if (GetShape().IsNull() != anAttribute->GetShape().IsNull())
+ return Standard_False;
+
+ if (GetShape().IsNull())
+ return Standard_True;
+
+ return GetShape().IsSame (anAttribute->GetShape());
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _TopoDS_AlertAttribute_HeaderFile
+#define _TopoDS_AlertAttribute_HeaderFile
+
+#include <Message_Attribute.hxx>
+#include <TopoDS_Shape.hxx>
+
+//! Alert attributre object storing TopoDS shape in its field
+class TopoDS_AlertAttribute : public Message_Attribute
+{
+public:
+ //! Constructor with shape argument
+ TopoDS_AlertAttribute (const TopoDS_Shape& theShape,
+ const TCollection_AsciiString& theName = TCollection_AsciiString(),
+ const TCollection_AsciiString& theDescription = TCollection_AsciiString())
+ : Message_Attribute (theName, theDescription), myShape (theShape) {}
+
+ //! Returns contained shape
+ const TopoDS_Shape& GetShape() const { return myShape; }
+
+ //! Return true if the current and parameter alert have the same content
+ //! \param theAttribute an attribute to compare
+ //! @return True if equal.
+ virtual Standard_EXPORT Standard_Boolean IsSame (const Handle(Message_Attribute)& theAttribute) Standard_OVERRIDE;
+
+ // OCCT RTTI
+ DEFINE_STANDARD_RTTIEXT(TopoDS_AlertAttribute, Message_Attribute)
+
+private:
+ TopoDS_Shape myShape;
+};
+
+#define MESSAGE_INFO_SHAPE(Shape, Name, Description, PerfMeter, ParentAlert) \
+ { \
+ if (!Message_Report::CurrentReport().IsNull() && \
+ Message_Report::CurrentReport()->IsActive (Message_Info)) \
+ { \
+ OCCT_Message_Alert = Message_AlertNode::AddAlert (Message_Report::CurrentReport(), \
+ new TopoDS_AlertAttribute (Shape, Name, Description), PerfMeter, ParentAlert ); \
+ } \
+ }
+
+
+#endif // _TopoDS_AlertAttribute_HeaderFile
XmlDrivers_DocumentRetrievalDriver.hxx
XmlDrivers_DocumentStorageDriver.cxx
XmlDrivers_DocumentStorageDriver.hxx
+XmlDrivers_MessageReportStorage.cxx
+XmlDrivers_MessageReportStorage.hxx
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2001-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <XmlDrivers_MessageReportStorage.hxx>
+
+#include <Message.hxx>
+#include <Message_AlertNode.hxx>
+#include <Message_AttributeVectorOfReal.hxx>
+#include <Message_AttributeVectorOfRealVec3.hxx>
+#include <Message_Report.hxx>
+
+#include <TDataStd_AsciiString.hxx>
+#include <TDataStd_Comment.hxx>
+#include <TDataStd_Integer.hxx>
+#include <TDataStd_Name.hxx>
+#include <TDataStd_Real.hxx>
+#include <TDataStd_RealArray.hxx>
+#include <TDF_ChildIterator.hxx>
+#include <TDocStd_Application.hxx>
+#include <TDocStd_Document.hxx>
+
+#include <TNaming_Builder.hxx>
+#include <TNaming_NamedShape.hxx>
+
+#include <TopoDS_AlertAttribute.hxx>
+
+#include <XmlDrivers.hxx>
+
+// =======================================================================
+// function : GetApplication
+// purpose :
+// =======================================================================
+
+const Handle(TDocStd_Application)& GetApplication()
+{
+ static Handle(TDocStd_Application) anApp;
+ if (anApp.IsNull())
+ {
+ anApp = new TDocStd_Application;
+ XmlDrivers::DefineFormat (anApp);
+ }
+ return anApp;
+}
+
+// =======================================================================
+// function : ExportReport
+// purpose :
+// =======================================================================
+
+void XmlDrivers_MessageReportStorage::ExportReport (const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theFileName)
+{
+ if (theReport.IsNull())
+ return;
+
+ Handle(TDocStd_Document) aDocument;
+ GetApplication()->NewDocument (TCollection_ExtendedString ("XmlOcaf"), aDocument);
+
+ TDF_Label aMainLabel = aDocument->Main();
+
+ for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++)
+ {
+ Message_Gravity aGravity = (Message_Gravity)aGravityId;
+
+ if (theReport->GetAlerts (aGravity).Size() == 0)
+ continue;
+ // Gravity Label
+ TDF_Label aGravityLabel = aMainLabel.NewChild();
+ // set gravity kind string
+ TCollection_ExtendedString aName (Message::GravityToString ((Message_Gravity)aGravity));
+ if (!aName.IsEmpty())
+ TDataStd_Name::Set (aGravityLabel, aName);
+
+ /// reserved label to store gravity information
+ //TDF_Label aFirstAlertLabel = aGravityLabel.NewChild();
+
+ // Alert Labels: labels are started from the second index
+ const Message_ListOfAlert& anAlerts = theReport->GetAlerts (aGravity);
+ for (Message_ListOfAlert::Iterator anAlertsIt (anAlerts); anAlertsIt.More(); anAlertsIt.Next())
+ {
+ exportAlert (anAlertsIt.Value(), aGravityLabel);
+ }
+ }
+ GetApplication()->SaveAs (aDocument, theFileName);
+}
+
+// =======================================================================
+// function : ImportReport
+// purpose :
+// =======================================================================
+
+Handle(Message_Report) XmlDrivers_MessageReportStorage::ImportReport (const TCollection_AsciiString& theFileName)
+{
+ Handle(TDocStd_Application) anApplication = GetApplication();
+ Standard_Integer aDocumentId = anApplication->IsInSession (theFileName);
+ if (aDocumentId > 0)
+ {
+ Handle(TDocStd_Document) aDocument;
+ anApplication->GetDocument (aDocumentId, aDocument);
+ anApplication->Close (aDocument);
+ }
+
+ Handle(TDocStd_Document) aDocument;
+ GetApplication()->Open (theFileName, aDocument);
+ if (aDocument.IsNull())
+ return Handle(Message_Report)();
+
+ TDF_Label aMainLabel = aDocument->Main();
+ if (aMainLabel.IsNull())
+ return Handle(Message_Report)();
+
+ TDF_Label aLabel;
+ Handle(Message_Report) aReport = new Message_Report();
+ for (TDF_ChildIterator aLabelsIt(aMainLabel); aLabelsIt.More(); aLabelsIt.Next())
+ {
+ TDF_Label aGravityLabel = aLabelsIt.Value();
+ if (aGravityLabel.IsNull())
+ continue;
+ Handle(TDF_Attribute) anAttribute;
+ if (!aGravityLabel.FindAttribute (TDataStd_Name::GetID(), anAttribute))
+ continue;
+ Handle(TDataStd_Name) aNameAttribute = Handle(TDataStd_Name)::DownCast (anAttribute);
+ if (aNameAttribute.IsNull())
+ continue;
+
+ // get gravity type
+ const TCollection_ExtendedString& aGravityName = aNameAttribute->Get();
+ Message_Gravity aGravity = Message::GravityFromString (TCollection_AsciiString (aGravityName).ToCString());
+
+ /// reserved label to store gravity information
+ //TDF_Label aFirstAlertLabel = aGravityLabel.FindChild (1, Standard_False);
+
+ // find alerts information, add corresponded alerts to the report
+ for (TDF_ChildIterator anAlertLabelsIt (aGravityLabel); anAlertLabelsIt.More(); anAlertLabelsIt.Next())
+ {
+ TDF_Label anAlertLabel = anAlertLabelsIt.Value();
+ if (anAlertLabel.IsNull())
+ continue;
+
+ importAlert (anAlertLabel, aGravity, aReport, Handle(Message_Alert)());
+ }
+ }
+ return aReport;
+}
+
+// =======================================================================
+// function : exportAlert
+// purpose :
+// =======================================================================
+
+void XmlDrivers_MessageReportStorage::exportAlert (const Handle(Message_Alert)& theAlert, const TDF_Label& theParentLabel)
+{
+ TDF_Label anAlertLabel = theParentLabel.NewChild();
+ TDataStd_Name::Set (anAlertLabel, theAlert->DynamicType()->Name());
+
+ /// reserved label to store parameters of the current label
+ TDF_Label anAlertParmetersLabel = anAlertLabel.NewChild();
+ exportAlertParameters (theAlert, anAlertParmetersLabel);
+
+ for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++)
+ {
+ // Gravity Label
+ TDF_Label aGravityLabel = anAlertLabel.NewChild();
+ // set gravity kind string
+ TDataStd_Name::Set (aGravityLabel, Message::GravityToString ((Message_Gravity)aGravityId));
+
+ Handle(Message_AlertNode) anAlertExtended = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (anAlertExtended.IsNull())
+ continue;
+ const Message_ListOfAlert& anAlerts = anAlertExtended->GetAlerts ((Message_Gravity)aGravityId);
+ for (Message_ListOfAlert::Iterator anAlertsIt (anAlerts); anAlertsIt.More(); anAlertsIt.Next())
+ exportAlert (anAlertsIt.Value(), aGravityLabel);
+ }
+}
+
+// =======================================================================
+// function : importAlert
+// purpose :
+// =======================================================================
+
+void XmlDrivers_MessageReportStorage::importAlert (const TDF_Label& theAlertLabel,
+ const Message_Gravity theGravity,
+ Handle(Message_Report)& theReport,
+ const Handle(Message_Alert)& theParentAlert)
+{
+ TDF_Label aParametersLabel = theAlertLabel.FindChild (1, Standard_False);
+ Handle(Message_Alert) anAlert = importAlertParameters (aParametersLabel);
+ if (anAlert.IsNull())
+ return;
+
+ TDF_Label aLabel;
+ TDF_ChildIterator aSubAlertsLabelsIt (theAlertLabel);
+ aSubAlertsLabelsIt.Next(); // do not processing the first (parameters) label
+ for (; aSubAlertsLabelsIt.More(); aSubAlertsLabelsIt.Next())
+ {
+ TDF_Label aGravityLabel = aSubAlertsLabelsIt.Value();
+ if (aGravityLabel.IsNull())
+ continue;
+ Handle(TDF_Attribute) anAttribute;
+ if (!aGravityLabel.FindAttribute (TDataStd_Name::GetID(), anAttribute))
+ continue;
+ Handle(TDataStd_Name) aNameAttribute = Handle(TDataStd_Name)::DownCast (anAttribute);
+ if (aNameAttribute.IsNull())
+ continue;
+
+ // get gravity type
+ Message_Gravity aGravity = Message::GravityFromString (TCollection_AsciiString (aNameAttribute->Get()).ToCString());
+ // find alerts information, add corresponded alerts to the report
+ for (TDF_ChildIterator anAlertLabelsIt (aGravityLabel); anAlertLabelsIt.More(); anAlertLabelsIt.Next())
+ {
+ TDF_Label anAlertLabel = anAlertLabelsIt.Value();
+ if (anAlertLabel.IsNull())
+ continue;
+
+ importAlert (anAlertLabel, aGravity, theReport, anAlert);
+ }
+ }
+ theReport->AddAlert (theGravity, anAlert, 0, theParentAlert);
+}
+
+// =======================================================================
+// function : exportAlertParameters
+// purpose :
+// =======================================================================
+void XmlDrivers_MessageReportStorage::exportAlertParameters (const Handle(Message_Alert)& theAlert, const TDF_Label& theAlertLabel)
+{
+ Handle(Message_AlertNode) anAlertExtended = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (anAlertExtended.IsNull()) // name attribute is empty
+ return;
+
+ // store attribute time
+ Handle(Message_Attribute) anAttribute = anAlertExtended->Attribute();
+
+ TDataStd_Name::Set (theAlertLabel, anAttribute->DynamicType()->Name());
+ TDataStd_Real::Set (theAlertLabel, anAlertExtended->GetCumulativeTime());
+
+ TDataStd_AsciiString::Set (theAlertLabel, anAttribute->GetName());
+ TCollection_AsciiString aDescription = anAttribute->GetDescription();
+ if (!aDescription.IsEmpty())
+ TDataStd_Comment::Set (theAlertLabel, anAttribute->GetDescription());
+
+ Standard_CString aDynamicTypeName = anAttribute->DynamicType()->Name();
+ if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfReal)->Name())
+ {
+ Handle(Message_AttributeVectorOfReal) aRealArrayAlert = Handle(Message_AttributeVectorOfReal)::DownCast (anAttribute);
+ // store values
+ const NCollection_Vector<double>& anArrayValues = aRealArrayAlert->GetValues();
+ // create real list attribute only if there are values in the attribute
+ if (anArrayValues.IsEmpty())
+ return;
+ int anArraySize = anArrayValues.Length();
+ Handle(TDataStd_RealArray) aRealListAttribute = TDataStd_RealArray::Set (theAlertLabel, 0, anArraySize - 1);
+ for (int aValueId = 0; aValueId < anArraySize; aValueId++)
+ aRealListAttribute->SetValue (aValueId, anArrayValues.Value (aValueId));
+ TDataStd_Integer::Set (theAlertLabel, aRealArrayAlert->GetColumnCount());
+ }
+ else if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfRealVec3)->Name())
+ {
+ Handle(Message_AttributeVectorOfRealVec3) aRealArrayAlert = Handle(Message_AttributeVectorOfRealVec3)::DownCast (anAttribute);
+ // store values
+ const NCollection_Vector<NCollection_Vec3<double>>& anArrayValues = aRealArrayAlert->GetValues();
+ // create real list attribute only if there are values in the attribute
+ if (anArrayValues.IsEmpty())
+ return;
+ int anArraySize = anArrayValues.Length();
+ Handle(TDataStd_RealArray) aRealListAttribute = TDataStd_RealArray::Set (theAlertLabel, 0, 3 * anArraySize - 1);
+ for (int aValueId = 0; aValueId < anArraySize; aValueId++)
+ {
+ NCollection_Vec3<double> aValue = anArrayValues.Value (aValueId);
+ aRealListAttribute->SetValue (3 * aValueId, aValue.x());
+ aRealListAttribute->SetValue (3 * aValueId + 1, aValue.y());
+ aRealListAttribute->SetValue (3 * aValueId + 2, aValue.z());
+ }
+ TDataStd_Integer::Set (theAlertLabel, aRealArrayAlert->GetColumnCount());
+ }
+ else if (aDynamicTypeName == STANDARD_TYPE (TopoDS_AlertAttribute)->Name())
+ {
+ //Handle(TopoDS_AlertAttribute) aShapeAlert = Handle(TopoDS_AlertAttribute)::DownCast (anAttribute);
+ //TNaming_Builder aNBuilder(theAlertLabel);
+ //aNBuilder.Generated(aShapeAlert->GetShape());
+ }
+}
+
+// =======================================================================
+// function : importAlertParameters
+// purpose :
+// =======================================================================
+Handle(Message_Alert) XmlDrivers_MessageReportStorage::importAlertParameters (const TDF_Label& aParametersLabel)
+{
+ Handle(TDF_Attribute) anAttribute;
+ if (!aParametersLabel.FindAttribute (TDataStd_Name::GetID(), anAttribute))
+ return Handle(Message_Alert)();
+
+ Handle(TDataStd_Name) aDynamicTypeAttribute = Handle(TDataStd_Name)::DownCast (anAttribute);
+ if (aDynamicTypeAttribute.IsNull())
+ return Handle(Message_Alert)();
+ const TCollection_ExtendedString& aDynamicTypeName = aDynamicTypeAttribute->Get();
+
+ TCollection_ExtendedString aDescription;
+ if (aParametersLabel.FindAttribute (TDataStd_Comment::GetID(), anAttribute))
+ {
+ Handle(TDataStd_Comment) aDescriptionAttribute = Handle(TDataStd_Comment)::DownCast (anAttribute);
+ if (!aDescriptionAttribute.IsNull())
+ aDescription = aDescriptionAttribute->Get();
+ }
+
+ Handle(Message_AlertNode) anAlert = new Message_AlertNode();
+ Handle(Message_Attribute) aMessageAttribute;
+ if (aDynamicTypeName == STANDARD_TYPE (Message_Attribute)->Name())
+ aMessageAttribute = new Message_Attribute();
+ else if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfReal)->Name())
+ {
+ // values
+ NCollection_Vector<double> anArrayValues;
+ if (!aParametersLabel.FindAttribute (TDataStd_RealArray::GetID(), anAttribute))
+ return Handle(Message_Alert)();
+
+ Handle(TDataStd_RealArray) aValuesAttribute = Handle(TDataStd_RealArray)::DownCast (anAttribute);
+ if (aValuesAttribute.IsNull())
+ return Handle(Message_Alert)();
+
+ for (int aValueId = aValuesAttribute->Lower(); aValueId <= aValuesAttribute->Upper(); aValueId++)
+ anArrayValues.Append (aValuesAttribute->Value (aValueId));
+
+ Standard_Integer aColumnCount = 0;
+ Handle(TDataStd_Integer) aColumnCountAttribute;
+ if (aParametersLabel.FindAttribute (TDataStd_Integer::GetID(), aColumnCountAttribute))
+ aColumnCount = aColumnCountAttribute->Get();
+
+ aMessageAttribute = new Message_AttributeVectorOfReal (anArrayValues, aColumnCount);
+ }
+ else if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfRealVec3)->Name())
+ {
+ // values
+ NCollection_Vector<NCollection_Vec3<double>> anArrayValues;
+ if (!aParametersLabel.FindAttribute(TDataStd_RealArray::GetID(), anAttribute))
+ return Handle(Message_Alert)();
+
+ Handle(TDataStd_RealArray) aValuesAttribute = Handle(TDataStd_RealArray)::DownCast (anAttribute);
+ if (aValuesAttribute.IsNull())
+ return Handle(Message_Alert)();
+
+ for (int aValueId = aValuesAttribute->Lower(); aValueId <= aValuesAttribute->Upper();
+ aValueId = aValueId + 3)
+ {
+ NCollection_Vec3<double> aValue (aValuesAttribute->Value (aValueId),
+ aValuesAttribute->Value (aValueId + 1),
+ aValuesAttribute->Value (aValueId + 2));
+ anArrayValues.Append (aValue);
+ }
+
+ Standard_Integer aColumnCount = 0;
+ Handle(TDataStd_Integer) aColumnCountAttribute;
+ if (aParametersLabel.FindAttribute (TDataStd_Integer::GetID(), aColumnCountAttribute))
+ aColumnCount = aColumnCountAttribute->Get();
+ aMessageAttribute = new Message_AttributeVectorOfRealVec3 (anArrayValues, aColumnCount);
+ }
+ else if (aDynamicTypeName == STANDARD_TYPE (TopoDS_AlertAttribute)->Name())
+ {
+ //Handle(TNaming_NamedShape) aNamedShape= new TNaming_NamedShape();
+ //if (!aParametersLabel.FindAttribute(TNaming_NamedShape::GetID(), anAttribute))
+ // return Handle(Message_Alert)();
+ //aMessageAttribute = new TopoDS_AlertAttribute (aNamedShape->Get());
+ }
+
+ if (!aMessageAttribute.IsNull())
+ {
+ // name
+ if (!aParametersLabel.FindAttribute (TDataStd_AsciiString::GetID(), anAttribute))
+ return Handle(Message_Alert)();
+ Handle(TDataStd_AsciiString) aNameAttribute = Handle(TDataStd_AsciiString)::DownCast (anAttribute);
+ if (aNameAttribute.IsNull())
+ return Handle(Message_Alert)();
+
+ aMessageAttribute->SetName (aNameAttribute->Get());
+ aMessageAttribute->SetDescription (aDescription);
+
+ anAlert->SetAttribute (aMessageAttribute);
+ }
+
+ // time
+ Standard_Real aTime = -1;
+ Handle(TDataStd_Real) aTimeAttribute;
+ if (aParametersLabel.FindAttribute (TDataStd_Real::GetID(), aTimeAttribute))
+ aTime = aTimeAttribute->Get();
+
+ anAlert->SetCumulativeTime (aTime);
+ return anAlert;
+}
--- /dev/null
+// Created on: 2018-06-10
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2001-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _XmlDrivers_MessageReportStorage
+#define _XmlDrivers_MessageReportStorage
+
+#include <Standard_Handle.hxx>
+
+#include <Message_Report.hxx>
+#include <Message_Alert.hxx>
+#include <TDF_Label.hxx>
+
+//! Base class to store/restore Message_Report content in XML document
+class XmlDrivers_MessageReportStorage
+{
+public:
+ //! Create document for the report
+ //! \param theReport the source report
+ //! \param theFileName a file name
+ Standard_EXPORT static void ExportReport (const Handle(Message_Report)& theReport, const TCollection_AsciiString& theFileName);
+
+ //! Restores document file content into report instance
+ //! \param theFileName a file name
+ //! \return new report or NULL
+ Standard_EXPORT static Handle(Message_Report) ImportReport (const TCollection_AsciiString& theFileName);
+
+private:
+ //! Create labels/attributes for the alert and place it under the parent label.
+ //! It is recursive as alerts may contains other alerts
+ //! \param theAlert a source alert
+ //! \parm theParentLabel a label where alert label is placed
+ static void exportAlert (const Handle(Message_Alert)& theAlert, const TDF_Label& theParentLabel);
+
+ //! Creates a new alert by the label parameters
+ //! \param theAlertLabel a source document label
+ //! \param theGravity an alert gravity
+ //! \param theReport a container of alerts
+ //! \param theParentAlert a parent alert, if null, the parent is report
+ static void importAlert (const TDF_Label& theAlertLabel,
+ const Message_Gravity theGravity,
+ Handle(Message_Report)& theReport,
+ const Handle(Message_Alert)& theParentAlert);
+
+ //! Convert alert to a custom type and store parameters in child labels and attributes
+ //! \param theAlert a source alert
+ //! \parm theAlertLabel an alert label
+ static void exportAlertParameters (const Handle(Message_Alert)& theAlert,
+ const TDF_Label& theAlertLabel);
+
+ //! Creates alert by label type filled by the label content
+ //! \param theParametersLabel a label
+ //! \return new alert or NULL
+ static Handle(Message_Alert) importAlertParameters (const TDF_Label& aParametersLabel);
+};
+
+#endif // _XmlDrivers_MessageReportStorage
set (CMAKE_CONFIGURATION_TYPES Release Debug RelWithDebInfo CACHE INTERNAL "" FORCE)
+# build variables
+macro (BUILD_TOOL_MESSAGE BUILD_TOOL_TARGET_VARIABLE BUILD_TOOL_TARGET_STRING)
+set (${BUILD_TOOL_TARGET_VARIABLE}_DESCR
+"Indicates whether ${BUILD_TOOL_TARGET_STRING} tool should be built or not.
+It should be noted that some toolkits of the module can be built even if this module
+is not checked (this happens if some other modules depend on these toolkits)")
+set (${BUILD_TOOL_TARGET_VARIABLE} ON CACHE BOOL "${${BUILD_TOOL_TARGET_VARIABLE}_DESCR}")
+endmacro()
+
+BUILD_TOOL_MESSAGE (BUILD_PLUGIN_TKTreeModel "TKTreeModel")
+BUILD_TOOL_MESSAGE (BUILD_PLUGIN_TKDFBrowser "TKDFBrowser")
+BUILD_TOOL_MESSAGE (BUILD_PLUGIN_TKVInspector "TKVInspector")
+BUILD_TOOL_MESSAGE (BUILD_PLUGIN_TKShapeView "TKShapeView")
+if (NOT BUILD_PLUGIN_TKDFBrowser AND NOT BUILD_PLUGIN_TKVInspector AND NOT BUILD_PLUGIN_TKShapeView)
+ set (BUILD_TREE_MODEL_ONLY ON)
+endif()
+
# macro: include patched file if it exists
macro (OCCT_INCLUDE_CMAKE_FILE BEING_INCLUDED_FILE)
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${BEING_INCLUDED_FILE}.cmake")
# list <OCCT_TOOLS> will contain all tools
#if (BUILD_Inspector)
OCCT_MODULES_AND_TOOLKITS (TOOLS "TOOL_TOOLKITS" OCCT_TOOLS)
- foreach (OCCT_TOOL ${OCCT_TOOLS})
- list (APPEND BUILD_TOOL_TOOLKITS ${${OCCT_TOOL}_TOOL_TOOLKITS})
- endforeach()
+
+ if (DEFINED BUILD_TREE_MODEL_ONLY AND BUILD_TREE_MODEL_ONLY)
+ list (APPEND BUILD_TOOL_TOOLKITS "TKTreeModel")
+ else()
+ foreach (OCCT_TOOL ${OCCT_TOOLS})
+ list (APPEND BUILD_TOOL_TOOLKITS ${${OCCT_TOOL}_TOOL_TOOLKITS})
+ endforeach()
+ endif()
+
+ message("Build: ${BUILD_TOOL_TOOLKITS}")
# collect all the headers to <binary dir>/inc/inspector folder
string(TIMESTAMP CURRENT_TIME "%H:%M:%S")
endif()
# include patched toolkit projects or original ones
-if (BUILD_TOOL_TOOLKITS)
+if (BUILD_TREE_MODEL_ONLY)
+ OCCT_ADD_SUBDIRECTORY ("tools/TKTreeModel")
+ message (STATUS "Info: TKTreeModel OCCT toolkits processed")
+else()
foreach (BUILD_TOOL_TOOLKIT ${BUILD_TOOL_TOOLKITS})
- OCCT_ADD_SUBDIRECTORY ("tools/${BUILD_TOOL_TOOLKIT}")
+ if (NOT DEFINED BUILD_PLUGIN_${BUILD_TOOL_TOOLKIT} OR BUILD_PLUGIN_${BUILD_TOOL_TOOLKIT})
+ OCCT_ADD_SUBDIRECTORY ("tools/${BUILD_TOOL_TOOLKIT}")
+ message (STATUS "Info: ${BUILD_TOOL_TOOLKIT} toolkits processed")
+ endif()
endforeach()
endif()
}
}
bool aDocumentItemFound = false;
- QModelIndex aParentIndex = index (0, 0);
- TreeModel_ItemBasePtr aParentItem = TreeModel_ModelBase::GetItemByIndex (aParentIndex); // application item
+ QModelIndex aParentIndex;
+ TreeModel_ItemBasePtr aParentItem;
// find document, where label of document item is equal to Root label
- for (int aChildId = 0, aCount = aParentItem->rowCount(); aChildId < aCount; aChildId++)
+ for (int aChildId = 0, aCount = rowCount(); aChildId < aCount; aChildId++)
{
- QModelIndex anIndex = index (aChildId, 0, aParentIndex);
+ QModelIndex anIndex = index (aChildId, 0);
TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
DFBrowser_ItemDocumentPtr anItem = itemDynamicCast<DFBrowser_ItemDocument> (anItemBase);
if (anItem->GetLabel() == aRoot)
#include <inspector/DFBrowserPane_AttributePaneSelector.hxx>
+#include <Standard_WarningsDisable.hxx>
#include <QItemSelectionModel>
+#include <Standard_WarningsRestore.hxx>
// =======================================================================
// function : Constructor
--- /dev/null
+MessageModel.qrc
+MessageModel_Actions.cxx
+MessageModel_Actions.hxx
+MessageModel_ActionType.hxx
+MessageModel_ItemAlert.cxx
+MessageModel_ItemAlert.hxx
+MessageModel_ItemBase.cxx
+MessageModel_ItemBase.hxx
+MessageModel_ItemReport.cxx
+MessageModel_ItemReport.hxx
+MessageModel_ItemRoot.cxx
+MessageModel_ItemRoot.hxx
+MessageModel_ReportCallBack.cxx
+MessageModel_ReportCallBack.hxx
+MessageModel_TableModelCompareValues.cxx
+MessageModel_TableModelCompareValues.hxx
+MessageModel_TableModelRealValues.cxx
+MessageModel_TableModelRealValues.hxx
+MessageModel_TableModelRealVec3Values.cxx
+MessageModel_TableModelRealVec3Values.hxx
+MessageModel_Tools.cxx
+MessageModel_Tools.hxx
+MessageModel_TreeModel.cxx
+MessageModel_TreeModel.hxx
--- /dev/null
+<!DOCTYPE RCC><RCC version="1.0">
+ <qresource>
+ <file>icons/item_shape.png</file>
+ <file>icons/item_vectorOfReal.png</file>
+ <file>icons/item_vectorOfRealVec3.png</file>
+ </qresource>
+</RCC>
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_ActionType_H
+#define MessageModel_ActionType_H
+
+//! Kind of action type for tree view context menu item
+enum MessageModel_ActionType
+{
+ MessageModel_ActionType_Activate, //!< set Message_Report active
+ MessageModel_ActionType_Deactivate, //!< set Message_Report not active
+ MessageModel_ActionType_ExportToShapeView //!< export TopoDS_Shape of selected item into TKShapeView plugin
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+
+#include <inspector/MessageModel_Actions.hxx>
+
+#include <inspector/MessageModel_ItemReport.hxx>
+#include <inspector/MessageModel_ItemRoot.hxx>
+#include <inspector/MessageModel_ItemAlert.hxx>
+#include <inspector/MessageModel_Tools.hxx>
+#include <inspector/MessageModel_TreeModel.hxx>
+#include <inspector/TInspectorAPI_PluginParameters.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Message_AlertNode.hxx>
+
+#include <TCollection_AsciiString.hxx>
+//#include <TopoDS_AlertWithShape.hxx>
+#include <TopoDS_AlertAttribute.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAction>
+#include <QFileDialog>
+#include <QItemSelectionModel>
+#include <QMenu>
+#include <QMessageBox>
+#include <QWidget>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+MessageModel_Actions::MessageModel_Actions (QWidget* theParent,
+ MessageModel_TreeModel* theTreeModel, QItemSelectionModel* theModel)
+: QObject (theParent), myTreeModel (theTreeModel), mySelectionModel (theModel)
+{
+ myActions.insert (MessageModel_ActionType_Deactivate,
+ ViewControl_Tools::CreateAction ("Deactivate", SLOT (OnDeactivateReport()), parent(), this));
+ myActions.insert (MessageModel_ActionType_Activate,
+ ViewControl_Tools::CreateAction ("Activate", SLOT (OnActivateReport()), parent(), this));
+ myActions.insert (MessageModel_ActionType_ExportToShapeView,
+ ViewControl_Tools::CreateAction (tr ("Export to ShapeView"), SLOT (OnExportToShapeView()), parent(), this));
+}
+
+// =======================================================================
+// function : GetAction
+// purpose :
+// =======================================================================
+QAction* MessageModel_Actions::GetAction (const MessageModel_ActionType& theType)
+{
+ if (myActions.contains (theType))
+ return myActions[theType];
+
+ return 0;
+}
+
+// =======================================================================
+// function : AddMenuActions
+// purpose :
+// =======================================================================
+void MessageModel_Actions::AddMenuActions (const QModelIndexList& theSelectedIndices, QMenu* theMenu)
+{
+ MessageModel_ItemRootPtr aRootItem;
+ MessageModel_ItemReportPtr aReportItem;
+ MessageModel_ItemAlertPtr anAlertItem;
+ for (QModelIndexList::const_iterator aSelIt = theSelectedIndices.begin(); aSelIt != theSelectedIndices.end(); aSelIt++)
+ {
+ QModelIndex anIndex = *aSelIt;
+ if (anIndex.column() != 0)
+ continue;
+
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
+ if (!anItemBase)
+ continue;
+
+ aRootItem = itemDynamicCast<MessageModel_ItemRoot> (anItemBase);
+ if (aRootItem)
+ break;
+
+ aReportItem = itemDynamicCast<MessageModel_ItemReport> (anItemBase);
+ if (aReportItem)
+ break;
+
+ anAlertItem = itemDynamicCast<MessageModel_ItemAlert> (anItemBase);
+ if (anAlertItem)
+ break;
+ }
+
+ if (aReportItem && !aReportItem->GetReport().IsNull())
+ {
+ theMenu->addAction (myActions[MessageModel_ActionType_Deactivate]);
+ theMenu->addAction (myActions[MessageModel_ActionType_Activate]);
+ }
+ else if (anAlertItem)
+ theMenu->addAction (myActions[MessageModel_ActionType_ExportToShapeView]);
+
+ theMenu->addSeparator();
+}
+
+// =======================================================================
+// function : onImportReport
+// purpose :
+// =======================================================================
+Handle(Message_Report) MessageModel_Actions::getSelectedReport (QModelIndex& theReportIndex) const
+{
+ MessageModel_ItemReportPtr aReportItem;
+ QModelIndexList aSelectedIndices = mySelectionModel->selectedIndexes();
+ for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); aSelIt != aSelectedIndices.end(); aSelIt++)
+ {
+ QModelIndex anIndex = *aSelIt;
+ if (anIndex.column() != 0)
+ continue;
+
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
+ if (!anItemBase)
+ continue;
+
+ aReportItem = itemDynamicCast<MessageModel_ItemReport> (anItemBase);
+ theReportIndex = anIndex;
+ if (aReportItem)
+ break;
+ }
+ if (!aReportItem)
+ return NULL;
+
+ return aReportItem->GetReport();
+}
+
+// =======================================================================
+// function : OnDeactivateReport
+// purpose :
+// =======================================================================
+void MessageModel_Actions::OnDeactivateReport()
+{
+ QModelIndex aReportIndex;
+ Handle(Message_Report) aReport = getSelectedReport (aReportIndex);
+ if (aReport.IsNull())
+ return;
+
+ aReport->SetActive (Standard_False);
+ ((MessageModel_TreeModel*)mySelectionModel)->EmitDataChanged (aReportIndex, aReportIndex);
+}
+
+// =======================================================================
+// function : OnActivateReport
+// purpose :
+// =======================================================================
+void MessageModel_Actions::OnActivateReport()
+{
+ QModelIndex aReportIndex;
+ Handle(Message_Report) aReport = getSelectedReport (aReportIndex);
+ if (aReport.IsNull())
+ return;
+
+ aReport->SetActive (Standard_True);
+ ((MessageModel_TreeModel*)mySelectionModel)->EmitDataChanged (aReportIndex, aReportIndex);
+}
+
+// =======================================================================
+// function : OnExportToShapeView
+// purpose :
+// =======================================================================
+void MessageModel_Actions::OnExportToShapeView()
+{
+ TCollection_AsciiString aPluginName ("TKShapeView");
+
+ NCollection_List<Handle(Standard_Transient)> aPluginParameters;
+ if (myParameters->FindParameters (aPluginName))
+ aPluginParameters = myParameters->Parameters (aPluginName);
+ NCollection_List<TCollection_AsciiString> anItemNames;
+ if (myParameters->FindSelectedNames (aPluginName))
+ anItemNames = myParameters->GetSelectedNames (aPluginName);
+
+ QModelIndexList aSelectedIndices = mySelectionModel->selectedIndexes();
+ QStringList anExportedPointers;
+ for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); aSelIt != aSelectedIndices.end(); aSelIt++)
+ {
+ QModelIndex anIndex = *aSelIt;
+ if (anIndex.column() != 0)
+ continue;
+
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
+ if (!anItemBase)
+ continue;
+
+ MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast<MessageModel_ItemAlert> (anItemBase);
+ if (!anAlertItem)
+ continue;
+
+ Handle(Message_Alert) anAlert = anAlertItem->GetAlert();
+ if (anAlert.IsNull())
+ continue;
+
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (anAlert);
+ if (aNodeAlert.IsNull())
+ continue;
+
+ Handle(Message_Attribute) anAttribute = aNodeAlert->Attribute();
+ if (anAttribute.IsNull())
+ continue;
+
+ if (!anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertAttribute)))
+ continue;
+
+ //return GetPointerInfo (Handle(TopoDS_AlertAttribute)::DownCast (anAttribute)->GetShape().TShape());
+
+ const TopoDS_Shape aShape = Handle(TopoDS_AlertAttribute)::DownCast (anAttribute)->GetShape();
+//Handle(TopoDS_AlertWithShape) aShapeAlert = Handle(TopoDS_AlertWithShape)::DownCast (anAlert);
+ //if (aShapeAlert.IsNull() || aShapeAlert->GetShape().IsNull())
+ // continue;
+ //const TopoDS_Shape aShape = aShapeAlert->GetShape();
+ if (aShape.IsNull())
+ continue;
+ aPluginParameters.Append (aShape.TShape());
+ anItemNames.Append (TInspectorAPI_PluginParameters::ParametersToString (aShape));
+
+ anExportedPointers.append (MessageModel_Tools::GetPointerInfo (aShape.TShape(), true).ToCString());
+ }
+
+ if (anExportedPointers.empty())
+ return;
+ myParameters->SetSelectedNames (aPluginName, anItemNames);
+ myParameters->SetParameters (aPluginName, aPluginParameters);
+ QMessageBox::information (0, "Information", QString ("TShapes '%1' are sent to %2 tool.")
+ .arg (anExportedPointers.join (", ")).arg (QString (aPluginName.ToCString())));
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_Actions_H
+#define MessageModel_Actions_H
+
+#include <Standard.hxx>
+#include <Standard_Transient.hxx>
+
+#include <inspector/MessageModel_ActionType.hxx>
+#include <inspector/TInspectorAPI_PluginParameters.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QObject>
+#include <QMap>
+#include <QModelIndexList>
+#include <QPoint>
+#include <QString>
+#include <Standard_WarningsRestore.hxx>
+
+class Message_Report;
+class MessageModel_TreeModel;
+
+class QAction;
+class QItemSelectionModel;
+class QMenu;
+class QWidget;
+
+//! \class MessageModel_Actions
+//! \brief This is a listener of popup context menu items and selection change in message model
+class MessageModel_Actions : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ //! Constructor
+ Standard_EXPORT MessageModel_Actions (QWidget* theParent,
+ MessageModel_TreeModel* theTreeModel,
+ QItemSelectionModel* theModel);
+
+ //! Destructor
+ virtual ~MessageModel_Actions() Standard_OVERRIDE {}
+
+ //! Returns action by the type
+ //! \param theType an action type
+ //! \return an action instance if it exists
+ Standard_EXPORT QAction* GetAction (const MessageModel_ActionType& theType);
+
+ //! Fills popup menu with actions depending on the current selection
+ //! \param theSelectedIndices tree model selected indices
+ //! \param theMenu menu to be filled
+ Standard_EXPORT void AddMenuActions (const QModelIndexList& theSelectedIndices, QMenu* theMenu);
+
+ //! Sets parameters container, it should be used when the plugin is initialized or in update content
+ //! \param theParameters a parameters container
+ void SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters)
+ { myParameters = theParameters; }
+
+public slots:
+ //! Set selected report not active
+ void OnDeactivateReport();
+
+ //! Set selected report active
+ void OnActivateReport();
+
+ //! Exports the first selected shape into ShapeViewer plugin.
+ void OnExportToShapeView();
+
+protected:
+ //! Returns report of selected tree view item if a report item is selected
+ //! \param theReportIndex tree model index of the found report
+ //! \return report instance or NULL
+ Handle(Message_Report) getSelectedReport (QModelIndex& theReportIndex) const;
+
+protected:
+ MessageModel_TreeModel* myTreeModel; //< tree model
+ QItemSelectionModel* mySelectionModel; //< selection model
+ Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container
+ QMap<MessageModel_ActionType, QAction*> myActions; //!< container of all actions
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageModel_ItemAlert.hxx>
+
+#include <inspector/MessageModel_ItemRoot.hxx>
+#include <inspector/MessageModel_ItemReport.hxx>
+#include <inspector/MessageModel_Tools.hxx>
+#include <inspector/TreeModel_Tools.hxx>
+
+#include <Message_AlertNode.hxx>
+#include <Message_AttributeVectorOfReal.hxx>
+#include <Message_AttributeVectorOfRealVec3.hxx>
+
+#include <TCollection_AsciiString.hxx>
+#include <TopoDS_AlertWithShape.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QColor>
+#include <QIcon>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant MessageModel_ItemAlert::initValue (const int theRole) const
+{
+ if (theRole == Qt::ForegroundRole)
+ {
+ MessageModel_ItemReportPtr aReportItem = MessageModel_ItemReport::FindReportItem (Parent());
+ if (!aReportItem)
+ return QVariant();
+
+ Handle(Message_Report) aReport = aReportItem->GetReport();
+ if (aReport.IsNull())
+ return QVariant();
+
+ if (!aReport->GetAlerts (Message_Fail).IsEmpty())
+ return QColor(Qt::darkRed);
+
+ for (int aGravityId = (int)Message_Trace; aGravityId <= (int)Message_Fail; aGravityId++)
+ {
+ if (!aReport->IsActive ((Message_Gravity)aGravityId))
+ return QColor(Qt::darkGray);
+ }
+ return QVariant();
+ }
+
+ Handle(Message_Alert) anAlert = getAlert();
+ if (anAlert.IsNull())
+ return QVariant();
+
+ // if the alert is composite, process the real alert
+ if (theRole == Qt::DecorationRole && Column() == 0)
+ {
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast(anAlert);
+ if (aNodeAlert.IsNull() || aNodeAlert->Attribute().IsNull())
+ return QVariant();
+
+ Handle(Message_Attribute) anAttribute = aNodeAlert->Attribute();
+ if (anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertWithShape)))
+ return QIcon (":/icons/item_shape.png");
+ else if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfReal)))
+ return QIcon (":/icons/item_vectorOfReal.png");
+ else if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfRealVec3)))
+ return QIcon (":/icons/item_vectorOfRealVec3.png");
+ else
+ return QVariant();
+ }
+
+ if (theRole != Qt::DisplayRole && theRole != Qt::ToolTipRole)
+ return QVariant();
+
+ const Message_ListOfAlert& aUnitedAlerts = GetUnitedAlerts();
+ if (anAlert.IsNull() && !aUnitedAlerts.IsEmpty()) // give information about last united alert
+ anAlert = !isReversed() ? aUnitedAlerts.Last() : aUnitedAlerts.First();
+ if (anAlert.IsNull())
+ return QVariant();
+
+ switch (Column())
+ {
+ case 0:
+ return theRole == Qt::DisplayRole ? anAlert->GetMessageKey() : anAlert->DynamicType()->Name();
+ case 1: return QVariant(); // visibility state
+ case 2: return rowCount() > 0 ? QVariant (rowCount()) : QVariant();
+ //case 3: return anAlert->ElapsedTime() < 0 ? QVariant() : anAlert->ElapsedTime();
+ case 3: return AmountElapsedTime (anAlert);
+ case 4:
+ {
+ TreeModel_ItemBasePtr aParentItem = Parent();
+ MessageModel_ItemReportPtr aReportItem = itemDynamicCast<MessageModel_ItemReport> (aParentItem);
+ while (!aReportItem)
+ {
+ aParentItem = aParentItem->Parent();
+ aReportItem = itemDynamicCast<MessageModel_ItemReport> (aParentItem);
+ }
+ double aDivideTo = MessageModel_ItemReport::AmountElapsedTime (aReportItem->GetReport());
+ return aDivideTo == 0 ? QVariant() : 100. * AmountElapsedTime (anAlert) / aDivideTo;
+ }
+ case 5: return MessageModel_Tools::GetPointerAlertInfo (anAlert).ToCString();
+ case 6: return MessageModel_Tools::GetShapeTypeAlertInfo (anAlert).ToCString();
+ case 7: return MessageModel_Tools::GetStandardTypeAlertInfo (anAlert).ToCString();
+ case 8:
+ {
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast(anAlert);
+ if (!aNodeAlert.IsNull() && !aNodeAlert->Attribute().IsNull())
+ {
+ TCollection_AsciiString aDescription = aNodeAlert->Attribute()->GetDescription();
+ return theRole == Qt::DisplayRole ? TreeModel_Tools::CutString (aDescription.ToCString())
+ : aDescription.ToCString();
+ }
+ }
+ default: break;
+ }
+ return QVariant();
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int MessageModel_ItemAlert::initRowCount() const
+{
+ const Handle(Message_Alert)& anAlert = getAlert();
+ if (anAlert.IsNull())
+ return GetUnitedAlerts().Size();
+
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast(anAlert);
+ if (aNodeAlert.IsNull())
+ return GetUnitedAlerts().Size();
+
+ int aRowCount = 0;
+ NCollection_Vector<Message_ListOfAlert> aUnitedAlerts;
+ for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++)
+ {
+ const Message_ListOfAlert& anAlerts = aNodeAlert->GetAlerts ((Message_Gravity)aGravityId);
+ if (isUniteAlerts())
+ GetUnitedAlerts (anAlerts, aUnitedAlerts);
+ else
+ aRowCount += anAlerts.Size();
+ }
+ return isUniteAlerts() ? aUnitedAlerts.Size() : aRowCount;
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr MessageModel_ItemAlert::createChild (int theRow, int theColumn)
+{
+ return MessageModel_ItemAlert::CreateItem (currentItem(), theRow, theColumn);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void MessageModel_ItemAlert::Init()
+{
+ MessageModel_ItemReportPtr aReportItem = itemDynamicCast<MessageModel_ItemReport> (Parent());
+ MessageModel_ItemAlertPtr anAlertItem;
+ Handle(Message_Report) aReport;
+ Handle(Message_Alert) anAlert;
+ if (aReportItem)
+ aReport = aReportItem->GetReport();
+ else
+ {
+ anAlertItem = itemDynamicCast<MessageModel_ItemAlert> (Parent());
+ if (anAlertItem)
+ anAlert = anAlertItem->GetAlert();
+ }
+ if (aReport.IsNull() && anAlert.IsNull() && !anAlertItem)
+ return;
+
+ if (anAlert.IsNull() && anAlertItem) // union folder item
+ {
+ int aCurrentSubId = 0;
+ for (Message_ListOfAlert::Iterator anAlertsIt (anAlertItem->GetUnitedAlerts()); anAlertsIt.More();
+ anAlertsIt.Next(), aCurrentSubId++)
+ {
+ if (aCurrentSubId != Row())
+ continue;
+ myAlert = anAlertsIt.Value();
+ MessageModel_ItemBase::Init();
+ return;
+ }
+ return;
+ }
+
+ // iterates through all gravity types, skip types where report is empty, if report is not empty, increment
+ // current index until it equal to the current row index
+ Message_ListOfAlert anAlerts;
+ NCollection_Vector<Message_ListOfAlert> aUnitedAlerts;
+ int aRowId = Row();
+ int aPreviousAlertsCount = 0;
+ for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++)
+ {
+ if (!aReport.IsNull())
+ anAlerts = aReport->GetAlerts ((Message_Gravity)aGravityId);
+ else if (!anAlert.IsNull())
+ {
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast(anAlert);
+ anAlerts = aNodeAlert->GetAlerts ((Message_Gravity)aGravityId);
+ }
+
+ if (isReversed())
+ anAlerts.Reverse();
+
+ if (isUniteAlerts())
+ {
+ GetUnitedAlerts (anAlerts, aUnitedAlerts);
+ if (aRowId < aUnitedAlerts.Size())
+ {
+ anAlerts = aUnitedAlerts.Value (aRowId);
+
+ if (anAlerts.Size() == 1)
+ myAlert = anAlerts.First();
+ else
+ myUnitedAlerts = anAlerts;
+
+ MessageModel_ItemBase::Init();
+ return;
+ }
+ }
+ else
+ {
+ if (aRowId < aPreviousAlertsCount + anAlerts.Size())
+ {
+ aRowId = aRowId - aPreviousAlertsCount;
+ int aCurrentId = 0;
+ for (Message_ListOfAlert::Iterator anAlertsIt (anAlerts); anAlertsIt.More(); anAlertsIt.Next(), aCurrentId++)
+ {
+ if (aCurrentId != Row())
+ continue;
+ myAlert = anAlertsIt.Value();
+ MessageModel_ItemBase::Init();
+ return;
+ }
+ }
+ aPreviousAlertsCount += anAlerts.Size();
+ }
+ }
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void MessageModel_ItemAlert::Reset()
+{
+ MessageModel_ItemBase::Reset();
+ myAlert = Handle(Message_Alert)();
+ myUnitedAlerts.Clear();
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void MessageModel_ItemAlert::initItem() const
+{
+ if (IsInitialized())
+ return;
+ const_cast<MessageModel_ItemAlert*>(this)->Init();
+}
+
+// =======================================================================
+// function : getAlert
+// purpose :
+// =======================================================================
+const Handle(Message_Alert)& MessageModel_ItemAlert::getAlert() const
+{
+ initItem();
+ return myAlert;
+}
+
+// =======================================================================
+// function : getUnitedAlerts
+// purpose :
+// =======================================================================
+const Message_ListOfAlert& MessageModel_ItemAlert::getUnitedAlerts() const
+{
+ initItem();
+ return myUnitedAlerts;
+}
+
+// =======================================================================
+// function : AmountElapsedTime
+// purpose :
+// =======================================================================
+double MessageModel_ItemAlert::AmountElapsedTime(const Handle(Message_Alert)& theAlert)
+{
+ if (theAlert.IsNull())
+ return 0;
+
+ double anAmountTime = 0;
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast(theAlert);
+ if (aNodeAlert->GetCumulativeTime() > 0)
+ anAmountTime = aNodeAlert->GetCumulativeTime();
+
+ return anAmountTime;
+}
+
+// =======================================================================
+// function : GetUnitedAlerts
+// purpose :
+// =======================================================================
+void MessageModel_ItemAlert::GetUnitedAlerts(const Message_ListOfAlert& theAlerts,
+ NCollection_Vector<Message_ListOfAlert>& theUnitedAlerts)
+{
+ //theUnitedAlerts.Clear();
+ TCollection_AsciiString anAlertMessageKey;
+ for (Message_ListOfAlert::Iterator anAlertsIt (theAlerts); anAlertsIt.More(); anAlertsIt.Next())
+ {
+ Handle(Message_Alert) anAlert = anAlertsIt.Value();
+ if (anAlertMessageKey.IsEqual (anAlert->GetMessageKey())) {
+ Message_ListOfAlert anAlerts = theUnitedAlerts.Last();
+ anAlerts.Append (anAlert);
+ theUnitedAlerts.SetValue(theUnitedAlerts.Size()-1, anAlerts);
+ }
+ else {
+ Message_ListOfAlert anAlerts;
+ anAlerts.Append (anAlert);
+ theUnitedAlerts.Append (anAlerts);
+ anAlertMessageKey = anAlert->GetMessageKey();
+ }
+ }
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_ItemAlert_H
+#define MessageModel_ItemAlert_H
+
+#include <inspector/MessageModel_ItemBase.hxx>
+#include <Message_Alert.hxx>
+#include <Message_ListOfAlert.hxx>
+#include <Message_Report.hxx>
+#include <Standard.hxx>
+#include <TopoDS_Shape.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QMap>
+#include <QVariant>
+#include <Standard_WarningsRestore.hxx>
+
+#include <NCollection_Vector.hxx>
+
+class QAbstractTableModel;
+
+class MessageModel_ItemAlert;
+typedef QExplicitlySharedDataPointer<MessageModel_ItemAlert> MessageModel_ItemAlertPtr;
+
+//! \class MessageModel_ItemAlert
+//! This item is connected to Message_Alert.
+//! Parent is either MessageModel_ItemRoot or MessageModel_ItemAlert, children are MessageModel_ItemAlert or no children
+class MessageModel_ItemAlert : public MessageModel_ItemBase
+{
+public:
+
+ //! Creates an item wrapped by a shared pointer
+ //! \param theRow the item row positition in the parent item
+ //! \param theColumn the item column positition in the parent item
+ //! \return the pointer to the created item
+ static MessageModel_ItemAlertPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ { return MessageModel_ItemAlertPtr (new MessageModel_ItemAlert (theParent, theRow, theColumn)); }
+
+ //! Destructor
+ virtual ~MessageModel_ItemAlert() Standard_OVERRIDE {};
+
+ //! Returns the current shape
+ const Handle(Message_Alert)& GetAlert() const { return myAlert; }
+
+ //! Returns united alerts or empty list
+ const Message_ListOfAlert& GetUnitedAlerts() const { return myUnitedAlerts; }
+
+ //! Inits the item, fills internal containers
+ Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+ //! Resets cached values
+ Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+ //! Return data value for the role.
+ //! \param theRole a value role
+ //! \return the value
+ Standard_EXPORT virtual QVariant initValue (const int theRole) const Standard_OVERRIDE;
+
+ //! \return number of children.
+ Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE;
+
+ //! Sets some shape to present the item
+ //! \param theShape shape instance
+ void SetCustomShape (const TopoDS_Shape& theShape) { myCustomShape = theShape; }
+
+ //! Returns custom shape to present the item
+ //! \return instance of the shape
+ const TopoDS_Shape& GetCustomShape() const { return myCustomShape; }
+
+ //! Returns summ of children alert elapsed times. The method is recusive.
+ //! \param theAlert a message alert
+ //! \return double value
+ Standard_EXPORT static double AmountElapsedTime (const Handle(Message_Alert)& theAlert);
+
+ //! Returns alerts united by Message Key
+ //! \param theAlerts source message alert
+ //! \param theUnitedAlerts arranged source message alerts
+ Standard_EXPORT static void GetUnitedAlerts (const Message_ListOfAlert& theAlerts,
+ NCollection_Vector<Message_ListOfAlert> & theUnitedAlerts);
+
+protected:
+
+ //! Initialize the current item. It is empty because Reset() is also empty.
+ virtual void initItem() const Standard_OVERRIDE;
+
+ //! Creates a child item in the given position.
+ //! \param theRow the child row position
+ //! \param theColumn the child column position
+ //! \return the created item
+ virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE;
+
+ //! Returns current alert, initialized item if it has not been initialized yet
+ //! \return alert value
+ const Handle(Message_Alert)& getAlert() const;
+
+ //! Returns current united alert, initialized item if it has not been initialized yet
+ //! \return container of united alert value
+ const Message_ListOfAlert& getUnitedAlerts() const;
+
+ //! Returns summ of children alert elapsed times. The method is recusive.
+ //! \param theAlert a message alert
+ //! \return double value
+ double getAmountElapsedTime() const;
+
+private:
+
+ //! Constructor
+ MessageModel_ItemAlert (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ : MessageModel_ItemBase (theParent, theRow, theColumn) {}
+
+private:
+ Handle(Message_Alert) myAlert;
+ Message_ListOfAlert myUnitedAlerts;
+ TopoDS_Shape myCustomShape;
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+
+#include <inspector/MessageModel_ItemBase.hxx>
+#include <inspector/MessageModel_ItemRoot.hxx>
+
+// =======================================================================
+// function : isReversed
+// purpose :
+// =======================================================================
+Standard_Boolean MessageModel_ItemBase::isReversed() const
+{
+ TreeModel_ItemBasePtr aParentItem = GetRootItem();
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (aParentItem);
+ return aRootItem ? aRootItem->IsReversed() : Standard_False;
+}
+
+// =======================================================================
+// function : isUniteAlerts
+// purpose :
+// =======================================================================
+Standard_Boolean MessageModel_ItemBase::isUniteAlerts() const
+{
+ TreeModel_ItemBasePtr aParentItem = GetRootItem();
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (aParentItem);
+ return aRootItem ? aRootItem->IsUniteAlerts() : Standard_False;
+}
+
+// =======================================================================
+// function : GetRootItem
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr MessageModel_ItemBase::GetRootItem() const
+{
+ TreeModel_ItemBasePtr anItem = Parent();
+ while (anItem)
+ {
+ if (MessageModel_ItemRootPtr aThisRootItem = itemDynamicCast<MessageModel_ItemRoot> (anItem))
+ {
+ return aThisRootItem;
+ }
+ anItem = anItem->Parent();
+ }
+ return TreeModel_ItemBasePtr();
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_ItemBase_H
+#define MessageModel_ItemBase_H
+
+#include <Standard.hxx>
+#include <TopoDS_Shape.hxx>
+#include <inspector/TreeModel_ItemBase.hxx>
+
+class MessageModel_ItemBase;
+typedef QExplicitlySharedDataPointer<MessageModel_ItemBase> MessageModel_ItemBasePtr;
+
+//! \class MessageModel_ItemBase
+// \brief Declaration of the tree model base item.
+class MessageModel_ItemBase : public TreeModel_ItemBase
+{
+public:
+
+ //! Resets cached values
+ virtual void Reset() Standard_OVERRIDE { TreeModel_ItemBase::Reset(); }
+
+protected:
+
+ //! Initialize the current item. It creates a backup of the specific item information
+ virtual void initItem() const {};
+
+ //! Constructor
+ //! param theParent a parent item
+ //! \param theRow the item row positition in the parent item
+ //! \param theColumn the item column positition in the parent item
+ MessageModel_ItemBase (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ : TreeModel_ItemBase (theParent, theRow, theColumn) {}
+
+ //! Return whether the view is reversed or not
+ //! \return boolean value
+ Standard_Boolean isReversed() const;
+
+ //! Return whether the view is reversed or not
+ //! \return boolean value
+ Standard_Boolean isUniteAlerts() const;
+
+ //! Return root item
+ //! \return an item instance
+ TreeModel_ItemBasePtr GetRootItem() const;
+};
+
+#endif
\ No newline at end of file
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageModel_ItemReport.hxx>
+
+#include <inspector/MessageModel_ItemRoot.hxx>
+#include <inspector/MessageModel_ItemAlert.hxx>
+
+#include <OSD_Path.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QColor>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant MessageModel_ItemReport::initValue (const int theRole) const
+{
+ const Handle(Message_Report)& aReport = getReport();
+ if (aReport.IsNull())
+ return QVariant();
+
+ if (theRole == Qt::ForegroundRole)
+ {
+ if (!aReport->GetAlerts (Message_Fail).IsEmpty())
+ return QColor(Qt::darkRed);
+
+ for (int aGravityId = (int)Message_Trace; aGravityId <= (int)Message_Fail; aGravityId++)
+ {
+ if (!aReport->IsActive ((Message_Gravity)aGravityId))
+ return QColor(Qt::darkGray);
+ }
+ return QVariant();
+ }
+ if (theRole == Qt::ToolTipRole && !myDescription.IsEmpty() && Column() == 8)
+ return myDescription.ToCString();
+
+ if (theRole != Qt::DisplayRole)
+ return QVariant();
+
+ switch (Column())
+ {
+ case 0: return aReport->DynamicType()->Name();
+ case 1: return QVariant(); // visibility state
+ case 2: return rowCount() > 0 ? QVariant (rowCount()) : QVariant();
+ case 3:
+ {
+ double anAmountTime = AmountElapsedTime (aReport);
+ return anAmountTime < 1 ? QVariant() : anAmountTime;
+ }
+ case 4: return "100";
+ case 8:
+ {
+ if (myDescription.IsEmpty())
+ return QVariant();
+
+ OSD_Path aPath(myDescription);
+ return QString ("%1%2").arg (aPath.Name().ToCString()).arg (aPath.Extension().ToCString());
+ }
+ default: break;
+ }
+ return QVariant();
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int MessageModel_ItemReport::initRowCount() const
+{
+ const Handle(Message_Report)& aReport = getReport();
+ if (aReport.IsNull())
+ return 0;
+
+ int aRowCount = 0;
+ NCollection_Vector<Message_ListOfAlert> aUnitedAlerts;
+ for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++)
+ {
+ const Message_ListOfAlert& anAlerts = aReport->GetAlerts ((Message_Gravity)aGravityId);
+ if (isUniteAlerts())
+ {
+ MessageModel_ItemAlert::GetUnitedAlerts (anAlerts, aUnitedAlerts);
+ aRowCount += aUnitedAlerts.Size();
+ }
+ else
+ aRowCount += anAlerts.Size();
+ }
+ return isUniteAlerts() ? aUnitedAlerts.Size() : aRowCount;
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr MessageModel_ItemReport::createChild (int theRow, int theColumn)
+{
+ return MessageModel_ItemAlert::CreateItem (currentItem(), theRow, theColumn);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void MessageModel_ItemReport::Init()
+{
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (Parent());
+ myReport = aRootItem ? aRootItem->GetReport (Row(), myDescription) : Handle(Message_Report)();
+}
+
+// =======================================================================
+// function : getReport
+// purpose :
+// =======================================================================
+const Handle(Message_Report)& MessageModel_ItemReport::getReport() const
+{
+ initItem();
+ return myReport;
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void MessageModel_ItemReport::Reset()
+{
+ MessageModel_ItemBase::Reset();
+ myReport = Handle(Message_Report)();
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void MessageModel_ItemReport::initItem() const
+{
+ if (IsInitialized())
+ return;
+ const_cast<MessageModel_ItemReport*>(this)->Init();
+}
+
+// =======================================================================
+// function : FindReportItem
+// purpose :
+// =======================================================================
+MessageModel_ItemReportPtr MessageModel_ItemReport::FindReportItem (const TreeModel_ItemBasePtr& theItem)
+{
+ TreeModel_ItemBasePtr anItem = theItem;
+ while (anItem)
+ {
+ if (MessageModel_ItemReportPtr aReportItem = itemDynamicCast<MessageModel_ItemReport>(anItem))
+ return aReportItem;
+
+ anItem = anItem->Parent();
+ }
+ return MessageModel_ItemReportPtr();
+}
+
+// =======================================================================
+// function : AmountElapsedTime
+// purpose :
+// =======================================================================
+double MessageModel_ItemReport::AmountElapsedTime (const Handle(Message_Report)& theReport)
+{
+ if (theReport.IsNull())
+ return 0;
+
+ double anAmountTime = 0;
+
+ for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++)
+ {
+ for (Message_ListOfAlert::Iterator anAlertsIt (theReport->GetAlerts ((Message_Gravity)aGravityId)); anAlertsIt.More(); anAlertsIt.Next())
+ {
+ double aSubItemTime = MessageModel_ItemAlert::AmountElapsedTime (anAlertsIt.Value());
+ if (aSubItemTime > 0)
+ anAmountTime += aSubItemTime;
+ }
+ }
+ return anAmountTime;
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_ItemReport_H
+#define MessageModel_ItemReport_H
+
+#include <inspector/MessageModel_ItemBase.hxx>
+#include <Standard.hxx>
+#include <TCollection_AsciiString.hxx>
+#include <Message_Report.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QMap>
+#include <QVariant>
+#include <Standard_WarningsRestore.hxx>
+
+class MessageModel_ItemReport;
+typedef QExplicitlySharedDataPointer<MessageModel_ItemReport> MessageModel_ItemReportPtr;
+
+//! \class MessageModel_ItemReport
+//! This item is connected to Message_Alert.
+//! Parent is MessageModel_ItemRoot, children are MessageModel_ItemAlert or no children
+class MessageModel_ItemReport : public MessageModel_ItemBase
+{
+public:
+
+ //! Creates an item wrapped by a shared pointer
+ //! \param theRow the item row positition in the parent item
+ //! \param theColumn the item column positition in the parent item
+ //! \return the pointer to the created item
+ static MessageModel_ItemReportPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ { return MessageModel_ItemReportPtr (new MessageModel_ItemReport (theParent, theRow, theColumn)); }
+
+ //! Destructor
+ virtual ~MessageModel_ItemReport() Standard_OVERRIDE {};
+
+ //! Returns the current shape
+ const Handle(Message_Report)& GetReport() const { return myReport; }
+
+ const TCollection_AsciiString& GetDescription() const { return myDescription; }
+
+ //! Inits the item, fills internal containers
+ Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+ //! Resets cached values
+ Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+ //! Return data value for the role.
+ //! \param theRole a value role
+ //! \return the value
+ Standard_EXPORT virtual QVariant initValue (const int theRole) const Standard_OVERRIDE;
+
+ //! \return number of children.
+ Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE;
+
+ //! Returns report of the tree model item. Iterates up by parents intil the report item is found.
+ //! \return an item or NULL
+ Standard_EXPORT static MessageModel_ItemReportPtr FindReportItem (const TreeModel_ItemBasePtr& theItem);
+
+ //! Returns summ of children alert elapsed times. The method is recusive.
+ //! \param theAlert a message alert
+ //! \return double value
+ Standard_EXPORT static double AmountElapsedTime (const Handle(Message_Report)& theReport);
+
+protected:
+
+ //! Initialize the current item. It is empty because Reset() is also empty.
+ virtual void initItem() const Standard_OVERRIDE;
+
+ //! Creates a child item in the given position.
+ //! \param theRow the child row position
+ //! \param theColumn the child column position
+ //! \return the created item
+ virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE;
+
+ //! Returns number of child shapes. Init item if it is not initialized
+ //! \return integer value
+ int getRowCount() const;
+
+ //! Returns current shape, initialized item if it has not been initialized yet
+ //! \return shape value
+ const Handle(Message_Report)& getReport() const;
+
+private:
+
+ //! Constructor
+ MessageModel_ItemReport (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ : MessageModel_ItemBase (theParent, theRow, theColumn) {}
+
+private:
+
+ Handle(Message_Report) myReport; //!< current report
+ TCollection_AsciiString myDescription; //!< description
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+
+#include <inspector/MessageModel_ItemRoot.hxx>
+#include <inspector/MessageModel_ItemReport.hxx>
+
+// =======================================================================
+// function : SetReport
+// purpose :
+// =======================================================================
+void MessageModel_ItemRoot::SetReport (const int theRowId, const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theReportDescription)
+{
+ NCollection_List<MessageModel_ReportInformation>::Iterator aReportsIt (myReports);
+ for (int aRowId = 0; aReportsIt.More(); aReportsIt.Next(), aRowId++)
+ {
+ if (aRowId == theRowId)
+ break;
+ }
+ aReportsIt.Value().myReport = theReport;
+ aReportsIt.Value().myDescription = theReportDescription;
+}
+
+// =======================================================================
+// function : HasReport
+// purpose :
+// =======================================================================
+Standard_Boolean MessageModel_ItemRoot::HasReport (const Handle(Message_Report)& theReport)
+{
+ NCollection_List<MessageModel_ReportInformation>::Iterator aReportsIt (myReports);
+ for (int aRowId = 0; aReportsIt.More(); aReportsIt.Next(), aRowId++)
+ {
+ if (aReportsIt.Value().myReport == theReport)
+ return Standard_True;
+ }
+ return Standard_False;
+}
+
+// =======================================================================
+// function : GetReport
+// purpose :
+// =======================================================================
+const Handle(Message_Report)& MessageModel_ItemRoot::GetReport (const int theRowId,
+ TCollection_AsciiString& theReportDescription)
+{
+ NCollection_List<MessageModel_ReportInformation>::Iterator aReportsIt (myReports);
+ for (int aRowId = 0; aReportsIt.More(); aReportsIt.Next(), aRowId++)
+ {
+ if (aRowId == theRowId)
+ break;
+ }
+ theReportDescription = aReportsIt.Value().myDescription;
+ return aReportsIt.Value().myReport;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant MessageModel_ItemRoot::initValue (const int theRole) const
+{
+ if (Column() != 0)
+ return QVariant();
+
+ if (theRole == Qt::DisplayRole)
+ return myName.IsEmpty() ? "Message_Reports" : myName.ToCString();
+
+ return QVariant();
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr MessageModel_ItemRoot::createChild (int theRow, int theColumn)
+{
+ return MessageModel_ItemReport::CreateItem (currentItem(), theRow, theColumn);
+}
+
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_ItemRoot_H
+#define MessageModel_ItemRoot_H
+
+#include <Message_Alert.hxx>
+#include <Message_Report.hxx>
+#include <NCollection_List.hxx>
+#include <Standard.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#include <inspector/MessageModel_ItemBase.hxx>
+
+class MessageModel_ItemRoot;
+typedef QExplicitlySharedDataPointer<MessageModel_ItemRoot> MessageModel_ItemRootPtr;
+
+//! \class MessageModel_ItemRoot
+//! Collects message reports that should be visualized in tree view. Reports are cached and if reports are not needed,
+//! cache should be cleared using RemoveAllReports
+//! Parent is NULL, children are MessageModel_ItemReport items.
+class MessageModel_ItemRoot : public MessageModel_ItemBase
+{
+private:
+ //! \struct to extend report by description
+ struct MessageModel_ReportInformation
+ {
+ //! Constructor
+ MessageModel_ReportInformation (Handle(Message_Report) theReport, const TCollection_AsciiString& theDescription)
+ : myReport (theReport), myDescription (theDescription) {}
+
+ Handle(Message_Report) myReport; //! report
+ TCollection_AsciiString myDescription; //! report description
+ };
+public:
+
+ //! Creates an item wrapped by a shared pointer
+ static MessageModel_ItemRootPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ { return MessageModel_ItemRootPtr (new MessageModel_ItemRoot (theParent, theRow, theColumn)); }
+
+ //! Destructor
+ virtual ~MessageModel_ItemRoot() Standard_OVERRIDE {};
+
+ //! Appends new report
+ //! \param theReport a report instance
+ //! \param theReportDescription an additional report information
+ void AddReport (const Handle(Message_Report)& theReport, const TCollection_AsciiString& theReportDescription)
+ { myReports.Append (MessageModel_ReportInformation (theReport, theReportDescription)); }
+
+ //! Set report, se it into the given row index
+ //! \param theRowId a report child row
+ //! \param theReport a report instance
+ //! \param theReportDescription an additional report information
+ Standard_EXPORT void SetReport (const int theRowId, const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theReportDescription = "");
+
+ //! Returns true if report exists is in the list of the current reports
+ //! \param theReport a report instance
+ //! \return boolen value
+ Standard_EXPORT Standard_Boolean HasReport (const Handle(Message_Report)& theReport);
+
+ //! Clears internal container of added reports
+ void RemoveAllReports() { myReports.Clear(); }
+
+ //! Returns report by the number
+ //! \param theRowId an index of the report in the internal container.
+ Standard_EXPORT const Handle(Message_Report)& GetReport (const int theRowId, TCollection_AsciiString& theReportDescription);
+
+ //! Set the view reversed. If reversed, the last report alert is upper item in the tree view
+ //! \param theReversed boolean flag
+ void SetReversed (const Standard_Boolean& theReversed) { myIsReversed = theReversed; }
+
+ //! Return whether the view is reversed or not
+ //! \return boolean value
+ Standard_Boolean IsReversed() const { return myIsReversed; };
+
+ //! Set the view reversed. If reversed, the last report alert is upper item in the tree view
+ //! \param theReversed boolean flag
+ void SetUniteAlerts (const Standard_Boolean& theUniteAlerts) { myIsUniteAlerts = theUniteAlerts; }
+
+ //! Return whether the view is reversed or not
+ //! \return boolean value
+ Standard_Boolean IsUniteAlerts() const { return myIsUniteAlerts; };
+
+ //! Set the view reversed. If reversed, the last report alert is upper item in the tree view
+ //! \param theReversed boolean flag
+ void SetName (const TCollection_AsciiString& theName) { myName = theName; }
+
+protected:
+
+ //! Return data value for the role.
+ //! \param theRole a value role
+ //! \return the value
+ virtual QVariant initValue (const int theRole) const Standard_OVERRIDE;
+
+ //! \return number of children.
+ virtual int initRowCount() const Standard_OVERRIDE { return myReports.Size(); }
+
+ //! Creates a child item in the given position.
+ //! \param theRow the child row position
+ //! \param theColumn the child column position
+ //! \return the created item
+ virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE;
+
+private:
+
+ //! Constructor
+ //! param theParent a parent item
+ MessageModel_ItemRoot (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ : MessageModel_ItemBase (theParent, theRow, theColumn), myIsReversed (Standard_False) {}
+
+private:
+
+ NCollection_List<MessageModel_ReportInformation> myReports; //!< reports sent by algorithms
+ Standard_Boolean myIsReversed; //!< state if the model is reversed
+ Standard_Boolean myIsUniteAlerts; //!< state whether equal named alerts should be united in a folder
+ TCollection_AsciiString myName; //!< DisplayRole data, if defined
+};
+
+#endif
--- /dev/null
+// Created on: 2018-06-20
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include "MessageModel_ReportCallBack.hxx"
+
+IMPLEMENT_STANDARD_RTTIEXT(MessageModel_ReportCallBack, Message_ReportCallBack)
--- /dev/null
+// Created on: 2018-06-20
+// Created by: Natalia Ermolaeva
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _MessageModel_ReportCallBack_HeaderFile
+#define _MessageModel_ReportCallBack_HeaderFile
+
+#include <Message_ReportCallBack.hxx>
+
+#include "inspector/TInspectorAPI_Communicator.hxx"
+
+class TInspectorAPI_Communicator;
+DEFINE_STANDARD_HANDLE(MessageModel_ReportCallBack, Message_ReportCallBack)
+
+//! Class to update tree view model by message report events.
+class MessageModel_ReportCallBack : public Message_ReportCallBack
+{
+public:
+
+ //! Constructor
+ MessageModel_ReportCallBack (TInspectorAPI_Communicator* theWindow) : Message_ReportCallBack(), myCommunicator (theWindow) {}
+
+ //! Destructor
+ ~MessageModel_ReportCallBack() {}
+
+ // Interface to be implemented in the child to process the message report event
+ // \theAlert updated alert
+ virtual void Update(const Handle(Message_Alert)& theAlert) { (void)theAlert; myCommunicator->UpdateContent(); }
+
+ // OCCT RTTI
+ DEFINE_STANDARD_RTTIEXT(MessageModel_ReportCallBack, Message_ReportCallBack)
+
+private:
+ TInspectorAPI_Communicator* myCommunicator; //< communicator
+};
+
+#endif // _MessageModel_ReportCallBack_HeaderFile
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageModel_TableModelCompareValues.hxx>
+
+#include <inspector/ViewControl_TableModel.hxx>
+
+#include <Precision.hxx>
+
+const int REAL_SIGNS = 16;
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+MessageModel_TableModelCompareValues::MessageModel_TableModelCompareValues (ViewControl_TableModelValues* theValues1,
+ ViewControl_TableModelValues* theValues2)
+ : myValues1 (theValues1), myValues2 (theValues2)
+{
+ SetUseTableSeparateSize (theValues1->UseTableSeparateSize());
+ SetUseTableProperties (false);
+
+ Standard_Integer aSectionSize;
+ theValues1->GetDefaultSectionSize(Qt::Horizontal, aSectionSize);
+ SetDefaultSectionSize (Qt::Horizontal, aSectionSize);
+}
+
+// =======================================================================
+// function : Destructor
+// purpose :
+// =======================================================================
+
+MessageModel_TableModelCompareValues::~MessageModel_TableModelCompareValues()
+{
+ if (myValues1)
+ delete myValues1;
+
+ if (myValues2)
+ delete myValues2;
+}
+
+// =======================================================================
+// function : ColumnCount
+// purpose :
+// =======================================================================
+
+int MessageModel_TableModelCompareValues::ColumnCount (const QModelIndex& theIndex) const
+{
+ int aColumnCount1 = myValues1->ColumnCount (theIndex);
+ return aColumnCount1 == myValues2->ColumnCount (theIndex) ? aColumnCount1 : 0;
+}
+
+// =======================================================================
+// function : Data
+// purpose :
+// =======================================================================
+
+QVariant MessageModel_TableModelCompareValues::Data (const int theRow, const int theColumn, int theRole) const
+{
+ QVariant aValue1 = myValues1->Data (theRow, theColumn, Qt::DisplayRole);
+ QVariant aValue2 = myValues2->Data (theRow, theColumn, Qt::DisplayRole);
+
+ QVariant aToolTipValue;
+ QVariant aDifference;
+ if (aValue1 != aValue2) {
+ bool isOk1, isOk2;
+ double aDoubleValue_1 = aValue1.toDouble(&isOk1);
+ double aDoubleValue_2 = aValue2.toDouble(&isOk2);
+
+ if (isOk1 && isOk2)
+ {
+ double aDoubleDifference = fabs (aDoubleValue_1 - aDoubleValue_2);
+ if (aDoubleDifference > Precision::Confusion())
+ {
+ aDifference = aDoubleDifference;
+ aToolTipValue = QString ("%1 (first value)\n%2 (second value)\n%3 (difference: first-second)")
+ .arg (QString::number (aDoubleValue_1, 'g', REAL_SIGNS))
+ .arg (QString::number (aDoubleValue_2, 'g', REAL_SIGNS))
+ .arg (aDifference.toString());
+ }
+ }
+ else {
+ aDifference = QString ("%1 / %2").arg (aValue1.toString()).arg (aValue2.toString());
+ aToolTipValue = QString ("(first value) / (second value)");
+ }
+ }
+
+ switch (theRole)
+ {
+ case Qt::DisplayRole: return aDifference;
+ case Qt::ToolTipRole: return aToolTipValue;
+ case Qt::BackgroundRole: return !aDifference.isNull() ? QVariant (QColor (200, 191, 231)) : QVariant();
+ default: break;
+ }
+ return QVariant();
+}
+
+// =======================================================================
+// function : GetRangeValues
+// purpose :
+// =======================================================================
+
+void MessageModel_TableModelCompareValues::GetRangeValues (QString& theMinValue, QString& theMaxValue,
+ const QModelIndexList& theSelected) const
+{
+ (void)theMinValue; (void)theMaxValue; (void)theSelected;
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_TableModelCompareValues_H
+#define MessageModel_TableModelCompareValues_H
+
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <Message_AttributeVectorOfReal.hxx>
+
+//! \class MessageModel_TableModelCompareValues
+//! \brief This is an implementation for ViewControl_TableModel to present Message_AttributeVectorOfReal object
+class MessageModel_TableModelCompareValues : public ViewControl_TableModelValues
+{
+public:
+
+ //! Constructor
+ Standard_EXPORT MessageModel_TableModelCompareValues (ViewControl_TableModelValues* theValues1,
+ ViewControl_TableModelValues* theValues2);
+
+ //! Destructor
+ virtual ~MessageModel_TableModelCompareValues() Standard_OVERRIDE;
+
+ //! Returns number of columns, size of header values
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ Standard_EXPORT virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const;
+
+ //! Returns content of the model index for the given role, it is obtained from internal container of values
+ //! It returns value only for DisplayRole.
+ //! \param theIndex a model index
+ //! \param theRole a view role
+ //! \return value intepreted depending on the given role
+ Standard_EXPORT virtual QVariant Data (const int theRow, const int theColumn, int theRole = Qt::DisplayRole) const;
+
+ //! Returns minimum and maximum values of selected items or the table content (if selected list is empty)
+ //! \param theMinValue minimum
+ //! \param theMaxValue maximum
+ //! \param theSelected selected cells
+ virtual void GetRangeValues (QString& theMinValue, QString& theMaxValue, const QModelIndexList& theSelected) const;
+
+ //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ virtual int GetValuesCount () const { return myValues1->GetValuesCount(); }
+
+private:
+ ViewControl_TableModelValues* myValues1; // first table values
+ ViewControl_TableModelValues* myValues2; // second table values
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageModel_TableModelRealValues.hxx>
+
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableModelFilter.hxx>
+
+const int REAL_SIGNS = 16;
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+MessageModel_TableModelRealValues::MessageModel_TableModelRealValues (const Handle(Message_Attribute)& theAttribute,
+ const int theSectionWidth)
+ : myAttribute (Handle(Message_AttributeVectorOfReal)::DownCast (theAttribute)), myFilter(0)
+{
+ if (myAttribute->GetColumnCount() > 0)
+ myFilter = new ViewControl_TableModelFilter (myAttribute->GetColumnCount());
+
+ SetUseTableSeparateSize (!myFilter);
+
+ SetUseTableProperties (true);
+ SetUseTablePropertiesXStep (true, -1);
+
+ SetDefaultSectionSize (Qt::Horizontal, theSectionWidth);
+}
+
+// =======================================================================
+// function : ColumnCount
+// purpose :
+// =======================================================================
+
+int MessageModel_TableModelRealValues::ColumnCount (const QModelIndex&) const
+{
+ int aColumnCount = myAttribute->GetValues().Length();
+ if (myFilter)
+ aColumnCount = myFilter->ColumnCount (aColumnCount);
+
+ return aColumnCount;
+}
+
+// =======================================================================
+// function : Data
+// purpose :
+// =======================================================================
+
+QVariant MessageModel_TableModelRealValues::Data (const int theRow, const int theColumn, int theRole) const
+{
+ if (theRole != Qt::DisplayRole || theColumn > myAttribute->GetValues().Length())
+ return QVariant();
+
+ int aRow = theRow, aColumn = theColumn;
+ if (myFilter)
+ myFilter->GetSourcePosition (theRow, theColumn, aRow, aColumn);
+
+ return myAttribute->GetValues().Value(aColumn);
+}
+
+// =======================================================================
+// function : GetRangeValues
+// purpose :
+// =======================================================================
+
+void MessageModel_TableModelRealValues::GetRangeValues (QString& theMinValue, QString& theMaxValue, const QModelIndexList& theSelected) const
+{
+ double aMinValue, aMaxValue;
+ aMinValue = DBL_MAX;
+ aMaxValue = DBL_MIN;
+
+ NCollection_Vector<double> aValues = myAttribute->GetValues();
+ int aValuesSize = aValues.Length();
+ if (aValuesSize < 1)
+ return;
+
+ if (theSelected.isEmpty())
+ {
+ aMinValue = aMaxValue = aValues.First();
+ for (int i = 1; i < aValuesSize; i++)
+ {
+ double aValue = aValues.Value (i);
+ if (aValue < aMinValue) aMinValue = aValue;
+ if (aValue > aMaxValue) aMaxValue = aValue;
+ }
+ }
+ else
+ {
+ ViewControl_TableModel* aModel = (ViewControl_TableModel*)theSelected[0].model();
+ int aRow, aColumn;
+ for (QModelIndexList::const_iterator aSelIt = theSelected.begin(); aSelIt != theSelected.end(); aSelIt++)
+ {
+ if (myFilter)
+ myFilter->GetSourcePosition (*aSelIt, aRow, aColumn);
+ else
+ aModel->GetSourcePosition (*aSelIt, aRow, aColumn);
+ if (aColumn >= aValuesSize)
+ continue;
+
+ double aValue = aValues.Value (aColumn);
+ if (aValue < aMinValue) aMinValue = aValue;
+ if (aValue > aMaxValue) aMaxValue = aValue;
+ }
+ }
+
+ theMinValue = QString::number(aMinValue, 'g', REAL_SIGNS);
+ theMaxValue = QString::number(aMaxValue, 'g', REAL_SIGNS);
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_TableModelRealValues_H
+#define MessageModel_TableModelRealValues_H
+
+#include <inspector/ViewControl_TableModelValues.hxx>
+#include <inspector/ViewControl_TableModelFilter.hxx>
+
+#include <Message_AttributeVectorOfReal.hxx>
+
+//! \class MessageModel_TableModelRealValues
+//! \brief This is an implementation for ViewControl_TableModel to present Message_AttributeVectorOfReal object
+class MessageModel_TableModelRealValues : public ViewControl_TableModelValues
+{
+public:
+
+ //! Constructor
+ Standard_EXPORT MessageModel_TableModelRealValues (const Handle(Message_Attribute)& theAttribute, const int theSectionWidth);
+
+ //! Destructor
+ virtual ~MessageModel_TableModelRealValues() Standard_OVERRIDE {}
+
+ //! Returns number of columns, size of header values
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ Standard_EXPORT virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const;
+
+ //! Returns content of the model index for the given role, it is obtained from internal container of values
+ //! It returns value only for DisplayRole.
+ //! \param theIndex a model index
+ //! \param theRole a view role
+ //! \return value intepreted depending on the given role
+ Standard_EXPORT virtual QVariant Data (const int theRow, const int theColumn, int theRole = Qt::DisplayRole) const;
+
+ //! Returns minimum and maximum values of selected items or the table content (if selected list is empty)
+ //! \param theMinValue minimum
+ //! \param theMaxValue maximum
+ //! \param theSelected selected cells
+ virtual void GetRangeValues (QString& theMinValue, QString& theMaxValue, const QModelIndexList& theSelected) const;
+
+ //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ virtual int GetValuesCount () const Standard_OVERRIDE { return myAttribute->GetValues().Length(); }
+
+ //! Returns source row/column indices for the filtered model index for the given role
+ //! \param theSourceRow model row index
+ //! \param theSourceColumn model column index
+ //! \param theRow [out] row number value
+ //! \param theColumn [out] column value
+ Standard_EXPORT virtual void GetSourcePosition (const int theSourceRow, const int theSourceColumn, int& theRow, int& theColumn) const
+ { myFilter->GetSourcePosition (theSourceRow, theSourceColumn, theRow, theColumn); }
+
+private:
+ Handle(Message_AttributeVectorOfReal) myAttribute; //!< alert attribute, container of table values
+ ViewControl_TableModelFilter* myFilter; //!< rearrange vector of values into a table view
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+
+#include <inspector/MessageModel_TableModelRealVec3Values.hxx>
+
+#include <inspector/ViewControl_TableModel.hxx>
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+MessageModel_TableModelRealVec3Values::MessageModel_TableModelRealVec3Values (const Handle(Message_Attribute)& theAttribute,
+ const int theSectionWidth)
+ : myAttribute (Handle(Message_AttributeVectorOfRealVec3)::DownCast (theAttribute)), myFilter (0)
+{
+ if (myAttribute->GetColumnCount() > 0)
+ myFilter = new ViewControl_TableModelFilter (myAttribute->GetColumnCount());
+
+ SetUseTableSeparateSize (!myFilter);
+ SetUseTableProperties (true);
+ SetDefaultSectionSize (Qt::Horizontal, theSectionWidth);
+}
+
+// =======================================================================
+// function : ColumnCount
+// purpose :
+// =======================================================================
+
+int MessageModel_TableModelRealVec3Values::ColumnCount (const QModelIndex&) const
+{
+ int aColumnCount = myAttribute->GetValues().Length();
+ if (myFilter)
+ aColumnCount = myFilter->ColumnCount (aColumnCount);
+
+ return aColumnCount;
+}
+
+// =======================================================================
+// function : Data
+// purpose :
+// =======================================================================
+
+QVariant MessageModel_TableModelRealVec3Values::Data (const int, const int theColumn, int theRole) const
+{
+ if (theRole != Qt::DisplayRole || theColumn > myAttribute->GetValues().Length())
+ return QVariant();
+
+ NCollection_Vec3<double> aValue = myAttribute->GetValues().Value(theColumn);
+ return QString ("%1, %2, %3").arg (aValue.x()).arg (aValue.y()).arg (aValue.z());
+}
+
+// =======================================================================
+// function : GetRangeValues
+// purpose :
+// =======================================================================
+
+void MessageModel_TableModelRealVec3Values::GetRangeValues (QString& theMinValue, QString& theMaxValue,
+ const QModelIndexList& theSelected) const
+{
+ theMinValue = DBL_MAX;
+ theMaxValue = DBL_MIN;
+
+ QList<int> aValuePositions;
+ if (!theSelected.isEmpty())
+ {
+ ViewControl_TableModel* aModel = (ViewControl_TableModel*)theSelected[0].model();
+ int aRow, aColumn;
+ for (QModelIndexList::const_iterator aSelIt = theSelected.begin(); aSelIt != theSelected.end(); aSelIt++)
+ {
+ aModel->GetSourcePosition (*aSelIt, aRow, aColumn);
+ aValuePositions.append (aColumn);
+ }
+ }
+
+ NCollection_Vector<NCollection_Vec3<double>> aValues = myAttribute->GetValues();
+ int aValuesSize = aValues.Length();
+ if (aValuesSize < 1)
+ return;
+
+ double aXMinValue = aValues.First().x(), aXMaxValue = aValues.First().x();
+ NCollection_Vec3<double> aValue;
+ for (int i = 1; i < aValuesSize; i++)
+ {
+ if (!aValuePositions.empty() && !aValuePositions.contains (i))
+ continue;
+
+ aValue = aValues.Value (i);
+ if (aValue.x() < aXMinValue) aXMinValue = aValue.x();
+ if (aValue.x() > aXMaxValue) aXMaxValue = aValue.x();
+ }
+
+ double anYMinValue = aValues.First().y(), anYMaxValue = aValues.First().y();
+ for (int i = 1; i < aValuesSize; i++)
+ {
+ if (!aValuePositions.empty() && !aValuePositions.contains (i))
+ continue;
+
+ aValue = aValues.Value (i);
+ if (aValue.x() == aXMinValue && aValue.y() < anYMinValue) anYMinValue = aValue.y();
+ if (aValue.x() == aXMaxValue && aValue.y() > anYMaxValue) anYMaxValue = aValue.y();
+ }
+
+ double aZMinValue = aValues.First().z(), aZMaxValue = aValues.First().z();
+ for (int i = 1; i < aValuesSize; i++)
+ {
+ if (!aValuePositions.empty() && !aValuePositions.contains (i))
+ continue;
+ aValue = aValues.Value (i);
+ if (aValue.x() == aXMinValue && aValue.y() == anYMinValue && aValue.z() < aZMinValue) aZMinValue = aValue.z();
+ if (aValue.x() == aXMaxValue && aValue.y() == anYMaxValue && aValue.z() > aZMaxValue) aZMaxValue = aValue.z();
+ }
+
+ theMinValue = QString ("%1, %2, %3").arg (aXMinValue).arg (anYMinValue).arg (aZMinValue);
+ theMaxValue = QString ("%1, %2, %3").arg (aXMaxValue).arg (anYMaxValue).arg (aZMaxValue);
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_TableModelRealVec3Values_H
+#define MessageModel_TableModelRealVec3Values_H
+
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <inspector/ViewControl_TableModelFilter.hxx>
+
+#include <Message_AttributeVectorOfRealVec3.hxx>
+
+class ViewControl_TableModelFilter;
+
+//! \class MessageModel_TableModelRealVec3Values
+//! \brief This is an implementation for ViewControl_TableModel to present Message_AttributeVectorOfRealVec3 object
+class MessageModel_TableModelRealVec3Values : public ViewControl_TableModelValues
+{
+public:
+
+ //! Constructor
+ Standard_EXPORT MessageModel_TableModelRealVec3Values (const Handle(Message_Attribute)& theAttribute, const int theSectionWidth);
+
+ //! Destructor
+ virtual ~MessageModel_TableModelRealVec3Values() Standard_OVERRIDE {}
+
+ //! Returns number of columns, size of header values
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ Standard_EXPORT virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const;
+
+ //! Returns content of the model index for the given role, it is obtained from internal container of values
+ //! It returns value only for DisplayRole.
+ //! \param theIndex a model index
+ //! \param theRole a view role
+ //! \return value intepreted depending on the given role
+ Standard_EXPORT virtual QVariant Data (const int theRow, const int theColumn, int theRole = Qt::DisplayRole) const;
+
+ //! Returns minimum and maximum values of selected items or the table content (if selected list is empty)
+ //! It finds firstly Xmax, then Ymax, after that Zmax. The same for min values.
+ //! \param theMinValue minimum
+ //! \param theMaxValue maximum
+ //! \param theSelected selected cells
+ virtual void GetRangeValues (QString& theMinValue, QString& theMaxValue, const QModelIndexList& theSelected) const;
+
+ //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ virtual int GetValuesCount () const Standard_OVERRIDE { return myAttribute->GetValues().Length(); }
+
+ //! Returns source row/column indices for the filtered model index for the given role
+ //! \param theSourceRow model row index
+ //! \param theSourceColumn model column index
+ //! \param theRow [out] row number value
+ //! \param theColumn [out] column value
+ Standard_EXPORT virtual void GetSourcePosition (const int theSourceRow, const int theSourceColumn, int& theRow, int& theColumn) const
+ { myFilter->GetSourcePosition (theSourceRow, theSourceColumn, theRow, theColumn); }
+
+private:
+ Handle(Message_AttributeVectorOfRealVec3) myAttribute; //!< alert attribute, container of table values
+ ViewControl_TableModelFilter* myFilter; //!< rearrange vector of values into a table view
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageModel_Tools.hxx>
+#include <inspector/MessageModel_TableModelCompareValues.hxx>
+#include <inspector/MessageModel_TableModelRealValues.hxx>
+#include <inspector/MessageModel_TableModelRealVec3Values.hxx>
+#include <inspector/MessageModel_TreeModel.hxx>
+
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
+#include <BRepBuilderAPI_MakeEdge.hxx>
+#include <BRepTools.hxx>
+#include <Message_AlertNode.hxx>
+#include <Message_AttributeObject.hxx>
+#include <Message_AttributeVectorOfReal.hxx>
+#include <Message_AttributeVectorOfRealVec3.hxx>
+#include <Precision.hxx>
+#include <TopoDS_AlertAttribute.hxx>
+#include <TopoDS_Edge.hxx>
+
+// =======================================================================
+// function : GetPointerInfo
+// purpose :
+// =======================================================================
+TCollection_AsciiString MessageModel_Tools::GetPointerInfo (const Handle(Standard_Transient)& thePointer, const bool isShortInfo)
+{
+ if (thePointer.IsNull())
+ return TCollection_AsciiString();
+
+ std::ostringstream aPtrStr;
+ aPtrStr << thePointer.operator->();
+ if (!isShortInfo)
+ return aPtrStr.str().c_str();
+
+ TCollection_AsciiString anInfoPtr (aPtrStr.str().c_str());
+ for (int aSymbolId = 1; aSymbolId < anInfoPtr.Length(); aSymbolId++)
+ {
+ if (anInfoPtr.Value(aSymbolId) != '0')
+ {
+ anInfoPtr = anInfoPtr.SubString (aSymbolId, anInfoPtr.Length());
+ anInfoPtr.Prepend("0x");
+ return anInfoPtr;
+ }
+ }
+ return aPtrStr.str().c_str();
+}
+
+// =======================================================================
+// function : GetPointerAlertInfo
+// purpose :
+// =======================================================================
+TCollection_AsciiString MessageModel_Tools::GetPointerAlertInfo (const Handle(Message_Alert)& theAlert)
+{
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (aNodeAlert.IsNull())
+ return TCollection_AsciiString();
+
+ Handle(Message_Attribute) anAttribute = aNodeAlert->Attribute();
+ if (anAttribute.IsNull())
+ return TCollection_AsciiString();
+
+ if (anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertAttribute)))
+ return GetPointerInfo (Handle(TopoDS_AlertAttribute)::DownCast (anAttribute)->GetShape().TShape());
+ else if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeObject)))
+ return GetPointerInfo (Handle(Message_AttributeObject)::DownCast (anAttribute)->GetObject());
+ return TCollection_AsciiString();
+}
+
+// =======================================================================
+// function : GetShapeTypeAlertInfo
+// purpose :
+// =======================================================================
+TCollection_AsciiString MessageModel_Tools::GetShapeTypeAlertInfo (const Handle(Message_Alert)& theAlert)
+{
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (aNodeAlert.IsNull())
+ return TCollection_AsciiString();
+ Handle(Message_Attribute) anAttribute = aNodeAlert->Attribute();
+ if (anAttribute.IsNull())
+ return TCollection_AsciiString();
+
+ TopoDS_Shape aShape;
+ if (anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertAttribute)))
+ aShape = Handle(TopoDS_AlertAttribute)::DownCast (anAttribute)->GetShape();
+
+ if (aShape.IsNull())
+ return TCollection_AsciiString();
+
+ TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
+ Standard_SStream aSStream;
+ TopAbs::Print ((TopAbs_ShapeEnum)aShapeType, aSStream);
+ return aSStream.str().c_str();
+}
+
+// =======================================================================
+// function : GetStandardTypeAlertInfo
+// purpose :
+// =======================================================================
+TCollection_AsciiString MessageModel_Tools::GetStandardTypeAlertInfo (const Handle(Message_Alert)& theAlert)
+{
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (aNodeAlert.IsNull())
+ return TCollection_AsciiString();
+ Handle(Message_Attribute) anAttribute = aNodeAlert->Attribute();
+ if (anAttribute.IsNull())
+ return TCollection_AsciiString();
+
+ Handle(Standard_Transient) aPointer;
+ if (anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertAttribute)))
+ aPointer = Handle(TopoDS_AlertAttribute)::DownCast (anAttribute)->GetShape().TShape();
+ else if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeObject)))
+ aPointer = Handle(Message_AttributeObject)::DownCast (anAttribute)->GetObject();
+
+ if (aPointer.IsNull())
+ return TCollection_AsciiString();
+
+ return aPointer->DynamicType()->Name();
+}
+
+// =======================================================================
+// function : GetPropertyTableValues
+// purpose :
+// =======================================================================
+void MessageModel_Tools::GetPropertyTableValues (const Handle(Message_Alert)& theAlert,
+ QList<ViewControl_TableModelValues*>& theTableValues)
+{
+ ViewControl_TableModelValues* aTableValues = 0;
+
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast(theAlert);
+ if (aNodeAlert.IsNull())
+ return;
+
+ Handle(Message_Attribute) anAttribute = aNodeAlert->Attribute();
+ if (anAttribute.IsNull())
+ return;
+
+ if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfReal)))
+ {
+ int aSectionSize = MessageModel_TreeModel::GetVectorOfRealSectionSize();
+ aTableValues = new MessageModel_TableModelRealValues (anAttribute, aSectionSize);
+ theTableValues.append (aTableValues);
+ }
+ else if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfRealVec3)))
+ {
+ int aSectionSize = MessageModel_TreeModel::GetVectorOfRealVec3SectionSize();
+ aTableValues = new MessageModel_TableModelRealVec3Values (anAttribute, aSectionSize);
+ theTableValues.append (aTableValues);
+ }
+ else
+ {
+ if (!anAttribute->GetDescription().IsEmpty())
+ {
+ aTableValues = new ViewControl_TableModelValues();
+ QList<TreeModel_HeaderSection> aHeaderValues;
+ QVector<QVariant> aValues;
+ aHeaderValues << TreeModel_HeaderSection ("Description", -2);
+ aValues << anAttribute->GetDescription().ToCString();
+ aTableValues->SetHeaderValues (aHeaderValues, Qt::Horizontal);
+
+ QString aValueStr = anAttribute->GetDescription().ToCString();
+ QStringList aValueStrList = aValueStr.split ("\n");
+ int aNbRows = aValueStrList.size();
+
+ QFontMetrics aFontMetrics (qApp->font());
+ int aHeight = aFontMetrics.boundingRect(aValueStr).height();
+ aHeight = (aHeight + TreeModel_Tools::HeaderSectionMargin()) * aNbRows;
+ aTableValues->SetValues (aValues);
+ aTableValues->SetDefaultSectionSize(Qt::Vertical, aHeight);
+
+ theTableValues.append (aTableValues);
+ }
+ }
+}
+
+// =======================================================================
+// function : GetPropertyTableValues
+// purpose :
+// =======================================================================
+void MessageModel_Tools::GetPropertyTableValues (const Handle(Message_Alert)& theAlert1,
+ const Handle(Message_Alert)& theAlert2,
+ QList<ViewControl_TableModelValues*>& theTableValues)
+{
+ QList<ViewControl_TableModelValues*> aTableValues1, aTableValues2;
+
+ GetPropertyTableValues (theAlert1, aTableValues1);
+ GetPropertyTableValues (theAlert2, aTableValues2);
+
+ if (aTableValues1.size() != aTableValues2.size())
+ return;
+
+ for (int i = 0; i < aTableValues1.size(); i++)
+ theTableValues.append(new MessageModel_TableModelCompareValues(aTableValues1[i], aTableValues2[i]));
+}
+
+// =======================================================================
+// function : BuildShape
+// purpose :
+// =======================================================================
+TopoDS_Shape MessageModel_Tools::BuildShape (const Handle(Message_Alert)& theAlert, QList<int> theSelectedIndices, ViewControl_Table* theTable)
+{
+ if (theAlert.IsNull())
+ return TopoDS_Shape();
+
+ Handle(Message_AlertNode) aNodeAlert = Handle(Message_AlertNode)::DownCast (theAlert);
+ if (aNodeAlert.IsNull())
+ return TopoDS_Shape();
+
+ Handle(Message_Attribute) anAttribute = aNodeAlert->Attribute();
+ if (anAttribute.IsNull())
+ return TopoDS_Shape();
+
+ BRep_Builder aBuilder;
+ TopoDS_Compound aCompound;
+ aBuilder.MakeCompound(aCompound);
+
+ if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfReal)))
+ {
+ Handle(Message_AttributeVectorOfReal) aValuesAlert = Handle(Message_AttributeVectorOfReal)::DownCast (anAttribute);
+ NCollection_Vector<double> aValues = aValuesAlert->GetValues();
+ int aValuesSize = aValues.Size();
+
+ gp_Pnt aPreviousPoint(0, 0, 0), aCurrentPoint(0, 0, 0);
+ double aXStep = theTable->GetProperty()->GetXStep();
+ if (aXStep < 0)
+ aXStep = 1;
+ double aCurrentXValue = 0;
+ for (QList<int>::const_iterator anIt = theSelectedIndices.begin(); anIt != theSelectedIndices.end(); anIt++)
+ {
+ if (*anIt >= aValuesSize)
+ continue;
+
+ if (aCurrentXValue == 0)
+ { //just define the previous point
+ aPreviousPoint.SetX (aCurrentXValue);
+ aPreviousPoint.SetY (aValues.Value (*anIt));
+ aCurrentXValue = aCurrentXValue + aXStep;
+ continue;
+ }
+ aCurrentPoint.SetX (aCurrentXValue);
+ aCurrentPoint.SetY (aValues.Value (*anIt));
+ if (aPreviousPoint.Distance (aCurrentPoint) < Precision::Confusion())
+ continue;
+
+ TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge (aPreviousPoint, aCurrentPoint);
+ aBuilder.Add (aCompound, anEdge);
+ aPreviousPoint = aCurrentPoint;
+ aCurrentXValue = aCurrentXValue + aXStep;
+ }
+ }
+ else if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfRealVec3)))
+ {
+ Handle(Message_AttributeVectorOfRealVec3) aValuesAlert = Handle(Message_AttributeVectorOfRealVec3)::DownCast (anAttribute);
+ NCollection_Vector<NCollection_Vec3<double>> aValues = aValuesAlert->GetValues();
+ int aValuesSize = aValues.Size();
+
+ gp_Pnt aCurrentPoint(0, 0, 0);
+ NCollection_Vec3<double> aValue;
+ for (QList<int>::const_iterator anIt = theSelectedIndices.begin(); anIt != theSelectedIndices.end(); anIt++)
+ {
+ if (*anIt >= aValuesSize)
+ continue;
+
+ aValue = aValues.Value (*anIt);
+ aCurrentPoint.SetX (aValue.x());
+ aCurrentPoint.SetY (aValue.y());
+ aCurrentPoint.SetZ (aValue.z());
+
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex (aCurrentPoint);
+ aBuilder.Add (aCompound, aVertex);
+ }
+ }
+
+ return aCompound;
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_Tools_H
+#define MessageModel_Tools_H
+
+#include <Standard.hxx>
+
+#include <TCollection_AsciiString.hxx>
+#include <Standard_Transient.hxx>
+#include <TopoDS_Shape.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QList>
+#include <Standard_WarningsRestore.hxx>
+
+class Message_Alert;
+class ViewControl_TableModelValues;
+
+class ViewControl_Table;
+
+//! \class MessageModel_Tools
+//! It gives auxiliary methods for Message classes manipulation
+class MessageModel_Tools
+{
+public:
+
+ //! Convert pointer to string value
+ //! \param thePointer a pointer
+ //! \param isShortInfo if true, all '0' symbols in the beginning of the pointer are skipped
+ //! \return the string value
+ Standard_EXPORT static TCollection_AsciiString GetPointerInfo (const Handle(Standard_Transient)& thePointer,
+ const bool isShortInfo = true);
+
+ //! Returns pointer alert information depening on type of alert (Transient_Object or TopoDS_TShape)
+ //! \param theAlert a message alert
+ //! \return text presentation
+ Standard_EXPORT static TCollection_AsciiString GetPointerAlertInfo (const Handle(Message_Alert)& theAlert);
+
+ //! Returns TopoDS_Shape type alert information or empty string
+ //! \param theAlert a message alert
+ //! \return text presentation
+ Standard_EXPORT static TCollection_AsciiString GetShapeTypeAlertInfo (const Handle(Message_Alert)& theAlert);
+
+ //! Returns dynamic type of an alert object/shape
+ //! \param theAlert a message alert
+ //! \return text presentation
+ Standard_EXPORT static TCollection_AsciiString GetStandardTypeAlertInfo (const Handle(Message_Alert)& theAlert);
+
+ //! Fills container of table values
+ //! \param theAlert a message alert
+ //! \param theTableValue container of values
+ Standard_EXPORT static void GetPropertyTableValues (const Handle(Message_Alert)& theAlert,
+ QList<ViewControl_TableModelValues*>& theTableValues);
+
+ //! Fills container of table values based on compare of the parameter alerts
+ //! \param theAlert1 the first message alert
+ //! \param theAlert2 the second message alert
+ //! \param theTableValue container of values
+ Standard_EXPORT static void GetPropertyTableValues (const Handle(Message_Alert)& theAlert1,
+ const Handle(Message_Alert)& theAlert2,
+ QList<ViewControl_TableModelValues*>& theTableValues);
+
+ //! Creates TopoDS_Compound with TopoDS_Edge/Vertex on alert data
+ //! \param theAlert a message alert
+ //! \parm theSelectedIndices a container of indices
+ //! \param theTableView source view
+ Standard_EXPORT TopoDS_Shape static BuildShape (const Handle(Message_Alert)& theAlert, QList<int> aSelectedIndices,
+ ViewControl_Table* theTableView);
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageModel_TreeModel.hxx>
+
+#include <inspector/MessageModel_ItemAlert.hxx>
+#include <inspector/MessageModel_ItemRoot.hxx>
+#include <inspector/MessageModel_ItemReport.hxx>
+
+const int COLUMN_NAME_WIDTH = 310;
+const int COLUMN_SIZE_WIDTH = 30;
+const int COLUMN_POINTER_WIDTH = 70;
+const int COLUMN_SHAPE_TYPE_WIDTH = 75;
+const int COLUMN_STANDARD_TYPE_WIDTH = 120;
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+MessageModel_TreeModel::MessageModel_TreeModel (QObject* theParent)
+: TreeModel_ModelBase (theParent), myIsReversed (Standard_False), myIsUniteAlerts (Standard_False)
+{
+ SetHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
+ // column 1 is reserved for visiblity state
+ SetHeaderItem (2, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH));
+
+ SetHeaderItem (3, TreeModel_HeaderSection ("Whole Time", -1));
+ SetHeaderItem (4, TreeModel_HeaderSection ("Percent", -1));
+
+ SetHeaderItem (5, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH));
+ SetHeaderItem (6, TreeModel_HeaderSection ("Shape Type", COLUMN_SHAPE_TYPE_WIDTH));
+ SetHeaderItem (7, TreeModel_HeaderSection ("Standard Type", COLUMN_STANDARD_TYPE_WIDTH));
+ SetHeaderItem (8, TreeModel_HeaderSection ("Description", -1));
+}
+
+// =======================================================================
+// function : createRootItem
+// purpose :
+// =======================================================================
+void MessageModel_TreeModel::createRootItem (const int theColumnId)
+{
+ myRootItems.insert (theColumnId, MessageModel_ItemRoot::CreateItem (TreeModel_ItemBasePtr(), 0, theColumnId));
+ if (theColumnId == 0)
+ m_pRootItem = myRootItems[0];
+}
+
+// =======================================================================
+// function : HasShape
+// purpose :
+// =======================================================================
+Standard_Boolean MessageModel_TreeModel::HasReport (const Handle(Message_Report)& theReport)
+{
+ if (columnCount() == 0)
+ return Standard_False;
+
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (RootItem (0));
+ return aRootItem && aRootItem->HasReport (theReport);
+}
+
+// =======================================================================
+// function : AddShape
+// purpose :
+// =======================================================================
+void MessageModel_TreeModel::AddReport (const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theReportDescription)
+{
+ for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++)
+ {
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (RootItem (aColId));
+ if (!aRootItem)
+ continue;
+ aRootItem->AddReport (theReport, theReportDescription);
+ aRootItem->SetReversed (myIsReversed);
+ aRootItem->SetUniteAlerts (myIsUniteAlerts);
+ }
+
+ Reset();
+ EmitLayoutChanged();
+}
+
+// =======================================================================
+// function : SetReport
+// purpose :
+// =======================================================================
+void MessageModel_TreeModel::SetReport (const int theRowId, const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theReportDescription)
+{
+ for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++)
+ {
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (RootItem (aColId));
+ if (!aRootItem)
+ continue;
+ aRootItem->SetReport (theRowId, theReport, theReportDescription);
+ }
+ Reset();
+ EmitLayoutChanged();
+}
+
+// =======================================================================
+// function : SetReversed
+// purpose :
+// =======================================================================
+void MessageModel_TreeModel::SetReversed (const Standard_Boolean& theReversed)
+{
+ myIsReversed = theReversed;
+
+ for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++)
+ {
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (RootItem (aColId));
+ if (aRootItem)
+ aRootItem->SetReversed (myIsReversed);
+ }
+
+ Reset();
+ EmitLayoutChanged();
+}
+
+// =======================================================================
+// function : SetUniteAlerts
+// purpose :
+// =======================================================================
+void MessageModel_TreeModel::SetUniteAlerts (const Standard_Boolean& theUniteAlerts)
+{
+ myIsUniteAlerts = theUniteAlerts;
+
+ for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++)
+ {
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (RootItem (aColId));
+ if (aRootItem)
+ aRootItem->SetUniteAlerts (myIsUniteAlerts);
+ }
+
+ Reset();
+ EmitLayoutChanged();
+}
+
+// =======================================================================
+// function : UpdateTreeModel
+// purpose :
+// =======================================================================
+void MessageModel_TreeModel::SetRootItemName (const TCollection_AsciiString& theName)
+{
+ MessageModel_ItemRootPtr aRootItem = itemDynamicCast<MessageModel_ItemRoot> (RootItem (0));
+ if (aRootItem)
+ aRootItem->SetName (theName);
+}
+
+// =======================================================================
+// function : UpdateTreeModel
+// purpose :
+// =======================================================================
+void MessageModel_TreeModel::UpdateTreeModel()
+{
+ Reset();
+ EmitLayoutChanged();
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageModel_TreeModel_H
+#define MessageModel_TreeModel_H
+
+#include <inspector/MessageModel_ItemBase.hxx>
+#include <Standard.hxx>
+#include <TCollection_AsciiString.hxx>
+#include <Message_Report.hxx>
+#include <inspector/TreeModel_ModelBase.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QMap>
+#include <QObject>
+#include <Standard_WarningsRestore.hxx>
+
+class MessageModel_TreeModel;
+
+//! \class MessageModel_TreeModel
+//! View model to visualize MessageReport/s content
+class MessageModel_TreeModel : public TreeModel_ModelBase
+{
+public:
+
+ //! Constructor
+ Standard_EXPORT MessageModel_TreeModel (QObject* theParent);
+
+ //! Destructor
+ virtual ~MessageModel_TreeModel() Standard_OVERRIDE {};
+
+ //! Returns true if parameter report was added into the model
+ //! \param theReport a report instance
+ //! \return boolen value
+ Standard_EXPORT Standard_Boolean HasReport (const Handle(Message_Report)& theReport);
+
+ //! Add shape, append it to the model root item
+ //! \param theReport a report instance
+ //! \param theReportDescription an additional report information
+ Standard_EXPORT void AddReport (const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theReportDescription = "");
+
+ //! Set report, se it into the given row index
+ //! \param theRowId a report child row
+ //! \param theReport a report instance
+ //! \param theReportDescription an additional report information
+ Standard_EXPORT void SetReport (const int theRowId, const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theReportDescription = "");
+
+ //! Set the view reversed. If reversed, the last report alert is upper item in the tree view
+ //! \param theReversed boolean flag
+ Standard_EXPORT void SetReversed (const Standard_Boolean& theReversed);
+
+ //! Return whether the view is reversed or not
+ //! \return boolean value
+ Standard_Boolean IsReversed() const { return myIsReversed; };
+
+ //! Set union of alerts having equal message in additional folder item.
+ //! \param theUniteAlerts boolean flag
+ Standard_EXPORT void SetUniteAlerts (const Standard_Boolean& theUniteAlerts);
+
+ //! Return whether the alerts should be united
+ //! \return boolean value
+ Standard_Boolean IsUniteAlerts() const { return myIsUniteAlerts; };
+
+ //! Sets the text value of the Root item, only "Name" column accepts the parameter value
+ //! \theName visulized text of root item
+ Standard_EXPORT void SetRootItemName (const TCollection_AsciiString& theName);
+
+ //! Returns root item by column
+ //! \param theColumn an index of the column
+ //! \return root item instance
+ virtual TreeModel_ItemBasePtr RootItem (const int theColumn) const Standard_OVERRIDE
+ { return myRootItems.contains (theColumn) ? myRootItems[theColumn] : TreeModel_ItemBasePtr(); }
+
+ //! Updates tree model
+ Standard_EXPORT void UpdateTreeModel();
+
+ //! Default section size for table of real values
+ static Standard_Integer GetVectorOfRealSectionSize() { return 60; }
+
+ //! Default section size for table of values of three real
+ static Standard_Integer GetVectorOfRealVec3SectionSize() { return 160; }
+
+protected:
+ //! Creates root item
+ //! \param theColumnId index of a column
+ virtual void createRootItem (const int theColumnId) Standard_OVERRIDE;
+
+private:
+ QMap<int, TreeModel_ItemBasePtr> myRootItems; //!< container of root items, for each column own root item
+ Standard_Boolean myIsReversed; //!< state if the model is reversed
+ Standard_Boolean myIsUniteAlerts; //!< state if alerts should be united
+};
+
+#endif
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="20"
+ viewBox="0 0 5.2916664 5.2916666"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+ sodipodi:docname="item_shape.svg"
+ inkscape:export-filename="D:\OCCT\master_CR29451_1\tools\MessageModel\icons\item_shape.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96">
+ <defs
+ id="defs2">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="-2.6544163 : -0.28690906 : 1"
+ inkscape:vp_y="0 : 1028.295 : 0"
+ inkscape:vp_z="9.504499 : -1.1228559 : 1"
+ inkscape:persp3d-origin="2.7661607 : -1.3768436 : 1"
+ id="perspective3711" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.839192"
+ inkscape:cx="4.9829441"
+ inkscape:cy="7.75434"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1446"
+ inkscape:window-height="676"
+ inkscape:window-x="1766"
+ inkscape:window-y="124"
+ inkscape:window-maximized="0"
+ units="px" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(71.966667,-93.642022)">
+ <g
+ sodipodi:type="inkscape:box3d"
+ id="g3741"
+ inkscape:perspectiveID="#perspective3711"
+ inkscape:corner0="0.78884625 : 0.0054590483 : 0 : 1"
+ inkscape:corner7="-0.14713316 : 0.0022509206 : 0.25 : 1">
+ <path
+ sodipodi:type="inkscape:box3dside"
+ id="path3743"
+ style="fill:#353564;fill-rule:evenodd;stroke:none;stroke-width:1.45609081;stroke-linejoin:round"
+ inkscape:box3dsidetype="6"
+ d="m -71.590875,96.691829 v 1.844151 l 1.119347,0.186449 v -1.618024 z"
+ points="-71.590875,98.53598 -70.471528,98.722429 -70.471528,97.104405 -71.590875,96.691829 " />
+ <path
+ sodipodi:type="inkscape:box3dside"
+ id="path3753"
+ style="fill:#e9e9ff;fill-rule:evenodd;stroke:none;stroke-width:1.45609081;stroke-linejoin:round"
+ inkscape:box3dsidetype="11"
+ d="m -70.471528,97.104405 3.521639,-1.795967 v 2.991206 l -3.521639,0.422785 z"
+ points="-66.949889,95.308438 -66.949889,98.299644 -70.471528,98.722429 -70.471528,97.104405 " />
+ <path
+ sodipodi:type="inkscape:box3dside"
+ id="path3745"
+ style="fill:#4d4d9f;fill-rule:evenodd;stroke:none;stroke-width:1.45609081;stroke-linejoin:round"
+ inkscape:box3dsidetype="5"
+ d="m -71.590875,96.691829 3.325505,-2.775198 1.315481,1.391807 -3.521639,1.795967 z"
+ points="-68.26537,93.916631 -66.949889,95.308438 -70.471528,97.104405 -71.590875,96.691829 " />
+ <path
+ sodipodi:type="inkscape:box3dside"
+ id="path3751"
+ style="fill:#afafde;fill-rule:evenodd;stroke:none;stroke-width:1.45609081;stroke-linejoin:round"
+ inkscape:box3dsidetype="13"
+ d="m -71.590875,98.53598 3.325505,-0.751334 1.315481,0.514998 -3.521639,0.422785 z"
+ points="-68.26537,97.784646 -66.949889,98.299644 -70.471528,98.722429 -71.590875,98.53598 " />
+ <path
+ sodipodi:type="inkscape:box3dside"
+ id="path3749"
+ style="fill:#d7d7ff;fill-rule:evenodd;stroke:none;stroke-width:1.45609081;stroke-linejoin:round"
+ inkscape:box3dsidetype="14"
+ d="m -68.26537,93.916631 v 3.868015 l 1.315481,0.514998 v -2.991206 z"
+ points="-68.26537,97.784646 -66.949889,98.299644 -66.949889,95.308438 -68.26537,93.916631 " />
+ <path
+ sodipodi:type="inkscape:box3dside"
+ id="path3747"
+ style="fill:#8686bf;fill-rule:evenodd;stroke:none;stroke-width:1.45609081;stroke-linejoin:round"
+ inkscape:box3dsidetype="3"
+ d="m -71.590875,96.691829 3.325505,-2.775198 v 3.868015 l -3.325505,0.751334 z"
+ points="-68.26537,93.916631 -68.26537,97.784646 -71.590875,98.53598 -71.590875,96.691829 " />
+ </g>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="20"
+ viewBox="0 0 5.2916664 5.2916666"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+ sodipodi:docname="item_vectorOfReal.svg"
+ inkscape:export-filename="D:\OCCT\master_CR29451_1\tools\MessageModel\icons\item_vectorOfRealVec3.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96">
+ <defs
+ id="defs2">
+ <linearGradient
+ id="linearGradient4578"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4576" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="-2.6544163 : -0.28690906 : 1"
+ inkscape:vp_y="0 : 1028.295 : 0"
+ inkscape:vp_z="9.504499 : -1.1228559 : 1"
+ inkscape:persp3d-origin="2.7661607 : -1.3768436 : 1"
+ id="perspective3711" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.839192"
+ inkscape:cx="-10.548151"
+ inkscape:cy="10.279721"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1446"
+ inkscape:window-height="838"
+ inkscape:window-x="1733"
+ inkscape:window-y="67"
+ inkscape:window-maximized="0"
+ units="px" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(71.966667,-93.642022)">
+ <rect
+ id="rect3769"
+ width="4.660512"
+ height="4.443356"
+ x="-71.632576"
+ y="94.056023"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ id="rect3769-3"
+ width="4.7041783"
+ height="2.2966287"
+ x="-71.676239"
+ y="96.202751"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.19110738;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ id="rect3769-9"
+ width="2.3560426"
+ height="4.4502382"
+ x="-71.617508"
+ y="94.071091"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.18826659;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="20"
+ viewBox="0 0 5.2916664 5.2916666"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+ sodipodi:docname="item_vectorOfRealVec3.svg"
+ inkscape:export-filename="D:\OCCT\master_CR29451_1\tools\MessageModel\icons\item_vectorOfRealVec3.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96">
+ <defs
+ id="defs2">
+ <linearGradient
+ id="linearGradient4578"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4576" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="-2.6544163 : -0.28690906 : 1"
+ inkscape:vp_y="0 : 1028.295 : 0"
+ inkscape:vp_z="9.504499 : -1.1228559 : 1"
+ inkscape:persp3d-origin="2.7661607 : -1.3768436 : 1"
+ id="perspective3711" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.839192"
+ inkscape:cx="-10.548151"
+ inkscape:cy="10.279721"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1446"
+ inkscape:window-height="838"
+ inkscape:window-x="1733"
+ inkscape:window-y="67"
+ inkscape:window-maximized="0"
+ units="px" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(71.966667,-93.642022)">
+ <rect
+ id="rect3769"
+ width="4.660512"
+ height="4.443356"
+ x="-71.632576"
+ y="94.056023"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ id="rect3769-3"
+ width="4.7041783"
+ height="2.2966287"
+ x="-71.676239"
+ y="96.202751"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.19110738;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ id="rect3769-9"
+ width="2.3560426"
+ height="4.4502382"
+ x="-71.617508"
+ y="94.071091"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.18826659;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ id="rect3769-9-6"
+ width="0.78304976"
+ height="2.0045512"
+ x="-71.618477"
+ y="94.141006"
+ style="opacity:1;fill:#dc8c8c;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.07284392;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ id="rect3769-9-6-0"
+ width="0.78304976"
+ height="2.0045512"
+ x="-70.835426"
+ y="94.141006"
+ style="opacity:1;fill:#8cdc8c;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.07284392;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ id="rect3769-9-6-5"
+ width="0.78304976"
+ height="2.0045512"
+ x="-70.052376"
+ y="94.141006"
+ style="opacity:1;fill:#8c8cdc;fill-opacity:1;stroke:#8c8c8c;stroke-width:0.07284392;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
--- /dev/null
+MessageView_Communicator.cxx
+MessageView_Communicator.hxx
+MessageView_VisibilityState.cxx
+MessageView_VisibilityState.hxx
+MessageView_Window.cxx
+MessageView_Window.hxx
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageView_Communicator.hxx>
+
+
+// =======================================================================
+// function : CreateCommunicator
+// purpose : Creates a communicator by the library loading
+// =======================================================================
+Standard_EXPORTEXTERNC TInspectorAPI_Communicator* CreateCommunicator()
+{
+ return new MessageView_Communicator();
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageView_Communicator_H
+#define MessageView_Communicator_H
+
+#include <inspector/MessageModel_ReportCallBack.hxx>
+#include <inspector/MessageView_Window.hxx>
+#include <inspector/TInspectorAPI_Communicator.hxx>
+
+//! \class MessageView_Communicator.
+//! \brief This is a connector from TInspector application to MessageView window
+class MessageView_Communicator : public TInspectorAPI_Communicator
+{
+public:
+
+ //! Constructor
+ MessageView_Communicator() : TInspectorAPI_Communicator(), myWindow (new MessageView_Window (0))
+ { myWindow->SetCallBack (new MessageModel_ReportCallBack (this)); }
+
+ //! Destructor
+ virtual ~MessageView_Communicator() Standard_OVERRIDE {}
+
+ //! Provides the container with a parent where this container should be inserted.
+ //! If Qt implementation, it should be QWidget with QLayout set inside
+ //! \param theParent a parent class
+ virtual void SetParent (void* theParent) Standard_OVERRIDE { myWindow->SetParent (theParent); }
+
+ //! Sets parameters container, it should be used when the plugin is initialized or in update content
+ //! \param theParameters a parameters container
+ virtual void SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters) Standard_OVERRIDE
+ { myWindow->SetParameters (theParameters); }
+
+ //! Provide container for actions available in inspector on general level
+ //! \param theMenu if Qt implementation, it is QMenu object
+ virtual void FillActionsMenu(void* theMenu) Standard_OVERRIDE { myWindow->FillActionsMenu (theMenu); }
+
+ //! Returns plugin preferences, empty implementation by default
+ //! \param theItem container of preference elements
+ virtual void GetPreferences (TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE
+ { myWindow->GetPreferences (theItem); }
+
+ //! Stores plugin preferences, empty implementation by default
+ //! \param theItem container of preference elements
+ virtual void SetPreferences (const TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE
+ { myWindow->SetPreferences (theItem); }
+
+ //! Calls update of the plugin's content
+ virtual void UpdateContent() Standard_OVERRIDE { myWindow->UpdateContent(); }
+
+private:
+
+ MessageView_Window* myWindow; //!< current window
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageView_VisibilityState.hxx>
+#include <inspector/MessageModel_ItemAlert.hxx>
+
+#include <Message_AlertNode.hxx>
+#include <Message_AttributeVectorOfReal.hxx>
+#include <Message_AttributeVectorOfRealVec3.hxx>
+
+#include <TopoDS_AlertAttribute.hxx>
+
+// =======================================================================
+// function : CanBeVisible
+// purpose :
+// =======================================================================
+bool MessageView_VisibilityState::CanBeVisible (const QModelIndex& theIndex) const
+{
+ return !getShape (theIndex).IsNull();// || hasTableValues (theIndex);
+}
+
+// =======================================================================
+// function : SetVisible
+// purpose :
+// =======================================================================
+bool MessageView_VisibilityState::SetVisible (const QModelIndex& theIndex, const bool theState, const bool toEmitDataChanged)
+{
+ TopoDS_Shape aShape = getShape (theIndex);
+ if (aShape.IsNull())
+ return false;
+
+ myDisplayer->SetVisible (aShape, theState, myPresentationType);
+
+ if (!theState) {
+ MessageModel_ItemAlertPtr anAlertItem = getAlertItem (theIndex);
+ if (anAlertItem && !anAlertItem->GetCustomShape().IsNull())
+ anAlertItem->SetCustomShape (TopoDS_Shape());
+ }
+
+ if (toEmitDataChanged)
+ {
+ QModelIndex anIndex = theIndex;
+ if (theIndex.column() != TreeModel_ColumnType_Visibility)
+ anIndex = theIndex.model()->index(theIndex.row(), TreeModel_ColumnType_Visibility, theIndex.parent());
+
+ getModel()->EmitDataChanged (anIndex, anIndex);
+ }
+ return true;
+}
+
+// =======================================================================
+// function : IsVisible
+// purpose :
+// =======================================================================
+bool MessageView_VisibilityState::IsVisible (const QModelIndex& theIndex) const
+{
+ return myDisplayer->IsVisible (getShape (theIndex), myPresentationType);
+}
+
+// =======================================================================
+// function : getAlertItem
+// purpose :
+// =======================================================================
+MessageModel_ItemAlertPtr MessageView_VisibilityState::getAlertItem (const QModelIndex& theIndex) const
+{
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (theIndex);
+ if (!anItemBase)
+ return MessageModel_ItemAlertPtr();
+
+ MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast<MessageModel_ItemAlert>(anItemBase);
+ return anAlertItem;
+}
+
+// =======================================================================
+// function : getShape
+// purpose :
+// =======================================================================
+TopoDS_Shape MessageView_VisibilityState::getShape (const QModelIndex& theIndex) const
+{
+ MessageModel_ItemAlertPtr anAlertItem = getAlertItem (theIndex);
+ if (!anAlertItem)
+ return TopoDS_Shape();
+
+ if (!anAlertItem->GetCustomShape().IsNull())
+ return anAlertItem->GetCustomShape();
+
+ Handle(Message_Alert) anAlert = anAlertItem->GetAlert();
+ if (anAlert.IsNull())
+ return TopoDS_Shape();
+
+ Handle(Message_AlertNode) anAlertNode = Handle(Message_AlertNode)::DownCast(anAlert);
+ if (anAlertNode.IsNull())
+ return TopoDS_Shape();
+
+ Handle(TopoDS_AlertAttribute) aShapeAttribute = Handle(TopoDS_AlertAttribute)::DownCast (anAlertNode->Attribute());
+ if (!aShapeAttribute.IsNull())
+ return aShapeAttribute->GetShape();
+
+ return TopoDS_Shape();
+}
+
+// =======================================================================
+// function : hasTableValues
+// purpose :
+// =======================================================================
+bool MessageView_VisibilityState::hasTableValues (const QModelIndex& theIndex) const
+{
+ MessageModel_ItemAlertPtr anAlertItem = getAlertItem (theIndex);
+ if (!anAlertItem)
+ return false;
+
+ Handle(Message_Alert) anAlert = anAlertItem->GetAlert();
+ if (anAlert.IsNull())
+ return false;
+
+ Handle(Message_AlertNode) anAlertNode = Handle(Message_AlertNode)::DownCast(anAlert);
+ if (anAlertNode.IsNull())
+ return false;
+
+ Handle(Message_Attribute) anAttribute = anAlertNode->Attribute();
+ if (anAttribute.IsNull())
+ return false;
+
+ if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfReal)) ||
+ anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfRealVec3)))
+ return true;
+
+ return false;
+}
\ No newline at end of file
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageView_VisibilityState_H
+#define MessageView_VisibilityState_H
+
+#include <inspector/TreeModel_VisibilityState.hxx>
+
+#include <inspector/MessageModel_ItemAlert.hxx>
+
+#include <inspector/View_Displayer.hxx>
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+#include <TopoDS_Shape.hxx>
+
+class TreeModel_ModelBase;
+
+//! \class MessageView_VisibilityState
+//! \brief Class provides connection between model and visualization control
+class MessageView_VisibilityState : public TreeModel_VisibilityState
+{
+public:
+ //! Constructor
+ MessageView_VisibilityState (TreeModel_ModelBase* theModel)
+ : TreeModel_VisibilityState (theModel), myPresentationType (View_PresentationType_Main) {}
+
+ //! Destructor
+ ~MessageView_VisibilityState() {}
+
+ //! Sets current displayer
+ //! \theDisplayer class that provides connection to visualized objects
+ void SetDisplayer (View_Displayer* theDisplayer) { myDisplayer = theDisplayer; }
+
+ //! Sets presentation type for displayer
+ //! \param theType type value
+ void SetPresentationType (const View_PresentationType theType) { myPresentationType = theType; }
+
+ //! Returns true if visibility of the item can be changed
+ //! \param theIndex tree model index
+ //! \return boolean value
+ Standard_EXPORT virtual bool CanBeVisible (const QModelIndex& theIndex) const Standard_OVERRIDE;
+
+ //! Sets visibility state
+ //! \theIndex tree model index
+ //! \param theState visibility state
+ //! \param toEmitDataChanged boolean flag whether emit of the model should be done immediatelly
+ //! \return true if state is changed
+ Standard_EXPORT virtual bool SetVisible (const QModelIndex& theIndex, const bool theState, const bool toEmitDataChanged) Standard_OVERRIDE;
+
+ //! Returns visibility state value
+ Standard_EXPORT virtual bool IsVisible (const QModelIndex& theIndex) const Standard_OVERRIDE;
+
+protected:
+ //! Gets the alert item
+ //! \theIndex tree model index
+ //! \return item or NULL
+ MessageModel_ItemAlertPtr getAlertItem (const QModelIndex& theIndex) const;
+
+ //! Gets shape of the view model by the parameter index if it has a shape
+ //! \param theIndex tree model index
+ //! \return shape instance
+ TopoDS_Shape getShape (const QModelIndex& theIndex) const;
+
+ //! Returns true if alert of the item has table values
+ //! \param theIndex tree model index
+ //! \return boolean result
+ bool hasTableValues (const QModelIndex& theIndex) const;
+
+private:
+ View_Displayer* myDisplayer; //! view displayer
+ View_PresentationType myPresentationType; //! presentation type
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/MessageView_Window.hxx>
+#include <inspector/MessageView_VisibilityState.hxx>
+
+#include <inspector/MessageModel_Actions.hxx>
+#include <inspector/MessageModel_ItemAlert.hxx>
+#include <inspector/MessageModel_ItemReport.hxx>
+#include <inspector/MessageModel_ItemRoot.hxx>
+#include <inspector/MessageModel_ReportCallBack.hxx>
+#include <inspector/MessageModel_Tools.hxx>
+#include <inspector/MessageModel_TreeModel.hxx>
+
+#include <inspector/TreeModel_ContextMenu.hxx>
+#include <inspector/TreeModel_Tools.hxx>
+
+#include <inspector/ViewControl_PropertyView.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+#include <inspector/ViewControl_TableProperty.hxx>
+#include <inspector/ViewControl_TreeView.hxx>
+
+#include <inspector/View_Tools.hxx>
+
+#include <AIS_Shape.hxx>
+
+#include <OSD_Environment.hxx>
+
+#include <OSD_Directory.hxx>
+#include <OSD_Protection.hxx>
+
+#include <TCollection_AsciiString.hxx>
+//#include <TopoDS_AlertWithShape.hxx>
+
+#include <XmlDrivers_MessageReportStorage.hxx>
+
+#include <inspector/ViewControl_Tools.hxx>
+#include <inspector/View_Displayer.hxx>
+#include <inspector/View_ToolBar.hxx>
+#include <inspector/View_Widget.hxx>
+#include <inspector/View_Window.hxx>
+#include <inspector/View_Viewer.hxx>
+
+#include <BRep_Builder.hxx>
+#include <BRepTools.hxx>
+#include <OSD_File.hxx>
+#include <OSD_Path.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QApplication>
+#include <QAction>
+#include <QComboBox>
+#include <QDockWidget>
+#include <QDir>
+#include <QFile>
+#include <QFileDialog>
+#include <QHeaderView>
+#include <QMainWindow>
+#include <QMenu>
+#include <QMessageBox>
+#include <QPlainTextEdit>
+#include <QPushButton>
+#include <QTextEdit>
+#include <QTextStream>
+#include <QToolBar>
+#include <QToolButton>
+#include <QTreeView>
+#include <QWidget>
+#include <QVBoxLayout>
+#include <Standard_WarningsRestore.hxx>
+
+const int DEFAULT_TEXT_VIEW_WIDTH = 400;// 800;
+const int DEFAULT_TEXT_VIEW_HEIGHT = 700;
+const int DEFAULT_TEXT_VIEW_POSITION_X = 430;
+const int DEFAULT_TEXT_VIEW_POSITION_Y = 30;
+const int DEFAULT_TEXT_VIEW_DELTA = 100;
+
+const int DEFAULT_SHAPE_VIEW_WIDTH = 400;// 900;
+const int DEFAULT_SHAPE_VIEW_HEIGHT = 450;
+const int DEFAULT_SHAPE_VIEW_POSITION_X = 60;
+const int DEFAULT_SHAPE_VIEW_POSITION_Y = 60;
+
+const int DEFAULT_DETACH_POSITION_X = 5;
+const int DEFAULT_DETACH_POSITION_Y = 450;
+
+const int MESSAGEVIEW_DEFAULT_TREE_VIEW_WIDTH = 950; //600
+const int MESSAGEVIEW_DEFAULT_TREE_VIEW_HEIGHT = 500;
+
+const int MESSAGEVIEW_DEFAULT_VIEW_WIDTH = 200;// 400;
+const int MESSAGEVIEW_DEFAULT_VIEW_HEIGHT = 300;// 1000;
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+MessageView_Window::MessageView_Window (QWidget* theParent)
+: QObject (theParent)
+{
+ myMainWindow = new QMainWindow (theParent);
+
+ myTreeView = new ViewControl_TreeView (myMainWindow);
+ ((ViewControl_TreeView*)myTreeView)->SetPredefinedSize (QSize (MESSAGEVIEW_DEFAULT_TREE_VIEW_WIDTH,
+ MESSAGEVIEW_DEFAULT_TREE_VIEW_HEIGHT));
+ MessageModel_TreeModel* aModel = new MessageModel_TreeModel (myTreeView);
+ for (int i = 5; i <= 7; i++) // hide shape parameters columns
+ {
+ TreeModel_HeaderSection anItem = aModel->GetHeaderItem (i);
+ anItem.SetIsHidden (true);
+ aModel->SetHeaderItem (i, anItem);
+ }
+
+ myTreeView->setModel (aModel);
+ MessageView_VisibilityState* aVisibilityState = new MessageView_VisibilityState (aModel);
+ aModel->SetVisibilityState (aVisibilityState);
+ connect (aVisibilityState, SIGNAL (itemClicked (const QModelIndex&)), this, SLOT(onTreeViewVisibilityClicked(const QModelIndex&)));
+
+ TreeModel_Tools::UseVisibilityColumn (myTreeView);
+
+ QItemSelectionModel* aSelectionModel = new QItemSelectionModel (aModel);
+ myTreeView->setSelectionMode (QAbstractItemView::ExtendedSelection);
+ myTreeView->setSelectionModel (aSelectionModel);
+ connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
+ this, SLOT (onTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&)));
+
+ myTreeViewActions = new MessageModel_Actions (myMainWindow, aModel, aSelectionModel);
+ myTreeView->setContextMenuPolicy (Qt::CustomContextMenu);
+ connect (myTreeView, SIGNAL (customContextMenuRequested (const QPoint&)),
+ this, SLOT (onTreeViewContextMenuRequested (const QPoint&)));
+ new TreeModel_ContextMenu (myTreeView);
+
+ QModelIndex aParentIndex = myTreeView->model()->index (0, 0);
+ myTreeView->setExpanded (aParentIndex, true);
+
+ myMainWindow->setCentralWidget (myTreeView);
+
+ // property view
+ myPropertyView = new ViewControl_PropertyView (myMainWindow);
+ myPropertyPanelWidget = new QDockWidget (tr ("PropertyPanel"), myMainWindow);
+ myPropertyPanelWidget->setObjectName (myPropertyPanelWidget->windowTitle());
+ myPropertyPanelWidget->setTitleBarWidget (new QWidget(myMainWindow));
+ myPropertyPanelWidget->setWidget (myPropertyView->GetControl());
+ myMainWindow->addDockWidget (Qt::RightDockWidgetArea, myPropertyPanelWidget);
+ connect (myPropertyPanelWidget->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT (onPropertyPanelShown (bool)));
+ connect (myPropertyView, SIGNAL (propertyViewSelectionChanged()), this, SLOT (onPropertyViewSelectionChanged ()));
+
+ // view
+ myViewWindow = new View_Window (myMainWindow, false);
+ connect (myViewWindow, SIGNAL(eraseAllPerformed()), this, SLOT(onEraseAllPerformed()));
+ aVisibilityState->SetDisplayer (myViewWindow->GetDisplayer());
+ aVisibilityState->SetPresentationType (View_PresentationType_Main);
+ myViewWindow->GetView()->SetPredefinedSize (MESSAGEVIEW_DEFAULT_VIEW_WIDTH, MESSAGEVIEW_DEFAULT_VIEW_HEIGHT);
+
+ myViewDockWidget = new QDockWidget (tr ("View"), myMainWindow);
+ myViewDockWidget->setObjectName (myViewDockWidget->windowTitle());
+ myViewDockWidget->setWidget (myViewWindow);
+ myMainWindow->addDockWidget (Qt::RightDockWidgetArea, myViewDockWidget);
+
+ myMainWindow->resize (DEFAULT_SHAPE_VIEW_WIDTH, DEFAULT_SHAPE_VIEW_HEIGHT);
+ myMainWindow->move (DEFAULT_SHAPE_VIEW_POSITION_X, DEFAULT_SHAPE_VIEW_POSITION_Y);
+}
+
+// =======================================================================
+// function : SetParent
+// purpose :
+// =======================================================================
+void MessageView_Window::SetParent (void* theParent)
+{
+ QWidget* aParent = (QWidget*)theParent;
+ if (aParent)
+ {
+ QLayout* aLayout = aParent->layout();
+ if (aLayout)
+ aLayout->addWidget (GetMainWindow());
+ }
+ else
+ {
+ GetMainWindow()->setParent (0);
+ GetMainWindow()->setVisible (true);
+ }
+}
+
+// =======================================================================
+// function : FillActionsMenu
+// purpose :
+// =======================================================================
+void MessageView_Window::FillActionsMenu (void* theMenu)
+{
+ QMenu* aMenu = (QMenu*)theMenu;
+ QList<QDockWidget*> aDockwidgets = myMainWindow->findChildren<QDockWidget*>();
+ for (QList<QDockWidget*>::iterator it = aDockwidgets.begin(); it != aDockwidgets.end(); ++it)
+ {
+ QDockWidget* aDockWidget = *it;
+ if (aDockWidget->parentWidget() == myMainWindow)
+ aMenu->addAction (aDockWidget->toggleViewAction());
+ }
+}
+
+// =======================================================================
+// function : GetPreferences
+// purpose :
+// =======================================================================
+void MessageView_Window::GetPreferences (TInspectorAPI_PreferencesDataMap& theItem)
+{
+ theItem.Clear();
+ theItem.Bind ("geometry", TreeModel_Tools::ToString (myMainWindow->saveState()).toStdString().c_str());
+
+ QMap<QString, QString> anItems;
+ TreeModel_Tools::SaveState (myTreeView, anItems);
+ View_Tools::SaveState (myViewWindow, anItems);
+ ViewControl_PropertyView::SaveState (myPropertyView, anItems);
+
+ for (QMap<QString, QString>::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++)
+ theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str());
+}
+
+// =======================================================================
+// function : SetPreferences
+// purpose :
+// =======================================================================
+void MessageView_Window::SetPreferences (const TInspectorAPI_PreferencesDataMap& theItem)
+{
+ if (theItem.IsEmpty())
+ {
+ TreeModel_Tools::SetDefaultHeaderSections (myTreeView);
+ return;
+ }
+
+ for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt (theItem); anItemIt.More(); anItemIt.Next())
+ {
+ if (anItemIt.Key().IsEqual ("geometry"))
+ myMainWindow->restoreState (TreeModel_Tools::ToByteArray (anItemIt.Value().ToCString()));
+ else if (TreeModel_Tools::RestoreState (myTreeView, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
+ continue;
+ else if (View_Tools::RestoreState (myViewWindow, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
+ continue;
+ else if (ViewControl_PropertyView::RestoreState (myPropertyView, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
+ continue;
+ }
+}
+
+// =======================================================================
+// function : UpdateContent
+// purpose :
+// =======================================================================
+void MessageView_Window::UpdateContent()
+{
+ bool isUpdated = false;
+ TCollection_AsciiString aName = "TKMessageView";
+ if (myParameters->FindParameters (aName))
+ {
+ NCollection_List<Handle(Standard_Transient)> aParameters = myParameters->Parameters (aName);
+ // Init will remove from parameters those, that are processed only one time (TShape)
+ Init (aParameters);
+ myParameters->SetParameters (aName, aParameters);
+ isUpdated = true;
+ }
+ if (myParameters->FindFileNames (aName))
+ {
+ for (NCollection_List<TCollection_AsciiString>::Iterator aFilesIt (myParameters->FileNames (aName));
+ aFilesIt.More(); aFilesIt.Next())
+ openFile (aFilesIt.Value());
+
+ NCollection_List<TCollection_AsciiString> aNames;
+ myParameters->SetFileNames (aName, aNames);
+ isUpdated = true;
+ }
+ Handle(Message_Report) aDefaultReport = Message_Report::CurrentReport( Standard_False);
+ MessageModel_TreeModel* aViewModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
+ if (!aDefaultReport.IsNull() && !aViewModel->HasReport (aDefaultReport))
+ {
+ aDefaultReport->SetCallBack (myCallBack);
+ addReport (aDefaultReport);
+ }
+
+ // reload report of selected item
+ onReloadReport();
+
+ updateTreeModel();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void MessageView_Window::Init (NCollection_List<Handle(Standard_Transient)>& theParameters)
+{
+ Handle(AIS_InteractiveContext) aContext;
+ NCollection_List<Handle(Standard_Transient)> aParameters;
+
+ for (NCollection_List<Handle(Standard_Transient)>::Iterator aParamsIt (theParameters);
+ aParamsIt.More(); aParamsIt.Next())
+ {
+ Handle(Standard_Transient) anObject = aParamsIt.Value();
+ Handle(Message_Report) aMessageReport = Handle(Message_Report)::DownCast (anObject);
+ if (!aMessageReport.IsNull())
+ {
+ aMessageReport->SetCallBack (myCallBack);
+ addReport (aMessageReport);
+ }
+ else
+ {
+ aParameters.Append (anObject);
+ if (aContext.IsNull())
+ aContext = Handle(AIS_InteractiveContext)::DownCast (anObject);
+ }
+ }
+ QAbstractItemModel* aModel = myTreeView->model();
+ if (!aModel)
+ return;
+ MessageModel_TreeModel* aTreeModel = dynamic_cast<MessageModel_TreeModel*> (aModel);
+ if (!aTreeModel)
+ return;
+ aTreeModel->EmitLayoutChanged();
+
+ if (!aContext.IsNull())
+ myViewWindow->SetContext (View_ContextType_External, aContext);
+
+ theParameters = aParameters;
+}
+
+// =======================================================================
+// function : openFile
+// purpose :
+// =======================================================================
+void MessageView_Window::openFile(const TCollection_AsciiString& theFileName)
+{
+ Handle(Message_Report) aReport = XmlDrivers_MessageReportStorage::ImportReport(theFileName);
+ if (aReport.IsNull())
+ return;
+
+ addReport (aReport, theFileName);
+}
+
+// =======================================================================
+// function : updateTreeModel
+// purpose :
+// =======================================================================
+void MessageView_Window::updateTreeModel()
+{
+ MessageModel_TreeModel* aViewModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
+ if (!aViewModel)
+ return;
+
+ aViewModel->UpdateTreeModel();
+}
+
+// =======================================================================
+// function : addReport
+// purpose :
+// =======================================================================
+void MessageView_Window::addReport (const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theReportDescription)
+{
+ MessageModel_TreeModel* aModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
+ aModel->AddReport (theReport, theReportDescription);
+}
+
+// =======================================================================
+// function : onTreeViewSelectionChanged
+// purpose :
+// =======================================================================
+void MessageView_Window::onTreeViewVisibilityClicked(const QModelIndex& theIndex)
+{
+ MessageModel_TreeModel* aTreeModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
+ TreeModel_VisibilityState* aVisibilityState = aTreeModel->GetVisibilityState();
+ if (!aVisibilityState->IsVisible (theIndex))
+ myPropertyView->ClearActiveTablesSelection();
+}
+
+// =======================================================================
+// function : onTreeViewSelectionChanged
+// purpose :
+// =======================================================================
+void MessageView_Window::onTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&)
+{
+ if (!myPropertyPanelWidget->toggleViewAction()->isChecked())
+ return;
+
+ updatePropertyPanelBySelection();
+}
+
+// =======================================================================
+// function : onTreeViewContextMenuRequested
+// purpose :
+// =======================================================================
+void MessageView_Window::onTreeViewContextMenuRequested (const QPoint& thePosition)
+{
+ QMenu* aMenu = new QMenu (GetMainWindow());
+
+ MessageModel_ItemRootPtr aRootItem;
+ MessageModel_ItemReportPtr aReportItem;
+ QModelIndexList aSelectedIndices = myTreeView->selectionModel()->selectedIndexes();
+
+ QModelIndexList aFirstColumnSelected = TreeModel_ModelBase::GetSelected (aSelectedIndices, 0);
+ if (aFirstColumnSelected.size() == 1)
+ {
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (aFirstColumnSelected.first());
+ if (itemDynamicCast<MessageModel_ItemRoot> (anItemBase))
+ aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Import Report"), SLOT (onImportReport()), myMainWindow, this));
+ else if (itemDynamicCast<MessageModel_ItemReport> (anItemBase))
+ {
+ aReportItem = itemDynamicCast<MessageModel_ItemReport>(anItemBase);
+ aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Export Report"), SLOT (onExportReport()), myMainWindow, this));
+ const TCollection_AsciiString& aDescription = aReportItem->GetDescription();
+ if (!aDescription.IsEmpty())
+ {
+ OSD_Path aPath(aDescription);
+ OSD_File aDescriptionFile (aPath);
+ if (aDescriptionFile.IsReadable())
+ aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Reload"), SLOT (onReloadReport()), myMainWindow, this));
+ }
+ }
+ }
+ else if (aFirstColumnSelected.size() == 2)
+ {
+ MessageModel_ItemAlertPtr anAlertItem1 = itemDynamicCast<MessageModel_ItemAlert>
+ (TreeModel_ModelBase::GetItemByIndex (aFirstColumnSelected.at(0)));
+ MessageModel_ItemAlertPtr anAlertItem2 = itemDynamicCast<MessageModel_ItemAlert>
+ (TreeModel_ModelBase::GetItemByIndex (aFirstColumnSelected.at(1)));
+ if (anAlertItem1 && anAlertItem2)
+ aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Compare"), SLOT (onCompareAlerts()), myMainWindow, this));
+ }
+ aMenu->addSeparator();
+ myTreeViewActions->AddMenuActions (aSelectedIndices, aMenu);
+
+ QPoint aPoint = myTreeView->mapToGlobal (thePosition);
+ aMenu->exec (aPoint);
+}
+
+// =======================================================================
+// function : onPropertyPanelShown
+// purpose :
+// =======================================================================
+void MessageView_Window::onPropertyPanelShown (bool isToggled)
+{
+ if (!isToggled)
+ return;
+
+ updatePropertyPanelBySelection();
+}
+
+// =======================================================================
+// function : onPropertyViewSelectionChanged
+// purpose :
+// =======================================================================
+void MessageView_Window::onPropertyViewSelectionChanged()
+{
+ QItemSelectionModel* aModel = myTreeView->selectionModel();
+ if (!aModel)
+ return;
+ QModelIndex aSelectedIndex = TreeModel_ModelBase::SingleSelected (aModel->selectedIndexes(), 0);
+ QModelIndex anIndex = myTreeView->model()->index (aSelectedIndex.row(), TreeModel_ColumnType_Visibility, aSelectedIndex.parent());
+
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
+ if (!anItemBase)
+ return;
+ MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast<MessageModel_ItemAlert>(anItemBase);
+ if (!anAlertItem)
+ return;
+
+ QList<ViewControl_Table*> aPropertyTables;
+ myPropertyView->GetActiveTables (aPropertyTables);
+ if (aPropertyTables.isEmpty())
+ return;
+
+ ViewControl_Table* aFirstTable = aPropertyTables[0]; // TODO: implement for several tables
+
+ QMap<int, QList<int>> aSelectedIndices;
+ aFirstTable->GetSelectedIndices (aSelectedIndices);
+
+ // clear presentation if selection is empty
+ MessageModel_TreeModel* aTreeModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
+ TreeModel_VisibilityState* aVisibilityState = aTreeModel->GetVisibilityState();
+ if (aSelectedIndices.isEmpty() && aVisibilityState->IsVisible (anIndex))
+ {
+ aVisibilityState->SetVisible (anIndex, false, true);
+ anAlertItem->SetCustomShape (TopoDS_Shape());
+ return;
+ }
+
+ TopoDS_Shape aShapeOfSelection = MessageModel_Tools::BuildShape (anAlertItem->GetAlert(), aSelectedIndices[0], aFirstTable);
+ if (aShapeOfSelection.IsNull())
+ return;
+
+ if (aVisibilityState->IsVisible (anIndex))
+ {
+ View_Displayer* aDisplayer = myViewWindow->GetDisplayer();
+
+ Handle(AIS_InteractiveObject) aPresentation = myViewWindow->GetDisplayer()->FindPresentation (anAlertItem->GetCustomShape());
+
+ Handle(AIS_Shape) aShapePresentation = Handle(AIS_Shape)::DownCast (aPresentation);
+ aShapePresentation->Set (aShapeOfSelection);
+
+ aDisplayer->RedisplayPresentation (aPresentation);
+ anAlertItem->SetCustomShape (aShapeOfSelection);
+ }
+ else
+ {
+ anAlertItem->SetCustomShape (aShapeOfSelection);
+ aVisibilityState->SetVisible (anIndex, true);
+ }
+}
+
+// =======================================================================
+// function : onEraseAllPerformed
+// purpose :
+// =======================================================================
+void MessageView_Window::onEraseAllPerformed()
+{
+ MessageModel_TreeModel* aTreeModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
+
+ // TODO: provide update for only visibility state for better performance TopoDS_Shape myCustomShape;
+
+ aTreeModel->Reset();
+ aTreeModel->EmitLayoutChanged();
+}
+
+// =======================================================================
+// function : onExportReport
+// purpose :
+// =======================================================================
+void MessageView_Window::onExportReport()
+{
+ QItemSelectionModel* aModel = myTreeView->selectionModel();
+ if (!aModel)
+ return;
+ QModelIndex anIndex = TreeModel_ModelBase::SingleSelected (aModel->selectedIndexes(), 0);
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
+ if (!anItemBase)
+ return;
+ MessageModel_ItemReportPtr aReportItem = itemDynamicCast<MessageModel_ItemReport>(anItemBase);
+ if (!aReportItem)
+ return;
+
+ QString aFilter (tr ("Document file (*.xml *)"));
+ QString aSelectedFilter;
+ QString aFileName = QFileDialog::getSaveFileName (0, tr ("Export report to file"), QString(), aFilter, &aSelectedFilter);
+
+ XmlDrivers_MessageReportStorage::ExportReport (aReportItem->GetReport(),
+ TCollection_AsciiString (aFileName.toStdString().c_str()));
+}
+
+// =======================================================================
+// function : onImportReport
+// purpose :
+// =======================================================================
+void MessageView_Window::onImportReport()
+{
+ QString aFilter (tr ("Document file (*.cbf *)"));
+ QString aSelectedFilter;
+
+ QString aFileName = QFileDialog::getOpenFileName (0, tr("Import report"), QString(), aSelectedFilter);
+ openFile (TCollection_AsciiString (aFileName.toStdString().c_str()));
+}
+
+// =======================================================================
+// function : onReloadReport
+// purpose :
+// =======================================================================
+void MessageView_Window::onReloadReport()
+{
+ QItemSelectionModel* aModel = myTreeView->selectionModel();
+ if (!aModel)
+ return;
+ QModelIndex anIndex = TreeModel_ModelBase::SingleSelected (aModel->selectedIndexes(), 0);
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
+ if (!anItemBase)
+ return;
+ MessageModel_ItemReportPtr aReportItem = itemDynamicCast<MessageModel_ItemReport>(anItemBase);
+ if (!aReportItem)
+ aReportItem = MessageModel_ItemReport::FindReportItem (anItemBase);
+
+ if (!aReportItem)
+ return;
+
+ const TCollection_AsciiString aDescription = aReportItem->GetDescription();
+ Handle(Message_Report) aReport = XmlDrivers_MessageReportStorage::ImportReport (aDescription);
+ if (aReport.IsNull())
+ return;
+
+ MessageModel_TreeModel* aTreeModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
+ aModel->clearSelection();
+ aTreeModel->SetReport (aReportItem->Row(), aReport, aDescription);
+}
+
+// =======================================================================
+// function : onCompareAlerts
+// purpose :
+// =======================================================================
+void MessageView_Window::onCompareAlerts()
+{
+ QModelIndexList aSelectedIndices = myTreeView->selectionModel()->selectedIndexes();
+ QModelIndexList aFirstColumnSelected = TreeModel_ModelBase::GetSelected (aSelectedIndices, 0);
+ if (aFirstColumnSelected.size() != 2)
+ return;
+
+ MessageModel_ItemAlertPtr anAlertItem1 = itemDynamicCast<MessageModel_ItemAlert>
+ (TreeModel_ModelBase::GetItemByIndex (aFirstColumnSelected.at(0)));
+ MessageModel_ItemAlertPtr anAlertItem2 = itemDynamicCast<MessageModel_ItemAlert>
+ (TreeModel_ModelBase::GetItemByIndex (aFirstColumnSelected.at(1)));
+
+ if (!anAlertItem1 || !anAlertItem2)
+ return;
+
+}
+
+// =======================================================================
+// function : updatePropertyPanelBySelection
+// purpose :
+// =======================================================================
+void MessageView_Window::updatePropertyPanelBySelection()
+{
+ QItemSelectionModel* aModel = myTreeView->selectionModel();
+ if (!aModel)
+ return;
+
+ QModelIndexList aSelected = TreeModel_ModelBase::GetSelected (aModel->selectedIndexes(), 0);
+ QList<ViewControl_TableModelValues*> aTableValues;
+ if (aSelected.size() == 1)
+ {
+ MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast<MessageModel_ItemAlert>(
+ TreeModel_ModelBase::GetItemByIndex (aSelected.first()));
+ if (anAlertItem)
+ MessageModel_Tools::GetPropertyTableValues (anAlertItem->GetAlert(), aTableValues);
+ }
+ else if (aSelected.size() == 2)
+ {
+ MessageModel_ItemAlertPtr anAlertItem1 = itemDynamicCast<MessageModel_ItemAlert>(
+ TreeModel_ModelBase::GetItemByIndex (aSelected.at(0)));
+ MessageModel_ItemAlertPtr anAlertItem2 = itemDynamicCast<MessageModel_ItemAlert>(
+ TreeModel_ModelBase::GetItemByIndex (aSelected.at(1)));
+ if (anAlertItem1 && anAlertItem2)
+ MessageModel_Tools::GetPropertyTableValues (anAlertItem1->GetAlert(), anAlertItem2->GetAlert(), aTableValues);
+ }
+
+ myPropertyView->Init (aTableValues);
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef MessageView_Window_H
+#define MessageView_Window_H
+
+#include <Message_Report.hxx>
+#include <Standard.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#include <inspector/MessageModel_Actions.hxx>
+
+#include <inspector/TInspectorAPI_PluginParameters.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QItemSelection>
+#include <QList>
+#include <QModelIndexList>
+#include <QObject>
+#include <QPoint>
+#include <QString>
+#include <QTreeView>
+#include <Standard_WarningsRestore.hxx>
+
+class View_Window;
+
+class ViewControl_PropertyView;
+class MessageModel_ReportCallBack;
+
+class QDockWidget;
+class QMainWindow;
+class QWidget;
+
+//! \class MessageView_Window
+//! Window that unites all MessageView controls.
+class MessageView_Window : public QObject
+{
+ Q_OBJECT
+public:
+
+ //! Constructor
+ Standard_EXPORT MessageView_Window (QWidget* theParent);
+
+ //! Destructor
+ virtual ~MessageView_Window() {}
+
+ //! Provides the container with a parent where this container should be inserted.
+ //! If Qt implementation, it should be QWidget with QLayout set inside
+ //! \param theParent a parent class
+ Standard_EXPORT void SetParent (void* theParent);
+
+ //! Sets parameters container, it should be used when the plugin is initialized or in update content
+ //! \param theParameters a parameters container
+ void SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters)
+ { myParameters = theParameters; myTreeViewActions->SetParameters (theParameters); }
+
+ //! Sets message callback to update the current content of the view
+ //! \param theCallBack
+ void SetCallBack (const Handle(Message_ReportCallBack)& theCallBack) { myCallBack = theCallBack; }
+
+ //! Provide container for actions available in inspector on general level
+ //! \param theMenu if Qt implementation, it is QMenu object
+ Standard_EXPORT virtual void FillActionsMenu (void* theMenu);
+
+ //! Returns plugin preferences: dock widgets state, tree view columns.
+ //! \param theItem container of preference elements
+ Standard_EXPORT void GetPreferences (TInspectorAPI_PreferencesDataMap& theItem);
+
+ //! Applies plugin preferences
+ //! \param theItem container of preference elements
+ Standard_EXPORT void SetPreferences (const TInspectorAPI_PreferencesDataMap& theItem);
+
+ //! Applyes parameters to Init controls, opens files if there are in parameters, updates OCAF tree view model
+ Standard_EXPORT void UpdateContent();
+
+ //! Returns main control
+ QMainWindow* GetMainWindow() const { return myMainWindow; }
+
+ //! Returns current tree view
+ QTreeView* GetTreeView() const { return myTreeView; }
+
+protected:
+ //! Appends shape into tree view model
+ //! \param theShape a shape instance
+ //! \param theReportDescription an additional report information
+ void addReport (const Handle(Message_Report)& theReport,
+ const TCollection_AsciiString& theReportDescription = "");
+
+private:
+
+ //! Fills controls of the plugin by parameters:
+ //! - Fine AIS_InteractiveObject and fills View if it if it differs from the current context
+ //! \param theParameters a parameters container
+ void Init (NCollection_List<Handle(Standard_Transient)>& theParameters);
+
+ //! Read Shape from the file name, add Shape into tree view
+ //! \param theFileName BREP file name
+ void openFile (const TCollection_AsciiString& theFileName);
+
+ //! Updates tree model
+ void updateTreeModel();
+
+protected slots:
+ //! Updates property view selection in table if the item is hidden
+ //! \param theIndex tree view model index
+ void onTreeViewVisibilityClicked(const QModelIndex& theIndex);
+
+ //! Udpates all controls by changed selection in OCAF tree view
+ //! \param theSelected list of selected tree view items
+ //! \param theDeselected list of deselected tree view items
+ void onTreeViewSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+ //! Shows context menu for tree view selected item. It contains expand/collapse actions.
+ //! \param thePosition a clicked point
+ void onTreeViewContextMenuRequested (const QPoint& thePosition);
+
+ //! Display content of selected tree view item if isToggled is true
+ //! \param isToggled true if the property dock widget is shown
+ void onPropertyPanelShown (bool isToggled);
+
+ //! Update presentation of the selected tree view item using information about selection in property view
+ //! \param theSelected container of selected table cells
+ //! \param theDeselected container of selected table cells
+ void onPropertyViewSelectionChanged();
+
+ //! Updates visibility states by erase all in context
+ void onEraseAllPerformed();
+
+ //! Export report into document
+ void onExportReport();
+
+ //! Import report into document
+ void onImportReport();
+
+ //! Reads if possible report of a selected item and updates this report in tree view
+ void onReloadReport();
+
+ //! Compares selected alerts
+ void onCompareAlerts();
+
+protected:
+ //! Updates property panel content by item selected in tree view.
+ void updatePropertyPanelBySelection();
+
+private:
+ QMainWindow* myMainWindow; //!< main control, parent for all MessageView controls
+ QDockWidget* myViewDockWidget; //!< view dock widget to hide/show
+
+ QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget
+ ViewControl_PropertyView* myPropertyView; //!< property control to display model item values if exist
+
+ View_Window* myViewWindow; //!< OCC 3d view to visualize presentations
+ QTreeView* myTreeView; //!< tree view visualized shapes
+ MessageModel_Actions* myTreeViewActions; //!< processing history view actions
+
+ Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container
+ Handle(Message_ReportCallBack) myCallBack; //! < message call back to update content of the view
+};
+
+#endif
#include <TopoDS_Iterator.hxx>
#include <TopoDS_Vertex.hxx>
+#include <TopExp.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+
#include <Standard_WarningsDisable.hxx>
#include <QObject>
#include <QStringList>
// =======================================================================
TopoDS_Shape ShapeView_ItemShape::GetShape (const int theRowId) const
{
- TopoDS_Iterator aSubShapeIt (myShape);
+ if (myExplodeType != TopAbs_SHAPE)
+ {
+ TopTools_IndexedMapOfShape aSubShapes;
+ TopExp::MapShapes(myShape, myExplodeType, aSubShapes);
+
+ return aSubShapes(theRowId + 1);
+ }
+
+ TopoDS_Iterator aSubShapeIt(myShape);
for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++)
{
if (aCurrentIndex != theRowId)
case 19: return aCurve->IsPeriodic() ? QString::number (aCurve->Period()) : ToString (aCurve->IsPeriodic());
}
}
+ case 20: return Row() + 1;
default: break;
}
return QVariant();
return 0;
int aRowsCount = 0;
- for (TopoDS_Iterator aSubShapeIt(aShape); aSubShapeIt.More(); aSubShapeIt.Next())
- aRowsCount++;
+ if (myExplodeType != TopAbs_SHAPE)
+ {
+ TopTools_IndexedMapOfShape aSubShapes;
+ TopExp::MapShapes(aShape, myExplodeType, aSubShapes);
+ aRowsCount = aSubShapes.Extent();
+ }
+ else
+ {
+ for (TopoDS_Iterator aSubShapeIt(aShape); aSubShapeIt.More(); aSubShapeIt.Next())
+ aRowsCount++;
+ }
return aRowsCount;
}
#include <inspector/ShapeView_ItemBase.hxx>
#include <Standard.hxx>
#include <TCollection_AsciiString.hxx>
+#include <TopAbs_ShapeEnum.hxx>
#include <TopoDS_Shape.hxx>
#include <Standard_WarningsDisable.hxx>
//! Destructor
virtual ~ShapeView_ItemShape() Standard_OVERRIDE {};
+ //! Sets explore type
+ //! \param theType type of item explode. If TopAbs_SHAPE, no expode, only iteration by shape
+ void SetExplodeType (const TopAbs_ShapeEnum theType) { myExplodeType = theType; }
+
+ //! Returns expode type of the item
+ TopAbs_ShapeEnum GetExplodeType() const { return myExplodeType; }
+
//! Returns the current shape
const TopoDS_Shape& GetItemShape() const { initItem(); return myShape; }
private:
//! Constructor
- ShapeView_ItemShape(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
- : ShapeView_ItemBase(theParent, theRow, theColumn) {}
+ ShapeView_ItemShape (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ : ShapeView_ItemBase (theParent, theRow, theColumn), myExplodeType (TopAbs_SHAPE) {}
private:
+ TopAbs_ShapeEnum myExplodeType; //!< type of explore own shape and get children
TopoDS_Shape myShape; //!< current shape
QString myFileName; //!< BREP file name
#include <BRepTools.hxx>
#include <AIS_Shape.hxx>
+
+#include <TopExp.hxx>
+
// =======================================================================
// function : ReadShape
// purpose :
BRepTools::Read (aShape, theFileName.ToCString(), aBuilder);
return aShape;
}
+
+// =======================================================================
+// function : IsPossibleToExplode
+// purpose :
+// =======================================================================
+Standard_Boolean ShapeView_Tools::IsPossibleToExplode (const TopoDS_Shape& theShape,
+ NCollection_List<TopAbs_ShapeEnum>& theExplodeTypes)
+{
+ TopAbs_ShapeEnum aShapeType = theShape.ShapeType();
+
+ TopTools_IndexedMapOfShape aSubShapes;
+ for (int aType = aShapeType + 1; aType <= TopAbs_SHAPE; aType++)
+ {
+ aSubShapes.Clear();
+ TopExp::MapShapes(theShape, (TopAbs_ShapeEnum)aType, aSubShapes);
+ if (aSubShapes.Extent() > 0)
+ theExplodeTypes.Append((TopAbs_ShapeEnum)aType);
+ }
+
+ return theExplodeTypes.Size() > 0;
+}
//! \param theFileName a file name
//! \return shape or NULL
Standard_EXPORT static TopoDS_Shape ReadShape (const TCollection_AsciiString& theFileName);
+
+ //! Checks whether it is possible to expode the shape
+ //! \param theShape source shape object
+ //! \param theExplodeTypes container of possible shape types to be exploded
+ Standard_EXPORT static Standard_Boolean IsPossibleToExplode(const TopoDS_Shape& theShape,
+ NCollection_List<TopAbs_ShapeEnum>& theExplodeTypes);
};
#endif
SetHeaderItem (17, TreeModel_HeaderSection ("Continuity", -1, true));
SetHeaderItem (18, TreeModel_HeaderSection ("IsClosed", -1, true));
SetHeaderItem (19, TreeModel_HeaderSection ("IsPeriodic", -1, true));
+ SetHeaderItem (20, TreeModel_HeaderSection ("Index", -1, true));
}
// =======================================================================
// =======================================================================
QModelIndex ShapeView_TreeModel::FindIndex (const TopoDS_Shape& theShape) const
{
- QModelIndex aParentIndex = index (0, 0);
- TreeModel_ItemBasePtr aParentItem = TreeModel_ModelBase::GetItemByIndex (aParentIndex); // application item
- for (int aChildId = 0, aCount = aParentItem->rowCount(); aChildId < aCount; aChildId++)
+ for (int aChildId = 0, aCount = rowCount(); aChildId < aCount; aChildId++)
{
- QModelIndex anIndex = index (aChildId, 0, aParentIndex);
+ QModelIndex anIndex = index (aChildId, 0);
ShapeView_ItemShapePtr anItem = itemDynamicCast<ShapeView_ItemShape> (TreeModel_ModelBase::GetItemByIndex (anIndex));
if (anItem && anItem->GetItemShape() == theShape)
return anIndex;
ShapeView_ItemRootPtr aRootItem = itemDynamicCast<ShapeView_ItemRoot> (anItemBase);
if (aRootItem) {
aMenu->addAction (ViewControl_Tools::CreateAction ("Load BREP file", SLOT (onLoadFile()), myMainWindow, this));
+ aMenu->addAction (ViewControl_Tools::CreateAction ("Load BREP file from a directory", SLOT (onLoadDirectory()), myMainWindow, this));
aMenu->addAction (ViewControl_Tools::CreateAction ("Remove all shape items", SLOT (onClearView()), myMainWindow, this));
}
- else {
+ else
+ {
if (!GetTemporaryDirectory().IsEmpty())
aMenu->addAction (ViewControl_Tools::CreateAction ("BREP view", SLOT (onBREPView()), myMainWindow, this));
aMenu->addAction (ViewControl_Tools::CreateAction ("Close All BREP views", SLOT (onCloseAllBREPViews()), myMainWindow, this));
aMenu->addAction (ViewControl_Tools::CreateAction ("BREP directory", SLOT (onBREPDirectory()), myMainWindow, this));
+
+ ShapeView_ItemShapePtr aShapeItem = itemDynamicCast<ShapeView_ItemShape>(anItemBase);
+ const TopoDS_Shape& aShape = aShapeItem->GetItemShape();
+ TopAbs_ShapeEnum anExplodeType = aShapeItem->GetExplodeType();
+ NCollection_List<TopAbs_ShapeEnum> anExplodeTypes;
+ if (ShapeView_Tools::IsPossibleToExplode (aShape, anExplodeTypes))
+ {
+ QMenu* anExplodeMenu = aMenu->addMenu ("Explode");
+ for (NCollection_List<TopAbs_ShapeEnum>::Iterator anExpIterator (anExplodeTypes); anExpIterator.More();
+ anExpIterator.Next())
+ {
+ TopAbs_ShapeEnum aType = anExpIterator.Value();
+ QAction* anAction = ViewControl_Tools::CreateAction (TopAbs::ShapeTypeToString (aType), SLOT (onExplode()), myMainWindow, this);
+ anExplodeMenu->addAction (anAction);
+ if (anExplodeType == aType)
+ {
+ anAction->setCheckable (true);
+ anAction->setChecked (true);
+ }
+ }
+ QAction* anAction = ViewControl_Tools::CreateAction ("NONE", SLOT (onExplode()), myMainWindow, this);
+ anExplodeMenu->addSeparator();
+ anExplodeMenu->addAction (anAction);
+ }
}
+ //aMenu->addAction(ViewControl_Tools::CreateAction("BREP directory", SLOT(onBREPDirectory()), myMainWindow, this));
+
+
QPoint aPoint = myTreeView->mapToGlobal (thePosition);
aMenu->exec (aPoint);
}
viewFile (aFileName);
}
+// =======================================================================
+// function : onExplode
+// purpose :
+// =======================================================================
+void ShapeView_Window::onExplode()
+{
+ QItemSelectionModel* aModel = myTreeView->selectionModel();
+ if (!aModel)
+ return;
+
+ QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(aModel->selectedIndexes(), 0);
+ TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex);
+ if (!anItemBase)
+ return;
+
+ ShapeView_ItemShapePtr aShapeItem = itemDynamicCast<ShapeView_ItemShape>(anItemBase);
+ if (!aShapeItem)
+ return;
+
+ QAction* anAction = (QAction*)sender();
+ if (!anAction)
+ return;
+
+ QApplication::setOverrideCursor (Qt::WaitCursor);
+ TopAbs_ShapeEnum aShapeType;
+ if (anAction->text() == "NONE")
+ aShapeType = TopAbs_SHAPE;
+ else
+ aShapeType = TopAbs::ShapeTypeFromString(anAction->text().toStdString().c_str());
+
+ myViewWindow->GetDisplayer()->EraseAllPresentations();
+ aShapeItem->SetExplodeType(aShapeType);
+
+ //anItemBase->Parent()->Reset(); - TODO (update only modified sub-tree)
+ ShapeView_TreeModel* aTreeModel = dynamic_cast<ShapeView_TreeModel*> (myTreeView->model());
+ aTreeModel->Reset();
+ aTreeModel->EmitLayoutChanged();
+ QApplication::restoreOverrideCursor();
+}
+
// =======================================================================
// function : onLoadFile
// purpose :
onOpenFile(aFileName);
}
+// =======================================================================
+// function : onLoadDirectory
+// purpose :
+// =======================================================================
+void ShapeView_Window::onLoadDirectory()
+{
+ QString aDirectory = QFileDialog::getExistingDirectory(0, tr("Select directory"));
+
+ QFileInfo aFileInfo(aDirectory);
+ if (!aFileInfo.exists() || !aFileInfo.isReadable())
+ return;
+
+ QDir aDir(aDirectory);
+ QStringList aFileNames = aDir.entryList(QDir::Files, QDir::Name);
+
+ for (int i = 0; i < aFileNames.size(); i++)
+ onOpenFile(aDir.absoluteFilePath(aFileNames[i]));
+}
+
// =======================================================================
// function : onBREPView
// purpose :
//! Exports shape to BREP file and view result file
void onBREPDirectory();
+ //! Set the shape item exploded
+ void onExplode();
+
//! Removes all shapes in tree view
void onClearView() { RemoveAllShapes(); }
//! Load BREP file and updates tree model to have shape of the file
void onLoadFile();
+ //! Load BREP files from the selected directory and updates tree model to have shapes of the files
+ void onLoadDirectory();
+
//! View BREP files of selected items if exist
void onBREPView();
if (!strcmp (argv[anArgId], "vinspector"))
aPlugins.insert ("TKVInspector");
+
+ if (!strcmp (argv[anArgId], "messageview"))
+ aPlugins.insert ("TKMessageView");
}
NCollection_List<Handle(Standard_Transient)> aParameters;
aPlugins.insert("TKDFBrowser");
aPlugins.insert("TKShapeView");
aPlugins.insert("TKVInspector");
+ aPlugins.insert("TKMessageView");
anActivatedPluginName = "TKDFBrowser";
}
--- /dev/null
+project(TKMessageModel)
+
+OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)
+OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit)
+OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)
--- /dev/null
+TKMath
+TKBin
+TKBRep
+TKGeomBase
+TKG3d
+TKTInspectorAPI
+TKService
+TKTopAlgo
+TKTreeModel
+CSF_QT
--- /dev/null
+EXTERNLIB
+PACKAGES
--- /dev/null
+MessageModel
--- /dev/null
+project(TKMessageView)
+
+OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)
+OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit)
+OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)
--- /dev/null
+TKTInspectorAPI
+TKMath
+TKMessageModel
+TKBin
+TKBRep
+TKGeomBase
+TKG3d
+TKService
+TKTopAlgo
+TKTreeModel
+TKView
+TKXml
+CSF_QT
--- /dev/null
+EXTERNLIB
+PACKAGES
--- /dev/null
+MessageView
project(TKTreeModel)
+add_definitions("-D__ViewControl_DLL")
+
OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)
OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit)
OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)
if (anArgument == "dfbrowser") { thePluginName = "TKDFBrowser"; return Standard_True; }
else if (anArgument == "shapeview") { thePluginName = "TKShapeView"; return Standard_True; }
else if (anArgument == "vinspector") { thePluginName = "TKVInspector"; return Standard_True; }
+ else if (anArgument == "messageview") { thePluginName = "TKMessageView"; return Standard_True; }
return Standard_False;
}
aPlugins.Append ("TKDFBrowser");
aPlugins.Append ("TKShapeView");
aPlugins.Append ("TKVInspector");
+ aPlugins.Append ("TKMessageView");
}
aPluginNameToActivate = !aPluginNameToActivate.IsEmpty() ? aPluginNameToActivate : aPlugins.First();
}
"\n\t\t: Starts tool of inspection."
"\n\t\t: Options:"
"\n\t\t: -plugins enters plugins that should be added in the inspector."
- "\n\t\t: Available names are: dfbrowser, vinspector and shapeview."
+ "\n\t\t: Available names are: dfbrowser, vinspector, shapeview and messageview."
"\n\t\t: Plugins order will be the same as defined in arguments."
"\n\t\t: 'all' adds all available plugins in the order:"
"\n\t\t: DFBrowser, VInspector and ShapeView."
if (!hasIndex (theRow, theColumn, theParent))
return QModelIndex();
- // to create index on the root item
- if (!theParent.isValid())
- return createIndex (theRow, theColumn, getIndexValue (RootItem (theColumn)));
-
TreeModel_ItemBasePtr aParentItem;
if (!theParent.isValid())
aParentItem = RootItem (theColumn);
// =======================================================================
int TreeModel_ModelBase::rowCount (const QModelIndex& theParent) const
{
- // to create index on the root item
- if (!theParent.isValid())
- return 1;
-
TreeModel_ItemBasePtr aParentItem;
if (!theParent.isValid())
aParentItem = RootItem (0);
}
// =======================================================================
-// function : SingleSelected
+// function : GetSelected
// purpose :
// =======================================================================
-QModelIndex TreeModel_ModelBase::SingleSelected (const QModelIndexList& theIndices, const int theCellId,
- const Qt::Orientation theOrientation)
+QModelIndexList TreeModel_ModelBase::GetSelected (const QModelIndexList& theIndices, const int theCellId,
+ const Qt::Orientation theOrientation)
{
- QModelIndexList aFirstColumnSelectedIndices;
+ QModelIndexList aSelected;
for (QModelIndexList::const_iterator anIndicesIt = theIndices.begin(); anIndicesIt != theIndices.end(); anIndicesIt++)
{
QModelIndex anIndex = *anIndicesIt;
if ((theOrientation == Qt::Horizontal && anIndex.column() == theCellId) ||
(theOrientation == Qt::Vertical && anIndex.row() == theCellId))
- aFirstColumnSelectedIndices.append (anIndex);
+ aSelected.append (anIndex);
}
- return aFirstColumnSelectedIndices.size() == 1 ? aFirstColumnSelectedIndices.first() : QModelIndex();
+ return aSelected;
+}
+
+// =======================================================================
+// function : SingleSelected
+// purpose :
+// =======================================================================
+QModelIndex TreeModel_ModelBase::SingleSelected (const QModelIndexList& theIndices, const int theCellId,
+ const Qt::Orientation theOrientation)
+{
+ QModelIndexList aSelected = GetSelected (theIndices, theCellId, theOrientation);
+ return aSelected.size() == 1 ? aSelected.first() : QModelIndex();
}
// =======================================================================
//! \return integer value
static int ColumnVisibilityWidth() { return 20; }
+ //! Returns selected items in the cell of given orientation.
+ //! \param theIndices a container of selected indices
+ //! \param theCellId column index if orientation is horizontal, row index otherwise
+ //! \param theOrientation an orientation to apply the cell index
+ //! \return model indices from the list
+ Standard_EXPORT static QModelIndexList GetSelected (const QModelIndexList& theIndices, const int theCellId,
+ const Qt::Orientation theOrientation = Qt::Horizontal);
+
//! Returns single selected item in the cell of given orientation. If the orientation is Horizontal,
//! in the cell id colum, one row should be selected.
//! \param theIndices a container of selected indices
QModelIndexList VInspector_ViewModel::FindPointers (const QStringList& thePointers)
{
QModelIndexList anIndices;
- QModelIndex aParentIndex = index (0, 0);
- TreeModel_ItemBasePtr aParentItem = TreeModel_ModelBase::GetItemByIndex (aParentIndex); // context item
- for (int aRowId = 0, aCount = aParentItem->rowCount(); aRowId < aCount; aRowId++)
+ for (int aRowId = 0, aCount = rowCount(); aRowId < aCount; aRowId++)
{
- QModelIndex anIndex = index (aRowId, 0, aParentIndex);
+ QModelIndex anIndex = index (aRowId, 0);
TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
VInspector_ItemPresentableObjectPtr anItemPrs = itemDynamicCast<VInspector_ItemPresentableObject>(anItemBase);
if (!anItemPrs)
{
QStringList aCameraDirection;
Standard_Real aVX, aVY, aVZ;
- theView->GetView()->GetViewer()->GetView()->Proj (aVX, aVY, aVZ);
+ Handle(V3d_View) aView = theView->GetView()->GetViewer()->GetView();
+ if (aView.IsNull())
+ return;
+
+ aView->Proj (aVX, aVY, aVZ);
aCameraDirection << QString::number (aVX) << QString::number (aVY) << QString::number (aVZ);
theItems[thePrefix + "view_camera_direction"] = aCameraDirection.join (",");
#include <inspector/View_Viewer.hxx>
#include <inspector/View_Widget.hxx>
+#include <AIS_Shape.hxx>
#include <V3d.hxx>
#include <Standard_WarningsDisable.hxx>
{
#if TINSPECTORAPI_VERSION_HEX > 0x070200
QMenu* aMenu = new QMenu (this);
- QMenu* anOrientationSubMenu = aMenu->addMenu ("Set View Orientation");
- for (int i = 0; i < (int)V3d_XnegYnegZneg; i++)
+ QMenu* anOrientationSubMenu = aMenu->addMenu ("Set View Orientation");
+ for (int i = 0; i <= (int)V3d_XnegYnegZneg; i++)
{
V3d_TypeOfOrientation anOrientationType = (V3d_TypeOfOrientation)i;
anOrientationSubMenu->addAction (View_Tools::CreateAction (V3d::TypeOfOrientationToString (anOrientationType),
}
aMenu->addMenu (anOrientationSubMenu);
+ anOrientationSubMenu = aMenu->addMenu ("Activate Selection Mode");
+ for (int i = TopAbs_COMPOUND; i <= (int)TopAbs_SHAPE; i++)
+ {
+ anOrientationSubMenu->addAction (View_Tools::CreateAction (TopAbs::ShapeTypeToString((TopAbs_ShapeEnum)i),
+ SLOT (onActivateSelectionMode()), this, this));
+ }
+ aMenu->addMenu (anOrientationSubMenu);
+
+ anOrientationSubMenu->addSeparator();
+ anOrientationSubMenu->addAction (View_Tools::CreateAction ("NONE",
+ SLOT (onActivateSelectionMode()), this, this));
+
QPoint aPoint = myView->mapToGlobal (thePosition);
aMenu->exec (aPoint);
#else
#if TINSPECTORAPI_VERSION_HEX > 0x070200
QAction* anAction = (QAction*)(sender());
- TCollection_AsciiString anOrientationStr (anAction->text().toStdString().c_str());
-
+ TCollection_AsciiString anActionText (anAction->text().toStdString().c_str());
V3d_TypeOfOrientation anOrientationType;
- if (!V3d::TypeOfOrientationFromString (anOrientationStr.ToCString(), anOrientationType))
+ if (!V3d::TypeOfOrientationFromString (anActionText.ToCString(), anOrientationType))
return;
Handle(V3d_View) aView = myView->GetViewer()->GetView();
#endif
}
+// =======================================================================
+// function : onActivateSelectionMode
+// purpose :
+// =======================================================================
+void View_Window::onActivateSelectionMode()
+{
+ Handle(AIS_InteractiveContext) aContext = myView->GetViewer()->GetContext();
+ if (aContext.IsNull())
+ return;
+
+ QAction* anAction = (QAction*)(sender());
+ TCollection_AsciiString anActionText (anAction->text().toStdString().c_str());
+
+ if (anActionText == "NONE")
+ {
+ aContext->Deactivate();
+ return;
+ }
+
+ TopAbs_ShapeEnum aShapeType;
+ if (!TopAbs::ShapeTypeFromString (anActionText.ToCString(), aShapeType))
+ return;
+ aContext->Activate (AIS_Shape::SelectionMode (aShapeType));
+}
+
// =======================================================================
// function : onDisplayModeChanged
// purpose :
//! Sets the view scene orientation by the text of selected action
void onSetOrientation();
+ //! Activates selection mode in the viewer
+ void onActivateSelectionMode();
+
//! Sets selected display mode in the current context
void onDisplayModeChanged();
+ViewControl.hxx
ViewControl_MessageDialog.cxx
ViewControl_MessageDialog.hxx
+ViewControl_PropertyView.cxx
+ViewControl_PropertyView.hxx
+ViewControl_Table.cxx
+ViewControl_Table.hxx
+ViewControl_TableModel.cxx
+ViewControl_TableModel.hxx
+ViewControl_TableModelFilter.cxx
+ViewControl_TableModelFilter.hxx
+ViewControl_TableModelValues.cxx
+ViewControl_TableModelValues.hxx
+ViewControl_TableProperty.cxx
+ViewControl_TableProperty.hxx
ViewControl_Tools.cxx
ViewControl_Tools.hxx
-ViewControl_TreeView.hxx
\ No newline at end of file
+ViewControl_TreeView.hxx
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef VIEWCONTROL_H
+#define VIEWCONTROL_H
+
+#ifdef __ViewControl_DLL
+ #ifdef _WIN32
+ #define VIEWCONTROL_EXPORT __declspec(dllexport)
+ #else
+ #define VIEWCONTROL_EXPORT
+ #endif
+#else
+ #ifdef _WIN32
+ #define VIEWCONTROL_EXPORT __declspec(dllimport)
+ #else
+ #define VIEWCONTROL_EXPORT
+ #endif
+#endif
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/ViewControl_PropertyView.hxx>
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAbstractTableModel>
+#include <QStackedWidget>
+#include <QScrollArea>
+#include <QTableView>
+#include <QVBoxLayout>
+#include <QWidget>
+#include <Standard_WarningsRestore.hxx>
+
+class ViewControl_Widget : public QWidget
+{
+public:
+ //! Constructor
+ ViewControl_Widget (QWidget* theParent, const QSize& theSize) : QWidget (theParent) { SetPredefinedSize (theSize); }
+
+ //! Destructor
+ virtual ~ViewControl_Widget() {}
+
+ //! Sets default size of control, that is used by the first control show
+ //! \param theDefaultWidth the width value
+ //! \param theDefaultHeight the height value
+ void SetPredefinedSize (const QSize& theSize) { myDefaultSize = theSize;}
+
+ //! Returns predefined size if both values are positive, otherwise parent size hint
+ virtual QSize sizeHint() const Standard_OVERRIDE { return myDefaultSize.isValid() ? myDefaultSize : QWidget::sizeHint(); }
+
+private:
+ QSize myDefaultSize; //! default size, empty isze if it should not be used
+};
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+ViewControl_PropertyView::ViewControl_PropertyView (QWidget* theParent)
+: QObject (theParent), myOwnSelectionChangeBlocked (false)
+{
+ myMainWidget = new ViewControl_Widget (theParent, QSize (1, 100));
+
+ QVBoxLayout* aLayout = new QVBoxLayout (myMainWidget);
+ aLayout->setContentsMargins (0, 0, 0, 0);
+
+ QScrollArea* anArea = new QScrollArea (myMainWidget);
+
+ myAttributesStack = new QStackedWidget (myMainWidget);
+ anArea->setWidget (myAttributesStack);
+ anArea->setWidgetResizable( true );
+ aLayout->addWidget (anArea);
+
+ myEmptyWidget = new QWidget (myAttributesStack);
+ myAttributesStack->addWidget (myEmptyWidget);
+
+ myTableWidget = new QWidget (myAttributesStack);
+ myTableWidgetLayout = new QVBoxLayout (myTableWidget);
+ myTableWidgetLayout->setContentsMargins (0, 0, 0, 0);
+ myAttributesStack->addWidget (myTableWidget);
+
+ myAttributesStack->setCurrentWidget (myEmptyWidget);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::Init (const QList<ViewControl_TableModelValues*>& theTableValues)
+{
+ for (int aTableId = 0; aTableId < theTableValues.size(); aTableId++)
+ {
+ ViewControl_TableModelValues* aValues = theTableValues[aTableId];
+
+ ViewControl_Table* aTable = findTable (aTableId);
+
+ aTable->Init (aValues);
+ ViewControl_Tools::SetDefaultHeaderSections (aTable->GetTableView(), Qt::Horizontal);
+
+ aTable->SetActive (true);
+ }
+ // hide not used tables
+ for (int aTableId = theTableValues.size(); aTableId < myTables.size(); aTableId++)
+ {
+ ViewControl_Table* aTable = findTable (aTableId, false);
+ if (!aTable)
+ continue;
+
+ ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (aTable->GetTableView()->model());
+ aModel->SetModelValues (0);
+
+ aTable->SetActive (false);
+ }
+
+ if (theTableValues.size() > 0)
+ myAttributesStack->setCurrentWidget (myTableWidget);
+ else
+ myAttributesStack->setCurrentWidget (myEmptyWidget);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::Init (QWidget*)
+{
+}
+
+// =======================================================================
+// function : GetActiveTables
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::GetActiveTables (QList<ViewControl_Table*>& theTables)
+{
+ for (int aTableId = 0; aTableId < myTables.size(); aTableId++)
+ {
+ ViewControl_Table* aTable = findTable (aTableId, false);
+ if (aTable && aTable->IsActive())
+ theTables.append (aTable);
+ }
+}
+
+// =======================================================================
+// function : ClearActiveTablesSelection
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::ClearActiveTablesSelection()
+{
+ bool aWasBlocked = myOwnSelectionChangeBlocked;
+ myOwnSelectionChangeBlocked = true;
+
+ QList<ViewControl_Table*> aTables;
+ for (int aTableId = 0; aTableId < myTables.size(); aTableId++)
+ {
+ ViewControl_Table* aTable = findTable (aTableId, false);
+ if (aTable && aTable->IsActive())
+ aTable->GetTableView()->selectionModel()->clearSelection();
+ }
+ myOwnSelectionChangeBlocked = aWasBlocked;
+}
+
+// =======================================================================
+// function : Clear
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::Clear()
+{
+ for (int aTableId = 0; aTableId < myTables.size(); aTableId++)
+ {
+ ViewControl_Table* aTable = findTable (aTableId, false);
+ if (!aTable)
+ continue;
+
+ ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (aTable->GetTableView()->model());
+ aModel->SetModelValues (0);
+
+ aTable->SetActive (true);
+ }
+ myAttributesStack->setCurrentWidget (myEmptyWidget);
+}
+
+// =======================================================================
+// function : findTable
+// purpose :
+// =======================================================================
+ViewControl_Table* ViewControl_PropertyView::findTable (const int theTableId, const bool isToCreate)
+{
+ if (!isToCreate && theTableId >= myTables.size())
+ return 0;
+
+ if (theTableId < myTables.size())
+ return myTables[theTableId];
+
+ ViewControl_Table* aTable = new ViewControl_Table (myMainWidget);
+ ViewControl_TableModel* aModel = new ViewControl_TableModel(aTable->GetTableView());
+ aTable->SetModel (aModel);
+
+
+ connect (aTable->GetTableView()->selectionModel(),
+ SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
+ this, SLOT(onTableSelectionChanged (const QItemSelection&, const QItemSelection&)));
+ connect (aTable->GetProperty(), SIGNAL (propertyChanged()), this, SIGNAL (propertyViewSelectionChanged()));
+
+ if (myXStepValues.size() > theTableId)
+ aTable->GetProperty()->SetXStep (myXStepValues[theTableId]);
+
+ if (myDivideValues.size() > theTableId)
+ aTable->GetProperty()->SetDivideSize (myDivideValues[theTableId]);
+
+ myTableWidgetLayout->addWidget (aTable->GetControl());
+
+ myTables.insert (theTableId, aTable);
+
+ return myTables[theTableId];
+}
+
+// =======================================================================
+// function : onTableSelectionChanged
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::onTableSelectionChanged (const QItemSelection&, const QItemSelection&)
+{
+ if (myOwnSelectionChangeBlocked)
+ return;
+
+ emit propertyViewSelectionChanged();
+}
+
+// =======================================================================
+// function : SaveState
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::SaveState (ViewControl_PropertyView* theView,
+ QMap<QString, QString>& theItems,
+ const QString& thePrefix)
+{
+ QList<ViewControl_Table*> anActiveTables;
+ theView->GetActiveTables(anActiveTables);
+
+ if (anActiveTables.size() == 0)
+ return;
+
+ anActiveTables[0]->GetProperty()->GetXStep();
+ QStringList aDivideSizes, aXSteps;
+ for (int i = 0; i < anActiveTables.size(); i++)
+ {
+ aXSteps.append (QString::number (anActiveTables[i]->GetProperty()->GetXStep()));
+ aDivideSizes.append (QString::number (anActiveTables[i]->GetProperty()->GetDivideSize()));
+ }
+ theItems[thePrefix + "property_view_xstep_value"] = aXSteps.join (",");
+ theItems[thePrefix + "property_view_divide_value"] = aDivideSizes.join (",");
+}
+
+// =======================================================================
+// function : RestoreState
+// purpose :
+// =======================================================================
+bool ViewControl_PropertyView::RestoreState (ViewControl_PropertyView* theView,
+ const QString& theKey,
+ const QString& theValue,
+ const QString& thePrefix)
+{
+ if (theKey == thePrefix + "property_view_xstep_value")
+ {
+ QList<double> aXStepValues;
+ QStringList aValues = theValue.split (",", QString::SkipEmptyParts);
+ for (int aValueId = 0; aValueId < aValues.size(); aValueId++)
+ aXStepValues.append (aValues.at (aValueId).toDouble());
+ theView->SetXSteps (aXStepValues);
+ }
+ else if (theKey == thePrefix + "property_view_divide_value")
+ {
+ QList<int> aDivideValues;
+ QStringList aValues = theValue.split (",", QString::SkipEmptyParts);
+ for (int aValueId = 0; aValueId < aValues.size(); aValueId++)
+ aDivideValues.append (aValues.at (aValueId).toInt());
+ theView->SetDivideValues (aDivideValues);
+ }
+ else
+ return false;
+ return true;
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef TreeModel_PropertyView_H
+#define TreeModel_PropertyView_H
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+#include <inspector/ViewControl_Table.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QObject>
+#include <QList>
+#include <Standard_WarningsRestore.hxx>
+
+class QAbstractTableModel;
+class QStackedWidget;
+class QWidget;
+class QVBoxLayout;
+
+class ViewControl_TableModelValues;
+
+//! \class ViewControl_PropertyView
+//! \brief View widget where several tables are visualized in vertical layout.
+class ViewControl_PropertyView : public QObject
+{
+ Q_OBJECT
+public:
+
+ //! Constructor
+ Standard_EXPORT ViewControl_PropertyView (QWidget* theParent);
+
+ //! Destructor
+ virtual ~ViewControl_PropertyView() Standard_OVERRIDE {}
+
+ //! Fills the view content with values. Number of visible tables is size of container,
+ //! Each element of container is values of the corresponded table
+ //! \param theTableValues values
+ Standard_EXPORT void Init (const QList<ViewControl_TableModelValues*>& theTableValues);
+
+ //! Fills the view content with the parameter custom widget.
+ //! \param theWidget control
+ Standard_EXPORT void Init (QWidget* theWidget);
+
+ //! Clears layout of the view and tables models.
+ Standard_EXPORT void Clear();
+
+ //! \return the text edit control
+ QWidget* GetControl() const { return myMainWidget; }
+
+ //! Returns container of active tables
+ //! \param theTables [out] modified container
+ Standard_EXPORT void GetActiveTables (QList<ViewControl_Table*>& theTables);
+
+ //! Clears selection in active tables
+ Standard_EXPORT void ClearActiveTablesSelection();
+
+ //! Sets X steps values for table properties
+ //! \param container of values
+ void SetXSteps (const QList<double>& theValues) { myXStepValues = theValues; }
+
+ //! Sets divide values for table properties
+ //! \param container of values
+ void SetDivideValues (const QList<int>& theValues) { myDivideValues = theValues; }
+
+ //! Save state of three view in a container in form: key, value. It saves:
+ //! - XStep of property table
+ //! - divide values of property table
+ //! \param theTreeView a view instance
+ //! \param theItems [out] properties
+ //! \param thePrefix peference item prefix
+ Standard_EXPORT static void SaveState (ViewControl_PropertyView* theView, QMap<QString, QString>& theItems,
+ const QString& thePrefix = QString());
+ //! Restore state of three view by a container
+ //! \param theTreeView a view instance
+ //! \param theKey property key
+ //! \param theValue property value
+ //! \param thePrefix peference item prefix
+ //! \return boolean value whether the property is applyed to the tree view
+ Standard_EXPORT static bool RestoreState (ViewControl_PropertyView* theView, const QString& theKey, const QString& theValue,
+ const QString& thePrefix = QString());
+
+signals:
+ void propertyViewSelectionChanged();
+
+protected slots:
+ //! Emits signal about selection is changed
+ //! \param theSelected container of selected table cells
+ //! \param theDeselected container of selected table cells
+ void onTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+protected:
+ //! Returns table instance or create if it was not created ealier
+ //! \param theTableId an index in internal container of tables
+ //! \param isToCreate if true, the table is created if not exists
+ ViewControl_Table* findTable (const int theTableId, const bool isToCreate = true);
+
+private:
+ bool myOwnSelectionChangeBlocked; //! blocking emit of selection changed signal
+
+ QWidget* myMainWidget; //! parent of all controls
+
+ QStackedWidget* myAttributesStack; //!< container of already created panes
+ QWidget* myEmptyWidget; //!< an empty widget when nothing is selected in tree view
+
+ QWidget* myTableWidget; //!< widget of tables in vertical layout
+ QVBoxLayout* myTableWidgetLayout; //! main view layout where tables or custom widgets are presented
+ QList<ViewControl_Table*> myTables; //!< table view, shown only first tables filled in Init method
+ QWidget* myCustomWidget; //!< custom view widget
+
+ QList<double> myXStepValues; //! predefined values for XStep in ViewControl_TableProperty
+ QList<int> myDivideValues; //! predefined values for divide value in ViewControl_TableProperty
+};
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableProperty.hxx>
+
+#include <inspector/TreeModel_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAction>
+#include <QGridLayout>
+#include <QHeaderView>
+#include <QLabel>
+#include <QTableView>
+#include <QWidget>
+#include <Standard_WarningsRestore.hxx>
+
+#include <limits>
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+ViewControl_Table::ViewControl_Table (QWidget* theParent)
+: QObject (theParent), myIsUseProperty (false)
+{
+ myMainWidget = new QWidget (theParent);
+ QGridLayout* aLayout = new QGridLayout (myMainWidget);
+ aLayout->setContentsMargins (0, 0, 0, 0);
+
+ myProperty = new ViewControl_TableProperty(myMainWidget, this);
+ aLayout->addWidget (myProperty->GetControl());
+
+ myTableView = new QTableView (myMainWidget);
+ myTableView->setVerticalScrollMode (QAbstractItemView::ScrollPerPixel);
+
+ QHeaderView* aVHeader = myTableView->verticalHeader();
+ int aDefCellSize = aVHeader->minimumSectionSize() + TreeModel_Tools::HeaderSectionMargin();
+ aVHeader->setDefaultSectionSize (aDefCellSize);
+
+ aLayout->addWidget (myTableView);
+ aLayout->addWidget (myProperty->GetInformationControl());
+}
+
+// =======================================================================
+// function : SetModel
+// purpose :
+// =======================================================================
+
+void ViewControl_Table::SetModel (QAbstractTableModel* theModel)
+{
+ myTableView->setModel (theModel);
+
+ myTableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+ QItemSelectionModel* aSelectionModel = new QItemSelectionModel(theModel);
+ myTableView->setSelectionModel (aSelectionModel);
+ connect(aSelectionModel, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+ this, SLOT(onTableSelectionChanged(const QItemSelection&, const QItemSelection&)));
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void ViewControl_Table::Init (ViewControl_TableModelValues* theModelValues)
+{
+ myTableView->selectionModel()->clearSelection();
+
+ ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (myTableView->model());
+ aModel->SetModelValues (theModelValues);
+
+ myProperty->SetActive (theModelValues->UseTableProperties());
+ myProperty->Init();
+
+ int aSectionSize;
+ myTableView->horizontalHeader()->setVisible (theModelValues->IsHeaderVisible (Qt::Horizontal));
+ if (theModelValues->GetDefaultSectionSize (Qt::Horizontal, aSectionSize) )
+ myTableView->horizontalHeader()->setDefaultSectionSize (aSectionSize);
+
+ myTableView->verticalHeader()->setVisible (theModelValues->IsHeaderVisible (Qt::Vertical));
+ if (theModelValues->GetDefaultSectionSize (Qt::Vertical, aSectionSize) )
+ {
+ myTableView->verticalHeader()->setDefaultSectionSize (aSectionSize);
+ }
+ else
+ myTableView->verticalHeader()->setDefaultSectionSize (myTableView->verticalHeader()->minimumSectionSize() +
+ TreeModel_Tools::HeaderSectionMargin());
+ aModel->EmitLayoutChanged();
+}
+
+// =======================================================================
+// function : GetSelectedIndices
+// purpose :
+// =======================================================================
+
+void ViewControl_Table::GetSelectedIndices (QMap<int, QList<int>>& theSelectedIndices)
+{
+ QModelIndexList aSelected = myTableView->selectionModel()->selectedIndexes();
+ ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (myTableView->model());
+
+ int aRow, aColumn;
+ for (QModelIndexList::const_iterator anIt = aSelected.begin(); anIt != aSelected.end(); anIt++)
+ {
+ aModel->GetSourcePosition (*anIt, aRow, aColumn);
+
+ if (!theSelectedIndices.contains (aRow))
+ theSelectedIndices.insert (aRow, QList<int>());
+ theSelectedIndices[aRow].append (aColumn);
+ }
+}
+
+// =======================================================================
+// function : onTableSelectionChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_Table::onTableSelectionChanged(const QItemSelection&, const QItemSelection&)
+{
+ QModelIndexList aSelected = myTableView->selectionModel()->selectedIndexes();
+
+ myProperty->UpdateOnTableSelectionChanged();
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef ViewControl_Table_H
+#define ViewControl_Table_H
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+#include <inspector/ViewControl_TableProperty.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QItemSelection>
+#include <QObject>
+#include <QTableView>
+#include <Standard_WarningsRestore.hxx>
+
+class ViewControl_TableModelValues;
+
+class QAbstractTableModel;
+class QContextMenuEvent;
+class QWidget;
+
+//! \class ViewControl_Table
+//! \brief View to display table values with possibility to change table columns
+//! if the table has 1D dimension and Horizontal orientation
+class ViewControl_Table : public QObject
+{
+ Q_OBJECT
+public:
+
+ //! Constructor
+ Standard_EXPORT ViewControl_Table (QWidget* theParent);
+
+ //! Destructor
+ virtual ~ViewControl_Table() Standard_OVERRIDE {}
+
+ //! Set model into table view, init selection model by the given model, connect to selection change
+ //! \param theModel table values model
+ void SetModel (QAbstractTableModel* theModel);
+
+ //! Fills table view and table size control by the model
+ //! \param theModel values model
+ Standard_EXPORT void Init (ViewControl_TableModelValues* theModelValues);
+
+ //! Sets the table active and show the table
+ //! \param theState boolean value
+ void SetActive (const bool theState) { myIsActive = theState; GetTableView()->setVisible (theState); }
+
+ //!< true if the table is used in property view and visible
+ bool IsActive() const { return myIsActive; }
+
+ //! \return the text edit control
+ QWidget* GetControl() const { return myMainWidget; }
+
+ //! \return the table view
+ QTableView* GetTableView() const { return myTableView; }
+
+ //! Returns instance of table property control
+ //! \return property
+ ViewControl_TableProperty* GetProperty() const { return myProperty; }
+
+ //! Retuns model indices of the selected cells in table view
+ //! \param theSelectedIndices [out] a container of indices: row to list of columns
+ Standard_EXPORT void GetSelectedIndices (QMap<int, QList<int>>& aSelectedIndices);
+
+protected slots:
+
+ //! Updates controls by selection change in table view
+ //! \param theSelected container of selected table cells
+ //! \param theDeselected container of selected table cells
+ void onTableSelectionChanged(const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+private:
+ bool myIsActive; //!< true if the table is used in property view and visible
+
+ QWidget* myMainWidget; //!< parent of all controls
+ bool myIsUseProperty; //!< boolean value whether the property control should be shown/hidden
+ QTableView* myTableView; //!< table view
+
+ ViewControl_TableProperty* myProperty; //!< modifier of the table visual properties
+};
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/ViewControl_TableModel.hxx>
+
+// =======================================================================
+// function : SetModelValues
+// purpose :
+// =======================================================================
+void ViewControl_TableModel::SetModelValues (ViewControl_TableModelValues* theModelValues)
+{
+ if (myModelValues)
+ delete myModelValues;
+
+ myModelValues = theModelValues;
+ SetFilter(0);
+}
+
+// =======================================================================
+// function : columnCount
+// purpose :
+// =======================================================================
+int ViewControl_TableModel::columnCount(const QModelIndex& theParent) const
+{
+ if (!myModelValues)
+ return 0;
+
+ int aColumnCount = myModelValues->ColumnCount (theParent);
+ return isFilterActive() ? myFilter->ColumnCount (aColumnCount) : aColumnCount;
+}
+
+// =======================================================================
+// function : rowCount
+// purpose :
+// =======================================================================
+int ViewControl_TableModel::rowCount(const QModelIndex& theParent ) const
+{
+ if (!myModelValues)
+ return 0;
+
+ return isFilterActive() ? myFilter->RowCount (myModelValues->ColumnCount (theParent))
+ : myModelValues->RowCount (theParent);
+}
+
+// =======================================================================
+// function : data
+// purpose :
+// =======================================================================
+QVariant ViewControl_TableModel::data (const QModelIndex& theIndex, int theRole) const
+{
+ if (!myModelValues)
+ return QVariant();
+
+ int aRow = theIndex.row(), aColumn = theIndex.column();
+ if (isFilterActive())
+ myFilter->GetSourcePosition (theIndex, aRow, aColumn);
+
+ return myModelValues->Data (aRow, aColumn, theRole);
+}
+
+// =======================================================================
+// function : GetSourcePosition
+// purpose :
+// =======================================================================
+void ViewControl_TableModel::GetSourcePosition (const QModelIndex& theIndex, int& theRow, int& theColumn)
+{
+ if (isFilterActive())
+ myFilter->GetSourcePosition (theIndex, theRow, theColumn);
+ else
+ myModelValues->GetSourcePosition (theIndex.row(), theIndex.column(), theRow, theColumn);
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef ViewControl_TableModel_H
+#define ViewControl_TableModel_H
+
+#include <Standard.hxx>
+
+#include <inspector/ViewControl_TableModelFilter.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAbstractTableModel>
+#include <QList>
+#include <QVariant>
+#include <Standard_WarningsRestore.hxx>
+
+#include <vector>
+
+//! \class ViewControl_TableModel
+//! \brief This is an extension of table model to visualize a container of values
+//! It is possible to:
+//! - set orientation to interpretate the values.
+//! - set table view header values.
+//! Items of the view are enabled and selectable.
+class ViewControl_TableModel : public QAbstractTableModel
+{
+public:
+
+ //! Constructor
+ ViewControl_TableModel (QObject* theParent = 0) : myModelValues (0), myFilter (0) { (void)theParent; }
+
+ //! Destructor
+ virtual ~ViewControl_TableModel() {}
+
+ //! Sets interface to table values
+ //! \theModelValues instance of values
+ Standard_EXPORT void SetModelValues (ViewControl_TableModelValues* theModelValues);
+
+ //! Returns instance of interface for access totable values
+ //! \return interface or NULL
+ ViewControl_TableModelValues* GetModelValues() const { return myModelValues; }
+
+ //! Sets table values filter to rearrange values presentation
+ //! \param filter instance
+ void SetFilter (ViewControl_TableModelFilter* theFilter) { myFilter = theFilter; }
+
+ //! Emits the layoutChanged signal from outside of this class
+ void EmitLayoutChanged() { emit layoutChanged(); }
+
+ //! Returns number of columns, depending on orientation: myColumnCount or size of values container
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ Standard_EXPORT virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE;
+
+ //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ Standard_EXPORT virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE;
+
+ //! Returns content of the model index for the given role, it is obtained from internal container of values
+ //! It returns value only for DisplayRole.
+ //! \param theIndex a model index
+ //! \param theRole a view role
+ //! \return value intepreted depending on the given role
+ Standard_EXPORT virtual QVariant data (const QModelIndex& theIndex, int theRole = Qt::DisplayRole) const Standard_OVERRIDE;
+
+ //! Returns content of the model index for the given role, it is obtainer from internal container of header values
+ //! It returns value only for DisplayRole.
+ //! \param theSection an index of value in the container
+ //! \param theIndex a model index
+ //! \param theRole a view role
+ //! \return value intepreted depending on the given role
+ virtual QVariant headerData (int theSection, Qt::Orientation theOrientation, int theRole = Qt::DisplayRole) const Standard_OVERRIDE
+ { return myModelValues ? myModelValues->HeaderData (theSection, theOrientation, theRole) : QVariant(); }
+
+ //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable
+ //! \param theIndex a model index
+ //! \return flags
+ Qt::ItemFlags flags (const QModelIndex& theIndex) const
+ { return myModelValues ? myModelValues->Flags (theIndex) : Qt::NoItemFlags; }
+
+ //! Returns source row and column values peforming conversion back from filter
+ //! \param theIndex a model index
+ //! \param theRow a model row
+ //! \param theColumn a model column
+ Standard_EXPORT void GetSourcePosition (const QModelIndex& theIndex, int& theRow, int& theColumn);
+
+protected:
+ //! Returns true if the filter is not NULL and active
+ //! \return true if active
+ Standard_Boolean isFilterActive() const { return myFilter && myFilter->IsActive(); }
+
+private:
+ ViewControl_TableModelValues* myModelValues; //! interface to table values
+ ViewControl_TableModelFilter* myFilter; //! filter of values
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/ViewControl_TableModelFilter.hxx>
+
+// =======================================================================
+// function : ColumnCount
+// purpose :
+// =======================================================================
+
+int ViewControl_TableModelFilter::ColumnCount (const int theSourceColumnCount) const
+{
+ return myColumnCount <= 0 ? theSourceColumnCount : myColumnCount;
+}
+
+// =======================================================================
+// function : RowCount
+// purpose :
+// =======================================================================
+
+int ViewControl_TableModelFilter::RowCount (const int theSourceColumnCount) const
+{
+ if (myColumnCount <= 0)
+ return 1;
+
+ int aRows = (int) (theSourceColumnCount / myColumnCount);
+ if (myColumnCount > 0 && aRows * myColumnCount < theSourceColumnCount)
+ aRows++; /// row with left values, not fully filled
+
+ return aRows;
+}
+
+// =======================================================================
+// function : GetSourcePosition
+// purpose :
+// =======================================================================
+
+void ViewControl_TableModelFilter::GetSourcePosition (const QModelIndex& theIndex, int& theRow, int& theColumn) const
+{
+ GetSourcePosition (theIndex.row(), theIndex.column(), theRow, theColumn);
+}
+
+// =======================================================================
+// function : GetSourcePosition
+// purpose :
+// =======================================================================
+
+void ViewControl_TableModelFilter::GetSourcePosition (const int theSourceRow, const int theSourceColumn, int& theRow,
+ int& theColumn) const
+{
+ theRow = 0;
+ theColumn = myColumnCount * theSourceRow + theSourceColumn;
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef ViewControl_TableModelFilter_H
+#define ViewControl_TableModelFilter_H
+
+#include <Standard.hxx>
+
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+//! \class ViewControl_TableModelFilter
+//! \brief It provides separation of 1D container of values in 2D presentation depending on number of column value
+class ViewControl_TableModelFilter
+{
+public:
+
+ //! Constructor
+ Standard_EXPORT ViewControl_TableModelFilter(const Standard_Integer theColumnCount = -1)
+ : myIsActive (Standard_True), myColumnCount (theColumnCount) {}
+
+ //! Destructor
+ virtual ~ViewControl_TableModelFilter() {}
+
+ //! Activate/Deactivate filter
+ //! \param theActive state is the filter to be active or not
+ virtual void SetActive (const Standard_Boolean theActive) { myIsActive = theActive; }
+
+ //! Returns boolean state whether the filter is activated
+ //! \return true if active
+ virtual Standard_Boolean IsActive() const { return myIsActive; }
+
+ //! Sets number of columns
+ //! \param theColumnCount a column count
+ void SetColumnCount (const int theColumnCount) { myColumnCount = theColumnCount; }
+
+ //! Returns number of columns: parameter value
+ //! \param theSourceColumnCount number of columns in the source table
+ //! \return an integer value
+ Standard_EXPORT int ColumnCount (const int theSourceColumnCount) const;
+
+ //! Returns number of rows: whole number of columns is divided to the current column value
+ //! \param theSourceColumnCount number of columns in the source table
+ //! \return an integer value
+ Standard_EXPORT int RowCount (const int theSourceColumnCount) const;
+
+ //! Returns source row/column indices for the filtered model index
+ //! \param theIndex a model index
+ //! \param theRow [out] row number value
+ //! \param theColumn [out] column value
+ Standard_EXPORT void GetSourcePosition (const QModelIndex& theIndex, int& theRow, int& theColumn) const;
+
+ //! Returns source row/column indices for the filtered model index
+ //! \param theSourceRow model row index
+ //! \param theSourceColumn model column index
+ //! \param theRow [out] row number value
+ //! \param theColumn [out] column value
+ Standard_EXPORT void GetSourcePosition (const int theSourceRow, const int theSourceColumn, int& theRow, int& theColumn) const;
+
+private:
+ Standard_Boolean myIsActive; //!< active state of the filter
+ Standard_Integer myColumnCount; //!< number of table columns
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QApplication>
+#include <QFont>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : ColumnCount
+// purpose :
+// =======================================================================
+
+int ViewControl_TableModelValues::ColumnCount (const QModelIndex&) const
+{
+ Qt::Orientation anAdditionalOrientation = myOrientation == Qt::Vertical ? Qt::Horizontal : Qt::Vertical;
+ if (myHeaderValues[anAdditionalOrientation].size() > 0)
+ return myHeaderValues[anAdditionalOrientation].size();
+
+ return myValues.size();
+}
+
+// =======================================================================
+// function : Data
+// purpose :
+// =======================================================================
+
+QVariant ViewControl_TableModelValues::Data (const int theRow, const int theColumn, int theRole) const
+{
+ if (theRole == Qt::DisplayRole)
+ return myValues.at ((int)getPosition (theRow, theColumn));
+
+ if (theRole == Qt::TextAlignmentRole) // for multi-lines text, align it to the top
+ return Qt::AlignTop;
+
+ if ((theRole == Qt::FontRole || theRole == Qt::ForegroundRole) && isItalicHeader (theRow, theColumn))
+ {
+ if (theRole == Qt::FontRole)
+ {
+ QFont aFont = qApp->font();
+ aFont.setItalic (true);
+ return aFont;
+ }
+ else
+ QColor (Qt::darkGray).darker (150);
+ }
+ return QVariant();
+}
+
+// =======================================================================
+// function : HeaderData
+// purpose :
+// =======================================================================
+
+QVariant ViewControl_TableModelValues::HeaderData (int theSection, Qt::Orientation theOrientation, int theRole) const
+{
+ if (theRole == Qt::DisplayRole)
+ return myHeaderValues.contains (theOrientation) ? myHeaderValues[theOrientation][theSection].GetName()
+ : QString::number (theSection + 1);
+ else if (theRole == Qt::ForegroundRole)
+ return QColor (Qt::darkGray);
+
+ return QVariant();
+}
+
+// =======================================================================
+// function : isItalicHeader
+// purpose :
+// =======================================================================
+
+bool ViewControl_TableModelValues::isItalicHeader (const int theRow, const int theColumn) const
+{
+ Qt::Orientation anOrientation = myOrientation == Qt::Vertical ? Qt::Horizontal : Qt::Vertical;
+ int aCell = anOrientation == Qt::Horizontal ? theColumn : theRow;
+
+ return GetHeaderItem (anOrientation, aCell).IsItalic();
+}
\ No newline at end of file
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef ViewControl_TableModelValues_H
+#define ViewControl_TableModelValues_H
+
+#include <Standard.hxx>
+
+#include <inspector/TreeModel_HeaderSection.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAbstractTableModel>
+#include <QList>
+#include <QModelIndexList>
+#include <QVariant>
+#include <Standard_WarningsRestore.hxx>
+
+//! \class ViewControl_TableModelValues
+//! \brief This is an interace for ViewControl_TableModel to give real values of the model
+//! It should be filled or redefined.
+class ViewControl_TableModelValues
+{
+public:
+
+ //! Constructor
+ Standard_EXPORT ViewControl_TableModelValues (const Qt::Orientation& theOrientation = Qt::Vertical)
+ : myUseTableProperties (false), myUseTableSeparateSize (true), myUseTablePropertiesXStep (false),
+ myUseTablePropertiesXStepValue (-1)
+ { SetOrientation (theOrientation); }
+
+ //! Destructor
+ virtual ~ViewControl_TableModelValues() {}
+
+ //! Sets direction of the values applying, whether it should be placed by rows or by columns
+ //! \param theOrientation if horizontal, the values are applyed by rows, otherwise by columns
+ void SetOrientation (const Qt::Orientation& theOrientation) { myOrientation = theOrientation; }
+
+ //! Fills the model values.
+ //! \param theValues a container of table model values
+ void SetValues (const QVector<QVariant>& theValues) { myValues = theValues; }
+
+ //! Fills the model header values for orientation.
+ //! \param theValues a container of header text values
+ //! \param theOrientation an orientation of header
+ void SetHeaderValues (const QList<TreeModel_HeaderSection>& theValues, const Qt::Orientation theOrientation)
+ { myHeaderValues.insert (theOrientation, theValues); }
+
+ //! Returns whether the column is hidden by default
+ //! \param theColumnId a column index
+ //! \return header section values container
+ TreeModel_HeaderSection GetHeaderItem (const Qt::Orientation theOrientation, const int theColumnId) const
+ { return myHeaderValues.contains(theOrientation) ? myHeaderValues[theOrientation][theColumnId] : TreeModel_HeaderSection(); }
+
+ //! Stores information about table view header visibility
+ //! \param theOrientation an orientation of header
+ //! \param theVisibility if true, header is visible
+ void SetHeaderVisible (const Qt::Orientation theOrientation, const bool theVisibility)
+ { myVisibleHeader.insert (theOrientation, theVisibility); }
+
+ //! Stores information about table view header visibility
+ //! \param theOrientation an orientation of header
+ //! \param theVisibility if true, header is visible
+ bool IsHeaderVisible (const Qt::Orientation theOrientation) const
+ { return myVisibleHeader.contains(theOrientation) ? myVisibleHeader[theOrientation] : true; }
+
+ //! Set default section size if defined
+ //! \param theOrientation an orientation of header
+ //! \param theVisibility if true, header is visible
+ void SetDefaultSectionSize (const Qt::Orientation theOrientation, const int& theSectionSize)
+ { myDefaultSectionSize.insert(theOrientation, theSectionSize); }
+
+ //! Get default section size if defined
+ //! \param theOrientation an orientation of header
+ //! \param theVisibility if true, header is visible
+ bool GetDefaultSectionSize (const Qt::Orientation theOrientation, int& theSectionSize)
+ {
+ theSectionSize = myDefaultSectionSize.contains (theOrientation) ? myDefaultSectionSize[theOrientation] : -1;
+ return myDefaultSectionSize.contains (theOrientation);
+ }
+
+ //! Stores whether the properties control of the table visible or not
+ //! \param theUseProperties boolean state
+ void SetUseTableProperties (const bool theUseProperties) { myUseTableProperties = theUseProperties; }
+
+ //! Returns true if the properties control of the table visible or not
+ //! \return boolean value
+ bool UseTableProperties() const { return myUseTableProperties; }
+
+ //! Stores whether the properties control of the table visible or not
+ //! \param theUseProperties boolean state
+ void SetUseTableSeparateSize (const bool theUseSize)
+ { myUseTableSeparateSize = theUseSize; }
+
+ //! Returns true if the properties control of the table visible or not
+ //! \return boolean value
+ bool UseTableSeparateSize() const
+ { return myUseTableSeparateSize; }
+
+ //! Stores whether the properties control of the table visible or not
+ //! \param theUseProperties boolean state
+ void SetUseTablePropertiesXStep (const bool theUseStep, const double theStep)
+ { myUseTablePropertiesXStep = theUseStep; myUseTablePropertiesXStepValue = theStep; }
+
+ //! Returns true if the properties control of the table visible or not
+ //! \return boolean value
+ double UseTablePropertiesXStep(bool& theUseStep) const
+ { theUseStep = myUseTablePropertiesXStep; return myUseTablePropertiesXStepValue; }
+
+ //! Returns number of columns, size of header values
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ Standard_EXPORT virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const;
+
+ //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ virtual int RowCount (const QModelIndex& theParent = QModelIndex()) const
+ { return ColumnCount (theParent) > 0 ? GetValuesCount() / ColumnCount (theParent) : 0; }
+
+ //! Returns content of the model index for the given role, it is obtained from internal container of values
+ //! It returns value only for DisplayRole.
+ //! \param theIndex a model index
+ //! \param theRole a view role
+ //! \return value intepreted depending on the given role
+ Standard_EXPORT virtual QVariant Data (const int theRow, const int theColumn, int theRole = Qt::DisplayRole) const;
+
+ //! Returns content of the model index for the given role, it is obtainer from internal container of header values
+ //! It returns value only for DisplayRole.
+ //! \param theSection an index of value in the container
+ //! \param theIndex a model index
+ //! \param theRole a view role
+ //! \return value intepreted depending on the given role
+ Standard_EXPORT virtual QVariant HeaderData (int theSection, Qt::Orientation theOrientation, int theRole = Qt::DisplayRole) const;
+
+ //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable
+ //! \param theIndex a model index
+ //! \return flags
+ virtual Qt::ItemFlags Flags (const QModelIndex& theIndex) const
+ { return theIndex.isValid() ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags; }
+
+ //! Returns minimum and maximum values of the table content
+ //! \param theMinValue minimum
+ //! \param theMaxValue maximum
+ virtual void GetRangeValues (QString& theMinValue, QString& theMaxValue, const QModelIndexList& theSelected) const
+ { (void)theMinValue; (void)theMaxValue; (void)theSelected; }
+
+ //! Returns additional info
+ virtual QString AdditionalInformation() const { return QString(); }
+
+ //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+ //! \param theParent an index of the parent item
+ //! \return an integer value
+ virtual int GetValuesCount () const { return myValues.size(); }
+
+ //! Returns source row/column indices for the filtered model index for the given role
+ //! \param theSourceRow model row index
+ //! \param theSourceColumn model column index
+ //! \param theRow [out] row number value
+ //! \param theColumn [out] column value
+ Standard_EXPORT virtual void GetSourcePosition (const int theSourceRow, const int theSourceColumn, int& theRow, int& theColumn) const
+ { theRow = theSourceRow; theColumn = theSourceColumn; }
+
+protected:
+ //! Finds position in internal vector of values using the table column/row count
+ //! \param theRow a row of a table cell
+ //! \param theColumn a column of a table cell
+ size_t getPosition (const int theRow, const int theColumn) const { return ColumnCount() * theRow + theColumn; }
+
+ //! Returns true if the header item is italic of the parameter index
+ //! \param theRow a model index row
+ //! \param theColumn a model index column
+ //! \param boolean value
+ bool isItalicHeader (const int theRow, const int theColumn) const;
+
+protected:
+
+ Qt::Orientation myOrientation; //!< orientation how the values should fill the current table view
+ QMap<Qt::Orientation, QList<TreeModel_HeaderSection> > myHeaderValues; //!< table header values
+ QMap<Qt::Orientation, bool> myVisibleHeader; //! table header visibility
+ QMap<Qt::Orientation, int> myDefaultSectionSize; //! table section default size
+ QVector<QVariant> myValues; //! cached container of table values
+ bool myUseTableProperties; //! state whether the table property control is visible
+ bool myUseTableSeparateSize; //! state whether table custom column size is possible
+ bool myUseTablePropertiesXStep; //! true if XStep value is used
+ double myUseTablePropertiesXStepValue; //! value to define OX step for 1D table, Z = 0
+};
+
+#endif
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <inspector/ViewControl_TableProperty.hxx>
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableModelFilter.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <inspector/TreeModel_Tools.hxx>
+
+#include <QAbstractItemModel>
+#include <QAction>
+#include <QGridLayout>
+#include <QHeaderView>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMenu>
+#include <QPlainTextEdit>
+#include <QPushButton>
+#include <QSpinBox>
+#include <QTableView>
+#include <QWidget>
+
+#include <limits>
+
+const int DEFAULT_COLUMN_WIDTH = 60;
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+ViewControl_TableProperty::ViewControl_TableProperty (QWidget* theParent, ViewControl_Table* theTable)
+: QObject (theParent), myTable (theTable), myIsActive (false)
+{
+ myFilter = new ViewControl_TableModelFilter();
+
+ myMainWidget = new QWidget (theParent);
+ QGridLayout* aMainLayout = new QGridLayout (myMainWidget);
+
+ QWidget* aProperties = new QWidget (myMainWidget);
+ aMainLayout->addWidget (aProperties);
+ QHBoxLayout* aPropertiesLayout = new QHBoxLayout (aProperties);
+ aPropertiesLayout->setContentsMargins (0, 0, 0, 0);
+
+ mySize = new QLabel ("", myMainWidget);
+ myDivideSize = new QLabel("Divide:", myMainWidget);
+ mySeparateSize = new QSpinBox (myMainWidget);
+ mySeparateSize->setRange (0, 100000);
+ myVisualizedSize = new QLabel ("", myMainWidget);
+
+ aPropertiesLayout->addWidget (mySize);
+ aPropertiesLayout->addWidget (myDivideSize);
+ aPropertiesLayout->addWidget (mySeparateSize);
+ aPropertiesLayout->addWidget (myVisualizedSize);
+
+ myXStepLabel = new QLabel ("XStep:");
+ myXStep = new QDoubleSpinBox (myMainWidget);
+ myXStep->setRange(1.e-12, 1.e+7);
+ myXStep->setDecimals (8);
+ myXStep->setValue(1.);
+
+ setXStepActive (false);
+
+ connect (myXStep, SIGNAL(editingFinished()), this, SIGNAL (propertyChanged()));
+
+ aPropertiesLayout->addWidget (myXStepLabel);
+ aPropertiesLayout->addWidget (myXStep);
+
+ myInformationWidget = new QWidget (theParent);
+ QGridLayout* anInfoLayout = new QGridLayout (myInformationWidget);
+
+ myModelInformation = new QPlainTextEdit (myInformationWidget);
+ myModelInformation->setVisible (false);
+ anInfoLayout->addWidget (myModelInformation, 2, 0, 1, 4);
+
+ myMinValue = new QPushButton ("Min", myInformationWidget);
+ myMaxValue = new QPushButton ("Max", myInformationWidget);
+ myMinSelectedValue = new QPushButton ("Min of selected", myInformationWidget);
+ myMaxSelectedValue = new QPushButton ("Max of selected", myInformationWidget);
+
+ anInfoLayout->addWidget (myMinValue, 3, 0);
+ anInfoLayout->addWidget (myMinSelectedValue, 3, 1);
+ anInfoLayout->addWidget (myMaxValue, 4, 0);
+ anInfoLayout->addWidget (myMaxSelectedValue, 4, 1);
+
+ connect (mySeparateSize, SIGNAL (valueChanged (int)),
+ this, SLOT (onSeparateSizeChanged (int)));
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::Init()
+{
+ ViewControl_TableModel* aViewModel = dynamic_cast<ViewControl_TableModel*>(myTable->GetTableView()->model());
+ ViewControl_TableModelValues* aModelValues = aViewModel->GetModelValues();
+
+ bool aUseXStep;
+ double aXStep = aModelValues->UseTablePropertiesXStep (aUseXStep);
+ setXStepActive (aUseXStep, aXStep);
+
+ QString aMinValue = QString::number (DBL_MIN), aMaxValue = QString::number (DBL_MAX);
+ aModelValues->GetRangeValues (aMinValue, aMaxValue, QModelIndexList());
+ QString anInfo = aModelValues->AdditionalInformation();
+
+ bool aUseSeparateSize = aModelValues->UseTableSeparateSize();
+ mySize->setVisible (aUseSeparateSize);
+ myDivideSize->setVisible (aUseSeparateSize);
+ mySeparateSize->setVisible (aUseSeparateSize);
+ myVisualizedSize->setVisible (aUseSeparateSize);
+ myFilter->SetActive (aUseSeparateSize);
+ if (aUseSeparateSize && mySeparateSize->value() != 0)
+ myFilter->SetColumnCount(mySeparateSize->value());
+
+ mySize->setText (QString("[ %1, %2 ]").arg (aViewModel->rowCount()).arg (aViewModel->columnCount()));
+
+ myVisualizedSize->setText (mySize->text());
+ myVisualizedSize->setToolTip (QString ("sqrt: (%1, %2)").arg (sqrt (aViewModel->rowCount())).arg (sqrt (aViewModel->columnCount())));
+ myModelInformation->setVisible(!anInfo.isEmpty());
+ if (!anInfo.isEmpty())
+ myModelInformation->setPlainText (anInfo);
+
+ myMinValue->setText (QString ("Min: ") + aMinValue);
+ myMaxValue->setText (QString ("Max: ") + aMaxValue);
+ myMinSelectedValue->setText (QString("Min of selected: ") + QString::number(0));
+ myMaxSelectedValue->setText (QString("Max of selected: ") + QString::number(0));
+}
+
+// =======================================================================
+// function : SetActive
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::SetActive (const bool theActive)
+{
+ GetControl()->setVisible (theActive);
+ GetInformationControl()->setVisible (theActive);
+
+ ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (myTable->GetTableView()->model());
+ aModel->SetFilter (theActive ? GetFilter() : 0);
+}
+
+// =======================================================================
+// function : onSeparateSizeChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::onSeparateSizeChanged (int theValue)
+{
+ myFilter->SetColumnCount(theValue);
+
+ myTable->GetTableView()->selectionModel()->clearSelection();
+
+ ViewControl_TableModel* aViewModel = dynamic_cast<ViewControl_TableModel*>(myTable->GetTableView()->model());
+ aViewModel->EmitLayoutChanged();
+
+ myVisualizedSize->setText (QString ("[ %1, %2 ]").arg (aViewModel->rowCount()).arg (aViewModel->columnCount()));
+}
+
+// =======================================================================
+// function : onToleranceSizeChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::onToleranceSizeChanged (int theValue)
+{
+ (void)theValue;
+}
+
+// =======================================================================
+// function : onSeparateSizeChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::UpdateOnTableSelectionChanged()
+{
+ QModelIndexList aSelected = myTable->GetTableView()->selectionModel()->selectedIndexes();
+ if (aSelected.isEmpty())
+ {
+ myMinSelectedValue->setText(QString("Min of selected:") + QString::number(0));
+ myMaxSelectedValue->setText(QString("Max of selected:") + QString::number(0));
+ return;
+ }
+
+ ViewControl_TableModel* aViewModel = dynamic_cast<ViewControl_TableModel*>(myTable->GetTableView()->model());
+ ViewControl_TableModelValues* aModelValues = aViewModel->GetModelValues();
+
+ QString aMinValue = QString::number (DBL_MIN), aMaxValue = QString::number (DBL_MAX);
+ aModelValues->GetRangeValues (aMinValue, aMaxValue, aSelected);
+
+ myMinSelectedValue->setText (QString ("Min of selected:") + aMinValue);
+ myMaxSelectedValue->setText (QString ("Max of selected:") + aMaxValue);
+}
+
+// =======================================================================
+// function : createAction
+// purpose :
+// =======================================================================
+void ViewControl_TableProperty::setXStepActive (const bool theState, const double theValue)
+{
+ myXStepActive = theState;
+
+ myXStepLabel->setVisible (myXStepActive);
+ myXStep->setVisible (myXStepActive);
+
+ if (theValue > 0)
+ myXStep->setValue (theValue);
+}
--- /dev/null
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef ViewControl_TableProperty_H
+#define ViewControl_TableProperty_H
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4127) // conditional expression is constant
+#endif
+
+#include <QDoubleSpinBox>
+#include <QObject>
+#include <QSpinBox>
+
+class ViewControl_Table;
+class ViewControl_TableModelFilter;
+
+class QContextMenuEvent;
+class QLabel;
+class QItemSelection;
+class QPlainTextEdit;
+class QPushButton;
+class QSpinBox;
+class QWidget;
+
+//! \class ViewControl_TableProperty
+//! \brief View to display table values with possibility to change table columns
+//! if the table has 1D dimension and Horizontal orientation
+class ViewControl_TableProperty : public QObject
+{
+ Q_OBJECT
+public:
+
+ //! Constructor
+ Standard_EXPORT ViewControl_TableProperty (QWidget* theParent, ViewControl_Table* theTable);
+
+ //! Destructor
+ virtual ~ViewControl_TableProperty() Standard_OVERRIDE {}
+
+ //! Fills table view and table size control by the model
+ Standard_EXPORT void Init();
+
+ //! Sets whether the properties pane is visible or not
+ //! \param theUseProperty boolean state
+ Standard_EXPORT void SetActive (const bool theActive);
+
+ //! Returns main control
+ //! \return widget
+ QWidget* GetControl() const { return myMainWidget; }
+
+ //! Returns information control
+ //! \return widget
+ QWidget* GetInformationControl() { return myInformationWidget; }
+
+ //! Returns table values filter to apply separation size
+ //! \return filter instance
+ ViewControl_TableModelFilter* GetFilter() { return myFilter; }
+
+ //! Returns X step or -1 if it is not used
+ //! \return double value
+ double GetXStep() const { return myXStepActive ? myXStep->value() : -1;};
+
+ //! Sets X step
+ //! \param theValue value
+ void SetXStep(const double theValue) const { myXStep->setValue (theValue); };
+
+ //! Returns divide valid
+ //! \return control value
+ int GetDivideSize() const { return mySeparateSize->value(); }
+
+ //! Sets separate size value
+ //! \param theValue new value
+ void SetDivideSize (const int theValue) { mySeparateSize->setValue (theValue); }
+
+signals:
+ //! Signals about header cell is clicked
+ //! \param theEvent context menu event
+ void headerContextMenuRequsted (QContextMenuEvent* theEvent);
+
+ //! Signals about the following properties are changed: XStep.
+ void propertyChanged();
+
+protected slots:
+ //! Reacts to the spin box value change, it divides table model values to has given number of columns
+ //! \param theValue a new value of spin box
+ void onSeparateSizeChanged (int theValue);
+
+ //! Reacts to the tolerance value change, it sets it into table model
+ //! \param theValue a new value of spin box
+ void onToleranceSizeChanged (int theValue);
+
+public:
+ //! Updates controls by selection change in table view
+ //! \param theSelected container of selected table cells
+ //! \param theDeselected container of selected table cells
+ void UpdateOnTableSelectionChanged();
+
+private:
+ //! Changes visibility of XStep control, if visible, set parameter value
+ //! \param theState if true, the control is visible
+ //! \param theValue the current for the control
+ void setXStepActive (const bool theState, const double theValue = -1);
+
+private:
+ bool myIsActive; //!< state whether the control is visible and used
+ QWidget* myMainWidget; //!< parent of all controls
+ QLabel* mySize; //!< control to visualize initial values size
+ QLabel* myDivideSize; //!< size of division table values to rows
+ QSpinBox* mySeparateSize; //!< control to divide table by given size if thable has only 1 dimension
+ QLabel* myVisualizedSize; //!< control to visualize current table size
+
+ bool myXStepActive; //!< state whether the XStep control is visible
+ QLabel* myXStepLabel; //!< label of X step
+ QDoubleSpinBox* myXStep; //!< control to enter X step
+
+ QWidget* myInformationWidget; //!< parent of all controls
+ QPlainTextEdit* myModelInformation; //!< control to visualize current table size
+ QPushButton* myMinValue; //!< minimum table value
+ QPushButton* myMaxValue; //!< maximum table value
+ QPushButton* myMinSelectedValue; //!< minimum value of selected table cells
+ QPushButton* myMaxSelectedValue; //!< maximum value of selected table cells
+
+ ViewControl_Table* myTable; //!< table control
+ ViewControl_TableModelFilter* myFilter; //!< table values filter to apply separation size
+};
+#endif
// commercial license or contractual agreement.
#include <inspector/ViewControl_Tools.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
#include <Standard_WarningsDisable.hxx>
#include <QAction>
+#include <QHeaderView>
#include <QObject>
#include <QPalette>
+#include <QTableView>
#include <QWidget>
#include <Standard_WarningsRestore.hxx>
aPalette.setColor (QPalette::All, QPalette::Foreground, Qt::white);
theControl->setPalette (aPalette);
}
+
+// =======================================================================
+// function : SetDefaultHeaderSections
+// purpose :
+// =======================================================================
+void ViewControl_Tools::SetDefaultHeaderSections(QTableView* theTableView, const Qt::Orientation theOrientation)
+{
+ ViewControl_TableModel * aTableModel = dynamic_cast<ViewControl_TableModel*> (theTableView->model());
+ ViewControl_TableModelValues* aModelValues = aTableModel->GetModelValues();
+ if (!aModelValues)
+ return;
+
+ int aSectionSize;
+ if (aModelValues->GetDefaultSectionSize (Qt::Horizontal, aSectionSize) )
+ theTableView->horizontalHeader()->setDefaultSectionSize (aSectionSize);
+ else {
+ bool isStretchLastSection = false;
+ for (int aColumnId = 0, aNbColumns = aTableModel->columnCount(); aColumnId < aNbColumns; aColumnId++)
+ {
+ TreeModel_HeaderSection aSection = aModelValues->GetHeaderItem (theOrientation, aColumnId);
+
+ int aColumnWidth = aSection.GetWidth();
+ if (aColumnWidth > 0)
+ theTableView->setColumnWidth (aColumnId, aColumnWidth);
+ else if (aColumnId == aNbColumns - 1)
+ isStretchLastSection = true;
+ theTableView->setColumnHidden (aColumnId, aSection.IsHidden());
+ }
+ if (isStretchLastSection != theTableView->horizontalHeader()->stretchLastSection())
+ theTableView->horizontalHeader()->setStretchLastSection (isStretchLastSection);
+ }
+}
class QAction;
class QObject;
+class QTableView;
class QWidget;
//! \class ViewControl_Tools
//! \param theControl a widget to be modified
Standard_EXPORT static void SetWhiteBackground (QWidget* theControl);
+ //! Fills tree view by default sections parameters obtained in view's table model
+ //! \param theTableView table view instance
+ //! \param theOrientation header orientation
+ Standard_EXPORT static void SetDefaultHeaderSections (QTableView* theTableView, const Qt::Orientation theOrientation);
+
};
#endif
+++ /dev/null
-@echo off
-
-rem Helper script to run procedure of automatic upgrade of application code
-rem on newer version of OCCT on Windows.
-rem Running it requires that Tcl should be in the PATH
-
-SET "OLD_PATH=%PATH%"
-
-if exist "%~dp0env.bat" (
- call "%~dp0env.bat"
-)
-
-set "TCL_EXEC=tclsh.exe"
-
-for %%X in (%TCL_EXEC%) do (set TCL_FOUND=%%~$PATH:X)
-
-if defined TCL_FOUND (
- %TCL_EXEC% %~dp0adm/start.tcl upgrade %*
-) else (
- echo "Error. %TCL_EXEC% is not found. Please update PATH variable"
-)
-
-SET "PATH=%OLD_PATH%"