From: nds Date: Fri, 14 Jun 2019 07:39:35 +0000 (+0300) Subject: 0030268: Inspectors - improvements in VInspector plugin, X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=cafd762c9332cc98f4d23beea7ac8e3e7798b525;p=occt-copy.git 0030268: Inspectors - improvements in VInspector plugin, 0029451: Information Message Alert to debug an algorithm or object functionality --- diff --git a/src/AIS/AIS.cxx b/src/AIS/AIS.cxx index fa84613c2f..2da2b583ce 100644 --- a/src/AIS/AIS.cxx +++ b/src/AIS/AIS.cxx @@ -82,6 +82,19 @@ const Standard_Real SquareTolerance = Precision::SquareConfusion(); +namespace +{ + static Standard_CString AIS_Table_PrintDisplayStatus[3] = + { + "DISPLAYED", "ERASED", "NONE" + }; + + static Standard_CString AIS_Table_PrintKindOfInteractive[6] = + { + "NONE", "DATUM", "SHAPE", "OBJECT", "RELATION", "DIMENSION" + }; +} + //======================================================================= //function : Nearest //purpose : @@ -1538,3 +1551,63 @@ void AIS::ComputeProjVertexPresentation (const Handle( Prs3d_Presentation )& aPr StdPrs_WFShape::Add (aPresentation, MakEd.Edge(), aDrawer); } } + +//======================================================================= +//function : DisplayStatusToString +//purpose : +//======================================================================= +Standard_CString AIS::DisplayStatusToString (AIS_DisplayStatus theType) +{ + return AIS_Table_PrintDisplayStatus[theType]; +} + +//======================================================================= +//function : DisplayStatusFromString +//purpose : +//======================================================================= +Standard_Boolean AIS::DisplayStatusFromString (Standard_CString theTypeString, + AIS_DisplayStatus& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= AIS_DS_None; ++aTypeIter) + { + Standard_CString aTypeName = AIS_Table_PrintDisplayStatus[aTypeIter]; + if (aName == aTypeName) + { + theType = AIS_DisplayStatus (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : KindOfInteractiveToString +//purpose : +//======================================================================= +Standard_CString AIS::KindOfInteractiveToString (AIS_KindOfInteractive theType) +{ + return AIS_Table_PrintKindOfInteractive[theType]; +} + +//======================================================================= +//function : KindOfInteractiveFromString +//purpose : +//======================================================================= +Standard_Boolean AIS::KindOfInteractiveFromString (Standard_CString theTypeString, + AIS_KindOfInteractive& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= AIS_KOI_Dimension; ++aTypeIter) + { + Standard_CString aTypeName = AIS_Table_PrintKindOfInteractive[aTypeIter]; + if (aName == aTypeName) + { + theType = AIS_KindOfInteractive (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} diff --git a/src/AIS/AIS.hxx b/src/AIS/AIS.hxx index 70cc8ce6a3..e6f95f67ac 100644 --- a/src/AIS/AIS.hxx +++ b/src/AIS/AIS.hxx @@ -17,6 +17,8 @@ #ifndef _AIS_HeaderFile #define _AIS_HeaderFile +#include +#include #include #include #include @@ -203,6 +205,50 @@ public: Standard_EXPORT static void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); + //! Returns the string name for a given enum type. + //! @param theType display status + //! @return string identifier + Standard_EXPORT static Standard_CString DisplayStatusToString (AIS_DisplayStatus theType); + + //! Returns the display status from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return status type or AIS_DS_None if string identifier is invalid + static AIS_DisplayStatus DisplayStatusFromString (Standard_CString theTypeString) + { + AIS_DisplayStatus aType = AIS_DS_None; + DisplayStatusFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected display status + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean DisplayStatusFromString (const Standard_CString theTypeString, + AIS_DisplayStatus& theType); + + //! Returns the string name for a given enum type. + //! @param theType display status + //! @return string identifier + Standard_EXPORT static Standard_CString KindOfInteractiveToString (AIS_KindOfInteractive theType); + + //! Returns the display status from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return status type or AIS_KOI_None if string identifier is invalid + static AIS_KindOfInteractive KindOfInteractiveFromString (Standard_CString theTypeString) + { + AIS_KindOfInteractive aType = AIS_KOI_None; + KindOfInteractiveFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected display status + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean KindOfInteractiveFromString (const Standard_CString theTypeString, + AIS_KindOfInteractive& theType); + }; #endif // _AIS_HeaderFile diff --git a/src/Aspect/Aspect.cxx b/src/Aspect/Aspect.cxx new file mode 100644 index 0000000000..e7ade3a45b --- /dev/null +++ b/src/Aspect/Aspect.cxx @@ -0,0 +1,452 @@ +// Copyright (c) 2018 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 + +#include + +namespace +{ + static Standard_CString Aspect_Table_PrintTypeOfDeflection[2] = + { + "RELATIVE", "ABSOLUTE" + }; + + static Standard_CString Aspect_Table_PrintTypeOfFacingModel[3] = + { + "BOTH", "BACK", "FRONT" + }; + + static Standard_CString Aspect_Table_PrintTypeOfHighlightMethod[2] = + { + "COLOR", "BOUNDBOX" + }; + + static Standard_CString Aspect_Table_PrintTypeOfLine[6] = + { + "EMPTY", "SOLID", "DASH", "DOT", "DOT_DASH", "USER_DEFINED" + }; + + static Standard_CString Aspect_Table_PrintTypeOfMarker[15] = + { + "EMPTY", "POINT", "PLUS", "STAR", "X", "O", "O_POINT", "O_PLUS", "O_STAR", "O_X", + "RING1", "RING2", "RING3", "BALL", "USER_DEFINED" + }; + + static Standard_CString Aspect_Table_PrintTypeOfDisplayText[6] = + { + "NORMAL", "SUBTITLE", "DEKALE", "BLEND", "DIMENSION", "SHADOW" + }; + + static Standard_CString Aspect_Table_PrintTypeOfStyleText[2] = + { + "NORMAL", "ANNOTATION" + }; + + static Standard_CString Aspect_Table_PrintInteriorStyle[6] = + { + "EMPTY", "HOLLOW", "HATCH", "SOLID", "HIDDEN_LINE", "POINT" + }; + + static Standard_CString Aspect_Table_PrintPolygonOffsetMode[7] = + { + "OFF", "FILL", "LINE", "POINT", "ALL", "NONE", "MASK" + }; + + static Standard_CString Aspect_Table_PrintHatchStyle[14] = + { + "SOLID", "HORIZONTAL", "HORIZONTAL_WIDE", "VERTICAL", "VERTICAL_WIDE", + "DIAGONAL_45", "DIAGONAL_45_WIDE", "DIAGONAL_135", "DIAGONAL_135_WIDE", + "GRID", "GRID_WIDE", "GRID_DIAGONAL", "GRID_DIAGONAL_WIDE", "NB" + }; + + static Standard_CString Aspect_Table_PrintTypeOfTriedronPosition[9] = + { + "CENTER", "TOP", "BOTTOM", "LEFT", "RIGHT", "LEFT_LOWER", "LEFT_UPPER", "RIGHT_LOWER", "RIGHT_UPPER" + }; +} + +//======================================================================= +//function : TypeOfDeflectionToString +//purpose : +//======================================================================= +Standard_CString Aspect::TypeOfDeflectionToString (Aspect_TypeOfDeflection theType) +{ + return Aspect_Table_PrintTypeOfDeflection[theType]; +} + +//======================================================================= +//function : TypeOfDeflectionFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::TypeOfDeflectionFromString (Standard_CString theTypeString, + Aspect_TypeOfDeflection& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Aspect_TOD_ABSOLUTE; ++aTypeIter) + { + Standard_CString aTypeName = Aspect_Table_PrintTypeOfDeflection[aTypeIter]; + if (aName == aTypeName) + { + theType = Aspect_TypeOfDeflection (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfFacingModelToString +//purpose : +//======================================================================= +Standard_CString Aspect::TypeOfFacingModelToString (Aspect_TypeOfFacingModel theType) +{ + return Aspect_Table_PrintTypeOfFacingModel[theType]; +} + +//======================================================================= +//function : TypeOfFacingModelFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::TypeOfFacingModelFromString (Standard_CString theTypeString, + Aspect_TypeOfFacingModel& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Aspect_TOFM_FRONT_SIDE; ++aTypeIter) + { + Standard_CString aTypeName = Aspect_Table_PrintTypeOfFacingModel[aTypeIter]; + if (aName == aTypeName) + { + theType = Aspect_TypeOfFacingModel (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfHighlightMethodToString +//purpose : +//======================================================================= +Standard_CString Aspect::TypeOfHighlightMethodToString (Aspect_TypeOfHighlightMethod theType) +{ + return Aspect_Table_PrintTypeOfHighlightMethod[theType]; +} + +//======================================================================= +//function : TypeOfHighlightMethodFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::TypeOfHighlightMethodFromString (Standard_CString theTypeString, + Aspect_TypeOfHighlightMethod& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Aspect_TOHM_BOUNDBOX; ++aTypeIter) + { + Standard_CString aTypeName = Aspect_Table_PrintTypeOfHighlightMethod[aTypeIter]; + if (aName == aTypeName) + { + theType = Aspect_TypeOfHighlightMethod (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfLineToString +//purpose : +//======================================================================= +Standard_CString Aspect::TypeOfLineToString (Aspect_TypeOfLine theType) +{ + return Aspect_Table_PrintTypeOfLine[theType]; +} + +//======================================================================= +//function : TypeOfLineFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::TypeOfLineFromString (Standard_CString theTypeString, + Aspect_TypeOfLine& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Aspect_TOL_EMPTY; aTypeIter <= Aspect_TOL_USERDEFINED; ++aTypeIter) + { + Standard_CString aTypeName = Aspect_Table_PrintTypeOfLine[aTypeIter + 1]; + if (aName == aTypeName) + { + theType = Aspect_TypeOfLine (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfMarkerToString +//purpose : +//======================================================================= +Standard_CString Aspect::TypeOfMarkerToString (Aspect_TypeOfMarker theType) +{ + return Aspect_Table_PrintTypeOfMarker[theType]; +} + +//======================================================================= +//function : TypeOfMarkerFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::TypeOfMarkerFromString (Standard_CString theTypeString, + Aspect_TypeOfMarker& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Aspect_TOM_EMPTY; aTypeIter <= Aspect_TOM_USERDEFINED; ++aTypeIter) + { + Standard_CString aTypeName = Aspect_Table_PrintTypeOfMarker[aTypeIter + 1]; + if (aName == aTypeName) + { + theType = Aspect_TypeOfMarker (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfDisplayTextToString +//purpose : +//======================================================================= +Standard_CString Aspect::TypeOfDisplayTextToString (Aspect_TypeOfDisplayText theType) +{ + return Aspect_Table_PrintTypeOfDisplayText[theType]; +} + +//======================================================================= +//function : TypeOfDisplayTextFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::TypeOfDisplayTextFromString (Standard_CString theTypeString, + Aspect_TypeOfDisplayText& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Aspect_TODT_NORMAL; aTypeIter <= Aspect_TODT_SHADOW; ++aTypeIter) + { + Standard_CString aTypeName = Aspect_Table_PrintTypeOfDisplayText[aTypeIter]; + if (aName == aTypeName) + { + theType = Aspect_TypeOfDisplayText (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfStyleTextToString +//purpose : +//======================================================================= +Standard_CString Aspect::TypeOfStyleTextToString (Aspect_TypeOfStyleText theType) +{ + return Aspect_Table_PrintTypeOfStyleText[theType]; +} + +//======================================================================= +//function : TypeOfStyleTextFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::TypeOfStyleTextFromString (Standard_CString theTypeString, + Aspect_TypeOfStyleText& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Aspect_TOST_NORMAL; aTypeIter <= Aspect_TOST_ANNOTATION; ++aTypeIter) + { + Standard_CString aTypeName = Aspect_Table_PrintTypeOfStyleText[aTypeIter]; + if (aName == aTypeName) + { + theType = Aspect_TypeOfStyleText (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : InteriorStyleToString +//purpose : +//======================================================================= +Standard_CString Aspect::InteriorStyleToString (Aspect_InteriorStyle theType) +{ + return Aspect_Table_PrintInteriorStyle[theType]; +} + +//======================================================================= +//function : InteriorStyleFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::InteriorStyleFromString (Standard_CString theTypeString, + Aspect_InteriorStyle& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Aspect_IS_EMPTY; aTypeIter <= Aspect_IS_POINT; ++aTypeIter) + { + Standard_CString aTypeName = Aspect_Table_PrintInteriorStyle[aTypeIter]; + if (aName == aTypeName) + { + theType = Aspect_InteriorStyle (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : PolygonOffsetModeToString +//purpose : +//======================================================================= +Standard_CString Aspect::PolygonOffsetModeToString (Aspect_PolygonOffsetMode theType) +{ + switch (theType) + { + case Aspect_POM_Off: return Aspect_Table_PrintPolygonOffsetMode[0]; + case Aspect_POM_Fill: return Aspect_Table_PrintPolygonOffsetMode[1]; + case Aspect_POM_Line: return Aspect_Table_PrintPolygonOffsetMode[2]; + case Aspect_POM_Point: return Aspect_Table_PrintPolygonOffsetMode[3]; + case Aspect_POM_All: return Aspect_Table_PrintPolygonOffsetMode[4]; + case Aspect_POM_None: return Aspect_Table_PrintPolygonOffsetMode[5]; + case Aspect_POM_Mask: return Aspect_Table_PrintPolygonOffsetMode[6]; + } + return ""; +} + +//======================================================================= +//function : PolygonOffsetModeFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::PolygonOffsetModeFromString (Standard_CString theTypeString, + Aspect_PolygonOffsetMode& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + if (aName == Aspect_Table_PrintPolygonOffsetMode[0]) { theType = Aspect_POM_Off; return Standard_True; } + else if (aName == Aspect_Table_PrintPolygonOffsetMode[1]) { theType = Aspect_POM_Fill; return Standard_True; } + else if (aName == Aspect_Table_PrintPolygonOffsetMode[2]) { theType = Aspect_POM_Line; return Standard_True; } + else if (aName == Aspect_Table_PrintPolygonOffsetMode[3]) { theType = Aspect_POM_Point; return Standard_True; } + else if (aName == Aspect_Table_PrintPolygonOffsetMode[4]) { theType = Aspect_POM_All; return Standard_True; } + else if (aName == Aspect_Table_PrintPolygonOffsetMode[5]) { theType = Aspect_POM_None; return Standard_True; } + else if (aName == Aspect_Table_PrintPolygonOffsetMode[6]) { theType = Aspect_POM_Mask; return Standard_True; } + + return Standard_False; +} + +//======================================================================= +//function : HatchStyleToString +//purpose : +//======================================================================= +Standard_CString Aspect::HatchStyleToString (Aspect_HatchStyle theType) +{ + return Aspect_Table_PrintHatchStyle[theType]; + switch (theType) + { + case Aspect_HS_SOLID: return Aspect_Table_PrintHatchStyle[0]; + case Aspect_HS_HORIZONTAL: return Aspect_Table_PrintHatchStyle[1]; + case Aspect_HS_HORIZONTAL_WIDE: return Aspect_Table_PrintHatchStyle[2]; + case Aspect_HS_VERTICAL: return Aspect_Table_PrintHatchStyle[3]; + case Aspect_HS_VERTICAL_WIDE: return Aspect_Table_PrintHatchStyle[4]; + case Aspect_HS_DIAGONAL_45: return Aspect_Table_PrintHatchStyle[5]; + case Aspect_HS_DIAGONAL_45_WIDE: return Aspect_Table_PrintHatchStyle[6]; + case Aspect_HS_DIAGONAL_135: return Aspect_Table_PrintHatchStyle[7]; + case Aspect_HS_DIAGONAL_135_WIDE: return Aspect_Table_PrintHatchStyle[8]; + case Aspect_HS_GRID: return Aspect_Table_PrintHatchStyle[9]; + case Aspect_HS_GRID_WIDE: return Aspect_Table_PrintHatchStyle[10]; + case Aspect_HS_GRID_DIAGONAL: return Aspect_Table_PrintHatchStyle[11]; + case Aspect_HS_GRID_DIAGONAL_WIDE: return Aspect_Table_PrintHatchStyle[12]; + case Aspect_HS_NB: return Aspect_Table_PrintHatchStyle[13]; + } + return ""; +} + +//======================================================================= +//function : HatchStyleFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::HatchStyleFromString (Standard_CString theTypeString, + Aspect_HatchStyle& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + if (aName == Aspect_Table_PrintHatchStyle[0]) { theType = Aspect_HS_SOLID; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[1]) { theType = Aspect_HS_HORIZONTAL; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[2]) { theType = Aspect_HS_HORIZONTAL_WIDE; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[3]) { theType = Aspect_HS_VERTICAL; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[4]) { theType = Aspect_HS_VERTICAL_WIDE; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[5]) { theType = Aspect_HS_DIAGONAL_45; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[6]) { theType = Aspect_HS_DIAGONAL_45_WIDE; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[7]) { theType = Aspect_HS_DIAGONAL_135; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[8]) { theType = Aspect_HS_DIAGONAL_135_WIDE; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[9]) { theType = Aspect_HS_GRID; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[10]) { theType = Aspect_HS_GRID_WIDE; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[11]) { theType = Aspect_HS_GRID_DIAGONAL; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[12]) { theType = Aspect_HS_GRID_DIAGONAL_WIDE; return Standard_True; } + else if (aName == Aspect_Table_PrintHatchStyle[13]) { theType = Aspect_HS_NB; return Standard_True; } + return Standard_False; +} + +//======================================================================= +//function : TypeOfTriedronPositionToString +//purpose : +//======================================================================= +Standard_CString Aspect::TypeOfTriedronPositionToString (Aspect_TypeOfTriedronPosition theType) +{ + return Aspect_Table_PrintTypeOfTriedronPosition[theType]; + switch (theType) + { + case Aspect_TOTP_CENTER: return Aspect_Table_PrintTypeOfTriedronPosition[0]; + case Aspect_TOTP_TOP: return Aspect_Table_PrintTypeOfTriedronPosition[1]; + case Aspect_TOTP_BOTTOM: return Aspect_Table_PrintTypeOfTriedronPosition[2]; + case Aspect_TOTP_LEFT: return Aspect_Table_PrintTypeOfTriedronPosition[3]; + case Aspect_TOTP_RIGHT: return Aspect_Table_PrintTypeOfTriedronPosition[4]; + case Aspect_TOTP_LEFT_LOWER: return Aspect_Table_PrintTypeOfTriedronPosition[5]; + case Aspect_TOTP_LEFT_UPPER: return Aspect_Table_PrintTypeOfTriedronPosition[6]; + case Aspect_TOTP_RIGHT_LOWER: return Aspect_Table_PrintTypeOfTriedronPosition[7]; + case Aspect_TOTP_RIGHT_UPPER: return Aspect_Table_PrintTypeOfTriedronPosition[8]; + } + return ""; +} + +//======================================================================= +//function : TypeOfTriedronPositionFromString +//purpose : +//======================================================================= +Standard_Boolean Aspect::TypeOfTriedronPositionFromString (Standard_CString theTypeString, + Aspect_TypeOfTriedronPosition& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + if (aName == Aspect_Table_PrintTypeOfTriedronPosition[0]) { theType = Aspect_TOTP_CENTER; return Standard_True; } + else if (aName == Aspect_Table_PrintTypeOfTriedronPosition[1]) { theType = Aspect_TOTP_TOP; return Standard_True; } + else if (aName == Aspect_Table_PrintTypeOfTriedronPosition[2]) { theType = Aspect_TOTP_BOTTOM; return Standard_True; } + else if (aName == Aspect_Table_PrintTypeOfTriedronPosition[3]) { theType = Aspect_TOTP_LEFT; return Standard_True; } + else if (aName == Aspect_Table_PrintTypeOfTriedronPosition[4]) { theType = Aspect_TOTP_RIGHT; return Standard_True; } + else if (aName == Aspect_Table_PrintTypeOfTriedronPosition[5]) { theType = Aspect_TOTP_LEFT_LOWER; return Standard_True; } + else if (aName == Aspect_Table_PrintTypeOfTriedronPosition[6]) { theType = Aspect_TOTP_LEFT_UPPER; return Standard_True; } + else if (aName == Aspect_Table_PrintTypeOfTriedronPosition[7]) { theType = Aspect_TOTP_RIGHT_LOWER; return Standard_True; } + else if (aName == Aspect_Table_PrintTypeOfTriedronPosition[8]) { theType = Aspect_TOTP_RIGHT_UPPER; return Standard_True; } + return Standard_False; +} diff --git a/src/Aspect/Aspect.hxx b/src/Aspect/Aspect.hxx new file mode 100644 index 0000000000..75b2d3abe9 --- /dev/null +++ b/src/Aspect/Aspect.hxx @@ -0,0 +1,284 @@ +// Copyright (c) 2018 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 _Aspect_HeaderFile +#define _Aspect_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//! Provides methods to cast enumerations of package to string value +class Aspect +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfDeflectionToString (Aspect_TypeOfDeflection theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TOFM_BOTH_SIDE if string identifier is invalid + static Aspect_TypeOfDeflection TypeOfDeflectionFromString (Standard_CString theTypeString) + { + Aspect_TypeOfDeflection aType = Aspect_TOD_RELATIVE; + TypeOfDeflectionFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfDeflectionFromString (const Standard_CString theTypeString, + Aspect_TypeOfDeflection& theType); + + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfFacingModelToString (Aspect_TypeOfFacingModel theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TOFM_BOTH_SIDE if string identifier is invalid + static Aspect_TypeOfFacingModel TypeOfFacingModelFromString (Standard_CString theTypeString) + { + Aspect_TypeOfFacingModel aType = Aspect_TOFM_BOTH_SIDE; + TypeOfFacingModelFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfFacingModelFromString (const Standard_CString theTypeString, + Aspect_TypeOfFacingModel& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfHighlightMethodToString (Aspect_TypeOfHighlightMethod theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TOHM_COLOR if string identifier is invalid + static Aspect_TypeOfHighlightMethod TypeOfHighlightMethodFromString (Standard_CString theTypeString) + { + Aspect_TypeOfHighlightMethod aType = Aspect_TOHM_COLOR; + TypeOfHighlightMethodFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfHighlightMethodFromString (const Standard_CString theTypeString, + Aspect_TypeOfHighlightMethod& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfLineToString (Aspect_TypeOfLine theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TOL_EMPTY if string identifier is invalid + static Aspect_TypeOfLine TypeOfLineFromString (Standard_CString theTypeString) + { + Aspect_TypeOfLine aType = Aspect_TOL_EMPTY; + TypeOfLineFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfLineFromString (const Standard_CString theTypeString, + Aspect_TypeOfLine& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfMarkerToString (Aspect_TypeOfMarker theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TOM_EMPTY if string identifier is invalid + static Aspect_TypeOfMarker TypeOfMarkerFromString (Standard_CString theTypeString) + { + Aspect_TypeOfMarker aType = Aspect_TOM_EMPTY; + TypeOfMarkerFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfMarkerFromString (const Standard_CString theTypeString, + Aspect_TypeOfMarker& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfDisplayTextToString (Aspect_TypeOfDisplayText theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TODT_NORMAL if string identifier is invalid + static Aspect_TypeOfDisplayText TypeOfDisplayTextFromString (Standard_CString theTypeString) + { + Aspect_TypeOfDisplayText aType = Aspect_TODT_NORMAL; + TypeOfDisplayTextFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfDisplayTextFromString (const Standard_CString theTypeString, + Aspect_TypeOfDisplayText& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfStyleTextToString (Aspect_TypeOfStyleText theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TODT_NORMAL if string identifier is invalid + static Aspect_TypeOfStyleText TypeOfStyleTextFromString (Standard_CString theTypeString) + { + Aspect_TypeOfStyleText aType = Aspect_TOST_NORMAL; + TypeOfStyleTextFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfStyleTextFromString (const Standard_CString theTypeString, + Aspect_TypeOfStyleText& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString InteriorStyleToString (Aspect_InteriorStyle theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_IS_EMPTY if string identifier is invalid + static Aspect_InteriorStyle InteriorStyleFromString (Standard_CString theTypeString) + { + Aspect_InteriorStyle aType = Aspect_IS_EMPTY; + InteriorStyleFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean InteriorStyleFromString (const Standard_CString theTypeString, + Aspect_InteriorStyle& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString PolygonOffsetModeToString (Aspect_PolygonOffsetMode theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_POM_Off if string identifier is invalid + static Aspect_PolygonOffsetMode PolygonOffsetModeFromString (Standard_CString theTypeString) + { + Aspect_PolygonOffsetMode aType = Aspect_POM_Off; + PolygonOffsetModeFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean PolygonOffsetModeFromString (const Standard_CString theTypeString, + Aspect_PolygonOffsetMode& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString HatchStyleToString (Aspect_HatchStyle theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_POM_Off if string identifier is invalid + static Aspect_HatchStyle HatchStyleFromString (Standard_CString theTypeString) + { + Aspect_HatchStyle aType = Aspect_HS_SOLID; + HatchStyleFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean HatchStyleFromString (const Standard_CString theTypeString, + Aspect_HatchStyle& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfTriedronPositionToString (Aspect_TypeOfTriedronPosition theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TOTP_CENTER if string identifier is invalid + static Aspect_TypeOfTriedronPosition TypeOfTriedronPositionFromString (Standard_CString theTypeString) + { + Aspect_TypeOfTriedronPosition aType = Aspect_TOTP_CENTER; + TypeOfTriedronPositionFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfTriedronPositionFromString (const Standard_CString theTypeString, + Aspect_TypeOfTriedronPosition& theType); + +}; + +#endif // _Aspect_HeaderFile diff --git a/src/Aspect/FILES b/src/Aspect/FILES index c63cdf036f..76cb7e6167 100755 --- a/src/Aspect/FILES +++ b/src/Aspect/FILES @@ -1,3 +1,5 @@ +Aspect.cxx +Aspect.hxx Aspect_AspectFillAreaDefinitionError.hxx Aspect_AspectLineDefinitionError.hxx Aspect_AspectMarkerDefinitionError.hxx diff --git a/src/BVH/BVH_Box.hxx b/src/BVH/BVH_Box.hxx index 920c278a41..6bd67e4fe0 100644 --- a/src/BVH/BVH_Box.hxx +++ b/src/BVH/BVH_Box.hxx @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -108,6 +109,18 @@ public: //! Returns center of bounding box along the given axis. T Center (const Standard_Integer theAxis) const; + //! Dumps the content of me on the stream . + void Dump (Standard_OStream& OS) const + { + DUMP_VALUES (OS, "BVH_Box", 2); + DUMP_VALUES (OS, "IsValid", IsValid()); + + DUMP_VALUES (OS, "Bnd_Box", BVH::ToBndBox (CornerMin(), CornerMax()).ToString()); + + //DUMP_VALUES (OS, "CornerMin", BVH::ToString (CornerMin())); + //DUMP_VALUES (OS, "CornerMin", BVH::ToString (CornerMax())); + } + public: //! Checks if the Box is out of the other box. diff --git a/src/BVH/BVH_Tree.hxx b/src/BVH/BVH_Tree.hxx index a223d14b30..9209fbac8b 100644 --- a/src/BVH/BVH_Tree.hxx +++ b/src/BVH/BVH_Tree.hxx @@ -18,6 +18,11 @@ #include +#include + +#include +#include + template class BVH_Builder; //! A non-template class for using as base for BVH_TreeBase @@ -27,6 +32,13 @@ class BVH_TreeBaseTransient : public Standard_Transient DEFINE_STANDARD_RTTIEXT(BVH_TreeBaseTransient, Standard_Transient) protected: BVH_TreeBaseTransient() {} + + //! Dumps the content of me on the stream . + virtual void Dump (Standard_OStream& OS) const { (void)OS; } + + //! Dumps the content of the given node on the stream . + virtual void DumpNode (const int theNodeIndex, Standard_OStream& OS) const + { (void)theNodeIndex; (void)OS; } }; //! Stores parameters of bounding volume hierarchy (BVH). @@ -178,6 +190,35 @@ public: //! @name methods for accessing serialized tree data return myMaxPointBuffer; } + + //! Dumps the content of me on the stream . + Standard_EXPORT virtual void Dump (Standard_OStream& OS) const Standard_OVERRIDE + { + DUMP_VALUES (OS, "BVH_Tree", 2); + + DUMP_VALUES (OS, "Depth", Depth()); + DUMP_VALUES (OS, "Length", Length()); + + for (Standard_Integer aNodeIdx = 0; aNodeIdx < Length(); ++aNodeIdx) + { + DumpNode (aNodeIdx, OS); + } + } + + //! Dumps the content of the given node on the stream . + Standard_EXPORT virtual void DumpNode (const int theNodeIndex, Standard_OStream& OS) const Standard_OVERRIDE + { + DUMP_VALUES (OS, "BVH_TreeNode", 2); + DUMP_VALUES (OS, "NodeIndex", theNodeIndex); + + DUMP_VALUES (OS, "MinPoint - MaxPoint", BVH::ToBndBox (MinPoint (theNodeIndex), MaxPoint (theNodeIndex)).ToString()); + + DUMP_VALUES (OS, "BegPrimitive", BegPrimitive (theNodeIndex)); + DUMP_VALUES (OS, "EndPrimitive", EndPrimitive (theNodeIndex)); + DUMP_VALUES (OS, "Level", Level (theNodeIndex)); + DUMP_VALUES (OS, "IsOuter", IsOuter (theNodeIndex)); + } + public: //! @name protected fields //! Array of node data records. diff --git a/src/BVH/BVH_Types.hxx b/src/BVH/BVH_Types.hxx index 6cbf7ae916..fcbc66bca1 100644 --- a/src/BVH/BVH_Types.hxx +++ b/src/BVH/BVH_Types.hxx @@ -21,10 +21,12 @@ #include +#include #include #include #include #include +#include #include // GCC supports shrink function only in C++11 mode @@ -57,6 +59,32 @@ namespace BVH typedef NCollection_Vec3 Type; }; + template Bnd_Box ToBndBox (const T& theType1, const T& theType2) + { + return Bnd_Box (theType1, 0., 0., theType2, 0., 0.); + } + + template Bnd_Box ToBndBox (const NCollection_Vec2& theType1, + const NCollection_Vec2& theType2) + { + return Bnd_Box (theType1.x(), theType1.y(), 0., + theType2.x(), theType2.y(), 0.); + } + + template Bnd_Box ToBndBox (const NCollection_Vec3& theType1, + const NCollection_Vec3& theType2) + { + return Bnd_Box (theType1.x(), theType1.y(), theType1.z(), + theType2.x(), theType2.y(), theType2.z()); + } + + template Bnd_Box ToBndBox (const NCollection_Vec4& theType1, + const NCollection_Vec4& theType2) + { + return Bnd_Box (theType1.x(), theType1.y(), theType1.z(), + theType2.x(), theType2.y(), theType2.z()); + } + template struct VectorType { typedef NCollection_Vec4 Type; diff --git a/src/Bnd/Bnd_Box.cxx b/src/Bnd/Bnd_Box.cxx index 3f9ea999ff..d7e67d141a 100644 --- a/src/Bnd/Bnd_Box.cxx +++ b/src/Bnd/Bnd_Box.cxx @@ -43,6 +43,19 @@ Bnd_Box::Bnd_Box() SetVoid(); } +//======================================================================= +//function : Bnd_Box +//purpose : +//======================================================================= + +Bnd_Box::Bnd_Box (const Standard_Real theXmin, const Standard_Real theYmin, const Standard_Real theZmin, + const Standard_Real theXmax, const Standard_Real theYmax, const Standard_Real theZmax) +: Gap (0.0) +{ + SetVoid(); + Update (theXmin, theYmin, theZmin, theXmax, theYmax, theZmax); +} + //======================================================================= //function : Set //purpose : @@ -957,3 +970,49 @@ void Bnd_Box::Dump () const cout << "\n Gap : " << Gap; cout << "\n"; } + +//======================================================================= +//function : PointsSeparator +//purpose : +//======================================================================= +TCollection_AsciiString PointsSeparator() +{ + return " - "; +} + +//======================================================================= +//function : ToString +//purpose : +//======================================================================= + +TCollection_AsciiString Bnd_Box::ToString() const +{ + return gp_XYZ (Xmin, Ymin, Zmin).ToString() + + PointsSeparator() + + gp_XYZ (Xmax, Ymax, Zmax).ToString(); +} + +//======================================================================= +//function : FromString +//purpose : +//======================================================================= + +Standard_Boolean Bnd_Box::FromString (const TCollection_AsciiString& theValue) +{ + TCollection_AsciiString aCurrentString = theValue; + Standard_Integer aPosition = aCurrentString.Search (PointsSeparator()); + if (aPosition < 0) + return Standard_False; + + TCollection_AsciiString aLeftString = aCurrentString; + TCollection_AsciiString aRightString = aLeftString.Split (aPosition - 1); + aCurrentString = aRightString; + aRightString = aCurrentString.Split (PointsSeparator().Length()); + + gp_XYZ aMinPoint, aMaxPoint; + if (!aMinPoint.FromString (aLeftString) || !aMaxPoint.FromString (aRightString)) + return Standard_False; + + Update (aMinPoint.X(), aMinPoint.Y(), aMinPoint.Z(), aMaxPoint.X(), aMaxPoint.Y(), aMaxPoint.Z()); + return Standard_True; +} diff --git a/src/Bnd/Bnd_Box.hxx b/src/Bnd/Bnd_Box.hxx index 834338f5bf..fcc9bbf082 100644 --- a/src/Bnd/Bnd_Box.hxx +++ b/src/Bnd/Bnd_Box.hxx @@ -24,6 +24,10 @@ #include #include #include + +#include +#include + class Standard_ConstructionError; class gp_Pnt; class gp_Dir; @@ -69,6 +73,14 @@ public: //! The constructed box is qualified Void. Its gap is null. Standard_EXPORT Bnd_Box(); + //! Creates a bounding box, it contains: + //! - interval [ aXmin,aXmax ] in the "X Direction", + //! - interval [ aYmin,aYmax ] in the "Y Direction", + //! - interval [ aZmin,aZmax ] in the "Z Direction"; + //! The constructed box is qualified Void. Its gap is null. + Standard_EXPORT Bnd_Box (const Standard_Real aXmin, const Standard_Real aYmin, const Standard_Real aZmin, + const Standard_Real aXmax, const Standard_Real aYmax, const Standard_Real aZmax); + //! Sets this bounding box so that it covers the whole of 3D space. //! It is infinitely long in all directions. void SetWhole() { Flags = WholeMask; } @@ -296,6 +308,14 @@ public: && Xmax >= Xmin; } + //! Covers bounding box into string in format: (Xmin, Ymin, Zmin) - (Xmax, Ymax, Zmax) + //! \return the string value + Standard_EXPORT TCollection_AsciiString ToString() const; + + //! Converts text value into parameters if possible, the string format is: (Xmin, Ymin, Zmin) - (Xmax, Ymax, Zmax) + //! \return true if conversion is done + Standard_EXPORT Standard_Boolean FromString (const TCollection_AsciiString& theValue); + protected: //! Bit flags. diff --git a/src/Bnd/Bnd_OBB.cxx b/src/Bnd/Bnd_OBB.cxx index e9b7f36ea8..a37586bef6 100644 --- a/src/Bnd/Bnd_OBB.cxx +++ b/src/Bnd/Bnd_OBB.cxx @@ -677,3 +677,19 @@ void Bnd_OBB::Add(const Bnd_OBB& theOther) ReBuild(TColgp_Array1OfPnt(aList[0], 0, 15)); } +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +Standard_Boolean Bnd_OBB::Init (const Standard_OStream&) +{ + return Standard_False; +} + +// ======================================================================= +// function : Dump +// purpose : +// ======================================================================= +void Bnd_OBB::Dump (Standard_OStream&) const +{ +} diff --git a/src/Bnd/Bnd_OBB.hxx b/src/Bnd/Bnd_OBB.hxx index e561d2b299..86da8d3bb1 100644 --- a/src/Bnd/Bnd_OBB.hxx +++ b/src/Bnd/Bnd_OBB.hxx @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -288,6 +289,12 @@ protected: myCenter = theP.XYZ(); } + //! Dumps the content of me on the stream . + Standard_EXPORT Standard_Boolean Init (const Standard_OStream& OS); + + //! Dumps the content of me on the stream . + Standard_EXPORT void Dump (Standard_OStream& OS) const; + private: //! Center of the OBB diff --git a/src/Bnd/Bnd_Range.cxx b/src/Bnd/Bnd_Range.cxx index 63d0961343..6edacda768 100644 --- a/src/Bnd/Bnd_Range.cxx +++ b/src/Bnd/Bnd_Range.cxx @@ -174,4 +174,13 @@ void Bnd_Range::Split(const Standard_Real theVal, { theList.Append(Bnd_Range(aValPrev, myLast)); } -} \ No newline at end of file +} + +//======================================================================= +//function : ToString +//purpose : +//======================================================================= +TCollection_AsciiString Bnd_Range::ToString() const +{ + return TCollection_AsciiString ("[") + myFirst + ", " + myLast + "]"; +} diff --git a/src/Bnd/Bnd_Range.hxx b/src/Bnd/Bnd_Range.hxx index 0c006d27d9..a478e2f0a2 100644 --- a/src/Bnd/Bnd_Range.hxx +++ b/src/Bnd/Bnd_Range.hxx @@ -18,6 +18,7 @@ #include #include +#include #include @@ -256,6 +257,10 @@ public: return ((myFirst == theOther.myFirst) && (myLast == theOther.myLast)); } + //! Covers point into string in format: [myFirst, myLast] + //! \return the string value + Standard_EXPORT TCollection_AsciiString ToString() const; + private: Standard_Real myFirst; //!< Start of range diff --git a/src/Font/FILES b/src/Font/FILES index bf614b54a2..a4a267c1d5 100644 --- a/src/Font/FILES +++ b/src/Font/FILES @@ -1,3 +1,5 @@ +Font.cxx +Font.hxx Font_BRepFont.cxx Font_BRepFont.hxx Font_BRepTextBuilder.cxx diff --git a/src/Font/Font.cxx b/src/Font/Font.cxx new file mode 100644 index 0000000000..355447faa8 --- /dev/null +++ b/src/Font/Font.cxx @@ -0,0 +1,56 @@ +// Copyright (c) 2018 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 + +#include + +namespace +{ + static Standard_CString Font_Table_PrintFontAspect[5] = + { + "UNDEFINED", "REGULAR", "BOLD", "ITALIC", "BOLD_ITALIC" + }; + +} + +//======================================================================= +//function : FontAspectToString +//purpose : +//======================================================================= +Standard_CString Font::FontAspectToString (Font_FontAspect theType) +{ + return Font_Table_PrintFontAspect[theType]; +} + +//======================================================================= +//function : FontAspectFromString +//purpose : +//======================================================================= +Standard_Boolean Font::FontAspectFromString (Standard_CString theTypeString, + Font_FontAspect& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Font_FA_BoldItalic; ++aTypeIter) + { + Standard_CString aTypeName = Font_Table_PrintFontAspect[aTypeIter]; + if (aName == aTypeName) + { + theType = Font_FontAspect (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + diff --git a/src/Font/Font.hxx b/src/Font/Font.hxx new file mode 100644 index 0000000000..6abf4a28bc --- /dev/null +++ b/src/Font/Font.hxx @@ -0,0 +1,54 @@ +// Copyright (c) 2018 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 _Font_HeaderFile +#define _Font_HeaderFile + +#include +#include +#include +#include + +//! Provides methods to cast enumerations of package to string value +class Font +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString FontAspectToString (Font_FontAspect theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Aspect_TOFM_BOTH_SIDE if string identifier is invalid + static Font_FontAspect FontAspectFromString (Standard_CString theTypeString) + { + Font_FontAspect aType = Font_FA_Undefined; + FontAspectFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean FontAspectFromString (const Standard_CString theTypeString, + Font_FontAspect& theType); + + +}; + +#endif // _Font_HeaderFile diff --git a/src/Graphic3d/FILES b/src/Graphic3d/FILES index f3e0acb83f..e91bbbcf42 100755 --- a/src/Graphic3d/FILES +++ b/src/Graphic3d/FILES @@ -1,3 +1,5 @@ +Graphic3d.cxx +Graphic3d.hxx Graphic3d_AlphaMode.hxx Graphic3d_ArrayFlags.hxx Graphic3d_ArrayOfPoints.hxx diff --git a/src/Graphic3d/Graphic3d.cxx b/src/Graphic3d/Graphic3d.cxx new file mode 100644 index 0000000000..19e05b2e8f --- /dev/null +++ b/src/Graphic3d/Graphic3d.cxx @@ -0,0 +1,521 @@ +// Copyright (c) 2018 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 + +#include + +namespace +{ + static Standard_CString Graphic3d_Table_PrintZLayerId[6] = + { + "INKNOWN", "DEFAULT", "TOP", "TOPMOST", "TOP_OSD", "BOT_OSD" + }; + + static Standard_CString Graphic3d_Table_PrintHorizontalTextAlignment[3] = + { + "LEFT", "CENTER", "RIGHT" + }; + + static Standard_CString Graphic3d_Table_PrintVerticalTextAlignment[4] = + { + "BOTTOM", "CENTER", "TOP", "TOP_FIRST_LINE" + }; + + static Standard_CString Graphic3d_Table_PrintTextPath[4] = + { + "UP", "DOWN", "LEFT", "RIGHT" + }; + + static Standard_CString Graphic3d_Table_PrintAlphaMode[4] = + { + "BLEND_AUTO", "OPAQUE", "MASK", "BLEND" + }; + + static Standard_CString Graphic3d_Table_PrintTypeOfShadingModel[5] = + { + "DEFAULT", "UNLIT", "FACET", "VERTEX", "FRAGMENT" + }; + + static Standard_CString Graphic3d_Table_PrintTypeOfAttribute[5] = + { + "POS", "NORM", "UV", "COLOR", "CUSTOM" + }; + + static Standard_CString Graphic3d_Table_PrintTypeOfData[7] = + { + "USHORT", "UINT", "VEC2", "VEC3", "VEC4", "VEC4UB", "FLOAT" + }; + + static Standard_CString Graphic3d_Table_PrintTransModeFlags[6] = + { + "NONE", "ZOOM_PERS", "ROTATE_PERS", "TRIEDRON_PERS", "2d", "ZOOM_ROTATE_PERS" + }; + + static Standard_CString Graphic3d_Table_PrintCameraProjection[5] = + { + "ORTHOGRAPHIC", "PERSPECTIVE", "STEREO", "MONOLEFTEYE", "MONORIGHTEYE" + }; + + static Standard_CString Graphic3d_Table_PrintFocusType[2] = + { + "ABSOLUTE", "RELATIVE" + }; + + static Standard_CString Graphic3d_Table_PrintIODType[2] = + { + "ABSOLUTE", "RELATIVE" + }; + + static Standard_CString Graphic3d_Table_PrintNameOfMaterial[26] = + { + "BRASS", "BRONZE", "COPPER", "GOLD", "PEWTER", "PLASTER", "PLASTIC", "SILVER", // 8 + "STEEL", "STONE", "SHINY_PLASTIC", "SATIN", "METALIZED", "NEON_GNC", "CHROME", // 7 + "ALUMINIUM", "OBSIDIAN", "NEON_PHC", "JADE", "CHARCOAL", "WATER", "GLASS", // 7 + "DIAMOND", "TRANSPARENT", "DEFAULT", "UserDefined" // 4 + }; +} + +//======================================================================= +//function : ZLayerIdToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId theType) +{ + switch (theType) + { + case Graphic3d_ZLayerId_UNKNOWN: return Graphic3d_Table_PrintZLayerId[0]; break; + case Graphic3d_ZLayerId_Default: return Graphic3d_Table_PrintZLayerId[1]; break; + case Graphic3d_ZLayerId_Top: return Graphic3d_Table_PrintZLayerId[2]; break; + case Graphic3d_ZLayerId_Topmost: return Graphic3d_Table_PrintZLayerId[3]; break; + case Graphic3d_ZLayerId_TopOSD: return Graphic3d_Table_PrintZLayerId[4]; break; + case Graphic3d_ZLayerId_BotOSD: return Graphic3d_Table_PrintZLayerId[5]; break; + } + return ""; +} + +//======================================================================= +//function : ZLayerIdFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::ZLayerIdFromString (Standard_CString theTypeString, + Graphic3d_ZLayerId& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= 5; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintZLayerId[aTypeIter]; + if (aName == aTypeName) + { + switch (aTypeIter) + { + case 0: theType = Graphic3d_ZLayerId_UNKNOWN; break; + case 1: theType = Graphic3d_ZLayerId_Default; break; + case 2: theType = Graphic3d_ZLayerId_Top; break; + case 3: theType = Graphic3d_ZLayerId_Topmost; break; + case 4: theType = Graphic3d_ZLayerId_TopOSD; break; + case 5: theType = Graphic3d_ZLayerId_BotOSD; break; + } + return Standard_True; + } + } + + if (aName.IsIntegerValue()) + { + theType = aName.IntegerValue(); + return Standard_True; + } + + return Standard_False; +} + +//======================================================================= +//function : HorizontalTextAlignmentToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::HorizontalTextAlignmentToString (Graphic3d_HorizontalTextAlignment theType) +{ + return Graphic3d_Table_PrintHorizontalTextAlignment[theType]; +} + +//======================================================================= +//function : HorizontalTextAlignmentFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::HorizontalTextAlignmentFromString (Standard_CString theTypeString, + Graphic3d_HorizontalTextAlignment& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_HTA_LEFT; aTypeIter <= Graphic3d_HTA_RIGHT; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintHorizontalTextAlignment[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_HorizontalTextAlignment (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : VerticalTextAlignmentToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::VerticalTextAlignmentToString (Graphic3d_VerticalTextAlignment theType) +{ + return Graphic3d_Table_PrintVerticalTextAlignment[theType]; +} + +//======================================================================= +//function : VerticalTextAlignmentFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::VerticalTextAlignmentFromString (Standard_CString theTypeString, + Graphic3d_VerticalTextAlignment& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_VTA_BOTTOM; aTypeIter <= Graphic3d_VTA_TOPFIRSTLINE; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintVerticalTextAlignment[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_VerticalTextAlignment (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TextPathToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::TextPathToString (Graphic3d_TextPath theType) +{ + return Graphic3d_Table_PrintTextPath[theType]; +} + +//======================================================================= +//function : TextPathFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::TextPathFromString (Standard_CString theTypeString, + Graphic3d_TextPath& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_TP_UP; aTypeIter <= Graphic3d_TP_RIGHT; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintTextPath[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_TextPath (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : AlphaModeToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::AlphaModeToString (Graphic3d_AlphaMode theType) +{ + return Graphic3d_Table_PrintAlphaMode[theType + 1]; +} + +//======================================================================= +//function : AlphaModeFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::AlphaModeFromString (Standard_CString theTypeString, + Graphic3d_AlphaMode& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_AlphaMode_BlendAuto; aTypeIter <= Graphic3d_AlphaMode_Blend; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintAlphaMode[aTypeIter + 1]; + if (aName == aTypeName) + { + theType = Graphic3d_AlphaMode (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfShadingModelToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::TypeOfShadingModelToString (Graphic3d_TypeOfShadingModel theType) +{ + return Graphic3d_Table_PrintTypeOfShadingModel[theType + 1]; +} + +//======================================================================= +//function : TypeOfShadingModelFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::TypeOfShadingModelFromString (Standard_CString theTypeString, + Graphic3d_TypeOfShadingModel& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_TOSM_DEFAULT; aTypeIter <= Graphic3d_TOSM_FRAGMENT; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintTypeOfShadingModel[aTypeIter + 1]; + if (aName == aTypeName) + { + theType = Graphic3d_TypeOfShadingModel (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfAttributeToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::TypeOfAttributeToString (Graphic3d_TypeOfAttribute theType) +{ + return Graphic3d_Table_PrintTypeOfAttribute[theType]; +} + +//======================================================================= +//function : TypeOfAttributeFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::TypeOfAttributeFromString (Standard_CString theTypeString, + Graphic3d_TypeOfAttribute& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_TOA_POS; aTypeIter <= Graphic3d_TOA_CUSTOM; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintTypeOfAttribute[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_TypeOfAttribute (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfDataToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::TypeOfDataToString (Graphic3d_TypeOfData theType) +{ + return Graphic3d_Table_PrintTypeOfData[theType]; +} + +//======================================================================= +//function : TypeOfDataFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::TypeOfDataFromString (Standard_CString theTypeString, + Graphic3d_TypeOfData& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_TOD_USHORT; aTypeIter <= Graphic3d_TOD_FLOAT; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintTypeOfData[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_TypeOfData (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TransModeFlagsToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::TransModeFlagsToString (Graphic3d_TransModeFlags theType) +{ + switch (theType) + { + case Graphic3d_TMF_None: return Graphic3d_Table_PrintTransModeFlags[0]; break; + case Graphic3d_TMF_ZoomPers: return Graphic3d_Table_PrintTransModeFlags[1]; break; + case Graphic3d_TMF_RotatePers: return Graphic3d_Table_PrintTransModeFlags[2]; break; + case Graphic3d_TMF_TriedronPers: return Graphic3d_Table_PrintTransModeFlags[3]; break; + case Graphic3d_TMF_2d: return Graphic3d_Table_PrintTransModeFlags[4]; break; + case Graphic3d_TMF_ZoomRotatePers: return Graphic3d_Table_PrintTransModeFlags[5]; break; + } + return ""; +} + +//======================================================================= +//function : ZLayerIdFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::TransModeFlagsFromString (Standard_CString theTypeString, + Graphic3d_TransModeFlags& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= 5; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintTransModeFlags[aTypeIter]; + if (aName == aTypeName) + { + switch (aTypeIter) + { + case 0: theType = Graphic3d_TMF_None; break; + case 1: theType = Graphic3d_TMF_ZoomPers; break; + case 2: theType = Graphic3d_TMF_RotatePers; break; + case 3: theType = Graphic3d_TMF_TriedronPers; break; + case 4: theType = Graphic3d_TMF_2d; break; + case 5: theType = Graphic3d_TMF_ZoomRotatePers; break; + } + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : CameraProjectionToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::CameraProjectionToString (Graphic3d_Camera::Projection theType) +{ + return Graphic3d_Table_PrintCameraProjection[theType]; +} + +//======================================================================= +//function : CameraProjectionFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::CameraProjectionFromString (Standard_CString theTypeString, + Graphic3d_Camera::Projection& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_Camera::Projection_Orthographic; + aTypeIter <= Graphic3d_Camera::Projection_MonoRightEye; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintCameraProjection[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_Camera::Projection (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : CameraFocusTypeToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::CameraFocusTypeToString (Graphic3d_Camera::FocusType theType) +{ + return Graphic3d_Table_PrintFocusType[theType]; +} + +//======================================================================= +//function : FocusTypeFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::CameraFocusTypeFromString (Standard_CString theTypeString, + Graphic3d_Camera::FocusType& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_Camera::FocusType_Absolute; + aTypeIter <= Graphic3d_Camera::FocusType_Relative; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintFocusType[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_Camera::FocusType (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : CameraIODTypeToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::CameraIODTypeToString (Graphic3d_Camera::IODType theType) +{ + return Graphic3d_Table_PrintIODType[theType]; +} + +//======================================================================= +//function : IODTypeFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::CameraIODTypeFromString (Standard_CString theTypeString, + Graphic3d_Camera::IODType& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_Camera::IODType_Absolute; + aTypeIter <= Graphic3d_Camera::IODType_Relative; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintIODType[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_Camera::IODType (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : NameOfMaterialToString +//purpose : +//======================================================================= +Standard_CString Graphic3d::NameOfMaterialToString (Graphic3d_NameOfMaterial theType) +{ + return Graphic3d_Table_PrintNameOfMaterial[theType]; +} + +//======================================================================= +//function : NameOfMaterialFromString +//purpose : +//======================================================================= +Standard_Boolean Graphic3d::NameOfMaterialFromString (Standard_CString theTypeString, + Graphic3d_NameOfMaterial& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = Graphic3d_TOD_USHORT; aTypeIter <= Graphic3d_TOD_FLOAT; ++aTypeIter) + { + Standard_CString aTypeName = Graphic3d_Table_PrintNameOfMaterial[aTypeIter]; + if (aName == aTypeName) + { + theType = Graphic3d_NameOfMaterial (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} diff --git a/src/Graphic3d/Graphic3d.hxx b/src/Graphic3d/Graphic3d.hxx new file mode 100644 index 0000000000..db14f2f150 --- /dev/null +++ b/src/Graphic3d/Graphic3d.hxx @@ -0,0 +1,327 @@ +// Copyright (c) 2018 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 _Graphic3d_HeaderFile +#define _Graphic3d_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +//! Provides methods to cast enumerations of package to string value +class Graphic3d +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString ZLayerIdToString (Graphic3d_ZLayerId theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_ZLayerId_UNKNOWN if string identifier is invalid + static Graphic3d_ZLayerId ZLayerIdFromString (Standard_CString theTypeString) + { + Graphic3d_ZLayerId aType = Graphic3d_ZLayerId_UNKNOWN; + ZLayerIdFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean ZLayerIdFromString (const Standard_CString theTypeString, + Graphic3d_ZLayerId& theType); + + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString HorizontalTextAlignmentToString (Graphic3d_HorizontalTextAlignment theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_HTA_LEFT if string identifier is invalid + static Graphic3d_HorizontalTextAlignment HorizontalTextAlignmentFromString (Standard_CString theTypeString) + { + Graphic3d_HorizontalTextAlignment aType = Graphic3d_HTA_LEFT; + HorizontalTextAlignmentFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean HorizontalTextAlignmentFromString (const Standard_CString theTypeString, + Graphic3d_HorizontalTextAlignment& theType); + + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString VerticalTextAlignmentToString (Graphic3d_VerticalTextAlignment theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_VTA_BOTTOM if string identifier is invalid + static Graphic3d_VerticalTextAlignment VerticalTextAlignmentFromString (Standard_CString theTypeString) + { + Graphic3d_VerticalTextAlignment aType = Graphic3d_VTA_BOTTOM; + VerticalTextAlignmentFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean VerticalTextAlignmentFromString (const Standard_CString theTypeString, + Graphic3d_VerticalTextAlignment& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TextPathToString (Graphic3d_TextPath theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_TP_UP if string identifier is invalid + static Graphic3d_TextPath TextPathFromString (Standard_CString theTypeString) + { + Graphic3d_TextPath aType = Graphic3d_TP_UP; + TextPathFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TextPathFromString (const Standard_CString theTypeString, + Graphic3d_TextPath& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString AlphaModeToString (Graphic3d_AlphaMode theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_AlphaMode_Opaque if string identifier is invalid + static Graphic3d_AlphaMode AlphaModeFromString (Standard_CString theTypeString) + { + Graphic3d_AlphaMode aType = Graphic3d_AlphaMode_Opaque; + AlphaModeFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean AlphaModeFromString (const Standard_CString theTypeString, + Graphic3d_AlphaMode& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfShadingModelToString (Graphic3d_TypeOfShadingModel theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_TOSM_DEFAULT if string identifier is invalid + static Graphic3d_TypeOfShadingModel TypeOfShadingModelFromString (Standard_CString theTypeString) + { + Graphic3d_TypeOfShadingModel aType = Graphic3d_TOSM_DEFAULT; + TypeOfShadingModelFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfShadingModelFromString (const Standard_CString theTypeString, + Graphic3d_TypeOfShadingModel& theType); + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfAttributeToString (Graphic3d_TypeOfAttribute theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_TOA_POS if string identifier is invalid + static Graphic3d_TypeOfAttribute TypeOfAttributeFromString (Standard_CString theTypeString) + { + Graphic3d_TypeOfAttribute aType = Graphic3d_TOA_POS; + TypeOfAttributeFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfAttributeFromString (const Standard_CString theTypeString, + Graphic3d_TypeOfAttribute& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfDataToString (Graphic3d_TypeOfData theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_TOSM_DEFAULT if string identifier is invalid + static Graphic3d_TypeOfData TypeOfDataFromString (Standard_CString theTypeString) + { + Graphic3d_TypeOfData aType = Graphic3d_TOD_USHORT; + TypeOfDataFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfDataFromString (const Standard_CString theTypeString, + Graphic3d_TypeOfData& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TransModeFlagsToString (Graphic3d_TransModeFlags theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Graphic3d_TOSM_DEFAULT if string identifier is invalid + static Graphic3d_TransModeFlags TransModeFlagsFromString (Standard_CString theTypeString) + { + Graphic3d_TransModeFlags aType = Graphic3d_TMF_None; + TransModeFlagsFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TransModeFlagsFromString (const Standard_CString theTypeString, + Graphic3d_TransModeFlags& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString CameraProjectionToString (Graphic3d_Camera::Projection theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Projection_Orthographic if string identifier is invalid + static Graphic3d_Camera::Projection CameraProjectionFromString (Standard_CString theTypeString) + { + Graphic3d_Camera::Projection aType = Graphic3d_Camera::Projection_Orthographic; + CameraProjectionFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean CameraProjectionFromString (const Standard_CString theTypeString, + Graphic3d_Camera::Projection& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString CameraFocusTypeToString (Graphic3d_Camera::FocusType theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or FocusType_Absolute if string identifier is invalid + static Graphic3d_Camera::FocusType CameraFocusTypeFromString (Standard_CString theTypeString) + { + Graphic3d_Camera::FocusType aType = Graphic3d_Camera::FocusType_Absolute; + CameraFocusTypeFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean CameraFocusTypeFromString (const Standard_CString theTypeString, + Graphic3d_Camera::FocusType& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString CameraIODTypeToString (Graphic3d_Camera::IODType theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or IODType_Absolute if string identifier is invalid + static Graphic3d_Camera::IODType CameraIODTypeFromString (Standard_CString theTypeString) + { + Graphic3d_Camera::IODType aType = Graphic3d_Camera::IODType_Absolute; + CameraIODTypeFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean CameraIODTypeFromString (const Standard_CString theTypeString, + Graphic3d_Camera::IODType& theType); + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString NameOfMaterialToString (Graphic3d_NameOfMaterial theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or IODType_Absolute if string identifier is invalid + static Graphic3d_NameOfMaterial NameOfMaterialFromString (Standard_CString theTypeString) + { + Graphic3d_NameOfMaterial aType = Graphic3d_NOM_BRASS; + NameOfMaterialFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean NameOfMaterialFromString (const Standard_CString theTypeString, + Graphic3d_NameOfMaterial& theType); +}; + +#endif // _Graphic3d_HeaderFile diff --git a/src/Message/FILES b/src/Message/FILES index fe9884e26d..e52f824502 100755 --- a/src/Message/FILES +++ b/src/Message/FILES @@ -4,17 +4,16 @@ Message_Alert.cxx Message_Alert.hxx Message_AlertExtended.cxx Message_AlertExtended.hxx +Message_Alerts.hxx Message_Algorithm.cxx Message_Algorithm.hxx Message_Algorithm.lxx -Message_Attribute.hxx Message_Attribute.cxx -Message_AttributeObject.hxx +Message_Attribute.hxx Message_AttributeObject.cxx -Message_AttributeVectorOfReal.hxx -Message_AttributeVectorOfReal.cxx -Message_AttributeVectorOfRealVec3.hxx -Message_AttributeVectorOfRealVec3.cxx +Message_AttributeObject.hxx +Message_AttributeVectorOfValues.cxx +Message_AttributeVectorOfValues.hxx Message_CompositeAlerts.cxx Message_CompositeAlerts.hxx Message_ExecStatus.hxx diff --git a/src/Message/Message.cxx b/src/Message/Message.cxx index cbaa470231..c04816e92c 100644 --- a/src/Message/Message.cxx +++ b/src/Message/Message.cxx @@ -89,3 +89,264 @@ Standard_Boolean Message::GravityFromString (const Standard_CString theGravitySt } return Standard_False; } + +// ======================================================================= +// function : GetPointerInfo +// purpose : +// ======================================================================= +TCollection_AsciiString Message::TransientToString (const Handle(Standard_Transient)& thePointer, const bool isShortInfo) +{ + if (thePointer.IsNull()) + return TCollection_AsciiString(); + + return PointerToString(thePointer.operator->(), isShortInfo); +} + +// ======================================================================= +// function : GetPointerInfo +// purpose : +// ======================================================================= +TCollection_AsciiString Message::PointerToString (const void* thePointer, const bool isShortInfo) +{ + std::ostringstream aPtrStr; + aPtrStr << thePointer; + 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 : StrVectorToString +// purpose : +// ======================================================================= +TCollection_AsciiString Message::StrVectorToString + (const NCollection_Vector& theValues) +{ + TCollection_AsciiString aValue; + for (NCollection_Vector::Iterator aValuesIt (theValues); aValuesIt.More(); aValuesIt.Next()) + { + aValue += aValuesIt.Value(); + if (aValuesIt.More()) + aValue += VectorSeparator(); + } + return aValue; +} + +// ======================================================================= +// function : StrVectorFromString +// purpose : +// ======================================================================= +Standard_Boolean Message::StrVectorFromString + (const TCollection_AsciiString& theValue, + NCollection_Vector& theValues) +{ + TCollection_AsciiString aCurrentString = theValue, aValueString; + + while (!aCurrentString.IsEmpty()) + { + Standard_Integer aPosition = aCurrentString.Search (", "); + aValueString = aCurrentString; + if (aPosition > 0) + aCurrentString = aValueString.Split (aPosition - 1); + theValues.Append (aValueString.RealValue()); + if (aPosition > 0) + aCurrentString = aCurrentString.Split (2); + } + return Standard_True; +} + +// ======================================================================= +// function : RealVectorToString +// purpose : +// ======================================================================= +TCollection_AsciiString Message::RealVectorToString + (const NCollection_Vector& theValues) +{ + TCollection_AsciiString aValue = ("("); + + for (NCollection_Vector::Iterator aValuesIt (theValues); aValuesIt.More(); aValuesIt.Next()) + { + aValue += aValuesIt.Value(); + if (aValuesIt.More()) + aValue += VectorSeparator(); + } + aValue += ")"; + + return aValue; +} + +// ======================================================================= +// function : RealVectorFromString +// purpose : +// ======================================================================= +Standard_Boolean Message::RealVectorFromString + (const TCollection_AsciiString& theValue, + NCollection_Vector& theValues) +{ + TCollection_AsciiString aCurrentString = theValue, aValueString; + + Standard_Integer aPosition = aCurrentString.Search ("("); + if (aPosition != 1) + return Standard_False; + aCurrentString = aCurrentString.Split (aPosition); + + aPosition = aCurrentString.Search (")"); + if (aPosition != 1) + return Standard_False; + aValueString = aCurrentString.Split (aPosition); + + + while (!aCurrentString.IsEmpty()) + { + // x value + aPosition = aCurrentString.Search (", "); + aValueString = aCurrentString; + if (aPosition > 0) + aCurrentString = aValueString.Split (aPosition - 1); + theValues.Append (aValueString.RealValue()); + if (aPosition > 0) + aCurrentString = aCurrentString.Split (2); + } + return Standard_True; +} + +// ======================================================================= +// function : CoordVectorToString +// purpose : +// ======================================================================= +TCollection_AsciiString Message::CoordVectorToString + (const NCollection_Vector& theValues) +{ + TCollection_AsciiString aValue = ("("); + aValue += RealVectorToString (theValues); + aValue += ")"; + + return aValue; +} + +// ======================================================================= +// function : CoordVectorFromString +// purpose : +// ======================================================================= +Standard_Boolean Message::CoordVectorFromString + (const TCollection_AsciiString& theValue, + NCollection_Vector& theValues) +{ + TCollection_AsciiString aCurrentString = theValue, aValueString; + + Standard_Integer aPosition = aCurrentString.Search ("("); + if (aPosition != 1) + return Standard_False; + aCurrentString = aCurrentString.Split (aPosition); + + aPosition = aCurrentString.Search (")"); + if (aPosition != 1) + return Standard_False; + aValueString = aCurrentString.Split (aPosition); + + return RealVectorFromString (aCurrentString, theValues); +} + +// ======================================================================= +// function : ColorVectorToString +// purpose : +// ======================================================================= +TCollection_AsciiString Message::ColorVectorToString + (const NCollection_Vector& theValues) +{ + TCollection_AsciiString aValue = ("["); + aValue += RealVectorToString (theValues); + aValue += "]"; + + return aValue; +} + +// ======================================================================= +// function : ColorVectorFromString +// purpose : +// ======================================================================= +Standard_Boolean Message::ColorVectorFromString + (const TCollection_AsciiString& theValue, + NCollection_Vector& theValues) +{ + TCollection_AsciiString aCurrentString = theValue, aValueString; + + Standard_Integer aPosition = aCurrentString.Search ("["); + if (aPosition != 1) + return Standard_False; + aCurrentString = aCurrentString.Split (aPosition); + + aPosition = aCurrentString.Search ("]"); + if (aPosition != 1) + return Standard_False; + aValueString = aCurrentString.Split (aPosition); + + return RealVectorFromString (aCurrentString, theValues); +} + +// ======================================================================= +// function : ConvertStream +// purpose : +// ======================================================================= +void Message::ConvertStream (const Standard_SStream& theStream, + Standard_Integer& theColumnCount, + NCollection_Vector& theValues) +{ + TCollection_AsciiString aStream (theStream.str().c_str()); + Standard_Character aSeparator = Message::DumpSeparator(); + Standard_Integer aColumnCount = 0; + + TCollection_AsciiString aCurrentString = aStream; + Standard_Integer aPosition = aCurrentString.Search (aSeparator); + if (aPosition >= 1) + { + TCollection_AsciiString aTailString = aCurrentString.Split (aPosition); + Standard_Boolean aClassNameFound = Standard_False; + while (!aCurrentString.IsEmpty()) + { + TCollection_AsciiString aValueString = aCurrentString; + aPosition = aValueString.Search (aSeparator); + if (aPosition < 0 ) + break; + aCurrentString = aValueString.Split (aPosition - 1); + + if (!aColumnCount) + { + if (!aClassNameFound) + aClassNameFound = Standard_True; + else + { + if (!aValueString.IsIntegerValue()) + break; // not correct Dump, in correct the first value is number of property columns + aColumnCount = aValueString.IntegerValue(); + } + } + else + theValues.Append (aValueString); + + if (aTailString.IsEmpty()) + break; + aCurrentString = aTailString; + aPosition = aCurrentString.Search (aSeparator); + if (aPosition < 0 ) + { + aCurrentString = aTailString; + aTailString = TCollection_AsciiString(); + } + else + aTailString = aCurrentString.Split (aPosition); + } + } + theColumnCount = aColumnCount; +} diff --git a/src/Message/Message.hxx b/src/Message/Message.hxx index 1d78005932..7f9c44a5ab 100644 --- a/src/Message/Message.hxx +++ b/src/Message/Message.hxx @@ -18,6 +18,7 @@ #define _Message_HeaderFile #include +#include #include #include @@ -25,8 +26,9 @@ #include #include +#include + class Message_Messenger; -class TCollection_AsciiString; class Message_Msg; class Message_MsgFile; class Message_Messenger; @@ -83,7 +85,84 @@ public: Standard_EXPORT static Standard_Boolean GravityFromString (const Standard_CString theGravityString, Message_Gravity& theGravity); - + //! Returns separator symbol of Dump information + static Standard_Character DumpSeparator() { return '\\'; } + + //! Returns separator symbol of values vector union + static TCollection_AsciiString VectorSeparator() { return " ,"; } + + //! Convert handle 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 TransientToString (const Handle(Standard_Transient)& thePointer, + const bool isShortInfo = true); + + //! 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 PointerToString (const void* thePointer, + const bool isShortInfo = true); + //! Convert vector of real values to string, separator is vector separator + //! \param thePointer a container of real values + //! \return the string value + Standard_EXPORT static TCollection_AsciiString StrVectorToString + (const NCollection_Vector& theValues); + + //! Convert string to vector of real values, separator is vector separator + //! \param thePointer a container of real values + //! \return the string value + Standard_EXPORT static Standard_Boolean StrVectorFromString + (const TCollection_AsciiString& theValue, + NCollection_Vector& theValues); + + //! Convert vector of real values to string, separator is vector separator + //! \param thePointer a container of real values + //! \return the string value + Standard_EXPORT static TCollection_AsciiString RealVectorToString + (const NCollection_Vector& theValues); + + //! Convert string to vector of real values, separator is vector separator + //! \param thePointer a container of real values + //! \return the string value + Standard_EXPORT static Standard_Boolean RealVectorFromString + (const TCollection_AsciiString& theValue, + NCollection_Vector& theValues); + + //! Convert vector of real values to string, separator is vector separator + //! \param thePointer a container of real values + //! \return the string value + Standard_EXPORT static TCollection_AsciiString CoordVectorToString + (const NCollection_Vector& theValues); + + //! Convert string to vector of real values, separator is vector separator + //! \param thePointer a container of real values + //! \return the string value + Standard_EXPORT static Standard_Boolean CoordVectorFromString + (const TCollection_AsciiString& theValue, + NCollection_Vector& theValues); + + //! Convert vector of real values to string, separator is vector separator + //! \param thePointer a container of real values + //! \return the string value + Standard_EXPORT static TCollection_AsciiString ColorVectorToString + (const NCollection_Vector& theValues); + + //! Convert string to vector of real values, separator is vector separator + //! \param thePointer a container of real values + //! \return the string value + Standard_EXPORT static Standard_Boolean ColorVectorFromString + (const TCollection_AsciiString& theValue, + NCollection_Vector& theValues); + + //! Converts stream to vector of values and column count + //! \param theStream stream value + //! \param theColumnCount [out] number of columns + //! \param theValues [out] container of split values + static Standard_EXPORT void ConvertStream (const Standard_SStream& theStream, + Standard_Integer& theColumnCount, + NCollection_Vector& theValues); protected: diff --git a/src/Message/Message_Alerts.hxx b/src/Message/Message_Alerts.hxx new file mode 100644 index 0000000000..d1789025b2 --- /dev/null +++ b/src/Message/Message_Alerts.hxx @@ -0,0 +1,102 @@ +// 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 +#include +#include +#include +#include +#include + +#include +#include + +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_AlertExtended::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_AlertExtended::AddAlert (Message_Report::CurrentReport(), \ + new Message_AttributeObject (Object, Name, Description), PerfMeter, ParentAlert ); \ + } \ + } + +#define MESSAGE_INFO_VALUES(StreamValues, Name, Description, PerfMeter, ParentAlert) \ + { \ + if (!Message_Report::CurrentReport().IsNull() && \ + Message_Report::CurrentReport()->IsActive (Message_Info)) \ + { \ + OCCT_Message_Alert = Message_AlertExtended::AddAlert (Message_Report::CurrentReport(), \ + new Message_AttributeVectorOfValues (StreamValues, Name, Description), PerfMeter, ParentAlert ); \ + } \ + } + +#define DUMP_VALUE(OS, Value) \ + { \ + OS << Value << Message::DumpSeparator(); \ + } + +#define DUMP_VALUES_COLUMNS(OS, ObjectName, ColumnCount) \ + { \ + OS << ObjectName << Message::DumpSeparator() << ColumnCount << Message::DumpSeparator(); \ + } + +#define DUMP_VALUES(OS, Value1, Value2) \ + { \ + OS << Value1 << Message::DumpSeparator() << Value2 << Message::DumpSeparator(); \ + } + +#define DUMP_VEC_COLOR(Values, Value) \ + { \ + Value = Message::ColorVectorToString (aValues); \ + } + +#define DUMP_VEC_COLOR_SPLIT(Value, Values) \ + { \ + Message::ColorVectorFromString (Value, Values); \ + } + +#define DUMP_VEC_COORD(Values, Value) \ + { \ + Value = Message::CoordVectorToString (aValues); \ + } + +#define DUMP_VEC_COORD_SPLIT(Value, Values) \ + { \ + Message::CoordVectorFromString (Value, Values); \ + } + + +#define DUMP_VALUES_SPLIT(OS, ColumnCount, Values) \ + { \ + Message::ConvertStream (OS, aColumnCount, aValues); \ + } + +#endif // _Message_Alerts_HeaderFile diff --git a/src/Message/Message_AttributeVectorOfReal.cxx b/src/Message/Message_AttributeVectorOfReal.cxx deleted file mode 100644 index 0880b5b1a2..0000000000 --- a/src/Message/Message_AttributeVectorOfReal.cxx +++ /dev/null @@ -1,68 +0,0 @@ -// 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 - -#include -#include - -#include - -IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeVectorOfReal, Message_Attribute) - -//======================================================================= -//function : Message_AttributeVectorOfReal -//purpose : -//======================================================================= - -Message_AttributeVectorOfReal::Message_AttributeVectorOfReal (const NCollection_Vector& theValues, - const TCollection_AsciiString& theName, - const TCollection_AsciiString& theDescription) -: Message_Attribute(theName, theDescription) -{ - SetValues (theValues); -} - -//======================================================================= -//function : SetValues -//purpose : -//======================================================================= - -void Message_AttributeVectorOfReal::SetValues (const NCollection_Vector& theValues) -{ - myValues = theValues; - - myCachedValue = TCollection_AsciiString ("[") + (Standard_Integer)myValues.Length() + "] : "; - if (myValues.Length() < 2) - return; - - 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; -} - diff --git a/src/Message/Message_AttributeVectorOfReal.hxx b/src/Message/Message_AttributeVectorOfReal.hxx deleted file mode 100644 index ec0fa52da7..0000000000 --- a/src/Message/Message_AttributeVectorOfReal.hxx +++ /dev/null @@ -1,58 +0,0 @@ -// 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 -#include - -#include - -class Message_PerfMeter; -class Message_Report; - -//! Alert object storing container of Standard_Real values in its field -class Message_AttributeVectorOfReal : public Message_Attribute -{ -public: - - //! Constructor with string argument - Standard_EXPORT Message_AttributeVectorOfReal (const NCollection_Vector& theValues, - 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& theValues); - - //! Returns values - //! @return values - const NCollection_Vector& GetValues() const { return myValues; } - - //! Returns description of alert if it is set - //! @return alert description - virtual const TCollection_AsciiString& GetDescription() const; - - - // OCCT RTTI - DEFINE_STANDARD_RTTIEXT(Message_AttributeVectorOfReal, Message_Attribute) - -private: - NCollection_Vector myValues; //!< container of values - TCollection_AsciiString myCachedValue; //!< short description of the values in form: [size] : first ... last -}; - -#endif // _Message_AttributeVectorOfReal_HeaderFile diff --git a/src/Message/Message_AttributeVectorOfRealVec3.cxx b/src/Message/Message_AttributeVectorOfRealVec3.cxx deleted file mode 100644 index 36bb716b49..0000000000 --- a/src/Message/Message_AttributeVectorOfRealVec3.cxx +++ /dev/null @@ -1,69 +0,0 @@ -// 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 - -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeVectorOfRealVec3, Message_Attribute) - -//======================================================================= -//function : Message_AttributeVectorOfRealVec3 -//purpose : -//======================================================================= - -Message_AttributeVectorOfRealVec3::Message_AttributeVectorOfRealVec3 (const NCollection_Vector>& theValues, - const TCollection_AsciiString& theName, - const TCollection_AsciiString& theDescription) -: Message_Attribute (theName, theDescription) -{ - SetValues (theValues); -} - -//======================================================================= -//function : SetValues -//purpose : -//======================================================================= - -void Message_AttributeVectorOfRealVec3::SetValues (const NCollection_Vector>& theValues) -{ - myValues = theValues; - - myCachedValue = TCollection_AsciiString ("[") + (Standard_Integer)myValues.Length() + "] : "; - if (myValues.Length() < 2) - return; - - NCollection_Vec3 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; -} - diff --git a/src/Message/Message_AttributeVectorOfRealVec3.hxx b/src/Message/Message_AttributeVectorOfRealVec3.hxx deleted file mode 100644 index b47b80beed..0000000000 --- a/src/Message/Message_AttributeVectorOfRealVec3.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// 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 -#include - -#include -#include - -//! Alert object storing container of Standard_Real values in its field -class Message_AttributeVectorOfRealVec3 : public Message_Attribute -{ -public: - - //! Constructor with string argument - Standard_EXPORT Message_AttributeVectorOfRealVec3 (const NCollection_Vector>& theValues, - 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>& theValues); - - //! Returns values - //! @return values - const NCollection_Vector>& GetValues() const { return myValues; } - - //! Returns description of alert if it is set - //! @return alert description - virtual const TCollection_AsciiString& GetDescription() const; - - // OCCT RTTI - DEFINE_STANDARD_RTTIEXT(Message_AttributeVectorOfRealVec3, Message_Attribute) - -private: - NCollection_Vector> myValues; //!< container of values - TCollection_AsciiString myCachedValue; - TCollection_AsciiString myDescription; //!< short description of the values in form: [size] : first ... last -}; - -#endif // _Message_AttributeVectorOfRealVec3_HeaderFile diff --git a/src/Message/Message_AttributeVectorOfValues.cxx b/src/Message/Message_AttributeVectorOfValues.cxx new file mode 100644 index 0000000000..3d389a1f45 --- /dev/null +++ b/src/Message/Message_AttributeVectorOfValues.cxx @@ -0,0 +1,117 @@ +// 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 + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeVectorOfValues, Message_Attribute) + +//======================================================================= +//function : SetValues +//purpose : +//======================================================================= +Message_AttributeVectorOfValues::Message_AttributeVectorOfValues (const Standard_SStream& theStream, + const TCollection_AsciiString& theName, + const TCollection_AsciiString& theDescription) +: Message_Attribute(theName, theDescription) +{ + TCollection_AsciiString aStream (theStream.str().c_str()); + Standard_Character aSeparator = Message::DumpSeparator(); + Standard_Integer aColumnCount = 0; + + TCollection_AsciiString aCurrentString = aStream; + Standard_Integer aPosition = aCurrentString.Search (aSeparator); + if (aPosition >= 1) + { + TCollection_AsciiString aTailString = aCurrentString.Split (aPosition); + Standard_Boolean aClassNameFound = Standard_False; + while (!aCurrentString.IsEmpty()) + { + TCollection_AsciiString aValueString = aCurrentString; + aPosition = aValueString.Search (aSeparator); + if (aPosition < 0 ) + break; + aCurrentString = aValueString.Split (aPosition - 1); + + if (!aColumnCount) + { + if (!aClassNameFound) + aClassNameFound = Standard_True; + else + { + if (!aValueString.IsIntegerValue()) + break; // not correct Dump, in correct the first value is number of property columns + aColumnCount = aValueString.IntegerValue(); + } + } + else + myValues.Append (aValueString); + + if (aTailString.IsEmpty()) + break; + aCurrentString = aTailString; + aPosition = aCurrentString.Search (aSeparator); + if (aPosition < 0 ) + { + aCurrentString = aTailString; + aTailString = TCollection_AsciiString(); + } + else + aTailString = aCurrentString.Split (aPosition); + } + } + myColumnCount = aColumnCount; +} + +//======================================================================= +//function : SetValues +//purpose : +//======================================================================= + +void Message_AttributeVectorOfValues::SetValues (const NCollection_Vector& 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_AttributeVectorOfValues::GetDescription() const +{ + if (!Message_Attribute::GetDescription().IsEmpty()) + return Message_Attribute::GetDescription(); + + return myCachedValue; +} + diff --git a/src/Message/Message_AttributeVectorOfValues.hxx b/src/Message/Message_AttributeVectorOfValues.hxx new file mode 100644 index 0000000000..369991da6b --- /dev/null +++ b/src/Message/Message_AttributeVectorOfValues.hxx @@ -0,0 +1,68 @@ +// 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_AttributeVectorOfValues_HeaderFile +#define _Message_AttributeVectorOfValues_HeaderFile + +#include +#include + +#include + +class Message_PerfMeter; +class Message_Report; + +//! Alert object storing container of Standard_Real values in its field +class Message_AttributeVectorOfValues : public Message_Attribute +{ +public: + + //! Constructor with string argument + Standard_EXPORT Message_AttributeVectorOfValues (const Standard_SStream& theStream, + 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& theValues); + + //! Returns values + //! @return values + const NCollection_Vector& GetValues() const { return myValues; } + + //! Returns description of alert if it is set + //! @return alert description + virtual const TCollection_AsciiString& GetDescription() const; + + + //! 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; } + + // OCCT RTTI + DEFINE_STANDARD_RTTIEXT(Message_AttributeVectorOfValues, Message_Attribute) + +private: + NCollection_Vector 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_AttributeVectorOfValues_HeaderFile diff --git a/src/Message/Message_Report.cxx b/src/Message/Message_Report.cxx index ab3b9823d3..c56de714e0 100644 --- a/src/Message/Message_Report.cxx +++ b/src/Message/Message_Report.cxx @@ -26,6 +26,8 @@ IMPLEMENT_STANDARD_RTTIEXT(Message_Report,Standard_Transient) +static Handle(Message_Report) MyReport; + //======================================================================= //function : Message_Report //purpose : @@ -37,6 +39,18 @@ Message_Report::Message_Report () 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; +} + //======================================================================= //function : AddAlert //purpose : @@ -118,7 +132,7 @@ void Message_Report::AddAlert (const Message_Gravity theGravity, const Handle(Me // 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) + if (theParentAlert.IsNull() && aParentAlert.IsNull() && myLimit > 0 && aList.Extent() > myLimit) aList.RemoveFirst(); if (thePerfMeter) @@ -193,8 +207,8 @@ Handle(Message_Alert) Message_Report::getLastAlert (const Message_Gravity theGra anExtendedAlert = Handle(Message_AlertExtended)::DownCast (aLastAlert); if (anExtendedAlert.IsNull()) return aLastAlert; - if (anExtendedAlert->GetPerfMeter()) - aLastAlert = anExtendedAlert->GetPerfMeter()->GetAlert(); + //if (anExtendedAlert->GetPerfMeter()) + // aLastAlert = anExtendedAlert->GetPerfMeter()->GetAlert(); return aLastAlert; } diff --git a/src/Message/Message_Report.hxx b/src/Message/Message_Report.hxx index c3b8edf19a..d19c81aae8 100644 --- a/src/Message/Message_Report.hxx +++ b/src/Message/Message_Report.hxx @@ -56,6 +56,11 @@ public: //! 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); diff --git a/src/OpenGl/OpenGl_LayerList.cxx b/src/OpenGl/OpenGl_LayerList.cxx index 4aee97b5e0..2e13923b7f 100644 --- a/src/OpenGl/OpenGl_LayerList.cxx +++ b/src/OpenGl/OpenGl_LayerList.cxx @@ -177,15 +177,6 @@ OpenGl_LayerList::OpenGl_LayerList (const Standard_Integer theNbPriorities) myTransparentToProcess.Allocate (myLayers.Length()); } -//======================================================================= -//function : ~OpenGl_LayerList -//purpose : Destructor -//======================================================================= - -OpenGl_LayerList::~OpenGl_LayerList() -{ -} - //======================================================================= //function : SetFrustumCullingBVHBuilder //purpose : diff --git a/src/OpenGl/OpenGl_LayerList.hxx b/src/OpenGl/OpenGl_LayerList.hxx index 813bc47807..fad8b8bb77 100644 --- a/src/OpenGl/OpenGl_LayerList.hxx +++ b/src/OpenGl/OpenGl_LayerList.hxx @@ -25,8 +25,10 @@ #include #include +class OpenGl_FrameBuffer; class OpenGl_Structure; class OpenGl_Workspace; + struct OpenGl_GlobalLayerSettings; typedef NCollection_Sequence OpenGl_SequenceOfLayers; @@ -38,10 +40,10 @@ class OpenGl_LayerList public: //! Constructor - OpenGl_LayerList (const Standard_Integer theNbPriorities); + Standard_EXPORT OpenGl_LayerList (const Standard_Integer theNbPriorities); //! Destructor - virtual ~OpenGl_LayerList(); + virtual ~OpenGl_LayerList() {} //! Method returns the number of available priorities Standard_Integer NbPriorities() const { return myNbPriorities; } diff --git a/src/Prs3d/Prs3d.cxx b/src/Prs3d/Prs3d.cxx index 33f33fe10f..14c1f1b925 100644 --- a/src/Prs3d/Prs3d.cxx +++ b/src/Prs3d/Prs3d.cxx @@ -26,6 +26,57 @@ #include #include +namespace +{ + static Standard_CString Prs3d_Table_PrintTypeOfHighlight[7] = + { + "NONE", "SELECTED", "DYNAMIC", "LOCAL_SELECTED", "LOCAL_DYNAMIC", "SUB_INTENSITY", "NB" + }; + + static Standard_CString Prs3d_Table_PrintTypeOfHLR[3] = + { + "NOT_SET", "POLY_ALGO", "ALGO" + }; + + static Standard_CString Prs3d_Table_PrintVertexDrawMode[3] = + { + "ISOLATED", "ALL", "INHERITED" + }; + + static Standard_CString Prs3d_Table_PrintDatumParts[11] = + { + "ORIGIN", "X_AXIS", "Y_AXIS", "Z_AXIS", "X_ARROW", "Y_ARROW", "Z_ARROW", + "XOY_AXIS", "YOZ_AXIS", "XOZ_AXIS", "NONE" + }; + + static Standard_CString Prs3d_Table_PrintDatumAttribute[8] = + { + "X_AXIS_LENGTH", "Y_AXIS_LENGTH", "Z_AXIS_LENGTH", "SHADING_TUBE_RADIUS_PERCENT", + "SHADING_CONE_RADIUS_PERCENT", "SHADING_CONE_LENGTH_PERCENT", "SHADING_ORIGIN_RADIUS_PERCENT", + "SHADING_NUMBER_OF_FACETTES" + }; + + static Standard_CString Prs3d_Table_PrintDatumAxes[7] = + { + "X_AXIS", "Y_AXIS", "Z_AXIS", "XY_AXIS", "YZ_AXIS", "XZ_AXIS", "XYZ_AXIS" + }; + + static Standard_CString Prs3d_Table_PrintDimensionArrowOrientation[3] = + { + "INTERNAL", "EXTERNAL", "FIT" + }; + + static Standard_CString Prs3d_Table_PrintDimensionTextHorizontalPosition[4] = + { + "LEFT", "RIGHT", "CENTER", "FIT" + }; + + static Standard_CString Prs3d_Table_PrintDimensionTextVerticalPosition[3] = + { + "ABOVE", "BELOW", "CENTER" + }; +} + //======================================================================= //function : MatchSegment //purpose : @@ -145,3 +196,273 @@ void Prs3d::AddPrimitivesGroup (const Handle(Prs3d_Presentation)& thePrs, aGroup->AddPrimitiveArray (aPrims); } } + +//======================================================================= +//function : TypeOfHighlightToString +//purpose : +//======================================================================= +Standard_CString Prs3d::TypeOfHighlightToString (Prs3d_TypeOfHighlight theType) +{ + return Prs3d_Table_PrintTypeOfHighlight[theType]; +} + +//======================================================================= +//function : TypeOfHighlightFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::TypeOfHighlightFromString (Standard_CString theTypeString, + Prs3d_TypeOfHighlight& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_TypeOfHighlight_NB; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintTypeOfHighlight[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_TypeOfHighlight (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : TypeOfHLRToString +//purpose : +//======================================================================= +Standard_CString Prs3d::TypeOfHLRToString (Prs3d_TypeOfHLR theType) +{ + return Prs3d_Table_PrintTypeOfHLR[theType]; +} + +//======================================================================= +//function : TypeOfHLRFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::TypeOfHLRFromString (Standard_CString theTypeString, + Prs3d_TypeOfHLR& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_TOH_Algo; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintTypeOfHLR[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_TypeOfHLR (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : VertexDrawModeToString +//purpose : +//======================================================================= +Standard_CString Prs3d::VertexDrawModeToString (Prs3d_VertexDrawMode theType) +{ + return Prs3d_Table_PrintVertexDrawMode[theType]; +} + +//======================================================================= +//function : VertexDrawModeFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::VertexDrawModeFromString (Standard_CString theTypeString, + Prs3d_VertexDrawMode& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_VDM_Inherited; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintVertexDrawMode[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_VertexDrawMode (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : DatumPartsToString +//purpose : +//======================================================================= +Standard_CString Prs3d::DatumPartsToString (Prs3d_DatumParts theType) +{ + return Prs3d_Table_PrintDatumParts[theType]; +} + +//======================================================================= +//function : DatumPartsFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::DatumPartsFromString (Standard_CString theTypeString, + Prs3d_DatumParts& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DP_None; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintDatumParts[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_DatumParts (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : DatumAttributeToString +//purpose : +//======================================================================= +Standard_CString Prs3d::DatumAttributeToString (Prs3d_DatumAttribute theType) +{ + return Prs3d_Table_PrintDatumAttribute[theType]; +} + +//======================================================================= +//function : DatumAttributeFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::DatumAttributeFromString (Standard_CString theTypeString, + Prs3d_DatumAttribute& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DP_ShadingNumberOfFacettes; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintDatumAttribute[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_DatumAttribute (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : DatumAxesToString +//purpose : +//======================================================================= +Standard_CString Prs3d::DatumAxesToString (Prs3d_DatumAxes theType) +{ + return Prs3d_Table_PrintDatumAxes[theType]; +} + +//======================================================================= +//function : DatumAxesFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::DatumAxesFromString (Standard_CString theTypeString, + Prs3d_DatumAxes& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DA_XYZAxis; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintDatumAxes[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_DatumAxes (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : DimensionArrowOrientationToString +//purpose : +//======================================================================= +Standard_CString Prs3d::DimensionArrowOrientationToString (Prs3d_DimensionArrowOrientation theType) +{ + return Prs3d_Table_PrintDimensionArrowOrientation[theType]; +} + +//======================================================================= +//function : DimensionArrowOrientationFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::DimensionArrowOrientationFromString (Standard_CString theTypeString, + Prs3d_DimensionArrowOrientation& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DAO_Fit; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintDimensionArrowOrientation[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_DimensionArrowOrientation (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : DimensionTextHorizontalPositionToString +//purpose : +//======================================================================= +Standard_CString Prs3d::DimensionTextHorizontalPositionToString (Prs3d_DimensionTextHorizontalPosition theType) +{ + return Prs3d_Table_PrintDimensionTextHorizontalPosition[theType]; +} + +//======================================================================= +//function : DimensionTextHorizontalPositionFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::DimensionTextHorizontalPositionFromString (Standard_CString theTypeString, + Prs3d_DimensionTextHorizontalPosition& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DTHP_Fit; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintDimensionTextHorizontalPosition[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_DimensionTextHorizontalPosition (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : DimensionTextVerticalPositionToString +//purpose : +//======================================================================= +Standard_CString Prs3d::DimensionTextVerticalPositionToString (Prs3d_DimensionTextVerticalPosition theType) +{ + return Prs3d_Table_PrintDimensionTextVerticalPosition[theType]; +} + +//======================================================================= +//function : DimensionTextVerticalPositionFromString +//purpose : +//======================================================================= +Standard_Boolean Prs3d::DimensionTextVerticalPositionFromString (Standard_CString theTypeString, + Prs3d_DimensionTextVerticalPosition& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DTVP_Center; ++aTypeIter) + { + Standard_CString aTypeName = Prs3d_Table_PrintDimensionTextVerticalPosition[aTypeIter]; + if (aName == aTypeName) + { + theType = Prs3d_DimensionTextVerticalPosition (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} diff --git a/src/Prs3d/Prs3d.hxx b/src/Prs3d/Prs3d.hxx index 73e10d5300..d0916e8fe9 100644 --- a/src/Prs3d/Prs3d.hxx +++ b/src/Prs3d/Prs3d.hxx @@ -18,12 +18,25 @@ #define _Prs3d_HeaderFile #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include +#include +#include #include #include #include +#include class TopoDS_Shape; @@ -74,6 +87,204 @@ public: const Handle(Prs3d_LineAspect)& theAspect, Prs3d_NListOfSequenceOfPnt& thePolylines); + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString TypeOfHighlightToString (Prs3d_TypeOfHighlight theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_TypeOfHighlight_None if string identifier is invalid + static Prs3d_TypeOfHighlight TypeOfHighlightFromString (Standard_CString theTypeString) + { + Prs3d_TypeOfHighlight aType = Prs3d_TypeOfHighlight_None; + TypeOfHighlightFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfHighlightFromString (const Standard_CString theTypeString, + Prs3d_TypeOfHighlight& theType); + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString TypeOfHLRToString (Prs3d_TypeOfHLR theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_TOH_NotSet if string identifier is invalid + static Prs3d_TypeOfHLR TypeOfHLRFromString (Standard_CString theTypeString) + { + Prs3d_TypeOfHLR aType = Prs3d_TOH_NotSet; + TypeOfHLRFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfHLRFromString (const Standard_CString theTypeString, + Prs3d_TypeOfHLR& theType); + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString VertexDrawModeToString (Prs3d_VertexDrawMode theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_VDM_Isolated if string identifier is invalid + static Prs3d_VertexDrawMode VertexDrawModeFromString (Standard_CString theTypeString) + { + Prs3d_VertexDrawMode aType = Prs3d_VDM_Isolated; + VertexDrawModeFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean VertexDrawModeFromString (const Standard_CString theTypeString, + Prs3d_VertexDrawMode& theType); + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString DatumPartsToString (Prs3d_DatumParts theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_DP_None if string identifier is invalid + static Prs3d_DatumParts DatumPartsFromString (Standard_CString theTypeString) + { + Prs3d_DatumParts aType = Prs3d_DP_None; + DatumPartsFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean DatumPartsFromString (const Standard_CString theTypeString, + Prs3d_DatumParts& theType); + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString DatumAttributeToString (Prs3d_DatumAttribute theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_DA_XAxisLength if string identifier is invalid + static Prs3d_DatumAttribute DatumAttributeFromString (Standard_CString theTypeString) + { + Prs3d_DatumAttribute aType = Prs3d_DA_XAxisLength; + DatumAttributeFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean DatumAttributeFromString (const Standard_CString theTypeString, + Prs3d_DatumAttribute& theType); + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString DatumAxesToString (Prs3d_DatumAxes theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_DA_XAxis if string identifier is invalid + static Prs3d_DatumAxes DatumAxesFromString (Standard_CString theTypeString) + { + Prs3d_DatumAxes aType = Prs3d_DA_XAxis; + DatumAxesFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean DatumAxesFromString (const Standard_CString theTypeString, + Prs3d_DatumAxes& theType); + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString DimensionArrowOrientationToString (Prs3d_DimensionArrowOrientation theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_DAO_Internal if string identifier is invalid + static Prs3d_DimensionArrowOrientation DimensionArrowOrientationFromString (Standard_CString theTypeString) + { + Prs3d_DimensionArrowOrientation aType = Prs3d_DAO_Internal; + DimensionArrowOrientationFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean DimensionArrowOrientationFromString (const Standard_CString theTypeString, + Prs3d_DimensionArrowOrientation& theType); + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString DimensionTextHorizontalPositionToString (Prs3d_DimensionTextHorizontalPosition theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_DTHP_Left if string identifier is invalid + static Prs3d_DimensionTextHorizontalPosition DimensionTextHorizontalPositionFromString (Standard_CString theTypeString) + { + Prs3d_DimensionTextHorizontalPosition aType = Prs3d_DTHP_Left; + DimensionTextHorizontalPositionFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean DimensionTextHorizontalPositionFromString (const Standard_CString theTypeString, + Prs3d_DimensionTextHorizontalPosition& theType); + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString DimensionTextVerticalPositionToString (Prs3d_DimensionTextVerticalPosition theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or Prs3d_DTVP_Above if string identifier is invalid + static Prs3d_DimensionTextVerticalPosition DimensionTextVerticalPositionFromString (Standard_CString theTypeString) + { + Prs3d_DimensionTextVerticalPosition aType = Prs3d_DTVP_Above; + DimensionTextVerticalPositionFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean DimensionTextVerticalPositionFromString (const Standard_CString theTypeString, + Prs3d_DimensionTextVerticalPosition& theType); + }; #endif // _Prs3d_HeaderFile diff --git a/src/PrsMgr/FILES b/src/PrsMgr/FILES index e09bd0bdbc..6134d27bd6 100644 --- a/src/PrsMgr/FILES +++ b/src/PrsMgr/FILES @@ -1,3 +1,5 @@ +PrsMgr.cxx +PrsMgr.hxx PrsMgr_ListOfPresentableObjects.hxx PrsMgr_ListOfPresentations.hxx PrsMgr_PresentableObject.cxx diff --git a/src/PrsMgr/PrsMgr.cxx b/src/PrsMgr/PrsMgr.cxx new file mode 100644 index 0000000000..ac8436e250 --- /dev/null +++ b/src/PrsMgr/PrsMgr.cxx @@ -0,0 +1,54 @@ +// Copyright (c) 2018 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 + +#include + +namespace +{ + static Standard_CString PrsMgr_Table_PrintTypeOfPresentation3d[2] = + { + "ALL_VIEW", "PROJECTOR_DEPENDANT" + }; +} + +//======================================================================= +//function : TypeOfPresentation3dToString +//purpose : +//======================================================================= +Standard_CString PrsMgr::TypeOfPresentation3dToString (PrsMgr_TypeOfPresentation3d theType) +{ + return PrsMgr_Table_PrintTypeOfPresentation3d[theType]; +} + +//======================================================================= +//function : TypeOfPresentation3dFromString +//purpose : +//======================================================================= +Standard_Boolean PrsMgr::TypeOfPresentation3dFromString (Standard_CString theTypeString, + PrsMgr_TypeOfPresentation3d& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= PrsMgr_TOP_ProjectorDependant; ++aTypeIter) + { + Standard_CString aTypeName = PrsMgr_Table_PrintTypeOfPresentation3d[aTypeIter]; + if (aName == aTypeName) + { + theType = PrsMgr_TypeOfPresentation3d (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} diff --git a/src/PrsMgr/PrsMgr.hxx b/src/PrsMgr/PrsMgr.hxx new file mode 100644 index 0000000000..4adcbb2e06 --- /dev/null +++ b/src/PrsMgr/PrsMgr.hxx @@ -0,0 +1,53 @@ +// Copyright (c) 2018 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 _PrsMgr_HeaderFile +#define _PrsMgr_HeaderFile + +#include +#include +#include +#include + +//! Provides methods to cast enumerations of package to string value +class PrsMgr +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString TypeOfPresentation3dToString (PrsMgr_TypeOfPresentation3d theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or PrsMgr_TOP_AllView if string identifier is invalid + static PrsMgr_TypeOfPresentation3d TypeOfPresentation3dFromString (Standard_CString theTypeString) + { + PrsMgr_TypeOfPresentation3d aType = PrsMgr_TOP_AllView; + TypeOfPresentation3dFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean TypeOfPresentation3dFromString (const Standard_CString theTypeString, + PrsMgr_TypeOfPresentation3d& theType); + +}; + +#endif // _PrsMgr_HeaderFile diff --git a/src/Quantity/FILES b/src/Quantity/FILES index fa0ce019e5..936d80b984 100755 --- a/src/Quantity/FILES +++ b/src/Quantity/FILES @@ -1,3 +1,5 @@ +Quantity.cxx +Quantity.hxx Quantity_AbsorbedDose.hxx Quantity_Acceleration.hxx Quantity_AcousticIntensity.hxx diff --git a/src/Quantity/Quantity.cxx b/src/Quantity/Quantity.cxx new file mode 100644 index 0000000000..d800fed303 --- /dev/null +++ b/src/Quantity/Quantity.cxx @@ -0,0 +1,191 @@ +// Copyright (c) 2018 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 + +#include + +namespace +{ + static Standard_CString Quantity_Table_PrintNameOfColor[517] = + { + "BLACK", "MATRABLUE", "MATRAGRAY", "ALICEBLUE", + "ANTIQUEWHITE", "ANTIQUEWHITE1", "ANTIQUEWHITE2", "ANTIQUEWHITE3", "ANTIQUEWHITE4", + "AQUAMARINE1", "AQUAMARINE2", "AQUAMARINE4", + "AZURE", "AZURE2", "AZURE3", "AZURE4", + "BEIGE", + "BISQUE", "BISQUE2", "BISQUE3", "BISQUE4", + "BLANCHEDALMOND", + "BLUE1", "BLUE2", "BLUE3", "BLUE4", + "BLUEVIOLET", + "BROWN", "BROWN1", "BROWN2", "BROWN3", "BROWN4", + "BURLYWOOD", "BURLYWOOD1", "BURLYWOOD2", "BURLYWOOD3", "BURLYWOOD4", + "CADETBLUE", "CADETBLUE1", "CADETBLUE2", "CADETBLUE3", "CADETBLUE4", + "CHARTREUSE", "CHARTREUSE1", "CHARTREUSE2", "CHARTREUSE3", "CHARTREUSE4", + "CHOCOLATE", "CHOCOLATE1", "CHOCOLATE2", "CHOCOLATE3", "CHOCOLATE4", + "CORAL", "CORAL1", "CORAL2", "CORAL3", "CORAL4", + "CORNFLOWERBLUE", + "CORNSILK1", "CORNSILK2", "CORNSILK3", "CORNSILK4", + "CYAN1", "CYAN2", "CYAN3", "CYAN4", + "DARKGOLDENROD", "DARKGOLDENROD1", "DARKGOLDENROD2", "DARKGOLDENROD3", "DARKGOLDENROD4", + "DARKGREEN", + "DARKKHAKI", + "DARKOLIVEGREEN", "DARKOLIVEGREEN1", "DARKOLIVEGREEN2", "DARKOLIVEGREEN3", "DARKOLIVEGREEN4", + "DARKORANGE", "DARKORANGE1", "DARKORANGE2", "DARKORANGE3", "DARKORANGE4", + "DARKORCHID", "DARKORCHID1", "DARKORCHID2", "DARKORCHID3", "DARKORCHID4", + "DARKSALMON", + "DARKSEAGREEN", "DARKSEAGREEN1", "DARKSEAGREEN2", "DARKSEAGREEN3", "DARKSEAGREEN4", + "DARKSLATEBLUE", + "DARKSLATEGRAY1", "DARKSLATEGRAY2", "DARKSLATEGRAY3", "DARKSLATEGRAY4", "DARKSLATEGRAY", + "DARKTURQUOISE", + "DARKVIOLET", + "DEEPPINK", "DEEPPINK2", "DEEPPINK3", "DEEPPINK4", + "DEEPSKYBLUE1", "DEEPSKYBLUE2", "DEEPSKYBLUE3", "DEEPSKYBLUE4", + "DODGERBLUE1", "DODGERBLUE2", "DODGERBLUE3", "DODGERBLUE4", + "FIREBRICK", "FIREBRICK1", "FIREBRICK2", "FIREBRICK3", "FIREBRICK4", + "FLORALWHITE", + "FORESTGREEN", + "GAINSBORO", + "GHOSTWHITE", + "GOLD", "GOLD1", "GOLD2", "GOLD3", "GOLD4", + "GOLDENROD", "GOLDENROD1", "GOLDENROD2", "GOLDENROD3", "GOLDENROD4", + "GRAY", "GRAY0", "GRAY1", "GRAY10", "GRAY11", "GRAY12", "GRAY13", "GRAY14", "GRAY15", "GRAY16", + "GRAY17", "GRAY18", "GRAY19", "GRAY2", "GRAY20", "GRAY21", "GRAY22", "GRAY23", "GRAY24", "GRAY25", + "GRAY26", "GRAY27", "GRAY28", "GRAY29", "GRAY3", "GRAY30", "GRAY31", "GRAY32", "GRAY33", "GRAY34", + "GRAY35", "GRAY36", "GRAY37", "GRAY38", "GRAY39", "GRAY4", "GRAY40", "GRAY41", "GRAY42", "GRAY43", + "GRAY44", "GRAY45", "GRAY46", "GRAY47", "GRAY48", "GRAY49", "GRAY5", "GRAY50", "GRAY51", "GRAY52", + "GRAY53", "GRAY54", "GRAY55", "GRAY56", "GRAY57", "GRAY58", "GRAY59", "GRAY6", "GRAY60", "GRAY61", + "GRAY62", "GRAY63", "GRAY64", "GRAY65", "GRAY66", "GRAY67", "GRAY68", "GRAY69", "GRAY7", "GRAY70", + "GRAY71", "GRAY72", "GRAY73", "GRAY74", "GRAY75", "GRAY76", "GRAY77", "GRAY78", "GRAY79", "GRAY8", + "GRAY80", "GRAY81", "GRAY82", "GRAY83", "GRAY85", "GRAY86", "GRAY87", "GRAY88", "GRAY89", "GRAY9", + "GRAY90", "GRAY91", "GRAY92", "GRAY93", "GRAY94", "GRAY95", + "GREEN", "GREEN1", "GREEN2", "GREEN3", "GREEN4", + "GREENYELLOW", + "GRAY97", "GRAY98", "GRAY99", + "HONEYDEW", "HONEYDEW2", "HONEYDEW3", "HONEYDEW4", + "HOTPINK", "HOTPINK1", "HOTPINK2", "HOTPINK3", "HOTPINK4", + "INDIANRED", "INDIANRED1", "INDIANRED2", "INDIANRED3", "INDIANRED4", + "IVORY", "IVORY2", "IVORY3", "IVORY4", + "KHAKI", "KHAKI1", "KHAKI2", "KHAKI3", "KHAKI4", + "LAVENDER", "LAVENDERBLUSH1", "LAVENDERBLUSH2", "LAVENDERBLUSH3", "LAVENDERBLUSH4", + "LAWNGREEN", "LEMONCHIFFON1", "LEMONCHIFFON2", "LEMONCHIFFON3", "LEMONCHIFFON4", + "LIGHTBLUE", "LIGHTBLUE1", "LIGHTBLUE2", "LIGHTBLUE3", "LIGHTBLUE4", + "LIGHTCORAL", + "LIGHTCYAN1", "LIGHTCYAN2", "LIGHTCYAN3", "LIGHTCYAN4", + "LIGHTGOLDENROD", "LIGHTGOLDENROD1", "LIGHTGOLDENROD2", "LIGHTGOLDENROD3", "LIGHTGOLDENROD4", + "LIGHTGOLDENRODYELLOW", + "LIGHTGRAY" + "LIGHTPINK", "LIGHTPINK1", "LIGHTPINK2", "LIGHTPINK3", "LIGHTPINK4", + "LIGHTSALMON1", "LIGHTSALMON2", "LIGHTSALMON3", "LIGHTSALMON4", + "LIGHTSEAGREEN", + "LIGHTSKYBLUE", "LIGHTSKYBLUE1", "LIGHTSKYBLUE2", "LIGHTSKYBLUE3", "LIGHTSKYBLUE4", + "LIGHTSLATEBLUE", + "LIGHTSLATEGRAY", + "LIGHTSTEELBLUE", "LIGHTSTEELBLUE1", "LIGHTSTEELBLUE2", "LIGHTSTEELBLUE3", "LIGHTSTEELBLUE4", + "LIGHTYELLOW", "LIGHTYELLOW2", "LIGHTYELLOW3", "LIGHTYELLOW4", + "LIMEGREEN", + "LINEN", + "MAGENTA1", "MAGENTA2", "MAGENTA3", "MAGENTA4", + "MAROON", "MAROON1", "MAROON2", "MAROON3", "MAROON4", + "MEDIUMAQUAMARINE", + "MEDIUMORCHID", "MEDIUMORCHID1", "MEDIUMORCHID2", "MEDIUMORCHID3", "MEDIUMORCHID4", + "MEDIUMPURPLE", "MEDIUMPURPLE1", "MEDIUMPURPLE2", "MEDIUMPURPLE3", "MEDIUMPURPLE4", + "MEDIUMSEAGREEN", + "MEDIUMSLATEBLUE", + "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", + "MEDIUMVIOLETRED", + "MIDNIGHTBLUE", + "MINTCREAM", + "MISTYROSE", "MISTYROSE2", "MISTYROSE3", "MISTYROSE4", + "MOCCASIN", + "NAVAJOWHITE1", "NAVAJOWHITE2", "NAVAJOWHITE3", "NAVAJOWHITE4", + "NAVYBLUE", + "OLDLACE", + "OLIVEDRAB", "OLIVEDRAB1", "OLIVEDRAB2", "OLIVEDRAB3", "OLIVEDRAB4", + "ORANGE", "ORANGE1", "ORANGE2", "ORANGE3", "ORANGE4", + "ORANGERED", "ORANGERED1", "ORANGERED2", "ORANGERED3", "ORANGERED4", + "ORCHID", "ORCHID1", "ORCHID2", "ORCHID3", "ORCHID4", + "PALEGOLDENROD", + "PALEGREEN", "PALEGREEN1", "PALEGREEN2", "PALEGREEN3", "PALEGREEN4", + "PALETURQUOISE", "PALETURQUOISE1", "PALETURQUOISE2", "PALETURQUOISE3", "PALETURQUOISE4", + "PALEVIOLETRED", "PALEVIOLETRED1", "PALEVIOLETRED2", "PALEVIOLETRED3", "PALEVIOLETRED4", + "PAPAYAWHIP", + "PEACHPUFF", "PEACHPUFF2", "PEACHPUFF3", "PEACHPUFF4", + "PERU", + "PINK", "PINK1", "PINK2", "PINK3", "PINK4", + "PLUM", "PLUM1", "PLUM2", "PLUM3", "PLUM4", + "POWDERBLUE", + "PURPLE", "PURPLE1", "PURPLE2", "PURPLE3", "PURPLE4", + "RED", "RED1", "RED2", "RED3", "RED4", + "ROSYBROWN", "ROSYBROWN1", "ROSYBROWN2", "ROSYBROWN3", "ROSYBROWN4", + "ROYALBLUE", "ROYALBLUE1", "ROYALBLUE2", "ROYALBLUE3", "ROYALBLUE4", + "SADDLEBROWN", + "SALMON", "SALMON1", "SALMON2", "SALMON3", "SALMON4", + "SANDYBROWN", + "SEAGREEN", "SEAGREEN1", "SEAGREEN2", "SEAGREEN3", "SEAGREEN4", + "SEASHELL", "SEASHELL2", "SEASHELL3", "SEASHELL4", + "BEET", + "TEAL", + "SIENNA", "SIENNA1", "SIENNA2", "SIENNA3", "SIENNA4", + "SKYBLUE", "SKYBLUE1", "SKYBLUE2", "SKYBLUE3", "SKYBLUE4", + "SLATEBLUE", "SLATEBLUE1", "SLATEBLUE2", "SLATEBLUE3", "SLATEBLUE4", + "SLATEGRAY1", "SLATEGRAY2", "SLATEGRAY3", "SLATEGRAY4", "SLATEGRAY", + "SNOW", "SNOW2", "SNOW3", "SNOW4", + "SPRINGGREEN", "SPRINGGREEN2", "SPRINGGREEN3", "SPRINGGREEN4", + "STEELBLUE", "STEELBLUE1", "STEELBLUE2", "STEELBLUE3", "STEELBLUE4", + "TAN", "TAN1", "TAN2", "TAN3", "TAN4", + "THISTLE", "THISTLE1", "THISTLE2", "THISTLE3", "THISTLE4", + "TOMATO", "TOMATO1", "TOMATO2", "TOMATO3", "TOMATO4", + "TURQUOISE", "TURQUOISE1", "TURQUOISE2", "TURQUOISE3", "TURQUOISE4", + "VIOLET", + "VIOLETRED", "VIOLETRED1", "VIOLETRED2", "VIOLETRED3", "VIOLETRED4", + "WHEAT", "WHEAT1", "WHEAT2", "WHEAT3", "WHEAT4", + "WHITESMOKE", + "YELLOW", "YELLOW1", "YELLOW2", "YELLOW3", "YELLOW4", + "YELLOWGREEN", + "WHITE" + }; + +} + +//======================================================================= +//function : NameOfColorToString +//purpose : +//======================================================================= +Standard_CString Quantity::NameOfColorToString (Quantity_NameOfColor theType) +{ + return Quantity_Table_PrintNameOfColor[theType]; +} + +//======================================================================= +//function : NameOfColorFromString +//purpose : +//======================================================================= +Standard_Boolean Quantity::NameOfColorFromString (Standard_CString theTypeString, + Quantity_NameOfColor& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= Quantity_NOC_WHITE; ++aTypeIter) + { + Standard_CString aTypeName = Quantity_Table_PrintNameOfColor[aTypeIter]; + if (aName == aTypeName) + { + theType = Quantity_NameOfColor (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + diff --git a/src/Quantity/Quantity.hxx b/src/Quantity/Quantity.hxx new file mode 100644 index 0000000000..d254c09e86 --- /dev/null +++ b/src/Quantity/Quantity.hxx @@ -0,0 +1,53 @@ +// Copyright (c) 2018 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 _Quantity_HeaderFile +#define _Quantity_HeaderFile + +#include +#include +#include +#include + +//! Provides methods to cast enumerations of package to string value +class Quantity +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Returns the string name for a given type. + //! @param theType an enumeration type + //! @return string identifier from the enumeration list + Standard_EXPORT static Standard_CString NameOfColorToString (Quantity_NameOfColor theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return enumeration type or Quantity_NOC_BLACK if string identifier is invalid + static Quantity_NameOfColor NameOfColorFromString (Standard_CString theTypeString) + { + Quantity_NameOfColor aType = Quantity_NOC_BLACK; + NameOfColorFromString (theTypeString, aType); + return aType; + } + + //! Determines the type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean NameOfColorFromString (const Standard_CString theTypeString, + Quantity_NameOfColor& theType); + +}; + +#endif // _Quantity_HeaderFile diff --git a/src/Quantity/Quantity_Color.cxx b/src/Quantity/Quantity_Color.cxx index 1662a5799e..16b70496f5 100644 --- a/src/Quantity/Quantity_Color.cxx +++ b/src/Quantity/Quantity_Color.cxx @@ -15,6 +15,9 @@ #include +#include +#include + #include #include #include @@ -3924,3 +3927,41 @@ void call_rgbhls (float r, float g, float b, float& h, float& l, float& s) if (h < 0.0) h += 360.0; } } + +//======================================================================= +// function : ToString +// purpose : +//======================================================================= +TCollection_AsciiString Quantity_Color::ToString() const +{ + NCollection_Vector aValues; + aValues.Append (MyRed); + aValues.Append (MyGreen); + aValues.Append (MyBlue); + + Standard_SStream OS; + + TCollection_AsciiString aValue; + DUMP_VEC_COLOR(aValues, aValue) + + return aValue; +} + +//======================================================================= +// function : FromString +// purpose : +//======================================================================= +Standard_Boolean Quantity_Color::FromString (const TCollection_AsciiString& theValue) +{ + NCollection_Vector aValues; + DUMP_VEC_COLOR_SPLIT (theValue, aValues) + + if (aValues.Size() != 3) + return Standard_False; + + MyRed = (Standard_ShortReal)aValues.Value (0); + MyGreen = (Standard_ShortReal)aValues.Value (1); + MyBlue = (Standard_ShortReal)aValues.Value (2); + + return Standard_True; +} diff --git a/src/Quantity/Quantity_Color.hxx b/src/Quantity/Quantity_Color.hxx index 07ce584ec6..43de9e0864 100644 --- a/src/Quantity/Quantity_Color.hxx +++ b/src/Quantity/Quantity_Color.hxx @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -264,6 +265,14 @@ Standard_Boolean operator == (const Quantity_Color& Other) const //! Internal test Standard_EXPORT static void Test(); + //! Covers point into string in format: (X, Y, Z) + //! \return the string value + Standard_EXPORT TCollection_AsciiString ToString() const; + + //! Converts text value into parameters if possible, the string format is: (X, Y, Z) + //! \return true if conversion is done + Standard_EXPORT Standard_Boolean FromString (const TCollection_AsciiString& theValue); + private: //! Converts HLS components into RGB ones. diff --git a/src/SelectMgr/FILES b/src/SelectMgr/FILES index 767862f74d..4049bf73b8 100755 --- a/src/SelectMgr/FILES +++ b/src/SelectMgr/FILES @@ -1,3 +1,5 @@ +SelectMgr.cxx +SelectMgr.hxx SelectMgr_AndFilter.cxx SelectMgr_AndFilter.hxx SelectMgr_BaseFrustum.cxx diff --git a/src/SelectMgr/SelectMgr.cxx b/src/SelectMgr/SelectMgr.cxx new file mode 100644 index 0000000000..2c33d07efd --- /dev/null +++ b/src/SelectMgr/SelectMgr.cxx @@ -0,0 +1,89 @@ +// Copyright (c) 2018 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 + +#include + +namespace +{ + static Standard_CString SelectMgr_Table_PrintPickingStrategy[2] = + { + "FIRST_ACCEPTABLE", "ONLY_TOPMOST" + }; + + static Standard_CString SelectMgr_Table_PrintBVHSubset[4] = + { + "3d", "3dPersistent", "2dPersistent", "Nb" + }; +} + +//======================================================================= +//function : TypeOfOrientationToString +//purpose : +//======================================================================= +Standard_CString SelectMgr::PickingStrategyToString (SelectMgr_PickingStrategy theType) +{ + return SelectMgr_Table_PrintPickingStrategy[theType]; +} + +//======================================================================= +//function : PickingStrategyFromString +//purpose : +//======================================================================= +Standard_Boolean SelectMgr::PickingStrategyFromString (Standard_CString theTypeString, + SelectMgr_PickingStrategy& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= SelectMgr_PickingStrategy_OnlyTopmost; ++aTypeIter) + { + Standard_CString aTypeName = SelectMgr_Table_PrintPickingStrategy[aTypeIter]; + if (aName == aTypeName) + { + theType = SelectMgr_PickingStrategy (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : BVHSubsetToString +//purpose : +//======================================================================= +Standard_CString SelectMgr::BVHSubsetToString (SelectMgr_SelectableObjectSet::BVHSubset theType) +{ + return SelectMgr_Table_PrintBVHSubset[theType]; +} + +//======================================================================= +//function : BVHSubsetFromString +//purpose : +//======================================================================= +Standard_Boolean SelectMgr::BVHSubsetFromString (Standard_CString theTypeString, + SelectMgr_SelectableObjectSet::BVHSubset& theType) +{ + TCollection_AsciiString aName (theTypeString); + aName.UpperCase(); + for (Standard_Integer aTypeIter = 0; aTypeIter <= SelectMgr_SelectableObjectSet::BVHSubsetNb; ++aTypeIter) + { + Standard_CString aTypeName = SelectMgr_Table_PrintBVHSubset[aTypeIter]; + if (aName == aTypeName) + { + theType = SelectMgr_SelectableObjectSet::BVHSubset (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} diff --git a/src/SelectMgr/SelectMgr.hxx b/src/SelectMgr/SelectMgr.hxx new file mode 100644 index 0000000000..a8cdcb1178 --- /dev/null +++ b/src/SelectMgr/SelectMgr.hxx @@ -0,0 +1,82 @@ +// Copyright (c) 2018 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 _SelectMgr_HeaderFile +#define _SelectMgr_HeaderFile + +#include +#include +#include +#include +#include + +#include +#include +#include + +//! This package contains the set of commands and services of the SelectMgr +class SelectMgr +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString PickingStrategyToString (SelectMgr_PickingStrategy theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or V3d_TypeOfOrientation if string identifier is invalid + static SelectMgr_PickingStrategy PickingStrategyFromString (Standard_CString theTypeString) + { + SelectMgr_PickingStrategy aType = SelectMgr_PickingStrategy_FirstAcceptable; + PickingStrategyFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean PickingStrategyFromString (const Standard_CString theTypeString, + SelectMgr_PickingStrategy& theType); + + + + //! Returns the string name for a given orientation type. + //! @param theType orientation type + //! @return string identifier from the list Xpos, Ypos, Zpos and others + Standard_EXPORT static Standard_CString BVHSubsetToString (SelectMgr_SelectableObjectSet::BVHSubset theType); + + //! Returns the orientation type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return orientation type or BVHSubset_3d if string identifier is invalid + static SelectMgr_SelectableObjectSet::BVHSubset BVHSubsetFromString (Standard_CString theTypeString) + { + SelectMgr_SelectableObjectSet::BVHSubset aType = SelectMgr_SelectableObjectSet::BVHSubset_3d; + BVHSubsetFromString (theTypeString, aType); + return aType; + } + + //! Determines the shape type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected shape type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean BVHSubsetFromString (const Standard_CString theTypeString, + SelectMgr_SelectableObjectSet::BVHSubset& theType); + +}; + +#endif // _SelectMgr_HeaderFile diff --git a/src/SelectMgr/SelectMgr_BaseFrustum.cxx b/src/SelectMgr/SelectMgr_BaseFrustum.cxx index bf9f43a395..a78cceb3e6 100644 --- a/src/SelectMgr/SelectMgr_BaseFrustum.cxx +++ b/src/SelectMgr/SelectMgr_BaseFrustum.cxx @@ -15,6 +15,9 @@ #include +#include +#include + IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_BaseFrustum,Standard_Transient) //======================================================================= @@ -251,3 +254,17 @@ Standard_Boolean SelectMgr_BaseFrustum::IsClipped (const Graphic3d_SequenceOfHCl { return Standard_True; } + +//======================================================================= +//function : Dump +//purpose : +//======================================================================= +void SelectMgr_BaseFrustum::Dump(Standard_OStream& OS)const +{ + DUMP_VALUES (OS, "SelectMgr_BaseFrustum", 2); + + DUMP_VALUES (OS, "myPixelTolerance", myPixelTolerance); + DUMP_VALUES (OS, "myIsOrthographic", myIsOrthographic); + DUMP_VALUES (OS, "myBuilder", Message::TransientToString (myBuilder)); + DUMP_VALUES (OS, "myCamera", Message::TransientToString (myCamera)); +} diff --git a/src/SelectMgr/SelectMgr_BaseFrustum.hxx b/src/SelectMgr/SelectMgr_BaseFrustum.hxx index 6e4852ce11..d402ac371b 100644 --- a/src/SelectMgr/SelectMgr_BaseFrustum.hxx +++ b/src/SelectMgr/SelectMgr_BaseFrustum.hxx @@ -35,6 +35,8 @@ #include +#include + //! This class is an interface for different types of selecting frustums, //! defining different selection types, like point, box or polyline //! selection. It contains signatures of functions for detection of @@ -186,6 +188,9 @@ public: return; } + //! Dumps the content of me on the stream . + Standard_EXPORT virtual void Dump (Standard_OStream& OS) const; + DEFINE_STANDARD_RTTIEXT(SelectMgr_BaseFrustum,Standard_Transient) protected: diff --git a/src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx b/src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx index d54cf1f87c..08a510b609 100644 --- a/src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx +++ b/src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx @@ -217,6 +217,19 @@ public: return mySelectingVolumes[myActiveSelectionType / 2]; } + //! Returns active selecting volume that was built during last + //! run of OCCT selection mechanism + Handle(SelectMgr_BaseFrustum) GetVolume (const SelectionType& theType) const + { + switch (theType) + { + case Point: + case Box: return mySelectingVolumes[Frustum]; + case Polyline: return mySelectingVolumes[FrustumSet]; + default: return NULL; + } + } + //! Stores plane equation coefficients (in the following form: //! Ax + By + Cz + D = 0) to the given vector virtual void GetPlanes (NCollection_Vector& thePlaneEquations) const Standard_OVERRIDE diff --git a/src/SelectMgr/SelectMgr_ViewClipRange.hxx b/src/SelectMgr/SelectMgr_ViewClipRange.hxx index 575d376f49..89e5d23c98 100644 --- a/src/SelectMgr/SelectMgr_ViewClipRange.hxx +++ b/src/SelectMgr/SelectMgr_ViewClipRange.hxx @@ -18,6 +18,7 @@ #include #include +#include //! Class for handling depth clipping range. //! It is used to perform checks in case if global (for the whole view) @@ -106,6 +107,16 @@ public: //! Adds a clipping sub-range (for clipping chains). void AddClipSubRange (const Bnd_Range& theRange) { myClipRanges.push_back (theRange); } + //! Dumps the content of me on the stream . + Standard_EXPORT void Dump (Standard_OStream& OS) const + { + DUMP_VALUES (OS, "SelectMgr_ViewClipRange", 2); + DUMP_VALUES (OS, "myUnclipRange", myUnclipRange.ToString()); + DUMP_VALUES (OS, "myClipRanges", myClipRanges.size()); + for (size_t aRangeIter = 0; aRangeIter < myClipRanges.size(); ++aRangeIter) + DUMP_VALUES (OS, aRangeIter, myClipRanges[aRangeIter].ToString()); + } + private: std::vector myClipRanges; diff --git a/src/SelectMgr/SelectMgr_ViewerSelector.cxx b/src/SelectMgr/SelectMgr_ViewerSelector.cxx index 07812b11ed..8f88db8b5b 100644 --- a/src/SelectMgr/SelectMgr_ViewerSelector.cxx +++ b/src/SelectMgr/SelectMgr_ViewerSelector.cxx @@ -19,10 +19,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -33,6 +35,12 @@ #include +#define REPORT_SELECTION_BUILD +#ifdef REPORT_SELECTION_BUILD +#include +#include +#endif + IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_ViewerSelector, Standard_Transient) namespace { @@ -209,6 +217,12 @@ void SelectMgr_ViewerSelector::checkOverlap (const Handle(Select3D_SensitiveEnti const gp_GTrsf& theInversedTrsf, SelectMgr_SelectingVolumeManager& theMgr) { + #ifdef REPORT_SELECTION_BUILD + Message_PerfMeter aPerfMeter; + MESSAGE_INFO_OBJECT (theEntity, "checkOverlap", "", &aPerfMeter, NULL); + Handle(Message_Alert) aParentAlert = OCCT_Message_Alert; + #endif + const Handle(SelectMgr_EntityOwner)& anOwner = theEntity->OwnerId(); Handle(SelectMgr_SelectableObject) aSelectable; Standard_Boolean toRestoresViewClipEnabled = Standard_False; @@ -258,7 +272,13 @@ void SelectMgr_ViewerSelector::checkOverlap (const Handle(Select3D_SensitiveEnti } SelectBasics_PickResult aPickResult; + #ifdef REPORT_SELECTION_BUILD + MESSAGE_INFO (TCollection_AsciiString ("Matches - start"), "", &aPerfMeter, aParentAlert); + #endif const Standard_Boolean isMatched = theEntity->Matches(theMgr, aPickResult); + #ifdef REPORT_SELECTION_BUILD + MESSAGE_INFO (TCollection_AsciiString ("Matches - end"), "", &aPerfMeter, aParentAlert); + #endif if (toRestoresViewClipEnabled) { theMgr.SetViewClippingEnabled (Standard_True); @@ -270,6 +290,15 @@ void SelectMgr_ViewerSelector::checkOverlap (const Handle(Select3D_SensitiveEnti return; } + if (!mySelectingVolumeMgr.ViewClipping().IsNull()) + { + Standard_Real aDepth = /*aPickResult.HasPickedPoint() ?*+/ aPickResult.Depth();// :*/ aPickResult.DistToGeomCenter(); + Standard_Boolean isClipped = mySelectingVolumeMgr.IsClipped (*mySelectingVolumeMgr.ViewClipping(), + aDepth); + if (isClipped) + return; + } + if (HasDepthClipping (anOwner) && !aSelectable.IsNull() && theMgr.GetActiveSelectionType() == SelectMgr_SelectingVolumeManager::Point) @@ -366,6 +395,12 @@ void SelectMgr_ViewerSelector::traverseObject (const Handle(SelectMgr_Selectable return; } + #ifdef REPORT_SELECTION_BUILD + Message_PerfMeter aPerfMeter; + MESSAGE_INFO_OBJECT (theObject, "traverseObject", "", &aPerfMeter, NULL); + Handle(Message_Alert) aParentAlert = OCCT_Message_Alert; + #endif + const opencascade::handle >& aSensitivesTree = anEntitySet->BVH(); gp_GTrsf aInversedTrsf; if (theObject->HasTransformation() || !theObject->TransformPersistence().IsNull()) @@ -442,6 +477,10 @@ void SelectMgr_ViewerSelector::traverseObject (const Handle(SelectMgr_Selectable Standard_Integer aHead = -1; for (;;) { + #ifdef REPORT_SELECTION_BUILD + MESSAGE_INFO (TCollection_AsciiString ("aNode") + aNode, "", &aPerfMeter, aParentAlert); + #endif + if (!aSensitivesTree->IsOuter (aNode)) { const Standard_Integer aLeftChildIdx = aSensitivesTree->Child<0> (aNode); @@ -570,11 +609,24 @@ void SelectMgr_ViewerSelector::traverseObject (const Handle(SelectMgr_Selectable //======================================================================= void SelectMgr_ViewerSelector::TraverseSensitives() { +#ifdef REPORT_SELECTION_BUILD + Message_PerfMeter aPerfMeter; + MESSAGE_INFO ("TraverseSensitives", "", &aPerfMeter, NULL); + Handle(Message_Alert) aParentAlert = OCCT_Message_Alert; + + Standard_SStream aStream; + Dump (aStream); + MESSAGE_INFO_VALUES (aStream, "Parameters", "", &aPerfMeter, aParentAlert); +#endif + mystored.Clear(); Standard_Integer aWidth; Standard_Integer aHeight; mySelectingVolumeMgr.WindowSize (aWidth, aHeight); +#ifdef REPORT_SELECTION_BUILD + MESSAGE_INFO ("UpdateBVH", "", &aPerfMeter, aParentAlert); +#endif mySelectableObjects.UpdateBVH (mySelectingVolumeMgr.Camera(), mySelectingVolumeMgr.ProjectionMatrix(), mySelectingVolumeMgr.WorldViewMatrix(), @@ -597,6 +649,11 @@ void SelectMgr_ViewerSelector::TraverseSensitives() SelectMgr_SelectableObjectSet::BVHSubset aBVHSubset = static_cast (aBVHSetIt); + #ifdef REPORT_SELECTION_BUILD + MESSAGE_INFO (TCollection_AsciiString ("aBVHSetIt"), SelectMgr::BVHSubsetToString (aBVHSubset), &aPerfMeter, aParentAlert); + Handle(Message_Alert) aParentAlertLevel1 = OCCT_Message_Alert; + #endif + if (mySelectableObjects.IsEmpty (aBVHSubset)) { continue; @@ -652,6 +709,9 @@ void SelectMgr_ViewerSelector::TraverseSensitives() Standard_Integer aHead = -1; for (;;) { + #ifdef REPORT_SELECTION_BUILD + MESSAGE_INFO (TCollection_AsciiString ("aNode - ") + aNode, "", &aPerfMeter, aParentAlertLevel1); + #endif if (!aBVHTree->IsOuter (aNode)) { const Standard_Integer aLeftChildIdx = aBVHTree->Child<0> (aNode); @@ -705,7 +765,13 @@ void SelectMgr_ViewerSelector::TraverseSensitives() } } + MESSAGE_INFO ("SortResult", "", &aPerfMeter, aParentAlert); SortResult(); +#ifdef REPORT_SELECTION_BUILD + Standard_SStream aStreamDone; + Dump (aStreamDone); + MESSAGE_INFO_VALUES (aStreamDone, "Parameters", "", &aPerfMeter, aParentAlert); +#endif } //================================================== @@ -885,6 +951,12 @@ TCollection_AsciiString SelectMgr_ViewerSelector::Status (const Handle(SelectMgr //======================================================================= void SelectMgr_ViewerSelector::SortResult() { +#ifdef REPORT_SELECTION_BUILD + Message_PerfMeter aPerfMeter; + MESSAGE_INFO ("SortResult", "", &aPerfMeter, NULL); + Handle(Message_Alert) aParentAlert = OCCT_Message_Alert; +#endif + if(mystored.IsEmpty()) return; const Standard_Integer anExtent = mystored.Extent(); @@ -1082,3 +1154,27 @@ void SelectMgr_ViewerSelector::AllowOverlapDetection (const Standard_Boolean the { mySelectingVolumeMgr.AllowOverlapDetection (theIsToAllow); } + +//======================================================================= +//function : Dump +//purpose : +//======================================================================= +void SelectMgr_ViewerSelector::Dump(Standard_OStream& OS)const +{ + DUMP_VALUES (OS, "SelectMgr_ViewerSelector", 2); + + DUMP_VALUES (OS, "IsPickClosest", IsPickClosest()); + DUMP_VALUES (OS, "ToUpdateTolerance", myToUpdateTolerance); + DUMP_VALUES (OS, "mystored", mystored.Extent()); + //DUMP_VALUES (OS, "mySelectingVolumeMgr", mySelectingVolumeMgr); + + Standard_Integer aNbOfSelected = 0; + for (SelectMgr_SelectableObjectSet::Iterator aSelectableIt (mySelectableObjects); aSelectableIt.More(); aSelectableIt.Next()) + { + aNbOfSelected++; + } + DUMP_VALUES (OS, "mySelectableObjects", aNbOfSelected); + DUMP_VALUES (OS, "myTolerances.Tolerance()", myTolerances.Tolerance()); + DUMP_VALUES (OS, "myTolerances.CustomTolerance()", myTolerances.CustomTolerance()); + DUMP_VALUES (OS, "myZLayerOrderMap", myZLayerOrderMap.Size()); +} diff --git a/src/SelectMgr/SelectMgr_ViewerSelector.hxx b/src/SelectMgr/SelectMgr_ViewerSelector.hxx index fadb622a7e..0517f94137 100644 --- a/src/SelectMgr/SelectMgr_ViewerSelector.hxx +++ b/src/SelectMgr/SelectMgr_ViewerSelector.hxx @@ -109,6 +109,9 @@ public: //! depth which is used to choose among objects of the same priority. void SetPickClosest (const Standard_Boolean theToPreferClosest) { preferclosest = theToPreferClosest; } + //! Return preference of selecting one object for OnePicked() method + Standard_Boolean IsPickClosest() const { return preferclosest; } + //! Returns the number of detected owners. Standard_Integer NbPicked() const { return mystored.Extent(); } @@ -201,6 +204,12 @@ public: //! Returns instance of selecting volume manager of the viewer selector SelectMgr_SelectingVolumeManager& GetManager() { return mySelectingVolumeMgr; } + //! Returns container of selectable objects + const SelectMgr_SelectableObjectSet& GetSelectableObjects() const { return mySelectableObjects; } + + //! Returns container of sensitives + const SelectMgr_MapOfObjectSensitives& GetObjectSensitives() const { return myMapOfObjectSensitives; } + //! Marks all added sensitive entities of all objects as non-selectable Standard_EXPORT void ResetSelectionActivationStatus(); @@ -209,6 +218,9 @@ public: //! mark both included and overlapped entities as matched Standard_EXPORT void AllowOverlapDetection (const Standard_Boolean theIsToAllow); + //! Dumps the content of me on the stream . + Standard_EXPORT void Dump (Standard_OStream& OS) const; + public: //! Begins an iteration scanning for the owners detected at a position in the view. diff --git a/src/TopoDS/TopoDS_AlertAttribute.hxx b/src/TopoDS/TopoDS_AlertAttribute.hxx index ed82829e91..f0708407cd 100644 --- a/src/TopoDS/TopoDS_AlertAttribute.hxx +++ b/src/TopoDS/TopoDS_AlertAttribute.hxx @@ -27,7 +27,7 @@ public: TopoDS_AlertAttribute (const TopoDS_Shape& theShape, const TCollection_AsciiString& theName = TCollection_AsciiString(), const TCollection_AsciiString& theDescription = TCollection_AsciiString()) - : Message_Attribute (theName, theDescription), myShape (theShape) {} + : Message_Attribute (theName, theDescription), myShape (theShape) {} //! Returns contained shape const TopoDS_Shape& GetShape() const { return myShape; } @@ -39,5 +39,14 @@ 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_AlertExtended::AddAlert (Message_Report::CurrentReport(), \ + new TopoDS_AlertAttribute (Shape, Name, Description), PerfMeter, ParentAlert); \ + } \ + } #endif // _TopoDS_AlertAttribute_HeaderFile diff --git a/src/V3d/V3d_View.cxx b/src/V3d/V3d_View.cxx index b67123ac85..855a72efe3 100644 --- a/src/V3d/V3d_View.cxx +++ b/src/V3d/V3d_View.cxx @@ -507,6 +507,17 @@ void V3d_View::SetAxis (const Standard_Real theX, const Standard_Real theY, co myDefaultViewAxis.SetCoord (theVx, theVy, theVz); } +//============================================================================= +//function : Axis +//purpose : +//============================================================================= +void V3d_View::Axis (Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ, + Standard_Real& theVx, Standard_Real& theVy, Standard_Real& theVz) +{ + myDefaultViewPoint.Coord (theX, theY, theZ); + myDefaultViewAxis.Coord (theVx, theVy, theVz); +} + //============================================================================= //function : SetShadingModel //purpose : diff --git a/src/V3d/V3d_View.hxx b/src/V3d/V3d_View.hxx index d1e6129bf4..055b0b4788 100644 --- a/src/V3d/V3d_View.hxx +++ b/src/V3d/V3d_View.hxx @@ -229,6 +229,12 @@ public: Standard_EXPORT void SetAxis (const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Real Vx, const Standard_Real Vy, const Standard_Real Vz); + //! Returns an axis from its origin and + //! its orientation . + //! This is the current axis for rotations and movements. + Standard_EXPORT void Axis (Standard_Real& X, Standard_Real& Y, Standard_Real& Z, + Standard_Real& Vx, Standard_Real& Vy, Standard_Real& Vz); + //! Defines the shading model for the visualization. Various models are available. Standard_EXPORT void SetShadingModel (const Graphic3d_TypeOfShadingModel theShadingModel); diff --git a/src/XmlDrivers/XmlDrivers_MessageReportStorage.cxx b/src/XmlDrivers/XmlDrivers_MessageReportStorage.cxx index 8a3512f1e5..6ee08d2cbb 100644 --- a/src/XmlDrivers/XmlDrivers_MessageReportStorage.cxx +++ b/src/XmlDrivers/XmlDrivers_MessageReportStorage.cxx @@ -17,8 +17,7 @@ #include #include -#include -#include +#include #include #include @@ -26,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -250,36 +249,18 @@ void XmlDrivers_MessageReportStorage::exportAlertParameters (const Handle(Messag TDataStd_Comment::Set (theAlertLabel, anAttribute->GetDescription()); Standard_CString aDynamicTypeName = anAttribute->DynamicType()->Name(); - if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfReal)->Name()) + if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfValues)->Name()) { - Handle(Message_AttributeVectorOfReal) aRealArrayAlert = Handle(Message_AttributeVectorOfReal)::DownCast (anAttribute); + Handle(Message_AttributeVectorOfValues) aValuesArrayAlert = Handle(Message_AttributeVectorOfValues)::DownCast (anAttribute); // store values - const NCollection_Vector& anArrayValues = aRealArrayAlert->GetValues(); + const NCollection_Vector& anArrayValues = aValuesArrayAlert->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); + Handle(TDataStd_ExtStringArray) aListAttribute = TDataStd_ExtStringArray::Set (theAlertLabel, 0, anArraySize - 1); for (int aValueId = 0; aValueId < anArraySize; aValueId++) - aRealListAttribute->SetValue (aValueId, anArrayValues.Value (aValueId)); - } - else if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfRealVec3)->Name()) - { - Handle(Message_AttributeVectorOfRealVec3) aRealArrayAlert = Handle(Message_AttributeVectorOfRealVec3)::DownCast (anAttribute); - // store values - const NCollection_Vector>& 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 aValue = anArrayValues.Value (aValueId); - aRealListAttribute->SetValue (3 * aValueId, aValue.x()); - aRealListAttribute->SetValue (3 * aValueId + 1, aValue.y()); - aRealListAttribute->SetValue (3 * aValueId + 2, aValue.z()); - } + aListAttribute->SetValue (aValueId, anArrayValues.Value (aValueId)); } } @@ -310,42 +291,24 @@ Handle(Message_Alert) XmlDrivers_MessageReportStorage::importAlertParameters (co Handle(Message_Attribute) aMessageAttribute; if (aDynamicTypeName == STANDARD_TYPE (Message_Attribute)->Name()) aMessageAttribute = new Message_Attribute(); - else if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfReal)->Name()) + else if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfValues)->Name()) { // values - NCollection_Vector anArrayValues; - if (!aParametersLabel.FindAttribute (TDataStd_RealArray::GetID(), anAttribute)) + NCollection_Vector anArrayValues; + if (!aParametersLabel.FindAttribute (TDataStd_ExtStringArray::GetID(), anAttribute)) return Handle(Message_Alert)(); - Handle(TDataStd_RealArray) aValuesAttribute = Handle(TDataStd_RealArray)::DownCast (anAttribute); + Handle(TDataStd_ExtStringArray) aValuesAttribute = Handle(TDataStd_ExtStringArray)::DownCast (anAttribute); if (aValuesAttribute.IsNull()) return Handle(Message_Alert)(); for (int aValueId = aValuesAttribute->Lower(); aValueId <= aValuesAttribute->Upper(); aValueId++) anArrayValues.Append (aValuesAttribute->Value (aValueId)); - aMessageAttribute = new Message_AttributeVectorOfReal (anArrayValues); - } - else if (aDynamicTypeName == STANDARD_TYPE (Message_AttributeVectorOfRealVec3)->Name()) - { - // values - NCollection_Vector> 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 aValue (aValuesAttribute->Value (aValueId), - aValuesAttribute->Value (aValueId + 1), - aValuesAttribute->Value (aValueId + 2)); - anArrayValues.Append (aValue); - } - aMessageAttribute = new Message_AttributeVectorOfRealVec3 (anArrayValues); + Standard_SStream aStream; + Handle(Message_AttributeVectorOfValues) anAlert = new Message_AttributeVectorOfValues (aStream); + anAlert->SetValues (anArrayValues); + aMessageAttribute = anAlert; } if (!aMessageAttribute.IsNull()) diff --git a/src/gp/gp_XY.hxx b/src/gp/gp_XY.hxx index 254fce65f9..ce9273a697 100644 --- a/src/gp/gp_XY.hxx +++ b/src/gp/gp_XY.hxx @@ -22,6 +22,9 @@ #include #include #include + +#include + class Standard_ConstructionError; class Standard_OutOfRange; class gp_Mat2d; @@ -270,6 +273,16 @@ public: + //! Covers point into string in format: (X, Y) + //! \return the string value + Standard_EXPORT TCollection_AsciiString ToString() const; + + + //! Converts text value into parameters if possible, the string format is: (X, Y) + //! \return true if conversion is done + Standard_EXPORT Standard_Boolean FromString (const TCollection_AsciiString& theValue); + + protected: diff --git a/src/gp/gp_XY.lxx b/src/gp/gp_XY.lxx index ecd0605719..12fc78c19e 100644 --- a/src/gp/gp_XY.lxx +++ b/src/gp/gp_XY.lxx @@ -227,3 +227,37 @@ inline gp_XY operator* (const Standard_Real Scalar, return Coord1.Multiplied(Scalar); } +inline TCollection_AsciiString gp_XY::ToString() const +{ + return TCollection_AsciiString ("(") + x + ", " + y + ")"; +} + +inline Standard_Boolean gp_XY::FromString (const TCollection_AsciiString& theValue) +{ + TCollection_AsciiString aCurrentString = theValue, aValueString; + + Standard_Integer aPosition = aCurrentString.Search ("("); + if (aPosition != 1) + return Standard_False; + + aCurrentString = aCurrentString.Split (aPosition); + Standard_Real aX, anY; + // x value + aPosition = aCurrentString.Search (", "); + if (aPosition < 0) + return Standard_False; + aCurrentString = aValueString.Split (aPosition); + aX = aValueString.RealValue(); + aCurrentString = aCurrentString.Split (2); + + // y value + aPosition = aCurrentString.Search (")"); + if (aPosition < 0) + return Standard_False; + aCurrentString = aValueString.Split (aPosition); + anY = aValueString.RealValue(); + + x = aX; + y = anY; + return Standard_True; +} diff --git a/src/gp/gp_XYZ.hxx b/src/gp/gp_XYZ.hxx index 1ecb7d2605..f551afd25e 100644 --- a/src/gp/gp_XYZ.hxx +++ b/src/gp/gp_XYZ.hxx @@ -22,6 +22,9 @@ #include #include #include + +#include + class Standard_ConstructionError; class Standard_OutOfRange; class gp_Mat; @@ -324,6 +327,15 @@ public: void SetLinearForm (const gp_XYZ& XYZ1, const gp_XYZ& XYZ2); + //! Covers point into string in format: (X, Y, Z) + //! \return the string value + Standard_EXPORT TCollection_AsciiString ToString() const; + + + //! Converts text value into parameters if possible, the string format is: (X, Y, Z) + //! \return true if conversion is done + Standard_EXPORT Standard_Boolean FromString (const TCollection_AsciiString& theValue); + protected: diff --git a/src/gp/gp_XYZ.lxx b/src/gp/gp_XYZ.lxx index f97590738c..e56f801ab2 100644 --- a/src/gp/gp_XYZ.lxx +++ b/src/gp/gp_XYZ.lxx @@ -306,8 +306,50 @@ inline gp_XYZ operator* (const Standard_Real Scalar, const gp_XYZ& Coord1) { return Coord1.Multiplied (Scalar); } +inline TCollection_AsciiString gp_XYZ::ToString() const +{ + return TCollection_AsciiString ("(") + x + ", " + y + ", " + z + ")"; +} - - - +inline Standard_Boolean gp_XYZ::FromString (const TCollection_AsciiString& theValue) +{ + TCollection_AsciiString aCurrentString = theValue, aValueString; + + Standard_Integer aPosition = aCurrentString.Search ("("); + if (aPosition != 1) + return Standard_False; + + aCurrentString = aCurrentString.Split (aPosition); + Standard_Real aX, anY, aZ; + // x value + aPosition = aCurrentString.Search (", "); + if (aPosition < 0) + return Standard_False; + aValueString = aCurrentString; + aCurrentString = aValueString.Split (aPosition - 1); + aX = aValueString.RealValue(); + aCurrentString = aCurrentString.Split (2); + + // y value + aPosition = aCurrentString.Search (", "); + if (aPosition < 0) + return Standard_False; + aValueString = aCurrentString; + aCurrentString = aValueString.Split (aPosition - 1); + anY = aValueString.RealValue(); + aCurrentString = aCurrentString.Split (2); + + // z value + aPosition = aCurrentString.Search (")"); + if (aPosition < 0) + return Standard_False; + aValueString = aCurrentString; + aCurrentString = aValueString.Split (aPosition); + aZ = aValueString.RealValue(); + + x = aX; + y = anY; + z = aZ; + return Standard_True; +} diff --git a/tools/DFBrowser/DFBrowser_Window.cxx b/tools/DFBrowser/DFBrowser_Window.cxx index 5801326f84..cad3f7c1d4 100644 --- a/tools/DFBrowser/DFBrowser_Window.cxx +++ b/tools/DFBrowser/DFBrowser_Window.cxx @@ -420,6 +420,11 @@ void DFBrowser_Window::Init (const NCollection_List& } return; } + else + { + if (anApplication.IsNull() && CDF_Session::Exists()) + anApplication = Handle(TDocStd_Application)::DownCast (CDF_Session::CurrentSession()->CurrentApplication()); + } myModule = new DFBrowser_Module(); myModule->CreateViewModel (myMainWindow); @@ -659,7 +664,7 @@ void DFBrowser_Window::onExpand() for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) { int aLevels = 2; - setExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels); + TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels); } QApplication::restoreOverrideCursor(); } @@ -677,7 +682,7 @@ void DFBrowser_Window::onExpandAll() for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) { int aLevels = -1; - setExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels); + TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels); } QApplication::restoreOverrideCursor(); } @@ -692,7 +697,7 @@ void DFBrowser_Window::onCollapseAll() QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) { int aLevels = -1; - setExpanded (myTreeView, aSelectedIndices[aSelectedId], false, aLevels); + TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], false, aLevels); } } @@ -988,26 +993,3 @@ void DFBrowser_Window::findPresentations (const QModelIndexList& theIndices, AIS thePresentations.Append (aPresentation); } } - -// ======================================================================= -// function : setExpanded -// purpose : -// ======================================================================= -void DFBrowser_Window::setExpanded (QTreeView* theTreeView, const QModelIndex& theIndex, const bool isExpanded, - int& theLevels) -{ - bool isToExpand = theLevels == -1 || theLevels > 0; - if (!isToExpand) - return; - - theTreeView->setExpanded (theIndex, isExpanded); - if (theLevels != -1) - theLevels--; - - QAbstractItemModel* aModel = theTreeView->model(); - for (int aRowId = 0, aRows = aModel->rowCount (theIndex); aRowId < aRows; aRowId++) - { - int aLevels = theLevels; - setExpanded (theTreeView, aModel->index (aRowId, 0, theIndex), isExpanded, aLevels); - } -} diff --git a/tools/DFBrowser/DFBrowser_Window.hxx b/tools/DFBrowser/DFBrowser_Window.hxx index 93fb3d7e0c..66f3479735 100644 --- a/tools/DFBrowser/DFBrowser_Window.hxx +++ b/tools/DFBrowser/DFBrowser_Window.hxx @@ -206,13 +206,6 @@ protected: //! \return container of presentations or NULL void findPresentations (const QModelIndexList& theIndices, AIS_ListOfInteractive& thePresentations); - //! Recursive items expanding in tree view staring from the index - //! \param theTreeView an OCAF tree view - //! \param theParentIndex an index which children should be expanded - //! \param isExpanded a boolean state if the item should be expanded or collapsed - //! \param theLevels a number of levels to be expanded, or -1 for all levels - static void setExpanded (QTreeView* theTreeView, const QModelIndex& theParentIndex, const bool isExpanded, int& theLevels); - private: DFBrowser_Module* myModule; //!< current module diff --git a/tools/MessageModel/FILES b/tools/MessageModel/FILES index 10dbf13fbe..fb8efa0e50 100644 --- a/tools/MessageModel/FILES +++ b/tools/MessageModel/FILES @@ -8,14 +8,14 @@ MessageModel_ItemBase.cxx MessageModel_ItemBase.hxx MessageModel_ItemReport.cxx MessageModel_ItemReport.hxx +MessageModel_ItemReportProperties.cxx +MessageModel_ItemReportProperties.hxx MessageModel_ItemRoot.cxx MessageModel_ItemRoot.hxx MessageModel_ReportCallBack.cxx MessageModel_ReportCallBack.hxx -MessageModel_TableModelRealValues.cxx -MessageModel_TableModelRealValues.hxx -MessageModel_TableModelRealVec3Values.cxx -MessageModel_TableModelRealVec3Values.hxx +MessageModel_TableModelValues.cxx +MessageModel_TableModelValues.hxx MessageModel_Tools.cxx MessageModel_Tools.hxx MessageModel_TreeModel.cxx diff --git a/tools/MessageModel/MessageModel.qrc b/tools/MessageModel/MessageModel.qrc index b8cc9bd31c..6862cafe7d 100644 --- a/tools/MessageModel/MessageModel.qrc +++ b/tools/MessageModel/MessageModel.qrc @@ -1,7 +1,6 @@ icons/item_shape.png - icons/item_vectorOfReal.png - icons/item_vectorOfRealVec3.png + icons/item_vectorOfValues.png diff --git a/tools/MessageModel/MessageModel_ActionType.hxx b/tools/MessageModel/MessageModel_ActionType.hxx index d5092aa08e..de036fefd4 100644 --- a/tools/MessageModel/MessageModel_ActionType.hxx +++ b/tools/MessageModel/MessageModel_ActionType.hxx @@ -21,7 +21,9 @@ 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 + MessageModel_ActionType_Clear, //!< clear Message_Report alerts + MessageModel_ActionType_ExportToShapeView, //!< export TopoDS_Shape of selected item into TKShapeView plugin + MessageModel_ActionType_Test //!< test alerts }; #endif diff --git a/tools/MessageModel/MessageModel_Actions.cxx b/tools/MessageModel/MessageModel_Actions.cxx index 57fde16fa5..140aaaf043 100644 --- a/tools/MessageModel/MessageModel_Actions.cxx +++ b/tools/MessageModel/MessageModel_Actions.cxx @@ -24,15 +24,26 @@ #include #include +#include + #include -#include +#include +#include #include #include #include #include #include #include +#include + +#define DEBUG_ALERTS + +#ifdef DEBUG_ALERTS +#include +#include +#endif // ======================================================================= // function : Constructor @@ -46,8 +57,14 @@ MessageModel_Actions::MessageModel_Actions (QWidget* theParent, 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_Clear, + ViewControl_Tools::CreateAction ("Clear", SLOT (OnClearReport()), parent(), this)); myActions.insert (MessageModel_ActionType_ExportToShapeView, ViewControl_Tools::CreateAction (tr ("Export to ShapeView"), SLOT (OnExportToShapeView()), parent(), this)); +#ifdef DEBUG_ALERTS + myActions.insert (MessageModel_ActionType_Test, + ViewControl_Tools::CreateAction ("Test", SLOT (OnTestAlerts()), parent(), this)); +#endif } // ======================================================================= @@ -98,9 +115,15 @@ void MessageModel_Actions::AddMenuActions (const QModelIndexList& theSelectedInd { theMenu->addAction (myActions[MessageModel_ActionType_Deactivate]); theMenu->addAction (myActions[MessageModel_ActionType_Activate]); + theMenu->addAction (myActions[MessageModel_ActionType_Clear]); +#ifdef DEBUG_ALERTS + theMenu->addAction (myActions[MessageModel_ActionType_Test]); +#endif } else if (anAlertItem) + { theMenu->addAction (myActions[MessageModel_ActionType_ExportToShapeView]); + } theMenu->addSeparator(); } @@ -146,7 +169,7 @@ void MessageModel_Actions::OnDeactivateReport() return; aReport->SetActive (Standard_False); - ((MessageModel_TreeModel*)mySelectionModel)->EmitDataChanged (aReportIndex, aReportIndex); + ((MessageModel_TreeModel*)mySelectionModel->model())->EmitDataChanged (aReportIndex, aReportIndex); } // ======================================================================= @@ -161,7 +184,22 @@ void MessageModel_Actions::OnActivateReport() return; aReport->SetActive (Standard_True); - ((MessageModel_TreeModel*)mySelectionModel)->EmitDataChanged (aReportIndex, aReportIndex); + ((MessageModel_TreeModel*)mySelectionModel->model())->EmitDataChanged (aReportIndex, aReportIndex); +} + +// ======================================================================= +// function : OnClearReport +// purpose : +// ======================================================================= +void MessageModel_Actions::OnClearReport() +{ + QModelIndex aReportIndex; + Handle(Message_Report) aReport = getSelectedReport (aReportIndex); + if (aReport.IsNull()) + return; + + aReport->Clear(); + ((MessageModel_TreeModel*)mySelectionModel->model())->EmitDataChanged (aReportIndex, aReportIndex); } // ======================================================================= @@ -199,11 +237,18 @@ void MessageModel_Actions::OnExportToShapeView() if (anAlert.IsNull()) continue; - Handle(TopoDS_AlertWithShape) aShapeAlert = Handle(TopoDS_AlertWithShape)::DownCast (anAlert); - if (aShapeAlert.IsNull() || aShapeAlert->GetShape().IsNull()) + Handle(Message_AlertExtended) anExtAlert = Handle(Message_AlertExtended)::DownCast (anAlert); + if (anExtAlert.IsNull()) + continue; + + Handle(Message_Attribute) anAttribute = anExtAlert->Attribute(); + if (anAttribute.IsNull()) + continue; + + if (!anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertAttribute))) continue; - const TopoDS_Shape aShape = aShapeAlert->GetShape(); + const TopoDS_Shape aShape = Handle(TopoDS_AlertAttribute)::DownCast (anAttribute)->GetShape(); if (aShape.IsNull()) continue; aPluginParameters.Append (aShape.TShape()); @@ -219,3 +264,50 @@ void MessageModel_Actions::OnExportToShapeView() QMessageBox::information (0, "Information", QString ("TShapes '%1' are sent to %2 tool.") .arg (anExportedPointers.join (", ")).arg (QString (aPluginName.ToCString()))); } + +// ======================================================================= +// function : OnTestAlerts +// purpose : +// ======================================================================= +#include +#include +void MessageModel_Actions::OnTestAlerts() +{ +#ifdef DEBUG_ALERTS + QModelIndex aReportIndex; + Handle(Message_Report) aReport = getSelectedReport (aReportIndex); + if (aReport.IsNull()) + return; + + Message_PerfMeter aPerfMeter; + MESSAGE_INFO ("MessageModel_Actions::OnTestAlerts()", "", &aPerfMeter, NULL); + unsigned int start_time = clock(); + //Standard_Real aSystemSeconds, aCurrentSeconds; + //OSD_Chronometer::GetThreadCPU (aCurrentSeconds, aSystemSeconds); + + Standard_Integer aCounter = 50000; + Standard_Real aValue = 0., aValue2 = 0.1; + for (int j = 0; j < aCounter; j++) + { + for (int i = 0; i < aCounter; i++) + { + aValue = (aValue * 2. + 3.) * 0.5 - 0.3 * 0.5; + + Standard_Real aValue3 = aValue + aValue2 * 0.2; + //MESSAGE_INFO ("Calculate", aValue, &aPerfMeter, NULL); + } + } + + ((MessageModel_TreeModel*)mySelectionModel->model())->EmitLayoutChanged(); + + //Standard_Real aSystemSeconds1, aCurrentSeconds1; + //OSD_Chronometer::GetThreadCPU (aCurrentSeconds1, aSystemSeconds1); + + //std::cout << aValue << std::endl; + //std::cout << "user time = " << aCurrentSeconds1 - aCurrentSeconds + // << ", system time = " << aSystemSeconds1 - aSystemSeconds << std::endl; + + unsigned int end_time = clock(); + std::cout << "clock() = " << end_time - start_time << std::endl; +#endif +} diff --git a/tools/MessageModel/MessageModel_Actions.hxx b/tools/MessageModel/MessageModel_Actions.hxx index 3315a9f652..71da2a0935 100644 --- a/tools/MessageModel/MessageModel_Actions.hxx +++ b/tools/MessageModel/MessageModel_Actions.hxx @@ -16,21 +16,19 @@ #ifndef MessageModel_Actions_H #define MessageModel_Actions_H -#ifdef _MSC_VER - #pragma warning(disable : 4127 4718) // conditional expression is constant, recursive call has no side effects -#endif - #include #include #include #include +#include #include #include #include #include #include +#include class Message_Report; class MessageModel_TreeModel; @@ -78,9 +76,15 @@ public slots: //! Set selected report active void OnActivateReport(); + //! Clears container of alerts of selected report + void OnClearReport(); + //! Exports the first selected shape into ShapeViewer plugin. void OnExportToShapeView(); + //! Sending several alerts to check message-alert-tool mechanizm + void OnTestAlerts(); + protected: //! Returns report of selected tree view item if a report item is selected //! \param theReportIndex tree model index of the found report diff --git a/tools/MessageModel/MessageModel_ItemAlert.cxx b/tools/MessageModel/MessageModel_ItemAlert.cxx index f149cf5711..b94e5ac006 100644 --- a/tools/MessageModel/MessageModel_ItemAlert.cxx +++ b/tools/MessageModel/MessageModel_ItemAlert.cxx @@ -18,18 +18,24 @@ #include #include #include +#include +#include #include #include -#include -#include +#include +#include #include +#include #include -#include +#include +#include #include #include +#include + // ======================================================================= // function : initValue @@ -59,18 +65,19 @@ QVariant MessageModel_ItemAlert::initValue (const int theRole) const } 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) { - if (anAlert->IsKind (STANDARD_TYPE (TopoDS_AlertWithShape))) + Handle(Message_AlertExtended) anExtAttribute = Handle(Message_AlertExtended)::DownCast (anAlert); + if (anExtAttribute.IsNull()) + return QVariant(); + + Handle(Message_Attribute) anAttribute = anExtAttribute->Attribute(); + + if (anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertAttribute))) return QIcon (":/icons/item_shape.png"); - else if (anAlert->IsKind (STANDARD_TYPE (Message_AttributeVectorOfReal))) - return QIcon (":/icons/item_vectorOfReal.png"); - else if (anAlert->IsKind (STANDARD_TYPE (Message_AttributeVectorOfRealVec3))) - return QIcon (":/icons/item_vectorOfRealVec3.png"); + else if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfValues))) + return QIcon (":/icons/item_vectorOfValues.png"); else return QVariant(); } @@ -140,17 +147,26 @@ int MessageModel_ItemAlert::initRowCount() const if (aCompositeAlert.IsNull()) return GetUnitedAlerts().Size(); - int aRowCount = 0; - NCollection_Vector aUnitedAlerts; + MessageModel_ItemAlert* aCurrentItem = (MessageModel_ItemAlert*)this; for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++) { const Message_ListOfAlert& anAlerts = aCompositeAlert->GetAlerts ((Message_Gravity)aGravityId); if (isUniteAlerts()) - GetUnitedAlerts (anAlerts, aUnitedAlerts); + { + MessageModel_Tools::GetUnitedAlerts (anAlerts, aCurrentItem->myChildAlerts); + } else - aRowCount += anAlerts.Size(); + { + for (Message_ListOfAlert::Iterator anIt(anAlerts); anIt.More(); anIt.Next()) + { + Message_ListOfAlert aCurAlerts; + aCurAlerts.Append (anIt.Value()); + aCurrentItem->myChildAlerts.Bind(myChildAlerts.Size(), aCurAlerts); + } + } } - return isUniteAlerts() ? aUnitedAlerts.Size() : aRowCount; + + return aCurrentItem->myChildAlerts.Size(); } // ======================================================================= @@ -170,90 +186,51 @@ void MessageModel_ItemAlert::Init() { MessageModel_ItemReportPtr aReportItem = itemDynamicCast (Parent()); MessageModel_ItemAlertPtr anAlertItem; - Handle(Message_Report) aReport; Handle(Message_Alert) anAlert; if (aReportItem) - aReport = aReportItem->GetReport(); - else - { - anAlertItem = itemDynamicCast (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++) + Message_ListOfAlert anAlerts; + if (aReportItem->GetChildAlerts (Row(), anAlerts)) { - if (aCurrentSubId != Row()) - continue; - myAlert = anAlertsIt.Value(); - MessageModel_ItemBase::Init(); - return; + if (anAlerts.Size() == 1) + myAlert = anAlerts.First(); + else + myUnitedAlerts = anAlerts; } - 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 aUnitedAlerts; - int aRowId = Row(); - int aPreviousAlertsCount = 0; - for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++) + else { - if (!aReport.IsNull()) - anAlerts = aReport->GetAlerts ((Message_Gravity)aGravityId); - else if (!anAlert.IsNull()) - { - Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast(anAlert); - Handle(Message_CompositeAlerts) aCompositeAlert = !anExtendedAlert.IsNull() ? anExtendedAlert->GetCompositeAlerts() - : Handle(Message_CompositeAlerts)(); - if (!aCompositeAlert.IsNull()) - anAlerts = aCompositeAlert->GetAlerts ((Message_Gravity)aGravityId); - } - - if (isReversed()) - anAlerts.Reverse(); - - if (isUniteAlerts()) + anAlertItem = itemDynamicCast (Parent()); + if (anAlertItem) { - GetUnitedAlerts (anAlerts, aUnitedAlerts); - if (aRowId < aUnitedAlerts.Size()) + Message_ListOfAlert anAlerts; + if (anAlertItem->GetChildAlerts (Row(), anAlerts)) { - anAlerts = aUnitedAlerts.Value (aRowId); - if (anAlerts.Size() == 1) myAlert = anAlerts.First(); else myUnitedAlerts = anAlerts; - - MessageModel_ItemBase::Init(); - return; } } - else + } + + Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast(myAlert); + if (!anExtendedAlert.IsNull() && !anExtendedAlert->Attribute().IsNull()) + { + Handle(Message_Attribute) anAttribute = anExtendedAlert->Attribute(); + if (!anAttribute.IsNull()) { - 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(); + if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeObject))) + myPresentations.Append (Handle(Message_AttributeObject)::DownCast (anAttribute)->GetObject()); + if (anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertAttribute))) + myPresentations.Append (new ViewControl_TransientShape (Handle(TopoDS_AlertAttribute)::DownCast (anAttribute)->GetShape())); } + TCollection_AsciiString aDescription = anExtendedAlert->Attribute()->GetDescription(); + Bnd_Box aBox; + if (aBox.FromString (aDescription)) + myPresentations.Append (new ViewControl_TransientShape (ViewControl_Tools::CreateShape (aBox))); } + MessageModel_ItemBase::Init(); } // ======================================================================= @@ -265,6 +242,8 @@ void MessageModel_ItemAlert::Reset() MessageModel_ItemBase::Reset(); myAlert = Handle(Message_Alert)(); myUnitedAlerts.Clear(); + myChildAlerts.Clear(); + myPresentations.Clear(); } // ======================================================================= @@ -314,29 +293,3 @@ double MessageModel_ItemAlert::AmountElapsedTime(const Handle(Message_Alert)& th return anAmountTime; } - -// ======================================================================= -// function : GetUnitedAlerts -// purpose : -// ======================================================================= -void MessageModel_ItemAlert::GetUnitedAlerts(const Message_ListOfAlert& theAlerts, - NCollection_Vector& 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(); - } - } -} diff --git a/tools/MessageModel/MessageModel_ItemAlert.hxx b/tools/MessageModel/MessageModel_ItemAlert.hxx index 9fda8eeddc..f139fb54c2 100644 --- a/tools/MessageModel/MessageModel_ItemAlert.hxx +++ b/tools/MessageModel/MessageModel_ItemAlert.hxx @@ -20,12 +20,16 @@ #include #include #include +#include #include #include +#include #include #include +#include +#include #include class QAbstractTableModel; @@ -53,6 +57,9 @@ public: //! Returns the current shape const Handle(Message_Alert)& GetAlert() const { return myAlert; } + //! Returns alert of the report for the parameter row + Standard_Boolean GetChildAlerts (const int theRow, Message_ListOfAlert& theAlerts) const { return myChildAlerts.Find(theRow, theAlerts); } + //! Returns united alerts or empty list const Message_ListOfAlert& GetUnitedAlerts() const { return myUnitedAlerts; } @@ -78,17 +85,19 @@ public: //! \return instance of the shape const TopoDS_Shape& GetCustomShape() const { return myCustomShape; } + //! Returns presentation of the attribute to be visualized in the view + //! \param theRow a model index row + //! \param theColumn a model index column + //! \thePresentations [out] container of presentation handles to be visualized + void GetPresentations (NCollection_List& thePresentations) + { thePresentations.Append (myPresentations); } + + //! 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 & theUnitedAlerts); - protected: //! Initialize the current item. It is empty because Reset() is also empty. @@ -122,7 +131,11 @@ private: private: Handle(Message_Alert) myAlert; Message_ListOfAlert myUnitedAlerts; + + NCollection_DataMap myChildAlerts; //!< container of child alerts + TopoDS_Shape myCustomShape; + NCollection_List myPresentations; }; #endif diff --git a/tools/MessageModel/MessageModel_ItemReport.cxx b/tools/MessageModel/MessageModel_ItemReport.cxx index 07bd1be492..a2af8df74e 100644 --- a/tools/MessageModel/MessageModel_ItemReport.cxx +++ b/tools/MessageModel/MessageModel_ItemReport.cxx @@ -15,12 +15,16 @@ #include -#include #include +#include +#include +#include #include +#include #include +#include // ======================================================================= // function : initValue @@ -84,20 +88,25 @@ int MessageModel_ItemReport::initRowCount() const if (aReport.IsNull()) return 0; - int aRowCount = 0; - NCollection_Vector aUnitedAlerts; + MessageModel_ItemReport* aCurrentItem = (MessageModel_ItemReport*)this; 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(); + MessageModel_Tools::GetUnitedAlerts (anAlerts, aCurrentItem->myChildAlerts); } else - aRowCount += anAlerts.Size(); + { + for (Message_ListOfAlert::Iterator anIt(anAlerts); anIt.More(); anIt.Next()) + { + Message_ListOfAlert aCurAlerts; + aCurAlerts.Append (anIt.Value()); + aCurrentItem->myChildAlerts.Bind(myChildAlerts.Size(), aCurAlerts); + } + } } - return isUniteAlerts() ? aUnitedAlerts.Size() : aRowCount; + return aCurrentItem->myChildAlerts.Size(); } // ======================================================================= @@ -117,6 +126,11 @@ void MessageModel_ItemReport::Init() { MessageModel_ItemRootPtr aRootItem = itemDynamicCast (Parent()); myReport = aRootItem ? aRootItem->GetReport (Row(), myDescription) : Handle(Message_Report)(); + + TreeModel_ItemBasePtr anItem = Parent()->Child (Row(), Column(), false); + SetProperties (new MessageModel_ItemReportProperties(anItem)); + + MessageModel_ItemBase::Init(); } // ======================================================================= @@ -137,6 +151,7 @@ void MessageModel_ItemReport::Reset() { MessageModel_ItemBase::Reset(); myReport = Handle(Message_Report)(); + myChildAlerts.Clear(); } // ======================================================================= @@ -189,3 +204,24 @@ double MessageModel_ItemReport::AmountElapsedTime (const Handle(Message_Report)& } return anAmountTime; } + +// ======================================================================= +// function : FindReport +// purpose : +// ======================================================================= +Handle(Message_Report) MessageModel_ItemReport::FindReport (const MessageModel_ItemBasePtr& theItem) +{ + Handle(Message_Report) aReport; + + MessageModel_ItemBasePtr anItem = theItem; + while (anItem) + { + MessageModel_ItemReportPtr aReportItem = itemDynamicCast(anItem); + + if (aReportItem) + return aReportItem->GetReport(); + + anItem = itemDynamicCast(anItem->Parent()); + } + return NULL; +} diff --git a/tools/MessageModel/MessageModel_ItemReport.hxx b/tools/MessageModel/MessageModel_ItemReport.hxx index 067861daec..d76b56b466 100644 --- a/tools/MessageModel/MessageModel_ItemReport.hxx +++ b/tools/MessageModel/MessageModel_ItemReport.hxx @@ -19,10 +19,14 @@ #include #include #include +#include #include +#include +#include #include #include +#include class MessageModel_ItemReport; typedef QExplicitlySharedDataPointer MessageModel_ItemReportPtr; @@ -47,6 +51,10 @@ public: //! Returns the current shape const Handle(Message_Report)& GetReport() const { return myReport; } + //! Returns alert of the report for the parameter row + Standard_Boolean GetChildAlerts (const int theRow, Message_ListOfAlert& theAlerts) const { return myChildAlerts.Find(theRow, theAlerts); } + + //! Returns the report description or NULL const TCollection_AsciiString& GetDescription() const { return myDescription; } //! Inits the item, fills internal containers @@ -72,6 +80,9 @@ public: //! \return double value Standard_EXPORT static double AmountElapsedTime (const Handle(Message_Report)& theReport); + //! Returns report of the item + static Handle(Message_Report) FindReport (const MessageModel_ItemBasePtr& thetItem); + protected: //! Initialize the current item. It is empty because Reset() is also empty. @@ -99,6 +110,8 @@ private: private: + NCollection_DataMap myChildAlerts; //!< container of child alerts + Handle(Message_Report) myReport; //!< current report TCollection_AsciiString myDescription; //!< description }; diff --git a/tools/MessageModel/MessageModel_ItemReportProperties.cxx b/tools/MessageModel/MessageModel_ItemReportProperties.cxx new file mode 100644 index 0000000000..4538856399 --- /dev/null +++ b/tools/MessageModel/MessageModel_ItemReportProperties.cxx @@ -0,0 +1,102 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(MessageModel_ItemReportProperties, TreeModel_ItemProperties) + +// ======================================================================= +// function : RowCount +// purpose : +// ======================================================================= + +int MessageModel_ItemReportProperties::GetTableRowCount() const +{ + return 1; +} + +// ======================================================================= +// function : Data +// purpose : +// ======================================================================= + +QVariant MessageModel_ItemReportProperties::GetTableData (const int theRow, const int theColumn, int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(Message_Report) aReport = getItemReport(); + switch (theRow) + { + case 0: return theColumn == 0 ? QVariant ("Limit") : QVariant (aReport->GetLimit()); + default: break; + } + + return QVariant(); +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType MessageModel_ItemReportProperties::GetTableEditType (const int theRow, const int) const +{ + switch (theRow) + { + case 0: return ViewControl_EditType_Spin; + default: return ViewControl_EditType_None; + } +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool MessageModel_ItemReportProperties::SetTableData (const int theRow, const int theColumn, const QVariant& theValue) +{ + Handle(Message_Report) aReport = getItemReport(); + switch (theRow) + { + case 0: aReport->SetLimit (theValue.toInt()); break; + default: break; + } + return true; +} + +// ======================================================================= +// function : getItemReport +// purpose : +// ======================================================================= + +Handle(Message_Report) MessageModel_ItemReportProperties::getItemReport() const +{ + MessageModel_ItemReportPtr aReportItem = itemDynamicCast(getItem()); + if (!aReportItem) + return NULL; + + return aReportItem->GetReport(); +} diff --git a/tools/MessageModel/MessageModel_ItemReportProperties.hxx b/tools/MessageModel/MessageModel_ItemReportProperties.hxx new file mode 100644 index 0000000000..2970397b9f --- /dev/null +++ b/tools/MessageModel/MessageModel_ItemReportProperties.hxx @@ -0,0 +1,83 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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_ItemReportProperties_H +#define MessageModel_ItemReportProperties_H + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +class QItemDelegate; + +DEFINE_STANDARD_HANDLE (MessageModel_ItemReportProperties, TreeModel_ItemProperties) + +//! \class MessageModel_ItemReportProperties +//! \brief This is an interace for ViewControl_TableModel to give real values of the model +//! It should be filled or redefined. +class MessageModel_ItemReportProperties : public TreeModel_ItemProperties +{ +public: + + //! Constructor + Standard_EXPORT MessageModel_ItemReportProperties (TreeModel_ItemBasePtr theItem) + : TreeModel_ItemProperties (theItem) {} + + //! Destructor + virtual ~MessageModel_ItemReportProperties() {} + + //! 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 GetTableRowCount() 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 theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return value intepreted depending on the given role + Standard_EXPORT virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole = Qt::DisplayRole) const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + Standard_EXPORT virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + Standard_EXPORT virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT (MessageModel_ItemReportProperties, TreeModel_ItemProperties) + +protected: + //! Returns report + Handle(Message_Report) getItemReport() const; +}; + +#endif diff --git a/tools/MessageModel/MessageModel_ItemRoot.cxx b/tools/MessageModel/MessageModel_ItemRoot.cxx index 3d46c1f61c..6165384143 100644 --- a/tools/MessageModel/MessageModel_ItemRoot.cxx +++ b/tools/MessageModel/MessageModel_ItemRoot.cxx @@ -51,6 +51,21 @@ const Handle(Message_Report)& MessageModel_ItemRoot::GetReport (const int theRow return aReportsIt.Value().myReport; } +// ======================================================================= +// function : HasReport +// purpose : +// ======================================================================= +Standard_Boolean MessageModel_ItemRoot::HasReport (const Handle(Message_Report)& theReport) +{ + NCollection_List::Iterator aReportsIt (myReports); + for (int aRowId = 0; aReportsIt.More(); aReportsIt.Next(), aRowId++) + { + if (aReportsIt.Value().myReport == theReport) + return Standard_True; + } + return Standard_False; +} + // ======================================================================= // function : initValue // purpose : diff --git a/tools/MessageModel/MessageModel_ItemRoot.hxx b/tools/MessageModel/MessageModel_ItemRoot.hxx index 337576e21d..f98e31b3d4 100644 --- a/tools/MessageModel/MessageModel_ItemRoot.hxx +++ b/tools/MessageModel/MessageModel_ItemRoot.hxx @@ -66,6 +66,11 @@ public: 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(); } diff --git a/tools/MessageModel/MessageModel_ReportCallBack.hxx b/tools/MessageModel/MessageModel_ReportCallBack.hxx index d59fea8ba2..be5d7c98f3 100644 --- a/tools/MessageModel/MessageModel_ReportCallBack.hxx +++ b/tools/MessageModel/MessageModel_ReportCallBack.hxx @@ -36,7 +36,7 @@ public: // 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(); } + virtual void Update(const Handle(Message_Alert)& theAlert) { (void)theAlert; /*myCommunicator->UpdateContent();*/ } // OCCT RTTI DEFINE_STANDARD_RTTIEXT(MessageModel_ReportCallBack, Message_ReportCallBack) diff --git a/tools/MessageModel/MessageModel_TableModelRealValues.cxx b/tools/MessageModel/MessageModel_TableModelRealValues.cxx deleted file mode 100644 index 0e16f14c30..0000000000 --- a/tools/MessageModel/MessageModel_TableModelRealValues.cxx +++ /dev/null @@ -1,106 +0,0 @@ -// 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 - -#include - -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)) -{ - SetUseTableProperties (true); - SetUseTablePropertiesXStep (true, -1); - - SetDefaultSectionSize (Qt::Horizontal, theSectionWidth); -} - -// ======================================================================= -// function : ColumnCount -// purpose : -// ======================================================================= - -int MessageModel_TableModelRealValues::ColumnCount (const QModelIndex&) const -{ - return myAttribute->GetValues().Length(); -} - -// ======================================================================= -// function : Data -// purpose : -// ======================================================================= - -QVariant MessageModel_TableModelRealValues::Data (const int, const int theColumn, int theRole) const -{ - if (theRole == Qt::DisplayRole && theColumn < myAttribute->GetValues().Length()) - { - return myAttribute->GetValues().Value(theColumn); - } - - return QVariant(); -} - -// ======================================================================= -// 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 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++) - { - 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); -} diff --git a/tools/MessageModel/MessageModel_TableModelRealValues.hxx b/tools/MessageModel/MessageModel_TableModelRealValues.hxx deleted file mode 100644 index 346b3bb7c5..0000000000 --- a/tools/MessageModel/MessageModel_TableModelRealValues.hxx +++ /dev/null @@ -1,66 +0,0 @@ -// 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 - -#ifdef _MSC_VER - #pragma warning(disable : 4127 4718) // conditional expression is constant, recursive call has no side effects -#endif - -#include - -#include - -//! \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 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 { (void)theParent; return 1; } - - //! 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; - -private: - Handle(Message_AttributeVectorOfReal) myAttribute; //!< alert attribute, container of table values -}; - -#endif diff --git a/tools/MessageModel/MessageModel_TableModelRealVec3Values.cxx b/tools/MessageModel/MessageModel_TableModelRealVec3Values.cxx deleted file mode 100644 index 1e653f0d8d..0000000000 --- a/tools/MessageModel/MessageModel_TableModelRealVec3Values.cxx +++ /dev/null @@ -1,122 +0,0 @@ -// 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 - -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= - -MessageModel_TableModelRealVec3Values::MessageModel_TableModelRealVec3Values (const Handle(Message_Attribute)& theAttribute, - const int theSectionWidth) - : myAttribute (Handle(Message_AttributeVectorOfRealVec3)::DownCast (theAttribute)) -{ - SetUseTableProperties (true); - - SetDefaultSectionSize (Qt::Horizontal, theSectionWidth); -} - -// ======================================================================= -// function : ColumnCount -// purpose : -// ======================================================================= - -int MessageModel_TableModelRealVec3Values::ColumnCount (const QModelIndex&) const -{ - return myAttribute->GetValues().Length(); -} - -// ======================================================================= -// 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 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 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> aValues = myAttribute->GetValues(); - int aValuesSize = aValues.Length(); - if (aValuesSize < 1) - return; - - double aXMinValue = aValues.First().x(), aXMaxValue = aValues.First().x(); - NCollection_Vec3 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); -} diff --git a/tools/MessageModel/MessageModel_TableModelRealVec3Values.hxx b/tools/MessageModel/MessageModel_TableModelRealVec3Values.hxx deleted file mode 100644 index d10a1de91c..0000000000 --- a/tools/MessageModel/MessageModel_TableModelRealVec3Values.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// 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 - -#ifdef _MSC_VER - #pragma warning(disable : 4127 4718) // conditional expression is constant, recursive call has no side effects -#endif - -#include - -#include - -//! \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 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 { (void)theParent; return 1; } - - //! 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; - -private: - Handle(Message_AttributeVectorOfRealVec3) myAttribute; //!< alert attribute, container of table values -}; - -#endif diff --git a/tools/MessageModel/MessageModel_TableModelValues.cxx b/tools/MessageModel/MessageModel_TableModelValues.cxx new file mode 100644 index 0000000000..9b295cf8bd --- /dev/null +++ b/tools/MessageModel/MessageModel_TableModelValues.cxx @@ -0,0 +1,75 @@ +// 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 + +#include + +#include + +const int REAL_SIGNS = 16; + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= + +MessageModel_TableModelValues::MessageModel_TableModelValues (const Handle(Message_Attribute)& theAttribute, + const int theSectionWidth) + : myAttribute (Handle(Message_AttributeVectorOfValues)::DownCast (theAttribute)) +{ + SetDefaultSectionSize (Qt::Horizontal, theSectionWidth); +} + +// ======================================================================= +// function : ColumnCount +// purpose : +// ======================================================================= + +int MessageModel_TableModelValues::ColumnCount (const QModelIndex&) const +{ + return myAttribute->GetColumnCount(); +} + +// ======================================================================= +// function : RowCount +// purpose : +// ======================================================================= +int MessageModel_TableModelValues::RowCount (const QModelIndex& theParent) const +{ + int aColumnCount = ColumnCount (theParent); + if (!aColumnCount) + return 0; + + return myAttribute->GetValues().Length() / aColumnCount; +} + +// ======================================================================= +// function : Data +// purpose : +// ======================================================================= + +QVariant MessageModel_TableModelValues::Data (const int theRow, const int theColumn, int theRole) const +{ + int aColumnCount = ColumnCount (QModelIndex()); + int anIndex = theRow * aColumnCount + theColumn; + + if (theRole == Qt::DisplayRole && anIndex < myAttribute->GetValues().Length()) + { + return myAttribute->GetValues().Value(anIndex).ToCString(); + } + + return QVariant(); +} diff --git a/tools/MessageModel/MessageModel_TableModelValues.hxx b/tools/MessageModel/MessageModel_TableModelValues.hxx new file mode 100644 index 0000000000..85145e78f8 --- /dev/null +++ b/tools/MessageModel/MessageModel_TableModelValues.hxx @@ -0,0 +1,57 @@ +// 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_TableModelValues_H +#define MessageModel_TableModelValues_H + +#include + +#include +class Message_AttributeVectorOfValues; + +//! \class MessageModel_TableModelValues +//! \brief This is an implementation for ViewControl_TableModel to present Message_AttributeVectorOfValues object +class MessageModel_TableModelValues : public ViewControl_TableModelValues +{ +public: + + //! Constructor + Standard_EXPORT MessageModel_TableModelValues (const Handle(Message_Attribute)& theAttribute, const int theSectionWidth); + + //! Destructor + virtual ~MessageModel_TableModelValues() 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 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) 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; + +private: + Handle(Message_AttributeVectorOfValues) myAttribute; //!< alert attribute, container of table values +}; + +#endif diff --git a/tools/MessageModel/MessageModel_Tools.cxx b/tools/MessageModel/MessageModel_Tools.cxx index 569eabf937..0adacedd37 100644 --- a/tools/MessageModel/MessageModel_Tools.cxx +++ b/tools/MessageModel/MessageModel_Tools.cxx @@ -14,11 +14,12 @@ // commercial license or contractual agreement. #include -#include -#include +#include +#include #include #include +#include #include #include @@ -26,10 +27,10 @@ #include #include #include -#include -#include +#include + #include -#include +#include #include // ======================================================================= @@ -65,10 +66,18 @@ TCollection_AsciiString MessageModel_Tools::GetPointerInfo (const Handle(Standar // ======================================================================= TCollection_AsciiString MessageModel_Tools::GetPointerAlertInfo (const Handle(Message_Alert)& theAlert) { - if (theAlert->IsKind (STANDARD_TYPE (TopoDS_AlertWithShape))) - return GetPointerInfo (Handle(TopoDS_AlertWithShape)::DownCast (theAlert)->GetShape().TShape()); - else if (theAlert->IsKind (STANDARD_TYPE (Message_AttributeObject))) - return GetPointerInfo (Handle(Message_AttributeObject)::DownCast (theAlert)->GetObject()); + Handle(Message_AlertExtended) anExtAlert = Handle(Message_AlertExtended)::DownCast (theAlert); + if (anExtAlert.IsNull()) + return TCollection_AsciiString(); + + Handle(Message_Attribute) anAttribute = anExtAlert->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(); } @@ -78,10 +87,17 @@ TCollection_AsciiString MessageModel_Tools::GetPointerAlertInfo (const Handle(Me // ======================================================================= TCollection_AsciiString MessageModel_Tools::GetShapeTypeAlertInfo (const Handle(Message_Alert)& theAlert) { - TopoDS_Shape aShape; + Handle(Message_AlertExtended) anExtAlert = Handle(Message_AlertExtended)::DownCast (theAlert); + if (anExtAlert.IsNull()) + return TCollection_AsciiString(); + + Handle(Message_Attribute) anAttribute = anExtAlert->Attribute(); + if (anAttribute.IsNull()) + return TCollection_AsciiString(); - if (theAlert->IsKind (STANDARD_TYPE (TopoDS_AlertWithShape))) - aShape = Handle(TopoDS_AlertWithShape)::DownCast (theAlert)->GetShape(); + TopoDS_Shape aShape; + if (anAttribute->IsKind (STANDARD_TYPE (TopoDS_AlertAttribute))) + aShape = Handle(TopoDS_AlertAttribute)::DownCast (anAttribute)->GetShape(); if (aShape.IsNull()) return TCollection_AsciiString(); @@ -98,11 +114,19 @@ TCollection_AsciiString MessageModel_Tools::GetShapeTypeAlertInfo (const Handle( // ======================================================================= TCollection_AsciiString MessageModel_Tools::GetStandardTypeAlertInfo (const Handle(Message_Alert)& theAlert) { + Handle(Message_AlertExtended) anExtAlert = Handle(Message_AlertExtended)::DownCast (theAlert); + if (anExtAlert.IsNull()) + return TCollection_AsciiString(); + + Handle(Message_Attribute) anAttribute = anExtAlert->Attribute(); + if (anAttribute.IsNull()) + return TCollection_AsciiString(); + Handle(Standard_Transient) aPointer; - if (theAlert->IsKind (STANDARD_TYPE (TopoDS_AlertWithShape))) - aPointer = Handle(TopoDS_AlertWithShape)::DownCast (theAlert)->GetShape().TShape(); - else if (theAlert->IsKind (STANDARD_TYPE (Message_AttributeObject))) - aPointer = Handle(Message_AttributeObject)::DownCast (theAlert)->GetObject(); + 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(); @@ -114,12 +138,24 @@ TCollection_AsciiString MessageModel_Tools::GetStandardTypeAlertInfo (const Hand // function : GetPropertyTableValues // purpose : // ======================================================================= -void MessageModel_Tools::GetPropertyTableValues (const Handle(Message_Alert)& theAlert, +void MessageModel_Tools::GetPropertyTableValues (const TreeModel_ItemBasePtr& theItem, QList& theTableValues) { - ViewControl_TableModelValues* aTableValues = 0; + Handle(TreeModel_ItemProperties) anItemProperties = theItem->GetProperties(); + if (!anItemProperties.IsNull()) + { + ViewControl_TableModelValues* aTableValues = new ViewControl_TableModelValues(); + aTableValues->SetProperties (anItemProperties); + theTableValues.append (aTableValues); + return; + } + + MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast(theItem); + if (!anAlertItem) + return; - Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast(theAlert); + const Handle(Message_Alert)& anAlert = anAlertItem->GetAlert(); + Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast(anAlert); if (anExtendedAlert.IsNull()) return; @@ -127,23 +163,17 @@ void MessageModel_Tools::GetPropertyTableValues (const Handle(Message_Alert)& th if (anAttribute.IsNull()) return; - if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfReal))) + if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfValues))) { - int aSectionSize = 60; - aTableValues = new MessageModel_TableModelRealValues (anAttribute, aSectionSize); - theTableValues.append (aTableValues); - } - else if (anAttribute->IsKind (STANDARD_TYPE (Message_AttributeVectorOfRealVec3))) - { - int aSectionSize = 160; - aTableValues = new MessageModel_TableModelRealVec3Values (anAttribute, aSectionSize); + int aSectionSize = 200; + ViewControl_TableModelValues* aTableValues = new MessageModel_TableModelValues (anAttribute, aSectionSize); theTableValues.append (aTableValues); } else { if (!anAttribute->GetDescription().IsEmpty()) { - aTableValues = new ViewControl_TableModelValues(); + ViewControl_TableModelValuesDefault* aTableValues = new ViewControl_TableModelValuesDefault(); QList aHeaderValues; QVector aValues; aHeaderValues << TreeModel_HeaderSection ("Description", -2); @@ -166,74 +196,31 @@ void MessageModel_Tools::GetPropertyTableValues (const Handle(Message_Alert)& th } // ======================================================================= -// function : BuildShape +// function : GetUnitedAlerts // purpose : // ======================================================================= -TopoDS_Shape MessageModel_Tools::BuildShape (const Handle(Message_Alert)& theAlert, QList theSelectedIndices, ViewControl_Table* theTable) +void MessageModel_Tools::GetUnitedAlerts(const Message_ListOfAlert& theAlerts, + NCollection_DataMap& theUnitedAlerts) { - if (theAlert.IsNull()) - return TopoDS_Shape(); - - BRep_Builder aBuilder; - TopoDS_Compound aCompound; - aBuilder.MakeCompound(aCompound); - - if (theAlert->IsKind (STANDARD_TYPE (Message_AttributeVectorOfReal))) + //theUnitedAlerts.Clear(); + TCollection_AsciiString anAlertMessageKey; + Standard_Integer aRowIndex = 0; + Standard_Integer aCurIndex = 0; + for (Message_ListOfAlert::Iterator anAlertsIt (theAlerts); anAlertsIt.More(); anAlertsIt.Next()) { - Handle(Message_AttributeVectorOfReal) aValuesAlert = Handle(Message_AttributeVectorOfReal)::DownCast (theAlert); - NCollection_Vector 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::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; + aCurIndex++; + Handle(Message_Alert) anAlert = anAlertsIt.Value(); + if (anAlertMessageKey.IsEqual (anAlert->GetMessageKey())) { + Message_ListOfAlert anAlerts = theUnitedAlerts.Find(aRowIndex-1); // already in the map + anAlerts.Append (anAlert); + theUnitedAlerts.Bind(aRowIndex-1, anAlerts); } - } - else if (theAlert->IsKind (STANDARD_TYPE (Message_AttributeVectorOfRealVec3))) - { - Handle(Message_AttributeVectorOfRealVec3) aValuesAlert = Handle(Message_AttributeVectorOfRealVec3)::DownCast (theAlert); - NCollection_Vector> aValues = aValuesAlert->GetValues(); - int aValuesSize = aValues.Size(); - - gp_Pnt aCurrentPoint(0, 0, 0); - NCollection_Vec3 aValue; - for (QList::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); + else { + Message_ListOfAlert anAlerts; + anAlerts.Append (anAlert); + theUnitedAlerts.Bind(aRowIndex, anAlerts); + aRowIndex++; + anAlertMessageKey = anAlert->GetMessageKey(); } } - - return aCompound; } diff --git a/tools/MessageModel/MessageModel_Tools.hxx b/tools/MessageModel/MessageModel_Tools.hxx index 58c86a601f..22ca579856 100644 --- a/tools/MessageModel/MessageModel_Tools.hxx +++ b/tools/MessageModel/MessageModel_Tools.hxx @@ -19,11 +19,17 @@ #include #include +#include +#include +#include #include #include +#include + +#include #include -//#include +#include class Message_Alert; class ViewControl_TableModelValues; @@ -61,15 +67,14 @@ public: //! 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, + Standard_EXPORT static void GetPropertyTableValues (const TreeModel_ItemBasePtr& theItem, QList& 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 aSelectedIndices, - ViewControl_Table* theTableView); + //! 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_DataMap& theUnitedAlerts); }; #endif diff --git a/tools/MessageModel/MessageModel_TreeModel.cxx b/tools/MessageModel/MessageModel_TreeModel.cxx index 84775c4186..7a96f35ff9 100644 --- a/tools/MessageModel/MessageModel_TreeModel.cxx +++ b/tools/MessageModel/MessageModel_TreeModel.cxx @@ -56,6 +56,19 @@ void MessageModel_TreeModel::createRootItem (const int theColumnId) 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 (RootItem (0)); + return aRootItem && aRootItem->HasReport (theReport); +} + // ======================================================================= // function : AddShape // purpose : diff --git a/tools/MessageModel/MessageModel_TreeModel.hxx b/tools/MessageModel/MessageModel_TreeModel.hxx index 0769fd4473..df32bebb39 100644 --- a/tools/MessageModel/MessageModel_TreeModel.hxx +++ b/tools/MessageModel/MessageModel_TreeModel.hxx @@ -22,8 +22,10 @@ #include #include +#include #include #include +#include class MessageModel_TreeModel; @@ -39,6 +41,11 @@ public: //! 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 diff --git a/tools/MessageModel/icons/item_vectorOfValues.png b/tools/MessageModel/icons/item_vectorOfValues.png new file mode 100644 index 0000000000..7181f9460e Binary files /dev/null and b/tools/MessageModel/icons/item_vectorOfValues.png differ diff --git a/tools/MessageModel/icons/item_vectorOfValues.svg b/tools/MessageModel/icons/item_vectorOfValues.svg new file mode 100644 index 0000000000..38b1032701 --- /dev/null +++ b/tools/MessageModel/icons/item_vectorOfValues.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/tools/MessageView/MessageView_VisibilityState.cxx b/tools/MessageView/MessageView_VisibilityState.cxx index db75105fc2..cec2d932df 100644 --- a/tools/MessageView/MessageView_VisibilityState.cxx +++ b/tools/MessageView/MessageView_VisibilityState.cxx @@ -17,8 +17,7 @@ #include #include -#include -#include +#include #include @@ -28,6 +27,15 @@ // ======================================================================= bool MessageView_VisibilityState::CanBeVisible (const QModelIndex& theIndex) const { + MessageModel_ItemAlertPtr anAlertItem = getAlertItem (theIndex); + if (anAlertItem) + { + NCollection_List aPresentations; + anAlertItem->GetPresentations (aPresentations); + if (!aPresentations.IsEmpty()) + return true; + } + return !getShape (theIndex).IsNull();// || hasTableValues (theIndex); } @@ -125,7 +133,7 @@ bool MessageView_VisibilityState::hasTableValues (const QModelIndex& theIndex) c if (anAlert.IsNull()) return false; - if (anAlert->IsKind (STANDARD_TYPE (Message_AttributeVectorOfReal)) || anAlert->IsKind (STANDARD_TYPE (Message_AttributeVectorOfRealVec3))) + if (anAlert->IsKind (STANDARD_TYPE (Message_AttributeVectorOfValues))) return true; return false; diff --git a/tools/MessageView/MessageView_Window.cxx b/tools/MessageView/MessageView_Window.cxx index 1f778f488e..ad8895e831 100644 --- a/tools/MessageView/MessageView_Window.cxx +++ b/tools/MessageView/MessageView_Window.cxx @@ -29,13 +29,15 @@ #include #include -#include #include +#include #include +#include +#include #include - +#include #include #include @@ -99,6 +101,39 @@ const int MESSAGEVIEW_DEFAULT_TREE_VIEW_HEIGHT = 500; const int MESSAGEVIEW_DEFAULT_VIEW_WIDTH = 200;// 400; const int MESSAGEVIEW_DEFAULT_VIEW_HEIGHT = 300;// 1000; +#include +#include +Handle(Prs3d_Drawer) GetPreviewAttributes (const Handle(AIS_InteractiveContext)& theContext) +{ + Handle(Prs3d_Drawer) myDrawer = new Prs3d_Drawer(); + myDrawer->Link (theContext->DefaultDrawer()); + + Quantity_Color aColor(Quantity_NOC_TOMATO);//Quantity_NOC_GREENYELLOW));//Quantity_NOC_BLUE1)); + Standard_ShortReal aTransparency = 0.8; + + // point parameters + myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_O_PLUS, aColor, 3.0)); + + // shading parameters + Graphic3d_MaterialAspect aShadingMaterial; + aShadingMaterial.SetReflectionModeOff (Graphic3d_TOR_SPECULAR); + aShadingMaterial.SetMaterialType (Graphic3d_MATERIAL_ASPECT); + + myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); + myDrawer->ShadingAspect()->Aspect()->SetInteriorStyle (Aspect_IS_SOLID); + myDrawer->ShadingAspect()->SetColor (aColor); + myDrawer->ShadingAspect()->SetMaterial (aShadingMaterial); + + myDrawer->ShadingAspect()->Aspect()->ChangeFrontMaterial().SetTransparency (aTransparency); + myDrawer->ShadingAspect()->Aspect()->ChangeBackMaterial() .SetTransparency (aTransparency); + myDrawer->SetTransparency (aTransparency); + + // common parameters + myDrawer->SetZLayer (Graphic3d_ZLayerId_Topmost); + + return myDrawer; +} + // ======================================================================= // function : Constructor // purpose : @@ -112,6 +147,7 @@ MessageView_Window::MessageView_Window (QWidget* theParent) ((ViewControl_TreeView*)myTreeView)->SetPredefinedSize (QSize (MESSAGEVIEW_DEFAULT_TREE_VIEW_WIDTH, MESSAGEVIEW_DEFAULT_TREE_VIEW_HEIGHT)); MessageModel_TreeModel* aModel = new MessageModel_TreeModel (myTreeView); + //aModel->SetReversed (Standard_True); for (int i = 5; i <= 7; i++) // hide shape parameters columns { TreeModel_HeaderSection anItem = aModel->GetHeaderItem (i); @@ -217,7 +253,6 @@ void MessageView_Window::GetPreferences (TInspectorAPI_PreferencesDataMap& theIt QMap anItems; TreeModel_Tools::SaveState (myTreeView, anItems); View_Tools::SaveState (myViewWindow, anItems); - ViewControl_PropertyView::SaveState (myPropertyView, anItems); for (QMap::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++) theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); @@ -243,8 +278,6 @@ void MessageView_Window::SetPreferences (const TInspectorAPI_PreferencesDataMap& 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; } } @@ -274,6 +307,13 @@ void MessageView_Window::UpdateContent() myParameters->SetFileNames (aName, aNames); isUpdated = true; } + Handle(Message_Report) aDefaultReport = Message_Report::CurrentReport( Standard_False); + MessageModel_TreeModel* aViewModel = dynamic_cast (myTreeView->model()); + if (!aDefaultReport.IsNull() && !aViewModel->HasReport (aDefaultReport)) + { + aDefaultReport->SetCallBack (myCallBack); + addReport (aDefaultReport); + } // reload report of selected item onReloadReport(); @@ -290,6 +330,7 @@ void MessageView_Window::Init (NCollection_List& the NCollection_List aParameters; Handle(Message_ReportCallBack) aReportCallBack; + Handle(Graphic3d_Camera) aViewCamera; for (NCollection_List::Iterator aParamsIt (theParameters); aParamsIt.More(); aParamsIt.Next()) @@ -301,23 +342,31 @@ void MessageView_Window::Init (NCollection_List& the aMessageReport->SetCallBack (myCallBack); addReport (aMessageReport); } - else + else if (!Handle(AIS_InteractiveContext)::DownCast (anObject).IsNull()) { aParameters.Append (anObject); if (aContext.IsNull()) aContext = Handle(AIS_InteractiveContext)::DownCast (anObject); } + else if (!Handle(Graphic3d_Camera)::DownCast (anObject).IsNull()) + { + aViewCamera = Handle(Graphic3d_Camera)::DownCast (anObject); + } } - QAbstractItemModel* aModel = myTreeView->model(); - if (!aModel) - return; - MessageModel_TreeModel* aTreeModel = dynamic_cast (aModel); + MessageModel_TreeModel* aTreeModel = dynamic_cast (myTreeView->model()); if (!aTreeModel) return; + aTreeModel->EmitLayoutChanged(); if (!aContext.IsNull()) + { + myContext = aContext; myViewWindow->SetContext (View_ContextType_External, aContext); + } + + if (!aViewCamera.IsNull()) + myViewWindow->GetView()->GetViewer()->GetView()->Camera()->Copy (aViewCamera); theParameters = aParameters; } @@ -381,6 +430,26 @@ void MessageView_Window::onTreeViewSelectionChanged (const QItemSelection&, cons return; updatePropertyPanelBySelection(); + + NCollection_List aPresentations; + MessageModel_ItemRootPtr aRootItem; + QModelIndexList aSelectedIndices = myTreeView->selectionModel()->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; + + MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast(anItemBase); + if (!anAlertItem) + continue; + anAlertItem->GetPresentations (aPresentations); + } + updatePreviewPresentation (aPresentations); } // ======================================================================= @@ -413,7 +482,16 @@ void MessageView_Window::onTreeViewContextMenuRequested (const QPoint& thePositi break; } if (aRootItem) + { aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Import Report"), SLOT (onImportReport()), myMainWindow, this)); + // unite + MessageModel_TreeModel* aTreeModel = dynamic_cast (myTreeView->model()); + aMenu->addAction (ViewControl_Tools::CreateAction (aTreeModel->IsUniteAlerts() ? tr ("SetUniteAlerts - OFF") : tr ("SetUniteAlerts - ON"), + SLOT (onUniteAlerts()), myMainWindow, this)); + // reversed + //aMenu->addAction (ViewControl_Tools::CreateAction (aTreeModel->IsReversed() ? tr ("SetReversed - OFF") : tr ("SetReversed - ON"), + // SLOT (onSetReversedAlerts()), myMainWindow, this)); + } else if (aReportItem) { aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Export Report"), SLOT (onExportReport()), myMainWindow, this)); @@ -484,7 +562,7 @@ void MessageView_Window::onPropertyViewSelectionChanged() return; } - TopoDS_Shape aShapeOfSelection = MessageModel_Tools::BuildShape (anAlertItem->GetAlert(), aSelectedIndices[0], aFirstTable); + /*TopoDS_Shape aShapeOfSelection = MessageModel_Tools::BuildShape (anAlertItem->GetAlert(), aSelectedIndices[0], aFirstTable); if (aShapeOfSelection.IsNull()) return; @@ -504,7 +582,7 @@ void MessageView_Window::onPropertyViewSelectionChanged() { anAlertItem->SetCustomShape (aShapeOfSelection); aVisibilityState->SetVisible (anIndex, true); - } + }*/ } // ======================================================================= @@ -559,6 +637,31 @@ void MessageView_Window::onImportReport() openFile (TCollection_AsciiString (aFileName.toStdString().c_str())); } +// ======================================================================= +// function : onImportReport +// purpose : +// ======================================================================= +void MessageView_Window::onUniteAlerts() +{ + MessageModel_TreeModel* aTreeModel = dynamic_cast (myTreeView->model()); + Standard_Boolean isUniteAlerts = aTreeModel->IsUniteAlerts(); + + aTreeModel->SetUniteAlerts (!isUniteAlerts); +} + +// ======================================================================= +// function : onSetReversedAlerts +// purpose : +// ======================================================================= +void MessageView_Window::onSetReversedAlerts() +{ + MessageModel_TreeModel* aTreeModel = dynamic_cast (myTreeView->model()); + Standard_Boolean isReversed = aTreeModel->IsReversed(); + + aTreeModel->SetReversed (!isReversed); +} + + // ======================================================================= // function : onReloadReport // purpose : @@ -604,12 +707,81 @@ void MessageView_Window::updatePropertyPanelBySelection() if (!anItemBase) return; - MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast(anItemBase); - if (!anAlertItem) - return; - QList aTableValues; - MessageModel_Tools::GetPropertyTableValues (anAlertItem->GetAlert(), aTableValues); + MessageModel_Tools::GetPropertyTableValues (anItemBase, aTableValues); myPropertyView->Init (aTableValues); } + +// ======================================================================= +// function : updatePreviewPresentation +// purpose : +// ======================================================================= +void MessageView_Window::updatePreviewPresentation (const NCollection_List& thePresentations) +{ + if (myContext.IsNull()) + return; + + Handle(AIS_InteractiveContext) aContext = myContext; + + if (!myPreviewPresentations.IsEmpty()) + { + for (NCollection_List::Iterator aDisplayedIt (myPreviewPresentations); aDisplayedIt.More(); aDisplayedIt.Next()) + { + Handle(AIS_InteractiveObject) aPrs = Handle(AIS_InteractiveObject)::DownCast (aDisplayedIt.Value()); + if (!aPrs.IsNull()) + aContext->Remove (aPrs, Standard_True); + } + } + myPreviewPresentations.Clear(); + + myPreviewPresentations = thePresentations; + if (myPreviewPresentations.IsEmpty()) + return; + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + for (NCollection_List::Iterator aDisplayedIt (myPreviewPresentations); aDisplayedIt.More(); aDisplayedIt.Next()) + { + Handle(AIS_InteractiveObject) aPrs = Handle(AIS_InteractiveObject)::DownCast (aDisplayedIt.Value()); + if (!aPrs.IsNull()) + { + aContext->Display (aPrs, AIS_Shaded, -1/*do not participate in selection*/, Standard_True); + } + else if (!Handle(ViewControl_TransientShape)::DownCast (aDisplayedIt.Value()).IsNull()) + { + Handle(ViewControl_TransientShape) aShapeObject = Handle(ViewControl_TransientShape)::DownCast (aDisplayedIt.Value()); + aBuilder.Add (aCompound, aShapeObject->GetShape()); + } + } + + if (aCompound.IsNull()) + { + if (!aContext.IsNull()) + aContext->Remove (myPreviewPresentation, Standard_True); + myPreviewPresentation = NULL; + return; + + } + else + { + if (myPreviewPresentation.IsNull()) + { + myPreviewPresentation = new AIS_Shape (aCompound); + myPreviewPresentation->SetAttributes (GetPreviewAttributes(myContext)); + //myPreviewPresentation->SetAttributes (myPreviewParameters->GetDrawer()); + + //myPreviewPresentation->SetTransformPersistence(thePersistent); + if (!aContext.IsNull()) + aContext->Display (myPreviewPresentation, AIS_Shaded, -1/*do not participate in selection*/, Standard_True); + } + else + { + Handle(AIS_Shape)::DownCast (myPreviewPresentation)->Set (aCompound); + //myPreviewPresentation->SetTransformPersistence(thePersistent); + if (!aContext.IsNull()) + aContext->Redisplay (myPreviewPresentation, Standard_True); + } + } +} diff --git a/tools/MessageView/MessageView_Window.hxx b/tools/MessageView/MessageView_Window.hxx index 470ba79054..a4ace53694 100644 --- a/tools/MessageView/MessageView_Window.hxx +++ b/tools/MessageView/MessageView_Window.hxx @@ -21,9 +21,12 @@ #include #include - #include +#include +#include +#include + #ifdef _MSC_VER #pragma warning(disable : 4127) // conditional expression is constant #endif @@ -145,6 +148,12 @@ protected slots: //! Import report into document void onImportReport(); + //! Unite alerts in view model + void onUniteAlerts(); + + //! Sets report reversed + void onSetReversedAlerts(); + //! Reads if possible report of a selected item and updates this report in tree view void onReloadReport(); @@ -152,6 +161,10 @@ protected: //! Updates property panel content by item selected in tree view. void updatePropertyPanelBySelection(); + //!< Updates presentation of preview for parameter shapes. Creates a compound of the shapes + //!< \param theShape container of shapes + void updatePreviewPresentation (const NCollection_List& thePresentations); + private: QMainWindow* myMainWindow; //!< main control, parent for all MessageView controls QDockWidget* myViewDockWidget; //!< view dock widget to hide/show @@ -165,6 +178,10 @@ private: Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container Handle(Message_ReportCallBack) myCallBack; //! < message call back to update content of the view + + Handle(AIS_InteractiveContext) myContext; //! current context + Handle(AIS_InteractiveObject) myPreviewPresentation; //!< presentation of preview for a selected object + NCollection_List myPreviewPresentations; }; #endif diff --git a/tools/ShapeView/FILES b/tools/ShapeView/FILES index 895416efc1..6f3384957e 100644 --- a/tools/ShapeView/FILES +++ b/tools/ShapeView/FILES @@ -1,7 +1,14 @@ ShapeView.qrc ShapeView_Communicator.cxx ShapeView_Communicator.hxx +ShapeView_ItemBase.cxx ShapeView_ItemBase.hxx +ShapeView_ItemPropertiesEdge.cxx +ShapeView_ItemPropertiesEdge.hxx +ShapeView_ItemPropertiesFace.cxx +ShapeView_ItemPropertiesFace.hxx +ShapeView_ItemPropertiesVertex.cxx +ShapeView_ItemPropertiesVertex.hxx ShapeView_ItemRoot.cxx ShapeView_ItemRoot.hxx ShapeView_ItemShape.cxx diff --git a/tools/ShapeView/ShapeView_ItemBase.cxx b/tools/ShapeView/ShapeView_ItemBase.cxx new file mode 100644 index 0000000000..c660eab22b --- /dev/null +++ b/tools/ShapeView/ShapeView_ItemBase.cxx @@ -0,0 +1,35 @@ +// 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 + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant ShapeView_ItemBase::initValue (const int theItemRole) const +{ + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + switch (Column()) + { + case 2: { return rowCount(); } + //case 3: return ViewControl_Tools::GetPointerInfo (GetObject(), true).ToCString(); + case 4: { return Row(); } + } + + return QVariant(); +} diff --git a/tools/ShapeView/ShapeView_ItemBase.hxx b/tools/ShapeView/ShapeView_ItemBase.hxx index 3e0559c501..27b09eb925 100644 --- a/tools/ShapeView/ShapeView_ItemBase.hxx +++ b/tools/ShapeView/ShapeView_ItemBase.hxx @@ -32,6 +32,11 @@ public: //! Resets cached values virtual void Reset() Standard_OVERRIDE { TreeModel_ItemBase::Reset(); } + //! Return data value for the role. + //! \param theRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue(const int theRole) const; + protected: //! Initialize the current item. It creates a backup of the specific item information diff --git a/tools/ShapeView/ShapeView_ItemPropertiesEdge.cxx b/tools/ShapeView/ShapeView_ItemPropertiesEdge.cxx new file mode 100644 index 0000000000..b60235f0b1 --- /dev/null +++ b/tools/ShapeView/ShapeView_ItemPropertiesEdge.cxx @@ -0,0 +1,146 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(ShapeView_ItemPropertiesEdge, TreeModel_ItemProperties) + +// ======================================================================= +// function : RowCount +// purpose : +// ======================================================================= + +int ShapeView_ItemPropertiesEdge::GetTableRowCount() const +{ + return ShapeView_Tools::GetShapeGlobalPropertiesCount() + 7; +} + +// ======================================================================= +// function : Data +// purpose : +// ======================================================================= +#include +#include +#include + +QVariant ShapeView_ItemPropertiesEdge::GetTableData (const int theRow, const int theColumn, int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + TopoDS_Shape aShape = getItemShape(); + + if (aShape.ShapeType() != TopAbs_EDGE) + return QVariant(); + + TopoDS_Edge anEdge = TopoDS::Edge(aShape); + double aFirst, aLast; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aFirst, aLast); + + GeomAdaptor_Curve aAdaptor(aCurve, aFirst, aLast); + gp_Pnt aFirstPnt = aAdaptor.Value(aFirst); + gp_Pnt aLastPnt = aAdaptor.Value(aLast); + + BRepAdaptor_Curve aBRepAdaptor = BRepAdaptor_Curve(anEdge); + Adaptor3d_Curve* anAdaptor3d = &aBRepAdaptor; + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return isFirstColumn ? "Length" : QString::number (GCPnts_AbscissaPoint::Length(*anAdaptor3d)); + case 1: return isFirstColumn ? "Geom_Curve" : aCurve->DynamicType()->Name(); + case 2: return isFirstColumn ? "FirstPnt" : ViewControl_Tools::ToString (aFirstPnt).ToCString(); + case 3: return isFirstColumn ? "LastPnt" : ViewControl_Tools::ToString (aLastPnt).ToCString(); + case 4: return isFirstColumn ? "Continuity" : ShapeView_Tools::ToName (aCurve->Continuity()); + case 5: return isFirstColumn ? "IsClosed" : ShapeView_Tools::ToString (aCurve->IsClosed()); + case 6: return isFirstColumn ? "IsPeriodic" : aCurve->IsPeriodic() ? QString::number (aCurve->Period()) + : ShapeView_Tools::ToString (aCurve->IsPeriodic()); + default: break; + } + + int anOwnRows = 7; + /*int aTableRow = theRow - anOwnRows; + // BRep_Tool::PolygonOnTriangulation // find the representation + + TopoDS_Edge E = TopoDS::Edge(aShape); + Handle(Poly_PolygonOnTriangulation) P; + Handle(Poly_Triangulation) T; + TopLoc_Location L; + + const BRep_TEdge* TE = static_cast(anEdge.TShape().get()); + BRep_ListIteratorOfListOfCurveRepresentation itcr(TE->Curves()); + + int aCurRow = 0; + while (itcr.More()) { + const Handle(BRep_CurveRepresentation)& cr = itcr.Value(); + if (cr->IsPolygonOnTriangulation()) { + if (aCurRow < aTableRow) + continue; + const BRep_PolygonOnTriangulation* PT = + static_cast(cr.get()); + P = PT->PolygonOnTriangulation(); + T = PT->Triangulation(); + L = E.Location() * PT->Location(); + return isFirstColumn ? QVariant("Polygon: ") : P.; + } + itcr.Next(); + } + L.Identity(); + P.Nullify(); + T.Nullify(); + + + anOwnRows += aTableRow; + */ + return ShapeView_Tools::GetShapeGlobalProperties (aShape, theRow - anOwnRows, theColumn); +} + +// ======================================================================= +// function : getItemShape +// purpose : +// ======================================================================= + +TopoDS_Shape ShapeView_ItemPropertiesEdge::getItemShape() const +{ + ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(getItem()); + if (!aShapeItem) + return TopoDS_Shape(); + + return aShapeItem->GetItemShape(); +} diff --git a/tools/ShapeView/ShapeView_ItemPropertiesEdge.hxx b/tools/ShapeView/ShapeView_ItemPropertiesEdge.hxx new file mode 100644 index 0000000000..a01d74fc17 --- /dev/null +++ b/tools/ShapeView/ShapeView_ItemPropertiesEdge.hxx @@ -0,0 +1,72 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 ShapeView_ItemPropertiesEdge_H +#define ShapeView_ItemPropertiesEdge_H + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +class QItemDelegate; + +DEFINE_STANDARD_HANDLE (ShapeView_ItemPropertiesEdge, TreeModel_ItemProperties) + +//! \class ShapeView_ItemPropertiesEdge +//! \brief This is an interace for ViewControl_TableModel to give real values of the model +//! It should be filled or redefined. +class ShapeView_ItemPropertiesEdge : public TreeModel_ItemProperties +{ +public: + + //! Constructor + Standard_EXPORT ShapeView_ItemPropertiesEdge (const TreeModel_ItemBasePtr& theItem) + : TreeModel_ItemProperties (theItem) {} + + //! Destructor + virtual ~ShapeView_ItemPropertiesEdge() {} + + //! 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 GetTableRowCount() 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 theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return value intepreted depending on the given role + Standard_EXPORT virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole = Qt::DisplayRole) const Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT (ShapeView_ItemPropertiesEdge, TreeModel_ItemProperties) + +protected: + //! Returns item shape + TopoDS_Shape getItemShape() const; + +}; + +#endif diff --git a/tools/ShapeView/ShapeView_ItemPropertiesFace.cxx b/tools/ShapeView/ShapeView_ItemPropertiesFace.cxx new file mode 100644 index 0000000000..b1c9852437 --- /dev/null +++ b/tools/ShapeView/ShapeView_ItemPropertiesFace.cxx @@ -0,0 +1,66 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 +#include +#include + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(ShapeView_ItemPropertiesFace, TreeModel_ItemProperties) + +// ======================================================================= +// function : RowCount +// purpose : +// ======================================================================= + +int ShapeView_ItemPropertiesFace::GetTableRowCount() const +{ + return ShapeView_Tools::GetShapeGlobalPropertiesCount(); +} + +// ======================================================================= +// function : Data +// purpose : +// ======================================================================= + +QVariant ShapeView_ItemPropertiesFace::GetTableData (const int theRow, const int theColumn, int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + TopoDS_Shape aShape = getItemShape(); + + QVariant aValue = ShapeView_Tools::GetShapeGlobalProperties (aShape, theRow, theColumn); + + return aValue; +} + +// ======================================================================= +// function : getItemShape +// purpose : +// ======================================================================= + +TopoDS_Shape ShapeView_ItemPropertiesFace::getItemShape() const +{ + ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(getItem()); + if (!aShapeItem) + return TopoDS_Shape(); + + return aShapeItem->GetItemShape(); +} diff --git a/tools/ShapeView/ShapeView_ItemPropertiesFace.hxx b/tools/ShapeView/ShapeView_ItemPropertiesFace.hxx new file mode 100644 index 0000000000..6ed1d2d7b6 --- /dev/null +++ b/tools/ShapeView/ShapeView_ItemPropertiesFace.hxx @@ -0,0 +1,72 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 ShapeView_ItemPropertiesFace_H +#define ShapeView_ItemPropertiesFace_H + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +class QItemDelegate; + +DEFINE_STANDARD_HANDLE (ShapeView_ItemPropertiesFace, TreeModel_ItemProperties) + +//! \class ShapeView_ItemPropertiesFace +//! \brief This is an interace for ViewControl_TableModel to give real values of the model +//! It should be filled or redefined. +class ShapeView_ItemPropertiesFace : public TreeModel_ItemProperties +{ +public: + + //! Constructor + Standard_EXPORT ShapeView_ItemPropertiesFace (const TreeModel_ItemBasePtr& theItem) + : TreeModel_ItemProperties (theItem) {} + + //! Destructor + virtual ~ShapeView_ItemPropertiesFace() {} + + //! 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 GetTableRowCount() 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 theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return value intepreted depending on the given role + Standard_EXPORT virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole = Qt::DisplayRole) const Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT (ShapeView_ItemPropertiesFace, TreeModel_ItemProperties) + +protected: + //! Returns item shape + TopoDS_Shape getItemShape() const; + +}; + +#endif diff --git a/tools/ShapeView/ShapeView_ItemPropertiesVertex.cxx b/tools/ShapeView/ShapeView_ItemPropertiesVertex.cxx new file mode 100644 index 0000000000..bcfa01d090 --- /dev/null +++ b/tools/ShapeView/ShapeView_ItemPropertiesVertex.cxx @@ -0,0 +1,74 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(ShapeView_ItemPropertiesVertex, TreeModel_ItemProperties) + +// ======================================================================= +// function : RowCount +// purpose : +// ======================================================================= + +int ShapeView_ItemPropertiesVertex::GetTableRowCount() const +{ + return ShapeView_Tools::GetShapeGlobalPropertiesCount() + 1; +} + +// ======================================================================= +// function : Data +// purpose : +// ======================================================================= + +QVariant ShapeView_ItemPropertiesVertex::GetTableData (const int theRow, const int theColumn, int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + TopoDS_Shape aShape = getItemShape(); + switch (theRow) + { + case 0: return theColumn == 0 ? "Vertex" : ViewControl_Tools::ToString (BRep_Tool::Pnt (TopoDS::Vertex (aShape))).ToCString(); + default: break; + } + int anOwnRows = 1; + + return ShapeView_Tools::GetShapeGlobalProperties (aShape, theRow - anOwnRows, theColumn); +} + +// ======================================================================= +// function : getItemShape +// purpose : +// ======================================================================= + +TopoDS_Shape ShapeView_ItemPropertiesVertex::getItemShape() const +{ + ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(getItem()); + if (!aShapeItem) + return TopoDS_Shape(); + + return aShapeItem->GetItemShape(); +} diff --git a/tools/ShapeView/ShapeView_ItemPropertiesVertex.hxx b/tools/ShapeView/ShapeView_ItemPropertiesVertex.hxx new file mode 100644 index 0000000000..79a4965a95 --- /dev/null +++ b/tools/ShapeView/ShapeView_ItemPropertiesVertex.hxx @@ -0,0 +1,72 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 ShapeView_ItemPropertiesVertex_H +#define ShapeView_ItemPropertiesVertex_H + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +class QItemDelegate; + +DEFINE_STANDARD_HANDLE (ShapeView_ItemPropertiesVertex, TreeModel_ItemProperties) + +//! \class ShapeView_ItemPropertiesVertex +//! \brief This is an interace for ViewControl_TableModel to give real values of the model +//! It should be filled or redefined. +class ShapeView_ItemPropertiesVertex : public TreeModel_ItemProperties +{ +public: + + //! Constructor + Standard_EXPORT ShapeView_ItemPropertiesVertex (const TreeModel_ItemBasePtr& theItem) + : TreeModel_ItemProperties (theItem) {} + + //! Destructor + virtual ~ShapeView_ItemPropertiesVertex() {} + + //! 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 GetTableRowCount() 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 theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return value intepreted depending on the given role + Standard_EXPORT virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole = Qt::DisplayRole) const Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT (ShapeView_ItemPropertiesVertex, TreeModel_ItemProperties) + +protected: + //! Returns item shape + TopoDS_Shape getItemShape() const; + +}; + +#endif diff --git a/tools/ShapeView/ShapeView_ItemShape.cxx b/tools/ShapeView/ShapeView_ItemShape.cxx index 952534ba4a..e82fa9a9b6 100644 --- a/tools/ShapeView/ShapeView_ItemShape.cxx +++ b/tools/ShapeView/ShapeView_ItemShape.cxx @@ -15,21 +15,20 @@ #include -#include -#include -#include - -#include -#include -#include - #include #include +#include +#include +#include + +#include + +#include #include -#include -#include #include -#include + +#include +#include #include #include @@ -37,166 +36,32 @@ #include // ======================================================================= -// function : ToString -// purpose : -// ======================================================================= -QString ToString (const Standard_Boolean& theValue) -{ - return theValue ? "1" : "0"; -} - -// ======================================================================= -// function : ToString -// purpose : -// ======================================================================= -QString ToString (const gp_Pnt& thePoint) -{ - return QString ("(%1, %2, %3)").arg (thePoint.X()).arg (thePoint.Y()).arg (thePoint.Z()); -} - -// ======================================================================= -// function : ToName -// purpose : -// ======================================================================= -QString ToName (const TopAbs_ShapeEnum& theShapeType) -{ - Standard_SStream aSStream; - TopAbs::Print (theShapeType, aSStream); - return QString (aSStream.str().c_str()); -} - -// ======================================================================= -// function : ToName -// purpose : -// ======================================================================= -QString ToName (const TopAbs_Orientation& theOrientation) -{ - Standard_SStream aSStream; - TopAbs::Print(theOrientation, aSStream); - return QString (aSStream.str().c_str()); -} - -// ======================================================================= -// function : ToName +// function : GetShape // purpose : // ======================================================================= -QString ToName (const GeomAbs_Shape& theType) +TopoDS_Shape ShapeView_ItemShape::GetShape (const int theRowId) const { - switch (theType) + if (myChildShapes.IsEmpty()) { - case GeomAbs_C0: return "GeomAbs_C0"; - case GeomAbs_G1: return "GeomAbs_G1"; - case GeomAbs_C1: return "GeomAbs_C1"; - case GeomAbs_G2: return "GeomAbs_G2"; - case GeomAbs_C2: return "GeomAbs_C2"; - case GeomAbs_C3: return "GeomAbs_C3"; - case GeomAbs_CN: return "GeomAbs_CN"; - default: break; - } - return QString(); -} + ShapeView_ItemShape* aThis = (ShapeView_ItemShape*)this; -// ======================================================================= -// function : ToOtherInfo -// purpose : -// ======================================================================= -void ToOtherInfo (const TopoDS_Shape& theShape, QVariant& theValue, QVariant& theInfo) -{ - switch (theShape.ShapeType()) - { - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - case TopAbs_SOLID: - case TopAbs_SHELL: - case TopAbs_FACE: - case TopAbs_WIRE: - break; - case TopAbs_EDGE: + if (myExplodeType != TopAbs_SHAPE) { - TopoDS_Edge anEdge = TopoDS::Edge(theShape); - double aFirst, aLast; - Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aFirst, aLast); - - GeomAdaptor_Curve aAdaptor(aCurve, aFirst, aLast); - gp_Pnt aFirstPnt = aAdaptor.Value(aFirst); - gp_Pnt aLastPnt = aAdaptor.Value(aLast); - - BRepAdaptor_Curve aBRepAdaptor = BRepAdaptor_Curve(anEdge); - Adaptor3d_Curve* anAdaptor3d = &aBRepAdaptor; - - QStringList aValues, anInfo; - aValues.append (QString::number (GCPnts_AbscissaPoint::Length(*anAdaptor3d))); - anInfo.append ("Length"); - - aValues.append (aCurve->DynamicType()->Name()); - anInfo.append ("DynamicType"); - - aValues.append (ToString (aFirstPnt)); - anInfo.append (QString ("First" + QString::number (aFirst))); - - aValues.append (ToString (aLastPnt)); - anInfo.append (QString ("Last" + QString::number (aLast))); - - aValues.append (ToName (aCurve->Continuity())); - anInfo.append ("Continuity"); - - aValues.append (ToString (aCurve->IsClosed())); - anInfo.append ("IsClosed"); - - if (aCurve->IsPeriodic()) { - aValues.append (QString::number (aCurve->Period())); - anInfo.append ("IsPeriodic"); - } - else + TopExp::MapShapes(myShape, myExplodeType, aThis->myChildShapes); + } + else + { + TopoDS_Iterator aSubShapeIt (myShape); + for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++) { - aValues.append (ToString (aCurve->IsPeriodic())); - anInfo.append ("IsPeriodic"); + aThis->myChildShapes.Add (aSubShapeIt.Value()); } - theValue = aValues.join (" / "); - theInfo = QString ("%1:\n%2").arg (anInfo.join (" / ")).arg (aValues.join ("\n")); - break; } - case TopAbs_SHAPE: - default: - break; - } -} - -// ======================================================================= -// function : locationInfo -// purpose : -// ======================================================================= -QString locationInfo (const TopLoc_Location& theLocation) -{ - QString anInfo; - - gp_Trsf aTrsf = theLocation.Transformation(); - QStringList aValues, aRowValues; - for (int aRowId = 1; aRowId <= 3; aRowId++) - { - aRowValues.clear(); - for (int aColumnId = 1; aColumnId <= 4; aColumnId++) - aRowValues.append (QString::number (aTrsf.Value(aRowId, aColumnId))); - aValues.append (aRowValues.join (",")); } - anInfo.append (aValues.join (" ")); - return anInfo; -} + if (myChildShapes.Extent() >= theRowId + 1) + return myChildShapes(theRowId + 1); -// ======================================================================= -// function : GetShape -// purpose : -// ======================================================================= -TopoDS_Shape ShapeView_ItemShape::GetShape (const int theRowId) const -{ - TopoDS_Iterator aSubShapeIt (myShape); - for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++) - { - if (aCurrentIndex != theRowId) - continue; - break; - } - return aSubShapeIt.Value(); + return TopoDS_Shape(); } // ======================================================================= @@ -205,6 +70,10 @@ TopoDS_Shape ShapeView_ItemShape::GetShape (const int theRowId) const // ======================================================================= QVariant ShapeView_ItemShape::initValue(const int theRole) const { + QVariant aParentValue = ShapeView_ItemBase::initValue (theRole); + if (aParentValue.isValid()) + return aParentValue; + TopoDS_Shape aShape = getShape(); if (aShape.IsNull()) return QVariant(); @@ -214,58 +83,11 @@ QVariant ShapeView_ItemShape::initValue(const int theRole) const switch (Column()) { - case 0: return ToName (aShape.ShapeType()); - case 2: return rowCount() > 0 ? QVariant (rowCount()) : QVariant(); + case 0: return TopAbs::ShapeTypeToString (aShape.ShapeType()); + //case 2: return rowCount() > 0 ? QVariant (rowCount()) : QVariant(); case 3: return TShapePointer().ToCString(); - case 4: return ToName(aShape.Orientation()); - case 5: return locationInfo(aShape.Location()); - case 6: return ToString (aShape.Checked()); - case 7: return ToString (aShape.Closed()); - case 8: return ToString (aShape.Infinite()); - case 9: return ToString (aShape.Locked()); - case 10: return ToString (aShape.Modified()); - case 11: return ToString (aShape.Orientable()); - case 12: - { - if (aShape.ShapeType() != TopAbs_VERTEX) - return QVariant(); - TopoDS_Vertex aVertex = TopoDS::Vertex (aShape); - gp_Pnt aPoint = BRep_Tool::Pnt (aVertex); - return ToString (aPoint); - } - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - case 19: - { - if (aShape.ShapeType() != TopAbs_EDGE) - return QVariant(); - - TopoDS_Edge anEdge = TopoDS::Edge(aShape); - double aFirst, aLast; - Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aFirst, aLast); - - GeomAdaptor_Curve aAdaptor(aCurve, aFirst, aLast); - gp_Pnt aFirstPnt = aAdaptor.Value(aFirst); - gp_Pnt aLastPnt = aAdaptor.Value(aLast); - - BRepAdaptor_Curve aBRepAdaptor = BRepAdaptor_Curve(anEdge); - Adaptor3d_Curve* anAdaptor3d = &aBRepAdaptor; - - switch (Column()) - { - case 13: return QString::number (GCPnts_AbscissaPoint::Length(*anAdaptor3d)); - case 14: return aCurve->DynamicType()->Name(); - case 15: return ToString (aFirstPnt); - case 16: return ToString (aLastPnt); - case 17: return ToName (aCurve->Continuity()); - case 18: return ToString (aCurve->IsClosed()); - case 19: return aCurve->IsPeriodic() ? QString::number (aCurve->Period()) : ToString (aCurve->IsPeriodic()); - } - } + case 5: return TopAbs::ShapeOrientationToString (aShape.Orientation()); + case 6: return ViewControl_Tools::ToString (aShape.Location()).ToCString(); default: break; } return QVariant(); @@ -282,8 +104,17 @@ int ShapeView_ItemShape::initRowCount() const 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; } @@ -305,6 +136,8 @@ void ShapeView_ItemShape::Init() ShapeView_ItemRootPtr aRootItem = itemDynamicCast (Parent()); ShapeView_ItemShapePtr aShapeItem = itemDynamicCast (Parent()); myShape = aRootItem ? aRootItem->GetShape (Row()) : aShapeItem->GetShape (Row()); + + SetProperties (createItemProperties()); } // ======================================================================= @@ -348,6 +181,8 @@ TCollection_AsciiString ShapeView_ItemShape::getPointerInfo (const Handle(Standa void ShapeView_ItemShape::Reset() { myFileName = QString(); + myChildShapes.Clear(); + myShape = TopoDS_Shape(); ShapeView_ItemBase::Reset(); } @@ -363,3 +198,29 @@ void ShapeView_ItemShape::initItem() const const_cast(this)->Init(); } +// ======================================================================= +// function : createItemProperties +// purpose : +// ======================================================================= +Handle(TreeModel_ItemProperties) ShapeView_ItemShape::createItemProperties() const +{ + if (myShape.IsNull()) + return NULL; + + TreeModel_ItemBasePtr anItem = Parent()->Child (Row(), Column(), false); + + switch (myShape.ShapeType()) + { + case TopAbs_COMPOUND: break; + case TopAbs_COMPSOLID: break; + case TopAbs_SOLID: break; + case TopAbs_SHELL: break; + case TopAbs_FACE: return new ShapeView_ItemPropertiesFace (anItem); + case TopAbs_WIRE: break; + case TopAbs_EDGE: return new ShapeView_ItemPropertiesEdge (anItem); + case TopAbs_VERTEX: return new ShapeView_ItemPropertiesVertex (anItem); + case TopAbs_SHAPE: break; + default: break; + } + return NULL; +} diff --git a/tools/ShapeView/ShapeView_ItemShape.hxx b/tools/ShapeView/ShapeView_ItemShape.hxx index b04076956e..ebae15fb36 100644 --- a/tools/ShapeView/ShapeView_ItemShape.hxx +++ b/tools/ShapeView/ShapeView_ItemShape.hxx @@ -17,8 +17,12 @@ #define ShapeView_ItemShape_H #include + +#include + #include #include +#include #include #include @@ -46,6 +50,13 @@ public: //! 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; } @@ -105,16 +116,22 @@ protected: //! \return the string value static TCollection_AsciiString getPointerInfo (const Handle(Standard_Transient)& thePointer, const bool isShortInfo = true); + //! Creates container of item properties + Standard_EXPORT Handle(TreeModel_ItemProperties) createItemProperties() const; + 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 + + TopTools_IndexedMapOfShape myChildShapes; //! cached container of child shapes }; #endif diff --git a/tools/ShapeView/ShapeView_Tools.cxx b/tools/ShapeView/ShapeView_Tools.cxx index afa6de4571..6f5addf555 100644 --- a/tools/ShapeView/ShapeView_Tools.cxx +++ b/tools/ShapeView/ShapeView_Tools.cxx @@ -14,11 +14,19 @@ // commercial license or contractual agreement. #include +#include + -#include #include +#include +#include + +#include +#include + +#include +#include -#include // ======================================================================= // function : ReadShape // purpose : @@ -31,3 +39,109 @@ TopoDS_Shape ShapeView_Tools::ReadShape (const TCollection_AsciiString& theFileN BRepTools::Read (aShape, theFileName.ToCString(), aBuilder); return aShape; } + +// ======================================================================= +// function : IsPossibleToExplode +// purpose : +// ======================================================================= +Standard_Boolean ShapeView_Tools::IsPossibleToExplode (const TopoDS_Shape& theShape, + NCollection_List& theExplodeTypes) +{ + TopAbs_ShapeEnum aShapeType = theShape.ShapeType(); + + if (!theExplodeTypes.Contains (aShapeType)) + theExplodeTypes.Append(aShapeType); + + if (theExplodeTypes.Extent() == TopAbs_SHAPE + 1) // all types are collected, stop + return Standard_True; + + TopoDS_Iterator aSubShapeIt (theShape); + for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++) + { + if (IsPossibleToExplode (aSubShapeIt.Value(), theExplodeTypes)) + return Standard_True; + } + return Standard_False; +} + +// ======================================================================= +// function : GetPropertyTableValues +// purpose : +// ======================================================================= +void ShapeView_Tools::GetPropertyTableValues (const TreeModel_ItemBasePtr& theItem, + QList& theTableValues) +{ + TreeModel_ItemBasePtr anItem = theItem; + ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(anItem); + if (!aShapeItem) + return; + + Handle(TreeModel_ItemProperties) anItemProperties = aShapeItem->GetProperties(); + if (anItemProperties.IsNull()) + return; + + ViewControl_TableModelValues* aTableValues = new ViewControl_TableModelValues(); + aTableValues->SetProperties (anItemProperties); + theTableValues.append (aTableValues); +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +QString ShapeView_Tools::ToString (const Standard_Boolean& theValue) +{ + return theValue ? "1" : "0"; +} + +// ======================================================================= +// function : ToName +// purpose : +// ======================================================================= +QString ShapeView_Tools::ToName (const GeomAbs_Shape& theType) +{ + switch (theType) + { + case GeomAbs_C0: return "GeomAbs_C0"; + case GeomAbs_G1: return "GeomAbs_G1"; + case GeomAbs_C1: return "GeomAbs_C1"; + case GeomAbs_G2: return "GeomAbs_G2"; + case GeomAbs_C2: return "GeomAbs_C2"; + case GeomAbs_C3: return "GeomAbs_C3"; + case GeomAbs_CN: return "GeomAbs_CN"; + default: break; + } + return QString(); +} + +// ======================================================================= +// function : GetShapeGlobalPropertiesCount +// purpose : +// ======================================================================= +int ShapeView_Tools::GetShapeGlobalPropertiesCount() +{ + return 6; +} + +// ======================================================================= +// function : GetShapeGlobalProperties +// purpose : +// ======================================================================= +QVariant ShapeView_Tools::GetShapeGlobalProperties (const TopoDS_Shape& theShape, + const int theRow, + const int theColumn) +{ + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? "COMMON PROPERTIES" : ""; + case 1: return isFirstColumn ? "Checked" : ToString (theShape.Checked()); + case 2: return isFirstColumn ? "Closed" : ToString (theShape.Closed()); + case 3: return isFirstColumn ? "Infinite" : ToString (theShape.Infinite()); + case 4: return isFirstColumn ? "Locked" : ToString (theShape.Locked()); + case 5: return isFirstColumn ? "Modified" : ToString (theShape.Modified()); + case 6: return isFirstColumn ? "Orientable" : ToString (theShape.Orientable()); + } + return QVariant(); +} \ No newline at end of file diff --git a/tools/ShapeView/ShapeView_Tools.hxx b/tools/ShapeView/ShapeView_Tools.hxx index a922e42b36..dd12fc8e56 100644 --- a/tools/ShapeView/ShapeView_Tools.hxx +++ b/tools/ShapeView/ShapeView_Tools.hxx @@ -18,10 +18,21 @@ #include +#include + +#include #include #include #include +#include + +#include +#include +#include +#include +#include + //! \class ShapeView_Tools //! It gives auxiliary methods for TopoDS_Shape manipulation class ShapeView_Tools @@ -32,6 +43,38 @@ public: //! \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. The search is recursive untill all types are collected. + //! \param theShape source shape object + //! \param theExplodeTypes container of possible shape types to be exploded + //! \return true if explode is finished, all types are collected. + Standard_EXPORT static Standard_Boolean IsPossibleToExplode(const TopoDS_Shape& theShape, + NCollection_List& theExplodeTypes); + + //! Fills container of table values + //! \param theAlert a message alert + //! \param theTableValue container of values + Standard_EXPORT static void GetPropertyTableValues (const TreeModel_ItemBasePtr& theItem, + QList& theTableValues); + + //! Returns count of gloal properties (6) + //! \return count value + Standard_EXPORT static int GetShapeGlobalPropertiesCount(); + + //! Returns shape global property by row/column + //! \param theShape investigated shape + //! \param theRow row index in [0, 6] + //! \param theColumn column index in [0, 1] + Standard_EXPORT static QVariant GetShapeGlobalProperties (const TopoDS_Shape& theShape, + const int theRow, + const int theColumn); + + //! Returns text presentation of boolean value + Standard_EXPORT static QString ToString (const Standard_Boolean& theValue); + + //! Returns shape type name + Standard_EXPORT static QString ToName (const GeomAbs_Shape& theType); + }; #endif diff --git a/tools/ShapeView/ShapeView_TreeModel.cxx b/tools/ShapeView/ShapeView_TreeModel.cxx index bc29c119ae..8b39f592cd 100644 --- a/tools/ShapeView/ShapeView_TreeModel.cxx +++ b/tools/ShapeView/ShapeView_TreeModel.cxx @@ -38,25 +38,9 @@ ShapeView_TreeModel::ShapeView_TreeModel (QObject* theParent) // column 1 is reserved for visiblity state SetHeaderItem (2, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH)); SetHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH)); - SetHeaderItem (4, TreeModel_HeaderSection ("Orientation", COLUMN_ORIENTATION_WIDTH)); - SetHeaderItem (5, TreeModel_HeaderSection ("Location", COLUMN_LOCATION_WIDTH)); - - SetHeaderItem (6, TreeModel_HeaderSection ("Checked", -1, true)); - SetHeaderItem (7, TreeModel_HeaderSection ("Closed", -1, true)); - SetHeaderItem (8, TreeModel_HeaderSection ("Infinite", -1, true)); - SetHeaderItem (9, TreeModel_HeaderSection ("Locked", -1, true)); - SetHeaderItem (10, TreeModel_HeaderSection ("Modified", -1, true)); - SetHeaderItem (11, TreeModel_HeaderSection ("Orientable", -1, true)); - - SetHeaderItem (12, TreeModel_HeaderSection ("VERTEX: (X, Y, Z)", -1, true)); - - SetHeaderItem (13, TreeModel_HeaderSection ("EDGE: Length", -1, true)); - SetHeaderItem (14, TreeModel_HeaderSection ("DynamicType", -1, true)); - SetHeaderItem (15, TreeModel_HeaderSection ("First", -1, true)); - SetHeaderItem (16, TreeModel_HeaderSection ("Last", -1, true)); - SetHeaderItem (17, TreeModel_HeaderSection ("Continuity", -1, true)); - SetHeaderItem (18, TreeModel_HeaderSection ("IsClosed", -1, true)); - SetHeaderItem (19, TreeModel_HeaderSection ("IsPeriodic", -1, true)); + SetHeaderItem (4, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH)); + SetHeaderItem (5, TreeModel_HeaderSection ("Orientation", COLUMN_ORIENTATION_WIDTH)); + SetHeaderItem (6, TreeModel_HeaderSection ("Location", COLUMN_LOCATION_WIDTH)); } // ======================================================================= diff --git a/tools/ShapeView/ShapeView_Window.cxx b/tools/ShapeView/ShapeView_Window.cxx index 76eaefa6b4..11a3fb0c2b 100644 --- a/tools/ShapeView/ShapeView_Window.cxx +++ b/tools/ShapeView/ShapeView_Window.cxx @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -39,6 +40,7 @@ #include #include +#include #include #include @@ -95,17 +97,41 @@ ShapeView_Window::ShapeView_Window (QWidget* theParent) this, SLOT (onTreeViewContextMenuRequested (const QPoint&))); new TreeModel_ContextMenu (myTreeView); ShapeView_TreeModel* aModel = new ShapeView_TreeModel (myTreeView); + for (int i = 5; i <= 6; i++) // hide shape parameters columns + { + TreeModel_HeaderSection anItem = aModel->GetHeaderItem (i); + anItem.SetIsHidden (true); + aModel->SetHeaderItem (i, anItem); + } + + myTreeView->setModel (aModel); ShapeView_VisibilityState* aVisibilityState = new ShapeView_VisibilityState (aModel); aModel->SetVisibilityState (aVisibilityState); TreeModel_Tools::UseVisibilityColumn (myTreeView); + QItemSelectionModel* aSelModel = new QItemSelectionModel (myTreeView->model(), myTreeView); + myTreeView->setSelectionModel (aSelModel); + connect (aSelModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)), + this, SLOT (onTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&))); + QModelIndex aParentIndex = myTreeView->model()->index (0, 0); myTreeView->setExpanded (aParentIndex, true); myMainWindow->setCentralWidget (myTreeView); + // property view + //myPaneCreators.Append (new VInspectorPaneAIS_PaneCreator()); + + myPropertyView = new ViewControl_PropertyView (myMainWindow, + QSize(SHAPEVIEW_DEFAULT_VIEW_WIDTH, SHAPEVIEW_DEFAULT_VIEW_HEIGHT)); + myPropertyPanelWidget = new QDockWidget (tr ("PropertyPanel"), myMainWindow); + myPropertyPanelWidget->setObjectName (myPropertyPanelWidget->windowTitle()); + myPropertyPanelWidget->setTitleBarWidget (new QWidget(myMainWindow)); + myPropertyPanelWidget->setWidget (myPropertyView->GetControl()); + myMainWindow->addDockWidget (Qt::RightDockWidgetArea, myPropertyPanelWidget); + // view - myViewWindow = new View_Window (myMainWindow, false); + myViewWindow = new View_Window (myMainWindow, NULL, false); connect (myViewWindow, SIGNAL(eraseAllPerformed()), this, SLOT(onEraseAllPerformed())); aVisibilityState->SetDisplayer (myViewWindow->GetDisplayer()); aVisibilityState->SetPresentationType (View_PresentationType_Main); @@ -117,6 +143,8 @@ ShapeView_Window::ShapeView_Window (QWidget* theParent) aViewDockWidget->setTitleBarWidget (myViewWindow->GetViewToolBar()->GetControl()); myMainWindow->addDockWidget (Qt::RightDockWidgetArea, aViewDockWidget); + myMainWindow->splitDockWidget(myPropertyPanelWidget, aViewDockWidget, Qt::Vertical); + myMainWindow->resize (DEFAULT_SHAPE_VIEW_WIDTH, DEFAULT_SHAPE_VIEW_HEIGHT); myMainWindow->move (DEFAULT_SHAPE_VIEW_POSITION_X, DEFAULT_SHAPE_VIEW_POSITION_Y); } @@ -355,12 +383,54 @@ void ShapeView_Window::onTreeViewContextMenuRequested (const QPoint& thePosition 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)); + aMenu->addAction (ViewControl_Tools::CreateAction ("ShapeFix_Shape", SLOT (onShapeFixShape()), myMainWindow, this)); + + ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(anItemBase); + const TopoDS_Shape& aShape = aShapeItem->GetItemShape(); + TopAbs_ShapeEnum anExplodeType = aShapeItem->GetExplodeType(); + NCollection_List anExplodeTypes; + ShapeView_Tools::IsPossibleToExplode (aShape, anExplodeTypes); + if (anExplodeTypes.Size() > 0) + { + QMenu* anExplodeMenu = aMenu->addMenu ("Explode"); + for (NCollection_List::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); + } } QPoint aPoint = myTreeView->mapToGlobal (thePosition); aMenu->exec (aPoint); } +// ======================================================================= +// function : +// onTreeViewSelectionChanged +// purpose : +// ======================================================================= +void ShapeView_Window::onTreeViewSelectionChanged (const QItemSelection&, + const QItemSelection&) +{ + QApplication::setOverrideCursor (Qt::WaitCursor); + + if (myPropertyPanelWidget->toggleViewAction()->isChecked()) + updatePropertyPanelBySelection(); + + QApplication::restoreOverrideCursor(); +} + // ======================================================================= // function : onEraseAllPerformed // purpose : @@ -389,6 +459,79 @@ void ShapeView_Window::onBREPDirectory() viewFile (aFileName); } +// ======================================================================= +// function : onExplode +// purpose : +// ======================================================================= +void ShapeView_Window::onShapeFixShape() +{ + 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(anItemBase); + if (!aShapeItem) + return; + + const TopoDS_Shape aShape = aShapeItem->GetItemShape(); + + Standard_Real LinTol = Precision::Confusion(); + Standard_Real AngTol = Precision::Angular(); + + Handle(ShapeFix_Shape) Fixer = new ShapeFix_Shape (aShape); + Fixer->SetPrecision (LinTol); + Fixer->SetMaxTolerance (LinTol); + Fixer->Perform(); + + TopoDS_Shape aFixedShape = Fixer->Shape(); + addShape (aFixedShape); +} + +// ======================================================================= +// 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(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 (myTreeView->model()); + aTreeModel->Reset(); + aTreeModel->EmitLayoutChanged(); + QApplication::restoreOverrideCursor(); +} + // ======================================================================= // function : onLoadFile // purpose : @@ -399,8 +542,12 @@ void ShapeView_Window::onLoadFile() QString aFileName = ShapeView_OpenFileDialog::OpenFile(0, aDataDirName); aFileName = QDir().toNativeSeparators (aFileName); - if (!aFileName.isEmpty()) + if (aFileName.isEmpty()) + return; + + QApplication::setOverrideCursor (Qt::WaitCursor); onOpenFile(aFileName); + QApplication::restoreOverrideCursor(); } // ======================================================================= @@ -506,6 +653,28 @@ void ShapeView_Window::viewFile (const QString& theFileName) QApplication::restoreOverrideCursor(); } + +// ======================================================================= +// function : updatePropertyPanelBySelection +// purpose : +// ======================================================================= +void ShapeView_Window::updatePropertyPanelBySelection() +{ + QItemSelectionModel* aModel = myTreeView->selectionModel(); + if (!aModel) + return; + + QModelIndexList aSelected = TreeModel_ModelBase::GetSelected (aModel->selectedIndexes(), 0); + QList aTableValues; + + if (aSelected.size() == 1) + { + TreeModel_ItemBasePtr aSelectedItem = TreeModel_ModelBase::GetItemByIndex(aSelected.first()); + ShapeView_Tools::GetPropertyTableValues (aSelectedItem, aTableValues); + } + myPropertyView->Init (aTableValues); +} + // ======================================================================= // function : removeBREPFiles // purpose : diff --git a/tools/ShapeView/ShapeView_Window.hxx b/tools/ShapeView/ShapeView_Window.hxx index 39274f8939..4ff8cd245f 100644 --- a/tools/ShapeView/ShapeView_Window.hxx +++ b/tools/ShapeView/ShapeView_Window.hxx @@ -33,7 +33,10 @@ class View_Window; +class ViewControl_PropertyView; + class QAction; +class QDockWidget; class QMainWindow; class QWidget; @@ -108,12 +111,24 @@ protected slots: //! \param thePosition a clicked point void onTreeViewContextMenuRequested (const QPoint& thePosition); + //! Processes selection in tree view: make presentation or owner selected in the context if corresponding + //! check box is checked + //! \param theSelected a selected items + //! \param theDeselected a deselected items + void onTreeViewSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected); + //! Updates visibility states by erase all in context void onEraseAllPerformed(); //! Exports shape to BREP file and view result file void onBREPDirectory(); + //! Perform shape fix for the selected shape. Result is a new shape in the tree. + void onShapeFixShape(); + + //! Set the shape item exploded + void onExplode(); + //! Removes all shapes in tree view void onClearView() { RemoveAllShapes(); } @@ -135,6 +150,9 @@ protected slots: protected: + //! Updates property panel content by item selected in tree view. + void updatePropertyPanelBySelection(); + //! Views file name content in a text editor. It creates new Qt free control with content. //! \param theFileName a file name void viewFile (const QString& theFileName); @@ -160,6 +178,9 @@ private: QMainWindow* myMainWindow; //!< main control, parent for all ShapeView controls + 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 diff --git a/tools/TInspector/TInspector_Window.cxx b/tools/TInspector/TInspector_Window.cxx index 8bb89ab31a..d2903af8a7 100644 --- a/tools/TInspector/TInspector_Window.cxx +++ b/tools/TInspector/TInspector_Window.cxx @@ -42,7 +42,7 @@ const int TINSPECTOR_DEFAULT_WIDTH = 650; const int TINSPECTOR_DEFAULT_HEIGHT = 500;//350; -const int TINSPECTOR_DEFAULT_POSITION_X = 200; +const int TINSPECTOR_DEFAULT_POSITION_X = 100;//200; const int TINSPECTOR_DEFAULT_POSITION_Y = 60; // ======================================================================= diff --git a/tools/TInspectorEXE/TInspectorEXE.cxx b/tools/TInspectorEXE/TInspectorEXE.cxx index 10dcf4b845..5743c1e0d1 100644 --- a/tools/TInspectorEXE/TInspectorEXE.cxx +++ b/tools/TInspectorEXE/TInspectorEXE.cxx @@ -18,6 +18,7 @@ #include +#include #include #include @@ -65,7 +66,7 @@ void setPluginSampleDirectory (const TCollection_AsciiString& theName, TInspecto aFileName = fileNameInDataDir ("CSF_OCCTDataPath", "occ/hammer.brep"); else if (theName.IsEqual ("TKVInspector")) { - aFileName = fileNameInDataDir ("CSF_OCCTDataPath", "occ/face1.brep"); + //aFileName = fileNameInDataDir ("CSF_OCCTDataPath", "occ/face1.brep"); anAdditionalFileName = fileNameInDataDir ("CSF_OCCTDataPath", "occ/face2.brep"); } aRecentlyOpenedFiles.append (aFileName.ToCString()); @@ -103,6 +104,9 @@ int main (int argc, char** argv) if (!strcmp (argv[anArgId], "vinspector")) aPlugins.insert ("TKVInspector"); + + if (!strcmp (argv[anArgId], "messageview")) + aPlugins.insert ("TKMessageView"); } NCollection_List aParameters; @@ -122,7 +126,12 @@ int main (int argc, char** argv) aPlugins.insert("TKShapeView"); aPlugins.insert("TKVInspector"); - anActivatedPluginName = "TKDFBrowser"; + Handle(Message_Report) aReport = Message_Report::CurrentReport (Standard_True); + aReport->SetLimit (100);//30); + aReport->SetActive (Standard_True);//Standard_False); + aPlugins.insert("TKMessageView"); + + anActivatedPluginName = "TKVInspector"; } else anActivatedPluginName = *aPlugins.rbegin(); diff --git a/tools/TKTreeModel/CMakeLists.txt b/tools/TKTreeModel/CMakeLists.txt index 99fc025494..de376fe964 100644 --- a/tools/TKTreeModel/CMakeLists.txt +++ b/tools/TKTreeModel/CMakeLists.txt @@ -1,5 +1,7 @@ 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) diff --git a/tools/TKTreeModel/EXTERNLIB b/tools/TKTreeModel/EXTERNLIB index 893b52c708..faee5c912f 100644 --- a/tools/TKTreeModel/EXTERNLIB +++ b/tools/TKTreeModel/EXTERNLIB @@ -1 +1,5 @@ +TKernel +TKMath +TKPrim +TKTopAlgo CSF_QT \ No newline at end of file diff --git a/tools/TKVInspector/PACKAGES b/tools/TKVInspector/PACKAGES index 989972a256..e1727bb91c 100644 --- a/tools/TKVInspector/PACKAGES +++ b/tools/TKVInspector/PACKAGES @@ -1 +1,2 @@ +VInspectorPaneAIS VInspector \ No newline at end of file diff --git a/tools/ToolsDraw/ToolsDraw.cxx b/tools/ToolsDraw/ToolsDraw.cxx index ca4b96c779..8eddf24029 100644 --- a/tools/ToolsDraw/ToolsDraw.cxx +++ b/tools/ToolsDraw/ToolsDraw.cxx @@ -40,6 +40,15 @@ Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS(); static TInspector_Communicator* MyCommunicator; +// ======================================================================= +// function : GetCommunicator +// purpose : defines plugin library name by the command argument +// ======================================================================= +TInspector_Communicator* ToolsDraw::GetCommunicator() +{ + return MyCommunicator; +} + // ======================================================================= // function : convertToPluginName // purpose : defines plugin library name by the command argument diff --git a/tools/ToolsDraw/ToolsDraw.hxx b/tools/ToolsDraw/ToolsDraw.hxx index b004ad50df..376361289f 100644 --- a/tools/ToolsDraw/ToolsDraw.hxx +++ b/tools/ToolsDraw/ToolsDraw.hxx @@ -20,6 +20,8 @@ #include #include +class TInspector_Communicator; + //! \class ToolsDraw //! \brief Registers DRAW commands to connect to TInspector tools class ToolsDraw @@ -36,6 +38,8 @@ public: //! \param theCommands Standard_EXPORT static void Commands (Draw_Interpretor& theCommands); + Standard_EXPORT static TInspector_Communicator* GetCommunicator(); + private: }; diff --git a/tools/TreeModel/FILES b/tools/TreeModel/FILES index 2eeab8f369..d7662e6a0e 100644 --- a/tools/TreeModel/FILES +++ b/tools/TreeModel/FILES @@ -6,6 +6,10 @@ TreeModel_ContextMenu.hxx TreeModel_HeaderSection.hxx TreeModel_ItemBase.cxx TreeModel_ItemBase.hxx +TreeModel_ItemProperties.cxx +TreeModel_ItemProperties.hxx +TreeModel_ItemPropertiesCreator.cxx +TreeModel_ItemPropertiesCreator.hxx TreeModel_ItemRole.hxx TreeModel_ModelBase.cxx TreeModel_ModelBase.hxx diff --git a/tools/TreeModel/TreeModel_HeaderSection.hxx b/tools/TreeModel/TreeModel_HeaderSection.hxx index 5ea9ca1e4f..dd57708c91 100644 --- a/tools/TreeModel/TreeModel_HeaderSection.hxx +++ b/tools/TreeModel/TreeModel_HeaderSection.hxx @@ -41,6 +41,11 @@ public: //! Destructor ~TreeModel_HeaderSection() {} + //! Returns whether the header section is not initialized with values. + //! The check is empty value of the name text + //! \return boolean value + bool IsEmpty() const { return myName.isEmpty(); } + //! Sets text value //! \theName text value void SetName (const QString& theName) { myName = theName; } diff --git a/tools/TreeModel/TreeModel_ItemBase.cxx b/tools/TreeModel/TreeModel_ItemBase.cxx index 464a788863..3efee94260 100644 --- a/tools/TreeModel/TreeModel_ItemBase.cxx +++ b/tools/TreeModel/TreeModel_ItemBase.cxx @@ -14,7 +14,7 @@ // commercial license or contractual agreement. #include - +#include #include #include @@ -33,6 +33,24 @@ TreeModel_ItemBase::TreeModel_ItemBase (TreeModel_ItemBasePtr theParent, const i m_iColumn = theColumn; } +// ======================================================================= +// function : SetProperties +// purpose : +// ======================================================================= +void TreeModel_ItemBase::SetProperties (const Handle(TreeModel_ItemProperties)& theProperties) +{ + myProperties = theProperties; +} + +// ======================================================================= +// function : GetProperties +// purpose : +// ======================================================================= +Handle(TreeModel_ItemProperties) TreeModel_ItemBase::GetProperties() const +{ + return myProperties; +} + // ======================================================================= // function : reset // purpose : @@ -47,6 +65,9 @@ void TreeModel_ItemBase::Reset() } m_bInitialized = false; myCachedValues.clear(); + + if (!GetProperties().IsNull()) + GetProperties()->Reset(); } // ======================================================================= @@ -74,7 +95,12 @@ TreeModel_ItemBasePtr TreeModel_ItemBase::Child (int theRow, int theColumn, cons TreeModel_ItemBasePtr anItem; if (isToCreate) { - anItem = createChild (theRow, theColumn); + int aRowCount = rowCount(); + if (myProperties.IsNull() || theRow < aRowCount - myProperties->ChildItemCount()) + anItem = createChild (theRow, theColumn); + else if (!myProperties.IsNull()) + anItem = myProperties->CreateChildItem (theRow, theColumn); + if (anItem) m_ChildItems[aPos] = anItem; } @@ -99,8 +125,45 @@ QVariant TreeModel_ItemBase::cachedValue (const int theItemRole) const if (myCachedValues.contains (theItemRole)) return myCachedValues[theItemRole]; - const_cast(this)->myCachedValues.insert (theItemRole, - theItemRole == TreeModel_ItemRole_RowCountRole ? QVariant (initRowCount()) : initValue (theItemRole)); + QVariant aValueToCache; + if (theItemRole == TreeModel_ItemRole_RowCountRole) + { + aValueToCache = myProperties.IsNull() ? initRowCount() : (initRowCount() + myProperties->ChildItemCount()); + } + else + aValueToCache = initValue (theItemRole); + const_cast(this)->myCachedValues.insert (theItemRole, aValueToCache); return myCachedValues.contains (theItemRole) ? myCachedValues[theItemRole] : QVariant(); } + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant TreeModel_ItemBase::initValue (const int theItemRole) const +{ + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + switch (Column()) + { + case 1: { return rowCount(); } + //case 2: return ViewControl_Tools::GetPointerInfo (GetObject(), true).ToCString(); + case 3: { return Row(); } + } + + return QVariant(); +} + +// ======================================================================= +// function : RowCountWithoutProperties +// purpose : +// ======================================================================= +int TreeModel_ItemBase::RowCountWithoutProperties (const TreeModel_ItemBasePtr& theItem) +{ + if (!theItem->GetProperties()) + return theItem->rowCount(); + + return theItem->rowCount() - theItem->GetProperties()->ChildItemCount(); +} diff --git a/tools/TreeModel/TreeModel_ItemBase.hxx b/tools/TreeModel/TreeModel_ItemBase.hxx index 82ba6dc360..45da4d7805 100644 --- a/tools/TreeModel/TreeModel_ItemBase.hxx +++ b/tools/TreeModel/TreeModel_ItemBase.hxx @@ -18,6 +18,9 @@ #include #include +#include +#include + #include #include @@ -32,6 +35,7 @@ #include class TreeModel_ItemBase; +class TreeModel_ItemProperties; typedef QExplicitlySharedDataPointer TreeModel_ItemBasePtr; @@ -83,6 +87,10 @@ public: //! there should be initialized here. virtual void Init() { m_bInitialized = true; } + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { return NULL; } + //! Resets the item and the child items content. Sets the initialized state to false. //! If the item has internal values, there should be reseted here. Standard_EXPORT virtual void Reset(); @@ -127,6 +135,19 @@ public: //! \return the row count int rowCount() const { return cachedValue(TreeModel_ItemRole_RowCountRole).toInt(); } + //! Sets item table properties builder + Standard_EXPORT void SetProperties (const Handle(TreeModel_ItemProperties)& theProperties); + + //! Returns item table properties builder + Standard_EXPORT Handle(TreeModel_ItemProperties) GetProperties() const; + + //! Dumps the content of me on the stream . + virtual Standard_Boolean Dump (Standard_OStream& OS) const { (void)OS; return Standard_False; } + + //! Returns number of item rows only + static Standard_EXPORT int RowCountWithoutProperties (const TreeModel_ItemBasePtr& theItem); + + protected: //! \param theParent the parent item @@ -134,6 +155,9 @@ protected: //! \param theColumn the item column positition in the parent item Standard_EXPORT TreeModel_ItemBase (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn); + //! Initialize the current item. It creates a backup of the specific item information + virtual void initItem() const {} + //! Creates a child item in the given position. //! \param theRow the child row position //! \param theColumn the child column position @@ -156,7 +180,7 @@ protected: //! Return data value for the role. It should be reimplemented in child //! \param theItemRole a value role //! \return the value - virtual QVariant initValue (const int theItemRole) const = 0; + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const; private: @@ -168,6 +192,8 @@ private: int m_iRow; //!< the item row position in the parent item int m_iColumn; //!< the item column position in the parent item bool m_bInitialized; //!< the state whether the item content is already initialized + + Handle(TreeModel_ItemProperties) myProperties; //!< item properties }; //! Returns an explicitly shared pointer to the pointer held by other, using a diff --git a/tools/TreeModel/TreeModel_ItemProperties.cxx b/tools/TreeModel/TreeModel_ItemProperties.cxx new file mode 100644 index 0000000000..a16e3a2ca5 --- /dev/null +++ b/tools/TreeModel/TreeModel_ItemProperties.cxx @@ -0,0 +1,33 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +IMPLEMENT_STANDARD_RTTIEXT(TreeModel_ItemProperties, Standard_Transient) + +// ======================================================================= +// function : GetTableFlags +// purpose : +// ======================================================================= + +Qt::ItemFlags TreeModel_ItemProperties::GetTableFlags (const int, const int theColumn) const +{ + Qt::ItemFlags aFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + + if (theColumn == 1) + aFlags = aFlags | Qt::ItemIsEditable; + + return aFlags; +} diff --git a/tools/TreeModel/TreeModel_ItemProperties.hxx b/tools/TreeModel/TreeModel_ItemProperties.hxx new file mode 100644 index 0000000000..a7a41282c6 --- /dev/null +++ b/tools/TreeModel/TreeModel_ItemProperties.hxx @@ -0,0 +1,128 @@ +// Created on: 2019-02-25 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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_ItemProperties_H +#define TreeModel_ItemProperties_H + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE (TreeModel_ItemProperties, Standard_Transient) + +//! \class TreeModel_ItemProperties +//! Class to manipulate properties of tree item. The properties are organized in table structure +class TreeModel_ItemProperties : public Standard_Transient +{ +public: + //! Constructor + TreeModel_ItemProperties (const TreeModel_ItemBasePtr& theItem) : myItem (theItem) {} + + //! Destructor + ~TreeModel_ItemProperties() {} + + //! If me has internal values, it should be initialized here. + virtual void Init() {} + + //! If the item has internal values, there should be reseted here. + Standard_EXPORT virtual void Reset() {} + + //! Returns number of item children + //! \return an integer value, ZERO by default + virtual int ChildItemCount() const { return 0; } + + //! 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 CreateChildItem (int theRow, int theColumn) const + { (void)theRow; (void)theColumn; return TreeModel_ItemBasePtr(); } + + //! Returns number of table columns. Default value is two columns: title to value + //! \return an integer value + virtual int GetTableColumnCount() const { return 2; } + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const { return 0; } + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const + { (void)theRow; (void)theColumn; (void)theRole; return QVariant(); } + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const + { (void)theRow; (void)theColumn; return ViewControl_EditType_None; } + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const + { (void)theRow; (void)theColumn; return QList(); } + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) + { (void)theRow; (void)theColumn; (void)theValue; return false; } + + //! Returns presentation of the attribute to be visualized in the view + //! \param theRow a model index row + //! \param theColumn a model index column + //! \thePresentations [out] container of presentation handles to be visualized + virtual void GetPresentations (const int theRow, const int theColumn, + NCollection_List& thePresentations) + { (void)theRow; (void)theColumn; (void)thePresentations; } + + //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable. + //! Additional flag for the column 1 is Qt::ItemIsEditable. + //! \param theIndex a model index + //! \return flags + Standard_EXPORT virtual Qt::ItemFlags GetTableFlags (const int theRow, const int theColumn) const; + + + DEFINE_STANDARD_RTTIEXT (TreeModel_ItemProperties, Standard_Transient) + +protected: + //! Returns current item + TreeModel_ItemBasePtr getItem() const { return myItem; } + +private: + TreeModel_ItemBasePtr myItem; //! current item +}; + +#endif \ No newline at end of file diff --git a/tools/TreeModel/TreeModel_ItemPropertiesCreator.cxx b/tools/TreeModel/TreeModel_ItemPropertiesCreator.cxx new file mode 100644 index 0000000000..c5ae48db04 --- /dev/null +++ b/tools/TreeModel/TreeModel_ItemPropertiesCreator.cxx @@ -0,0 +1,18 @@ +// Created on: 2019-04-12 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +IMPLEMENT_STANDARD_RTTIEXT(TreeModel_ItemPropertiesCreator, Standard_Transient) diff --git a/tools/TreeModel/TreeModel_ItemPropertiesCreator.hxx b/tools/TreeModel/TreeModel_ItemPropertiesCreator.hxx new file mode 100644 index 0000000000..7e51e6ca98 --- /dev/null +++ b/tools/TreeModel/TreeModel_ItemPropertiesCreator.hxx @@ -0,0 +1,51 @@ +// Created on: 2019-04-12 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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_ItemPropertiesCreator_H +#define TreeModel_ItemPropertiesCreator_H + +#include + +#include +#include +#include +#include +#include + +class TreeModel_ItemProperties; + +DEFINE_STANDARD_HANDLE (TreeModel_ItemPropertiesCreator, Standard_Transient) + +//! \class TreeModel_ItemPropertiesCreator +//! \brief An interface to create custom panes by transient object name. +class TreeModel_ItemPropertiesCreator : public Standard_Transient +{ +public: + + //! Constructor + TreeModel_ItemPropertiesCreator() {} + + //! Destructor + virtual ~TreeModel_ItemPropertiesCreator() {} + + //! Creates pane for type + //! \param theName a type name + //! \return a pane if it can be created for this type or NULL + virtual TreeModel_ItemProperties* GetProperties (const TreeModel_ItemBasePtr& theItem) = 0; + + DEFINE_STANDARD_RTTIEXT (TreeModel_ItemPropertiesCreator, Standard_Transient) +}; + +#endif diff --git a/tools/TreeModel/TreeModel_ModelBase.cxx b/tools/TreeModel/TreeModel_ModelBase.cxx index 72acad8d01..1b07852a45 100644 --- a/tools/TreeModel/TreeModel_ModelBase.cxx +++ b/tools/TreeModel/TreeModel_ModelBase.cxx @@ -16,9 +16,13 @@ #include #include +#include +#include #include #include +#include + #include #include #include @@ -31,6 +35,8 @@ TreeModel_ModelBase::TreeModel_ModelBase (QObject* theParent) : QAbstractItemModel (theParent), m_pRootItem (0), m_pUseVisibilityColumn (false), myVisibilityState (0) { + myVisibleIcon = QIcon (":/icons/item_visible.png"); + myInvisibleIcon = QIcon (":/icons/item_invisible.png"); } // ======================================================================= @@ -104,14 +110,18 @@ QVariant TreeModel_ModelBase::data (const QModelIndex& theIndex, int theRole) co if (!myVisibilityState || !myVisibilityState->CanBeVisible (theIndex)) return QVariant(); - QVariant aValue = QIcon (myVisibilityState->IsVisible (theIndex) ? ":/icons/item_visible.png" - : ":/icons/item_invisible.png"); + QVariant aValue = myVisibilityState->IsVisible (theIndex) ? myVisibleIcon : myInvisibleIcon; anItem->SetCustomData (aValue, theRole); return aValue; } TreeModel_ItemBasePtr anItem = GetItemByIndex (theIndex); - return anItem->data (theIndex, theRole); + QVariant anItemData = anItem->data (theIndex, theRole); + + if (anItemData.isNull() && theRole == Qt::BackgroundRole && myHighlightedIndices.contains (theIndex)) + anItemData = TreeModel_Tools::LightHighlightColor(); + + return anItemData; } // ======================================================================= @@ -174,6 +184,24 @@ int TreeModel_ModelBase::rowCount (const QModelIndex& theParent) const else aParentItem = GetItemByIndex (theParent); + if (!aParentItem) + return 0; + if (!aParentItem->IsInitialized()) + { + TreeModel_ItemProperties* aProperties = 0; + if (!myPropertiesCreators.IsEmpty()) + { + for (NCollection_List::Iterator anIterator (myPropertiesCreators); anIterator.More(); anIterator.Next()) + { + Handle(TreeModel_ItemPropertiesCreator) aCreator = anIterator.Value(); + aProperties = aCreator->GetProperties (aParentItem); + if (aProperties) + break; + } + } + aParentItem->SetProperties (aProperties); + } + return aParentItem ? aParentItem->rowCount() : 0; } @@ -207,21 +235,70 @@ void TreeModel_ModelBase::EmitDataChanged (const QModelIndex& theTopLeft, const } // ======================================================================= -// function : SingleSelected +// function : SetPropertiesCreator // purpose : // ======================================================================= -QModelIndex TreeModel_ModelBase::SingleSelected (const QModelIndexList& theIndices, const int theCellId, - const Qt::Orientation theOrientation) +void TreeModel_ModelBase::AddPropertiesCreator (const Handle(TreeModel_ItemPropertiesCreator)& theCreator) +{ + if (myPropertiesCreators.Contains (theCreator)) + return; + myPropertiesCreators.Append (theCreator); +} + +// ======================================================================= +// function : GetProperties +// purpose : +// ======================================================================= +const NCollection_List& TreeModel_ModelBase::GetPropertiesCreators() const +{ + return myPropertiesCreators; +} + +// ======================================================================= +// function : GetSelected +// purpose : +// ======================================================================= +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 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(); +} + +// ======================================================================= +// function : GetSelectedItems +// purpose : +// ======================================================================= +QList TreeModel_ModelBase::GetSelectedItems (const QModelIndexList& theIndices) +{ + QList anItems; + + for (QModelIndexList::const_iterator anIndicesIt = theIndices.begin(); anIndicesIt != theIndices.end(); anIndicesIt++) + { + TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex (*anIndicesIt); + if (!anItem || anItems.contains (anItem)) + continue; + anItems.append (anItem); } - return aFirstColumnSelectedIndices.size() == 1 ? aFirstColumnSelectedIndices.first() : QModelIndex(); + return anItems; } // ======================================================================= diff --git a/tools/TreeModel/TreeModel_ModelBase.hxx b/tools/TreeModel/TreeModel_ModelBase.hxx index d304c164e5..2b83a0cf2b 100644 --- a/tools/TreeModel/TreeModel_ModelBase.hxx +++ b/tools/TreeModel/TreeModel_ModelBase.hxx @@ -20,6 +20,8 @@ #include #include +#include + #include #include #include @@ -29,6 +31,7 @@ #include #include +class TreeModel_ItemPropertiesCreator; class TreeModel_VisibilityState; //! \class TreeModel_ModelBase @@ -84,6 +87,13 @@ public: //!< \return the checker interface TreeModel_VisibilityState* GetVisibilityState () const { return myVisibilityState; } + //! Returns true if the tree view model contains highlighted items. This highlight is set manually. + bool HasHighlighted() { return !myHighlightedIndices.isEmpty(); } + + //! Sets items of the indices highlighted in the model. + //! \param theIndices a list of tree model indices + void SetHighlighted (const QModelIndexList& theIndices = QModelIndexList()) { myHighlightedIndices = theIndices; } + //! Returns the index of the item in the model specified by the given row, column and parent index. //! Saves an internal pointer at the createIndex. This pointer is a shared pointer to the class, //! that realizes a base item interface. If the parent is invalid, a root item is used, otherwise a new item @@ -142,10 +152,24 @@ public: virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE { (void)theParent; return myHeaderValues.size(); } + //! Sets item table properties builder + Standard_EXPORT void AddPropertiesCreator (const Handle(TreeModel_ItemPropertiesCreator)& theCreator); + + //! Returns item table properties builder + Standard_EXPORT const NCollection_List& GetPropertiesCreators() const; + //! Returns default value of the visibility column //! \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 @@ -155,6 +179,12 @@ public: Standard_EXPORT static QModelIndex SingleSelected (const QModelIndexList& theIndices, const int theCellId, const Qt::Orientation theOrientation = Qt::Horizontal); + + //! Returns selected tree model items for indices. + //! \param theIndices a container of selected indices + //! \return model items from the list + Standard_EXPORT static QList GetSelectedItems (const QModelIndexList& theIndices); + protected: //! Creates root item //! \param theColumnId index of a column @@ -173,6 +203,12 @@ protected: bool m_pUseVisibilityColumn; //!< the state whether column=0 is reserved for Visibility state TreeModel_VisibilityState* myVisibilityState; //!< the interface of item visibility + QIcon myVisibleIcon; //!< icon of visible state + QIcon myInvisibleIcon; //!< icon of invisible state + + QModelIndexList myHighlightedIndices; //!< tree model indices that should be visualized as highlighted + + NCollection_List myPropertiesCreators; //!< property pane creators for items }; #endif diff --git a/tools/TreeModel/TreeModel_Tools.cxx b/tools/TreeModel/TreeModel_Tools.cxx index c1b217b529..7c89df6902 100644 --- a/tools/TreeModel/TreeModel_Tools.cxx +++ b/tools/TreeModel/TreeModel_Tools.cxx @@ -211,3 +211,53 @@ QString TreeModel_Tools::CutString (const QString& theText, const int theWidth, return aLength < theText.length() ? theText.mid (0, aLength) + theTail : theText; } + +// ======================================================================= +// function : LightHighlightColor +// purpose : +// ======================================================================= +QColor TreeModel_Tools::LightHighlightColor() +{ + QWidget aWidget; + QPalette aPalette = aWidget.palette(); + return aPalette.highlight().color().lighter(); +} + +// ======================================================================= +// function : SetExpandedTo +// purpose : +// ======================================================================= +void TreeModel_Tools::SetExpandedTo (QTreeView* theTreeView, const QModelIndex& theIndex) +{ + QAbstractItemModel* aModel = theTreeView->model(); + + QModelIndex aParent = aModel->parent (theIndex); + while (aParent.isValid()) + { + theTreeView->setExpanded (aParent, true); + aParent = aModel->parent (aParent); + } +} + +// ======================================================================= +// function : setExpanded +// purpose : +// ======================================================================= +void TreeModel_Tools::SetExpanded (QTreeView* theTreeView, const QModelIndex& theIndex, const bool isExpanded, + int& theLevels) +{ + bool isToExpand = theLevels == -1 || theLevels > 0; + if (!isToExpand) + return; + + theTreeView->setExpanded (theIndex, isExpanded); + if (theLevels != -1) + theLevels--; + + QAbstractItemModel* aModel = theTreeView->model(); + for (int aRowId = 0, aRows = aModel->rowCount (theIndex); aRowId < aRows; aRowId++) + { + int aLevels = theLevels; + SetExpanded (theTreeView, aModel->index (aRowId, 0, theIndex), isExpanded, aLevels); + } +} diff --git a/tools/TreeModel/TreeModel_Tools.hxx b/tools/TreeModel/TreeModel_Tools.hxx index 39047a2f03..1f24f94ec1 100644 --- a/tools/TreeModel/TreeModel_Tools.hxx +++ b/tools/TreeModel/TreeModel_Tools.hxx @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -90,6 +91,24 @@ public: //! \param theWidth width value, if -1, default value is used //! \param theTail symbols added to the end of the cut string Standard_EXPORT static QString CutString (const QString& theText, const int theWidth = -1, const QString& theTail = "..."); + + //! Returns light highlight color + //! \returns Qt color + Standard_EXPORT static QColor LightHighlightColor(); + + //! Makes the view expanded fron the root till the index + Standard_EXPORT static void SetExpandedTo (QTreeView* theTreeView, const QModelIndex& theIndex); + + //! Recursive items expanding in tree view staring from the index + //! \param theTreeView an OCAF tree view + //! \param theParentIndex an index which children should be expanded + //! \param isExpanded a boolean state if the item should be expanded or collapsed + //! \param theLevels a number of levels to be expanded, or -1 for all levels + Standard_EXPORT static void SetExpanded (QTreeView* theTreeView, + const QModelIndex& theIndex, + const bool isExpanded, + int& theLevels); + }; #endif diff --git a/tools/VInspector/FILES b/tools/VInspector/FILES index 68312f8eb1..8768383993 100644 --- a/tools/VInspector/FILES +++ b/tools/VInspector/FILES @@ -4,14 +4,34 @@ VInspector_CallBack.hxx VInspector_CallBackMode.hxx VInspector_Communicator.cxx VInspector_Communicator.hxx +VInspector_DisplayActionType.hxx +VInspector_ItemAspectWindow.cxx +VInspector_ItemAspectWindow.hxx VInspector_ItemBase.cxx VInspector_ItemBase.hxx +VInspector_ItemBVHTree.cxx +VInspector_ItemBVHTree.hxx +VInspector_ItemBVHTreeNode.cxx +VInspector_ItemBVHTreeNode.hxx +VInspector_ItemContainer.cxx +VInspector_ItemContainer.hxx +VInspector_ItemContainerAPI.hxx VInspector_ItemContext.cxx VInspector_ItemContext.hxx VInspector_ItemFolderObject.cxx VInspector_ItemFolderObject.hxx -VInspector_ItemEntityOwner.cxx -VInspector_ItemEntityOwner.hxx +VInspector_ItemGraphic3dCamera.cxx +VInspector_ItemGraphic3dCamera.hxx +VInspector_ItemGraphic3dClipPlane.cxx +VInspector_ItemGraphic3dClipPlane.hxx +VInspector_ItemGraphic3dCStructure.cxx +VInspector_ItemGraphic3dCStructure.hxx +VInspector_ItemGraphic3dCView.cxx +VInspector_ItemGraphic3dCView.hxx +VInspector_ItemGraphic3dGroup.cxx +VInspector_ItemGraphic3dGroup.hxx +VInspector_ItemGraphic3dTransformPers.cxx +VInspector_ItemGraphic3dTransformPers.hxx VInspector_ItemHistoryElement.cxx VInspector_ItemHistoryElement.hxx VInspector_ItemHistoryRoot.cxx @@ -19,15 +39,59 @@ VInspector_ItemHistoryRoot.hxx VInspector_ItemHistoryType.cxx VInspector_ItemHistoryType.hxx VInspector_ItemHistoryTypeInfo.hxx +VInspector_ItemOpenGlContext.cxx +VInspector_ItemOpenGlContext.hxx +VInspector_ItemOpenGlLayer.cxx +VInspector_ItemOpenGlLayer.hxx +VInspector_ItemOpenGlLayerList.cxx +VInspector_ItemOpenGlLayerList.hxx +VInspector_ItemOpenGlWindow.cxx +VInspector_ItemOpenGlWindow.hxx VInspector_ItemPresentableObject.cxx VInspector_ItemPresentableObject.hxx -VInspector_ItemSelection.cxx -VInspector_ItemSelection.hxx +VInspector_ItemPresentations.cxx +VInspector_ItemPresentations.hxx +VInspector_ItemPrs3dAspect.cxx +VInspector_ItemPrs3dAspect.hxx +VInspector_ItemPrs3dDrawer.cxx +VInspector_ItemPrs3dDrawer.hxx +VInspector_ItemPrs3dPresentation.cxx +VInspector_ItemPrs3dPresentation.hxx +VInspector_ItemSelect3DSensitiveSetItem.hxx +VInspector_ItemSelect3DSensitiveSetItem.cxx +VInspector_ItemSelectBasicsEntityOwner.cxx +VInspector_ItemSelectBasicsEntityOwner.hxx +VInspector_ItemSelectBasicsSensitiveEntity.cxx +VInspector_ItemSelectBasicsSensitiveEntity.hxx +VInspector_ItemSelectMgrViewerSelector.cxx +VInspector_ItemSelectMgrViewerSelector.hxx +VInspector_ItemSelectMgrViewerSelectorPicked.cxx +VInspector_ItemSelectMgrViewerSelectorPicked.hxx +VInspector_ItemSelectMgrBaseFrustum.cxx +VInspector_ItemSelectMgrBaseFrustum.hxx VInspector_ItemSelectMgrFilter.cxx VInspector_ItemSelectMgrFilter.hxx -VInspector_ItemSensitiveEntity.cxx -VInspector_ItemSensitiveEntity.hxx +VInspector_ItemSelectMgrSelectableObjectSet.cxx +VInspector_ItemSelectMgrSelectableObjectSet.hxx +VInspector_ItemSelectMgrSelectingVolumeManager.cxx +VInspector_ItemSelectMgrSelectingVolumeManager.hxx +VInspector_ItemSelectMgrSelection.cxx +VInspector_ItemSelectMgrSelection.hxx +VInspector_ItemSelectMgrSensitiveEntity.cxx +VInspector_ItemSelectMgrSensitiveEntity.hxx +VInspector_ItemSelectMgrSensitiveEntitySet.cxx +VInspector_ItemSelectMgrSensitiveEntitySet.hxx +VInspector_ItemV3dView.cxx +VInspector_ItemV3dView.hxx +VInspector_ItemV3dViewer.cxx +VInspector_ItemV3dViewer.hxx +VInspector_PreviewParameters.cxx +VInspector_PreviewParameters.hxx +VInspector_PropertiesCreator.cxx +VInspector_PropertiesCreator.hxx VInspector_SelectionType.hxx +VInspector_TableModelValues.cxx +VInspector_TableModelValues.hxx VInspector_ToolActionType.hxx VInspector_ToolBar.cxx VInspector_ToolBar.hxx diff --git a/tools/VInspector/VInspector_CallBack.cxx b/tools/VInspector/VInspector_CallBack.cxx index 481ec6f6b2..a42ff3b208 100644 --- a/tools/VInspector/VInspector_CallBack.cxx +++ b/tools/VInspector/VInspector_CallBack.cxx @@ -38,7 +38,18 @@ IMPLEMENT_STANDARD_RTTIEXT(VInspector_CallBack, VInspectorAPI_CallBack) // ======================================================================= void VInspector_CallBack::Activate (Handle(AIS_InteractiveObject) thePrs, const Standard_Integer theMode) { - QList anInfo = VInspector_Tools::GetInfo (thePrs); + if (!myHistoryModel) + return; + + QList anInfo; + if (!thePrs.IsNull()) + anInfo = VInspector_Tools::GetInfo (thePrs); + else + { + anInfo.append ("Activate"); + anInfo.append (""); + anInfo.append (""); + } anInfo[0] = QString ("%1: %2").arg (anInfo[0].toString()).arg (theMode); myHistoryModel->AddElement (VInspector_CallBackMode_Activate, anInfo); } @@ -49,6 +60,8 @@ void VInspector_CallBack::Activate (Handle(AIS_InteractiveObject) thePrs, const // ======================================================================= void VInspector_CallBack::AddOrRemoveSelected (const TopoDS_Shape& theShape) { + if (!myHistoryModel) + return; QList aValues; aValues.append (""); // Name aValues.append (""); // Pointer @@ -63,6 +76,8 @@ void VInspector_CallBack::AddOrRemoveSelected (const TopoDS_Shape& theShape) // ======================================================================= void VInspector_CallBack::AddOrRemoveSelected (Handle(AIS_InteractiveObject) thePrs) { + if (!myHistoryModel) + return; QList aValues = VInspector_Tools::GetInfo (thePrs); aValues.append (VInspector_Tools::GetSelectedInfoPointers (myContext)); // SelectionInfo myHistoryModel->AddElement (VInspector_CallBackMode_AddOrRemoveSelected, aValues); @@ -74,6 +89,8 @@ void VInspector_CallBack::AddOrRemoveSelected (Handle(AIS_InteractiveObject) the // ======================================================================= void VInspector_CallBack::AddOrRemoveSelected (Handle(SelectMgr_EntityOwner) theOwner) { + if (!myHistoryModel) + return; QList aValues; aValues.append (""); // Name aValues.append (VInspector_Tools::GetPointerInfo (theOwner, true).ToCString()); // Pointer @@ -89,6 +106,8 @@ void VInspector_CallBack::AddOrRemoveSelected (Handle(SelectMgr_EntityOwner) the // ======================================================================= void VInspector_CallBack::ClearSelected() { + if (!myHistoryModel) + return; QList aValues; myHistoryModel->AddElement (VInspector_CallBackMode_ClearSelected, aValues); } @@ -99,6 +118,8 @@ void VInspector_CallBack::ClearSelected() // ======================================================================= void VInspector_CallBack::MoveTo (const Standard_Integer/* theXPix*/, const Standard_Integer/* theYPix*/) { + if (!myHistoryModel) + return; QList aValues; aValues = VInspector_Tools::GetHighlightInfo (myContext); myHistoryModel->AddElement (VInspector_CallBackMode_MoveTo, aValues); @@ -110,6 +131,8 @@ void VInspector_CallBack::MoveTo (const Standard_Integer/* theXPix*/, const Stan // ======================================================================= void VInspector_CallBack::Select() { + if (!myHistoryModel) + return; QList aValues; aValues = VInspector_Tools::GetSelectedInfo (myContext); myHistoryModel->AddElement (VInspector_CallBackMode_Select, aValues); @@ -121,6 +144,8 @@ void VInspector_CallBack::Select() // ======================================================================= void VInspector_CallBack::ShiftSelect() { + if (!myHistoryModel) + return; QList aValues; aValues = VInspector_Tools::GetSelectedInfo (myContext); myHistoryModel->AddElement (VInspector_CallBackMode_ShiftSelect, aValues); diff --git a/tools/VInspector/VInspector_CallBack.hxx b/tools/VInspector/VInspector_CallBack.hxx index 57bdeae4ff..00290c73b5 100644 --- a/tools/VInspector/VInspector_CallBack.hxx +++ b/tools/VInspector/VInspector_CallBack.hxx @@ -43,22 +43,22 @@ public: //! Appends displayed presentation into history model //! \param thePrs the presentation virtual void Display (Handle(AIS_InteractiveObject) thePrs) Standard_OVERRIDE - { myHistoryModel->AddElement (VInspector_CallBackMode_Display, VInspector_Tools::GetInfo (thePrs)); } + { if (myHistoryModel != 0) myHistoryModel->AddElement (VInspector_CallBackMode_Display, VInspector_Tools::GetInfo (thePrs)); } //! Appends redisplayed presentation into history model //! \param thePrs the presentation virtual void Redisplay (Handle(AIS_InteractiveObject) thePrs) Standard_OVERRIDE - { myHistoryModel->AddElement (VInspector_CallBackMode_Redisplay, VInspector_Tools::GetInfo (thePrs)); } + { if (myHistoryModel != 0) myHistoryModel->AddElement (VInspector_CallBackMode_Redisplay, VInspector_Tools::GetInfo (thePrs)); } //! Appends removed presentation into history model //! \param thePrs the presentation virtual void Remove (Handle(AIS_InteractiveObject) thePrs) Standard_OVERRIDE - { myHistoryModel->AddElement (VInspector_CallBackMode_Remove, VInspector_Tools::GetInfo (thePrs)); } + { if (myHistoryModel != 0) myHistoryModel->AddElement (VInspector_CallBackMode_Remove, VInspector_Tools::GetInfo (thePrs)); } //! Appends loaded presentation into history model //! \param thePrs the presentation virtual void Load (Handle(AIS_InteractiveObject) thePrs) Standard_OVERRIDE - { myHistoryModel->AddElement (VInspector_CallBackMode_Load, VInspector_Tools::GetInfo (thePrs)); } + { if (myHistoryModel != 0) myHistoryModel->AddElement (VInspector_CallBackMode_Load, VInspector_Tools::GetInfo (thePrs)); } //! Appends information about modes activation //! \param thePrs the presentation @@ -75,13 +75,14 @@ public: //! Appends information about modes deactivation //! \param thePrs the presentation virtual void Deactivate (Handle(AIS_InteractiveObject) thePrs) Standard_OVERRIDE - { myHistoryModel->AddElement (VInspector_CallBackMode_Deactivate, VInspector_Tools::GetInfo (thePrs)); } + { if (myHistoryModel != 0) myHistoryModel->AddElement (VInspector_CallBackMode_Deactivate, VInspector_Tools::GetInfo (thePrs)); } //! Appends information about modes deactivation //! \param thePrs the presentation //! \param theMode the selection mode virtual void Deactivate (Handle(AIS_InteractiveObject) thePrs, const Standard_Integer theMode) Standard_OVERRIDE - { (void)theMode; myHistoryModel->AddElement (VInspector_CallBackMode_Deactivate, VInspector_Tools::GetInfo (thePrs)); } + { (void)theMode; + if (myHistoryModel != 0) myHistoryModel->AddElement (VInspector_CallBackMode_Deactivate, VInspector_Tools::GetInfo (thePrs)); } //! Appends information about selection change //! \param theShape the selected shape @@ -101,7 +102,7 @@ public: //! Appends information about selection clear //! \param thePrs the selected presentation virtual void ClearSelected (Handle(AIS_InteractiveObject) thePrs) Standard_OVERRIDE - { myHistoryModel->AddElement (VInspector_CallBackMode_ClearSelected, VInspector_Tools::GetInfo (thePrs)); } + { if (myHistoryModel != 0) myHistoryModel->AddElement (VInspector_CallBackMode_ClearSelected, VInspector_Tools::GetInfo (thePrs)); } //! Appends information about moving to point //! \param theXPix a pixels on horizontal @@ -111,7 +112,7 @@ public: //! Appends information about setting selection //! \param thePrs the selected presentation virtual void SetSelected (Handle(AIS_InteractiveObject) thePrs) Standard_OVERRIDE - { myHistoryModel->AddElement (VInspector_CallBackMode_SetSelected, VInspector_Tools::GetInfo (thePrs)); } + { if (myHistoryModel != 0) myHistoryModel->AddElement (VInspector_CallBackMode_SetSelected, VInspector_Tools::GetInfo (thePrs)); } //! Appends information about select Standard_EXPORT virtual void Select() Standard_OVERRIDE; diff --git a/tools/VInspector/VInspector_DisplayActionType.hxx b/tools/VInspector/VInspector_DisplayActionType.hxx new file mode 100644 index 0000000000..0e39185812 --- /dev/null +++ b/tools/VInspector/VInspector_DisplayActionType.hxx @@ -0,0 +1,29 @@ +// Created on: 2018-08-19 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_DisplayActionType_H +#define VInspector_DisplayActionType_H + +//! \enum VInspector_DisplayActionType +enum VInspector_DisplayActionType +{ + VInspector_DisplayActionType_NoneId, //!< No action activated + VInspector_DisplayActionType_DisplayId, //!< Display action + VInspector_DisplayActionType_RedisplayId, //!< Redisplay action + VInspector_DisplayActionType_EraseId, //!< Erase action + VInspector_DisplayActionType_RemoveId //!< Remove action +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemAspectWindow.cxx b/tools/VInspector/VInspector_ItemAspectWindow.cxx new file mode 100644 index 0000000000..9a8a41a4de --- /dev/null +++ b/tools/VInspector/VInspector_ItemAspectWindow.cxx @@ -0,0 +1,154 @@ +// Created on: 2018-12-14 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemAspectWindow::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(Aspect_Window) aWindow = GetAspectWindow(); + if (aWindow.IsNull()) + return Column() == 0 ? "Empty Aspect_Window" : ""; + + switch (Column()) + { + case 0: return theItemRole == Qt::DisplayRole ? aWindow->DynamicType()->Name() + : STANDARD_TYPE (Aspect_Window)->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemAspectWindow::Init() +{ + VInspector_ItemV3dViewPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + myWindow = aParentItem->GetView()->Window(); + + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemAspectWindow::Reset() +{ + myWindow = NULL; + // an empty method to don't clear the main label, otherwise the model will be empty + TreeModel_ItemBase::Reset(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemAspectWindow::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemAspectWindow::GetTableRowCount() const +{ + return 30; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemAspectWindow::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + Handle(Aspect_Window) aWindow = GetAspectWindow(); + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("Background") : QVariant (); + case 1: return isFirstColumn ? QVariant ("BackgroundFillMethod") : QVariant (); + case 2: return isFirstColumn ? QVariant ("GradientBackground") : QVariant (); + case 3: return isFirstColumn ? QVariant ("IsMapped") : QVariant (aWindow->IsMapped()); + case 4: return isFirstColumn ? QVariant ("IsVirtual") : QVariant (aWindow->IsVirtual()); + case 5: return isFirstColumn ? QVariant ("Ratio") : QVariant (aWindow->Ratio()); + case 6: + { + if (isFirstColumn) + return QVariant ("Position"); + Standard_Integer aX1, aY1, aX2, aY2; + aWindow->Position (aX1, aY1, aX2, aY2); + return QString ("X1 = %1, Y1 = %2, X2 = %3, Y2 = %4").arg (aX1).arg (aY1).arg (aX2).arg (aY2); + } + case 7: + { + if (isFirstColumn) + return QVariant ("Size"); + Standard_Integer aWidth, aHeight; + aWindow->Size (aWidth, aHeight); + return QString ("width = %1, height = %2").arg (aWidth).arg (aHeight); + } + case 8: return isFirstColumn ? QVariant ("NativeHandle") : QVariant (); + case 9: return isFirstColumn ? QVariant ("NativeParentHandle") : QVariant (); + case 10: return isFirstColumn ? QVariant ("NativeFBConfig") : QVariant (); + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemAspectWindow::buildPresentationShape() +{ + return TopoDS_Shape(); +} diff --git a/tools/VInspector/VInspector_ItemAspectWindow.hxx b/tools/VInspector/VInspector_ItemAspectWindow.hxx new file mode 100644 index 0000000000..a26ca43296 --- /dev/null +++ b/tools/VInspector/VInspector_ItemAspectWindow.hxx @@ -0,0 +1,112 @@ +// Created on: 2018-12-14 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemAspectWindow_H +#define VInspector_ItemAspectWindow_H + +#include +#include +#include +#include + +class QItemSelectionModel; +class VInspector_ItemAspectWindow; + +typedef QExplicitlySharedDataPointer VInspector_ItemAspectWindowPtr; + +//! \class VInspector_ItemAspectWindow +//! The item shows information about SelectBasics_EntityOwner. +//! The parent is item selection, children are item entity owners +class VInspector_ItemAspectWindow : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemAspectWindowPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemAspectWindowPtr (new VInspector_ItemAspectWindow (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemAspectWindow() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myWindow; } + + //! \return the current sensitive entity + Standard_EXPORT Handle(Aspect_Window) GetAspectWindow() const + { return Handle(Aspect_Window)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! \return number of children. + virtual int initRowCount() const Standard_OVERRIDE { return 0; } + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + { (void)theRow; (void)theColumn; return TreeModel_ItemBasePtr(); } + + //! Returns table value for the row in form: depending on the aspect kind + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theEntityKind kind or kind of entity + QVariant getTableData (const int theRow, + const int theColumn, + const int theRole, + const TCollection_AsciiString& theEntityKind) const; + +protected: + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; + + //! Constructor + //! param theParent a parent item + VInspector_ItemAspectWindow(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +protected: + Handle(Aspect_Window) myWindow; //!< aspect window +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemBVHTree.cxx b/tools/VInspector/VInspector_ItemBVHTree.cxx new file mode 100644 index 0000000000..8bcd7e328e --- /dev/null +++ b/tools/VInspector/VInspector_ItemBVHTree.cxx @@ -0,0 +1,196 @@ +// Created on: 2019-04-29 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +VInspector_ItemBVHTree::VInspector_ItemBVHTree (TreeModel_ItemBasePtr theParent, + const int theRow, const int theColumn) +: VInspector_ItemBase(theParent, theRow, theColumn) +{ +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemBVHTree::initRowCount() const +{ + if (Column() != 0) + return 0; + + opencascade::handle > aTree = GetTree(); + if (aTree.IsNull()) + return 0; + + return aTree->Length(); +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemBVHTree::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + if (GetTree().IsNull()) + return Column() == 0 ? "Empty BVH tree" : ""; + + switch (Column()) + { + case 0: + { + TCollection_AsciiString aName = TCollection_AsciiString (GetTree()->DynamicType()->Name()) + + TCollection_AsciiString (" (") + myName.ToCString() + ")"; + return aName.ToCString(); + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemBVHTree::Init() +{ + VInspector_ItemSelectMgrSelectableObjectSetPtr anObjectParent = itemDynamicCast(Parent()); + opencascade::handle > aBVHTree; + if (anObjectParent) + { + aBVHTree = anObjectParent->GetBVHTree (Row(), myName); + } + else + { + VInspector_ItemSelectMgrSensitiveEntitySetPtr anEntityParent = itemDynamicCast(Parent()); + if (anEntityParent) + aBVHTree = anEntityParent->GetBVHTree (Row(), myName); + } + + setTree (aBVHTree); + + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemBVHTree::Reset() +{ + VInspector_ItemBase::Reset(); + + setTree (NULL); + myName = TCollection_AsciiString(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemBVHTree::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : Dump +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemBVHTree::Dump (Standard_OStream& OS) const +{ + opencascade::handle > aBVHTree = GetTree(); + if (aBVHTree.IsNull()) + return Standard_False; + + aBVHTree->Dump (OS); + return Standard_True; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemBVHTree::createChild (int theRow, int theColumn) +{ + return VInspector_ItemBVHTreeNode::CreateItem (currentItem(), theRow, theColumn); +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemBVHTree::buildPresentationShape() +{ + opencascade::handle > aBVHTree = myTree; + if (aBVHTree.IsNull()) + return TopoDS_Shape(); + + Standard_SStream OS; + //aBVHTree->DumpNode (Row(), OS); + aBVHTree->Dump (OS); + + Standard_Integer aColumnCount; + NCollection_Vector aValues; + Message::ConvertStream (OS, aColumnCount, aValues); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + for (int aValueId = 0; aValueId < aValues.Size(); ) + { + for (int aColumnId = 0; aColumnId < aColumnCount; aColumnId++, aValueId++) + { + if (aColumnId != 1) + continue; + + TCollection_AsciiString aValue = aValues.Value (aValueId); + Bnd_Box aBox; + if (!aBox.FromString (aValue)) + continue; + + TopoDS_Shape aShape = VInspector_Tools::CreateShape (aBox); + aBuilder.Add (aCompound, aShape); + } + } + return aCompound; +} diff --git a/tools/VInspector/VInspector_ItemBVHTree.hxx b/tools/VInspector/VInspector_ItemBVHTree.hxx new file mode 100644 index 0000000000..a72ca7e2e7 --- /dev/null +++ b/tools/VInspector/VInspector_ItemBVHTree.hxx @@ -0,0 +1,105 @@ +// Created on: 2019-04-29 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemBVHTree_H +#define VInspector_ItemBVHTree_H + +#include +#include + +#include +#include +#include + +class VInspector_ItemBVHTree; +typedef QExplicitlySharedDataPointer VInspector_ItemBVHTreePtr; + +//! \class VInspector_ItemBVHTree +//! Parent item, that corresponds Folder under the AIS_InteractiveContext +//! Children of the item are: none +class VInspector_ItemBVHTree : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemBVHTreePtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemBVHTreePtr (new VInspector_ItemBVHTree (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemBVHTree() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myTree; } + + //! Returns current drawer, initialize the drawer if it was not initialized yet + opencascade::handle > GetTree() const + { return opencascade::handle >::DownCast (GetObject()); } + + //! Dumps the content of me on the stream . + virtual Standard_Boolean Dump (Standard_OStream& OS) const; + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; + +protected: + + //! 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: + + //! Set V3d viewer selector into the current field + //! \param theTree a viewer selector + void setTree (const opencascade::handle >& theTree) { myTree = theTree; } + +private: + + //! 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 + VInspector_ItemBVHTree(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn); + +private: + + opencascade::handle > myTree; //!< the current tree + TCollection_AsciiString myName; //!< the name +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemBVHTreeNode.cxx b/tools/VInspector/VInspector_ItemBVHTreeNode.cxx new file mode 100644 index 0000000000..061539e303 --- /dev/null +++ b/tools/VInspector/VInspector_ItemBVHTreeNode.cxx @@ -0,0 +1,162 @@ +// Created on: 2019-04-29 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +//#include +// +#include + +#include +#include + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemBVHTreeNode::initRowCount() const +{ + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemBVHTreeNode::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + switch (Column()) + { + case 0: return QString ("TreeNode_%1").arg (Row()); break; + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemBVHTreeNode::Init() +{ + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemBVHTreeNode::Reset() +{ + VInspector_ItemBase::Reset(); +} + +// ======================================================================= +// function : GetTree +// purpose : +// ======================================================================= + +opencascade::handle > VInspector_ItemBVHTreeNode::GetTree() const +{ + VInspector_ItemBVHTreePtr anObjectParent = itemDynamicCast(Parent()); + + return anObjectParent->GetTree(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemBVHTreeNode::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemBVHTreeNode::createChild (int, int) +{ + return TreeModel_ItemBasePtr(); +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemBVHTreeNode::buildPresentationShape() +{ + opencascade::handle > aBVHTree = GetTree(); + if (aBVHTree.IsNull()) + return TopoDS_Shape(); + + Standard_SStream OS; + aBVHTree->DumpNode (Row(), OS); + + Standard_Integer aColumnCount; + NCollection_Vector aValues; + Message::ConvertStream (OS, aColumnCount, aValues); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + for (int aValueId = 0; aValueId < aValues.Size(); ) + { + for (int aColumnId = 0; aColumnId < aColumnCount; aColumnId++, aValueId++) + { + if (aColumnId != 1) + continue; + + TCollection_AsciiString aValue = aValues.Value (aValueId); + Bnd_Box aBox; + if (!aBox.FromString (aValue)) + continue; + + TopoDS_Shape aShape = VInspector_Tools::CreateShape (aBox); + aBuilder.Add (aCompound, aShape); + } + } + return aCompound; +} + +// ======================================================================= +// function : Dump +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemBVHTreeNode::Dump (Standard_OStream& OS) const +{ + opencascade::handle > aBVHTree = GetTree(); + if (aBVHTree.IsNull()) + return Standard_False; + + aBVHTree->DumpNode (Row(), OS); + return Standard_True; +} diff --git a/tools/VInspector/VInspector_ItemBVHTreeNode.hxx b/tools/VInspector/VInspector_ItemBVHTreeNode.hxx new file mode 100644 index 0000000000..d5aef7b4b9 --- /dev/null +++ b/tools/VInspector/VInspector_ItemBVHTreeNode.hxx @@ -0,0 +1,96 @@ +// Created on: 2019-04-29 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemBVHTreeNode_H +#define VInspector_ItemBVHTreeNode_H + +#include +#include + +//#include +//#include + +class SelectMgr_BaseFrustum; + +class VInspector_ItemBVHTreeNode; +typedef QExplicitlySharedDataPointer VInspector_ItemBVHTreeNodePtr; + +//! \class VInspector_ItemBVHTreeNode +//! Parent item, that corresponds Folder under the AIS_InteractiveContext +//! Children of the item are: none +class VInspector_ItemBVHTreeNode : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemBVHTreeNodePtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemBVHTreeNodePtr (new VInspector_ItemBVHTreeNode (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemBVHTreeNode() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return NULL; } + + //! Returns parent tree, the node information is obtained from the tree by the given index + Standard_EXPORT opencascade::handle > GetTree() const; + + //! Dumps the content of me on the stream . + virtual Standard_Boolean Dump (Standard_OStream& OS) const; + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemBVHTreeNode(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemBase.cxx b/tools/VInspector/VInspector_ItemBase.cxx index 8f1cee216e..56158a4018 100644 --- a/tools/VInspector/VInspector_ItemBase.cxx +++ b/tools/VInspector/VInspector_ItemBase.cxx @@ -17,6 +17,37 @@ #include #include +#include + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemBase::Reset() +{ + myPresentationShape = TopoDS_Shape(); + TreeModel_ItemBase::Reset(); +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemBase::initValue (const int theItemRole) const +{ + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + switch (Column()) + { + case 1: { return rowCount(); } + case 2: return ViewControl_Tools::GetPointerInfo (GetObject(), true).ToCString(); + case 3: { return Row(); } + } + + return QVariant(); +} + // ======================================================================= // function : GetContext // purpose : @@ -49,3 +80,16 @@ Handle(AIS_InteractiveContext) VInspector_ItemBase::GetContext() const return myContext; } + +// ======================================================================= +// function : GetContext +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemBase::GetPresentationShape() const +{ + if (Column() != TreeModel_ColumnType_Name) + return TopoDS_Shape(); + + initItem(); + return myPresentationShape; +} diff --git a/tools/VInspector/VInspector_ItemBase.hxx b/tools/VInspector/VInspector_ItemBase.hxx index c0c268d395..674ea6418d 100644 --- a/tools/VInspector/VInspector_ItemBase.hxx +++ b/tools/VInspector/VInspector_ItemBase.hxx @@ -18,7 +18,13 @@ #include #include +#include + +#include #include +#include + +class Graphic3d_TransformPers; class VInspector_ItemBase; typedef QExplicitlySharedDataPointer VInspector_ItemBasePtr; @@ -29,7 +35,7 @@ class VInspector_ItemBase : public TreeModel_ItemBase { public: //! Resets cached values - virtual void Reset() Standard_OVERRIDE { TreeModel_ItemBase::Reset(); } + virtual void Reset() Standard_OVERRIDE; //! Sets the context //! \param theLabel an object where the child items structure is found @@ -43,10 +49,63 @@ public: //! \return a context Standard_EXPORT Handle(AIS_InteractiveContext) GetContext() const; + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns presentation of the attribute to be visualized in the view + //! \thePresentations [out] container of presentation handles to be visualized + virtual void GetPresentations (NCollection_List& thePresentations) + { (void)thePresentations; } + + //! Returns transform persistent of the item or NULL + Handle(Graphic3d_TransformPers) TransformPersistence() const { return myTransformPersistence; } + + //! Returns shape of the item parameters + //! \return generated shape of the item parameters + Standard_EXPORT virtual TopoDS_Shape GetPresentationShape() const; + + //! Rebuild presentation shape if the item use it + //! \return generated shape of the item parameters + void UpdatePresentationShape() { myPresentationShape = buildPresentationShape(); } + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const { return 0; } + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const + { (void)theRow; (void)theColumn; return ViewControl_EditType_None; } + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const + { (void)theRow; (void)theColumn; return QList(); } + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const + { (void)theRow; (void)theColumn; (void)theRole; return QVariant(); } + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) + { (void)theRow; (void)theColumn; (void)theValue; return false; } + protected: - //! Initialize the current item. It creates a backup of the specific item information - virtual void initItem() const {} + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() { return TopoDS_Shape(); } protected: @@ -60,6 +119,8 @@ protected: protected: Handle(AIS_InteractiveContext) myContext; //!< the current context + TopoDS_Shape myPresentationShape; //!< item presentation shape + Handle(Graphic3d_TransformPers) myTransformPersistence; //!< item cached persistent }; #endif \ No newline at end of file diff --git a/tools/VInspector/VInspector_ItemContainer.cxx b/tools/VInspector/VInspector_ItemContainer.cxx new file mode 100644 index 0000000000..a72c4741c6 --- /dev/null +++ b/tools/VInspector/VInspector_ItemContainer.cxx @@ -0,0 +1,96 @@ +// 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 + +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemContainer::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (Column() != 0 || (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole)) + return QVariant(); + + VInspector_ItemContainerAPI* aContainerItem = dynamic_cast(Parent().data()); + + if (!aContainerItem) + return "Empty item container"; + + return aContainerItem->GetContainerValue (Row(), theItemRole); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemContainer::initRowCount() const +{ + VInspector_ItemContainerAPI* aContainerItem = dynamic_cast(Parent().data()); + + if (!aContainerItem) + return 0; + + return aContainerItem->GetContainerRowCount (Row()); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemContainer::createChild (int theRow, int theColumn) +{ + VInspector_ItemContainerAPI* aContainerItem = dynamic_cast(Parent().data()); + + if (!aContainerItem) + return TreeModel_ItemBasePtr(); + + return aContainerItem->CreateContainerChild (currentItem(), Row(), theRow, theColumn); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemContainer::Init() +{ + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemContainer::Reset() +{ + VInspector_ItemBase::Reset(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemContainer::initItem() const +{ + if (IsInitialized()) + return; + const_cast (this)->Init(); +} diff --git a/tools/VInspector/VInspector_ItemContainer.hxx b/tools/VInspector/VInspector_ItemContainer.hxx new file mode 100644 index 0000000000..f71949bc0c --- /dev/null +++ b/tools/VInspector/VInspector_ItemContainer.hxx @@ -0,0 +1,87 @@ +// 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 VInspector_ItemContainer_H +#define VInspector_ItemContainer_H + +#include +#include + +#include +#include +#include + +class Prs3d_Drawer; + +class QItemSelectionModel; + +class VInspector_ItemContainer; +typedef QExplicitlySharedDataPointer VInspector_ItemContainerPtr; + +//! \class VInspector_ItemContainer +//! Item presents additional level of information in the tree model. +//! Parent is item context, children are either folder item or Selection filter item. +class VInspector_ItemContainer : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemContainerPtr CreateItem (TreeModel_ItemBasePtr theParent, + const int theRow, const int theColumn) + { return VInspector_ItemContainerPtr (new VInspector_ItemContainer (theParent, theRow, theColumn)); } + //! Destructor + virtual ~VInspector_ItemContainer() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { return NULL; } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of item selected + //! \return rows count + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) 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; + +private: + + //! Constructor + //! param theParent a parent item + VInspector_ItemContainer (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase (theParent, theRow, theColumn) {} + +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemContainerAPI.hxx b/tools/VInspector/VInspector_ItemContainerAPI.hxx new file mode 100644 index 0000000000..c986433e2b --- /dev/null +++ b/tools/VInspector/VInspector_ItemContainerAPI.hxx @@ -0,0 +1,50 @@ +// 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 VInspector_ItemContainerAPI_H +#define VInspector_ItemContainerAPI_H + +#include +#include + +//! \class VInspector_ItemContainerAPI +class VInspector_ItemContainerAPI +{ + +public: + //! Constructor + VInspector_ItemContainerAPI () {} + + //! Destructor + virtual ~VInspector_ItemContainerAPI() {}; + + //! Returns number of item selected + //! \return rows count + virtual int GetContainerRowCount (const int theContainerRow) const = 0; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant GetContainerValue (const int theContainerRow, const int theItemRole) const = 0; + + //! 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 CreateContainerChild (const TreeModel_ItemBasePtr& theParent, const int theContainerRow, int theRow, int theColumn) = 0; + +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemContext.cxx b/tools/VInspector/VInspector_ItemContext.cxx index 51770e4f0a..bb6dfbe9db 100644 --- a/tools/VInspector/VInspector_ItemContext.cxx +++ b/tools/VInspector/VInspector_ItemContext.cxx @@ -15,7 +15,9 @@ #include +#include #include +#include #include #include #include @@ -52,13 +54,14 @@ int VInspector_ItemContext::initRowCount() const #ifdef DEBUG_FREE_OWNERS int aRows = 0; // only local context is processed: TODO for global context - NCollection_List anActiveOwners; + NCollection_List anActiveOwners; aContext->MainSelector()->ActiveOwners(anActiveOwners); Handle(SelectMgr_EntityOwner) anOwner; - for (NCollection_List::Iterator anOwnersIt(anActiveOwners); anOwnersIt.More(); anOwnersIt.Next()) + for (NCollection_List::Iterator anOwnersIt(anActiveOwners); + anOwnersIt.More(); anOwnersIt.Next()) { - anOwner = anOwnersIt.Value(); + anOwner = Handle(SelectMgr_EntityOwner)::DownCast(anOwnersIt.Value()); if (anOwner.IsNull()) continue; Handle(AIS_InteractiveObject) anAISObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); @@ -66,12 +69,12 @@ int VInspector_ItemContext::initRowCount() const aRows++; } // owners in Global Context - NCollection_List anActiveOwners; + NCollection_List anActiveOwners; aContext->MainSelector()->ActiveOwners(anActiveOwners); if (aRows > 0) aNbPresentations += aRows; - NCollection_List anEmptySelectableOwners; - NCollection_List anOwners = + NCollection_List anEmptySelectableOwners; + NCollection_List anOwners = VInspector_Tools::ActiveOwners (aContext, anEmptySelectableOwners); if (anEmptySelectableOwners.Size() > 0) aNbPresentations += 1; @@ -85,6 +88,10 @@ int VInspector_ItemContext::initRowCount() const // ======================================================================= QVariant VInspector_ItemContext::initValue (const int theItemRole) const { + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) return QVariant(); @@ -94,7 +101,6 @@ QVariant VInspector_ItemContext::initValue (const int theItemRole) const switch (Column()) { case 0: return GetContext()->DynamicType()->Name(); - case 1: return rowCount(); case 4: { Handle(AIS_InteractiveObject) anEmptyIO; @@ -108,6 +114,115 @@ QVariant VInspector_ItemContext::initValue (const int theItemRole) const return QVariant(); } +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemContext::GetTableRowCount() const +{ + return 11; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemContext::GetTableEditType (const int theRow, const int) const +{ + switch (theRow) + { + case 0: return ViewControl_EditType_Spin; + case 1: return ViewControl_EditType_Combo; + case 2: return ViewControl_EditType_Bool; + case 3: return ViewControl_EditType_Bool; + case 4: return ViewControl_EditType_Bool; + default: return ViewControl_EditType_None; + } +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemContext::GetTableEnumValues (const int theRow, const int) const +{ + QList aValues; + switch (theRow) + { + case 1: + { + for (int i = 0; i <= SelectMgr_PickingStrategy_OnlyTopmost; i++) + aValues.append (SelectMgr::PickingStrategyToString ((SelectMgr_PickingStrategy)i)); + } + break; + default: break; + } + + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemContext::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("PixelTolerance") : QVariant (myContext->PixelTolerance()); + case 1: return isFirstColumn ? QVariant ("PickingStrategy") : QVariant (SelectMgr::PickingStrategyToString (myContext->PickingStrategy())); + case 2: return isFirstColumn ? QVariant ("AutomaticHilight") : QVariant (myContext->AutomaticHilight()); + case 3: return isFirstColumn ? QVariant ("ToHilightSelected") : QVariant (myContext->ToHilightSelected()); + case 4: return isFirstColumn ? QVariant ("AutoActivateSelection") : QVariant (myContext->GetAutoActivateSelection()); + case 5: + case 6: + case 7: + { + AIS_DisplayStatus aDisplayStatus = (AIS_DisplayStatus)(theRow - 5); + if (isFirstColumn) + return QString ("ObjectsByDisplayStatus: %1").arg (AIS::DisplayStatusToString (aDisplayStatus)); + AIS_ListOfInteractive anObjects; + myContext->ObjectsByDisplayStatus(aDisplayStatus, anObjects); + return QVariant (anObjects.Extent()); + } + break; + case 8: return isFirstColumn ? QVariant ("DetectedOwner") : QVariant (VInspector_Tools::GetPointerInfo (myContext->DetectedOwner()).ToCString()); + case 9: + { + if (isFirstColumn) + return QVariant ("DetectedOwners"); + int aNbOfDetected = 0; + for (myContext->InitDetected(); myContext->MoreDetected(); myContext->NextDetected()) + aNbOfDetected++; + return aNbOfDetected; + } + case 10: return isFirstColumn ? QVariant ("NbSelected") : QVariant (myContext->NbSelected()); + default: return QVariant(); + } +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemContext::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + switch (theRow) + { + case 0: myContext->SetPixelTolerance (theValue.toInt()); break; + case 1: myContext->SetPickingStrategy (SelectMgr::PickingStrategyFromString (theValue.toString().toStdString().c_str())); break; + case 2: myContext->SetAutomaticHilight (theValue.toBool()); break; + case 3: myContext->SetToHilightSelected (theValue.toBool()); break; + case 4: myContext->SetAutoActivateSelection (theValue.toBool()); break; + default: return false; + } + return true; +} + // ======================================================================= // function : createChild // purpose : diff --git a/tools/VInspector/VInspector_ItemContext.hxx b/tools/VInspector/VInspector_ItemContext.hxx index 166b8a6519..6f49758a01 100644 --- a/tools/VInspector/VInspector_ItemContext.hxx +++ b/tools/VInspector/VInspector_ItemContext.hxx @@ -38,6 +38,10 @@ public: //! Destructor virtual ~VInspector_ItemContext() Standard_OVERRIDE {}; + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myContext; } + //! Returns number of displayed presentations //! \return rows count Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; @@ -47,6 +51,33 @@ public: //! \return the value Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + protected: //! Initialize the current item. It creates a backup of the specific item information diff --git a/tools/VInspector/VInspector_ItemEntityOwner.cxx b/tools/VInspector/VInspector_ItemEntityOwner.cxx deleted file mode 100644 index 309bb45d3a..0000000000 --- a/tools/VInspector/VInspector_ItemEntityOwner.cxx +++ /dev/null @@ -1,186 +0,0 @@ -// 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 -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemEntityOwner::initValue(int theItemRole) const -{ - switch (theItemRole) - { - case Qt::DisplayRole: - case Qt::EditRole: - case Qt::ToolTipRole: - { - Handle(SelectMgr_EntityOwner) anOwner = getEntityOwner(); - if (anOwner.IsNull()) - return QVariant(); - - switch (Column()) - { - case 0: return anOwner->DynamicType()->Name(); - case 2: return VInspector_Tools::GetPointerInfo (anOwner, true).ToCString(); - case 3: - { - Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner); - if (BROwnr.IsNull()) - return QVariant(); - - const TopoDS_Shape& aShape = BROwnr->Shape(); - if (aShape.IsNull()) - return QVariant(); - - return VInspector_Tools::GetShapeTypeInfo (aShape.ShapeType()).ToCString(); - } - case 17: - case 18: - case 19: - { - Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner); - if (BROwnr.IsNull()) - return QVariant(); - - const TopoDS_Shape& aShape = BROwnr->Shape(); - if (aShape.IsNull()) - return QVariant(); - - return Column() == 17 ? VInspector_Tools::GetPointerInfo (aShape.TShape(), true).ToCString() - : Column() == 18 ? VInspector_Tools::OrientationToName (aShape.Orientation()).ToCString() - : /*19*/ VInspector_Tools::LocationToName (aShape.Location()).ToCString(); - } - default: break; - } - break; - } - case Qt::BackgroundRole: - case Qt::ForegroundRole: - { - if (Column() == 2) - { - Handle(AIS_InteractiveContext) aContext = GetContext(); - if (!aContext.IsNull()) - { - if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner())) - return (theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white); - } - } - VInspector_ItemSensitiveEntityPtr aParentItem = itemDynamicCast(Parent()); - if (aParentItem) - return aParentItem->data(QModelIndex(), theItemRole); - break; - } - } - return QVariant(); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void VInspector_ItemEntityOwner::Init() -{ - Handle(SelectMgr_EntityOwner) anOwner; - - VInspector_ItemSensitiveEntityPtr aParentItem = itemDynamicCast(Parent()); - if (aParentItem) - { - Handle(SelectMgr_SensitiveEntity) anEntity = aParentItem->GetSensitiveEntity(); - anOwner = anEntity->BaseSensitive()->OwnerId(); - } - else - { - VInspector_ItemPresentableObjectPtr aPOItem = itemDynamicCast(Parent()); - if (aPOItem) - { - Handle(AIS_InteractiveObject) anIO = aPOItem->GetInteractiveObject(); - - int aRowId = Row(); - int aCurrentIndex = 0; -#if OCC_VERSION_HEX < 0x070201 - for (anIO->Init(); anIO->More() && anOwner.IsNull(); anIO->Next()) - { - const Handle(SelectMgr_Selection)& aSelection = anIO->CurrentSelection(); - for (aSelection->Init(); aSelection->More() && anOwner.IsNull(); aSelection->Next()) - { - Handle(SelectMgr_SensitiveEntity) anEntity = aSelection->Sensitive(); -#else - for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anIO->Selections()); aSelIter.More() && anOwner.IsNull(); aSelIter.Next()) - { - const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value(); - for (NCollection_Vector::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More() && anOwner.IsNull(); aSelEntIter.Next()) - { - Handle(SelectMgr_SensitiveEntity) anEntity = aSelEntIter.Value(); -#endif - const Handle(Select3D_SensitiveEntity)& aBase = anEntity->BaseSensitive(); - if (!aBase.IsNull()) - { - if (aRowId == aCurrentIndex) - anOwner = aBase->OwnerId(); - aCurrentIndex++; - } - } - } - } - } - myOwner = anOwner; - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemEntityOwner::Reset() -{ - VInspector_ItemBase::Reset(); - SetContext (NULL); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemEntityOwner::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : getEntityOwner -// purpose : -// ======================================================================= -Handle(SelectMgr_EntityOwner) VInspector_ItemEntityOwner::getEntityOwner() const -{ - initItem(); - return myOwner; -} diff --git a/tools/VInspector/VInspector_ItemEntityOwner.hxx b/tools/VInspector/VInspector_ItemEntityOwner.hxx deleted file mode 100644 index f00adc2ee3..0000000000 --- a/tools/VInspector/VInspector_ItemEntityOwner.hxx +++ /dev/null @@ -1,89 +0,0 @@ -// 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 VInspector_ItemEntityOwner_H -#define VInspector_ItemEntityOwner_H - -#include -#include -#include - -class QItemSelectionModel; - -class VInspector_ItemEntityOwner; -typedef QExplicitlySharedDataPointer VInspector_ItemEntityOwnerPtr; - -//! \class VInspector_ItemPresentableObject -//! Item for selection entity owner. The parent is sensitive entity item, there are no children -class VInspector_ItemEntityOwner : public VInspector_ItemBase -{ - -public: - - //! Creates an item wrapped by a shared pointer - static VInspector_ItemEntityOwnerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - { return VInspector_ItemEntityOwnerPtr (new VInspector_ItemEntityOwner (theParent, theRow, theColumn)); } - - //! Destructor - virtual ~VInspector_ItemEntityOwner() Standard_OVERRIDE {}; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Returns the current entity owner - Handle(SelectMgr_EntityOwner) EntityOwner() const { return myOwner; } - -protected: - //! \return number of children. - virtual int initRowCount() const Standard_OVERRIDE{ return 0; } - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; - - //! Initialize the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - -protected: - - //! 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 - { (void)theRow; (void)theColumn; return TreeModel_ItemBasePtr(); } - -private: - - //! Constructor - //! param theParent a parent item - VInspector_ItemEntityOwner(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) {} - -private: - - //! Returns the current entity owner. Initializes the item if it was not initialized yet - Handle(SelectMgr_EntityOwner) getEntityOwner() const; - -private: - - Handle(SelectMgr_EntityOwner) myOwner; //!< the current entity owner -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemFolderObject.cxx b/tools/VInspector/VInspector_ItemFolderObject.cxx index cbd413bc5c..5e6c394258 100644 --- a/tools/VInspector/VInspector_ItemFolderObject.cxx +++ b/tools/VInspector/VInspector_ItemFolderObject.cxx @@ -16,7 +16,15 @@ #include #include +#include +#include +#include #include +#include +#include + +#include +#include // ======================================================================= // function : initValue @@ -24,13 +32,21 @@ // ======================================================================= QVariant VInspector_ItemFolderObject::initValue (int theItemRole) const { - if (Column() == 0 && (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole)) + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (Column() != 0 || (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole)) + return QVariant(); + + ParentKind aParentKind = GetParentItemKind(); + switch (aParentKind) { - if (parentItemIsContext()) return "Properties"; - else if (Row() == 0) return "Filters"; - else return QVariant(); + case ParentKind_ContextItem: return "Properties"; + case ParentKind_PresentationItem: return "Properties"; + case ParentKind_FolderItem: return Row() == 0 ? "Filters" : QVariant(); + default: return QVariant(); } - return QVariant(); } // ======================================================================= @@ -39,7 +55,30 @@ QVariant VInspector_ItemFolderObject::initValue (int theItemRole) const // ======================================================================= int VInspector_ItemFolderObject::initRowCount() const { - return parentItemIsContext() ? 1 : (GetContext().IsNull() ? 0 : GetContext()->Filters().Extent()); + ParentKind aParentKind = GetParentItemKind(); + switch (aParentKind) + { + case ParentKind_ContextItem: + { + int aNbChildren = 3; // Filters, Viewer, MainSelector + aNbChildren++; // DefaultDrawer + for (int aTypeId = 0; aTypeId < Prs3d_TypeOfHighlight_NB; aTypeId++) + { + const Handle(Prs3d_Drawer)& aStyle = GetContext()->HighlightStyle ((Prs3d_TypeOfHighlight)aTypeId); + if (!aStyle.IsNull()) + aNbChildren++; + } + return aNbChildren; + } + case ParentKind_PresentationItem: + { + return 4; // TransformPers, Attributes, HilightAttributes and DynamicHilightAttributes + } + case ParentKind_FolderItem: + return (GetContext().IsNull() ? 0 : GetContext()->Filters().Extent()); + default: + return 0; + } } // ======================================================================= @@ -48,10 +87,31 @@ int VInspector_ItemFolderObject::initRowCount() const // ======================================================================= TreeModel_ItemBasePtr VInspector_ItemFolderObject::createChild (int theRow, int theColumn) { - if (parentItemIsContext()) - return VInspector_ItemFolderObject::CreateItem (currentItem(), theRow, theColumn); - else - return VInspector_ItemSelectMgrFilter::CreateItem (currentItem(), theRow, theColumn); + ParentKind aParentKind = GetParentItemKind(); + switch (aParentKind) + { + case ParentKind_ContextItem: + { + if (theRow == 0) + return VInspector_ItemFolderObject::CreateItem (currentItem(), theRow, theColumn); + else if (theRow == 1) + return VInspector_ItemV3dViewer::CreateItem (currentItem(), theRow, theColumn); + else if (theRow == 2) + return VInspector_ItemSelectMgrViewerSelector::CreateItem (currentItem(), theRow, theColumn); + else + return VInspector_ItemPrs3dDrawer::CreateItem (currentItem(), theRow, theColumn); + } + case ParentKind_PresentationItem: + { + if (theRow == 0) + return VInspector_ItemGraphic3dTransformPers::CreateItem (currentItem(), theRow, theColumn); + else + return VInspector_ItemPrs3dDrawer::CreateItem (currentItem(), theRow, theColumn); + } + case ParentKind_FolderItem: + return VInspector_ItemSelectMgrFilter::CreateItem (currentItem(), theRow, theColumn); + default: return TreeModel_ItemBasePtr(); + } } // ======================================================================= @@ -72,6 +132,62 @@ void VInspector_ItemFolderObject::Reset() VInspector_ItemBase::Reset(); } +// ======================================================================= +// function : GetPrs3dDrawer +// purpose : +// ======================================================================= +Handle(Prs3d_Drawer) VInspector_ItemFolderObject::GetPrs3dDrawer (const int theRow, + TCollection_AsciiString& theName) const +{ + ParentKind aParentKind = GetParentItemKind(); + switch (aParentKind) + { + case ParentKind_ContextItem: + { + if (theRow == 0 || theRow == 1 || theRow == 2) // "Filters", "Viewer", "Viewer Selector" + return 0; + + if (theRow == 3) + { + theName = "DefaultDrawer"; + return GetContext()->DefaultDrawer(); + } + + for (int aTypeId = 0, aCurId = 0; aTypeId < Prs3d_TypeOfHighlight_NB; aTypeId++) + { + Prs3d_TypeOfHighlight aType = (Prs3d_TypeOfHighlight)aTypeId; + const Handle(Prs3d_Drawer)& aDrawer = GetContext()->HighlightStyle (aType); + if (aDrawer.IsNull()) + continue; + if (aCurId == theRow - 4) + { + theName = TCollection_AsciiString ("HighlightStyle: ") + Prs3d::TypeOfHighlightToString (aType); + return aDrawer; + } + aCurId++; + } + } + case ParentKind_PresentationItem: + { + VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast(Parent()); + Handle(AIS_InteractiveObject) aPrs = aParentPrsItem->GetInteractiveObject(); + switch (theRow) + { + case 0: return 0; // "TransformPers" + case 1: theName = "Attributes"; return aPrs->Attributes(); + case 2: theName = "HilightAttributes"; return aPrs->HilightAttributes(); + case 3: theName = "DynamicHilightAttributes"; return aPrs->DynamicHilightAttributes(); + default: break; + } + } + case ParentKind_FolderItem: + default: break; + } + + theName = "None"; + return Handle(Prs3d_Drawer)(); +} + // ======================================================================= // function : initItem // purpose : @@ -84,10 +200,18 @@ void VInspector_ItemFolderObject::initItem() const } // ======================================================================= -// function : parentItemIsContext +// function : GetParentItemKind // purpose : // ======================================================================= -bool VInspector_ItemFolderObject::parentItemIsContext() const +VInspector_ItemFolderObject::ParentKind VInspector_ItemFolderObject::GetParentItemKind() const { - return itemDynamicCast (Parent()); + VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast(Parent()); + if (aParentPrsItem) + return ParentKind_PresentationItem; + + VInspector_ItemContextPtr aParentContextItem = itemDynamicCast(Parent()); + if (aParentContextItem) + return ParentKind_ContextItem; + + return ParentKind_FolderItem; } diff --git a/tools/VInspector/VInspector_ItemFolderObject.hxx b/tools/VInspector/VInspector_ItemFolderObject.hxx index a0a754f8d8..dc4b36ac65 100644 --- a/tools/VInspector/VInspector_ItemFolderObject.hxx +++ b/tools/VInspector/VInspector_ItemFolderObject.hxx @@ -23,6 +23,8 @@ #include #include +class Prs3d_Drawer; + class QItemSelectionModel; class VInspector_ItemFolderObject; @@ -43,12 +45,33 @@ public: //! Destructor virtual ~VInspector_ItemFolderObject() Standard_OVERRIDE {}; + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { return NULL; } + //! Inits the item, fills internal containers Standard_EXPORT virtual void Init() Standard_OVERRIDE; //! Resets cached values Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + //! Returns drawer of the row if possible + //! \param theRow child row index + //! \param theName [out] drawer name + Standard_EXPORT Handle(Prs3d_Drawer) GetPrs3dDrawer (const int theRow, + TCollection_AsciiString& theName) const; + + enum ParentKind + { + ParentKind_ContextItem, //!< "Properties" item under an interactive context + ParentKind_PresentationItem, //!< "Properties" item under an interactive presentation + ParentKind_FolderItem //!< "Filters" item under an interactive context + }; + + //! Finds kind of the parent item + //! \return item kind + ParentKind GetParentItemKind() const; + protected: //! Initialize the current item. It is empty because Reset() is also empty. @@ -69,11 +92,6 @@ protected: //! \return the created item virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE; -private: - //! Returns whether the parent item is context item - //! \returns bolean value - bool parentItemIsContext() const; - private: //! Constructor diff --git a/tools/VInspector/VInspector_ItemGraphic3dCStructure.cxx b/tools/VInspector/VInspector_ItemGraphic3dCStructure.cxx new file mode 100644 index 0000000000..24ec1c3174 --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dCStructure.cxx @@ -0,0 +1,246 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : GetGroup +// purpose : +// ======================================================================= +Handle(Graphic3d_Group) VInspector_ItemGraphic3dCStructure::GetGroup (const int theRowId) const +{ + Handle(Graphic3d_CStructure) aCStructure = GetCStructure(); + if (aCStructure.IsNull()) + return Handle(Graphic3d_Group)(); + + const Graphic3d_SequenceOfGroup& aGroups = aCStructure->Groups(); + int aCurrentIndex = 0; + for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next()) + { + if (theRowId == aCurrentIndex) + return aGroupIter.Value(); + + aCurrentIndex++; + } + return Handle(Graphic3d_Group)(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCStructure::Init() +{ + VInspector_ItemPrs3dPresentationPtr aParentItem = itemDynamicCast(Parent()); + + Handle(Prs3d_Presentation) aPresentation = aParentItem->GetPresentation(); + myCStructure = aPresentation->CStructure(); + if (!myCStructure.IsNull()) + myTransformPersistence = myCStructure->TransformPersistence(); + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCStructure::Reset() +{ + VInspector_ItemBase::Reset(); + myCStructure = NULL; + myTransformPersistence = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCStructure::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dCStructure::initRowCount() const +{ + if (Column() != 0) + return 0; + + Handle(Graphic3d_CStructure) aCStructure = GetCStructure(); + return !aCStructure.IsNull() ? aCStructure->Groups().Length() : 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dCStructure::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(Graphic3d_CStructure) aCStructure = GetCStructure(); + if (aCStructure.IsNull()) + return Column() == 0 ? "Empty CStructure" : ""; + + switch (Column()) + { + case 0: return theItemRole == Qt::DisplayRole ? aCStructure->DynamicType()->Name() + : STANDARD_TYPE (Graphic3d_CStructure)->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dCStructure::GetTableRowCount() const +{ + return 40; +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemGraphic3dCStructure::GetTableEnumValues (const int theRow, const int) const +{ + QList aValues; + switch (theRow) + { + case 8: + { + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_UNKNOWN)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Default)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Top)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Topmost)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_TopOSD)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_BotOSD)); + } + break; + default: break; + } + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dCStructure::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + Handle(Graphic3d_CStructure) aCStructure = GetCStructure(); + if (aCStructure.IsNull()) + return QVariant(); + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("GraphicDriver") + : QVariant (ViewControl_Tools::GetPointerInfo (aCStructure->GraphicDriver()).ToCString()); + case 1: return isFirstColumn ? QVariant ("Groups") : QVariant (aCStructure->Groups().Length()); + case 2: return isFirstColumn ? QVariant ("Transformation") + : QVariant (ViewControl_Tools::ToString (aCStructure->Transformation()).ToCString()); + case 3: return isFirstColumn ? QVariant ("TransformPersistence") + : QVariant (ViewControl_Tools::GetPointerInfo (aCStructure->TransformPersistence()).ToCString()); + case 4: return isFirstColumn ? QVariant ("ClipPlanes") + : (!aCStructure->ClipPlanes().IsNull() ? QVariant (aCStructure->ClipPlanes()->Size()) : QVariant()); + //case 5: return isFirstColumn ? QVariant ("BoundingBox") + // : QVariant (ViewControl_Tools::ToString (aCStructure->BoundingBox()).ToCString()); + case 6: return isFirstColumn ? QVariant ("HighlightStyle") + : QVariant (ViewControl_Tools::GetPointerInfo (aCStructure->HighlightStyle()).ToCString()); + + case 7: return isFirstColumn ? QVariant ("Id") : QVariant (aCStructure->Id); + case 8: return isFirstColumn ? QVariant ("ZLayer") + : QVariant (Graphic3d::ZLayerIdToString(aCStructure->ZLayer())); + case 9: return isFirstColumn ? QVariant ("Priority") : QVariant (aCStructure->Priority); + case 10: return isFirstColumn ? QVariant ("PreviousPriority") : QVariant (aCStructure->PreviousPriority); + case 11: return isFirstColumn ? QVariant ("ContainsFacet") : QVariant (aCStructure->ContainsFacet); + case 12: return isFirstColumn ? QVariant ("IsInfinite") : QVariant (aCStructure->IsInfinite); + + case 13: return isFirstColumn ? QVariant ("stick") : QVariant (aCStructure->stick); + case 14: return isFirstColumn ? QVariant ("highlight") : QVariant (aCStructure->highlight); + case 15: return isFirstColumn ? QVariant ("visible") : QVariant (aCStructure->visible); + case 16: return isFirstColumn ? QVariant ("HLRValidation") : QVariant (aCStructure->HLRValidation); + case 17: return isFirstColumn ? QVariant ("IsForHighlight") : QVariant (aCStructure->IsForHighlight); + case 18: return isFirstColumn ? QVariant ("IsMutable") : QVariant (aCStructure->IsMutable); + case 19: return isFirstColumn ? QVariant ("Is2dText") : QVariant (aCStructure->Is2dText); + + default: return QVariant(); + } +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemGraphic3dCStructure::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + Handle(Graphic3d_CStructure) aCStructure = GetCStructure(); + switch (theRow) + { + case 8: aCStructure->SetZLayer (Graphic3d::ZLayerIdFromString (theValue.toString().toStdString().c_str())); + default: return false; + } + return true; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemGraphic3dCStructure::createChild (int theRow, int theColumn) +{ + Handle(Graphic3d_CStructure) aCStructure = GetCStructure(); + //Handle(Prs3d_Presentation) aPresentation = GetPresentation(); + //Standard_EXPORT const Handle(Graphic3d_SequenceOfHClipPlane)& ClipPlanes() const; + + if (theRow >= 0 && theRow < GetCStructure()->Groups().Length()) + return VInspector_ItemGraphic3dGroup::CreateItem (currentItem(), theRow, theColumn); + //else + // return VInspector_ItemPresentableObject::CreateItem (currentItem(), theRow, theColumn); + + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemGraphic3dCStructure.hxx b/tools/VInspector/VInspector_ItemGraphic3dCStructure.hxx new file mode 100644 index 0000000000..a64b44df70 --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dCStructure.hxx @@ -0,0 +1,120 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemGraphic3dCStructure_H +#define VInspector_ItemGraphic3dCStructure_H + +#include +#include + +class Graphic3d_CStructure; + +class VInspector_ItemGraphic3dCStructure; +typedef QExplicitlySharedDataPointer VInspector_ItemGraphic3dCStructurePtr; + +//! \class VInspector_ItemGraphic3dCStructure +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemGraphic3dCStructure : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemGraphic3dCStructurePtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemGraphic3dCStructurePtr (new VInspector_ItemGraphic3dCStructure (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemGraphic3dCStructure() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myCStructure; } + + //! Returns the current C structure, init item if it was not initialized yet + //! \return graphic C structure object + Standard_EXPORT Handle(Graphic3d_CStructure) GetCStructure() const + { return Handle(Graphic3d_CStructure)::DownCast (GetObject()); } + + //! Returns group of the C structure + //! \param theRowId a group index + //! \return graphical group + Standard_EXPORT Handle(Graphic3d_Group) GetGroup (const int theRowId) const; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemGraphic3dCStructure(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(Graphic3d_CStructure) myCStructure; +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemGraphic3dCView.cxx b/tools/VInspector/VInspector_ItemGraphic3dCView.cxx new file mode 100644 index 0000000000..414a0652ea --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dCView.cxx @@ -0,0 +1,297 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : GetLayerList +// purpose : +// ======================================================================= +const OpenGl_LayerList& VInspector_ItemGraphic3dCView::GetLayerList (Standard_Boolean& isDefault) const +{ + isDefault = Standard_True; + + Handle(Graphic3d_CView) aCView = GetCView(); + if (aCView.IsNull()) + return myDefaultLayer; + + Handle(OpenGl_View) aOpenGlView = Handle(OpenGl_View)::DownCast (aCView); + if (aOpenGlView.IsNull()) + return myDefaultLayer; + + isDefault = Standard_False; + return aOpenGlView->LayerList(); +} + +// ======================================================================= +// function : GetClipPlane +// purpose : +// ======================================================================= +Handle(Graphic3d_ClipPlane) VInspector_ItemGraphic3dCView::GetClipPlane(const int theRow) +{ + //Handle(V3d_View) aView = GetView(); + + //const Handle(Graphic3d_SequenceOfHClipPlane)& aClipPlanes = aView->ClipPlanes(); + + //Standard_Integer aPlaneId = 0; + //for (Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt (*aClipPlanes); aPlaneIt.More(); aPlaneIt.Next(), ++aPlaneId) + //{ + // if (aPlaneId == theRow) + // return aPlaneIt.Value(); + //} + return 0; +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCView::Init() +{ + VInspector_ItemV3dViewPtr aParentItem = itemDynamicCast(Parent()); + + myCView = aParentItem->GetView()->View(); + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCView::Reset() +{ + VInspector_ItemBase::Reset(); + myCView = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCView::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dCView::initRowCount() const +{ + if (Column() != 0) + return 0; + + int aNbElements = 2; // Camera, OpenGl_LayerList + + Handle(Graphic3d_CView) aCView = GetCView(); + const Handle(Graphic3d_SequenceOfHClipPlane)& aClipPlanes = aCView->ClipPlanes(); + if (!aClipPlanes.IsNull()) + aNbElements += aClipPlanes->Size(); + + return aNbElements; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dCView::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(Graphic3d_CView) aCView = GetCView(); + if (aCView.IsNull()) + return Column() == 0 ? "Empty Graphic3d_CView" : ""; + + switch (Column()) + { + case 0: return theItemRole == Qt::DisplayRole ? aCView->DynamicType()->Name() + : STANDARD_TYPE (Graphic3d_CView)->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dCView::GetTableRowCount() const +{ + return 10; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemGraphic3dCView::GetTableEditType (const int theRow, const int) const +{ + switch (theRow) + { + /*case 4: return ViewControl_EditType_Line; + case 5: return ViewControl_EditType_Combo; + case 6: return ViewControl_EditType_Bool; + case 12: return ViewControl_EditType_Bool; + case 17: return ViewControl_EditType_Combo; + case 18: return ViewControl_EditType_Bool; + case 22: return ViewControl_EditType_Bool;*/ + default: return ViewControl_EditType_None; + } +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemGraphic3dCView::GetTableEnumValues (const int theRow, const int) const +{ + QList aValues; + /*switch (theRow) + { + case 5: + { + for (int i = 0; i <= Aspect_TOFM_FRONT_SIDE; i++) + aValues.append (Aspect::TypeOfFacingModelToString((Aspect_TypeOfFacingModel)i)); + } + break; + case 17: + { + for (int i = 0; i <= PrsMgr_TOP_ProjectorDependant; i++) + aValues.append (PrsMgr::TypeOfPresentation3dToString ((PrsMgr_TypeOfPresentation3d)i)); + } + break; + default: break; + }*/ + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dCView::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(Graphic3d_CView) aCView = GetCView(); + if (aCView.IsNull()) + return QVariant(); + + //bool isFirstColumn = theColumn == 0; + //switch (theRow) + //{ + // case 0: return isFirstColumn ? QVariant ("LineAspect") : QVariant (ViewControl_Tools::GetPointerInfo (aGroup->LineAspect()).ToCString()); + // case 1: return isFirstColumn ? QVariant ("FillAreaAspect") : QVariant (ViewControl_Tools::GetPointerInfo (aGroup->FillAreaAspect()).ToCString()); + // case 2: return isFirstColumn ? QVariant ("TextAspect") : QVariant (ViewControl_Tools::GetPointerInfo (aGroup->TextAspect()).ToCString()); + // case 3: return isFirstColumn ? QVariant ("MarkerAspect") : QVariant (ViewControl_Tools::GetPointerInfo (aGroup->MarkerAspect()).ToCString()); + // case 4: return isFirstColumn ? QVariant ("ContainsFacet") : QVariant (aGroup->ContainsFacet()); + // case 5: return isFirstColumn ? QVariant ("IsDeleted") : QVariant (aGroup->IsDeleted()); + // case 6: return isFirstColumn ? QVariant ("IsEmpty") : QVariant (aGroup->IsEmpty()); + // case 7: return isFirstColumn ? QVariant ("IsClosed") : QVariant (aGroup->IsClosed()); + // case 8: + // { + // if (isFirstColumn) + // return QVariant ("MinMaxValues"); + // Standard_Real aXMin, anYMin, aZMin, aXMax, anYMax, aZMax; + // aGroup->MinMaxValues (aXMin, anYMin, aZMin, aXMax, anYMax, aZMax); + // Bnd_Box aBox; + // aBox.Update(aXMin, anYMin, aZMin, aXMax, anYMax, aZMax); + // return QVariant (ViewControl_Tools::ToString (aBox).ToCString()); + // } + // case 9: + // { + // if (isFirstColumn) + // return QVariant ("BoundingBox"); + // const Graphic3d_BndBox4f& aBndBox = aGroup->BoundingBox(); + // Bnd_Box aBox; + // aBox.Update((Standard_Real )aBndBox.CornerMin().x(), + // (Standard_Real )aBndBox.CornerMin().y(), + // (Standard_Real )aBndBox.CornerMin().z(), + // (Standard_Real )aBndBox.CornerMax().x(), + // (Standard_Real )aBndBox.CornerMax().y(), + // (Standard_Real )aBndBox.CornerMax().z()); + // return QVariant (ViewControl_Tools::ToString (aBox).ToCString()); + // } + //} + return QVariant(); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemGraphic3dCView::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + /*Handle(AIS_InteractiveObject) aPrs = GetInteractiveObject(); + switch (theRow) + { + case 4: + { + double aValue = theValue.toDouble(); + if (aValue > 0) aPrs->SetWidth (aValue); + else aPrs->UnsetWidth(); + } + break; + case 5: aPrs->SetCurrentFacingModel (Aspect::TypeOfFacingModelFromString (theValue.toString().toStdString().c_str())); + case 6: aPrs->SetInfiniteState (theValue.toBool()); + case 12: aPrs->SetAutoHilight(theValue.toBool()); + case 17: aPrs->SetTypeOfPresentation (PrsMgr::TypeOfPresentation3dFromString (theValue.toString().toStdString().c_str())); + case 18: aPrs->SetMutable (theValue.toBool()); + case 22: if (!theValue.toBool()) aPrs->ResetTransformation(); + default: return false; + }*/ + return true; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemGraphic3dCView::createChild (int theRow, int theColumn) +{ + if (theRow == 0) + return VInspector_ItemGraphic3dCamera::CreateItem (currentItem(), theRow, theColumn); + else if (theRow == 1) + return VInspector_ItemOpenGlLayerList::CreateItem (currentItem(), theRow, theColumn); + else + return VInspector_ItemGraphic3dClipPlane::CreateItem (currentItem(), theRow, theColumn); +} diff --git a/tools/VInspector/VInspector_ItemGraphic3dCView.hxx b/tools/VInspector/VInspector_ItemGraphic3dCView.hxx new file mode 100644 index 0000000000..662cdc6ef6 --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dCView.hxx @@ -0,0 +1,131 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemGraphic3dCView_H +#define VInspector_ItemGraphic3dCView_H + +#include +#include + +#include + +class Graphic3d_CView; + +class VInspector_ItemGraphic3dCView; +typedef QExplicitlySharedDataPointer VInspector_ItemGraphic3dCViewPtr; + +//! \class VInspector_ItemGraphic3dCView +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemGraphic3dCView : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemGraphic3dCViewPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemGraphic3dCViewPtr (new VInspector_ItemGraphic3dCView (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemGraphic3dCView() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myCView; } + + //! Returns current clip plane, initialize if it was not initialized yet + Standard_EXPORT Handle(Graphic3d_CView) GetCView() const + { return Handle(Graphic3d_CView)::DownCast (GetObject()); } + + //! Returns layer list if the View is OpenGl_View + //! \param isDefault flag is true if the layer is absent and the default value of this class is used + Standard_EXPORT const OpenGl_LayerList& GetLayerList (Standard_Boolean& isDefault) const; + + //! Returns clip plane of the row if possible + //! \param theRow child row index + Standard_EXPORT Handle(Graphic3d_ClipPlane) GetClipPlane(const int theRow); + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemGraphic3dCView(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn), myDefaultLayer (1) {} + +private: + Handle(Graphic3d_CView) myCView; //! current graphical CView + OpenGl_LayerList myDefaultLayer; //! default layer if the view is not OpenGl +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemGraphic3dCamera.cxx b/tools/VInspector/VInspector_ItemGraphic3dCamera.cxx new file mode 100644 index 0000000000..3467a2b309 --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dCamera.cxx @@ -0,0 +1,348 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCamera::Init() +{ + VInspector_ItemV3dViewPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + myCamera = aParentItem->GetView()->DefaultCamera(); + else + { + VInspector_ItemGraphic3dCViewPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + myCamera = aParentItem->GetCView()->Camera(); + } + + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCamera::Reset() +{ + VInspector_ItemBase::Reset(); + myCamera = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dCamera::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dCamera::initRowCount() const +{ + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dCamera::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(Graphic3d_Camera) aCamera = GetCamera(); + if (aCamera.IsNull()) + return Column() == 0 ? "Empty Graphic3d_Camera" : ""; + + switch (Column()) + { + case 0: return theItemRole == Qt::DisplayRole ? aCamera->DynamicType()->Name() + : STANDARD_TYPE (Graphic3d_Camera)->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dCamera::GetTableRowCount() const +{ + return 40; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemGraphic3dCamera::GetTableEditType (const int theRow, const int) const +{ + switch (theRow) + { + //case 0: return ViewControl_EditType_DoubleVec3; + //case 1: return ViewControl_EditType_DoubleVec3; + //case 2: return ViewControl_EditType_DoubleVec3; + //case 3: return ViewControl_EditType_DoubleVec3; + case 4: return ViewControl_EditType_Double; + case 5: return ViewControl_EditType_Combo; + case 6: return ViewControl_EditType_Double; + case 7: return ViewControl_EditType_Double; + case 8: return ViewControl_EditType_Double; + case 9: return ViewControl_EditType_Double; + case 10: return ViewControl_EditType_Combo; + case 11: return ViewControl_EditType_Combo; + case 12: return ViewControl_EditType_Double; + // calculated + //case 13: return ViewControl_EditType_DoubleVec3; + //case 14: return ViewControl_EditType_DoubleVec3; + //case 15: return ViewControl_EditType_DoubleVec3; + default: return ViewControl_EditType_None; + } +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemGraphic3dCamera::GetTableEnumValues (const int theRow, const int) const +{ + QList aValues; + switch (theRow) + { + case 5: + { + for (int i = 0; i <= Graphic3d_Camera::Projection_MonoRightEye; i++) + aValues.append (Graphic3d::CameraProjectionToString((Graphic3d_Camera::Projection)i)); + } + break; + case 10: + { + for (int i = 0; i <= Graphic3d_Camera::FocusType_Relative; i++) + aValues.append (Graphic3d::CameraFocusTypeToString((Graphic3d_Camera::FocusType)i)); + } + break; + case 11: + { + for (int i = 0; i <= Graphic3d_Camera::IODType_Relative; i++) + aValues.append (Graphic3d::CameraIODTypeToString((Graphic3d_Camera::IODType)i)); + } + break; + default: break; + } + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dCamera::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole && theRole != Qt::ToolTipRole) + return QVariant(); + + Handle(Graphic3d_Camera) aCamera = GetCamera(); + if (aCamera.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + bool isToolTip = theRole == Qt::ToolTipRole; + switch (theRow) + { + case 0: return isFirstColumn ? (!isToolTip ? QVariant("Eye") : QVariant ("Camera Eye position")) + : QVariant (ViewControl_Tools::ToString (aCamera->Eye()).ToCString()); + case 1: return isFirstColumn ? (!isToolTip ? QVariant("Center") : QVariant ("Center of the camera")) + : QVariant (ViewControl_Tools::ToString (aCamera->Center()).ToCString()); + case 2: return isFirstColumn ? (!isToolTip ? QVariant("Up") : QVariant ("Camera Up direction vector, orthogonal to camera direction")) + : QVariant (ViewControl_Tools::ToString (aCamera->Up()).ToCString()); + + case 3: return isFirstColumn ? (!isToolTip ? QVariant ("AxialScale") : QVariant ("Camera axial scale vector")) + : QVariant (ViewControl_Tools::ToString (aCamera->AxialScale()).ToCString()); + case 4: return isFirstColumn ? (!isToolTip ? QVariant ("Scale") : QVariant ("Camera scale (depend on Projection, see sources doc)")) + : ViewControl_Tools::ToVariant (aCamera->Scale()); + case 5: return isFirstColumn ? (!isToolTip ? QVariant ("ProjectionType") : QVariant ("Camera projection type")) + : QVariant (Graphic3d::CameraProjectionToString (aCamera->ProjectionType())); + + case 6: return isFirstColumn ? (!isToolTip ? QVariant ("FOVy") : QVariant ("Field Of View (FOV) in y axis for perspective projection")) + : ViewControl_Tools::ToVariant (aCamera->FOVy()); + case 7: return isFirstColumn ? (!isToolTip ? QVariant ("ZNear") : QVariant ("Near Z-clipping plane position: distance of the plane from the Eye")) + : ViewControl_Tools::ToVariant (aCamera->ZNear()); + case 8: return isFirstColumn ? (!isToolTip ? QVariant ("ZFar") : QVariant ("Far Z-clipping plane position: distance of the plane from the Eye")) + : ViewControl_Tools::ToVariant (aCamera->ZFar()); + case 9: return isFirstColumn ? (!isToolTip ? QVariant ("Aspect") : QVariant ("Camera width / height display ratio")) + : ViewControl_Tools::ToVariant (aCamera->Aspect()); + + case 10: return isFirstColumn ? (!isToolTip ? QVariant ("ZFocusType") : QVariant ("Type used for stereographic focus")) + : QVariant (Graphic3d::CameraFocusTypeToString (aCamera->ZFocusType())); + case 11: return isFirstColumn ? (!isToolTip ? QVariant ("ZFocus") : QVariant ("Stereographic focus value")) + : ViewControl_Tools::ToVariant (aCamera->ZFocus()); + + case 12: return isFirstColumn ? (!isToolTip ? QVariant ("GetIODType") : QVariant ("Intraocular distance definition type")) + : QVariant (Graphic3d::CameraIODTypeToString (aCamera->GetIODType())); + case 13: return isFirstColumn ? (!isToolTip ? QVariant ("IOD") : QVariant ("Intraocular distance value")) + : ViewControl_Tools::ToVariant (aCamera->IOD()); + + case 14: return ViewControl_Table::SeparatorData(); + case 15: return isFirstColumn ? QVariant ("Calculated values:") : QVariant(); + case 16: return ViewControl_Table::SeparatorData(); + + case 17: return isFirstColumn ? (!isToolTip ? QVariant ("Distance") : QVariant ("Distance of Eye from camera Center")) + : ViewControl_Tools::ToVariant (aCamera->Distance()); + case 18: return isFirstColumn ? (!isToolTip ? QVariant ("Direction") : QVariant ("Camera look direction")) + : QVariant (ViewControl_Tools::ToString (aCamera->Direction()).ToCString()); + case 19: return isFirstColumn ? (!isToolTip ? QVariant ("ViewDimensions") : QVariant ("View plane size at center (target) point and distance between ZFar and ZNear planes")) + : ViewControl_Tools::ToString (aCamera->ViewDimensions()).ToCString(); + + case 20: return ViewControl_Table::SeparatorData(); + case 21: return isFirstColumn ? QVariant ("TransformMatrices (D):") : QVariant(); + case 22: return ViewControl_Table::SeparatorData(); + + case 23: return isFirstColumn ? QVariant ("OrientationMatrix") : VInspector_Tools::ToVariant (aCamera->OrientationMatrix()); + case 24: return isFirstColumn ? QVariant ("ProjectionMatrix") : VInspector_Tools::ToVariant (aCamera->ProjectionMatrix()); + case 25: return isFirstColumn ? QVariant ("ProjectionStereoLeft") : VInspector_Tools::ToVariant (aCamera->ProjectionStereoLeft()); + case 26: return isFirstColumn ? QVariant ("ProjectionStereoRight") : VInspector_Tools::ToVariant (aCamera->ProjectionStereoRight()); + + case 27: return ViewControl_Table::SeparatorData(); + case 28: return isFirstColumn ? QVariant ("TransformMatrices (F):") : QVariant(); + case 29: return ViewControl_Table::SeparatorData(); + + case 30: return isFirstColumn ? QVariant ("OrientationMatrixF") : VInspector_Tools::ToVariant (aCamera->OrientationMatrixF()); + case 31: return isFirstColumn ? QVariant ("ProjectionMatrixF") : VInspector_Tools::ToVariant (aCamera->ProjectionMatrixF()); + case 32: return isFirstColumn ? QVariant ("ProjectionStereoLeftF") : VInspector_Tools::ToVariant (aCamera->ProjectionStereoLeftF()); + case 33: return isFirstColumn ? QVariant ("ProjectionStereoRightF") : VInspector_Tools::ToVariant (aCamera->ProjectionStereoRightF()); + } + return QVariant(); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemGraphic3dCamera::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + Handle(Graphic3d_Camera) aCamera = GetCamera(); + if (aCamera.IsNull()) + return false; + + switch (theRow) + { + //case 0: return isFirstColumn ? (!isToolTip ? QVariant("Eye") : QVariant ("Camera Eye position")) + // : QVariant (ViewControl_Tools::ToString (aCamera->Eye()).ToCString()); + //case 1: return isFirstColumn ? (!isToolTip ? QVariant("Center") : QVariant ("Center of the camera")) + // : QVariant (ViewControl_Tools::ToString (aCamera->Center()).ToCString()); + //case 2: return isFirstColumn ? (!isToolTip ? QVariant("Up") : QVariant ("Camera Up direction vector, orthogonal to camera direction")) + // : QVariant (ViewControl_Tools::ToString (aCamera->Up()).ToCString()); + //case 3: return isFirstColumn ? (!isToolTip ? QVariant ("AxialScale") : QVariant ("Camera axial scale vector")) + // : QVariant (ViewControl_Tools::ToString (aCamera->AxialScale()).ToCString()); + case 4: aCamera->SetScale (ViewControl_Tools::ToRealValue (theValue)); break; + case 5: aCamera->SetProjectionType (Graphic3d::CameraProjectionFromString(theValue.toString().toStdString().c_str())); break; + + case 6: aCamera->SetFOVy (ViewControl_Tools::ToRealValue (theValue)); break; + case 7: aCamera->SetZRange (ViewControl_Tools::ToRealValue (theValue), aCamera->ZFar()); break; + case 8: aCamera->SetZRange (aCamera->ZNear(), ViewControl_Tools::ToRealValue (theValue)); break; + case 9: aCamera->SetAspect (ViewControl_Tools::ToRealValue (theValue)); break; + + case 10: aCamera->SetZFocus (Graphic3d::CameraFocusTypeFromString(theValue.toString().toStdString().c_str()), + aCamera->ZFocus()); break; + case 11: aCamera->SetZFocus (aCamera->ZFocusType(), ViewControl_Tools::ToRealValue (theValue)); break; + + case 12: aCamera->SetIOD (Graphic3d::CameraIODTypeFromString(theValue.toString().toStdString().c_str()), + aCamera->IOD()); break; + case 13: aCamera->SetIOD (aCamera->GetIODType(), + ViewControl_Tools::ToRealValue (theValue)); break; + + //case 14: return ViewControl_Table::SeparatorData(); + //case 15: return isFirstColumn ? QVariant ("Calculated values:") : QVariant(); + //case 16: return ViewControl_Table::SeparatorData(); + + case 17: aCamera->SetDistance (ViewControl_Tools::ToRealValue (theValue)); break; + //case 18: return isFirstColumn ? (!isToolTip ? QVariant ("Direction") : QVariant ("Camera look direction")) + // : QVariant (ViewControl_Tools::ToString (aCamera->Direction()).ToCString()); + default: return false; + } + return true; +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemGraphic3dCamera::buildPresentationShape (const Handle(Graphic3d_Camera)& theCamera) +{ + if (theCamera.IsNull()) + return TopoDS_Shape(); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + + const gp_Pnt& aCenter = theCamera->Center (); + const gp_Pnt& anEye = theCamera->Eye (); + const gp_Dir& anUp = theCamera->Up(); + const gp_Dir& aCameraDirection = theCamera->Direction(); + + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (aCenter)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (anEye)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Lin (anEye, anUp))); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Lin (anEye, aCameraDirection))); + + return aCompound; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemGraphic3dCamera::createChild (int, int) +{ + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemGraphic3dCamera.hxx b/tools/VInspector/VInspector_ItemGraphic3dCamera.hxx new file mode 100644 index 0000000000..51ae949f90 --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dCamera.hxx @@ -0,0 +1,128 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemGraphic3dCamera_H +#define VInspector_ItemGraphic3dCamera_H + +#include +#include + +class Graphic3d_Camera; + +class VInspector_ItemGraphic3dCamera; +typedef QExplicitlySharedDataPointer VInspector_ItemGraphic3dCameraPtr; + +//! \class VInspector_ItemGraphic3dCamera +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemGraphic3dCamera : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemGraphic3dCameraPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemGraphic3dCameraPtr (new VInspector_ItemGraphic3dCamera (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemGraphic3dCamera() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myCamera; } + + //! Returns the current graphic3d camera, init item if it was not initialized yet + //! \return graphic camera + Standard_EXPORT Handle(Graphic3d_Camera) GetCamera() const { return Handle(Graphic3d_Camera)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE { return buildPresentationShape (myCamera); } + + //! Creates shape for the 3d view parameters + //! \param theView current view + //! \return shape or NULL + static TopoDS_Shape buildPresentationShape (const Handle(Graphic3d_Camera)& theView); + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemGraphic3dCamera(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(Graphic3d_Camera) myCamera; //! current graphic group +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemGraphic3dClipPlane.cxx b/tools/VInspector/VInspector_ItemGraphic3dClipPlane.cxx new file mode 100644 index 0000000000..aa0af62ba0 --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dClipPlane.cxx @@ -0,0 +1,171 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dClipPlane::initRowCount() const +{ + if (Column() != 0) + return 0; + + VInspector_ItemV3dViewPtr aParentViewItem = itemDynamicCast(Parent()); + if (aParentViewItem) + return aParentViewItem->GetView()->ClipPlanes()->Size(); + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dClipPlane::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + if (GetClipPlane().IsNull()) + return Column() == 0 ? "Clip Planes" : ""; + + switch (Column()) + { + case 0: return GetClipPlane()->DynamicType()->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemGraphic3dClipPlane::Init() +{ + //VInspector_ItemV3dViewPtr aParentViewItem = itemDynamicCast(Parent()); + //Handle(Graphic3d_ClipPlane) aClipPlane; + //if (!aParentViewItem) // ClipPlanes + //{ + // aParentViewItem = itemDynamicCast(Parent()->Parent()); + // aClipPlane = aParentViewItem->GetClipPlane(Row()); + //} + //setClipPlane (aClipPlane); + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemGraphic3dClipPlane::Reset() +{ + VInspector_ItemBase::Reset(); + + setClipPlane (NULL); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemGraphic3dClipPlane::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dClipPlane::GetTableRowCount() const +{ + return 0; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemGraphic3dClipPlane::GetTableEditType (const int theRow, const int) const +{ + return ViewControl_EditType_None; +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemGraphic3dClipPlane::GetTableEnumValues (const int theRow, const int) const +{ + QList aValues; + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dClipPlane::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + return QVariant(); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemGraphic3dClipPlane::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + return true; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemGraphic3dClipPlane::createChild (int theRow, int theColumn) +{ + if (theRow == 0) + return VInspector_ItemGraphic3dClipPlane::CreateItem (currentItem(), theRow, theColumn); + + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemGraphic3dClipPlane.hxx b/tools/VInspector/VInspector_ItemGraphic3dClipPlane.hxx new file mode 100644 index 0000000000..e59d0a311d --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dClipPlane.hxx @@ -0,0 +1,125 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemGraphic3dClipPlane_H +#define VInspector_ItemGraphic3dClipPlane_H + +#include +#include + +#include + +class VInspector_ItemGraphic3dClipPlane; +typedef QExplicitlySharedDataPointer VInspector_ItemGraphic3dClipPlanePtr; + +//! \class VInspector_ItemGraphic3dClipPlane +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemGraphic3dClipPlane : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemGraphic3dClipPlanePtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemGraphic3dClipPlanePtr (new VInspector_ItemGraphic3dClipPlane (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemGraphic3dClipPlane() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myClipPlane; } + + //! Returns current clip plane, initialize if it was not initialized yet + Standard_EXPORT Handle(Graphic3d_ClipPlane) GetClipPlane() const + { return Handle(Graphic3d_ClipPlane)::DownCast (GetObject()); } + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! 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: + + //! Set Clip Plane into the current field + //! \param theViewer a viewer + void setClipPlane (const Handle(Graphic3d_ClipPlane)& theClipPlane) { myClipPlane = theClipPlane; } + +private: + + //! 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 + VInspector_ItemGraphic3dClipPlane(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +protected: + + Handle(Graphic3d_ClipPlane) myClipPlane; //!< the current ClipPlane +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemGraphic3dGroup.cxx b/tools/VInspector/VInspector_ItemGraphic3dGroup.cxx new file mode 100644 index 0000000000..894d660302 --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dGroup.cxx @@ -0,0 +1,174 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 + +#include +#include +#include + +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dGroup::Init() +{ + VInspector_ItemGraphic3dCStructurePtr aParentItem = itemDynamicCast(Parent()); + myGroup = aParentItem->GetGroup (Row()); + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dGroup::Reset() +{ + VInspector_ItemBase::Reset(); + myGroup = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dGroup::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dGroup::initRowCount() const +{ + if (Column() != 0) + return 0; + + Handle(Graphic3d_Group) aGroup = GetGroup(); + Handle(OpenGl_Group) anOpenGlGroup = Handle(OpenGl_Group)::DownCast(aGroup); + if (anOpenGlGroup.IsNull()) + return 0; + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dGroup::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(Graphic3d_Group) aGroup = GetGroup(); + if (aGroup.IsNull()) + return Column() == 0 ? "Empty group" : ""; + + switch (Column()) + { + case 0: return theItemRole == Qt::DisplayRole ? aGroup->DynamicType()->Name() + : STANDARD_TYPE (Graphic3d_Group)->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dGroup::GetTableRowCount() const +{ + return 10; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dGroup::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(Graphic3d_Group) aGroup = GetGroup(); + if (aGroup.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + //case 0: return isFirstColumn ? QVariant ("LineAspect") : QVariant (ViewControl_Tools::GetPointerInfo (aGroup->LineAspect()).ToCString()); + //case 1: return isFirstColumn ? QVariant ("FillAreaAspect") : QVariant (ViewControl_Tools::GetPointerInfo (aGroup->FillAreaAspect()).ToCString()); + //case 2: return isFirstColumn ? QVariant ("TextAspect") : QVariant (ViewControl_Tools::GetPointerInfo (aGroup->TextAspect()).ToCString()); + //case 3: return isFirstColumn ? QVariant ("MarkerAspect") : QVariant (ViewControl_Tools::GetPointerInfo (aGroup->MarkerAspect()).ToCString()); + case 4: return isFirstColumn ? QVariant ("ContainsFacet") : QVariant (aGroup->ContainsFacet()); + case 5: return isFirstColumn ? QVariant ("IsDeleted") : QVariant (aGroup->IsDeleted()); + case 6: return isFirstColumn ? QVariant ("IsEmpty") : QVariant (aGroup->IsEmpty()); + case 7: return isFirstColumn ? QVariant ("IsClosed") : QVariant (aGroup->IsClosed()); + case 8: + { + if (isFirstColumn) + return QVariant ("MinMaxValues"); + Standard_Real aXMin, anYMin, aZMin, aXMax, anYMax, aZMax; + aGroup->MinMaxValues (aXMin, anYMin, aZMin, aXMax, anYMax, aZMax); + Bnd_Box aBox; + aBox.Update(aXMin, anYMin, aZMin, aXMax, anYMax, aZMax); + return QVariant (ViewControl_Tools::ToString (aBox).ToCString()); + } + case 9: + { + if (isFirstColumn) + return QVariant ("BoundingBox"); + const Graphic3d_BndBox4f& aBndBox = aGroup->BoundingBox(); + Bnd_Box aBox; + aBox.Update((Standard_Real )aBndBox.CornerMin().x(), + (Standard_Real )aBndBox.CornerMin().y(), + (Standard_Real )aBndBox.CornerMin().z(), + (Standard_Real )aBndBox.CornerMax().x(), + (Standard_Real )aBndBox.CornerMax().y(), + (Standard_Real )aBndBox.CornerMax().z()); + return QVariant (ViewControl_Tools::ToString (aBox).ToCString()); + } + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemGraphic3dGroup::createChild (int theRow, int theColumn) +{ + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemGraphic3dGroup.hxx b/tools/VInspector/VInspector_ItemGraphic3dGroup.hxx new file mode 100644 index 0000000000..b32d04c7e6 --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dGroup.hxx @@ -0,0 +1,104 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemGraphic3dGroup_H +#define VInspector_ItemGraphic3dGroup_H + +#include +#include + +class Graphic3d_Group; +class OpenGl_Element; + +class VInspector_ItemGraphic3dGroup; +typedef QExplicitlySharedDataPointer VInspector_ItemGraphic3dGroupPtr; + +//! \class VInspector_ItemGraphic3dGroup +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemGraphic3dGroup : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemGraphic3dGroupPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemGraphic3dGroupPtr (new VInspector_ItemGraphic3dGroup (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemGraphic3dGroup() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myGroup; } + + //! Returns the current graphic3d group, init item if it was not initialized yet + //! \return graphic group + Standard_EXPORT Handle(Graphic3d_Group) GetGroup() const + { return Handle(Graphic3d_Group)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemGraphic3dGroup(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(Graphic3d_Group) myGroup; //! current graphic group +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemGraphic3dTransformPers.cxx b/tools/VInspector/VInspector_ItemGraphic3dTransformPers.cxx new file mode 100644 index 0000000000..b4549b1cfb --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dTransformPers.cxx @@ -0,0 +1,157 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dTransformPers::Init() +{ + VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + { + VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast(aParentItem->Parent()); + if (aParentPrsItem) + { + Handle(AIS_InteractiveObject) anObject = aParentPrsItem->GetInteractiveObject(); + myTransformPers = anObject->TransformPersistence(); + } + } + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dTransformPers::Reset() +{ + VInspector_ItemBase::Reset(); + myTransformPers = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemGraphic3dTransformPers::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dTransformPers::initRowCount() const +{ + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dTransformPers::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(Graphic3d_TransformPers) aTransformPers = GetTransformPers(); + if (aTransformPers.IsNull()) + return Column() == 0 ? "Graphic3d_TransformPers" : ""; + + switch (Column()) + { + case 0: return aTransformPers->DynamicType()->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemGraphic3dTransformPers::GetTableRowCount() const +{ + return 5; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemGraphic3dTransformPers::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + Handle(Graphic3d_TransformPers) aTransformPers = GetTransformPers(); + if (aTransformPers.IsNull()) + return QVariant(); + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("Mode") + : QVariant (Graphic3d::TransModeFlagsToString (aTransformPers->Mode())); + case 1: return isFirstColumn ? QVariant ("AnchorPoint") + : aTransformPers->IsZoomOrRotate() ? QVariant (ViewControl_Tools::ToString (aTransformPers->AnchorPoint()).ToCString()) : QVariant(); + case 2: return isFirstColumn ? QVariant ("Corner2d") + : aTransformPers->IsTrihedronOr2d() ? QVariant (Aspect::TypeOfTriedronPositionToString (aTransformPers->Corner2d())) : QVariant(); + case 3: return isFirstColumn ? QVariant ("OffsetX") + : aTransformPers->IsTrihedronOr2d() ? QVariant (aTransformPers->Offset2d().x()) : QVariant(); + case 4: return isFirstColumn ? QVariant ("OffsetY") + : aTransformPers->IsTrihedronOr2d() ? QVariant (aTransformPers->Offset2d().y()) : QVariant(); + + default: return QVariant(); + } +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemGraphic3dTransformPers::createChild (int, int) +{ + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemGraphic3dTransformPers.hxx b/tools/VInspector/VInspector_ItemGraphic3dTransformPers.hxx new file mode 100644 index 0000000000..f5186358bd --- /dev/null +++ b/tools/VInspector/VInspector_ItemGraphic3dTransformPers.hxx @@ -0,0 +1,103 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemGraphic3dTransformPers_H +#define VInspector_ItemGraphic3dTransformPers_H + +#include +#include + +class Graphic3d_TransformPers; + +class VInspector_ItemGraphic3dTransformPers; +typedef QExplicitlySharedDataPointer VInspector_ItemGraphic3dTransformPersPtr; + +//! \class VInspector_ItemGraphic3dTransformPers +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemGraphic3dTransformPers : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemGraphic3dTransformPersPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemGraphic3dTransformPersPtr (new VInspector_ItemGraphic3dTransformPers (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemGraphic3dTransformPers() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myTransformPers; } + + //! Returns the current C structure, init item if it was not initialized yet + //! \return graphic C structure object + Standard_EXPORT Handle(Graphic3d_TransformPers) GetTransformPers() const + { return Handle(Graphic3d_TransformPers)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemGraphic3dTransformPers(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(Graphic3d_TransformPers) myTransformPers; +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemHistoryElement.cxx b/tools/VInspector/VInspector_ItemHistoryElement.cxx index f6a6b1df65..ef57992759 100644 --- a/tools/VInspector/VInspector_ItemHistoryElement.cxx +++ b/tools/VInspector/VInspector_ItemHistoryElement.cxx @@ -26,15 +26,19 @@ // ======================================================================= QVariant VInspector_ItemHistoryElement::initValue(const int theRole) const { + QVariant aParentValue = VInspector_ItemBase::initValue (theRole); + if (aParentValue.isValid()) + return aParentValue; + if (theRole != Qt::DisplayRole && theRole != Qt::EditRole && theRole != Qt::ToolTipRole) return QVariant(); switch (Column()) { case 0: return getName(); - case 1: return QVariant(); - case 2: return GetPointerInfo(); - case 3: return GetShapeTypeInfo(); + case 2: return QVariant(); + case 3: return GetPointerInfo(); + case 4: return GetShapeTypeInfo(); default: break; } return QVariant(); diff --git a/tools/VInspector/VInspector_ItemHistoryRoot.cxx b/tools/VInspector/VInspector_ItemHistoryRoot.cxx index 7a5c2bd501..77f9512140 100644 --- a/tools/VInspector/VInspector_ItemHistoryRoot.cxx +++ b/tools/VInspector/VInspector_ItemHistoryRoot.cxx @@ -64,6 +64,11 @@ void VInspector_ItemHistoryRoot::AddElement (const VInspector_CallBackMode& theM const VInspector_ItemHistoryTypeInfo& VInspector_ItemHistoryRoot::GetTypeInfo (const int theChildRowIndex) { int anInfoMapIndex = theChildRowIndex + myFirstIndex; + + bool aReversed = true; + if (aReversed) + anInfoMapIndex = (myInfoMap.size() - myFirstIndex) - 1 - anInfoMapIndex; + return myInfoMap[anInfoMapIndex]; } @@ -73,13 +78,17 @@ const VInspector_ItemHistoryTypeInfo& VInspector_ItemHistoryRoot::GetTypeInfo (c // ======================================================================= QVariant VInspector_ItemHistoryRoot::initValue (const int theRole) const { + QVariant aParentValue = VInspector_ItemBase::initValue (theRole); + if (aParentValue.isValid()) + return aParentValue; + if (theRole != Qt::DisplayRole && theRole != Qt::EditRole && theRole != Qt::ToolTipRole) return QVariant(); switch (Column()) { case 0: return "History"; - case 1: return theRole == Qt::ToolTipRole ? QVariant ("Count of children") : QVariant (rowCount()); + case 2: return theRole == Qt::ToolTipRole ? QVariant ("Count of children") : QVariant (rowCount()); default: break; } diff --git a/tools/VInspector/VInspector_ItemHistoryType.cxx b/tools/VInspector/VInspector_ItemHistoryType.cxx index bd8f90a9a9..70ab2c9049 100644 --- a/tools/VInspector/VInspector_ItemHistoryType.cxx +++ b/tools/VInspector/VInspector_ItemHistoryType.cxx @@ -31,6 +31,8 @@ QString VInspector_ItemHistoryType::PointerInfo() const VInspector_ItemHistoryRootPtr aParentItem = itemDynamicCast(Parent()); const VInspector_ItemHistoryTypeInfo& aTypeInfo = aParentItem->GetTypeInfo(Row()); + if (aTypeInfo.myElements.size() < rowCount()) + return QString(); QList anElements = aTypeInfo.myElements[rowCount() - 1]; // the last item return anElements.size() > 1 ? anElements[1].toString() : QString(); } @@ -46,6 +48,8 @@ QString VInspector_ItemHistoryType::OwnerInfo() const VInspector_ItemHistoryRootPtr aParentItem = itemDynamicCast(Parent()); const VInspector_ItemHistoryTypeInfo& aTypeInfo = aParentItem->GetTypeInfo(Row()); + if ( aTypeInfo.myElements.size() < rowCount()) + return QString(); QList anElements = aTypeInfo.myElements[rowCount() - 1]; // the last item return anElements.size() > 3 ? anElements[3].toString() : QString(); } @@ -56,21 +60,29 @@ QString VInspector_ItemHistoryType::OwnerInfo() const // ======================================================================= QVariant VInspector_ItemHistoryType::initValue(const int theRole) const { + QVariant aParentValue = VInspector_ItemBase::initValue (theRole); + if (aParentValue.isValid()) + return aParentValue; + if (theRole != Qt::DisplayRole && theRole != Qt::EditRole && theRole != Qt::ToolTipRole) return QVariant(); VInspector_ItemHistoryRootPtr aParentItem = itemDynamicCast(Parent()); const VInspector_ItemHistoryTypeInfo& aTypeInfo = aParentItem->GetTypeInfo(Row()); + int aRowCount = rowCount(); + if (aRowCount <= 0 || aTypeInfo.myElements.size() < aRowCount) + return QVariant(); + QList anElements = rowCount() > 0 ? aTypeInfo.myElements[rowCount() - 1] : QList(); // the last item int anInfoSize = anElements.size(); switch (Column()) { case 0: return VInspector_CallBack::GetInfo(aTypeInfo.myMode); - case 1: return rowCount(); - case 2: return anInfoSize > 1 ? anElements[1].toString() : QVariant(); // pointer info - case 3: return anInfoSize > 2 ? anElements[2].toString() : QVariant(); // shape type - case 4: return anInfoSize > 0 ? anElements[0].toString() : QVariant(); // AIS name - case 5: return anInfoSize > 3 ? anElements[3].toString() : QVariant(); // owner info + case 3: return rowCount(); + case 4: return anInfoSize > 1 ? anElements[1].toString() : QVariant(); // pointer info + case 5: return anInfoSize > 2 ? anElements[2].toString() : QVariant(); // shape type + case 6: return anInfoSize > 0 ? anElements[0].toString() : QVariant(); // AIS name + case 7: return anInfoSize > 3 ? anElements[3].toString() : QVariant(); // owner info default: break; } return QVariant(); diff --git a/tools/VInspector/VInspector_ItemOpenGlContext.cxx b/tools/VInspector/VInspector_ItemOpenGlContext.cxx new file mode 100644 index 0000000000..6a83dd0d81 --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlContext.cxx @@ -0,0 +1,216 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +//#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlContext::Init() +{ + //VInspector_ItemOpenGlContextListPtr aParentItem = itemDynamicCast(Parent()); + //myLayer = aParentItem->GetLayer (Row(), myLayerId); + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlContext::Reset() +{ + VInspector_ItemBase::Reset(); + myLayer = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlContext::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlContext::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlContext::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return Column() == 0 ? "Empty element" : ""; + + switch (Column()) + { + case 0: + { + TCollection_AsciiString aLayerId = Graphic3d::ZLayerIdToString (myLayerId); + if (aLayerId.IsEmpty()) + aLayerId = TCollection_AsciiString (myLayerId); + return theItemRole == Qt::ToolTipRole ? QVariant ("") + : QVariant (QString("%1 (%2)") + .arg(aLayer->DynamicType()->Name()) + .arg (aLayerId.ToCString())); + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlContext::GetTableRowCount() const +{ + return 40; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlContext::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("NbStructures") : QVariant (aLayer->NbStructures()); + case 1: return isFirstColumn ? QVariant ("NbStructuresNotCulled") : QVariant (aLayer->NbStructuresNotCulled()); + case 2: return isFirstColumn ? QVariant ("NbPriorities") : QVariant (aLayer->NbPriorities()); + + case 3: return isFirstColumn ? QVariant ("ArrayOfStructures") : QVariant (aLayer->ArrayOfStructures().Size()); + case 4: return isFirstColumn ? QVariant ("IsCulled") : QVariant (aLayer->IsCulled()); + case 5: return isFirstColumn ? QVariant ("NbOfTransformPersistenceObjects") : QVariant (aLayer->NbOfTransformPersistenceObjects()); + + case 6: return isFirstColumn ? QVariant ("CullableStructuresBVH") : QVariant (aLayer->CullableStructuresBVH().Size()); + case 7: return isFirstColumn ? QVariant ("CullableTrsfPersStructuresBVH") : QVariant (aLayer->CullableTrsfPersStructuresBVH().Size()); + case 8: return isFirstColumn ? QVariant ("NonCullableStructures") : QVariant (aLayer->NonCullableStructures().Size()); + + default: + break; + } + + Standard_Integer aRow = theRow - 9; + return getLayerSettingsTableData (aRow, theColumn, theRole, aLayer->LayerSettings()); +} + +// ======================================================================= +// function : getLayerSettingsTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlContext::getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const +{ + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("LayerSettings:") : QVariant(); + case 1: return isFirstColumn ? QVariant ("Name") : QVariant (theSettings.Name().ToCString()); + case 2: return isFirstColumn ? QVariant ("Lights") : QVariant (ViewControl_Tools::GetPointerInfo (theSettings.Lights()).ToCString()); + + case 3: return isFirstColumn ? QVariant ("Origin") : QVariant (ViewControl_Tools::ToString (theSettings.Origin()).ToCString()); + case 4: return isFirstColumn ? QVariant ("OriginTransformation") + : QVariant (ViewControl_Tools::ToString (theSettings.OriginTransformation()).ToCString()); + + case 5: return isFirstColumn ? QVariant ("HasCullingDistance") : QVariant (theSettings.HasCullingDistance()); + case 6: return isFirstColumn ? QVariant ("CullingDistance") + : QVariant (theSettings.HasCullingDistance() ? theSettings.CullingDistance() : 0); + + case 7: return isFirstColumn ? QVariant ("HasCullingSize") : QVariant (theSettings.HasCullingSize()); + case 8: return isFirstColumn ? QVariant ("CullingSize") + : QVariant (theSettings.HasCullingSize() ? theSettings.CullingSize() : 0); + + case 9: return isFirstColumn ? QVariant ("IsImmediate") : QVariant (theSettings.IsImmediate()); + case 10: return isFirstColumn ? QVariant ("UseEnvironmentTexture") : QVariant (theSettings.UseEnvironmentTexture()); + case 11: return isFirstColumn ? QVariant ("ToEnableDepthTest") : QVariant (theSettings.ToEnableDepthTest()); + case 12: return isFirstColumn ? QVariant ("ToEnableDepthWrite") : QVariant (theSettings.ToEnableDepthWrite()); + case 13: return isFirstColumn ? QVariant ("ToClearDepth") : QVariant (theSettings.ToClearDepth()); + case 14: return isFirstColumn ? QVariant ("ToRenderInDepthPrepass") : QVariant (theSettings.ToRenderInDepthPrepass()); + + case 15: return isFirstColumn ? QVariant ("PolygonOffset: Mode") + : QVariant (Aspect::PolygonOffsetModeToString (theSettings.PolygonOffset().Mode)); + case 16: return isFirstColumn ? QVariant ("PolygonOffset: Factor") : QVariant (theSettings.PolygonOffset().Factor); + case 17: return isFirstColumn ? QVariant ("PolygonOffset: Units") : QVariant (theSettings.PolygonOffset().Units); + + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemOpenGlContext::createChild (int theRow, int theColumn) +{ + (void)theRow; + (void)theColumn; + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemOpenGlContext.hxx b/tools/VInspector/VInspector_ItemOpenGlContext.hxx new file mode 100644 index 0000000000..1f9d2e2b1f --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlContext.hxx @@ -0,0 +1,110 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemOpenGlContext_H +#define VInspector_ItemOpenGlContext_H + +#include +#include + +#include +#include + +class Graphic3d_Group; + +class VInspector_ItemOpenGlContext; +typedef QExplicitlySharedDataPointer VInspector_ItemOpenGlContextPtr; + +//! \class VInspector_ItemOpenGlContext +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemOpenGlContext : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemOpenGlContextPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemOpenGlContextPtr (new VInspector_ItemOpenGlContext (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemOpenGlContext() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myLayer; } + + //! Returns the current graphic3d group, init item if it was not initialized yet + //! \return graphic group + Standard_EXPORT Handle(OpenGl_Layer) GetLayer() const + { return Handle(OpenGl_Layer)::DownCast (GetObject());} + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + //! Returns table presentation of layer settings + QVariant getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const; + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemOpenGlContext(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(OpenGl_Layer) myLayer; //! current layer + Graphic3d_ZLayerId myLayerId; //! current Z layer index in OpenGl_View +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemOpenGlLayer.cxx b/tools/VInspector/VInspector_ItemOpenGlLayer.cxx new file mode 100644 index 0000000000..b9697cab9d --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlLayer.cxx @@ -0,0 +1,216 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::Init() +{ + VInspector_ItemOpenGlLayerListPtr aParentItem = itemDynamicCast(Parent()); + myLayer = aParentItem->GetLayer (Row(), myLayerId); + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::Reset() +{ + VInspector_ItemBase::Reset(); + myLayer = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlLayer::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return Column() == 0 ? "Empty element" : ""; + + switch (Column()) + { + case 0: + { + TCollection_AsciiString aLayerId = Graphic3d::ZLayerIdToString (myLayerId); + if (aLayerId.IsEmpty()) + aLayerId = TCollection_AsciiString (myLayerId); + return theItemRole == Qt::ToolTipRole ? QVariant ("") + : QVariant (QString("%1 (%2)") + .arg(aLayer->DynamicType()->Name()) + .arg (aLayerId.ToCString())); + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlLayer::GetTableRowCount() const +{ + return 40; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("NbStructures") : QVariant (aLayer->NbStructures()); + case 1: return isFirstColumn ? QVariant ("NbStructuresNotCulled") : QVariant (aLayer->NbStructuresNotCulled()); + case 2: return isFirstColumn ? QVariant ("NbPriorities") : QVariant (aLayer->NbPriorities()); + + case 3: return isFirstColumn ? QVariant ("ArrayOfStructures") : QVariant (aLayer->ArrayOfStructures().Size()); + case 4: return isFirstColumn ? QVariant ("IsCulled") : QVariant (aLayer->IsCulled()); + case 5: return isFirstColumn ? QVariant ("NbOfTransformPersistenceObjects") : QVariant (aLayer->NbOfTransformPersistenceObjects()); + + case 6: return isFirstColumn ? QVariant ("CullableStructuresBVH") : QVariant (aLayer->CullableStructuresBVH().Size()); + case 7: return isFirstColumn ? QVariant ("CullableTrsfPersStructuresBVH") : QVariant (aLayer->CullableTrsfPersStructuresBVH().Size()); + case 8: return isFirstColumn ? QVariant ("NonCullableStructures") : QVariant (aLayer->NonCullableStructures().Size()); + + default: + break; + } + + Standard_Integer aRow = theRow - 9; + return getLayerSettingsTableData (aRow, theColumn, theRole, aLayer->LayerSettings()); +} + +// ======================================================================= +// function : getLayerSettingsTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const +{ + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("LayerSettings:") : QVariant(); + case 1: return isFirstColumn ? QVariant ("Name") : QVariant (theSettings.Name().ToCString()); + case 2: return isFirstColumn ? QVariant ("Lights") : QVariant (ViewControl_Tools::GetPointerInfo (theSettings.Lights()).ToCString()); + + case 3: return isFirstColumn ? QVariant ("Origin") : QVariant (ViewControl_Tools::ToString (theSettings.Origin()).ToCString()); + case 4: return isFirstColumn ? QVariant ("OriginTransformation") + : QVariant (ViewControl_Tools::ToString (theSettings.OriginTransformation()).ToCString()); + + case 5: return isFirstColumn ? QVariant ("HasCullingDistance") : QVariant (theSettings.HasCullingDistance()); + case 6: return isFirstColumn ? QVariant ("CullingDistance") + : QVariant (theSettings.HasCullingDistance() ? theSettings.CullingDistance() : 0); + + case 7: return isFirstColumn ? QVariant ("HasCullingSize") : QVariant (theSettings.HasCullingSize()); + case 8: return isFirstColumn ? QVariant ("CullingSize") + : QVariant (theSettings.HasCullingSize() ? theSettings.CullingSize() : 0); + + case 9: return isFirstColumn ? QVariant ("IsImmediate") : QVariant (theSettings.IsImmediate()); + case 10: return isFirstColumn ? QVariant ("UseEnvironmentTexture") : QVariant (theSettings.UseEnvironmentTexture()); + case 11: return isFirstColumn ? QVariant ("ToEnableDepthTest") : QVariant (theSettings.ToEnableDepthTest()); + case 12: return isFirstColumn ? QVariant ("ToEnableDepthWrite") : QVariant (theSettings.ToEnableDepthWrite()); + case 13: return isFirstColumn ? QVariant ("ToClearDepth") : QVariant (theSettings.ToClearDepth()); + case 14: return isFirstColumn ? QVariant ("ToRenderInDepthPrepass") : QVariant (theSettings.ToRenderInDepthPrepass()); + + case 15: return isFirstColumn ? QVariant ("PolygonOffset: Mode") + : QVariant (Aspect::PolygonOffsetModeToString (theSettings.PolygonOffset().Mode)); + case 16: return isFirstColumn ? QVariant ("PolygonOffset: Factor") : QVariant (theSettings.PolygonOffset().Factor); + case 17: return isFirstColumn ? QVariant ("PolygonOffset: Units") : QVariant (theSettings.PolygonOffset().Units); + + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemOpenGlLayer::createChild (int theRow, int theColumn) +{ + (void)theRow; + (void)theColumn; + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemOpenGlLayer.hxx b/tools/VInspector/VInspector_ItemOpenGlLayer.hxx new file mode 100644 index 0000000000..b2c9546afc --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlLayer.hxx @@ -0,0 +1,110 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemOpenGlLayer_H +#define VInspector_ItemOpenGlLayer_H + +#include +#include + +#include +#include + +class Graphic3d_Group; + +class VInspector_ItemOpenGlLayer; +typedef QExplicitlySharedDataPointer VInspector_ItemOpenGlLayerPtr; + +//! \class VInspector_ItemOpenGlLayer +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemOpenGlLayer : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemOpenGlLayerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemOpenGlLayerPtr (new VInspector_ItemOpenGlLayer (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemOpenGlLayer() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myLayer; } + + //! Returns the current graphic3d group, init item if it was not initialized yet + //! \return graphic group + Standard_EXPORT Handle(OpenGl_Layer) GetLayer() const + { return Handle(OpenGl_Layer)::DownCast (GetObject());} + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + //! Returns table presentation of layer settings + QVariant getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const; + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemOpenGlLayer(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(OpenGl_Layer) myLayer; //! current layer + Graphic3d_ZLayerId myLayerId; //! current Z layer index in OpenGl_View +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemOpenGlLayerArray.cxx b/tools/VInspector/VInspector_ItemOpenGlLayerArray.cxx new file mode 100644 index 0000000000..9836ba073d --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlLayerArray.cxx @@ -0,0 +1,217 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::Init() +{ + VInspector_ItemOpenGlLayerListPtr aParentItem = itemDynamicCast(Parent()); + myLayer = aParentItem->GetLayer (Row(), myLayerId); + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::Reset() +{ + VInspector_ItemBase::Reset(); + myLayer = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlLayer::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return Column() == 0 ? "Empty element" : ""; + + switch (Column()) + { + case 0: + { + TCollection_AsciiString aLayerId = Graphic3d::ZLayerIdToString (myLayerId); + if (aLayerId.IsEmpty()) + aLayerId = TCollection_AsciiString (myLayerId); + return theItemRole == Qt::ToolTipRole ? QVariant ("") + : QVariant (QString("%1 (%2)") + .arg(aLayer->DynamicType()->Name()) + .arg (aLayerId.ToCString())); + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlLayer::GetTableRowCount() const +{ + return 40; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("NbStructures") : QVariant (aLayer->NbStructures()); + case 1: return isFirstColumn ? QVariant ("NbStructuresNotCulled") : QVariant (aLayer->NbStructuresNotCulled()); + case 2: return isFirstColumn ? QVariant ("NbPriorities") : QVariant (aLayer->NbPriorities()); + + case 3: return isFirstColumn ? QVariant ("ArrayOfStructures") : QVariant (aLayer->ArrayOfStructures().Size()); + case 4: return isFirstColumn ? QVariant ("IsCulled") : QVariant (aLayer->IsCulled()); + case 5: return isFirstColumn ? QVariant ("NbOfTransformPersistenceObjects") : QVariant (aLayer->NbOfTransformPersistenceObjects()); + + case 6: return isFirstColumn ? QVariant ("CullableStructuresBVH") : QVariant (aLayer->CullableStructuresBVH().Size()); + case 7: return isFirstColumn ? QVariant ("CullableTrsfPersStructuresBVH") : QVariant (aLayer->CullableTrsfPersStructuresBVH().Size()); + case 8: return isFirstColumn ? QVariant ("NonCullableStructures") : QVariant (aLayer->NonCullableStructures().Size()); + + default: + break; + } + + Standard_Integer aRow = theRow - 9; + return getLayerSettingsTableData (aRow, theColumn, theRole, aLayer->LayerSettings()); +} + +// ======================================================================= +// function : getLayerSettingsTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const +{ + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("LayerSettings:") : QVariant(); + case 1: return isFirstColumn ? QVariant ("Name") : QVariant (theSettings.Name().ToCString()); + case 2: return isFirstColumn ? QVariant ("Lights") : QVariant (ViewControl_Tools::GetPointerInfo (theSettings.Lights()).ToCString()); + + case 3: return isFirstColumn ? QVariant ("Origin") : QVariant (ViewControl_Tools::ToString (theSettings.Origin()).ToCString()); + case 4: return isFirstColumn ? QVariant ("OriginTransformation") + : QVariant (ViewControl_Tools::ToString (theSettings.OriginTransformation()).ToCString()); + + case 5: return isFirstColumn ? QVariant ("HasCullingDistance") : QVariant (theSettings.HasCullingDistance()); + case 6: return isFirstColumn ? QVariant ("CullingDistance") + : QVariant (theSettings.HasCullingDistance() ? theSettings.CullingDistance() : 0); + + case 7: return isFirstColumn ? QVariant ("HasCullingSize") : QVariant (theSettings.HasCullingSize()); + case 8: return isFirstColumn ? QVariant ("CullingSize") + : QVariant (theSettings.HasCullingSize() ? theSettings.CullingSize() : 0); + + case 9: return isFirstColumn ? QVariant ("IsImmediate") : QVariant (theSettings.IsImmediate()); + case 10: return isFirstColumn ? QVariant ("UseEnvironmentTexture") : QVariant (theSettings.UseEnvironmentTexture()); + case 11: return isFirstColumn ? QVariant ("ToEnableDepthTest") : QVariant (theSettings.ToEnableDepthTest()); + case 12: return isFirstColumn ? QVariant ("ToEnableDepthWrite") : QVariant (theSettings.ToEnableDepthWrite()); + case 13: return isFirstColumn ? QVariant ("ToClearDepth") : QVariant (theSettings.ToClearDepth()); + case 14: return isFirstColumn ? QVariant ("ToRenderInDepthPrepass") : QVariant (theSettings.ToRenderInDepthPrepass()); + + case 15: return isFirstColumn ? QVariant ("PolygonOffset: Mode") + : QVariant (Aspect::PolygonOffsetModeToString (theSettings.PolygonOffset().Mode)); + case 16: return isFirstColumn ? QVariant ("PolygonOffset: Factor") : QVariant (theSettings.PolygonOffset().Factor); + case 17: return isFirstColumn ? QVariant ("PolygonOffset: Units") : QVariant (theSettings.PolygonOffset().Units); + + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemOpenGlLayer::createChild (int theRow, int theColumn) +{ + (void)theRow; + (void)theColumn; + + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemOpenGlLayerArray.hxx b/tools/VInspector/VInspector_ItemOpenGlLayerArray.hxx new file mode 100644 index 0000000000..b2c9546afc --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlLayerArray.hxx @@ -0,0 +1,110 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemOpenGlLayer_H +#define VInspector_ItemOpenGlLayer_H + +#include +#include + +#include +#include + +class Graphic3d_Group; + +class VInspector_ItemOpenGlLayer; +typedef QExplicitlySharedDataPointer VInspector_ItemOpenGlLayerPtr; + +//! \class VInspector_ItemOpenGlLayer +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemOpenGlLayer : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemOpenGlLayerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemOpenGlLayerPtr (new VInspector_ItemOpenGlLayer (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemOpenGlLayer() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myLayer; } + + //! Returns the current graphic3d group, init item if it was not initialized yet + //! \return graphic group + Standard_EXPORT Handle(OpenGl_Layer) GetLayer() const + { return Handle(OpenGl_Layer)::DownCast (GetObject());} + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + //! Returns table presentation of layer settings + QVariant getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const; + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemOpenGlLayer(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(OpenGl_Layer) myLayer; //! current layer + Graphic3d_ZLayerId myLayerId; //! current Z layer index in OpenGl_View +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemOpenGlLayerList.cxx b/tools/VInspector/VInspector_ItemOpenGlLayerList.cxx new file mode 100644 index 0000000000..3812a28c3f --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlLayerList.cxx @@ -0,0 +1,197 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayerList::Init() +{ + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayerList::Reset() +{ + VInspector_ItemBase::Reset(); +} + +// ======================================================================= +// function : GetLayerList +// purpose : +// ======================================================================= +const OpenGl_LayerList& VInspector_ItemOpenGlLayerList::GetLayerList (Standard_Boolean& isDefault) const +{ + VInspector_ItemGraphic3dCViewPtr aParentItem = itemDynamicCast(Parent()); + return aParentItem->GetLayerList (isDefault); +} + +// ======================================================================= +// function : GetLayer +// purpose : +// ======================================================================= +Handle(OpenGl_Layer) VInspector_ItemOpenGlLayerList::GetLayer (const int theRow, Graphic3d_ZLayerId& theLayerId) const +{ + Standard_Boolean isDefault; + const OpenGl_LayerList& aLayerList = GetLayerList (isDefault); + + if (isDefault) + return NULL; + + Standard_Integer aLayerIndex = (int)theRow + 1; + Handle(OpenGl_Layer) aLayer = aLayerList.Layers().Value (aLayerIndex); // OpenGl_LayerSeqIds range is in [1...N] + if (aLayer.IsNull()) + return NULL; + + const OpenGl_LayerSeqIds& aLayerIDs = aLayerList.LayerIDs(); + for (OpenGl_LayerSeqIds::Iterator aMapIt (aLayerIDs); aMapIt.More(); aMapIt.Next()) + { + Standard_Integer anIndex = aMapIt.Value(); + if (anIndex != aLayerIndex) + continue; + + theLayerId = aMapIt.Key(); + } + + return aLayer; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayerList::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlLayerList::initRowCount() const +{ + if (Column() != 0) + return 0; + + Standard_Boolean isDefault; + const OpenGl_LayerList& aListOfLayers = GetLayerList (isDefault); + if (isDefault) + return 0; + + return aListOfLayers.Layers().Length(); +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayerList::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + + switch (Column()) + { + case 0: + { + Standard_Boolean isDefault; + GetLayerList (isDefault); + if (isDefault) + return 0; + + return isDefault ? "Empty layer list" : "OpenGl_LayerList"; + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlLayerList::GetTableRowCount() const +{ + return 3; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayerList::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Standard_Boolean isDefault; + const OpenGl_LayerList& aListOfLayers = GetLayerList (isDefault); + if (isDefault) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("NbPriorities") : QVariant (aListOfLayers.NbPriorities()); + case 1: return isFirstColumn ? QVariant ("NbStructures") : QVariant (aListOfLayers.NbStructures()); + case 2: return isFirstColumn ? QVariant ("NbImmediateStructures") : QVariant (aListOfLayers.NbImmediateStructures()); + + default: return QVariant(); + } + + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemOpenGlLayerList::createChild (int theRow, int theColumn) +{ + return VInspector_ItemOpenGlLayer::CreateItem (currentItem(), theRow, theColumn); +} diff --git a/tools/VInspector/VInspector_ItemOpenGlLayerList.hxx b/tools/VInspector/VInspector_ItemOpenGlLayerList.hxx new file mode 100644 index 0000000000..d08f3d8bd0 --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlLayerList.hxx @@ -0,0 +1,102 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemOpenGlLayerList_H +#define VInspector_ItemOpenGlLayerList_H + +#include +#include + +#include + +class VInspector_ItemOpenGlLayerList; +typedef QExplicitlySharedDataPointer VInspector_ItemOpenGlLayerListPtr; + +//! \class VInspector_ItemOpenGlLayerList +//! Parent item, that corresponds to OpenGl_LayerList +//! Children of the item are: +//! - OpenGl_Layer items +class VInspector_ItemOpenGlLayerList : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemOpenGlLayerListPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemOpenGlLayerListPtr (new VInspector_ItemOpenGlLayerList (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemOpenGlLayerList() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return NULL; } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns layer list if the View is OpenGl_View + //! \param isDefault flag is true if the layer is absent and the default value of this class is used + Standard_EXPORT const OpenGl_LayerList& GetLayerList (Standard_Boolean& isDefault) const; + + //! Returns layer list if the View is OpenGl_View + //! \param theLayerId index of the layer + Standard_EXPORT Handle(OpenGl_Layer) GetLayer (const int theRow, Graphic3d_ZLayerId& theLayerId) const; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemOpenGlLayerList(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemOpenGlLayerStructure.cxx b/tools/VInspector/VInspector_ItemOpenGlLayerStructure.cxx new file mode 100644 index 0000000000..9836ba073d --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlLayerStructure.cxx @@ -0,0 +1,217 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::Init() +{ + VInspector_ItemOpenGlLayerListPtr aParentItem = itemDynamicCast(Parent()); + myLayer = aParentItem->GetLayer (Row(), myLayerId); + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::Reset() +{ + VInspector_ItemBase::Reset(); + myLayer = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlLayer::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlLayer::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return Column() == 0 ? "Empty element" : ""; + + switch (Column()) + { + case 0: + { + TCollection_AsciiString aLayerId = Graphic3d::ZLayerIdToString (myLayerId); + if (aLayerId.IsEmpty()) + aLayerId = TCollection_AsciiString (myLayerId); + return theItemRole == Qt::ToolTipRole ? QVariant ("") + : QVariant (QString("%1 (%2)") + .arg(aLayer->DynamicType()->Name()) + .arg (aLayerId.ToCString())); + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlLayer::GetTableRowCount() const +{ + return 40; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("NbStructures") : QVariant (aLayer->NbStructures()); + case 1: return isFirstColumn ? QVariant ("NbStructuresNotCulled") : QVariant (aLayer->NbStructuresNotCulled()); + case 2: return isFirstColumn ? QVariant ("NbPriorities") : QVariant (aLayer->NbPriorities()); + + case 3: return isFirstColumn ? QVariant ("ArrayOfStructures") : QVariant (aLayer->ArrayOfStructures().Size()); + case 4: return isFirstColumn ? QVariant ("IsCulled") : QVariant (aLayer->IsCulled()); + case 5: return isFirstColumn ? QVariant ("NbOfTransformPersistenceObjects") : QVariant (aLayer->NbOfTransformPersistenceObjects()); + + case 6: return isFirstColumn ? QVariant ("CullableStructuresBVH") : QVariant (aLayer->CullableStructuresBVH().Size()); + case 7: return isFirstColumn ? QVariant ("CullableTrsfPersStructuresBVH") : QVariant (aLayer->CullableTrsfPersStructuresBVH().Size()); + case 8: return isFirstColumn ? QVariant ("NonCullableStructures") : QVariant (aLayer->NonCullableStructures().Size()); + + default: + break; + } + + Standard_Integer aRow = theRow - 9; + return getLayerSettingsTableData (aRow, theColumn, theRole, aLayer->LayerSettings()); +} + +// ======================================================================= +// function : getLayerSettingsTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlLayer::getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const +{ + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("LayerSettings:") : QVariant(); + case 1: return isFirstColumn ? QVariant ("Name") : QVariant (theSettings.Name().ToCString()); + case 2: return isFirstColumn ? QVariant ("Lights") : QVariant (ViewControl_Tools::GetPointerInfo (theSettings.Lights()).ToCString()); + + case 3: return isFirstColumn ? QVariant ("Origin") : QVariant (ViewControl_Tools::ToString (theSettings.Origin()).ToCString()); + case 4: return isFirstColumn ? QVariant ("OriginTransformation") + : QVariant (ViewControl_Tools::ToString (theSettings.OriginTransformation()).ToCString()); + + case 5: return isFirstColumn ? QVariant ("HasCullingDistance") : QVariant (theSettings.HasCullingDistance()); + case 6: return isFirstColumn ? QVariant ("CullingDistance") + : QVariant (theSettings.HasCullingDistance() ? theSettings.CullingDistance() : 0); + + case 7: return isFirstColumn ? QVariant ("HasCullingSize") : QVariant (theSettings.HasCullingSize()); + case 8: return isFirstColumn ? QVariant ("CullingSize") + : QVariant (theSettings.HasCullingSize() ? theSettings.CullingSize() : 0); + + case 9: return isFirstColumn ? QVariant ("IsImmediate") : QVariant (theSettings.IsImmediate()); + case 10: return isFirstColumn ? QVariant ("UseEnvironmentTexture") : QVariant (theSettings.UseEnvironmentTexture()); + case 11: return isFirstColumn ? QVariant ("ToEnableDepthTest") : QVariant (theSettings.ToEnableDepthTest()); + case 12: return isFirstColumn ? QVariant ("ToEnableDepthWrite") : QVariant (theSettings.ToEnableDepthWrite()); + case 13: return isFirstColumn ? QVariant ("ToClearDepth") : QVariant (theSettings.ToClearDepth()); + case 14: return isFirstColumn ? QVariant ("ToRenderInDepthPrepass") : QVariant (theSettings.ToRenderInDepthPrepass()); + + case 15: return isFirstColumn ? QVariant ("PolygonOffset: Mode") + : QVariant (Aspect::PolygonOffsetModeToString (theSettings.PolygonOffset().Mode)); + case 16: return isFirstColumn ? QVariant ("PolygonOffset: Factor") : QVariant (theSettings.PolygonOffset().Factor); + case 17: return isFirstColumn ? QVariant ("PolygonOffset: Units") : QVariant (theSettings.PolygonOffset().Units); + + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemOpenGlLayer::createChild (int theRow, int theColumn) +{ + (void)theRow; + (void)theColumn; + + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemOpenGlLayerStructure.hxx b/tools/VInspector/VInspector_ItemOpenGlLayerStructure.hxx new file mode 100644 index 0000000000..b2c9546afc --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlLayerStructure.hxx @@ -0,0 +1,110 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemOpenGlLayer_H +#define VInspector_ItemOpenGlLayer_H + +#include +#include + +#include +#include + +class Graphic3d_Group; + +class VInspector_ItemOpenGlLayer; +typedef QExplicitlySharedDataPointer VInspector_ItemOpenGlLayerPtr; + +//! \class VInspector_ItemOpenGlLayer +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemOpenGlLayer : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemOpenGlLayerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemOpenGlLayerPtr (new VInspector_ItemOpenGlLayer (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemOpenGlLayer() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myLayer; } + + //! Returns the current graphic3d group, init item if it was not initialized yet + //! \return graphic group + Standard_EXPORT Handle(OpenGl_Layer) GetLayer() const + { return Handle(OpenGl_Layer)::DownCast (GetObject());} + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + //! Returns table presentation of layer settings + QVariant getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const; + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemOpenGlLayer(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(OpenGl_Layer) myLayer; //! current layer + Graphic3d_ZLayerId myLayerId; //! current Z layer index in OpenGl_View +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemOpenGlWindow.cxx b/tools/VInspector/VInspector_ItemOpenGlWindow.cxx new file mode 100644 index 0000000000..a8d9063e57 --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlWindow.cxx @@ -0,0 +1,216 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +//#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlWindow::Init() +{ + //VInspector_ItemOpenGlWindowListPtr aParentItem = itemDynamicCast(Parent()); + //myLayer = aParentItem->GetLayer (Row(), myLayerId); + + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlWindow::Reset() +{ + VInspector_ItemBase::Reset(); + myLayer = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemOpenGlWindow::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlWindow::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlWindow::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return Column() == 0 ? "Empty element" : ""; + + switch (Column()) + { + case 0: + { + TCollection_AsciiString aLayerId = Graphic3d::ZLayerIdToString (myLayerId); + if (aLayerId.IsEmpty()) + aLayerId = TCollection_AsciiString (myLayerId); + return theItemRole == Qt::ToolTipRole ? QVariant ("") + : QVariant (QString("%1 (%2)") + .arg(aLayer->DynamicType()->Name()) + .arg (aLayerId.ToCString())); + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemOpenGlWindow::GetTableRowCount() const +{ + return 40; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlWindow::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(OpenGl_Layer) aLayer = GetLayer(); + if (aLayer.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("NbStructures") : QVariant (aLayer->NbStructures()); + case 1: return isFirstColumn ? QVariant ("NbStructuresNotCulled") : QVariant (aLayer->NbStructuresNotCulled()); + case 2: return isFirstColumn ? QVariant ("NbPriorities") : QVariant (aLayer->NbPriorities()); + + case 3: return isFirstColumn ? QVariant ("ArrayOfStructures") : QVariant (aLayer->ArrayOfStructures().Size()); + case 4: return isFirstColumn ? QVariant ("IsCulled") : QVariant (aLayer->IsCulled()); + case 5: return isFirstColumn ? QVariant ("NbOfTransformPersistenceObjects") : QVariant (aLayer->NbOfTransformPersistenceObjects()); + + case 6: return isFirstColumn ? QVariant ("CullableStructuresBVH") : QVariant (aLayer->CullableStructuresBVH().Size()); + case 7: return isFirstColumn ? QVariant ("CullableTrsfPersStructuresBVH") : QVariant (aLayer->CullableTrsfPersStructuresBVH().Size()); + case 8: return isFirstColumn ? QVariant ("NonCullableStructures") : QVariant (aLayer->NonCullableStructures().Size()); + + default: + break; + } + + Standard_Integer aRow = theRow - 9; + return getLayerSettingsTableData (aRow, theColumn, theRole, aLayer->LayerSettings()); +} + +// ======================================================================= +// function : getLayerSettingsTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemOpenGlWindow::getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const +{ + bool isFirstColumn = theColumn == 0; + + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("LayerSettings:") : QVariant(); + case 1: return isFirstColumn ? QVariant ("Name") : QVariant (theSettings.Name().ToCString()); + case 2: return isFirstColumn ? QVariant ("Lights") : QVariant (ViewControl_Tools::GetPointerInfo (theSettings.Lights()).ToCString()); + + case 3: return isFirstColumn ? QVariant ("Origin") : QVariant (ViewControl_Tools::ToString (theSettings.Origin()).ToCString()); + case 4: return isFirstColumn ? QVariant ("OriginTransformation") + : QVariant (ViewControl_Tools::ToString (theSettings.OriginTransformation()).ToCString()); + + case 5: return isFirstColumn ? QVariant ("HasCullingDistance") : QVariant (theSettings.HasCullingDistance()); + case 6: return isFirstColumn ? QVariant ("CullingDistance") + : QVariant (theSettings.HasCullingDistance() ? theSettings.CullingDistance() : 0); + + case 7: return isFirstColumn ? QVariant ("HasCullingSize") : QVariant (theSettings.HasCullingSize()); + case 8: return isFirstColumn ? QVariant ("CullingSize") + : QVariant (theSettings.HasCullingSize() ? theSettings.CullingSize() : 0); + + case 9: return isFirstColumn ? QVariant ("IsImmediate") : QVariant (theSettings.IsImmediate()); + case 10: return isFirstColumn ? QVariant ("UseEnvironmentTexture") : QVariant (theSettings.UseEnvironmentTexture()); + case 11: return isFirstColumn ? QVariant ("ToEnableDepthTest") : QVariant (theSettings.ToEnableDepthTest()); + case 12: return isFirstColumn ? QVariant ("ToEnableDepthWrite") : QVariant (theSettings.ToEnableDepthWrite()); + case 13: return isFirstColumn ? QVariant ("ToClearDepth") : QVariant (theSettings.ToClearDepth()); + case 14: return isFirstColumn ? QVariant ("ToRenderInDepthPrepass") : QVariant (theSettings.ToRenderInDepthPrepass()); + + case 15: return isFirstColumn ? QVariant ("PolygonOffset: Mode") + : QVariant (Aspect::PolygonOffsetModeToString (theSettings.PolygonOffset().Mode)); + case 16: return isFirstColumn ? QVariant ("PolygonOffset: Factor") : QVariant (theSettings.PolygonOffset().Factor); + case 17: return isFirstColumn ? QVariant ("PolygonOffset: Units") : QVariant (theSettings.PolygonOffset().Units); + + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemOpenGlWindow::createChild (int theRow, int theColumn) +{ + (void)theRow; + (void)theColumn; + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemOpenGlWindow.hxx b/tools/VInspector/VInspector_ItemOpenGlWindow.hxx new file mode 100644 index 0000000000..bcc6f46a0c --- /dev/null +++ b/tools/VInspector/VInspector_ItemOpenGlWindow.hxx @@ -0,0 +1,110 @@ +// Created on: 2019-03-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemOpenGlWindow_H +#define VInspector_ItemOpenGlWindow_H + +#include +#include + +#include +#include + +class Graphic3d_Group; + +class VInspector_ItemOpenGlWindow; +typedef QExplicitlySharedDataPointer VInspector_ItemOpenGlWindowPtr; + +//! \class VInspector_ItemOpenGlWindow +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemOpenGlWindow : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemOpenGlWindowPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemOpenGlWindowPtr (new VInspector_ItemOpenGlWindow (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemOpenGlWindow() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myLayer; } + + //! Returns the current graphic3d group, init item if it was not initialized yet + //! \return graphic group + Standard_EXPORT Handle(OpenGl_Layer) GetLayer() const + { return Handle(OpenGl_Layer)::DownCast (GetObject());} + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It creates a backup of the specific item information + //! Do nothing as context has been already set into item + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + //! Returns table presentation of layer settings + QVariant getLayerSettingsTableData (const int theRow, const int theColumn, const int theRole, + const Graphic3d_ZLayerSettings& theSettings) const; + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemOpenGlWindow(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + Handle(OpenGl_Layer) myLayer; //! current layer + Graphic3d_ZLayerId myLayerId; //! current Z layer index in OpenGl_View +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemPresentableObject.cxx b/tools/VInspector/VInspector_ItemPresentableObject.cxx index e1747f7f3f..a66255ca63 100644 --- a/tools/VInspector/VInspector_ItemPresentableObject.cxx +++ b/tools/VInspector/VInspector_ItemPresentableObject.cxx @@ -15,19 +15,30 @@ #include +#include #include #include #include +#include + #include -#include -#include +#include +#include +#include +#include #include #include +#include +#include +#include + +#include #include #include #include -#include +#include +#include #include #include @@ -42,15 +53,9 @@ // ======================================================================= QVariant VInspector_ItemPresentableObject::initValue (int theItemRole) const { - if (Column() == 20 && theItemRole == Qt::BackgroundRole) { - Handle(AIS_InteractiveObject) anIO = GetInteractiveObject(); - if (!anIO.IsNull() && anIO->HasColor()) - { - Quantity_Color aColor; - anIO->Color(aColor); - return QColor ((int)(aColor.Red()*255.), (int)(aColor.Green()*255.), (int)(aColor.Blue()*255.)); - } - } + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; if (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole) { @@ -67,45 +72,11 @@ QVariant VInspector_ItemPresentableObject::initValue (int theItemRole) const return theItemRole == Qt::ToolTipRole ? QVariant ("") : QVariant (anIO->DynamicType()->Name()); } - case 1: - return rowCount(); - case 2: - { - if (!aNullIO) - return VInspector_Tools::GetPointerInfo (anIO, true).ToCString(); - break; - } - case 3: - { - Handle(AIS_Shape) aShapeIO = Handle(AIS_Shape)::DownCast (anIO); - if (!aShapeIO.IsNull()) - { - const TopoDS_Shape& aShape = aShapeIO->Shape(); - if (!aShape.IsNull()) - return VInspector_Tools::GetShapeTypeInfo (aShape.ShapeType()).ToCString(); - } - break; - } case 4: { int aNbSelected = VInspector_Tools::SelectedOwners (GetContext(), anIO, false); return aNbSelected > 0 ? QString::number (aNbSelected) : ""; } - case 5: - { - TColStd_ListOfInteger aModes; - Handle(AIS_InteractiveContext) aContext = GetContext(); - aContext->ActivatedModes(anIO, aModes); - TCollection_AsciiString aModesInfo; - for (TColStd_ListIteratorOfListOfInteger itr (aModes); itr.More(); itr.Next()) - { - if (!aModesInfo.IsEmpty()) - aModesInfo += ", "; - aModesInfo += VInspector_Tools::GetShapeTypeInfo (AIS_Shape::SelectionType(itr.Value())); - } - return aModesInfo.ToCString(); - } - break; case 6: { double aDeviationCoefficient = 0; @@ -117,18 +88,6 @@ QVariant VInspector_ItemPresentableObject::initValue (int theItemRole) const } return QString::number(aDeviationCoefficient); } - case 7: - { - double aShapeDeflection = 0; - Handle(AIS_Shape) aShapeIO = Handle(AIS_Shape)::DownCast (anIO); - if (!aShapeIO.IsNull()) - { - const TopoDS_Shape& aShape = aShapeIO->Shape(); - if (!aShape.IsNull()) - aShapeDeflection = Prs3d::GetDeflection(aShape, anIO->Attributes()); - } - return QString::number (aShapeDeflection); - } case 8: { double aDeviationCoefficient = 0; @@ -142,21 +101,6 @@ QVariant VInspector_ItemPresentableObject::initValue (int theItemRole) const bool anIsAutoTriangulation = aNullIO ? false : anIO->Attributes()->IsAutoTriangulation(); return anIsAutoTriangulation ? QString ("true") : QString ("false"); } - case 17: - case 18: - case 19: - { - Handle(AIS_Shape) aShapeIO = Handle(AIS_Shape)::DownCast (anIO); - if (aShapeIO.IsNull()) - return QVariant(); - const TopoDS_Shape& aShape = aShapeIO->Shape(); - if (aShape.IsNull()) - return QVariant(); - - return Column() == 17 ? VInspector_Tools::GetPointerInfo (aShape.TShape(), true).ToCString() - : Column() == 18 ? VInspector_Tools::OrientationToName (aShape.Orientation()).ToCString() - : /*19*/ VInspector_Tools::LocationToName (aShape.Location()).ToCString(); - } default: break; } } @@ -192,6 +136,11 @@ QVariant VInspector_ItemPresentableObject::initValue (int theItemRole) const // ======================================================================= int VInspector_ItemPresentableObject::initRowCount() const { + if (Column() != 0) + return 0; + + int aNbProperties = 2; // "Properties", "Presentations" + Handle(AIS_InteractiveObject) anIO = GetInteractiveObject(); #if OCC_VERSION_HEX < 0x070201 int aRows = 0; @@ -200,12 +149,12 @@ int VInspector_ItemPresentableObject::initRowCount() const // iteration through sensitive privitives for (anIO->Init(); anIO->More(); anIO->Next()) aRows++; - return aRows; + int aNbSelected = aRows; #else - return !anIO.IsNull() - ? anIO->Selections().Size() - : 0; + int aNbSelected = !anIO.IsNull() ? anIO->Selections().Size() : 0; #endif + + return aNbProperties + aNbSelected; } // ======================================================================= @@ -214,7 +163,12 @@ int VInspector_ItemPresentableObject::initRowCount() const // ======================================================================= TreeModel_ItemBasePtr VInspector_ItemPresentableObject::createChild (int theRow, int theColumn) { - return VInspector_ItemSelection::CreateItem(currentItem(), theRow, theColumn); + if (theRow == 0) + return VInspector_ItemFolderObject::CreateItem (currentItem(), theRow, theColumn); + if (theRow == 1) + return VInspector_ItemPresentations::CreateItem (currentItem(), theRow, theColumn); + else + return VInspector_ItemSelectMgrSelection::CreateItem(currentItem(), theRow, theColumn); } // ======================================================================= @@ -246,6 +200,8 @@ void VInspector_ItemPresentableObject::Init() } setInteractiveObject (anIO); + myTransformPersistence = anIO->TransformPersistence(); + UpdatePresentationShape(); TreeModel_ItemBase::Init(); // to use getIO() without circling initialization } @@ -259,6 +215,7 @@ void VInspector_ItemPresentableObject::Reset() SetContext (NULL); setInteractiveObject (NULL); + myTransformPersistence = NULL; } // ======================================================================= @@ -273,13 +230,20 @@ void VInspector_ItemPresentableObject::initItem() const } // ======================================================================= -// function : GetInteractiveObject +// function : buildPresentationShape // purpose : // ======================================================================= -Handle(AIS_InteractiveObject) VInspector_ItemPresentableObject::GetInteractiveObject() const +TopoDS_Shape VInspector_ItemPresentableObject::buildPresentationShape() { - initItem(); - return myIO; + Handle(AIS_InteractiveObject) aPrs = myIO; + if (aPrs.IsNull()) + return TopoDS_Shape(); + + Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast (aPrs); + if (!aShapePrs.IsNull()) + return aShapePrs->Shape(); + + return TopoDS_Shape(); } // ======================================================================= @@ -292,40 +256,225 @@ QString VInspector_ItemPresentableObject::PointerInfo() const } // ======================================================================= -// function : GetSelectedPresentations +// function : GetPresentations +// purpose : +// ======================================================================= +void VInspector_ItemPresentableObject::GetPresentations (NCollection_List& thePresentations) +{ + if (Column() != 0) + return; + + thePresentations.Append (GetInteractiveObject()); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemPresentableObject::GetTableRowCount() const +{ + return 36; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemPresentableObject::GetTableEditType (const int theRow, const int) const +{ + switch (theRow) + { + case 3: return ViewControl_EditType_Combo; + case 6: return ViewControl_EditType_Combo; + case 8: return ViewControl_EditType_Bool; + case 13: return ViewControl_EditType_Color; + case 15: return ViewControl_EditType_Line; + case 17: return ViewControl_EditType_Combo; + case 18: return ViewControl_EditType_Line; + + case 29: return ViewControl_EditType_Combo; + case 30: return ViewControl_EditType_Bool; + case 32: return ViewControl_EditType_Combo; + case 35: return ViewControl_EditType_Bool; + default: return ViewControl_EditType_None; + } +} + +// ======================================================================= +// function : GetTableEnumValues // purpose : // ======================================================================= -NCollection_List VInspector_ItemPresentableObject::GetSelectedPresentations - (QItemSelectionModel* theSelectionModel) +QList VInspector_ItemPresentableObject::GetTableEnumValues (const int theRow, const int) const { - NCollection_List aResultList; - if (!theSelectionModel) - return aResultList; - - QList anItems; - - QModelIndexList anIndices = theSelectionModel->selectedIndexes(); - for (QModelIndexList::const_iterator anIndicesIt = anIndices.begin(); anIndicesIt != anIndices.end(); anIndicesIt++) + QList aValues; + switch (theRow) { - TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex (*anIndicesIt); - if (!anItem || anItems.contains (anItem)) - continue; - anItems.append (anItem); + case 3: + { + for (int i = 0; i <= AIS_KOI_Dimension; i++) + aValues.append (AIS::KindOfInteractiveToString((AIS_KindOfInteractive)i)); + } + break; + case 6: + { + for (int i = 0; i <= Aspect_TOFM_FRONT_SIDE; i++) + aValues.append (Aspect::TypeOfFacingModelToString((Aspect_TypeOfFacingModel)i)); + } + break; + case 17: + { + for (int i = 0; i <= Graphic3d_NOM_UserDefined; i++) + aValues.append (Graphic3d::NameOfMaterialToString ((Graphic3d_NameOfMaterial)i)); + } + break; + case 29: + { + for (int i = 0; i <= PrsMgr_TOP_ProjectorDependant; i++) + aValues.append (PrsMgr::TypeOfPresentation3dToString ((PrsMgr_TypeOfPresentation3d)i)); + } + break; + case 32: + { + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_UNKNOWN)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Default)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Top)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Topmost)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_TopOSD)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_BotOSD)); + } + break; + default: break; } + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemPresentableObject::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + bool isFirstColumn = theColumn == 0; + if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole || + (theRole == Qt::BackgroundRole && (isFirstColumn || theRow != 13))) + return QVariant(); - QList aSelectedIds; // Remember of selected address in order to avoid duplicates - for (QList::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++) + Handle(AIS_InteractiveObject) aPrs = GetInteractiveObject(); + switch (theRow) { - TreeModel_ItemBasePtr anItem = *anItemIt; - VInspector_ItemPresentableObjectPtr aPrsItem = itemDynamicCast(anItem); - if (!aPrsItem) - continue; - Handle(AIS_InteractiveObject) aPresentation = aPrsItem->GetInteractiveObject(); - if (aSelectedIds.contains ((size_t)aPresentation.operator->())) - continue; - aSelectedIds.append ((size_t)aPresentation.operator->()); - if (!aPresentation.IsNull()) - aResultList.Append (aPresentation); + case 0: return ViewControl_Table::SeparatorData(); + case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (AIS_InteractiveObject)->Name()) + : ViewControl_Tools::GetPointerInfo (aPrs).ToCString(); + case 2: return ViewControl_Table::SeparatorData(); + case 3: return isFirstColumn ? QVariant("Type") + : QVariant (AIS::KindOfInteractiveToString (aPrs->Type())); + case 4: return isFirstColumn ? QVariant("Signature") : QVariant (aPrs->Signature()); + + case 5: return isFirstColumn ? QVariant("AcceptShapeDecomposition") : QVariant (aPrs->AcceptShapeDecomposition()); + case 6: return isFirstColumn ? QVariant ("CurrentFacingModel") + : QVariant (Aspect::TypeOfFacingModelToString (aPrs->CurrentFacingModel())); + case 7: return isFirstColumn ? QVariant ("DefaultDisplayMode") : QVariant (aPrs->DefaultDisplayMode()); + case 8: return isFirstColumn ? QVariant ("IsInfinite") : QVariant (aPrs->IsInfinite()); + case 9: return isFirstColumn ? QVariant ("Owner") + : (aPrs->GetOwner().IsNull() ? QVariant("") : ViewControl_Tools::GetPointerInfo (aPrs).ToCString()); + case 10: return isFirstColumn ? QVariant ("DisplayMode") : QVariant (aPrs->DisplayMode()); + case 11: return isFirstColumn ? QVariant ("HilightMode") : QVariant (aPrs->HilightMode()); + + case 12: return isFirstColumn ? QVariant ("HasColor") : QVariant (aPrs->HasColor()); + case 13: + { + if (isFirstColumn) + return QVariant ("Color"); + Quantity_Color aColor; + aPrs->Color(aColor); + return ViewControl_ColorSelector::ColorToQColor (aColor); + } + case 14: return isFirstColumn ? QVariant ("HasWidth") : QVariant (aPrs->HasWidth()); + case 15: return isFirstColumn ? QVariant ("Width") : QVariant (aPrs->Width()); + case 16: return isFirstColumn ? QVariant ("HasMaterial") : QVariant (aPrs->HasMaterial()); + case 17: return isFirstColumn ? QVariant ("Material") + : QVariant (Graphic3d::NameOfMaterialToString (aPrs->Material())); + case 18: return isFirstColumn ? QVariant ("Transparency") : QVariant (aPrs->Transparency()); + case 19: + { + if (isFirstColumn) + return QVariant ("PolygonOffsets"); + Standard_Integer aMode; + Standard_ShortReal aFactor, aUnits; + aPrs->PolygonOffsets (aMode, aFactor, aUnits); + return QString("Mode: %1, Factor: %2, Units: %3").arg (aMode).arg (aFactor).arg (aUnits); + } + case 20: return ViewControl_Table::SeparatorData(); + case 21: return isFirstColumn ? QVariant (STANDARD_TYPE (SelectMgr_SelectableObject)->Name()) + : ViewControl_Tools::GetPointerInfo (aPrs).ToCString(); + case 22: return ViewControl_Table::SeparatorData(); + case 23: return isFirstColumn ? QVariant ("IsAutoHilight") : QVariant (aPrs->IsAutoHilight()); + case 24: return isFirstColumn ? QVariant ("GlobalSelectionMode") : QVariant (aPrs->GlobalSelectionMode()); + case 25: + { + if (isFirstColumn) + return QVariant ("BoundingBox"); + Bnd_Box aBndBox; + aPrs->BoundingBox (aBndBox); + return ViewControl_Tools::ToString (aBndBox).ToCString(); + } + case 26: return ViewControl_Table::SeparatorData(); + case 27: return isFirstColumn ? QVariant (STANDARD_TYPE (PrsMgr_PresentableObject)->Name()) + : ViewControl_Tools::GetPointerInfo (aPrs).ToCString(); + case 28: return ViewControl_Table::SeparatorData(); + case 29: return isFirstColumn ? QVariant ("TypeOfPresentation3d") + : QVariant (PrsMgr::TypeOfPresentation3dToString (aPrs->TypeOfPresentation3d())); + case 30: return isFirstColumn ? QVariant ("IsMutable") : QVariant (aPrs->IsMutable()); + case 31: return isFirstColumn ? QVariant ("HasOwnPresentations") : QVariant (aPrs->HasOwnPresentations()); + case 32: return isFirstColumn ? QVariant ("ZLayer") : QVariant (Graphic3d::ZLayerIdToString (aPrs->ZLayer())); + case 33: return isFirstColumn ? QVariant ("TransformationGeom") + : QVariant (ViewControl_Tools::ToString(aPrs->TransformationGeom()).ToCString()); + case 34: return isFirstColumn ? QVariant ("LocalTransformationGeom") + : (!aPrs->LocalTransformationGeom().IsNull() + ? QVariant (ViewControl_Tools::ToString(aPrs->LocalTransformationGeom()->Trsf()).ToCString()) : QVariant()); + case 35: return isFirstColumn ? QVariant ("ResetTransformation") : (!aPrs->LocalTransformationGeom().IsNull()); + default: return QVariant(); + } +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemPresentableObject::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + Handle(AIS_InteractiveObject) aPrs = GetInteractiveObject(); + switch (theRow) + { + case 6: aPrs->SetCurrentFacingModel (Aspect::TypeOfFacingModelFromString (theValue.toString().toStdString().c_str())); break; + case 8: aPrs->SetInfiniteState (theValue.toBool()); break; + case 15: + { + double aValue = theValue.toDouble(); + if (aValue > 0) aPrs->SetWidth (aValue); + else aPrs->UnsetWidth(); + } + break; + case 13: + { + float anAlpha; + aPrs->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString(), anAlpha)); + } + break; + case 17: aPrs->SetMaterial (Graphic3d::NameOfMaterialFromString (theValue.toString().toStdString().c_str())); break; + case 18: + { + double aValue = theValue.toDouble(); + if (aValue > 0 && aValue < 1) + aPrs->SetTransparency(theValue.toDouble()); + } + break; + case 23: aPrs->SetAutoHilight(theValue.toBool()); break; + case 29: aPrs->SetTypeOfPresentation (PrsMgr::TypeOfPresentation3dFromString (theValue.toString().toStdString().c_str())); break; + case 30: aPrs->SetMutable (theValue.toBool()); break; + case 32: aPrs->SetZLayer (Graphic3d::ZLayerIdFromString (theValue.toString().toStdString().c_str())); break; + case 35: if (!theValue.toBool()) aPrs->ResetTransformation(); break; + default: return false; } - return aResultList; + return true; } diff --git a/tools/VInspector/VInspector_ItemPresentableObject.hxx b/tools/VInspector/VInspector_ItemPresentableObject.hxx index ed5765200f..6f1fab2a4d 100644 --- a/tools/VInspector/VInspector_ItemPresentableObject.hxx +++ b/tools/VInspector/VInspector_ItemPresentableObject.hxx @@ -41,9 +41,14 @@ public: //! Destructor virtual ~VInspector_ItemPresentableObject() Standard_OVERRIDE {}; + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myIO; } + //! Returns the current interactive object, init item if it was not initialized yet //! \return interactive object - Standard_EXPORT Handle(AIS_InteractiveObject) GetInteractiveObject() const; + Standard_EXPORT Handle(AIS_InteractiveObject) GetInteractiveObject() const + { return Handle(AIS_InteractiveObject)::DownCast (GetObject()); } //! Returns pointer information for the current interactive object, init item if it was not initialized yet //! \return string value @@ -55,11 +60,36 @@ public: //! Resets cached values Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - //! Returns presentations, which items are selected in tree view - //! \param theSelectionModel a selection model - //! \return container of presentations - Standard_EXPORT static NCollection_List GetSelectedPresentations - (QItemSelectionModel* theSelectionModel); + //! Returns presentation of the attribute to be visualized in the view + //! \thePresentations [out] container of presentation handles to be visualized + Standard_EXPORT virtual void GetPresentations (NCollection_List& thePresentations); + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; protected: @@ -81,7 +111,10 @@ protected: //! \return the created item virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE; -private: +protected: + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; //! Set interactive object into the current field //! \param theIO a presentation diff --git a/tools/VInspector/VInspector_ItemPresentations.cxx b/tools/VInspector/VInspector_ItemPresentations.cxx new file mode 100644 index 0000000000..a90383eef6 --- /dev/null +++ b/tools/VInspector/VInspector_ItemPresentations.cxx @@ -0,0 +1,154 @@ +// 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 + +#include +#include + +#include +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemPresentations::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (Column() != 0 || (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole)) + return QVariant(); + + return "Presentations"; +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemPresentations::initRowCount() const +{ + if (Column() != 0) + return 0; + + VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast(Parent()); + if (!aParentPrsItem) + return 0; + + Handle(AIS_InteractiveObject) aPresentation = aParentPrsItem->GetInteractiveObject(); + + int aNbProperties = 0; + if (!aPresentation->GetSelectPresentation (GetContext()->MainPrsMgr()).IsNull()) + aNbProperties++; + + if (!aPresentation->GetHilightPresentation (GetContext()->MainPrsMgr()).IsNull()) + aNbProperties++; + + for (PrsMgr_Presentations::Iterator aPrsIter (aPresentation->Presentations()); aPrsIter.More(); aPrsIter.Next()) + { + const Handle(PrsMgr_Presentation)& aPrs3d = aPrsIter.ChangeValue(); + if (!aPrs3d.IsNull()) + aNbProperties++; + } + return aNbProperties; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemPresentations::createChild (int theRow, int theColumn) +{ + return VInspector_ItemPrs3dPresentation::CreateItem (currentItem(), theRow, theColumn); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemPresentations::Init() +{ + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemPresentations::Reset() +{ + VInspector_ItemBase::Reset(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemPresentations::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetPresentation +// purpose : +// ======================================================================= +Handle(Prs3d_Presentation) VInspector_ItemPresentations::GetPresentation (const int theRowId, + TCollection_AsciiString& theName) const +{ + VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast(Parent()); + if (!aParentPrsItem) + return 0; + + Handle(AIS_InteractiveObject) aPresentation = aParentPrsItem->GetInteractiveObject(); + + bool aHasSelectedPresentation = !aPresentation->GetSelectPresentation (NULL).IsNull(); + if (aHasSelectedPresentation && theRowId == 0) + { + theName = "SelectPresentation"; + return aPresentation->GetSelectPresentation (NULL); + } + + bool aHasHilightPresentation = !aPresentation->GetHilightPresentation (NULL).IsNull(); + if (aHasHilightPresentation && ((aHasSelectedPresentation && theRowId == 1) || !aHasSelectedPresentation && theRowId == 0)) + { + theName = "HilightPresentation"; + return aPresentation->GetHilightPresentation (NULL); + } + + int aNextPresentationIndex = aHasSelectedPresentation ? 1 : 0; + if (aHasHilightPresentation) + aNextPresentationIndex++; + + int aCurrentIndex = 0; + for (PrsMgr_Presentations::Iterator aPrsIter (aPresentation->Presentations()); aPrsIter.More(); aPrsIter.Next()) + { + const Handle(PrsMgr_Presentation)& aPrs3d = aPrsIter.ChangeValue(); + if (aPrs3d.IsNull()) + continue; + if (theRowId - aNextPresentationIndex == aCurrentIndex) + { + theName = "";//QString ("Prs3d_Presentation (mode = %1)").arg (aPrsIter.ChangeValue().Mode()).toStdString().c_str(); + return aPrs3d; + } + aCurrentIndex++; + } + return Handle(Prs3d_Presentation)(); +} diff --git a/tools/VInspector/VInspector_ItemPresentations.hxx b/tools/VInspector/VInspector_ItemPresentations.hxx new file mode 100644 index 0000000000..134302d514 --- /dev/null +++ b/tools/VInspector/VInspector_ItemPresentations.hxx @@ -0,0 +1,81 @@ +// 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 VInspector_ItemPresentations_H +#define VInspector_ItemPresentations_H + +#include +#include + +#include +#include + +class VInspector_ItemPresentations; +typedef QExplicitlySharedDataPointer VInspector_ItemPresentationsPtr; + +//! \class VInspector_ItemPresentations +//! Item presents information about AIS_InteractiveObject. +//! Parent is item context, children are item selections. +class VInspector_ItemPresentations : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemPresentationsPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemPresentationsPtr (new VInspector_ItemPresentations (theParent, theRow, theColumn)); } + //! Destructor + virtual ~VInspector_ItemPresentations() Standard_OVERRIDE {}; + + //! Returns presentation of the parent interactive object + //! \return presentation object + Standard_EXPORT Handle(Prs3d_Presentation) GetPresentation (const int theRowId, TCollection_AsciiString& theName) const; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of item selected + //! \return rows count + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) 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; + +private: + + //! Constructor + //! param theParent a parent item + VInspector_ItemPresentations(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemPrs3dAspect.cxx b/tools/VInspector/VInspector_ItemPrs3dAspect.cxx new file mode 100644 index 0000000000..6f40a868a6 --- /dev/null +++ b/tools/VInspector/VInspector_ItemPrs3dAspect.cxx @@ -0,0 +1,1288 @@ +// Created on: 2018-08-26 +// 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 +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +int GetMaterialRows() { return 25; } + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= + +QVariant VInspector_ItemPrs3dAspect::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole) + { + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + bool aNullAspect = anAspect.IsNull(); + switch (Column()) + { + case 0: + { + return theItemRole == Qt::ToolTipRole + ? (aNullAspect ? QVariant("Prs3d_BasicAspect is empty") : QVariant (anAspect->DynamicType()->Name())) + : QVariant (myName.ToCString()); + } + default: break; + } + } + if (theItemRole == Qt::ForegroundRole) + { + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + bool aNullAspect = anAspect.IsNull(); + if (aNullAspect) return QColor (Qt::lightGray); + + VInspector_ItemPrs3dDrawerPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + { + Handle(Prs3d_Drawer) aDrawer = aParentItem->GetDrawer(); + if (aDrawer->Link().IsNull()) + return QVariant(); // default color + + TCollection_AsciiString aName; + Standard_Boolean isOwnAspect; + aParentItem->GetPrs3dAspect(Row(), aName, isOwnAspect); + if (!isOwnAspect) + return QColor (Qt::lightGray); + } + else + { + VInspector_ItemPrs3dAspectPtr aParentAspectItem = itemDynamicCast(Parent()); + if (aParentAspectItem) + return aParentAspectItem->initValue (theItemRole); + } + } + return QVariant(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= + +int VInspector_ItemPrs3dAspect::initRowCount() const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return 0; + + Standard_CString anAspectKind = anAspect->DynamicType()->Name(); + if (anAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name()) + return 3 + 2 * (int) Prs3d_DP_None; + else if (anAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name()) + return 3; + else if (anAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name()) + return 3; + + return 0; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= + +TreeModel_ItemBasePtr VInspector_ItemPrs3dAspect::createChild (int theRow, int theColumn) +{ + return VInspector_ItemPrs3dAspect::CreateItem (currentItem(), theRow, theColumn); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemPrs3dAspect::Init() +{ + TCollection_AsciiString aName; + Handle(Prs3d_BasicAspect) anAspect; + VInspector_ItemPrs3dDrawerPtr aParentItem = itemDynamicCast(Parent()); + + if (aParentItem) + { + Standard_Boolean isOwnAspect; + anAspect = aParentItem->GetPrs3dAspect(Row(), aName, isOwnAspect); + } + else + { + VInspector_ItemPrs3dAspectPtr aParentAspectItem = itemDynamicCast(Parent()); + Standard_Boolean isOwnAspect; + anAspect = aParentAspectItem->GetPrs3dAspect(Row(), aName, isOwnAspect); + } + + setAspect(anAspect, aName); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemPrs3dAspect::Reset() +{ + VInspector_ItemBase::Reset(); + + setAspect (NULL, TCollection_AsciiString()); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemPrs3dAspect::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetPrs3dAspect +// purpose : +// ======================================================================= + +Handle(Prs3d_BasicAspect) VInspector_ItemPrs3dAspect::GetPrs3dAspect (const int theRow, + TCollection_AsciiString& theName, + Standard_Boolean& theOwnAspect) const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return 0; + + Standard_CString anAspectKind = anAspect->DynamicType()->Name(); + theOwnAspect = true; + if (anAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name()) + { + Handle(Prs3d_DatumAspect) aCustomAspect = Handle(Prs3d_DatumAspect)::DownCast (anAspect); + switch (theRow) { + case 0: theName = "TextAspect"; return aCustomAspect->TextAspect(); + case 1: theName = "PointAspect"; return aCustomAspect->PointAspect(); + case 2: theName = "ArrowAspect"; return aCustomAspect->ArrowAspect(); + default: + { + if (theRow >= 3 && theRow < 3 + Prs3d_DP_None) + { + Prs3d_DatumParts aParts = (Prs3d_DatumParts)(theRow - 3); + theName = TCollection_AsciiString ("LineAspect: ") + Prs3d::DatumPartsToString (aParts); + return aCustomAspect->LineAspect (aParts); + } + + if (theRow >= 3 + Prs3d_DP_None && theRow < 3 + 2 * Prs3d_DP_None) + { + Prs3d_DatumParts aParts = (Prs3d_DatumParts)(theRow - (3+ Prs3d_DP_None)); + theName = TCollection_AsciiString ("ShadingAspect: ") + Prs3d::DatumPartsToString (aParts); + return aCustomAspect->ShadingAspect (aParts); + } + } + break; + } + } + else if (anAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name()) + { + Handle(Prs3d_PlaneAspect) aCustomAspect = Handle(Prs3d_PlaneAspect)::DownCast (anAspect); + switch (theRow) + { + case 0: theName = "EdgesAspect"; return aCustomAspect->EdgesAspect(); + case 1: theName = "IsoAspect"; return aCustomAspect->IsoAspect(); + case 2: theName = "ArrowAspect"; return aCustomAspect->ArrowAspect(); + } + } + else if (anAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name()) + { + Handle(Prs3d_DimensionAspect) aCustomAspect = Handle(Prs3d_DimensionAspect)::DownCast (anAspect); + switch (theRow) + { + case 0: theName = "LineAspect"; return aCustomAspect->LineAspect(); + case 1: theName = "TextAspect"; return aCustomAspect->TextAspect(); + case 2: theName = "ArrowAspect"; return aCustomAspect->ArrowAspect(); + } + } + + theName = "None"; + return Handle(Prs3d_BasicAspect)(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemPrs3dAspect::GetTableRowCount() const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return 0; + + return getTableRowCount (anAspect->DynamicType()->Name()); +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemPrs3dAspect::GetTableEditType (const int theRow, const int) const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return ViewControl_EditType_None; + + return getTableEditType (theRow, anAspect->DynamicType()->Name(), 0); +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemPrs3dAspect::GetTableEnumValues (const int theRow, const int) const +{ + QList aValues; + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return aValues; + + return getTableEnumValues (theRow, anAspect->DynamicType()->Name(), 0); +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemPrs3dAspect::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return QVariant(); + + return getTableData (theRow, theColumn, theRole, anAspect->DynamicType()->Name(), 0); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemPrs3dAspect::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return false; + + return setTableData (theRow, anAspect->DynamicType()->Name(), 0, theValue); +} + + +// ======================================================================= +// function : getTableRowCount +// purpose : +// ======================================================================= + +int VInspector_ItemPrs3dAspect::getTableRowCount (const TCollection_AsciiString& theAspectKind) const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return 0; + + if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name()) + return 3 + (Prs3d_DP_ShadingNumberOfFacettes + 1); + else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name()) + return 1 + getTableRowCount (STANDARD_TYPE (Prs3d_LineAspect)->Name()); + else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name()) + return 4; // TODO: add Graphic3d_ShaderProgram + else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name()) + return 3; // TODO: add Graphic3d_ShaderProgram, Graphic3d_MarkerImage + else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name()) + return 15; // TODO: add Graphic3d_ShaderProgram + else if (theAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name()) + return 10; + else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name()) + return 2 + 3; // TODO: add Graphic3d_ShaderProgram + else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name()) + return 10; + else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name()) + return 17 + 2 * GetMaterialRows(); // TODO: Graphic3d_ShaderProgram, Graphic3d_TextureSet, Graphic3d_MaterialAspect + + return 0; +} + +// ======================================================================= +// function : getTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemPrs3dAspect::getTableEditType (const int theRow, + const TCollection_AsciiString& theAspectKind, + const int theStartRow) const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return ViewControl_EditType_None; + + int aRow = theRow - theStartRow; + if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name()) + { + switch (aRow) + { + case 0: return ViewControl_EditType_Combo; + case 1: return ViewControl_EditType_Bool; + case 2: return ViewControl_EditType_Bool; + default: + { + if (theRow >= 3 && theRow <= 3 + Prs3d_DP_ShadingNumberOfFacettes) + return ViewControl_EditType_Double; + break; + } + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name()) + { + switch (aRow) + { + case 0: return ViewControl_EditType_Spin; + default: return getTableEditType (theRow, STANDARD_TYPE (Prs3d_LineAspect)->Name(), 1); + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name()) + { + switch (aRow) + { + case 0: return ViewControl_EditType_None; + case 1: return ViewControl_EditType_Color; + case 2: return ViewControl_EditType_Combo; + case 3: return ViewControl_EditType_Double; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name()) + { + switch (aRow) + { + case 0: return ViewControl_EditType_Color; + case 1: return ViewControl_EditType_Combo; + case 2: return ViewControl_EditType_Double; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name()) + { + switch (aRow) + { + case 0: return ViewControl_EditType_Double; + case 1: return ViewControl_EditType_Double; + case 2: return ViewControl_EditType_Combo; + case 3: return ViewControl_EditType_Combo; + case 4: return ViewControl_EditType_Combo; + case 5: return ViewControl_EditType_Line; + case 6: return ViewControl_EditType_Color; + case 7: return ViewControl_EditType_Double; + case 8: return ViewControl_EditType_Double; + case 9: return ViewControl_EditType_Combo; + case 10: return ViewControl_EditType_Combo; + case 11: return ViewControl_EditType_Color; + case 12: return ViewControl_EditType_Bool; + case 13: return ViewControl_EditType_Double; + case 14: return ViewControl_EditType_Combo; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name()) + { + if (aRow >= 0 && aRow < 6 ) return ViewControl_EditType_Double; + if (aRow >= 6 && aRow < 16 ) return ViewControl_EditType_Bool; + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name()) + { + switch (aRow) + { + case 0: return ViewControl_EditType_Double; + case 1: return ViewControl_EditType_Double; + + case 2: return ViewControl_EditType_Color; + case 3: return ViewControl_EditType_Combo; + case 4: return ViewControl_EditType_Double; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name()) + { + switch (aRow) + { + case 0: return ViewControl_EditType_Line; + case 1: return ViewControl_EditType_Double; + case 2: return ViewControl_EditType_Double; + + case 3: return ViewControl_EditType_Combo; + case 4: return ViewControl_EditType_Combo; + case 5: return ViewControl_EditType_Combo; + + case 6: return ViewControl_EditType_Bool; + case 7: return ViewControl_EditType_Bool; + case 8: return ViewControl_EditType_Bool; + case 9: return ViewControl_EditType_Bool; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name()) + { + switch (aRow) + { + case 0: return ViewControl_EditType_Color; + case 1: return ViewControl_EditType_Color; + case 2: return ViewControl_EditType_Color; + + case 3: return ViewControl_EditType_Combo; + case 4: return ViewControl_EditType_Combo; + case 5: return ViewControl_EditType_Combo; + + case 6: return ViewControl_EditType_Double; + case 7: return ViewControl_EditType_Combo; + case 8: return ViewControl_EditType_Double; + case 9: return ViewControl_EditType_Combo; // Graphic3d_HatchStyle is not modified + case 10: return ViewControl_EditType_Combo; + case 11: return ViewControl_EditType_Double; + case 12: return ViewControl_EditType_Double; + + case 13: return ViewControl_EditType_Bool; + case 14: return ViewControl_EditType_Bool; + case 15: return ViewControl_EditType_Bool; + case 16: return ViewControl_EditType_Bool; + default: break; + } + + Handle(Prs3d_ShadingAspect) aCustomAspect = Handle(Prs3d_ShadingAspect)::DownCast (anAspect); + Handle(Graphic3d_AspectFillArea3d) aFillAreaAspect = aCustomAspect->Aspect(); + + ViewControl_EditType aType = ViewControl_EditType_None; + // front material + aRow = aRow - 17; + if (getTableEditTypeMaterial (aRow, aType)) + return aType; + + // back material + aRow = aRow - GetMaterialRows(); + if (getTableEditTypeMaterial (aRow, aType)) + return aType; + } + + return ViewControl_EditType_None; +} + +// ======================================================================= +// function : getTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemPrs3dAspect::getTableEnumValues (const int theRow, + const TCollection_AsciiString& theAspectKind, + const int theStartRow) const +{ + QList aValues; + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return aValues; + + int aRow = theRow - theStartRow; + if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name()) + { + Handle(Prs3d_DatumAspect) aCustomAspect = Handle(Prs3d_DatumAspect)::DownCast (anAspect); + if (aRow == 0) + { + for (int i = 0; i <= Prs3d_DA_XYZAxis; i++) + aValues.append (Prs3d::DatumAxesToString ((Prs3d_DatumAxes)i)); + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name()) + { + Handle(Prs3d_IsoAspect) aCustomAspect = Handle(Prs3d_IsoAspect)::DownCast (anAspect); + if (aRow > 0) + return getTableEnumValues (theRow, STANDARD_TYPE (Prs3d_LineAspect)->Name(), 1); + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name()) + { + if (aRow == 2) + { + for (int i = 0; i <= Aspect_TOL_USERDEFINED; i++) + aValues.append (Aspect::TypeOfLineToString ((Aspect_TypeOfLine)i)); + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name()) + { + if (aRow == 1) + { + for (int i = Aspect_TOM_EMPTY; i <= Aspect_TOM_USERDEFINED; i++) + aValues.append (Aspect::TypeOfMarkerToString ((Aspect_TypeOfMarker)i)); + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name()) + { + if (theRow == 2) + { + for (int i = Graphic3d_HTA_LEFT; i <= Graphic3d_HTA_RIGHT; i++) + aValues.append (Graphic3d::HorizontalTextAlignmentToString ((Graphic3d_HorizontalTextAlignment)i)); + } + else if (theRow == 3) + { + for (int i = Graphic3d_VTA_BOTTOM; i <= Graphic3d_VTA_TOPFIRSTLINE; i++) + aValues.append (Graphic3d::VerticalTextAlignmentToString ((Graphic3d_VerticalTextAlignment)i)); + } + else if (theRow == 4) + { + for (int i = Graphic3d_TP_UP; i <= Graphic3d_TP_RIGHT; i++) + aValues.append (Graphic3d::TextPathToString ((Graphic3d_TextPath)i)); + } + else if (theRow == 9) + { + for (int i = Aspect_TOST_NORMAL; i <= Aspect_TOST_ANNOTATION; i++) + aValues.append (Aspect::TypeOfStyleTextToString ((Aspect_TypeOfStyleText)i)); + } + else if (theRow == 10) + { + for (int i = Aspect_TODT_NORMAL; i <= Aspect_TODT_SHADOW; i++) + aValues.append (Aspect::TypeOfDisplayTextToString ((Aspect_TypeOfDisplayText)i)); + } + else if (theRow == 14) + { + for (int i = Font_FA_Undefined; i <= Font_FA_BoldItalic; i++) + aValues.append (Font::FontAspectToString ((Font_FontAspect)i)); + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name()) + { + if (theRow == 0) + { + QList aValues; + aValues << 0 << M_PI / 2.0 << 6; + return aValues; + } + else if (aRow == 3) + { + for (int i = 0; i <= Aspect_TOL_USERDEFINED; i++) + aValues.append (Aspect::TypeOfLineToString ((Aspect_TypeOfLine)i)); + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name()) + { + if (aRow == 3) + { + for (int i = 0; i <= Prs3d_DAO_Fit; i++) + aValues.append (Prs3d::DimensionArrowOrientationToString ((Prs3d_DimensionArrowOrientation)i)); + } + if (aRow == 4) + { + for (int i = 0; i <= Prs3d_DTHP_Fit; i++) + aValues.append (Prs3d::DimensionTextHorizontalPositionToString ((Prs3d_DimensionTextHorizontalPosition)i)); + } + if (aRow == 5) + { + for (int i = 0; i <= Prs3d_DTVP_Center; i++) + aValues.append (Prs3d::DimensionTextVerticalPositionToString ((Prs3d_DimensionTextVerticalPosition)i)); + } + } + + else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name()) + { + if (aRow == 3) + { + for (int i = 0; i <= Aspect_IS_POINT; i++) + aValues.append (Aspect::InteriorStyleToString ((Aspect_InteriorStyle)i)); + } + else if (aRow == 4) + { + for (int i = Graphic3d_TOSM_DEFAULT; i <= Graphic3d_TOSM_FRAGMENT; i++) + aValues.append (Graphic3d::TypeOfShadingModelToString ((Graphic3d_TypeOfShadingModel)i)); + } + else if (aRow == 5) + { + for (int i = Graphic3d_AlphaMode_BlendAuto; i <= Graphic3d_AlphaMode_Blend; i++) + aValues.append (Graphic3d::AlphaModeToString ((Graphic3d_AlphaMode)i)); + } + else if (aRow == 7) + { + for (int i = 0; i <= Aspect_TOL_USERDEFINED; i++) + aValues.append (Aspect::TypeOfLineToString ((Aspect_TypeOfLine)i)); + } + else if (aRow == 9) //Aspect_HatchStyle + { + for (int i = 0; i <= Aspect_HS_NB; i++) + aValues.append (Aspect::HatchStyleToString ((Aspect_HatchStyle)i)); + } + else if (aRow == 10) //Aspect_PolygonOffsetMode + { + aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Off)); + aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Fill)); + aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Line)); + aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Point)); + aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_All)); + aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_None)); + aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Mask)); + } + } + + return aValues; +} + +// ======================================================================= +// function : getTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemPrs3dAspect::getTableData (const int theRow, + const int theColumn, + const int theRole, + const TCollection_AsciiString& theAspectKind, + const int theStartRow) const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + int aRow = theRow - theStartRow; + + if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name()) + { + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(Prs3d_DatumAspect) aCustomAspect = Handle(Prs3d_DatumAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: return isFirstColumn ? QVariant ("DatumAxes") : QVariant (Prs3d::DatumAxesToString (aCustomAspect->DatumAxes())); + case 1: return isFirstColumn ? QVariant ("DrawLabels") : QVariant (aCustomAspect->ToDrawLabels()); + case 2: return isFirstColumn ? QVariant ("DrawArrows") : QVariant (aCustomAspect->ToDrawArrows()); + default: + { + if (theRow >= 3 && theRow <= 3 + Prs3d_DP_ShadingNumberOfFacettes) + { + Prs3d_DatumAttribute aType = (Prs3d_DatumAttribute)(theRow - 3); + return isFirstColumn ? QVariant (Prs3d::DatumAttributeToString (aType)) + : ViewControl_Tools::ToVariant (aCustomAspect->Attribute (aType)); + } + break; + } + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name()) + { + Handle(Prs3d_IsoAspect) aCustomAspect = Handle(Prs3d_IsoAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: + { + if (theRole != Qt::DisplayRole) return QVariant(); + else return isFirstColumn ? QVariant ("Number") : QVariant (aCustomAspect->Number()); + } + default: return getTableData (theRow, theColumn, theRole, STANDARD_TYPE (Prs3d_LineAspect)->Name(), 1); + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name()) + { + if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole || + (theRole == Qt::BackgroundRole && (isFirstColumn || aRow != 1))) + return QVariant(); + + Handle(Prs3d_LineAspect) aCustomAspect = Handle(Prs3d_LineAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: return isFirstColumn ? QVariant ("Aspect") : + QVariant (ViewControl_Tools::GetPointerInfo (aCustomAspect->Aspect()).ToCString()); + case 1: return getColorData("ColorRGBA", aCustomAspect->Aspect()->ColorRGBA(), isFirstColumn, theRole); + case 2: return isFirstColumn ? QVariant ("Type") + : QVariant (Aspect::TypeOfLineToString (aCustomAspect->Aspect()->Type())); + case 3: return isFirstColumn ? QVariant ("Width") : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->Width()); + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name()) + { + if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole || + (theRole == Qt::BackgroundRole && (isFirstColumn || aRow != 0))) + return QVariant(); + + Handle(Prs3d_PointAspect) aCustomAspect = Handle(Prs3d_PointAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: return getColorData("ColorRGBA", aCustomAspect->Aspect()->ColorRGBA(), isFirstColumn, theRole); + case 1: return isFirstColumn ? QVariant ("Type") + : QVariant (Aspect::TypeOfMarkerToString (aCustomAspect->Aspect()->Type())); + case 2: return isFirstColumn ? QVariant ("Scale") : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->Scale()); + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name()) + { + if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole || + (theRole == Qt::BackgroundRole && (isFirstColumn || (aRow != 6 && theRow != 11)))) + return QVariant(); + + Handle(Prs3d_TextAspect) aCustomAspect = Handle(Prs3d_TextAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: return isFirstColumn ? QVariant ("Angle") : ViewControl_Tools::ToVariant (aCustomAspect->Angle()); + case 1: return isFirstColumn ? QVariant ("Height") : ViewControl_Tools::ToVariant (aCustomAspect->Height()); + case 2: return isFirstColumn ? QVariant ("HorizontalJustification") + : QVariant (Graphic3d::HorizontalTextAlignmentToString (aCustomAspect->HorizontalJustification())); + case 3: return isFirstColumn ? QVariant ("VerticalJustification") + : QVariant (Graphic3d::VerticalTextAlignmentToString (aCustomAspect->VerticalJustification())); + case 4: return isFirstColumn ? QVariant ("Orientation") : QVariant (Graphic3d::TextPathToString (aCustomAspect->Orientation())); + // Graphic3d_AspectText3d attributes + case 5: return isFirstColumn ? QVariant ("Font") : QVariant (aCustomAspect->Aspect()->Font().ToCString()); + case 6: return getColorData("ColorRGBA", aCustomAspect->Aspect()->ColorRGBA(), isFirstColumn, theRole); + //case 7: return isFirstColumn ? QVariant ("ExpansionFactor") + // : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->ExpansionFactor()); + //case 8: return isFirstColumn ? QVariant ("Space") + // : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->Space()); + case 9: return isFirstColumn ? QVariant ("Style") + : QVariant (Aspect::TypeOfStyleTextToString (aCustomAspect->Aspect()->Style())); + case 10: return isFirstColumn ? QVariant ("DisplayType") + : QVariant (Aspect::TypeOfDisplayTextToString (aCustomAspect->Aspect()->DisplayType())); + case 11: return getColorData("ColorSubTitleRGBA", aCustomAspect->Aspect()->ColorSubTitleRGBA(), isFirstColumn, theRole); + case 12: return isFirstColumn ? QVariant ("TextZoomable") : QVariant (aCustomAspect->Aspect()->GetTextZoomable()); + case 13: return isFirstColumn ? QVariant ("TextAngle") + : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->GetTextAngle()); + case 14: return isFirstColumn ? QVariant ("TextFontAspect") + : QVariant (Font::FontAspectToString (aCustomAspect->Aspect()->GetTextFontAspect())); + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name()) + { + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(Prs3d_PlaneAspect) aCustomAspect = Handle(Prs3d_PlaneAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: return isFirstColumn ? QVariant ("ArrowsLength") : ViewControl_Tools::ToVariant (aCustomAspect->ArrowsLength()); + case 1: return isFirstColumn ? QVariant ("ArrowsSize") : ViewControl_Tools::ToVariant (aCustomAspect->ArrowsSize()); + case 2: return isFirstColumn ? QVariant ("ArrowsAngle") : ViewControl_Tools::ToVariant (aCustomAspect->ArrowsAngle()); + case 3: return isFirstColumn ? QVariant ("PlaneXLength") : ViewControl_Tools::ToVariant (aCustomAspect->PlaneXLength()); + case 4: return isFirstColumn ? QVariant ("PlaneYLength") : ViewControl_Tools::ToVariant (aCustomAspect->PlaneYLength()); + case 5: return isFirstColumn ? QVariant ("IsoDistance") : ViewControl_Tools::ToVariant (aCustomAspect->IsoDistance()); + + case 6: return isFirstColumn ? QVariant ("DisplayCenterArrow") : aCustomAspect->DisplayCenterArrow(); + case 7: return isFirstColumn ? QVariant ("DisplayEdgesArrows") : aCustomAspect->DisplayEdgesArrows(); + case 8: return isFirstColumn ? QVariant ("DisplayEdges") : aCustomAspect->DisplayEdges(); + case 9: return isFirstColumn ? QVariant ("DisplayIso") : aCustomAspect->DisplayIso(); + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name()) + { + if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole || + (theRole == Qt::BackgroundRole && (isFirstColumn || aRow != 2))) + return QVariant(); + + Handle(Prs3d_ArrowAspect) aCustomAspect = Handle(Prs3d_ArrowAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: return isFirstColumn ? QVariant ("Angle") : ViewControl_Tools::ToVariant (aCustomAspect->Angle()); + case 1: return isFirstColumn ? QVariant ("Length") : ViewControl_Tools::ToVariant (aCustomAspect->Length()); + case 2: return getColorData("ColorRGBA", aCustomAspect->Aspect()->ColorRGBA(), isFirstColumn, theRole); + case 3: return isFirstColumn ? QVariant ("Type") + : QVariant (Aspect::TypeOfLineToString (aCustomAspect->Aspect()->Type())); + case 4: return isFirstColumn ? QVariant ("Width") : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->Width()); + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name()) + { + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(Prs3d_DimensionAspect) aCustomAspect = Handle(Prs3d_DimensionAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: return isFirstColumn ? QVariant ("ValueStringFormat") : QVariant (aCustomAspect->ValueStringFormat().ToCString()); + case 1: return isFirstColumn ? QVariant ("ExtensionSize") : ViewControl_Tools::ToVariant (aCustomAspect->ExtensionSize()); + case 2: return isFirstColumn ? QVariant ("ArrowTailSize") : ViewControl_Tools::ToVariant (aCustomAspect->ArrowTailSize()); + + case 3: return isFirstColumn ? QVariant ("ArrowOrientation") + : QVariant (Prs3d::DimensionArrowOrientationToString (aCustomAspect->ArrowOrientation())); + case 4: return isFirstColumn ? QVariant ("TextHorizontalPosition") + : QVariant (Prs3d::DimensionTextHorizontalPositionToString (aCustomAspect->TextHorizontalPosition())); + case 5: return isFirstColumn ? QVariant ("TextVerticalPosition") + : QVariant (Prs3d::DimensionTextVerticalPositionToString (aCustomAspect->TextVerticalPosition())); + + case 6: return isFirstColumn ? QVariant ("IsUnitsDisplayed") : aCustomAspect->IsUnitsDisplayed(); + case 7: return isFirstColumn ? QVariant ("IsText3d") : aCustomAspect->IsText3d(); + case 8: return isFirstColumn ? QVariant ("IsTextShaded") : aCustomAspect->IsTextShaded(); + case 9: return isFirstColumn ? QVariant ("IsArrows3d") : aCustomAspect->IsArrows3d(); + + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name()) + { + if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole || + (theRole == Qt::BackgroundRole && (isFirstColumn || (aRow != 0 && theRow != 1 && theRow != 2 + && !isColorMaterialRow (theRow))))) + return QVariant(); + + Handle(Prs3d_ShadingAspect) aCustomAspect = Handle(Prs3d_ShadingAspect)::DownCast (anAspect); + Handle(Graphic3d_AspectFillArea3d) anAspect = aCustomAspect->Aspect(); + switch (aRow) + { + case 0: return getColorData("InteriorColorRGBA", anAspect->InteriorColorRGBA(), isFirstColumn, theRole); + case 1: return getColorData("BackInteriorColorRGBA", anAspect->BackInteriorColorRGBA(), isFirstColumn, theRole); + case 2: return getColorData("EdgeColorRGBA", anAspect->EdgeColorRGBA(), isFirstColumn, theRole); + case 3: return isFirstColumn ? QVariant ("InteriorStyle") + : QVariant (Aspect::InteriorStyleToString (anAspect->InteriorStyle())); + case 4: return isFirstColumn ? QVariant ("ShadingModel") + : QVariant (Graphic3d::TypeOfShadingModelToString (anAspect->ShadingModel())); + case 5: return isFirstColumn ? QVariant ("AlphaMode") + : QVariant (Graphic3d::AlphaModeToString (anAspect->AlphaMode())); + case 6: return isFirstColumn ? QVariant ("AlphaCutoff") : ViewControl_Tools::ToVariant (anAspect->AlphaCutoff()); + case 7: return isFirstColumn ? QVariant ("EdgeLineType") + : QVariant (Aspect::TypeOfLineToString (anAspect->EdgeLineType())); + case 8: return isFirstColumn ? QVariant ("EdgeWidth") : ViewControl_Tools::ToVariant (anAspect->EdgeWidth()); + case 9: return isFirstColumn ? QVariant ("HatchStyle: Type") + : (!anAspect->HatchStyle().IsNull() ? QVariant (Aspect::HatchStyleToString + ((Aspect_HatchStyle)anAspect->HatchStyle()->HatchType())) : QVariant()); + case 10: return isFirstColumn ? QVariant ("PolygonOffset: Mode") + : QVariant (Aspect::PolygonOffsetModeToString (anAspect->PolygonOffset().Mode)); + case 11: return isFirstColumn ? QVariant ("PolygonOffset: Factor") + : ViewControl_Tools::ToVariant (anAspect->PolygonOffset().Factor); + case 12: return isFirstColumn ? QVariant ("PolygonOffset: Units") + : ViewControl_Tools::ToVariant (anAspect->PolygonOffset().Units); + case 13: return isFirstColumn ? QVariant ("Distinguish") : anAspect->Distinguish(); + case 14: return isFirstColumn ? QVariant ("ToDrawEdges") : anAspect->ToDrawEdges(); + case 15: return isFirstColumn ? QVariant ("ToSuppressBackFaces") : anAspect->ToSuppressBackFaces(); + case 16: return isFirstColumn ? QVariant ("ToMapTexture") : anAspect->ToMapTexture(); + default: break; + } + // front material + aRow = aRow - 17; + const Graphic3d_MaterialAspect& aFrontMaterial = anAspect->FrontMaterial(); + QVariant aValue = getMaterialValue (aRow, theColumn, theRole, aFrontMaterial, "FrontMaterial"); + if (aValue.isValid()) + return aValue; + + // back material + aRow = aRow - GetMaterialRows(); + const Graphic3d_MaterialAspect& aBackMaterial = anAspect->BackMaterial(); + aValue = getMaterialValue (aRow, theColumn, theRole, aBackMaterial, "BackMaterial"); + if (aValue.isValid()) + return aValue; + } + return QVariant(); +} + +// ======================================================================= +// function : setTableData +// purpose : +// ======================================================================= +bool VInspector_ItemPrs3dAspect::setTableData (const int theRow, + const TCollection_AsciiString& theAspectKind, + const int theStartRow, + const QVariant& theValue) const +{ + Handle(Prs3d_BasicAspect) anAspect = GetAspect(); + if (anAspect.IsNull()) + return false; + + int aRow = theRow - theStartRow; + if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name()) + { + Handle(Prs3d_DatumAspect) aCustomAspect = Handle(Prs3d_DatumAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: aCustomAspect->SetDrawDatumAxes (Prs3d::DatumAxesFromString (theValue.toString().toStdString().c_str())); break; + case 1: aCustomAspect->SetDrawLabels (theValue.toBool()); break; + case 2: aCustomAspect->SetDrawArrows (theValue.toBool()); break; + default: + { + if (theRow >= 3 && theRow <= 3 + Prs3d_DP_ShadingNumberOfFacettes) + { + Prs3d_DatumAttribute aType = (Prs3d_DatumAttribute)(theRow - 3); + aCustomAspect->SetAttribute (aType, ViewControl_Tools::ToRealValue (theValue)); + } + break; + } + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name()) + { + Handle(Prs3d_IsoAspect) aCustomAspect = Handle(Prs3d_IsoAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: aCustomAspect->SetNumber(theValue.toInt()); break; + default: setTableData (theRow, STANDARD_TYPE (Prs3d_LineAspect)->Name(), 1, theValue); break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name()) + { + Handle(Prs3d_LineAspect) aCustomAspect = Handle(Prs3d_LineAspect)::DownCast (anAspect); + Handle(Graphic3d_AspectLine3d) anAspect = aCustomAspect->Aspect(); + switch (aRow) + { + case 0: break; + case 1: anAspect->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 2: anAspect->SetType (Aspect::TypeOfLineFromString (theValue.toString().toStdString().c_str())); break; + case 3: anAspect->SetWidth (ViewControl_Tools::ToShortRealValue (theValue)); break; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name()) + { + Handle(Prs3d_PointAspect) aCustomAspect = Handle(Prs3d_PointAspect)::DownCast (anAspect); + Handle(Graphic3d_AspectMarker3d) anAspect = aCustomAspect->Aspect(); + switch (aRow) + { + case 0: anAspect->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 1: anAspect->SetType (Aspect::TypeOfMarkerFromString (theValue.toString().toStdString().c_str())); break; + case 2: anAspect->SetScale (ViewControl_Tools::ToShortRealValue (theValue)); break; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name()) + { + Handle(Prs3d_TextAspect) aCustomAspect = Handle(Prs3d_TextAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: aCustomAspect->SetAngle (ViewControl_Tools::ToRealValue (theValue)); break; + case 1: aCustomAspect->SetHeight (ViewControl_Tools::ToRealValue (theValue)); break; + case 2: aCustomAspect->SetHorizontalJustification (Graphic3d::HorizontalTextAlignmentFromString + (theValue.toString().toStdString().c_str())); break; + case 3: aCustomAspect->SetVerticalJustification (Graphic3d::VerticalTextAlignmentFromString + (theValue.toString().toStdString().c_str())); break; + case 4: aCustomAspect->SetOrientation (Graphic3d::TextPathFromString (theValue.toString().toStdString().c_str())); break; + // Graphic3d_AspectText3d attributes + case 5: aCustomAspect->Aspect()->SetFont (theValue.toString().toStdString().c_str()); break; + case 6: aCustomAspect->Aspect()->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + //case 7: aCustomAspect->Aspect()->SetExpansionFactor (ViewControl_Tools::ToRealValue (theValue)); break; + //case 8: aCustomAspect->Aspect()->SetSpace (ViewControl_Tools::ToRealValue (theValue)); break; + case 9: aCustomAspect->Aspect()->SetStyle (Aspect::TypeOfStyleTextFromString (theValue.toString().toStdString().c_str())); break; + case 10: aCustomAspect->Aspect()->SetDisplayType (Aspect::TypeOfDisplayTextFromString (theValue.toString().toStdString().c_str())); break; + case 11: aCustomAspect->Aspect()->SetColorSubTitle (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 12: aCustomAspect->Aspect()->SetTextZoomable (theValue.toBool()); break; + case 13: aCustomAspect->Aspect()->SetTextAngle (ViewControl_Tools::ToRealValue (theValue)); break; + case 14: aCustomAspect->Aspect()->SetTextFontAspect (Font::FontAspectFromString (theValue.toString().toStdString().c_str())); break; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name()) + { + Handle(Prs3d_PlaneAspect) aCustomAspect = Handle(Prs3d_PlaneAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: aCustomAspect->SetArrowsLength (ViewControl_Tools::ToRealValue (theValue)); break; + case 1: aCustomAspect->SetArrowsSize (ViewControl_Tools::ToRealValue (theValue)); break; + case 2: aCustomAspect->SetArrowsAngle (ViewControl_Tools::ToRealValue (theValue)); break; + case 3: aCustomAspect->SetPlaneLength (ViewControl_Tools::ToRealValue (theValue), + aCustomAspect->PlaneYLength()); break; + case 4: aCustomAspect->SetPlaneLength (aCustomAspect->PlaneXLength(), + ViewControl_Tools::ToRealValue (theValue)); break; + case 5: aCustomAspect->SetIsoDistance (ViewControl_Tools::ToRealValue (theValue)); break; + case 6: aCustomAspect->SetDisplayCenterArrow (theValue.toBool()); break; + case 7: aCustomAspect->SetDisplayEdgesArrows (theValue.toBool()); break; + case 8: aCustomAspect->SetDisplayEdges (theValue.toBool()); break; + case 9: aCustomAspect->SetDisplayIso (theValue.toBool()); break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name()) + { + Handle(Prs3d_ArrowAspect) aCustomAspect = Handle(Prs3d_ArrowAspect)::DownCast (anAspect); + Handle(Graphic3d_AspectLine3d) anAspect = aCustomAspect->Aspect(); + switch (aRow) + { + case 0: aCustomAspect->SetAngle (ViewControl_Tools::ToRealValue (theValue)); break; + case 1: aCustomAspect->SetLength (ViewControl_Tools::ToRealValue (theValue)); break; + + case 2: anAspect->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 3: anAspect->SetType (Aspect::TypeOfLineFromString (theValue.toString().toStdString().c_str())); break; + case 4: anAspect->SetWidth (ViewControl_Tools::ToShortRealValue (theValue)); break; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name()) + { + Handle(Prs3d_DimensionAspect) aCustomAspect = Handle(Prs3d_DimensionAspect)::DownCast (anAspect); + switch (aRow) + { + case 0: aCustomAspect->SetValueStringFormat (theValue.toString().toStdString().c_str()); break; + case 1: aCustomAspect->SetExtensionSize (ViewControl_Tools::ToRealValue (theValue)); break; + case 2: aCustomAspect->SetArrowTailSize (ViewControl_Tools::ToRealValue (theValue)); break; + + case 3: aCustomAspect->SetArrowOrientation (Prs3d::DimensionArrowOrientationFromString ( + theValue.toString().toStdString().c_str())); break; + case 4: aCustomAspect->SetTextHorizontalPosition (Prs3d::DimensionTextHorizontalPositionFromString ( + theValue.toString().toStdString().c_str())); break; + case 5: aCustomAspect->SetTextVerticalPosition (Prs3d::DimensionTextVerticalPositionFromString ( + theValue.toString().toStdString().c_str())); break; + case 6: aCustomAspect->MakeUnitsDisplayed (theValue.toBool()); break; + case 7: aCustomAspect->MakeText3d (theValue.toBool()); break; + case 8: aCustomAspect->MakeTextShaded (theValue.toBool()); break; + case 9: aCustomAspect->MakeArrows3d (theValue.toBool()); break; + default: break; + } + } + else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name()) + { + Handle(Prs3d_ShadingAspect) aCustomAspect = Handle(Prs3d_ShadingAspect)::DownCast (anAspect); + Handle(Graphic3d_AspectFillArea3d) anAspect = aCustomAspect->Aspect(); + switch (aRow) + { + case 0: anAspect->SetInteriorColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 1: anAspect->SetBackInteriorColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 2: anAspect->SetEdgeColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 3: anAspect->SetInteriorStyle (Aspect::InteriorStyleFromString ( + theValue.toString().toStdString().c_str())); break; + case 4: anAspect->SetShadingModel (Graphic3d::TypeOfShadingModelFromString ( + theValue.toString().toStdString().c_str())); break; + case 5: + case 6: + { + Graphic3d_AlphaMode aMode = anAspect->AlphaMode(); + Standard_ShortReal aCutoff = anAspect->AlphaCutoff(); + if (aRow == 5) + aMode = Graphic3d::AlphaModeFromString (theValue.toString().toStdString().c_str()); + else + aCutoff = ViewControl_Tools::ToShortRealValue (theValue); + anAspect->SetAlphaMode (aMode, aCutoff); + break; + } + case 7: anAspect->SetEdgeLineType (Aspect::TypeOfLineFromString ( + theValue.toString().toStdString().c_str())); break; + case 8: anAspect->SetEdgeWidth (ViewControl_Tools::ToShortRealValue (theValue)); break; + case 9: break; // Graphic3d_HatchStyle is not modified + + case 10: + case 11: + case 12: + { + Standard_Integer aMode; + Standard_ShortReal aFactor, aUnits; + anAspect->PolygonOffsets (aMode, aFactor, aUnits); + if (aRow == 10) + aMode = Aspect::PolygonOffsetModeFromString (theValue.toString().toStdString().c_str()); + else if (aRow == 11) + aFactor = ViewControl_Tools::ToShortRealValue (theValue); + else if (aRow == 12) + aUnits = ViewControl_Tools::ToShortRealValue (theValue); + + anAspect->SetPolygonOffsets (aMode, aFactor, aUnits); + break; + } + case 13: anAspect->SetDistinguish (theValue.toBool()); break; + case 14: anAspect->SetDrawEdges (theValue.toBool()); break; + case 15: anAspect->SetSuppressBackFaces (theValue.toBool()); break; + case 16: anAspect->SetTextureMapOn (theValue.toBool()); break; + default: break; + } + + // front material + aRow = aRow - 17; + Graphic3d_MaterialAspect& aFrontMaterial = anAspect->ChangeFrontMaterial(); + if (setMaterialValue (aRow, aFrontMaterial, theValue)) + return true; + + // back material + aRow = aRow - GetMaterialRows(); + Graphic3d_MaterialAspect& aBackMaterial = anAspect->ChangeBackMaterial(); + if (setMaterialValue (aRow, aBackMaterial, theValue)) + return true; + } + return true; +} + +// ======================================================================= +// function : isColorMaterialRow +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemPrs3dAspect::isColorMaterialRow (const int theRow) const +{ + // front material + int aRow = theRow - 17; + if (aRow >= 8 && aRow <= 12) + return Standard_True; + + // back material + aRow = aRow - GetMaterialRows(); + if (aRow >= 8 && aRow <= 12) + return Standard_True; + + return Standard_False; +} + +// ======================================================================= +// function : getTableEditTypeMaterial +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemPrs3dAspect::getTableEditTypeMaterial (const int theRow, + ViewControl_EditType& theType) const +{ + theType = ViewControl_EditType_None; + + switch (theRow) + { + case 6: + case 7: theType = ViewControl_EditType_Line; break; + + case 8: + case 9: + case 10: + case 11: + case 12: theType = ViewControl_EditType_Color; break; + + case 13: + case 14: + case 15: + case 16: + case 17: theType = ViewControl_EditType_Line; break; + + case 18: + case 19: + case 20: + case 21: theType = ViewControl_EditType_Bool; break; + + default: break; + } + + return theRow < GetMaterialRows(); +} + +// ======================================================================= +// function : getMaterialValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemPrs3dAspect::getMaterialValue (const int theRow, + const int theColumn, + const int theRole, + const Graphic3d_MaterialAspect& theMaterial, + const TCollection_AsciiString& theInfo) const +{ + bool isFirstColumn = theColumn == 0; + + if ((theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole) || + (theRole == Qt::BackgroundRole && (isFirstColumn || (theRow < 8 || theRow > 12)))) + return QVariant(); + + switch (theRow) + { + case 0: return ViewControl_Tools::TableSeparator(); + case 1: return isFirstColumn ? QVariant (theInfo.ToCString()) : QVariant (""); + case 2: return ViewControl_Tools::TableSeparator(); + + case 3: return isFirstColumn ? QVariant ("Name") : QVariant (theMaterial.Name()); //TODO + case 4: return isFirstColumn ? QVariant ("RequestedName") : QVariant (theMaterial.RequestedName()); // TODO + case 5: return isFirstColumn ? QVariant ("MaterialName") : QVariant (theMaterial.MaterialName()); + + case 6: return isFirstColumn ? QVariant ("Transparency") : QVariant (theMaterial.Transparency()); + case 7: return isFirstColumn ? QVariant ("Alpha") : QVariant (theMaterial.Alpha()); + + case 8: return getColorData("Color", Quantity_ColorRGBA (theMaterial.Color()), isFirstColumn, theRole); + case 9: return getColorData("AmbientColor", Quantity_ColorRGBA (theMaterial.AmbientColor()), isFirstColumn, theRole); + case 10: return getColorData("DiffuseColor", Quantity_ColorRGBA (theMaterial.DiffuseColor()), isFirstColumn, theRole); + case 11: return getColorData("SpecularColor", Quantity_ColorRGBA (theMaterial.SpecularColor()), isFirstColumn, theRole); + case 12: return getColorData("EmissiveColor", Quantity_ColorRGBA (theMaterial.EmissiveColor()), isFirstColumn, theRole); + + case 13: return isFirstColumn ? QVariant ("Ambient") : QVariant (theMaterial.Ambient()); + case 14: return isFirstColumn ? QVariant ("Diffuse") : QVariant (theMaterial.Diffuse()); + case 15: return isFirstColumn ? QVariant ("Specular") : QVariant (theMaterial.Specular()); + case 16: return isFirstColumn ? QVariant ("Emissive") : QVariant (theMaterial.Emissive()); + + case 17: return isFirstColumn ? QVariant ("Shininess") : QVariant (theMaterial.Shininess()); + + case 18: return isFirstColumn ? QVariant ("ReflectionMode (Ambient)") : QVariant (theMaterial.ReflectionMode (Graphic3d_TOR_AMBIENT)); + case 19: return isFirstColumn ? QVariant ("ReflectionMode (Diffuse)") : QVariant (theMaterial.ReflectionMode (Graphic3d_TOR_DIFFUSE)); + case 20: return isFirstColumn ? QVariant ("ReflectionMode (Specular)") : QVariant (theMaterial.ReflectionMode (Graphic3d_TOR_SPECULAR)); + case 21: return isFirstColumn ? QVariant ("ReflectionMode (Emissive)") : QVariant (theMaterial.ReflectionMode (Graphic3d_TOR_EMISSION)); + + case 22: return isFirstColumn ? QVariant ("RefractionIndex") : QVariant (theMaterial.RefractionIndex()); + case 23: return isFirstColumn ? QVariant ("BSDF.FresnelCoat.FresnelType()") : QVariant (theMaterial.BSDF().FresnelCoat.FresnelType()); // TODO + case 24: return isFirstColumn ? QVariant ("BSDF.FresnelBase.FresnelType()") : QVariant (theMaterial.BSDF().FresnelBase.FresnelType()); // TODO + } + return QVariant(); +} + +// ======================================================================= +// function : setMaterialValue +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemPrs3dAspect::setMaterialValue (const int theRow, + Graphic3d_MaterialAspect& theMaterial, + const QVariant& theValue) const +{ + switch (theRow) + { + case 6: theMaterial.SetTransparency (ViewControl_Tools::ToShortRealValue (theValue)); break; + case 7: theMaterial.SetAlpha (ViewControl_Tools::ToShortRealValue (theValue)); break; + + case 8: theMaterial.SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 9: theMaterial.SetAmbientColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 10: theMaterial.SetDiffuseColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 11: theMaterial.SetSpecularColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + case 12: theMaterial.SetEmissiveColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break; + + case 13: theMaterial.SetAmbient (ViewControl_Tools::ToShortRealValue (theValue)); break; + case 14: theMaterial.SetDiffuse (ViewControl_Tools::ToShortRealValue (theValue)); break; + case 15: theMaterial.SetSpecular (ViewControl_Tools::ToShortRealValue (theValue)); break; + case 16: theMaterial.SetEmissive (ViewControl_Tools::ToShortRealValue (theValue)); break; + case 17: theMaterial.SetShininess (ViewControl_Tools::ToShortRealValue (theValue)); break; + + case 18: theMaterial.SetReflectionMode (Graphic3d_TOR_AMBIENT, theValue.toBool()); break; + case 19: theMaterial.SetReflectionMode (Graphic3d_TOR_DIFFUSE, theValue.toBool()); break; + case 20: theMaterial.SetReflectionMode (Graphic3d_TOR_SPECULAR, theValue.toBool()); break; + case 21: theMaterial.SetReflectionMode (Graphic3d_TOR_EMISSION, theValue.toBool()); break; + } + return theRow < GetMaterialRows(); +} + +// ======================================================================= +// function : getColorData +// purpose : +// ======================================================================= +QVariant VInspector_ItemPrs3dAspect::getColorData(const TCollection_AsciiString& theInfo, + const Quantity_ColorRGBA& theColor, + const Standard_Boolean isFirstColumn, + const int theRole) const +{ + if (isFirstColumn) + return theInfo.ToCString(); + + if (theRole == Qt::BackgroundRole) + return ViewControl_ColorSelector::ColorToQColor (theColor); + + else if (theRole == Qt::DisplayRole) + return ViewControl_ColorSelector::ColorToString (theColor); + + return QVariant(); +} diff --git a/tools/VInspector/VInspector_ItemPrs3dAspect.hxx b/tools/VInspector/VInspector_ItemPrs3dAspect.hxx new file mode 100644 index 0000000000..8f34f7ba50 --- /dev/null +++ b/tools/VInspector/VInspector_ItemPrs3dAspect.hxx @@ -0,0 +1,207 @@ +// Created on: 2018-08-26 +// 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 VInspector_ItemPrs3dAspect_H +#define VInspector_ItemPrs3dAspect_H + +#include +#include + +#include + +class QItemSelectionModel; + +class VInspector_ItemPrs3dAspect; +typedef QExplicitlySharedDataPointer VInspector_ItemPrs3dAspectPtr; + +//! \class VInspector_ItemPrs3dAspect +//! Item presents information about AIS_InteractiveObject. +//! Parent is item context, children are item selections. +class VInspector_ItemPrs3dAspect : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemPrs3dAspectPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemPrs3dAspectPtr (new VInspector_ItemPrs3dAspect (theParent, theRow, theColumn)); } + //! Destructor + virtual ~VInspector_ItemPrs3dAspect() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myAspect; } + + //! Returns the current aspect, init item if it was not initialized yet + //! \return interactive object + Standard_EXPORT Handle(Prs3d_BasicAspect) GetAspect() const + { return Handle(Prs3d_BasicAspect)::DownCast (GetObject()); } + + //! Returns sub aspect of the row if possible, e.g. Datum/Dimension aspect + //! \param theRow child row index + //! \param theName [out] drawer name + Standard_EXPORT Handle(Prs3d_BasicAspect) GetPrs3dAspect (const int theRow, + TCollection_AsciiString& theName, + Standard_Boolean& theOwnAspect) const; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of item selected + //! \return rows count + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) 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; + +private: + + //! Set interactive object into the current field + //! \param theIO a presentation + //! \param theName item display data value + void setAspect (Handle(Prs3d_BasicAspect) theAspect, const TCollection_AsciiString& theName) + { myAspect = theAspect; myName = theName; } + +private: + + //! Returns number of table rows depending on the aspect kind + //! \param theAspectKind kind or parent kind of aspect + int getTableRowCount (const TCollection_AsciiString& theAspectKind) const; + + //! Returns number of table rows depending on the aspect kind + //! \param theRow a model index row + //! \param theAspectKind kind or parent kind of aspect + //! \param theStartRow number of rows following before the parameter row, use sum of row and start row + ViewControl_EditType getTableEditType (const int theRow, + const TCollection_AsciiString& theAspectKind, + const int theStartRow) const; + + //! Returns container of string values for enumeration in the model row depending on the aspect kind + //! \param theRow table model row index + //! \param theAspectKind kind or parent kind of aspect + //! \param theStartRow number of rows following before the parameter row, use sum of row and start row + //! \return string values for the enumeration presented in the row or an empty container + QList getTableEnumValues (const int theRow, + const TCollection_AsciiString& theAspectKind, + const int theStartRow) const; + + //! Returns table value for the row in form: depending on the aspect kind + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theAspectKind kind or parent kind of aspect + //! \param theStartRow number of rows following before the parameter row, use sum of row and start row + QVariant getTableData (const int theRow, + const int theColumn, + const int theRole, + const TCollection_AsciiString& theAspectKind, + const int theStartRow) const; + + //! Sets the value into the table cell depending on the aspect kind + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + bool setTableData (const int theRow, + const TCollection_AsciiString& theAspectKind, + const int theStartRow, + const QVariant& theValue) const; + + //! Returns true if the table value in the row is a color of a material + Standard_Boolean isColorMaterialRow (const int theRow) const; + + //! Returns type of edit control for the material row + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + Standard_Boolean getTableEditTypeMaterial (const int theRow, + ViewControl_EditType& theType) const; + + //! Returns value of Graphic3d_MaterialAspect for the row + QVariant getMaterialValue (const int theRow, + const int theColumn, + const int theRole, + const Graphic3d_MaterialAspect& theMaterial, + const TCollection_AsciiString& theInfo) const; + + Standard_Boolean setMaterialValue (const int theRow, + Graphic3d_MaterialAspect& theMaterial, + const QVariant& theValue) const; + + //! Returns color data depending on parameters + //! \param theInfo information value if column is the first one + //! \param theColor color value + //! \param isFirstColumn true if the column id is zero, return info value + //! \param theRole if background, returns color or text parameters of color + QVariant getColorData (const TCollection_AsciiString& theInfo, + const Quantity_ColorRGBA& theColor, + const Standard_Boolean isFirstColumn, + const int theRole) const; + +private: + + //! Constructor + //! param theParent a parent item + VInspector_ItemPrs3dAspect(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +protected: + + Handle(Prs3d_BasicAspect) myAspect; //!< the current interactive context + TCollection_AsciiString myName; //!< the item display data value +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemPrs3dDrawer.cxx b/tools/VInspector/VInspector_ItemPrs3dDrawer.cxx new file mode 100644 index 0000000000..663a786b00 --- /dev/null +++ b/tools/VInspector/VInspector_ItemPrs3dDrawer.cxx @@ -0,0 +1,570 @@ +// Created on: 2018-08-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 +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= + +QVariant VInspector_ItemPrs3dDrawer::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + bool aNullDrawer = aDrawer.IsNull(); + if (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole) + { + switch (Column()) + { + case 0: + { + return theItemRole == Qt::ToolTipRole + ? (aNullDrawer ? QVariant("Prs3d_Drawer is empty") : QVariant (aDrawer->DynamicType()->Name())) + : QVariant (myName.ToCString()); + } + default: break; + } + } + if (theItemRole == Qt::ForegroundRole) + return !aNullDrawer ? QColor (Qt::black) : QColor (Qt::lightGray); + + return QVariant(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= + +int VInspector_ItemPrs3dDrawer::initRowCount() const +{ + VInspector_ItemPrs3dDrawerPtr aParentDrawerItem = itemDynamicCast(Parent()); + if (aParentDrawerItem) + return 0; + + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return 0; + + int aChildCount = 1; // Link + aChildCount += 18; // Prs3d_Drawer aspects + return aChildCount; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= + +TreeModel_ItemBasePtr VInspector_ItemPrs3dDrawer::createChild (int theRow, int theColumn) +{ + if (theRow == 0) + { + return VInspector_ItemPrs3dDrawer::CreateItem (currentItem(), theRow, theColumn); // "Link" + } + else + return VInspector_ItemPrs3dAspect::CreateItem (currentItem(), theRow, theColumn); // "Aspects" + + return TreeModel_ItemBasePtr(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemPrs3dDrawer::Init() +{ + VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast(Parent()); + Handle(Prs3d_Drawer) aDrawer; + TCollection_AsciiString aName; + if (aParentItem) + aDrawer = aParentItem->GetPrs3dDrawer(Row(), aName); + else + { + VInspector_ItemPrs3dDrawerPtr aParentDrawerItem = itemDynamicCast(Parent()); + if (aParentDrawerItem) + { + aDrawer = aParentDrawerItem->GetDrawer()->Link(); + aName = "Link"; + } + } + setDrawer (aDrawer, aName); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemPrs3dDrawer::Reset() +{ + VInspector_ItemBase::Reset(); + + setDrawer (NULL, "None"); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemPrs3dDrawer::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetPrs3dAspect +// purpose : +// ======================================================================= + +Handle(Prs3d_BasicAspect) VInspector_ItemPrs3dDrawer::GetPrs3dAspect (const int theRow, + TCollection_AsciiString& theName, + Standard_Boolean& theOwnAspect) const +{ + if (theRow == 0) // "Link" driver, there is no aspect + return 0; + + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return 0; + + // do not create a new instance of the aspect + switch (theRow) + { + case 1: theName = "UIsoAspect"; theOwnAspect = aDrawer->HasOwnUIsoAspect(); return aDrawer->UIsoAspect(); + case 2: theName = "VIsoAspect"; theOwnAspect = aDrawer->HasOwnVIsoAspect(); return aDrawer->VIsoAspect(); + case 3: theName = "WireAspect"; theOwnAspect = aDrawer->HasOwnWireAspect(); return aDrawer->WireAspect(); + case 4: theName = "PointAspect"; theOwnAspect = aDrawer->HasOwnPointAspect(); return aDrawer->PointAspect(); + case 5: theName = "LineAspect"; theOwnAspect = aDrawer->HasOwnLineAspect(); return aDrawer->LineAspect(); + case 6: theName = "TextAspect"; theOwnAspect = aDrawer->HasOwnTextAspect(); return aDrawer->TextAspect(); + case 7: theName = "ShadingAspect"; theOwnAspect = aDrawer->HasOwnShadingAspect(); return aDrawer->ShadingAspect(); + case 8: theName = "PlaneAspect"; theOwnAspect = aDrawer->HasOwnPlaneAspect(); return aDrawer->PlaneAspect(); + case 9: theName = "SeenLineAspect"; theOwnAspect = aDrawer->HasOwnSeenLineAspect(); return aDrawer->SeenLineAspect(); + case 10: theName = "ArrowAspect"; theOwnAspect = aDrawer->HasOwnArrowAspect(); return aDrawer->ArrowAspect(); + case 11: theName = "HiddenLineAspect"; theOwnAspect = aDrawer->HasOwnHiddenLineAspect(); return aDrawer->HiddenLineAspect(); + case 12: theName = "VectorAspect"; theOwnAspect = aDrawer->HasOwnVectorAspect(); return aDrawer->VectorAspect(); + case 13: theName = "DatumAspect"; theOwnAspect = aDrawer->HasOwnDatumAspect(); return aDrawer->DatumAspect(); + case 14: theName = "SectionAspect"; theOwnAspect = aDrawer->HasOwnSectionAspect(); return aDrawer->SectionAspect(); + case 15: theName = "FreeBoundaryAspect"; theOwnAspect = aDrawer->HasOwnFreeBoundaryAspect(); return aDrawer->FreeBoundaryAspect(); + case 16: theName = "UnFreeBoundaryAspect"; theOwnAspect = aDrawer->HasOwnUnFreeBoundaryAspect(); return aDrawer->UnFreeBoundaryAspect(); + case 17: theName = "FaceBoundaryAspect"; theOwnAspect = aDrawer->HasOwnFaceBoundaryAspect(); return aDrawer->FaceBoundaryAspect(); + case 18: theName = "DimensionAspect"; theOwnAspect = aDrawer->HasOwnDimensionAspect(); return aDrawer->DimensionAspect(); + default: break; + } + + theName = "None"; + return Handle(Prs3d_BasicAspect)(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemPrs3dDrawer::GetTableRowCount() const +{ + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return 0; + + return 76; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemPrs3dDrawer::GetTableEditType (const int theRow, const int) const +{ + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return ViewControl_EditType_None; + + switch (theRow) + { + case 4: return ViewControl_EditType_Spin; + case 6: return ViewControl_EditType_Line; + case 8: return ViewControl_EditType_Line; + case 10: return ViewControl_EditType_Combo; + case 12: return ViewControl_EditType_Combo; + case 13: return ViewControl_EditType_Bool; + case 14: return ViewControl_EditType_Line; + case 15: return ViewControl_EditType_Bool; + case 16: return ViewControl_EditType_Line; + case 18: return ViewControl_EditType_Line; + case 21: return ViewControl_EditType_Line; + case 24: return ViewControl_EditType_Bool; + case 26: return ViewControl_EditType_Bool; + case 28: return ViewControl_EditType_Bool; + // aspects + case 30: + case 31: + case 32: + case 34: + case 35: + case 36: + case 37: + case 38: + case 39: + case 40: + case 41: + case 43: + case 44: + case 46: + case 47: return ViewControl_EditType_Bool; + + case 48: return ViewControl_EditType_Combo; + + case 49: + case 50: + case 51: + case 53: + case 54: + case 56: + case 57: + case 59: + case 60: return ViewControl_EditType_Bool; + + case 62: + case 64: + case 66: + case 68: return ViewControl_EditType_Line; + case 72: return ViewControl_EditType_Color; + + case 73: return ViewControl_EditType_Combo; + case 74: return ViewControl_EditType_Combo; + case 75: return ViewControl_EditType_Spin; + + default: return ViewControl_EditType_None; + } +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemPrs3dDrawer::GetTableEnumValues (const int theRow, const int) const +{ + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return QList(); + + QList aValues; + switch (theRow) + { + case 10: + { + for (int i = 0; i <= Aspect_TOD_ABSOLUTE; i++) + aValues.append (Aspect::TypeOfDeflectionToString ((Aspect_TypeOfDeflection)i)); + } + break; + case 12: + { + for (int i = 0; i <= Prs3d_TOH_Algo; i++) + aValues.append (Prs3d::TypeOfHLRToString ((Prs3d_TypeOfHLR)i)); + } + break; + case 48: + { + for (int i = 0; i <= Prs3d_VDM_Inherited; i++) + aValues.append (Prs3d::VertexDrawModeToString ((Prs3d_VertexDrawMode)i)); + } + break; + case 73: + { + for (int i = 0; i <= Aspect_TOHM_BOUNDBOX; i++) + aValues.append (Aspect::TypeOfHighlightMethodToString ((Aspect_TypeOfHighlightMethod)i)); + } + break; + case 74: + { + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_UNKNOWN)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Default)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Top)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Topmost)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_TopOSD)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_BotOSD)); + } + break; + default: break; + } + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemPrs3dDrawer::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole || + (theRole == Qt::BackgroundRole && (isFirstColumn || theRow != 72))) + return QVariant(); + + switch (theRow) + { + case 0: return ViewControl_Table::SeparatorData(); + case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (Prs3d_Drawer)->Name()) + : ViewControl_Tools::GetPointerInfo (aDrawer).ToCString(); + case 2: return ViewControl_Table::SeparatorData(); + case 3: return isFirstColumn ? QVariant ("HasOwnDiscretisation") : QVariant (aDrawer->HasOwnDiscretisation()); + case 4: return isFirstColumn ? QVariant ("Discretisation") : QVariant (aDrawer->Discretisation()); + case 5: return isFirstColumn ? QVariant ("HasOwnMaximalParameterValue") : QVariant (aDrawer->HasOwnMaximalParameterValue()); + case 6: return isFirstColumn ? QVariant ("MaximalParameterValue") : QVariant (aDrawer->MaximalParameterValue()); + case 7: return isFirstColumn ? QVariant ("HasOwnMaximalChordialDeviation") : QVariant (aDrawer->HasOwnMaximalChordialDeviation()); + case 8: return isFirstColumn ? QVariant ("MaximalChordialDeviation") : QVariant (aDrawer->MaximalChordialDeviation()); + case 9: return isFirstColumn ? QVariant ("HasOwnTypeOfDeflection") : QVariant (aDrawer->HasOwnTypeOfDeflection()); + case 10: return isFirstColumn ? QVariant ("TypeOfDeflection") + : QVariant (Aspect::TypeOfDeflectionToString (aDrawer->TypeOfDeflection())); + case 11: return isFirstColumn ? QVariant ("HasOwnTypeOfHLR") : QVariant (aDrawer->HasOwnTypeOfHLR()); + case 12: return isFirstColumn ? QVariant ("TypeOfHLR") + : QVariant (Prs3d::TypeOfHLRToString (aDrawer->TypeOfHLR())); + + case 13: return isFirstColumn ? QVariant ("HasOwnDeviationCoefficient") : QVariant (aDrawer->HasOwnDeviationCoefficient()); + case 14: return isFirstColumn ? QVariant ("DeviationCoefficient") : QVariant (aDrawer->DeviationCoefficient()); + case 15: return isFirstColumn ? QVariant ("HasOwnHLRDeviationCoefficient") : QVariant (aDrawer->HasOwnHLRDeviationCoefficient()); + case 16: return isFirstColumn ? QVariant ("HLRDeviationCoefficient") : QVariant (aDrawer->HLRDeviationCoefficient()); + + case 17: return isFirstColumn ? QVariant ("HasOwnDeviationAngle") : QVariant (aDrawer->HasOwnDeviationAngle()); + case 18: return isFirstColumn ? QVariant ("DeviationAngle") : QVariant (aDrawer->DeviationAngle()); + case 19: return isFirstColumn ? QVariant ("PreviousDeviationAngle") : QVariant (aDrawer->PreviousDeviationAngle()); + + case 20: return isFirstColumn ? QVariant ("HasOwnHLRDeviationAngle") : QVariant (aDrawer->HasOwnHLRDeviationAngle()); + case 21: return isFirstColumn ? QVariant ("HLRAngle") : QVariant (aDrawer->HLRAngle()); + case 22: return isFirstColumn ? QVariant ("PreviousHLRDeviationAngle") : QVariant (aDrawer->PreviousHLRDeviationAngle()); + + case 23: return isFirstColumn ? QVariant ("HasOwnIsoOnPlane") : QVariant (aDrawer->HasOwnIsoOnPlane()); + case 24: return isFirstColumn ? QVariant ("IsoOnPlane") : QVariant (aDrawer->IsoOnPlane()); + case 25: return isFirstColumn ? QVariant ("HasOwnIsoOnTriangulation") : QVariant (aDrawer->HasOwnIsoOnTriangulation()); + case 26: return isFirstColumn ? QVariant ("IsoOnTriangulation") : QVariant (aDrawer->IsoOnTriangulation()); + case 27: return isFirstColumn ? QVariant ("HasOwnIsAutoTriangulation") : QVariant (aDrawer->HasOwnIsAutoTriangulation()); + case 28: return isFirstColumn ? QVariant ("IsAutoTriangulation") : QVariant (aDrawer->IsAutoTriangulation()); + case 29: return ViewControl_Table::SeparatorData(); // aspects separation + + case 30: return isFirstColumn ? QVariant ("HasOwnUIsoAspect") : QVariant (aDrawer->HasOwnUIsoAspect()); + case 31: return isFirstColumn ? QVariant ("HasOwnVIsoAspect") : QVariant (aDrawer->HasOwnVIsoAspect()); + case 32: return isFirstColumn ? QVariant ("HasOwnWireAspect") : QVariant (aDrawer->HasOwnWireAspect()); + case 33: return isFirstColumn ? QVariant ("HasOwnWireDraw") : QVariant (aDrawer->HasOwnWireDraw()); + case 34: return isFirstColumn ? QVariant ("WireDraw") : QVariant (aDrawer->WireDraw()); + case 35: return isFirstColumn ? QVariant ("HasOwnPointAspect") : QVariant (aDrawer->HasOwnPointAspect()); + case 36: return isFirstColumn ? QVariant ("HasOwnLineAspect") : QVariant (aDrawer->HasOwnLineAspect()); + case 37: return isFirstColumn ? QVariant ("HasOwnTextAspect") : QVariant (aDrawer->HasOwnTextAspect()); + case 38: return isFirstColumn ? QVariant ("HasOwnShadingAspect") : QVariant (aDrawer->HasOwnShadingAspect()); + case 39: return isFirstColumn ? QVariant ("HasOwnPlaneAspect") : QVariant (aDrawer->HasOwnPlaneAspect()); + case 40: return isFirstColumn ? QVariant ("HasOwnSeenLineAspect") : QVariant (aDrawer->HasOwnSeenLineAspect()); + + case 41: return isFirstColumn ? QVariant ("HasOwnArrowAspect") : QVariant (aDrawer->HasOwnArrowAspect()); + case 42: return isFirstColumn ? QVariant ("HasOwnLineArrowDraw") : QVariant (aDrawer->HasOwnLineArrowDraw()); + case 43: return isFirstColumn ? QVariant ("LineArrowDraw") : QVariant (aDrawer->LineArrowDraw()); + + case 44: return isFirstColumn ? QVariant ("HasOwnHiddenLineAspect") : QVariant (aDrawer->HasOwnHiddenLineAspect()); + case 45: return isFirstColumn ? QVariant ("HasOwnDrawHiddenLine") : QVariant (aDrawer->HasOwnDrawHiddenLine()); + case 46: return isFirstColumn ? QVariant ("DrawHiddenLine") : QVariant (aDrawer->DrawHiddenLine()); + + case 47: return isFirstColumn ? QVariant ("HasOwnVectorAspect") : QVariant (aDrawer->HasOwnVectorAspect()); + case 48: return isFirstColumn ? QVariant ("VertexDrawMode") + : QVariant (Prs3d::VertexDrawModeToString (aDrawer->VertexDrawMode())); + + case 49: return isFirstColumn ? QVariant ("HasOwnDatumAspect") : QVariant (aDrawer->HasOwnDatumAspect()); + + case 50: return isFirstColumn ? QVariant ("HasOwnSectionAspect") : QVariant (aDrawer->HasOwnSectionAspect()); + + case 51: return isFirstColumn ? QVariant ("HasOwnFreeBoundaryAspect") : QVariant (aDrawer->HasOwnFreeBoundaryAspect()); + case 52: return isFirstColumn ? QVariant ("HasOwnFreeBoundaryDraw") : QVariant (aDrawer->HasOwnFreeBoundaryDraw()); + case 53: return isFirstColumn ? QVariant ("FreeBoundaryDraw") : QVariant (aDrawer->FreeBoundaryDraw()); + + case 54: return isFirstColumn ? QVariant ("HasOwnUnFreeBoundaryAspect") : QVariant (aDrawer->HasOwnUnFreeBoundaryAspect()); + case 55: return isFirstColumn ? QVariant ("HasOwnUnFreeBoundaryDraw") : QVariant (aDrawer->HasOwnUnFreeBoundaryDraw()); + case 56: return isFirstColumn ? QVariant ("UnFreeBoundaryDraw") : QVariant (aDrawer->UnFreeBoundaryDraw()); + + case 57: return isFirstColumn ? QVariant ("HasOwnFaceBoundaryAspect") : QVariant (aDrawer->HasOwnFaceBoundaryAspect()); + case 58: return isFirstColumn ? QVariant ("HasOwnFaceBoundaryDraw") : QVariant (aDrawer->HasOwnFaceBoundaryDraw()); + case 59: return isFirstColumn ? QVariant ("FaceBoundaryDraw") : QVariant (aDrawer->FaceBoundaryDraw()); + + case 60: return isFirstColumn ? QVariant ("HasOwnDimensionAspect") : QVariant (aDrawer->HasOwnDimensionAspect()); + + case 61: return isFirstColumn ? QVariant ("HasOwnDimLengthModelUnits") : QVariant (aDrawer->HasOwnDimLengthModelUnits()); + case 62: return isFirstColumn ? QVariant ("DimLengthModelUnits") : QVariant (aDrawer->DimLengthModelUnits().ToCString()); + case 63: return isFirstColumn ? QVariant ("HasOwnDimLengthModelUnits") : QVariant (aDrawer->HasOwnDimLengthModelUnits()); + case 64: return isFirstColumn ? QVariant ("DimAngleModelUnits") : QVariant (aDrawer->DimAngleModelUnits().ToCString()); + + case 65: return isFirstColumn ? QVariant ("HasOwnDimLengthDisplayUnits") : QVariant (aDrawer->HasOwnDimLengthDisplayUnits()); + case 66: return isFirstColumn ? QVariant ("DimLengthDisplayUnits") : QVariant (aDrawer->DimLengthDisplayUnits().ToCString()); + case 67: return isFirstColumn ? QVariant ("HasOwnDimAngleDisplayUnits") : QVariant (aDrawer->HasOwnDimAngleDisplayUnits()); + case 68: return isFirstColumn ? QVariant ("DimAngleDisplayUnits") : QVariant (aDrawer->DimAngleDisplayUnits().ToCString()); + + // Graphic3d_PresentationAttributes + case 69: return ViewControl_Table::SeparatorData(); + case 70: return isFirstColumn ? QVariant (STANDARD_TYPE (Graphic3d_PresentationAttributes)->Name()) + : ViewControl_Tools::GetPointerInfo (aDrawer).ToCString(); + case 72: + { + if (isFirstColumn) return QVariant ("ColorRGBA"); + else if (theRole == Qt::BackgroundRole) return ViewControl_ColorSelector::ColorToQColor (aDrawer->ColorRGBA()); + else if (theRole == Qt::DisplayRole) return ViewControl_ColorSelector::ColorToString (aDrawer->ColorRGBA()); + } + case 71: return ViewControl_Table::SeparatorData(); + case 73: return isFirstColumn ? QVariant ("Method") + : QVariant (Aspect::TypeOfHighlightMethodToString (aDrawer->Method())); + case 74: return isFirstColumn ? QVariant ("ZLayer") + : QVariant (Graphic3d::ZLayerIdToString (aDrawer->ZLayer())); + case 75: return isFirstColumn ? QVariant ("DisplayMode") : QVariant (aDrawer->DisplayMode()); + + + default: return QVariant(); + } +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemPrs3dDrawer::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return false; + + switch (theRow) + { + case 4: aDrawer->SetDiscretisation (theValue.toInt()); break; + case 6: aDrawer->SetMaximalParameterValue (theValue.toDouble()); break; + case 8: aDrawer->SetMaximalChordialDeviation (theValue.toDouble()); break; + case 10: aDrawer->SetTypeOfDeflection (Aspect::TypeOfDeflectionFromString (theValue.toString().toStdString().c_str())); break; + case 12: aDrawer->SetTypeOfHLR (Prs3d::TypeOfHLRFromString (theValue.toString().toStdString().c_str())); break; + case 13: aDrawer->SetDeviationCoefficient(); break; + case 14: aDrawer->SetDeviationCoefficient (theValue.toDouble()); break; + case 15: aDrawer->SetHLRDeviationCoefficient(); break; + case 16: aDrawer->SetHLRDeviationCoefficient (theValue.toDouble()); break; + case 18: aDrawer->SetDeviationAngle (theValue.toDouble()); break; + case 21: aDrawer->SetHLRAngle (theValue.toDouble()); break; + case 24: aDrawer->SetIsoOnPlane (theValue.toBool()); break; + case 26: aDrawer->SetIsoOnTriangulation (theValue.toBool()); break; + case 28: aDrawer->SetAutoTriangulation (theValue.toBool()); break; + // aspects + case 30: + case 31: + case 32: + case 35: + case 36: + case 37: + case 38: + case 39: + case 40: + case 41: + case 44: + case 47: + case 49: + case 50: + case 51: + case 54: + case 57: + case 60: + { + Standard_Boolean isOwnAspect = (Standard_Boolean)theValue.toBool(); + if (!isOwnAspect) + aDrawer->SetUIsoAspect (NULL); + Handle(Prs3d_Drawer) aLink = aDrawer->Link(); // copy link drawer to restore it + aDrawer->SetLink(NULL); + // creates and sets default aspect + // TODO: suggest to fill myHasOwnUIsoAspect in UIsoAspect + if (theRow == 30) aDrawer->SetUIsoAspect (isOwnAspect ? aDrawer->UIsoAspect() : NULL); + if (theRow == 31) aDrawer->SetVIsoAspect (isOwnAspect ? aDrawer->VIsoAspect() : NULL); + if (theRow == 32) aDrawer->SetWireAspect (isOwnAspect ? aDrawer->WireAspect() : NULL); + if (theRow == 35) aDrawer->SetPointAspect (isOwnAspect ? aDrawer->PointAspect() : NULL); + if (theRow == 36) aDrawer->SetLineAspect (isOwnAspect ? aDrawer->LineAspect() : NULL); + if (theRow == 37) aDrawer->SetTextAspect (isOwnAspect ? aDrawer->TextAspect() : NULL); + if (theRow == 38) aDrawer->SetShadingAspect (isOwnAspect ? aDrawer->ShadingAspect() : NULL); + if (theRow == 39) aDrawer->SetPlaneAspect (isOwnAspect ? aDrawer->PlaneAspect() : NULL); + if (theRow == 40) aDrawer->SetSeenLineAspect (isOwnAspect ? aDrawer->SeenLineAspect() : NULL); + if (theRow == 41) aDrawer->SetArrowAspect (isOwnAspect ? aDrawer->ArrowAspect() : NULL); + if (theRow == 44) aDrawer->SetHiddenLineAspect (isOwnAspect ? aDrawer->HiddenLineAspect() : NULL); + if (theRow == 47) aDrawer->SetVectorAspect (isOwnAspect ? aDrawer->VectorAspect() : NULL); + if (theRow == 49) aDrawer->SetDatumAspect (isOwnAspect ? aDrawer->DatumAspect() : NULL); + if (theRow == 50) aDrawer->SetSectionAspect (isOwnAspect ? aDrawer->SectionAspect() : NULL); + if (theRow == 51) aDrawer->SetFreeBoundaryAspect (isOwnAspect ? aDrawer->FreeBoundaryAspect() : NULL); + if (theRow == 54) aDrawer->SetUnFreeBoundaryAspect (isOwnAspect ? aDrawer->UnFreeBoundaryAspect() : NULL); + if (theRow == 57) aDrawer->SetFaceBoundaryAspect (isOwnAspect ? aDrawer->FaceBoundaryAspect() : NULL); + if (theRow == 60) aDrawer->SetDimensionAspect (isOwnAspect ? aDrawer->DimensionAspect() : NULL); + + aDrawer->SetLink(aLink); + } + break; + case 34: aDrawer->SetWireDraw (theValue.toBool()); break; + case 43: aDrawer->SetLineArrowDraw (theValue.toBool()); break; + case 46: { if (theValue.toBool()) aDrawer->EnableDrawHiddenLine(); else aDrawer->DisableDrawHiddenLine(); } break; + case 48: aDrawer->SetVertexDrawMode (Prs3d::VertexDrawModeFromString (theValue.toString().toStdString().c_str())); break; + case 53: aDrawer->SetFreeBoundaryDraw (theValue.toBool()); break; + case 56: aDrawer->SetUnFreeBoundaryDraw (theValue.toBool()); break; + case 59: aDrawer->SetFaceBoundaryDraw (theValue.toBool()); break; + + case 62: aDrawer->SetDimLengthModelUnits (theValue.toString().toStdString().c_str()); break; + case 64: aDrawer->SetDimAngleModelUnits (theValue.toString().toStdString().c_str()); break; + case 66: aDrawer->SetDimLengthDisplayUnits (theValue.toString().toStdString().c_str()); break; + case 68: aDrawer->SetDimAngleDisplayUnits (theValue.toString().toStdString().c_str()); break; + + case 72: + { + float anAlpha; + aDrawer->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString(), anAlpha)); + aDrawer->SetTransparency (anAlpha); + } + case 73: aDrawer->SetMethod (Aspect::TypeOfHighlightMethodFromString (theValue.toString().toStdString().c_str())); break; + case 74: aDrawer->SetZLayer (Graphic3d::ZLayerIdFromString (theValue.toString().toStdString().c_str())); break; + case 75: aDrawer->SetDisplayMode (theValue.toInt()); break; + + default: return false; + } + return true; +} diff --git a/tools/VInspector/VInspector_ItemPrs3dDrawer.hxx b/tools/VInspector/VInspector_ItemPrs3dDrawer.hxx new file mode 100644 index 0000000000..8d971b0571 --- /dev/null +++ b/tools/VInspector/VInspector_ItemPrs3dDrawer.hxx @@ -0,0 +1,134 @@ +// Created on: 2018-08-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 VInspector_ItemPrs3dDrawer_H +#define VInspector_ItemPrs3dDrawer_H + +#include +#include + +#include + +class Prs3d_BasicAspect; + +class QItemSelectionModel; + +class VInspector_ItemPrs3dDrawer; +typedef QExplicitlySharedDataPointer VInspector_ItemPrs3dDrawerPtr; + +//! \class VInspector_ItemPrs3dDrawer +//! Item presents information about AIS_InteractiveObject. +//! Parent is item context, children are item selections. +class VInspector_ItemPrs3dDrawer : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemPrs3dDrawerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemPrs3dDrawerPtr (new VInspector_ItemPrs3dDrawer (theParent, theRow, theColumn)); } + //! Destructor + virtual ~VInspector_ItemPrs3dDrawer() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myDrawer; } + + //! Returns current drawer, initialize the drawer if it was not initialized yet + Standard_EXPORT Handle(Prs3d_Drawer) GetDrawer() const + { return Handle(Prs3d_Drawer)::DownCast (GetObject()); } + + //! Returns drawer of the row if possible + //! \param theRow child row index + //! \param theName [out] drawer name + Standard_EXPORT Handle(Prs3d_BasicAspect) GetPrs3dAspect (const int theRow, + TCollection_AsciiString& theName, + Standard_Boolean& theOwnAspect) const; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of item selected + //! \return rows count + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) 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; + +protected: + + //! Set interactive object into the current field + //! \param theIO a presentation + //! \param theName item display data value + void setDrawer (const Handle(Prs3d_Drawer)& theDrawer, const TCollection_AsciiString& theName) + { myDrawer = theDrawer; myName = theName; } + +protected: + + //! Constructor + //! param theParent a parent item + VInspector_ItemPrs3dDrawer(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +protected: + + Handle(Prs3d_Drawer) myDrawer; //!< the current drawer + TCollection_AsciiString myName; //!< the item display data value +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemPrs3dPresentation.cxx b/tools/VInspector/VInspector_ItemPrs3dPresentation.cxx new file mode 100644 index 0000000000..0fbeac1940 --- /dev/null +++ b/tools/VInspector/VInspector_ItemPrs3dPresentation.cxx @@ -0,0 +1,229 @@ +// 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 +#include +#include +#include + +#include +#include + +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemPrs3dPresentation::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (Column() != 0 || (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole)) + return QVariant(); + + Handle(Prs3d_Presentation) aPresentation = GetPresentation(); + bool aNullPresentation = aPresentation.IsNull(); + + switch (Column()) + { + case 0: + { + return theItemRole == Qt::ToolTipRole + ? (aNullPresentation ? QVariant("Prs3d_Presentation is empty") : QVariant (aPresentation->DynamicType()->Name())) + : QVariant (myName.ToCString()); + } + } + + return QVariant(); +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemPrs3dPresentation::initRowCount() const +{ + if (Column() != 0) + return 0; + + //Handle(Prs3d_Presentation) aPresentation = GetPresentation(); + + //Standard_EXPORT const Handle(Graphic3d_SequenceOfHClipPlane)& ClipPlanes() const; + + return 1; //aPresentation->NumberOfGroups(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemPrs3dPresentation::createChild (int theRow, int theColumn) +{ + if (theRow == 0) + return VInspector_ItemGraphic3dCStructure::CreateItem (currentItem(), theRow, theColumn); + //if (theRow == 1) + // return VInspector_ItemPrs3dPresentation::CreateItem (currentItem(), theRow, theColumn); + //else + // return VInspector_ItemSelectMgrSelection::CreateItem(currentItem(), theRow, theColumn); + return TreeModel_ItemBasePtr(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemPrs3dPresentation::Init() +{ + VInspector_ItemPresentationsPtr aParentItem = itemDynamicCast(Parent()); + + TCollection_AsciiString aName; + Handle(Prs3d_Presentation) aPresentation = aParentItem->GetPresentation (Row(), aName); + setPresentation (aPresentation, aName); + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemPrs3dPresentation::Reset() +{ + VInspector_ItemBase::Reset(); + + setPresentation (NULL, "None"); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemPrs3dPresentation::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : setPresentation +// purpose : +// ======================================================================= +void VInspector_ItemPrs3dPresentation::setPresentation (const Handle(Prs3d_Presentation)& thePresentation, + const TCollection_AsciiString& theName) +{ + myPresentation = thePresentation; + myName = theName; +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemPrs3dPresentation::GetTableRowCount() const +{ + return 14; +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemPrs3dPresentation::GetTableEnumValues (const int theRow, const int) const +{ + QList aValues; + switch (theRow) + { + case 4: + { + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_UNKNOWN)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Default)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Top)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Topmost)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_TopOSD)); + aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_BotOSD)); + } + break; + default: break; + } + return aValues; +} + + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemPrs3dPresentation::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + Handle(Prs3d_Presentation) aPrs = GetPresentation(); + switch (theRow) + { + case 0: return ViewControl_Table::SeparatorData(); + case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (Prs3d_Presentation)->Name()) + : ViewControl_Tools::GetPointerInfo (aPrs).ToCString(); + case 2: return ViewControl_Table::SeparatorData(); + case 3: return isFirstColumn ? QVariant ("DisplayPriority") : QVariant (aPrs->DisplayPriority()); + case 4: return isFirstColumn ? QVariant ("GetZLayer") + : QVariant (Graphic3d::ZLayerIdToString (aPrs->GetZLayer())); + case 5: return isFirstColumn ? QVariant ("MinMaxValues") + : QVariant (ViewControl_Tools::ToString (aPrs->MinMaxValues()).ToCString()); + case 6: return isFirstColumn ? QVariant ("ContainsFacet") : QVariant (aPrs->ContainsFacet()); + case 7: return isFirstColumn ? QVariant ("IsDeleted") : QVariant (aPrs->IsDeleted()); + case 8: return isFirstColumn ? QVariant ("IsDisplayed") : QVariant (aPrs->IsDisplayed()); + case 9: return isFirstColumn ? QVariant ("IsEmpty") : QVariant (aPrs->IsEmpty()); + case 10: return isFirstColumn ? QVariant ("IsInfinite") : QVariant (aPrs->IsInfinite()); + case 11: return isFirstColumn ? QVariant ("IsHighlighted") : QVariant (aPrs->IsHighlighted()); + case 12: return isFirstColumn ? QVariant ("IsTransformed") : QVariant (aPrs->IsTransformed()); + case 13: return isFirstColumn ? QVariant ("IsVisible") : QVariant (aPrs->IsVisible()); + default: return QVariant(); + } + return QVariant(); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemPrs3dPresentation::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + Handle(Prs3d_Presentation) aPrs = GetPresentation(); + switch (theRow) + { + case 8: aPrs->SetZLayer (Graphic3d::ZLayerIdFromString (theValue.toString().toStdString().c_str())); + default: return false; + } + return true; +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemPrs3dPresentation::buildPresentationShape() +{ + if (!myPresentation.IsNull()) + myPresentationShape = VInspector_Tools::CreateShape (myPresentation->MinMaxValues()); + + return TopoDS_Shape(); +} diff --git a/tools/VInspector/VInspector_ItemPrs3dPresentation.hxx b/tools/VInspector/VInspector_ItemPrs3dPresentation.hxx new file mode 100644 index 0000000000..97a06c4961 --- /dev/null +++ b/tools/VInspector/VInspector_ItemPrs3dPresentation.hxx @@ -0,0 +1,125 @@ +// 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 VInspector_ItemPrs3dPresentation_H +#define VInspector_ItemPrs3dPresentation_H + +#include +#include + +#include +#include + +class QItemSelectionModel; + +class VInspector_ItemPrs3dPresentation; +typedef QExplicitlySharedDataPointer VInspector_ItemPrs3dPresentationPtr; + +//! \class VInspector_ItemPrs3dPresentation +//! Item presents information about AIS_InteractiveObject. +//! Parent is item context, children are item selections. +class VInspector_ItemPrs3dPresentation : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemPrs3dPresentationPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemPrs3dPresentationPtr (new VInspector_ItemPrs3dPresentation (theParent, theRow, theColumn)); } + //! Destructor + virtual ~VInspector_ItemPrs3dPresentation() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myPresentation; } + + //! Returns the current presentation, init item if it was not initialized yet + //! \return presentation object + Standard_EXPORT Handle(Prs3d_Presentation) GetPresentation() const + { return Handle(Prs3d_Presentation)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of item selected + //! \return rows count + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) 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; + + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; + +private: + + //! Set presentation into the current field + //! \param thePresentation a presentation + //! \param theName the item name + void setPresentation (const Handle(Prs3d_Presentation)& thePresentation, + const TCollection_AsciiString& theName); + +private: + + //! Constructor + //! param theParent a parent item + VInspector_ItemPrs3dPresentation(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +protected: + + Handle(Prs3d_Presentation) myPresentation; //!< the current presentation + TCollection_AsciiString myName; //!< the item display data value +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelect3DSensitiveSetItem.cxx b/tools/VInspector/VInspector_ItemSelect3DSensitiveSetItem.cxx new file mode 100644 index 0000000000..c865b83c04 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelect3DSensitiveSetItem.cxx @@ -0,0 +1,197 @@ +// 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 + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +#include +//#include +//#include // child of Select3D_SensitiveSet +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +// +//#include +#include +//#include +#include +//#include +//#include +// +#include +//#include +#include +#include + +// ======================================================================= +// function : GetSensitiveEntity +// purpose : +// ======================================================================= +Handle(Standard_Transient) VInspector_ItemSelect3DSensitiveSetItem::GetObject() const +{ + //initItem(); // to update presentation shapes + VInspector_ItemSelectBasicsSensitiveEntityPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + return aParentItem->GetSensitiveEntity(); + return Handle(Standard_Transient)(); +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelect3DSensitiveSetItem::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity(); + if (anEntity.IsNull()) + return QVariant(); + + switch (theItemRole) + { + case Qt::DisplayRole: + case Qt::EditRole: + case Qt::ToolTipRole: + { + switch (Column()) + { + case 0: return QString ("Index = %1").arg (Row()); + default: + break; + } + break; + } + case Qt::BackgroundRole: + case Qt::ForegroundRole: + { + VInspector_ItemSelectBasicsSensitiveEntityPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + return aParentItem->data(QModelIndex(), theItemRole); + break; + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemSelect3DSensitiveSetItem::Init() +{ + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemSelect3DSensitiveSetItem::Reset() +{ + // an empty method to don't clear the main label, otherwise the model will be empty + TreeModel_ItemBase::Reset(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemSelect3DSensitiveSetItem::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelect3DSensitiveSetItem::GetTableRowCount() const +{ + return 1; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelect3DSensitiveSetItem::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + Handle(Select3D_SensitiveSet) aSensitiveSet = Handle(Select3D_SensitiveSet)::DownCast (GetSensitiveEntity()); + if (aSensitiveSet.IsNull() || aSensitiveSet->Size() <= Row()) + return "Empty Select3D_SensitiveSet item"; + + Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity(); + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("Box") : QVariant (VInspector_Tools::ToVariant (aSensitiveSet->Box (Row()))); + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemSelect3DSensitiveSetItem::buildPresentationShape() +{ + Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity(); + if (anEntity.IsNull()) + return TopoDS_Shape(); + + Handle(Select3D_SensitiveSet) aSensitiveSet = Handle(Select3D_SensitiveSet)::DownCast (GetSensitiveEntity()); + if (aSensitiveSet.IsNull() || aSensitiveSet->Size() < Row()) + return TopoDS_Shape(); + + Select3D_BndBox3d aBndBox = aSensitiveSet->Box (Row()); + return VInspector_Tools::CreateShape (aBndBox); +} diff --git a/tools/VInspector/VInspector_ItemSelect3DSensitiveSetItem.hxx b/tools/VInspector/VInspector_ItemSelect3DSensitiveSetItem.hxx new file mode 100644 index 0000000000..8b164ed38d --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelect3DSensitiveSetItem.hxx @@ -0,0 +1,130 @@ +// 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 VInspector_ItemSelect3DSensitiveSetItem_H +#define VInspector_ItemSelect3DSensitiveSetItem_H + +#include +#include +#include +#include +#include + +class QItemSelectionModel; +class VInspector_ItemSelect3DSensitiveSetItem; + +typedef QExplicitlySharedDataPointer VInspector_ItemSelect3DSensitiveSetItemPtr; + +//! \class VInspector_ItemSelect3DSensitiveSetItem +//! The item shows information about SelectBasics_EntityOwner. +//! The parent is item selection, children are item entity owners +class VInspector_ItemSelect3DSensitiveSetItem : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelect3DSensitiveSetItemPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelect3DSensitiveSetItemPtr (new VInspector_ItemSelect3DSensitiveSetItem (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelect3DSensitiveSetItem() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const; + + //! \return the current sensitive entity + Standard_EXPORT Handle(SelectBasics_SensitiveEntity) GetSensitiveEntity() const + { return Handle(SelectBasics_SensitiveEntity)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns presentation of the attribute to be visualized in the view + //! \thePresentations [out] container of presentation handles to be visualized + //Standard_EXPORT virtual void GetPresentations (NCollection_List& thePresentations); + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + //virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + //virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! \return number of children. + virtual int initRowCount() const Standard_OVERRIDE { return 0; } + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + { return TreeModel_ItemBasePtr(); } + + //! Returns owner of the current sensitive entity + //! \return owner + //Handle(SelectBasics_EntityOwner) getEntityOwner() const; + + //! Returns table value for the row in form: depending on the aspect kind + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theEntityKind kind or kind of entity + QVariant getTableData (const int theRow, + const int theColumn, + const int theRole, + const TCollection_AsciiString& theEntityKind) const; + +protected: + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; + + //! Constructor + //! param theParent a parent item + VInspector_ItemSelect3DSensitiveSetItem(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.cxx b/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.cxx new file mode 100644 index 0000000000..a52eefd941 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.cxx @@ -0,0 +1,278 @@ +// 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 +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectBasicsEntityOwner::initValue(int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + switch (theItemRole) + { + case Qt::DisplayRole: + case Qt::EditRole: + case Qt::ToolTipRole: + { + Handle(SelectBasics_EntityOwner) anOwner = getEntityOwner(); + if (anOwner.IsNull()) + return QVariant(); + + switch (Column()) + { + case 0: return anOwner->DynamicType()->Name(); + default: break; + } + break; + } + case Qt::BackgroundRole: + case Qt::ForegroundRole: + { + if (Column() == 2) + { + Handle(AIS_InteractiveContext) aContext = GetContext(); + if (!aContext.IsNull()) + { + if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner())) + return (theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white); + } + } + VInspector_ItemSelectMgrSensitiveEntityPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + return aParentItem->data(QModelIndex(), theItemRole); + break; + } + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemSelectBasicsEntityOwner::Init() +{ + Handle(SelectBasics_EntityOwner) anOwner; + + VInspector_ItemSelectMgrSensitiveEntityPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + { + Handle(SelectMgr_SensitiveEntity) anEntity = aParentItem->GetSensitiveEntity(); + if (!anEntity.IsNull() && !anEntity->BaseSensitive().IsNull()) + anOwner = anEntity->BaseSensitive()->OwnerId(); + } + else + { + VInspector_ItemPresentableObjectPtr aPOItem = itemDynamicCast(Parent()); + if (aPOItem) + { + Handle(AIS_InteractiveObject) anIO = aPOItem->GetInteractiveObject(); + + int aRowId = Row(); + int aCurrentIndex = 0; +#if OCC_VERSION_HEX < 0x070201 + for (anIO->Init(); anIO->More() && anOwner.IsNull(); anIO->Next()) + { + const Handle(SelectMgr_Selection)& aSelection = anIO->CurrentSelection(); + for (aSelection->Init(); aSelection->More() && anOwner.IsNull(); aSelection->Next()) + { + Handle(SelectMgr_SensitiveEntity) anEntity = aSelection->Sensitive(); +#else + for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anIO->Selections()); aSelIter.More() && anOwner.IsNull(); aSelIter.Next()) + { + const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value(); + for (NCollection_Vector::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More() && anOwner.IsNull(); aSelEntIter.Next()) + { + Handle(SelectMgr_SensitiveEntity) anEntity = aSelEntIter.Value(); +#endif + const Handle(SelectBasics_SensitiveEntity)& aBase = anEntity->BaseSensitive(); + if (!aBase.IsNull()) + { + if (aRowId == aCurrentIndex) + anOwner = aBase->OwnerId(); + aCurrentIndex++; + } + } + } + } + } + myOwner = anOwner; + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemSelectBasicsEntityOwner::Reset() +{ + VInspector_ItemBase::Reset(); + SetContext (NULL); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemSelectBasicsEntityOwner::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectBasicsEntityOwner::GetTableRowCount() const +{ + return 20; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemSelectBasicsEntityOwner::GetTableEditType(const int theRow, const int) const +{ + switch (theRow) + { + case 0: return ViewControl_EditType_Spin; + default: return ViewControl_EditType_None; + } + return ViewControl_EditType_None; +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemSelectBasicsEntityOwner::GetTableEnumValues(const int theRow, const int) const +{ + QList aValues; + /*switch (theRow) + { + case 5: + { + for (int i = 0; i <= Aspect_TOFM_FRONT_SIDE; i++) + aValues.append (Aspect::TypeOfFacingModelToString((Aspect_TypeOfFacingModel)i)); + } + break; + case 17: + { + for (int i = 0; i <= PrsMgr_TOP_ProjectorDependant; i++) + aValues.append (PrsMgr::TypeOfPresentation3dToString ((PrsMgr_TypeOfPresentation3d)i)); + } + break; + default: break; + }*/ + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectBasicsEntityOwner::GetTableData(const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + Handle(SelectBasics_EntityOwner) anOwner = getEntityOwner(); + Handle(SelectMgr_EntityOwner) anEntityOwner = Handle(SelectMgr_EntityOwner)::DownCast (anOwner); + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("Priority") : QVariant (anOwner->Priority()); + case 1: return isFirstColumn ? QVariant ("HasLocation") : QVariant (anOwner->HasLocation()); + case 2: return isFirstColumn ? QVariant ("Location") : + (anOwner->HasLocation() ? QVariant (ViewControl_Tools::ToString (anOwner->Location()).ToCString()) : QVariant()); + case 3: return isFirstColumn ? QVariant ("IsSelected") : QVariant (!anEntityOwner.IsNull() ? anEntityOwner->IsSelected() : ""); + default: break; + } + + + Handle(StdSelect_BRepOwner) aBROwner = Handle(StdSelect_BRepOwner)::DownCast (anOwner); + if (aBROwner.IsNull()) + return QVariant(); + + int aBRepOwnerRow = theRow - 4; + switch (aBRepOwnerRow) + { + case 0: return ViewControl_Table::SeparatorData(); + case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (StdSelect_BRepOwner)->Name()) + : ViewControl_Tools::GetPointerInfo (aBROwner).ToCString(); + case 2: return ViewControl_Table::SeparatorData(); + case 3: return isFirstColumn ? QVariant ("HilightMode") : QVariant (aBROwner->HilightMode()); + case 4: return isFirstColumn ? QVariant ("Shape") : + (!aBROwner->Shape().IsNull() ? ViewControl_Tools::GetPointerInfo (aBROwner->Shape().TShape()).ToCString() : QVariant()); + case 5: return isFirstColumn ? QVariant ("ShapeType") : + (!aBROwner->Shape().IsNull() ? VInspector_Tools::GetShapeTypeInfo (aBROwner->Shape().ShapeType()).ToCString() : QVariant()); + default: return QVariant(); + } + return QVariant(); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemSelectBasicsEntityOwner::SetTableData(const int theRow, const int, const QVariant& theValue) +{ + Handle(SelectBasics_EntityOwner) anOwner = getEntityOwner(); + switch (theRow) + { + case 0: anOwner->SetPriority (theValue.toInt()); + default: return false; + } + return true; +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemSelectBasicsEntityOwner::buildPresentationShape() +{ + Handle(StdSelect_BRepOwner) aBROwner = Handle(StdSelect_BRepOwner)::DownCast (myOwner); + if (aBROwner.IsNull()) + return TopoDS_Shape(); + + return aBROwner->Shape(); +} diff --git a/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.hxx b/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.hxx new file mode 100644 index 0000000000..bf544d43c1 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.hxx @@ -0,0 +1,124 @@ +// 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 VInspector_ItemSelectBasicsEntityOwner_H +#define VInspector_ItemSelectBasicsEntityOwner_H + +#include +#include +#include + +class QItemSelectionModel; + +class VInspector_ItemSelectBasicsEntityOwner; +typedef QExplicitlySharedDataPointer VInspector_ItemSelectBasicsEntityOwnerPtr; + +//! \class VInspector_ItemPresentableObject +//! Item for selection entity owner. The parent is sensitive entity item, there are no children +class VInspector_ItemSelectBasicsEntityOwner : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectBasicsEntityOwnerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectBasicsEntityOwnerPtr (new VInspector_ItemSelectBasicsEntityOwner (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectBasicsEntityOwner() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myOwner; } + + //! Returns the current entity owner + Handle(SelectBasics_EntityOwner) EntityOwner() const { return myOwner; } + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType(const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues(const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData(const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData(const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + //! \return number of children. + virtual int initRowCount() const Standard_OVERRIDE{ return 0; } + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + +protected: + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape(); + + //! 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 + { (void)theRow; (void)theColumn; return TreeModel_ItemBasePtr(); } + +private: + + //! Constructor + //! param theParent a parent item + VInspector_ItemSelectBasicsEntityOwner(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + + //! Returns the current entity owner. Initializes the item if it was not initialized yet + Handle(SelectBasics_EntityOwner) getEntityOwner() const + { return Handle(SelectBasics_EntityOwner)::DownCast (GetObject()); } + +private: + + Handle(SelectBasics_EntityOwner) myOwner; //!< the current entity owner +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.cxx b/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.cxx new file mode 100644 index 0000000000..af955e3a98 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.cxx @@ -0,0 +1,506 @@ +// 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 +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // child of Select3D_SensitiveSet +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +int VInspector_ItemSelectBasicsSensitiveEntity::initRowCount() const +{ + Handle(Select3D_SensitiveSet) aSensitiveSet = Handle(Select3D_SensitiveSet)::DownCast (GetSensitiveEntity()); + if (!aSensitiveSet.IsNull()) + return aSensitiveSet->Size(); + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectBasicsSensitiveEntity::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity(); + if (anEntity.IsNull()) + return QVariant(); + + Handle(SelectBasics_EntityOwner) anOwner = anEntity->OwnerId(); + + switch (theItemRole) + { + case Qt::DisplayRole: + case Qt::EditRole: + case Qt::ToolTipRole: + { + switch (Column()) + { + case 0: return anEntity->DynamicType()->Name(); + default: + break; + } + break; + } + case Qt::BackgroundRole: + case Qt::ForegroundRole: + { + if (Column() == 2) + { + Handle(AIS_InteractiveContext) aContext = GetContext(); + if (!aContext.IsNull()) + { + if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner())) + return QVariant ((theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white)); + } + } + VInspector_ItemSelectMgrSensitiveEntityPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + return aParentItem->data(QModelIndex(), theItemRole); + break; + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectBasicsSensitiveEntity::createChild (int theRow, int theColumn) +{ + return VInspector_ItemSelect3DSensitiveSetItem::CreateItem (currentItem(), theRow, theColumn); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemSelectBasicsSensitiveEntity::Init() +{ + VInspector_ItemSelectMgrSensitiveEntityPtr aParentItem = itemDynamicCast(Parent()); + + Handle(SelectMgr_SensitiveEntity) anEntity = aParentItem->GetSensitiveEntity(); + + myEntity = anEntity->BaseSensitive(); + + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemSelectBasicsSensitiveEntity::Reset() +{ + // an empty method to don't clear the main label, otherwise the model will be empty + TreeModel_ItemBase::Reset(); + myEntity = NULL; + //if (!myPresentation.IsNull() && !myPresentation->GetContext().IsNull()) + //{ + // myPresentation->GetContext()->Erase (myPresentation, Standard_False); + // myPresentation = NULL; + //} +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemSelectBasicsSensitiveEntity::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : getEntityOwner +// purpose : +// ======================================================================= +Handle(SelectBasics_EntityOwner) VInspector_ItemSelectBasicsSensitiveEntity::getEntityOwner() const +{ + initItem(); + + Handle(SelectBasics_EntityOwner) anOwner; + const Handle(SelectBasics_SensitiveEntity)& aBase = GetSensitiveEntity(); + if (aBase.IsNull()) + return anOwner; + return aBase->OwnerId(); +} + +// ======================================================================= +// function : GetPresentations +// purpose : +// ======================================================================= +void VInspector_ItemSelectBasicsSensitiveEntity::GetPresentations(NCollection_List& thePresentations) +{ + if (Column() != 0) + return; + + if (!myPresentation.IsNull()) + return; + + Handle(Select3D_SensitiveEntity) aBaseEntity = Handle(Select3D_SensitiveEntity)::DownCast (GetSensitiveEntity()); + if (aBaseEntity.IsNull()) + return; + + TopoDS_Shape aShape = GetPresentationShape(); + if (aShape.IsNull()) + return; + + myPresentation = new AIS_Shape (aShape); + myPresentation->SetColor (Quantity_Color (Quantity_NOC_BLUE1)); + thePresentations.Append (myPresentation); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectBasicsSensitiveEntity::GetTableRowCount() const +{ + return 40; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemSelectBasicsSensitiveEntity::GetTableEditType(const int theRow, const int) const +{ + switch (theRow) + { + case 3: return ViewControl_EditType_Spin; + default: return ViewControl_EditType_None; + } +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectBasicsSensitiveEntity::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity(); + if (anEntity.IsNull()) + return QVariant(); + + switch (theRow) + { + case 0: return ViewControl_Table::SeparatorData(); + case 1: return isFirstColumn ? QVariant(STANDARD_TYPE(SelectBasics_SensitiveEntity)->Name()) + : ViewControl_Tools::GetPointerInfo (anEntity).ToCString(); + case 2: return ViewControl_Table::SeparatorData(); + + case 3: return isFirstColumn ? QVariant ("SensitivityFactor") : QVariant(anEntity->SensitivityFactor()); + case 4: return isFirstColumn ? QVariant ("NbSubElements") : QVariant (anEntity->NbSubElements()); + case 5: return isFirstColumn ? QVariant ("BoundingBox") : QVariant (VInspector_Tools::ToVariant (anEntity->BoundingBox())); + + case 6: return isFirstColumn ? QVariant ("HasInitLocation") : QVariant (anEntity->HasInitLocation()); + case 7: return isFirstColumn ? QVariant ("InvInitLocation") + : QVariant (ViewControl_Tools::ToString (anEntity->InvInitLocation().Trsf()).ToCString()); + + case 8: return ViewControl_Table::SeparatorData(); + case 9: return isFirstColumn ? QVariant (anEntity->DynamicType()->Name()) + : ViewControl_Tools::GetPointerInfo (anEntity).ToCString(); + case 10: return ViewControl_Table::SeparatorData(); + default: return getTableData (theRow, theColumn, theRole, anEntity->DynamicType()->Name()); + } + return QVariant(); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemSelectBasicsSensitiveEntity::SetTableData(const int theRow, const int, const QVariant& theValue) +{ + Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity(); + switch (theRow) + { + case 3: anEntity->SetSensitivityFactor(theValue.toInt()); + //case 5: aPrs->SetCurrentFacingModel (Aspect::TypeOfFacingModelFromString (theValue.toString().toStdString().c_str())); + //case 6: aPrs->SetInfiniteState (theValue.toBool()); + //case 12: aPrs->SetAutoHilight(theValue.toBool()); + //case 17: aPrs->SetTypeOfPresentation (PrsMgr::TypeOfPresentation3dFromString (theValue.toString().toStdString().c_str())); + //case 18: aPrs->SetMutable (theValue.toBool()); + default: return false; + } + return true; +} + +// ======================================================================= +// function : getTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectBasicsSensitiveEntity::getTableData (const int theRow, + const int theColumn, + const int, + const TCollection_AsciiString& theEntityKind) const +{ + Handle(Select3D_SensitiveEntity) aBaseEntity = Handle(Select3D_SensitiveEntity)::DownCast (GetSensitiveEntity()); + if (aBaseEntity.IsNull()) + return QVariant(); + + int aRow = theRow - 11; + bool isFirstColumn = theColumn == 0; + + if (aRow == 0) + return isFirstColumn ? QVariant ("CenterOfGeometry") + : QVariant (ViewControl_Tools::ToString (aBaseEntity->CenterOfGeometry()).ToCString()); + aRow = aRow - 1; // for Select3D_SensitiveEntity common value + + Handle(Select3D_SensitiveSet) aSetEntity = Handle(Select3D_SensitiveSet)::DownCast (aBaseEntity); + if (!aSetEntity.IsNull()) + { + if (aRow == 0) + { + return isFirstColumn ? QVariant ("Size") : QVariant (aSetEntity->Size()); + } + aRow = aRow - 1; // for Select3D_SensitiveSet common value + } + //if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveBox)->Name()) + //{ + //Handle(Select3D_SensitiveBox) anEntity = Handle(Select3D_SensitiveBox)::DownCast (aBaseEntity); + //} + if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveCircle)->Name()) + { + Handle(Select3D_SensitiveCircle) anEntity = Handle(Select3D_SensitiveCircle)::DownCast (aBaseEntity); + //if (aRow == 0) + } + if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveCurve)->Name()) + { + Handle(Select3D_SensitiveCurve) anEntity = Handle(Select3D_SensitiveCurve)::DownCast (aBaseEntity); + //if (aRow == 0) + } + if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveFace)->Name()) + { + Handle(Select3D_SensitiveFace) anEntity = Handle(Select3D_SensitiveFace)::DownCast (aBaseEntity); + if (aRow == 0) + { + if (isFirstColumn) + return "GetPoints"; + else + { + Handle(TColgp_HArray1OfPnt) aPoints; + anEntity->GetPoints (aPoints); + return ViewControl_Tools::ToString (aPoints).ToCString(); + } + } + } + else if (theEntityKind == STANDARD_TYPE (Select3D_SensitivePoint)->Name()) + { + Handle(Select3D_SensitivePoint) anEntity = Handle(Select3D_SensitivePoint)::DownCast (aBaseEntity); + if (aRow == 0) + return isFirstColumn ? QVariant ("Point") : QVariant (ViewControl_Tools::ToString (anEntity->Point()).ToCString()); + } + else if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveSegment)->Name()) + { + Handle(Select3D_SensitiveSegment) anEntity = Handle(Select3D_SensitiveSegment)::DownCast (aBaseEntity); + switch (aRow) + { + case 0: return isFirstColumn ? QVariant ("StartPoint") : QVariant (ViewControl_Tools::ToString (anEntity->StartPoint()).ToCString()); + case 1: return isFirstColumn ? QVariant ("EndPoint") : QVariant (ViewControl_Tools::ToString (anEntity->EndPoint()).ToCString()); + default: break; + } + } + //Select3D_SensitiveSet + else if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveTriangle)->Name()) + { + Handle(Select3D_SensitiveTriangle) anEntity = Handle(Select3D_SensitiveTriangle)::DownCast (aBaseEntity); + gp_Pnt aPnt0, aPnt1, aPnt2; + anEntity->Points3D (aPnt0, aPnt1, aPnt2); + switch (aRow) + { + case 0: return isFirstColumn ? QVariant ("Points (0)") : QVariant (ViewControl_Tools::ToString (aPnt0).ToCString()); + case 1: return isFirstColumn ? QVariant ("Points (1)") : QVariant (ViewControl_Tools::ToString (aPnt1).ToCString()); + case 2: return isFirstColumn ? QVariant ("Points (2)") : QVariant (ViewControl_Tools::ToString (aPnt2).ToCString()); + default: break; + } + } + //Select3D_InteriorSensitivePointSet + //Select3D_SensitiveGroup + else if (theEntityKind == STANDARD_TYPE (Select3D_SensitivePoly)->Name() || + theEntityKind == STANDARD_TYPE (Select3D_SensitiveCircle)->Name() || + theEntityKind == STANDARD_TYPE (Select3D_SensitiveCurve)->Name()) + { + if (aRow == 0) + { + if (isFirstColumn) + return "GetPoints"; + else + { + Handle(Select3D_SensitivePoly) anEntity = Handle(Select3D_SensitivePoly)::DownCast (aBaseEntity); + Handle(TColgp_HArray1OfPnt) aPoints; + anEntity->Points3D (aPoints); + return ViewControl_Tools::ToString (aPoints).ToCString(); + } + } + } + else if (theEntityKind == STANDARD_TYPE (Select3D_SensitivePrimitiveArray)->Name()) + { + // TODO + } + else if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveTriangulation)->Name()) + { + Handle(Select3D_SensitiveTriangulation) anEntity = Handle(Select3D_SensitiveTriangulation)::DownCast (aBaseEntity); + if (aRow == 0) + return isFirstColumn ? QVariant ("Triangulation") : QVariant (ViewControl_Tools::GetPointerInfo (anEntity->Triangulation()).ToCString()); + } + //Select3D_SensitiveWire + return QVariant(); +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemSelectBasicsSensitiveEntity::buildPresentationShape + (const Handle(SelectBasics_SensitiveEntity)& theEntity) +{ + Handle(Select3D_SensitiveEntity) aBaseEntity = Handle(Select3D_SensitiveEntity)::DownCast (theEntity); + if (aBaseEntity.IsNull()) + return TopoDS_Shape(); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (aBaseEntity->CenterOfGeometry())); + + Select3D_BndBox3d aBoundingBox = aBaseEntity->BoundingBox(); + if (aBoundingBox.IsValid()) + aBuilder.Add (aCompound, VInspector_Tools::CreateShape (aBoundingBox)); + + Standard_CString aTypeName = aBaseEntity->DynamicType()->Name(); + if (aTypeName == STANDARD_TYPE (Select3D_SensitiveBox)->Name()) + { + Handle(Select3D_SensitiveBox) anEntity = Handle(Select3D_SensitiveBox)::DownCast (aBaseEntity); + TopoDS_Shape aShape = VInspector_Tools::CreateShape(anEntity->Box()); + aBuilder.Add (aCompound, aShape); + } + else if (aTypeName == STANDARD_TYPE (Select3D_SensitiveFace)->Name()) + { + Handle(Select3D_SensitiveFace) anEntity = Handle(Select3D_SensitiveFace)::DownCast (aBaseEntity); + Handle(TColgp_HArray1OfPnt) aPoints; + anEntity->GetPoints (aPoints); + for (Standard_Integer aPntIter = aPoints->Lower(); aPntIter <= aPoints->Upper(); ++aPntIter) + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPoints->Value (aPntIter))); + } + else if (aTypeName == STANDARD_TYPE (Select3D_SensitivePoint)->Name()) + { + Handle(Select3D_SensitivePoint) anEntity = Handle(Select3D_SensitivePoint)::DownCast (aBaseEntity); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(anEntity->Point())); + } + else if (aTypeName == STANDARD_TYPE (Select3D_SensitiveSegment)->Name()) + { + Handle(Select3D_SensitiveSegment) anEntity = Handle(Select3D_SensitiveSegment)::DownCast (aBaseEntity); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge(anEntity->StartPoint(), anEntity->EndPoint())); + } + else if (aTypeName == STANDARD_TYPE (Select3D_SensitiveTriangle)->Name()) + { + Handle(Select3D_SensitiveTriangle) anEntity = Handle(Select3D_SensitiveTriangle)::DownCast (aBaseEntity); + gp_Pnt aPnt0, aPnt1, aPnt2; + anEntity->Points3D (aPnt0, aPnt1, aPnt2); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPnt0)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPnt1)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPnt2)); + } + else if (aTypeName == STANDARD_TYPE (Select3D_SensitivePoly)->Name() || + aTypeName == STANDARD_TYPE (Select3D_SensitiveCircle)->Name() || + aTypeName == STANDARD_TYPE (Select3D_SensitiveCurve)->Name()) + { + Handle(Select3D_SensitivePoly) anEntity = Handle(Select3D_SensitivePoly)::DownCast (aBaseEntity); + + Handle(TColgp_HArray1OfPnt) aPoints; + anEntity->Points3D (aPoints); + for (Standard_Integer aPntIter = aPoints->Lower(); aPntIter <= aPoints->Upper(); ++aPntIter) + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPoints->Value (aPntIter))); + } + else if (aTypeName == STANDARD_TYPE (Select3D_SensitivePrimitiveArray)->Name()) + { + } + else if (aTypeName == STANDARD_TYPE (Select3D_SensitiveTriangulation)->Name()) + { + Handle(Select3D_SensitiveTriangulation) anEntity = Handle(Select3D_SensitiveTriangulation)::DownCast (aBaseEntity); + const Handle(Poly_Triangulation)& aPolyTriangulation = anEntity->Triangulation(); + if (!aPolyTriangulation.IsNull()) + { + TopoDS_Face aFace; + aBuilder.MakeFace (aFace, aPolyTriangulation); + aBuilder.Add (aCompound, aFace); + } + } + + return aCompound; +} diff --git a/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.hxx b/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.hxx new file mode 100644 index 0000000000..58cf8cf711 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.hxx @@ -0,0 +1,140 @@ +// 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 VInspector_ItemSelectBasicsSensitiveEntity_H +#define VInspector_ItemSelectBasicsSensitiveEntity_H + +#include +#include +#include +#include +#include +#include + +class QItemSelectionModel; +class VInspector_ItemSelectBasicsSensitiveEntity; + +typedef QExplicitlySharedDataPointer VInspector_ItemSelectBasicsSensitiveEntityPtr; + +//! \class VInspector_ItemSelectBasicsSensitiveEntity +//! The item shows information about SelectBasics_EntityOwner. +//! The parent is item selection, children are item entity owners +class VInspector_ItemSelectBasicsSensitiveEntity : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectBasicsSensitiveEntityPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectBasicsSensitiveEntityPtr (new VInspector_ItemSelectBasicsSensitiveEntity (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectBasicsSensitiveEntity() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myEntity; } + + //! \return the current sensitive entity + Standard_EXPORT Handle(SelectBasics_SensitiveEntity) GetSensitiveEntity() const + { return Handle(SelectBasics_SensitiveEntity)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns presentation of the attribute to be visualized in the view + //! \thePresentations [out] container of presentation handles to be visualized + Standard_EXPORT virtual void GetPresentations (NCollection_List& thePresentations); + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! \return number of children. + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 owner of the current sensitive entity + //! \return owner + Handle(SelectBasics_EntityOwner) getEntityOwner() const; + + //! Returns table value for the row in form: depending on the aspect kind + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theEntityKind kind or kind of entity + QVariant getTableData (const int theRow, + const int theColumn, + const int theRole, + const TCollection_AsciiString& theEntityKind) const; + +protected: + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE { return buildPresentationShape (myEntity); } + + //! Creates shape depending on the entity kind and parameters + //! \param theEntity current sensitive entity + //! \return shape or NULL + static TopoDS_Shape buildPresentationShape (const Handle(SelectBasics_SensitiveEntity)& theEntity); + + //! Constructor + //! param theParent a parent item + VInspector_ItemSelectBasicsSensitiveEntity(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + + Handle(SelectBasics_SensitiveEntity) myEntity; //!< the current sensitive entity + Handle(AIS_InteractiveObject) myPresentation; //!< the current presentation +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrBaseFrustum.cxx b/tools/VInspector/VInspector_ItemSelectMgrBaseFrustum.cxx new file mode 100644 index 0000000000..73e7dc02db --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrBaseFrustum.cxx @@ -0,0 +1,212 @@ +// Created on: 2019-02-04 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrBaseFrustum::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrBaseFrustum::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle (SelectMgr_BaseFrustum) aFrustum = GetFrustum(); + if (aFrustum.IsNull()) + return Column() == 0 ? "Empty frustum" : ""; + + switch (Column()) + { + case 0: return aFrustum->DynamicType()->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrBaseFrustum::Init() +{ + VInspector_ItemSelectMgrSelectingVolumeManagerPtr aParentItem = itemDynamicCast(Parent()); + + Handle(SelectMgr_BaseFrustum) aFrustum; + if (aParentItem) + { + SelectMgr_SelectingVolumeManager aVolumeManager; + if (aParentItem->GetViewerSelector (aVolumeManager)) + { + aFrustum = aVolumeManager.ActiveVolume(); + } + } + setFrustum (aFrustum); + + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrBaseFrustum::Reset() +{ + VInspector_ItemBase::Reset(); + + setFrustum (NULL); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrBaseFrustum::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : Dump +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemSelectMgrBaseFrustum::Dump (Standard_OStream& OS) const +{ + Handle(SelectMgr_BaseFrustum) aFrustum = GetFrustum(); + + if (aFrustum.IsNull()) + return Standard_False; + + aFrustum->Dump (OS); + return Standard_True; +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrBaseFrustum::GetTableRowCount() const +{ + return 60; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrBaseFrustum::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(SelectMgr_BaseFrustum) aView = GetFrustum(); + if (aView.IsNull()) + return QVariant(); + + //bool isFirstColumn = theColumn == 0; + //switch (theRow) + //{ + // case 0: + // { + // if (isFirstColumn) + // return QVariant ("ImmediateUpdate"); + + // Standard_Boolean aCurState = aView->SetImmediateUpdate (Standard_False); + // aView->SetImmediateUpdate (aCurState); + + // return aCurState; + // } + // break; + // case 1: + // { + // if (isFirstColumn) + // return QVariant ("ActiveLights"); + + // V3d_ListOfLightIterator aLightsIt = aView->ActiveLightIterator(); + // Standard_Integer aNbOfLights = 0; + // while (aLightsIt.More()) + // { + // aNbOfLights++; + // aLightsIt.Next(); + // } + // return aNbOfLights; + // } + // case 2: + // { + // if (isFirstColumn) + // return QVariant ("Axis: origin"); + + // Standard_Real aX, anY, aZ, aVx, aVy, aVz; + // aView->Axis (aX, anY, aZ, aVx, aVy, aVz); + + // return ViewControl_Tools::ToString (gp_Pnt (aX, anY, aZ)).ToCString(); + // } + // case 3: + // { + // if (isFirstColumn) + // return QVariant ("Axis: direction"); + + // Standard_Real aX, anY, aZ, aVx, aVy, aVz; + // aView->Axis (aX, anY, aZ, aVx, aVy, aVz); + + // return ViewControl_Tools::ToString (gp_Dir (aVx, aVy, aVz)).ToCString(); + // } + // case 4: return isFirstColumn ? QVariant ("ComputedMode") : QVariant (aView->ComputedMode()); + // case 5: return isFirstColumn ? QVariant ("AutoZFitMode") : QVariant (aView->AutoZFitMode()); + // case 6: return isFirstColumn ? QVariant ("AutoZFitScaleFactor") : QVariant (aView->AutoZFitScaleFactor()); + //} + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectMgrBaseFrustum::createChild (int theRow, int theColumn) +{ + //if (theRow == 0) + // return VInspector_ItemGraphic3dCamera::CreateItem (currentItem(), theRow, theColumn); + //else if (theRow == 1) + // return VInspector_ItemAspectWindow::CreateItem (currentItem(), theRow, theColumn); + //else if (theRow == 2) + // return VInspector_ItemGraphic3dCView::CreateItem (currentItem(), theRow, theColumn); + // + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemSelectMgrBaseFrustum.hxx b/tools/VInspector/VInspector_ItemSelectMgrBaseFrustum.hxx new file mode 100644 index 0000000000..37393debee --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrBaseFrustum.hxx @@ -0,0 +1,109 @@ +// Created on: 2019-02-04 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemSelectMgrBaseFrustum_H +#define VInspector_ItemSelectMgrBaseFrustum_H + +#include +#include + +#include +#include + +class VInspector_ItemSelectMgrBaseFrustum; +typedef QExplicitlySharedDataPointer VInspector_ItemSelectMgrBaseFrustumPtr; + +//! \class VInspector_ItemSelectMgrBaseFrustum +//! Parent item, that corresponds Folder under the AIS_InteractiveContext +//! Children of the item are: none +class VInspector_ItemSelectMgrBaseFrustum : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectMgrBaseFrustumPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectMgrBaseFrustumPtr (new VInspector_ItemSelectMgrBaseFrustum (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectMgrBaseFrustum() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myFrustum; } + + //! Returns current drawer, initialize the drawer if it was not initialized yet + Standard_EXPORT Handle(SelectMgr_BaseFrustum) GetFrustum() const + { return Handle(SelectMgr_BaseFrustum)::DownCast (GetObject()); } + + //! Dumps the content of me on the stream . + virtual Standard_Boolean Dump (Standard_OStream& OS) const; + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! 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: + + //! Set V3d viewer selector into the current field + //! \param theFrustum a viewer selector + void setFrustum (const Handle(SelectMgr_BaseFrustum)& theFrustum) { myFrustum = theFrustum; } + +private: + + //! 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 + VInspector_ItemSelectMgrBaseFrustum(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +protected: + + Handle(SelectMgr_BaseFrustum) myFrustum; //!< the current viewer selector +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrFilter.cxx b/tools/VInspector/VInspector_ItemSelectMgrFilter.cxx index a274b05256..70bf35e55d 100644 --- a/tools/VInspector/VInspector_ItemSelectMgrFilter.cxx +++ b/tools/VInspector/VInspector_ItemSelectMgrFilter.cxx @@ -30,6 +30,10 @@ // ======================================================================= QVariant VInspector_ItemSelectMgrFilter::initValue (int theItemRole) const { + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + if (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole) { Handle(SelectMgr_Filter) aFilter = GetFilter(); @@ -37,8 +41,6 @@ QVariant VInspector_ItemSelectMgrFilter::initValue (int theItemRole) const { case 0: return theItemRole == Qt::ToolTipRole ? QVariant ("") : QVariant (aFilter->DynamicType()->Name()); - case 1: return rowCount() > 0 ? QVariant (rowCount()) : QVariant(); - case 2: return VInspector_Tools::GetPointerInfo (aFilter, true).ToCString(); default: break; } } @@ -127,12 +129,3 @@ void VInspector_ItemSelectMgrFilter::initItem() const const_cast(this)->Init(); } -// ======================================================================= -// function : GetInteractiveObject -// purpose : -// ======================================================================= -Handle(SelectMgr_Filter) VInspector_ItemSelectMgrFilter::GetFilter() const -{ - initItem(); - return myFilter; -} diff --git a/tools/VInspector/VInspector_ItemSelectMgrFilter.hxx b/tools/VInspector/VInspector_ItemSelectMgrFilter.hxx index 68408359e2..d94a599be3 100644 --- a/tools/VInspector/VInspector_ItemSelectMgrFilter.hxx +++ b/tools/VInspector/VInspector_ItemSelectMgrFilter.hxx @@ -40,9 +40,14 @@ public: //! Destructor virtual ~VInspector_ItemSelectMgrFilter() Standard_OVERRIDE {}; + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myFilter; } + //! Returns the current filter, init item if it was not initialized yet //! \return filter object - Standard_EXPORT Handle(SelectMgr_Filter) GetFilter() const; + Standard_EXPORT Handle(SelectMgr_Filter) GetFilter() const + { return Handle(SelectMgr_Filter)::DownCast (GetObject()); } //! Inits the item, fills internal containers Standard_EXPORT virtual void Init() Standard_OVERRIDE; diff --git a/tools/VInspector/VInspector_ItemSelectMgrSelectableObjectSet.cxx b/tools/VInspector/VInspector_ItemSelectMgrSelectableObjectSet.cxx new file mode 100644 index 0000000000..8f2051acb5 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSelectableObjectSet.cxx @@ -0,0 +1,188 @@ +// Created on: 2019-04-29 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include + +#include + +#include + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSelectableObjectSet::initRowCount() const +{ + if (Column() != 0) + return 0; + + return SelectMgr_SelectableObjectSet::BVHSubsetNb; // VInspector_ItemBVHTree items +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSelectableObjectSet::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + SelectMgr_SelectableObjectSet aSet; + if (!GetSelectableObjectSet (aSet)) + return Column() == 0 ? "Empty selectable object set" : ""; + + switch (Column()) + { + case 0: return "SelectMgr_SelectableObjectSet"; + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrSelectableObjectSet::Init() +{ + //VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast(Parent()); + //Handle(SelectMgr_SelectingVolumeManager) aVolumeMgr; + //if (aParentItem) + //{ + // VInspector_ItemContextPtr aParentContextItem = itemDynamicCast(aParentItem->Parent()); + // if (aParentContextItem) + // { + // Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext(); + // aVolumeMgr = aContext->MainSelector(); + // } + //} + //setViewerSelector (aVolumeMgr); + + //UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrSelectableObjectSet::Reset() +{ + VInspector_ItemBase::Reset(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrSelectableObjectSet::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetSelectableObjectSet +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemSelectMgrSelectableObjectSet::GetSelectableObjectSet (SelectMgr_SelectableObjectSet& theSet) const +{ + VInspector_ItemSelectMgrViewerSelectorPtr aParentItem = itemDynamicCast(Parent()); + + if (!aParentItem || aParentItem->GetViewerSelector().IsNull()) + return Standard_False; + + theSet = aParentItem->GetViewerSelector()->GetSelectableObjects(); + return Standard_True; +} + +// ======================================================================= +// function : GetBVHTree +// purpose : +// ======================================================================= +opencascade::handle > VInspector_ItemSelectMgrSelectableObjectSet::GetBVHTree (const int theRow, + TCollection_AsciiString& theName) const +{ + SelectMgr_SelectableObjectSet aSet; + if (!GetSelectableObjectSet (aSet)) + return NULL; + + if (theRow >= SelectMgr_SelectableObjectSet::BVHSubsetNb) + return NULL; + + SelectMgr_SelectableObjectSet::BVHSubset aBVHSubset = (SelectMgr_SelectableObjectSet::BVHSubset)theRow; + theName = TCollection_AsciiString ("BVH_Tree_") + SelectMgr::BVHSubsetToString (aBVHSubset); + + return aSet.BVH (aBVHSubset); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSelectableObjectSet::GetTableRowCount() const +{ + return 60; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSelectableObjectSet::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + //SelectMgr_SelectingVolumeManager aVolumeMgr; + //if (!GetViewerSelector (aVolumeMgr)) + // return QVariant(); + + //bool isFirstColumn = theColumn == 0; + //switch (theRow) + //{ + // case 0: return isFirstColumn ? QVariant ("GetActiveSelectionType") : QVariant (aVolumeMgr.GetActiveSelectionType()); + // case 1: return isFirstColumn ? QVariant ("IsOverlapAllowed()") : QVariant (aVolumeMgr.IsOverlapAllowed()); + // case 2: return isFirstColumn ? "GetNearPickedPnt" : ViewControl_Tools::ToString (aVolumeMgr.GetNearPickedPnt()).ToCString(); + // case 3: return isFirstColumn ? "GetFarPickedPnt" : ViewControl_Tools::ToString (aVolumeMgr.GetFarPickedPnt()).ToCString(); + // default: break; + //} + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectMgrSelectableObjectSet::createChild (int theRow, int theColumn) +{ + if (theRow == 0 || theRow == 1 || theRow == 2) + return VInspector_ItemBVHTree::CreateItem (currentItem(), theRow, theColumn); + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemSelectMgrSelectableObjectSet.hxx b/tools/VInspector/VInspector_ItemSelectMgrSelectableObjectSet.hxx new file mode 100644 index 0000000000..9a6a575d23 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSelectableObjectSet.hxx @@ -0,0 +1,102 @@ +// Created on: 2019-04-29 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemSelectMgrSelectableObjectSet_H +#define VInspector_ItemSelectMgrSelectableObjectSet_H + +#include + +#include +#include +#include +#include + +class SelectMgr_BaseFrustum; + +class VInspector_ItemSelectMgrSelectableObjectSet; +typedef QExplicitlySharedDataPointer VInspector_ItemSelectMgrSelectableObjectSetPtr; + +//! \class VInspector_ItemSelectMgrSelectableObjectSet +//! Parent item, that corresponds Folder under the AIS_InteractiveContext +//! Children of the item are: none +class VInspector_ItemSelectMgrSelectableObjectSet : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectMgrSelectableObjectSetPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectMgrSelectableObjectSetPtr (new VInspector_ItemSelectMgrSelectableObjectSet (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectMgrSelectableObjectSet() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return NULL; } + + //! Returns current drawer, initialize the drawer if it was not initialized yet + Standard_EXPORT Standard_Boolean GetSelectableObjectSet (SelectMgr_SelectableObjectSet& theSet) const; + + //! Returns child BVH tree of the row + opencascade::handle > GetBVHTree (const int theRow, TCollection_AsciiString& theName) const; + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemSelectMgrSelectableObjectSet(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrSelectingVolumeManager.cxx b/tools/VInspector/VInspector_ItemSelectMgrSelectingVolumeManager.cxx new file mode 100644 index 0000000000..3f89dec684 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSelectingVolumeManager.cxx @@ -0,0 +1,188 @@ +// Created on: 2019-02-04 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include + +#include + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSelectingVolumeManager::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 2; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSelectingVolumeManager::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + SelectMgr_SelectingVolumeManager aVolumeManager; + if (!GetViewerSelector (aVolumeManager)) + return Column() == 0 ? "Empty volume manager" : ""; + + switch (Column()) + { + case 0: return "SelectMgr_SelectingVolumeManager"; + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrSelectingVolumeManager::Init() +{ + //VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast(Parent()); + //Handle(SelectMgr_SelectingVolumeManager) aVolumeMgr; + //if (aParentItem) + //{ + // VInspector_ItemContextPtr aParentContextItem = itemDynamicCast(aParentItem->Parent()); + // if (aParentContextItem) + // { + // Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext(); + // aVolumeMgr = aContext->MainSelector(); + // } + //} + //setViewerSelector (aVolumeMgr); + + //UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrSelectingVolumeManager::Reset() +{ + VInspector_ItemBase::Reset(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrSelectingVolumeManager::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemSelectMgrSelectingVolumeManager::GetViewerSelector (SelectMgr_SelectingVolumeManager& theVolumeManager) const +{ + VInspector_ItemSelectMgrViewerSelectorPtr aParentItem = itemDynamicCast(Parent()); + + if (!aParentItem || aParentItem->GetViewerSelector().IsNull()) + return Standard_False; + + theVolumeManager = aParentItem->GetViewerSelector()->GetManager(); + return Standard_True; +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +Handle(SelectMgr_BaseFrustum) VInspector_ItemSelectMgrSelectingVolumeManager::GetFrustum (const int theRow) const +{ + SelectMgr_SelectingVolumeManager aVolumeManager; + if (!GetViewerSelector (aVolumeManager)) + return NULL; + + if (theRow == 0) + return aVolumeManager.GetVolume (SelectBasics_SelectingVolumeManager::Box); + else if (theRow == 1) + return aVolumeManager.GetVolume (SelectBasics_SelectingVolumeManager::Polyline); + + return NULL; +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSelectingVolumeManager::GetTableRowCount() const +{ + return 60; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSelectingVolumeManager::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + SelectMgr_SelectingVolumeManager aVolumeMgr; + if (!GetViewerSelector (aVolumeMgr)) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("GetActiveSelectionType") : QVariant (aVolumeMgr.GetActiveSelectionType()); + case 1: return isFirstColumn ? QVariant ("IsOverlapAllowed()") : QVariant (aVolumeMgr.IsOverlapAllowed()); + case 2: return isFirstColumn ? "GetNearPickedPnt" : ViewControl_Tools::ToString (aVolumeMgr.GetNearPickedPnt()).ToCString(); + case 3: return isFirstColumn ? "GetFarPickedPnt" : ViewControl_Tools::ToString (aVolumeMgr.GetFarPickedPnt()).ToCString(); + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectMgrSelectingVolumeManager::createChild (int theRow, int theColumn) +{ + if (theRow == 0 || theRow == 1) + return VInspector_ItemSelectMgrBaseFrustum::CreateItem (currentItem(), theRow, theColumn); + //else if (theRow == 1) + // return VInspector_ItemAspectWindow::CreateItem (currentItem(), theRow, theColumn); + //else if (theRow == 2) + // return VInspector_ItemGraphic3dCView::CreateItem (currentItem(), theRow, theColumn); + // + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemSelectMgrSelectingVolumeManager.hxx b/tools/VInspector/VInspector_ItemSelectMgrSelectingVolumeManager.hxx new file mode 100644 index 0000000000..b0f4a94b8a --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSelectingVolumeManager.hxx @@ -0,0 +1,101 @@ +// Created on: 2019-02-04 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemSelectMgrSelectingVolumeManager_H +#define VInspector_ItemSelectMgrSelectingVolumeManager_H + +#include +#include + +#include +#include + +class SelectMgr_BaseFrustum; + +class VInspector_ItemSelectMgrSelectingVolumeManager; +typedef QExplicitlySharedDataPointer VInspector_ItemSelectMgrSelectingVolumeManagerPtr; + +//! \class VInspector_ItemSelectMgrSelectingVolumeManager +//! Parent item, that corresponds Folder under the AIS_InteractiveContext +//! Children of the item are: none +class VInspector_ItemSelectMgrSelectingVolumeManager : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectMgrSelectingVolumeManagerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectMgrSelectingVolumeManagerPtr (new VInspector_ItemSelectMgrSelectingVolumeManager (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectMgrSelectingVolumeManager() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return NULL; } + + //! Returns current drawer, initialize the drawer if it was not initialized yet + Standard_EXPORT Standard_Boolean GetViewerSelector (SelectMgr_SelectingVolumeManager& theVolumeManager) const; + + //! Returns frustum Frustum for row = 0, FrustumSet for row = 1 + Handle(SelectMgr_BaseFrustum) GetFrustum (const int theRow) const; + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! 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 + //! \param theRow the item row positition in the parent item + //! \param theColumn the item column positition in the parent item + VInspector_ItemSelectMgrSelectingVolumeManager(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrSelection.cxx b/tools/VInspector/VInspector_ItemSelectMgrSelection.cxx new file mode 100644 index 0000000000..c09ece65cd --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSelection.cxx @@ -0,0 +1,231 @@ +// 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSelection::initRowCount() const +{ + Handle(SelectMgr_Selection) aSelection = GetSelection(); +#if OCC_VERSION_HEX < 0x070201 + int aRows = 0; + for (aSelection->Init(); aSelection->More(); aSelection->Next()) + aRows++; + return aRows; +#else + return aSelection->Entities().Size(); +#endif +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSelection::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + switch (theItemRole) + { + case Qt::DisplayRole: + case Qt::EditRole: + case Qt::ToolTipRole: + { + switch (Column()) + { + case 0: return GetSelection()->DynamicType()->Name(); + case 3: + { + if (theItemRole == Qt::ToolTipRole) + return "Mode"; + else + { + VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast(Parent()); + return VInspector_Tools::SelectionModeToName(GetSelection()->Mode(), aParentItem->GetInteractiveObject()).ToCString(); + } + } + case 4: + { + if (theItemRole == Qt::ToolTipRole) + return "SelectMgr_StateOfSelection"; + else { + int aNbSelected = 0; + SelectMgr_StateOfSelection aState = GetSelection()->GetSelectionState(); + if (aState == SelectMgr_SOS_Activated || aState == SelectMgr_SOS_Any) + { + Handle(AIS_InteractiveContext) aContext = GetContext(); +#if OCC_VERSION_HEX < 0x070201 + for (mySelection->Init(); mySelection->More(); mySelection->Next()) + { + const Handle(SelectBasics_EntityOwner)& anOwner = mySelection->Sensitive()->BaseSensitive()->OwnerId(); +#else + for (NCollection_Vector::Iterator aSelEntIter (mySelection->Entities()); aSelEntIter.More(); aSelEntIter.Next()) + { + const Handle(SelectBasics_EntityOwner)& anOwner = aSelEntIter.Value()->BaseSensitive()->OwnerId(); +#endif + if (VInspector_Tools::IsOwnerSelected(aContext, anOwner)) + aNbSelected++; + } + } + return aNbSelected > 0 ? QString::number (aNbSelected) : ""; + } + } + case 9: + { + SelectMgr_StateOfSelection aState = GetSelection()->GetSelectionState(); + return VInspector_Tools::ToName (VInspector_SelectionType_StateOfSelection, aState).ToCString(); + } + case 10: return QString::number (GetSelection()->Sensitivity()); + case 11: + return VInspector_Tools::ToName (VInspector_SelectionType_TypeOfUpdate, + GetSelection()->UpdateStatus()).ToCString(); + case 12: + return VInspector_Tools::ToName (VInspector_SelectionType_TypeOfBVHUpdate, + GetSelection()->BVHUpdateStatus()).ToCString(); + default: + break; + } + break; + } + case Qt::ForegroundRole: + { + SelectMgr_StateOfSelection aState = GetSelection()->GetSelectionState(); + return QVariant (aState == SelectMgr_SOS_Activated ? QColor (Qt::black) : QColor (Qt::darkGray)); + } + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectMgrSelection::createChild (int theRow, int theColumn) +{ + return VInspector_ItemSelectMgrSensitiveEntity::CreateItem (currentItem(), theRow, theColumn); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSelection::Init() +{ + VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast(Parent()); + + Handle(AIS_InteractiveObject) anIO = aParentItem->GetInteractiveObject(); + + int aRowId = Row(); + int aDeltaIndex = 2; // properties, presentation items + int aCurrentId = 0; +#if OCC_VERSION_HEX < 0x070201 + for (anIO->Init(); anIO->More(); anIO->Next(), aCurrentId++) +#else + for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anIO->Selections()); aSelIter.More(); aSelIter.Next(), aCurrentId++) +#endif + { + if (aCurrentId != aRowId - aDeltaIndex) + continue; +#if OCC_VERSION_HEX < 0x070201 + mySelection = anIO->CurrentSelection(); +#else + mySelection = aSelIter.Value(); +#endif + break; + } + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSelection::Reset() +{ + // an empty method to don't clear the main label, otherwise the model will be empty + TreeModel_ItemBase::Reset(); + + mySelection = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSelection::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); + // an empty method to don't initialize the main label, as it was not cleared in Reset() +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSelection::GetTableRowCount() const +{ + return 10; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSelection::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + + Handle(SelectMgr_Selection) aSelection = GetSelection(); + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("Mode") : QVariant (aSelection->Mode()); + case 1: return isFirstColumn ? QVariant ("Sensitivity") : QVariant (aSelection->Sensitivity()); + case 2: return isFirstColumn ? QVariant ("UpdateStatus") + : QVariant ((int)aSelection->UpdateStatus()); // TODO! SelectMgr_TypeOfUpdate + case 3: return isFirstColumn ? QVariant ("BVHUpdateStatus") + : QVariant ((int)aSelection->BVHUpdateStatus()); // TODO! SelectMgr_TypeOfBVHUpdate + case 4: return isFirstColumn ? QVariant ("GetSelectionState") + : QVariant ((int)aSelection->GetSelectionState()); // TODO! SelectMgr_StateOfSelection + + default: return QVariant(); + } + return QVariant(); +} diff --git a/tools/VInspector/VInspector_ItemSelectMgrSelection.hxx b/tools/VInspector/VInspector_ItemSelectMgrSelection.hxx new file mode 100644 index 0000000000..c44721e713 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSelection.hxx @@ -0,0 +1,98 @@ +// 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 VInspector_ItemSelectMgrSelection_H +#define VInspector_ItemSelectMgrSelection_H + +#include +#include + +#include + +class VInspector_ItemSelectMgrSelection; +typedef QExplicitlySharedDataPointer VInspector_ItemSelectMgrSelectionPtr; + +//! \class VInspector_ItemSelectMgrSelection +//! Item about SelectMgr_Selection. +//! Parent is presentable object item, children are sensitive entity items +class VInspector_ItemSelectMgrSelection : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectMgrSelectionPtr CreateItem(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectMgrSelectionPtr (new VInspector_ItemSelectMgrSelection (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectMgrSelection() {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return mySelection; } + + //! \return current selection value + Standard_EXPORT Handle(SelectMgr_Selection) GetSelection() const + { return Handle(SelectMgr_Selection)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initializes the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Initializes number of children + //! \return integer value + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 + VInspector_ItemSelectMgrSelection(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + + Handle(SelectMgr_Selection) mySelection; //!< the current selection +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.cxx b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.cxx new file mode 100644 index 0000000000..181ff57b6c --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.cxx @@ -0,0 +1,206 @@ +// 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 +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSensitiveEntity::initRowCount() const +{ + if (GetSensitiveEntity()->BaseSensitive().IsNull()) + return 0; + + return 2; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSensitiveEntity::initValue (int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + Handle(SelectMgr_SensitiveEntity) anEntity = GetSensitiveEntity(); + switch (theItemRole) + { + case Qt::DisplayRole: + case Qt::EditRole: + case Qt::ToolTipRole: + { + switch (Column()) + { + case 0: return anEntity->DynamicType()->Name(); + default: + break; + } + break; + } + case Qt::BackgroundRole: + case Qt::ForegroundRole: + { + if (Column() == 2) + { + Handle(AIS_InteractiveContext) aContext = GetContext(); + if (!aContext.IsNull()) + { + if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner())) + return QVariant ((theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white)); + } + } + VInspector_ItemSelectMgrSelectionPtr aParentItem = itemDynamicCast(Parent()); + if (aParentItem) + return aParentItem->data(QModelIndex(), theItemRole); + break; + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectMgrSensitiveEntity::createChild (int theRow, int theColumn) +{ + if (theRow == 0) + return VInspector_ItemSelectBasicsEntityOwner::CreateItem (currentItem(), theRow, theColumn); + else if (theRow == 1) + return VInspector_ItemSelectBasicsSensitiveEntity::CreateItem (currentItem(), theRow, theColumn); + + return TreeModel_ItemBasePtr(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSensitiveEntity::Init() +{ + VInspector_ItemSelectMgrSelectionPtr aParentItem = itemDynamicCast(Parent()); + + Handle(SelectMgr_Selection) aSelection = aParentItem->GetSelection(); + + int aRowId = Row(); + int aCurrentId = 0; +#if OCC_VERSION_HEX < 0x070201 + for (aSelection->Init(); aSelection->More(); aSelection->Next(), aCurrentId++) +#else + for (NCollection_Vector::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More(); aSelEntIter.Next(), aCurrentId++) +#endif + { + if (aCurrentId != aRowId) + continue; +#if OCC_VERSION_HEX < 0x070201 + myEntity = aSelection->Sensitive(); +#else + myEntity = aSelEntIter.Value(); +#endif + break; + } + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSensitiveEntity::Reset() +{ + // an empty method to don't clear the main label, otherwise the model will be empty + TreeModel_ItemBase::Reset(); + myEntity = NULL; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSensitiveEntity::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : getEntityOwner +// purpose : +// ======================================================================= +Handle(SelectBasics_EntityOwner) VInspector_ItemSelectMgrSensitiveEntity::getEntityOwner() const +{ + initItem(); + + Handle(SelectBasics_EntityOwner) anOwner; + const Handle(SelectBasics_SensitiveEntity)& aBase = myEntity->BaseSensitive(); + if (aBase.IsNull()) + return anOwner; + return aBase->OwnerId(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSensitiveEntity::GetTableRowCount() const +{ + return 1; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSensitiveEntity::GetTableData(const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + Handle(SelectMgr_SensitiveEntity) anEntity = GetSensitiveEntity(); + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("IsActiveForSelection") : QVariant (anEntity->IsActiveForSelection()); + default: return QVariant(); + } +} diff --git a/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.hxx b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.hxx new file mode 100644 index 0000000000..6f173489ae --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.hxx @@ -0,0 +1,104 @@ +// 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 VInspector_ItemSelectMgrSensitiveEntity_H +#define VInspector_ItemSelectMgrSensitiveEntity_H + +#include +#include +#include +#include +#include + +class VInspector_ItemSelectMgrSensitiveEntity; + +typedef QExplicitlySharedDataPointer VInspector_ItemSelectMgrSensitiveEntityPtr; + +//! \class VInspector_ItemSelectMgrSensitiveEntity +//! The item shows information about SelectBasics_EntityOwner. +//! The parent is item selection, children are item entity owners +class VInspector_ItemSelectMgrSensitiveEntity : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectMgrSensitiveEntityPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectMgrSensitiveEntityPtr (new VInspector_ItemSelectMgrSensitiveEntity (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectMgrSensitiveEntity() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myEntity; } + + //! \return the current sensitive entity + Standard_EXPORT Handle(SelectMgr_SensitiveEntity) GetSensitiveEntity() const + { return Handle(SelectMgr_SensitiveEntity)::DownCast (GetObject()); } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData(const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! \return number of children. + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 owner of the current sensitive entity + //! \return owner + Handle(SelectBasics_EntityOwner) getEntityOwner() const; + +private: + + //! Constructor + //! param theParent a parent item + VInspector_ItemSelectMgrSensitiveEntity(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + + Handle(SelectMgr_SensitiveEntity) myEntity; //!< the current entity owner +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntitySet.cxx b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntitySet.cxx new file mode 100644 index 0000000000..672a946a53 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntitySet.cxx @@ -0,0 +1,157 @@ +// 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 +#include +#include +#include + +#include +#include + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrSensitiveEntitySet::initRowCount() const +{ + //Handle(SelectMgr_SensitiveEntitySet) aSensitiveSet = Handle(SelectMgr_SensitiveEntitySet)::DownCast (GetSensitiveEntitySet()); + //if (!aSensitiveSet.IsNull()) + // return aSensitiveSet->Size(); + + return 1; // for BVH_Tree +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrSensitiveEntitySet::initValue (int theItemRole) const +{ + if (theItemRole == Qt::DisplayRole && theItemRole == Qt::ToolTipRole && Column() == 2) + return ViewControl_Tools::GetPointerInfo (GetSelectableObject(), true).ToCString(); + + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Handle(SelectMgr_SensitiveEntitySet) anEntitySet = GetSensitiveEntitySet(); + const Handle(SelectMgr_SelectableObject)& aSelectableObject = GetSelectableObject(); + + if (anEntitySet.IsNull()) + return Column() == 0 ? "Empty sensitive entity set" : ""; + + if (aSelectableObject.IsNull()) + return Column() == 0 ? "Empty selectable object for sensitive entity set" : ""; + + switch (theItemRole) + { + case Qt::DisplayRole: + case Qt::EditRole: + case Qt::ToolTipRole: + { + switch (Column()) + { + case 0: return aSelectableObject->DynamicType()->Name(); + default: + break; + } + break; + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectMgrSensitiveEntitySet::createChild (int theRow, int theColumn) +{ + return VInspector_ItemBVHTree::CreateItem (currentItem(), theRow, theColumn); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSensitiveEntitySet::Init() +{ + VInspector_ItemSelectMgrViewerSelectorPtr aParentItem = itemDynamicCast(Parent()->Parent()); + + Handle(SelectMgr_SelectableObject) anObject; + Handle(SelectMgr_SensitiveEntitySet) anEntitySet = aParentItem->GetSensitiveEntitySet (Row(), anObject); + + myEntitySet = anEntitySet; + mySelectableObject = anObject; + + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSensitiveEntitySet::Reset() +{ + // an empty method to don't clear the main label, otherwise the model will be empty + TreeModel_ItemBase::Reset(); + myEntitySet = NULL; + mySelectableObject = NULL; +} + +// ======================================================================= +// function : GetBVHTree +// purpose : +// ======================================================================= +opencascade::handle > VInspector_ItemSelectMgrSensitiveEntitySet::GetBVHTree (const int theRow, + TCollection_AsciiString& theName) const +{ + Handle(SelectMgr_SensitiveEntitySet) anEntitySet = GetSensitiveEntitySet(); + + if (anEntitySet.IsNull()) + return NULL; + + return anEntitySet->BVH(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= +void VInspector_ItemSelectMgrSensitiveEntitySet::initItem() const +{ + if (IsInitialized()) + return; + + const_cast(this)->Init(); +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemSelectMgrSensitiveEntitySet::buildPresentationShape() +{ + //mySelectableObject + return TopoDS_Shape(); +} diff --git a/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntitySet.hxx b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntitySet.hxx new file mode 100644 index 0000000000..305417778b --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntitySet.hxx @@ -0,0 +1,112 @@ +// 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 VInspector_ItemSelectMgrSensitiveEntitySet_H +#define VInspector_ItemSelectMgrSensitiveEntitySet_H + +#include +#include +#include +#include +#include + +class SelectMgr_SelectableObject; + +class QItemSelectionModel; +class VInspector_ItemSelectMgrSensitiveEntitySet; + +typedef QExplicitlySharedDataPointer VInspector_ItemSelectMgrSensitiveEntitySetPtr; + +//! \class VInspector_ItemSelectMgrSensitiveEntitySet +class VInspector_ItemSelectMgrSensitiveEntitySet : public VInspector_ItemBase +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectMgrSensitiveEntitySetPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectMgrSensitiveEntitySetPtr (new VInspector_ItemSelectMgrSensitiveEntitySet (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectMgrSensitiveEntitySet() Standard_OVERRIDE {}; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myEntitySet; } + + //! \return the current sensitive entity + Standard_EXPORT Handle(SelectMgr_SensitiveEntitySet) GetSensitiveEntitySet() const + { return Handle(SelectMgr_SensitiveEntitySet)::DownCast (GetObject()); } + + //! \return the current sensitive entity + Standard_EXPORT const Handle(SelectMgr_SelectableObject)& GetSelectableObject() const + { GetObject(); return mySelectableObject; } + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns child BVH tree of the row + opencascade::handle > GetBVHTree (const int theRow, TCollection_AsciiString& theName) const; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! \return number of children. + virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + +protected: + + //! 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 table value for the row in form: depending on the aspect kind + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theEntityKind kind or kind of entity + QVariant getTableData (const int theRow, + const int theColumn, + const int theRole, + const TCollection_AsciiString& theEntityKind) const; + +protected: + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; + + //! Constructor + //! param theParent a parent item + VInspector_ItemSelectMgrSensitiveEntitySet(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +private: + + Handle(SelectMgr_SensitiveEntitySet) myEntitySet; //!< the current sensitive entity + Handle(SelectMgr_SelectableObject) mySelectableObject; //!< the current presentation +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.cxx b/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.cxx new file mode 100644 index 0000000000..bd590e5c41 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.cxx @@ -0,0 +1,373 @@ +// Created on: 2019-02-04 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include + +#include + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +VInspector_ItemSelectMgrViewerSelector::VInspector_ItemSelectMgrViewerSelector (TreeModel_ItemBasePtr theParent, + const int theRow, const int theColumn) +: VInspector_ItemBase(theParent, theRow, theColumn), + myXPix (150), myYPix (350), myXMinPix (150), myYMinPix (350), myXMaxPix (200), myYMaxPix (400) +{ +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrViewerSelector::initRowCount() const +{ + if (Column() != 0) + return 0; + + // SelectMgr_SelectingVolumeManager, VInspector_ItemSelectMgrSelectableObjectSet, VInspector_ItemContainer + Standard_Integer aNbRows = GetFirstChildOfPicked(); + + Handle(SelectMgr_ViewerSelector) aViewSelector = GetViewerSelector(); + if (!aViewSelector.IsNull()) + { + for (Standard_Integer aDetIter = 1; aDetIter <= aViewSelector->NbPicked(); ++aDetIter) + { + aNbRows++; + //Handle(SelectMgr_EntityOwner) anOwner = aViewSelector->->Picked (aDetIter); + } + } + return aNbRows; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrViewerSelector::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + if (GetViewerSelector().IsNull()) + return Column() == 0 ? "Empty viewer selector" : ""; + + switch (Column()) + { + case 0: return GetViewerSelector()->DynamicType()->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrViewerSelector::Init() +{ + VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast(Parent()); + Handle(SelectMgr_ViewerSelector) aViewerSelector; + if (aParentItem) + { + VInspector_ItemContextPtr aParentContextItem = itemDynamicCast(aParentItem->Parent()); + if (aParentContextItem) + { + Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext(); + aViewerSelector = aContext->MainSelector(); + } + } + setViewerSelector (aViewerSelector); + + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrViewerSelector::Reset() +{ + VInspector_ItemBase::Reset(); + + setViewerSelector (NULL); +} + +// ======================================================================= +// function : GetSensitiveEntitySet +// purpose : +// ======================================================================= +Handle(SelectMgr_SensitiveEntitySet) VInspector_ItemSelectMgrViewerSelector::GetSensitiveEntitySet (const int theRow, + Handle(SelectMgr_SelectableObject)& theObject) +{ + Standard_Integer anIndex = 0; + + Handle(SelectMgr_ViewerSelector) aViewSelector = GetViewerSelector(); + if (aViewSelector.IsNull()) + return NULL; + + for (SelectMgr_MapOfObjectSensitivesIterator anIterator (aViewSelector->GetObjectSensitives()); anIterator.More(); anIterator.Next(), anIndex++) + { + if (anIndex != theRow) + continue; + + theObject = anIterator.Key(); + return anIterator.Value(); + } + return NULL; +} + +// ======================================================================= +// function : GetContainerRowCount +// purpose : +// ======================================================================= + +int VInspector_ItemSelectMgrViewerSelector::GetContainerRowCount (const int theContainerRow) const +{ + if (theContainerRow != 2) + return 0; + + Handle(SelectMgr_ViewerSelector) aViewSelector = GetViewerSelector(); + if (aViewSelector.IsNull()) + return 0; + + return aViewSelector->GetObjectSensitives().Extent(); +} + +// ======================================================================= +// function : GetContainerValue +// purpose : +// ======================================================================= + +QVariant VInspector_ItemSelectMgrViewerSelector::GetContainerValue (const int theContainerRow, const int theItemRole) const +{ + if (theContainerRow != 2) + return 0; + + if (theItemRole != Qt::DisplayRole) + return QVariant(); + + Handle(SelectMgr_ViewerSelector) aViewSelector = GetViewerSelector(); + if (aViewSelector.IsNull()) + return QVariant(); + + return "SelectMgr_MapOfObjectSensitives"; +} + +// ======================================================================= +// function : CreateContainerChild +// purpose : +// ======================================================================= + +TreeModel_ItemBasePtr VInspector_ItemSelectMgrViewerSelector::CreateContainerChild (const TreeModel_ItemBasePtr& theParent, const int theContainerRow, int theRow, int theColumn) +{ + if (theContainerRow != 2) + return TreeModel_ItemBasePtr(); + + return VInspector_ItemSelectMgrSensitiveEntitySet::CreateItem (theParent, theRow, theColumn); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrViewerSelector::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrViewerSelector::GetTableRowCount() const +{ + return 60; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrViewerSelector::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(SelectMgr_ViewerSelector) aViewerSelector = GetViewerSelector(); + if (aViewerSelector.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("Sensitivity") : QVariant (aViewerSelector->Sensitivity()); + case 1: return isFirstColumn ? QVariant ("IsPickClosest") : QVariant (aViewerSelector->IsPickClosest()); + case 2: return isFirstColumn ? QVariant ("NbPicked") : QVariant (aViewerSelector->NbPicked()); + + case 3: return ViewControl_Table::SeparatorData(); + case 4: return isFirstColumn ? QVariant ("ClearPicked") : QVariant ("DO"); + + case 5: return ViewControl_Table::SeparatorData(); + case 6: return isFirstColumn ? QVariant ("X (pixel)") : QVariant (myXPix); + case 7: return isFirstColumn ? QVariant ("Y (pixel)") : QVariant (myYPix); + case 8: return isFirstColumn ? QVariant ("Pick") : QVariant ("DO"); + + case 9: return ViewControl_Table::SeparatorData(); + case 10: return isFirstColumn ? QVariant ("X Min (pixel)") : QVariant (myXMinPix); + case 11: return isFirstColumn ? QVariant ("Y Min (pixel)") : QVariant (myXMinPix); + case 12: return isFirstColumn ? QVariant ("X Max (pixel)") : QVariant (myXMaxPix); + case 13: return isFirstColumn ? QVariant ("Y Max (pixel)") : QVariant (myYMaxPix); + case 14: return isFirstColumn ? QVariant ("Pick") : QVariant ("DO"); + + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemSelectMgrViewerSelector::GetTableEditType (const int theRow, const int) const +{ + switch (theRow) + { + case 4: return ViewControl_EditType_DoAction; + case 6: return ViewControl_EditType_Spin; + case 7: return ViewControl_EditType_Spin; + case 8: return ViewControl_EditType_DoAction; + case 10: return ViewControl_EditType_Spin; + case 11: return ViewControl_EditType_Spin; + case 12: return ViewControl_EditType_Spin; + case 13: return ViewControl_EditType_Spin; + case 14: return ViewControl_EditType_DoAction; + default: return ViewControl_EditType_None; + } +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemSelectMgrViewerSelector::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + Handle(SelectMgr_ViewerSelector) aViewerSelector = GetViewerSelector(); + if (aViewerSelector.IsNull()) + return Standard_False; + + switch (theRow) + { + case 4: aViewerSelector->ClearPicked(); break; + case 6: myXPix = theValue.toInt(); + case 7: myYPix = theValue.toInt(); + case 8: + { + Handle(StdSelect_ViewerSelector3d) aSelector3d = Handle(StdSelect_ViewerSelector3d)::DownCast(aViewerSelector); + if (!aSelector3d.IsNull()) + aSelector3d->Pick (myXPix, myYPix, View_Tools::FindActiveView (GetContext())); + break; + } + case 10: myXMinPix = theValue.toInt(); + case 11: myXMinPix = theValue.toInt(); + case 12: myXMaxPix = theValue.toInt(); + case 13: myYMaxPix = theValue.toInt(); + case 14: + { + Handle(StdSelect_ViewerSelector3d) aSelector3d = Handle(StdSelect_ViewerSelector3d)::DownCast(aViewerSelector); + if (!aSelector3d.IsNull()) + aSelector3d->Pick (myXMinPix, myYMinPix, myXMaxPix, myYMaxPix, View_Tools::FindActiveView (GetContext())); + break; + } + default: break; + } + return Standard_True; +} + +// ======================================================================= +// function : Dump +// purpose : +// ======================================================================= +Standard_Boolean VInspector_ItemSelectMgrViewerSelector::Dump (Standard_OStream& OS) const +{ + Handle(SelectMgr_ViewerSelector) aViewerSelector = GetViewerSelector(); + if (aViewerSelector.IsNull()) + return Standard_False; + + aViewerSelector->Dump (OS); + return Standard_True; +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemSelectMgrViewerSelector::buildPresentationShape (const Handle(SelectMgr_ViewerSelector)& theViewSelector) +{ + if (theViewSelector.IsNull() || theViewSelector->NbPicked() == 0) + return TopoDS_Shape(); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + + for (Standard_Integer aRankId = 1; aRankId <= theViewSelector->NbPicked(); ++aRankId) + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (theViewSelector->PickedPoint (aRankId))); + + return aCompound; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectMgrViewerSelector::createChild (int theRow, int theColumn) +{ + if (theRow == 0) + return VInspector_ItemSelectMgrSelectingVolumeManager::CreateItem (currentItem(), theRow, theColumn); + else if (theRow == 1) + return VInspector_ItemSelectMgrSelectableObjectSet::CreateItem (currentItem(), theRow, theColumn); + else if (theRow == 2) + return VInspector_ItemContainer::CreateItem (currentItem(), theRow, theColumn); + else + return VInspector_ItemSelectMgrViewerSelectorPicked::CreateItem (currentItem(), theRow, theColumn); +} diff --git a/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.hxx b/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.hxx new file mode 100644 index 0000000000..1367767873 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.hxx @@ -0,0 +1,169 @@ +// Created on: 2019-02-04 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemSelectMgrViewerSelector_H +#define VInspector_ItemSelectMgrViewerSelector_H + +#include +#include +#include + +#include +#include +#include + +class VInspector_ItemSelectMgrViewerSelector; +typedef QExplicitlySharedDataPointer VInspector_ItemSelectMgrViewerSelectorPtr; + +//! \class VInspector_ItemSelectMgrViewerSelector +//! Parent item, that corresponds Folder under the AIS_InteractiveContext +//! Children of the item are: none +class VInspector_ItemSelectMgrViewerSelector : public VInspector_ItemBase, public VInspector_ItemContainerAPI +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectMgrViewerSelectorPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectMgrViewerSelectorPtr (new VInspector_ItemSelectMgrViewerSelector (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectMgrViewerSelector() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myViewerSelector; } + + //! Returns current drawer, initialize the drawer if it was not initialized yet + Standard_EXPORT Handle(SelectMgr_ViewerSelector) GetViewerSelector() const + { return Handle(SelectMgr_ViewerSelector)::DownCast (GetObject()); } + + //! Returns the span from the 0 row to the first item corresponded to the picked item + //! the 0 item is SelectMgr_SelectingVolumeManager + //! the 1 item is VInspector_ItemSelectMgrSelectableObjectSet + //! the 2 item is VInspector_ItemContainer for SelectMgr_MapOfObjectSensitives + Standard_Integer GetFirstChildOfPicked() const { return 3; } + + //! Returns entity set if possible from SelectMgr_MapOfObjectSensitives + //! \param theRow row index + //! \param theObject [out] object connected to the sensitive entity set + Standard_EXPORT Handle(SelectMgr_SensitiveEntitySet) GetSensitiveEntitySet (const int theRow, + Handle(SelectMgr_SelectableObject)& theObject); + + //! Returns number of item selected + //! \return rows count + virtual int GetContainerRowCount (const int theContainerRow) const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + virtual QVariant GetContainerValue (const int theContainerRow, const int theItemRole) 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 CreateContainerChild (const TreeModel_ItemBasePtr& theParent, const int theContainerRow, int theRow, int theColumn) Standard_OVERRIDE; + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + + //! Dumps the content of me on the stream . + virtual Standard_Boolean Dump (Standard_OStream& OS) const; + +protected: + + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE { return buildPresentationShape (myViewerSelector); } + + //! Creates shape for the 3d viewer selector parameters + //! \param theViewerSelector current viewer selector + //! \return shape or NULL + static TopoDS_Shape buildPresentationShape (const Handle(SelectMgr_ViewerSelector)& theViewerSelector); + +protected: + + //! 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: + + //! Set V3d viewer selector into the current field + //! \param theViewerSelector a viewer selector + void setViewerSelector (const Handle(SelectMgr_ViewerSelector)& theViewerSelector) { myViewerSelector = theViewerSelector; } + +private: + + //! 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 + VInspector_ItemSelectMgrViewerSelector(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn); + +private: + + Handle(SelectMgr_ViewerSelector) myViewerSelector; //!< the current viewer selector + + Standard_Integer myXPix; //!< cached value for picked X + Standard_Integer myYPix; //!< cached value for picked Y + + Standard_Integer myXMinPix; //!< cached value for min value of picked X + Standard_Integer myYMinPix; //!< cached value for min value of picked Y + + Standard_Integer myXMaxPix; //!< cached value for max value of picked X + Standard_Integer myYMaxPix; //!< cached value for max value of picked Y +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrViewerSelectorPicked.cxx b/tools/VInspector/VInspector_ItemSelectMgrViewerSelectorPicked.cxx new file mode 100644 index 0000000000..d0fbe4c21c --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrViewerSelectorPicked.cxx @@ -0,0 +1,238 @@ +// Created on: 2019-02-04 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrViewerSelectorPicked::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 0; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrViewerSelectorPicked::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + Standard_Integer aRankId; + Handle(SelectMgr_ViewerSelector) aViewerSelector = GetViewerSelector (aRankId); + if (aViewerSelector.IsNull()) + return Column() == 0 ? "Empty viewer selector" : ""; + + switch (Column()) + { + case 0: + { + TCollection_AsciiString aValue = TCollection_AsciiString (aRankId) + " - " + + VInspector_Tools::GetPointerInfo (aViewerSelector->Picked (aRankId)); + return aValue.ToCString(); + } + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrViewerSelectorPicked::Init() +{ + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrViewerSelectorPicked::Reset() +{ + VInspector_ItemBase::Reset(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemSelectMgrViewerSelectorPicked::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +Handle(SelectMgr_ViewerSelector) VInspector_ItemSelectMgrViewerSelectorPicked::GetViewerSelector (Standard_Integer& theRankId) const +{ + VInspector_ItemSelectMgrViewerSelectorPtr aParentItem = itemDynamicCast(Parent()); + if (!aParentItem) + return NULL; + + Handle(SelectMgr_ViewerSelector) aViewerSelector = aParentItem->GetViewerSelector(); + theRankId = Row() + 1 - aParentItem->GetFirstChildOfPicked(); + if (theRankId > aViewerSelector->NbPicked()) + return NULL; + + return aViewerSelector; +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemSelectMgrViewerSelectorPicked::GetTableRowCount() const +{ + return 60; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrViewerSelectorPicked::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole && theRole != Qt::ToolTipRole) + return QVariant(); + + Standard_Integer aRankId; + Handle(SelectMgr_ViewerSelector) aViewerSelector = GetViewerSelector (aRankId); + if (aViewerSelector.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return isFirstColumn ? "Picked" : + (theRole == Qt::DisplayRole ? VInspector_Tools::GetPointerInfo (aViewerSelector->Picked (aRankId)).ToCString() + : aViewerSelector->Picked (aRankId)->DynamicType()->Name()); + case 1: return isFirstColumn ? "PickedEntity" : + (theRole == Qt::DisplayRole ? VInspector_Tools::GetPointerInfo (aViewerSelector->PickedEntity (aRankId)).ToCString() + : aViewerSelector->PickedEntity (aRankId)->DynamicType()->Name()); + case 2: return isFirstColumn ? "PickedPoint" : ViewControl_Tools::ToString (aViewerSelector->PickedPoint (aRankId)).ToCString(); + + default: break; + } + Standard_Integer aLastIndex = 2; + + if (theRow > aLastIndex) + return getTableSortCriterionData (theRow - (aLastIndex + 1), theColumn, theRole); + + return QVariant(); +} + +// ======================================================================= +// function : getTableSortCriterionData +// purpose : +// ======================================================================= +QVariant VInspector_ItemSelectMgrViewerSelectorPicked::getTableSortCriterionData (const Standard_Integer theIndex, + const int theColumn, const int theRole) const +{ + Standard_Integer aRankId; + Handle(SelectMgr_ViewerSelector) aViewerSelector = GetViewerSelector (aRankId); + if (aViewerSelector.IsNull()) + return QVariant(); + + const SelectMgr_SortCriterion& aCriterion = aViewerSelector->PickedData (aRankId); + bool isFirstColumn = theColumn == 0; + switch (theIndex) + { + case 0: return isFirstColumn ? QVariant ("Depth") : QVariant (aCriterion.Depth); + case 1: return isFirstColumn ? QVariant ("MinDist") : QVariant (aCriterion.MinDist); + case 2: return isFirstColumn ? QVariant ("Tolerance") : QVariant (aCriterion.Tolerance); + case 3: return isFirstColumn ? QVariant ("Priority") : QVariant (aCriterion.Priority); + case 4: return isFirstColumn ? QVariant ("ZLayerPosition") : QVariant (aCriterion.ZLayerPosition); + case 5: return isFirstColumn ? QVariant ("NbOwnerMatches") : QVariant (aCriterion.NbOwnerMatches); + case 6: return isFirstColumn ? QVariant ("ToPreferClosest") : QVariant (aCriterion.ToPreferClosest); + default: break; + } + return QVariant(); +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemSelectMgrViewerSelectorPicked::buildPresentationShape() +{ + Standard_Integer aRankId; + Handle(SelectMgr_ViewerSelector) aViewerSelector = GetViewerSelector (aRankId); + return buildPresentationShape (aViewerSelector, aRankId); +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemSelectMgrViewerSelectorPicked::buildPresentationShape (const Handle(SelectMgr_ViewerSelector)& theViewSelector, + const Standard_Integer theRowId) +{ + if (theViewSelector.IsNull() || theRowId + 1 > theViewSelector->NbPicked()) + return TopoDS_Shape(); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + + Standard_Integer aRankId = theRowId + 1; + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (theViewSelector->PickedPoint (aRankId))); + + return aCompound; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemSelectMgrViewerSelectorPicked::createChild (int, int) +{ + //if (theRow == 0) + // return VInspector_ItemGraphic3dCamera::CreateItem (currentItem(), theRow, theColumn); + //else if (theRow == 1) + // return VInspector_ItemAspectWindow::CreateItem (currentItem(), theRow, theColumn); + //else if (theRow == 2) + // return VInspector_ItemGraphic3dCView::CreateItem (currentItem(), theRow, theColumn); + // + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemSelectMgrViewerSelectorPicked.hxx b/tools/VInspector/VInspector_ItemSelectMgrViewerSelectorPicked.hxx new file mode 100644 index 0000000000..5262394694 --- /dev/null +++ b/tools/VInspector/VInspector_ItemSelectMgrViewerSelectorPicked.hxx @@ -0,0 +1,113 @@ +// Created on: 2019-02-04 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_ItemSelectMgrViewerSelectorPicked_H +#define VInspector_ItemSelectMgrViewerSelectorPicked_H + +#include +#include + +#include +#include + +class VInspector_ItemSelectMgrViewerSelectorPicked; +typedef QExplicitlySharedDataPointer VInspector_ItemSelectMgrViewerSelectorPickedPtr; + +//! \class VInspector_ItemSelectMgrViewerSelectorPicked +//! Parent item, that corresponds Folder under the AIS_InteractiveContext +//! Children of the item are: none +class VInspector_ItemSelectMgrViewerSelectorPicked : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemSelectMgrViewerSelectorPickedPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemSelectMgrViewerSelectorPickedPtr (new VInspector_ItemSelectMgrViewerSelectorPicked (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemSelectMgrViewerSelectorPicked() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return NULL; } + + //! Returns viewer selector of the parent and index of rank inside the parent + //! \param theRankId rank of the item inside viewer selector + Standard_EXPORT Handle(SelectMgr_ViewerSelector) GetViewerSelector (Standard_Integer& theRankId) const; + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + //! Returns table value of SelectMgr_SortCriterion + QVariant getTableSortCriterionData (const Standard_Integer theIndex, const int theColumn, const int theRole) const; + + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; + + //! Creates shape for the 3d viewer selector parameters + //! \param theViewerSelector current viewer selector + //! \param theRowId index of the item row, theRank - 1 value inside viewer selector + //! \return shape or NULL + static TopoDS_Shape buildPresentationShape (const Handle(SelectMgr_ViewerSelector)& theViewerSelector, + const Standard_Integer theRowId); + +protected: + + //! 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: + +private: + + //! 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 + VInspector_ItemSelectMgrViewerSelectorPicked(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemSelection.cxx b/tools/VInspector/VInspector_ItemSelection.cxx deleted file mode 100644 index 191232968f..0000000000 --- a/tools/VInspector/VInspector_ItemSelection.cxx +++ /dev/null @@ -1,200 +0,0 @@ -// 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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -// ======================================================================= -// function : getSelection -// purpose : -// ======================================================================= -Handle(SelectMgr_Selection) VInspector_ItemSelection::getSelection() const -{ - initItem(); - return mySelection; -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int VInspector_ItemSelection::initRowCount() const -{ - Handle(SelectMgr_Selection) aSelection = getSelection(); -#if OCC_VERSION_HEX < 0x070201 - int aRows = 0; - for (aSelection->Init(); aSelection->More(); aSelection->Next()) - aRows++; - return aRows; -#else - return aSelection->Entities().Size(); -#endif -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemSelection::initValue (int theItemRole) const -{ - switch (theItemRole) - { - case Qt::DisplayRole: - case Qt::EditRole: - case Qt::ToolTipRole: - { - switch (Column()) - { - case 0: return getSelection()->DynamicType()->Name(); - case 1: return rowCount(); - case 3: - { - if (theItemRole == Qt::ToolTipRole) - return "Mode"; - else - { - VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast(Parent()); - return VInspector_Tools::SelectionModeToName(getSelection()->Mode(), aParentItem->GetInteractiveObject()).ToCString(); - } - } - case 4: - { - if (theItemRole == Qt::ToolTipRole) - return "SelectMgr_StateOfSelection"; - else { - int aNbSelected = 0; - SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState(); - if (aState == SelectMgr_SOS_Activated || aState == SelectMgr_SOS_Any) - { - Handle(AIS_InteractiveContext) aContext = GetContext(); -#if OCC_VERSION_HEX < 0x070201 - for (mySelection->Init(); mySelection->More(); mySelection->Next()) - { - const Handle(SelectMgr_EntityOwner)& anOwner = mySelection->Sensitive()->BaseSensitive()->OwnerId(); -#else - for (NCollection_Vector::Iterator aSelEntIter (mySelection->Entities()); aSelEntIter.More(); aSelEntIter.Next()) - { - const Handle(SelectMgr_EntityOwner)& anOwner = aSelEntIter.Value()->BaseSensitive()->OwnerId(); -#endif - if (VInspector_Tools::IsOwnerSelected(aContext, anOwner)) - aNbSelected++; - } - } - return aNbSelected > 0 ? QString::number (aNbSelected) : ""; - } - } - case 9: - { - SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState(); - return VInspector_Tools::ToName (VInspector_SelectionType_StateOfSelection, aState).ToCString(); - } - case 10: return QString::number (getSelection()->Sensitivity()); - case 11: - return VInspector_Tools::ToName (VInspector_SelectionType_TypeOfUpdate, - getSelection()->UpdateStatus()).ToCString(); - case 12: - return VInspector_Tools::ToName (VInspector_SelectionType_TypeOfBVHUpdate, - getSelection()->BVHUpdateStatus()).ToCString(); - default: - break; - } - break; - } - case Qt::ForegroundRole: - { - SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState(); - return QVariant (aState == SelectMgr_SOS_Activated ? QColor (Qt::black) : QColor (Qt::darkGray)); - } - } - return QVariant(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr VInspector_ItemSelection::createChild (int theRow, int theColumn) -{ - return VInspector_ItemSensitiveEntity::CreateItem (currentItem(), theRow, theColumn); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void VInspector_ItemSelection::Init() -{ - VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast(Parent()); - - Handle(AIS_InteractiveObject) anIO = aParentItem->GetInteractiveObject(); - - int aRowId = Row(); - int aCurrentId = 0; -#if OCC_VERSION_HEX < 0x070201 - for (anIO->Init(); anIO->More(); anIO->Next(), aCurrentId++) -#else - for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anIO->Selections()); aSelIter.More(); aSelIter.Next(), aCurrentId++) -#endif - { - if (aCurrentId != aRowId) - continue; -#if OCC_VERSION_HEX < 0x070201 - mySelection = anIO->CurrentSelection(); -#else - mySelection = aSelIter.Value(); -#endif - break; - } - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemSelection::Reset() -{ - // an empty method to don't clear the main label, otherwise the model will be empty - TreeModel_ItemBase::Reset(); - - mySelection = NULL; -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemSelection::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); - // an empty method to don't initialize the main label, as it was not cleared in Reset() -} diff --git a/tools/VInspector/VInspector_ItemSelection.hxx b/tools/VInspector/VInspector_ItemSelection.hxx deleted file mode 100644 index f1565a6c03..0000000000 --- a/tools/VInspector/VInspector_ItemSelection.hxx +++ /dev/null @@ -1,84 +0,0 @@ -// 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 VInspector_ItemSelection_H -#define VInspector_ItemSelection_H - -#include -#include - -#include - -class VInspector_ItemSelection; -typedef QExplicitlySharedDataPointer VInspector_ItemSelectionPtr; - -//! \class VInspector_ItemSelection -//! Item about SelectMgr_Selection. -//! Parent is presentable object item, children are sensitive entity items -class VInspector_ItemSelection : public VInspector_ItemBase -{ -public: - - //! Creates an item wrapped by a shared pointer - static VInspector_ItemSelectionPtr CreateItem(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - { return VInspector_ItemSelectionPtr (new VInspector_ItemSelection (theParent, theRow, theColumn)); } - - //! Destructor - virtual ~VInspector_ItemSelection() {}; - - //! \return current selection value - Standard_EXPORT Handle(SelectMgr_Selection) getSelection() const; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - -protected: - - //! Initializes the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! Initializes number of children - //! \return integer value - virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; - -protected: - - //! 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 - VInspector_ItemSelection(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) {} - -private: - - Handle(SelectMgr_Selection) mySelection; //!< the current selection -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemSensitiveEntity.cxx b/tools/VInspector/VInspector_ItemSensitiveEntity.cxx deleted file mode 100644 index b5f9d59174..0000000000 --- a/tools/VInspector/VInspector_ItemSensitiveEntity.cxx +++ /dev/null @@ -1,195 +0,0 @@ -// 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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : GetSensitiveEntity -// purpose : -// ======================================================================= -Handle(SelectMgr_SensitiveEntity) VInspector_ItemSensitiveEntity::GetSensitiveEntity() const -{ - initItem(); - return myEntity; -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemSensitiveEntity::initValue (int theItemRole) const -{ - Handle(SelectMgr_SensitiveEntity) aBase = GetSensitiveEntity(); - Handle(SelectMgr_EntityOwner) anOwner = aBase->BaseSensitive()->OwnerId(); - - switch (theItemRole) - { - case Qt::DisplayRole: - case Qt::EditRole: - case Qt::ToolTipRole: - { - switch (Column()) - { - case 0: return myEntity->DynamicType()->Name(); - case 2: return VInspector_Tools::GetPointerInfo (GetSensitiveEntity()->BaseSensitive()->OwnerId(), true).ToCString(); - case 3: - { - Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner); - if (BROwnr.IsNull()) - return QVariant(); - - const TopoDS_Shape& aShape = BROwnr->Shape(); - if (aShape.IsNull()) - return QVariant(); - - return VInspector_Tools::GetShapeTypeInfo (aShape.ShapeType()).ToCString(); - } - case 13: return -#if OCC_VERSION_HEX <= 0x060901 - ("none"); -#else - myEntity->IsActiveForSelection() ? QString ("true") : QString ("false"); -#endif - case 14: return QString::number (GetSensitiveEntity()->BaseSensitive()->SensitivityFactor()); - case 15: return QString::number (GetSensitiveEntity()->BaseSensitive()->NbSubElements()); - case 16: - { - Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner); - if (BROwnr.IsNull()) - return QVariant(); - return anOwner->Priority(); - } - default: - break; - } - break; - } - case Qt::BackgroundRole: - case Qt::ForegroundRole: - { - if (Column() == 2) - { - Handle(AIS_InteractiveContext) aContext = GetContext(); - if (!aContext.IsNull()) - { - if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner())) - return QVariant ((theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white)); - } - } - VInspector_ItemSelectionPtr aParentItem = itemDynamicCast(Parent()); - if (aParentItem) - return aParentItem->data(QModelIndex(), theItemRole); - break; - } - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr VInspector_ItemSensitiveEntity::createChild (int theRow, int theColumn) -{ - return VInspector_ItemEntityOwner::CreateItem (currentItem(), theRow, theColumn); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void VInspector_ItemSensitiveEntity::Init() -{ - VInspector_ItemSelectionPtr aParentItem = itemDynamicCast(Parent()); - - Handle(SelectMgr_Selection) aSelection = aParentItem->getSelection(); - - int aRowId = Row(); - int aCurrentId = 0; -#if OCC_VERSION_HEX < 0x070201 - for (aSelection->Init(); aSelection->More(); aSelection->Next(), aCurrentId++) -#else - for (NCollection_Vector::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More(); aSelEntIter.Next(), aCurrentId++) -#endif - { - if (aCurrentId != aRowId) - continue; -#if OCC_VERSION_HEX < 0x070201 - myEntity = aSelection->Sensitive(); -#else - myEntity = aSelEntIter.Value(); -#endif - break; - } - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemSensitiveEntity::Reset() -{ - // an empty method to don't clear the main label, otherwise the model will be empty - TreeModel_ItemBase::Reset(); - myEntity = NULL; -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemSensitiveEntity::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : getEntityOwner -// purpose : -// ======================================================================= -Handle(SelectMgr_EntityOwner) VInspector_ItemSensitiveEntity::getEntityOwner() const -{ - initItem(); - - Handle(SelectMgr_EntityOwner) anOwner; - const Handle(Select3D_SensitiveEntity)& aBase = myEntity->BaseSensitive(); - if (aBase.IsNull()) - return anOwner; - return aBase->OwnerId(); -} diff --git a/tools/VInspector/VInspector_ItemSensitiveEntity.hxx b/tools/VInspector/VInspector_ItemSensitiveEntity.hxx deleted file mode 100644 index 4fbe8045cd..0000000000 --- a/tools/VInspector/VInspector_ItemSensitiveEntity.hxx +++ /dev/null @@ -1,90 +0,0 @@ -// 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 VInspector_ItemSensitiveEntity_H -#define VInspector_ItemSensitiveEntity_H - -#include -#include -#include -#include - -class SelectMgr_EntityOwner; -class VInspector_ItemSensitiveEntity; - -typedef QExplicitlySharedDataPointer VInspector_ItemSensitiveEntityPtr; - -//! \class VInspector_ItemSensitiveEntity -//! The item shows information about SelectMgr_EntityOwner. -//! The parent is item selection, children are item entity owners -class VInspector_ItemSensitiveEntity : public VInspector_ItemBase -{ - -public: - - //! Creates an item wrapped by a shared pointer - static VInspector_ItemSensitiveEntityPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - { return VInspector_ItemSensitiveEntityPtr (new VInspector_ItemSensitiveEntity (theParent, theRow, theColumn)); } - - //! Destructor - virtual ~VInspector_ItemSensitiveEntity() Standard_OVERRIDE {}; - - //! \return the current sensitive entity - Standard_EXPORT Handle(SelectMgr_SensitiveEntity) GetSensitiveEntity() const; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - -protected: - - //! Initialize the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! \return number of children. - virtual int initRowCount() const Standard_OVERRIDE { return !GetSensitiveEntity()->BaseSensitive().IsNull() ? 1 : 0; } - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; - -protected: - - //! 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 owner of the current sensitive entity - //! \return owner - Handle(SelectMgr_EntityOwner) getEntityOwner() const; - -private: - - //! Constructor - //! param theParent a parent item - VInspector_ItemSensitiveEntity(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) {} - -private: - - Handle(SelectMgr_SensitiveEntity) myEntity; //!< the current entity owner -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemV3dView.cxx b/tools/VInspector/VInspector_ItemV3dView.cxx new file mode 100644 index 0000000000..668ae51786 --- /dev/null +++ b/tools/VInspector/VInspector_ItemV3dView.cxx @@ -0,0 +1,293 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemV3dView::initRowCount() const +{ + if (Column() != 0) + return 0; + + return 3; // 0 - Default Camera, 1 - Aspect_Window, 2 - CView + // TODO: V3d_ListOfLight, V3d_Trihedron, + //Aspect_Grid-MyPlane-MyTrsf-MyGridEchoStructure-MyGridEchoGroup +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemV3dView::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + if (GetView().IsNull()) + return Column() == 0 ? "Empty view" : ""; + + switch (Column()) + { + case 0: return GetView()->DynamicType()->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemV3dView::Init() +{ + VInspector_ItemV3dViewerPtr aParentItem = itemDynamicCast(Parent()); + Handle(V3d_View) aView; + if (aParentItem) + { + aView = aParentItem->GetView (Row()); + } + setView (aView); + + UpdatePresentationShape(); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemV3dView::Reset() +{ + VInspector_ItemBase::Reset(); + + setView (NULL); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemV3dView::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemV3dView::GetTableRowCount() const +{ + return 60; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemV3dView::GetTableEditType (const int theRow, const int) const +{ + switch (theRow) + { + case 2: return ViewControl_EditType_DoubleVector; + } + + return ViewControl_EditType_None; +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemV3dView::GetTableEnumValues (const int, const int) const +{ + QList aValues; + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemV3dView::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + Handle(V3d_View) aView = GetView(); + if (aView.IsNull()) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: + { + if (isFirstColumn) + return QVariant ("ImmediateUpdate"); + + Standard_Boolean aCurState = aView->SetImmediateUpdate (Standard_False); + aView->SetImmediateUpdate (aCurState); + + return aCurState; + } + break; + case 1: + { + if (isFirstColumn) + return QVariant ("ActiveLights"); + + V3d_ListOfLightIterator aLightsIt = aView->ActiveLightIterator(); + Standard_Integer aNbOfLights = 0; + while (aLightsIt.More()) + { + aNbOfLights++; + aLightsIt.Next(); + } + return aNbOfLights; + } + case 2: + { + if (isFirstColumn) + return QVariant ("Axis: origin"); + + Standard_Real aX, anY, aZ, aVx, aVy, aVz; + aView->Axis (aX, anY, aZ, aVx, aVy, aVz); + + return ViewControl_Tools::ToString (gp_Pnt (aX, anY, aZ)).ToCString(); + } + case 3: + { + if (isFirstColumn) + return QVariant ("Axis: direction"); + + Standard_Real aX, anY, aZ, aVx, aVy, aVz; + aView->Axis (aX, anY, aZ, aVx, aVy, aVz); + + return ViewControl_Tools::ToString (gp_Dir (aVx, aVy, aVz)).ToCString(); + } + case 4: return isFirstColumn ? QVariant ("ComputedMode") : QVariant (aView->ComputedMode()); + case 5: return isFirstColumn ? QVariant ("AutoZFitMode") : QVariant (aView->AutoZFitMode()); + case 6: return isFirstColumn ? QVariant ("AutoZFitScaleFactor") : QVariant (aView->AutoZFitScaleFactor()); + } + return QVariant(); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemV3dView::SetTableData (const int theRow, const int theColumn, const QVariant& theValue) +{ + Handle(V3d_View) aView = GetView(); + if (aView.IsNull()) + return false; + + if (theColumn == 0) + return false; + + switch (theRow) + { + case 2: + { + QString aValue = theValue.toString(); + Standard_Real aX, anY, aZ, aVx, aVy, aVz; + QList aValues = ViewControl_TableDoubleVector::GetListVector(aValue); + + if (aValues.size() == 3) + { + aX = aValues[0].toFloat(); + anY = aValues[1].toFloat(); + aZ = aValues[2].toFloat(); + + Standard_Real aTmpX, aTmpY, aTmpZ; + aView->Axis(aTmpX, aTmpY, aTmpZ, aVx, aVy, aVz); + + aView->SetAxis(aX, anY, aZ, aVx, aVy, aVz); + } + } + } + return true; +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +TopoDS_Shape VInspector_ItemV3dView::buildPresentationShape (const Handle(V3d_View)& theView) +{ + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + + Standard_Real aX, anY, aZ, aVx, aVy, aVz; + theView->Axis (aX, anY, aZ, aVx, aVy, aVz); + gp_Pnt anOrigin (aX, anY, aZ); + + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (anOrigin)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Lin (anOrigin, gp_Dir (aVx, aVy, aVz)))); + + return aCompound; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemV3dView::createChild (int theRow, int theColumn) +{ + if (theRow == 0) + return VInspector_ItemGraphic3dCamera::CreateItem (currentItem(), theRow, theColumn); + else if (theRow == 1) + return VInspector_ItemAspectWindow::CreateItem (currentItem(), theRow, theColumn); + else if (theRow == 2) + return VInspector_ItemGraphic3dCView::CreateItem (currentItem(), theRow, theColumn); + + return TreeModel_ItemBasePtr(); +} diff --git a/tools/VInspector/VInspector_ItemV3dView.hxx b/tools/VInspector/VInspector_ItemV3dView.hxx new file mode 100644 index 0000000000..8841c624f3 --- /dev/null +++ b/tools/VInspector/VInspector_ItemV3dView.hxx @@ -0,0 +1,137 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemV3dView_H +#define VInspector_ItemV3dView_H + +#include +#include + +#include +#include + +class VInspector_ItemV3dView; +typedef QExplicitlySharedDataPointer VInspector_ItemV3dViewPtr; + +//! \class VInspector_ItemV3dView +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemV3dView : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemV3dViewPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemV3dViewPtr (new VInspector_ItemV3dView (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemV3dView() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myView; } + + //! Returns current drawer, initialize the drawer if it was not initialized yet + Standard_EXPORT Handle(V3d_View) GetView() const + { return Handle(V3d_View)::DownCast (GetObject()); } + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! Build presentation shape + //! \return generated shape of the item parameters + virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE { return buildPresentationShape (myView); } + + //! Creates shape for the 3d view parameters + //! \param theView current view + //! \return shape or NULL + static TopoDS_Shape buildPresentationShape (const Handle(V3d_View)& theView); + +protected: + + //! 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: + + //! Set V3d view into the current field + //! \param theViewer a viewer + void setView (const Handle(V3d_View)& theView) { myView = theView; } + +private: + + //! 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 + VInspector_ItemV3dView(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +protected: + + Handle(V3d_View) myView; //!< the current view +}; + +#endif diff --git a/tools/VInspector/VInspector_ItemV3dViewer.cxx b/tools/VInspector/VInspector_ItemV3dViewer.cxx new file mode 100644 index 0000000000..0cfc80edc5 --- /dev/null +++ b/tools/VInspector/VInspector_ItemV3dViewer.cxx @@ -0,0 +1,195 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// ======================================================================= +// function : GetView +// purpose : +// ======================================================================= +Handle(V3d_View) VInspector_ItemV3dViewer::GetView (const int theRow) const +{ + Handle(V3d_Viewer) aViewer = GetViewer(); + + int aViewId = 0; + for (V3d_ListOfViewIterator anActiveViewIter (GetViewer()->ActiveViewIterator()); anActiveViewIter.More(); anActiveViewIter.Next()) + { + Handle(V3d_View) aView = anActiveViewIter.Value(); + if (aView->View().IsNull()) + continue; + + if (theRow == aViewId) + return aView; + aViewId++; + } + + return NULL; +} + +// ======================================================================= +// function : initRowCount +// purpose : +// ======================================================================= +int VInspector_ItemV3dViewer::initRowCount() const +{ + if (Column() != 0) + return 0; + + int aNbOfViews = 0; + for (V3d_ListOfViewIterator anActiveViewIter (GetViewer()->ActiveViewIterator()); anActiveViewIter.More(); anActiveViewIter.Next()) + { + if (!anActiveViewIter.Value().IsNull()) + aNbOfViews++; + } + return aNbOfViews; +} + +// ======================================================================= +// function : initValue +// purpose : +// ======================================================================= +QVariant VInspector_ItemV3dViewer::initValue (const int theItemRole) const +{ + QVariant aParentValue = VInspector_ItemBase::initValue (theItemRole); + if (aParentValue.isValid()) + return aParentValue; + + if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole) + return QVariant(); + + if (GetViewer().IsNull()) + return Column() == 0 ? "Empty viewer" : ""; + + switch (Column()) + { + case 0: return GetViewer()->DynamicType()->Name(); + default: + break; + } + return QVariant(); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspector_ItemV3dViewer::Init() +{ + VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast(Parent()); + Handle(V3d_Viewer) aViewer; + if (aParentItem) + { + VInspector_ItemContextPtr aParentContextItem = itemDynamicCast(aParentItem->Parent()); + if (aParentContextItem) + { + Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext(); + aViewer = aContext->CurrentViewer(); + } + } + setViewer (aViewer); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspector_ItemV3dViewer::Reset() +{ + VInspector_ItemBase::Reset(); + + setViewer (NULL); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspector_ItemV3dViewer::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspector_ItemV3dViewer::GetTableRowCount() const +{ + return 0; +} + +// ======================================================================= +// function : GetTableEditType +// purpose : +// ======================================================================= +ViewControl_EditType VInspector_ItemV3dViewer::GetTableEditType (const int theRow, const int) const +{ + return ViewControl_EditType_None; +} + +// ======================================================================= +// function : GetTableEnumValues +// purpose : +// ======================================================================= +QList VInspector_ItemV3dViewer::GetTableEnumValues (const int theRow, const int) const +{ + QList aValues; + return aValues; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspector_ItemV3dViewer::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); +} + +// ======================================================================= +// function : SetTableData +// purpose : +// ======================================================================= +bool VInspector_ItemV3dViewer::SetTableData (const int theRow, const int, const QVariant& theValue) +{ + return true; +} + +// ======================================================================= +// function : createChild +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspector_ItemV3dViewer::createChild (int theRow, int theColumn) +{ + return VInspector_ItemV3dView::CreateItem (currentItem(), theRow, theColumn); +} diff --git a/tools/VInspector/VInspector_ItemV3dViewer.hxx b/tools/VInspector/VInspector_ItemV3dViewer.hxx new file mode 100644 index 0000000000..44eec52dc1 --- /dev/null +++ b/tools/VInspector/VInspector_ItemV3dViewer.hxx @@ -0,0 +1,130 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 VInspector_ItemV3dViewer_H +#define VInspector_ItemV3dViewer_H + +#include +#include + +#include + +class VInspector_ItemV3dViewer; +typedef QExplicitlySharedDataPointer VInspector_ItemV3dViewerPtr; + +//! \class VInspector_ItemV3dViewer +//! Parent item, that corresponds to AIS_InteractiveContext +//! Children of the item are: +//! - "Property" item to show context attributes such as selection filters and drawer properties +//! - presentation items to show all interactive elements displayed/erased in the context +class VInspector_ItemV3dViewer : public VInspector_ItemBase +{ +public: + + //! Creates an item wrapped by a shared pointer + static VInspector_ItemV3dViewerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspector_ItemV3dViewerPtr (new VInspector_ItemV3dViewer (theParent, theRow, theColumn)); } + + //! Destructor + virtual ~VInspector_ItemV3dViewer() Standard_OVERRIDE {}; + + //! Returns view by index using active views iterator + //! \param theRow row index of the view + //! \return view + Standard_EXPORT Handle(V3d_View) GetView (const int theRow) const; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns data object of the item. + //! \return object + virtual Handle(Standard_Transient) GetObject() const { initItem(); return myViewer; } + + //! Returns current drawer, initialize the drawer if it was not initialized yet + Standard_EXPORT Handle(V3d_Viewer) GetViewer() const + { return Handle(V3d_Viewer)::DownCast (GetObject()); } + +protected: + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + + //! Returns number of displayed presentations + //! \return rows count + Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; + + //! Returns item information for the given role. Fills internal container if it was not filled yet + //! \param theItemRole a value role + //! \return the value + Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE; + +protected: + + //! 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: + + //! Set V3d viewer into the current field + //! \param theViewer a viewer + void setViewer (const Handle(V3d_Viewer)& theViewer) { myViewer = theViewer; } + +private: + + //! 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 + VInspector_ItemV3dViewer(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemBase(theParent, theRow, theColumn) {} + +protected: + + Handle(V3d_Viewer) myViewer; //!< the current viewer +}; + +#endif diff --git a/tools/VInspector/VInspector_PreviewParameters.cxx b/tools/VInspector/VInspector_PreviewParameters.cxx new file mode 100644 index 0000000000..7b3f80cea3 --- /dev/null +++ b/tools/VInspector/VInspector_PreviewParameters.cxx @@ -0,0 +1,120 @@ +// Created on: 2019-05-03 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +#include +#include +#include + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +VInspector_PreviewParameters::VInspector_PreviewParameters() +{ + myDrawer = new Prs3d_Drawer(); + + Quantity_Color aColor(Quantity_NOC_TOMATO);//Quantity_NOC_GREENYELLOW));//Quantity_NOC_BLUE1)); + Standard_ShortReal aTransparency = 0.8; + + // point parameters + myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_O_PLUS, aColor, 3.0)); + + // shading parameters + Graphic3d_MaterialAspect aShadingMaterial; + aShadingMaterial.SetReflectionModeOff (Graphic3d_TOR_SPECULAR); + aShadingMaterial.SetMaterialType (Graphic3d_MATERIAL_ASPECT); + + myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); + myDrawer->ShadingAspect()->Aspect()->SetInteriorStyle (Aspect_IS_SOLID); + myDrawer->ShadingAspect()->SetColor (aColor); + myDrawer->ShadingAspect()->SetMaterial (aShadingMaterial); + + myDrawer->ShadingAspect()->Aspect()->ChangeFrontMaterial().SetTransparency (aTransparency); + myDrawer->ShadingAspect()->Aspect()->ChangeBackMaterial() .SetTransparency (aTransparency); + myDrawer->SetTransparency (aTransparency); + + // common parameters + myDrawer->SetZLayer (Graphic3d_ZLayerId_Topmost); +} + +// ======================================================================= +// function : SaveState +// purpose : +// ======================================================================= +void VInspector_PreviewParameters::SaveState (VInspector_PreviewParameters* theParameters, + QMap& theItems, + const QString& thePrefix) +{ + Handle(Prs3d_Drawer) aDrawer = theParameters->GetDrawer(); + + //Quantity_Color aColor = aDrawer->Color(); + //Standard_ShortReal aTransparency = aDrawer->Transparency(); + + //// point parameters + //{ + // Standard_Boolean anOwnPointAspect = aDrawer->HasOwnPointAspect(); + // Standard_SStream OS; + // if (anOwnPointAspect) + // myDrawer->PointAspect()->Dump (OS); + // TCollection_AsciiString aStream (OS.str().c_str()); + // theItems[thePrefix + "has_point_aspect"] = anOwnPointAspect; + // theItems[thePrefix + "point_aspect"] = aStream.ToCString(); + //} + //// shading parameters + //{ + // Standard_Boolean anOwnShadingAspect = aDrawer->HasOwnShadingAspect(); + // Standard_SStream OS; + // if (anOwnShadingAspect) + // myDrawer->ShadingAspect()->Dump (OS); + // TCollection_AsciiString aStream (OS.str().c_str()); + // theItems[thePrefix + "has_shading_aspect"] = anOwnShadingAspect; + // theItems[thePrefix + "shading_aspect"] = aStream.ToCString(); + //} +} + +// ======================================================================= +// function : RestoreState +// purpose : +// ======================================================================= +bool VInspector_PreviewParameters::RestoreState (VInspector_PreviewParameters* theParameters, + const QString& theKey, const QString& theValue, + const QString& thePrefix) +{ + //if (theKey == thePrefix + "has_point_aspect") // point parameters + //{ + // myDrawer->SetOwnPointAspect (theValue.toBool()); + //} + //else if (theKey == thePrefix + "point_aspect") // point parameters + //{ + // Standard_SStream aStream; + // aStream << theValue.ToString().ToStdString(); + // myDrawer->PointAspect()->Init (aStream); + //} + //else if (theKey == thePrefix + "has_shading_aspect") // shading parameters + //{ + // myDrawer->SetOwnShadingAspect (theValue.toBool()); + //} + //else if (theKey == thePrefix + "shading_aspect") // shading parameters + //{ + // Standard_SStream aStream; + // aStream << theValue.ToString().ToStdString(); + // myDrawer->ShadingAspect()->Init (aStream); + //} + //else + // return false; + return true; +} diff --git a/tools/VInspector/VInspector_PreviewParameters.hxx b/tools/VInspector/VInspector_PreviewParameters.hxx new file mode 100644 index 0000000000..e98bea6260 --- /dev/null +++ b/tools/VInspector/VInspector_PreviewParameters.hxx @@ -0,0 +1,68 @@ +// Created on: 2019-05-03 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_PreviewParameters_H +#define VInspector_PreviewParameters_H + +#include +#include + +#include + +#include +#include +#include +#include + +//! \class VInspector_PreviewParameters +//! Container of View tool bar actions +class VInspector_PreviewParameters +{ +public: + + //! Constructor + Standard_EXPORT VInspector_PreviewParameters (); + + //! Destructor + virtual ~VInspector_PreviewParameters() {} + + //! Returns main control + const Handle(Prs3d_Drawer)& GetDrawer() const { return myDrawer; } + + //! Save state of three view in a container in form: key, value. It saves: + //! - visibiblity of columns, + //! - columns width + //! \param theTreeView a view instance + //! \param theItems [out] properties + //! \param thePrefix peference item prefix + Standard_EXPORT static void SaveState (VInspector_PreviewParameters* theParameters, + QMap& 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 (VInspector_PreviewParameters* theParameters, + const QString& theKey, const QString& theValue, + const QString& thePrefix = QString()); + +private: + + Handle(Prs3d_Drawer) myDrawer; +}; + +#endif diff --git a/tools/VInspector/VInspector_PropertiesCreator.cxx b/tools/VInspector/VInspector_PropertiesCreator.cxx new file mode 100644 index 0000000000..7d376c977e --- /dev/null +++ b/tools/VInspector/VInspector_PropertiesCreator.cxx @@ -0,0 +1,36 @@ +// Created on: 2019-04-28 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 +#include +#include + +#include + +IMPLEMENT_STANDARD_RTTIEXT(VInspector_PropertiesCreator, TreeModel_ItemPropertiesCreator) + +// ======================================================================= +// function : GetProperties +// purpose : +// ======================================================================= +TreeModel_ItemProperties* VInspector_PropertiesCreator::GetProperties (const TreeModel_ItemBasePtr& theItem) +{ + Standard_SStream aSStream; + if (theItem->Dump (aSStream)) + return new ViewControl_PropertiesStream (theItem); + + return NULL; +} + diff --git a/tools/VInspector/VInspector_PropertiesCreator.hxx b/tools/VInspector/VInspector_PropertiesCreator.hxx new file mode 100644 index 0000000000..b0673db741 --- /dev/null +++ b/tools/VInspector/VInspector_PropertiesCreator.hxx @@ -0,0 +1,47 @@ +// Created on: 2019-04-28 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspector_PropertiesCreator_H +#define VInspector_PropertiesCreator_H + +#include +#include + +#include + +DEFINE_STANDARD_HANDLE (VInspector_PropertiesCreator, TreeModel_ItemPropertiesCreator) + +//! \class VInspector_PropertiesCreator +//! \brief An interface to create custom panes by transient object name. +class VInspector_PropertiesCreator : public TreeModel_ItemPropertiesCreator +{ +public: + + //! Constructor + VInspector_PropertiesCreator() {} + + //! Destructor + virtual ~VInspector_PropertiesCreator() {} + + //! Returns pane for the name, creates a new pane if it does not exist and possible to create + //! \param theName type of the pane + //! \return a pane instance or NULL + virtual TreeModel_ItemProperties* GetProperties (const TreeModel_ItemBasePtr& theItem) Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT(VInspector_PropertiesCreator, TreeModel_ItemPropertiesCreator) + +}; + +#endif diff --git a/tools/VInspector/VInspector_TableModelValues.cxx b/tools/VInspector/VInspector_TableModelValues.cxx new file mode 100644 index 0000000000..79606ed753 --- /dev/null +++ b/tools/VInspector/VInspector_TableModelValues.cxx @@ -0,0 +1,328 @@ +// 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 + +#include +#include +#include +#include + +#include + +#include +#include +#include + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= + +VInspector_TableModelValues::VInspector_TableModelValues (const TreeModel_ItemBasePtr& theItem, + const NCollection_List& theCreators) + : ViewControl_TableModelValues(), myItem (theItem), myCreators (theCreators) +{ + QList aHeaderValues; + aHeaderValues.append(TreeModel_HeaderSection ("Function", 190)); + aHeaderValues.append(TreeModel_HeaderSection ("Value", -2)); + SetHeaderValues(aHeaderValues, Qt::Horizontal); + + SetHeaderVisible(Qt::Horizontal, Standard_False); + SetHeaderVisible(Qt::Vertical, Standard_False); +} + +// ======================================================================= +// function : Data +// purpose : +// ======================================================================= + +QVariant VInspector_TableModelValues::Data (const int theRow, const int theColumn, int theRole) const +{ + int aRow = theRow; + if (!myItem->GetProperties().IsNull()) + { + int aPropertiesCount = myItem->GetProperties()->GetTableRowCount(); + if (aRow < aPropertiesCount) + return myItem->GetProperties()->GetTableData (theRow, theColumn, theRole); + else + aRow = aRow - aPropertiesCount; + } + switch (theRole) + { + case Qt::FontRole: + { + if (theColumn == 0) + { + QFont aFont = qApp->font(); + aFont.setItalic (true); + return aFont; + } + } + case Qt::ForegroundRole: + { + if (theColumn == 0) + return QColor (Qt::darkGray).darker(150); + else if (GetEditType (aRow, theColumn) != ViewControl_EditType_None) + return ViewControl_TableModelValues::EditCellColor(); + } + default: + { + VInspector_ItemBasePtr anItem = GetItem(); + if (!anItem) + return QVariant(); + Handle(Standard_Transient) anObject = anItem->GetObject(); + if (anObject.IsNull()) + return anItem->GetTableData (aRow, theColumn, theRole); + + int aCurrentRow = aRow; + for (NCollection_List::Iterator anIterator (myCreators); anIterator.More(); anIterator.Next()) + { + Handle(ViewControl_PaneCreator) aCreator = anIterator.Value(); + ViewControl_Pane* aPane = aCreator->GetPane (anObject->DynamicType()->Name()); + if (!aPane) + continue; + if (aCurrentRow >= aPane->GetTableRowCount (anObject)) + aCurrentRow -= aPane->GetTableRowCount (anObject); + else + return aPane->GetTableData (anObject, aCurrentRow, theColumn, theRole); + } + return anItem->GetTableData (aCurrentRow, theColumn, theRole); + } + } +} + +// ======================================================================= +// function : GetRangeValues +// purpose : +// ======================================================================= + +bool VInspector_TableModelValues::SetData (const int theRow, const int theColumn, const QVariant& theValue, int theRole) +{ + if (theRole != Qt::EditRole) + return false; + + int aRow = theRow; + if (!myItem->GetProperties().IsNull()) + { + int aPropertiesCount = myItem->GetProperties()->GetTableRowCount(); + if (aRow < aPropertiesCount) + return myItem->GetProperties()->SetTableData (theRow, theColumn, theValue); + else + aRow = aRow - aPropertiesCount; + } + + VInspector_ItemBasePtr anItem = GetItem(); + if (!anItem) + return false; + + Handle(Standard_Transient) anObject = anItem->GetObject(); + if (anObject.IsNull()) + return anItem->SetTableData (aRow, theColumn, theValue); + + int aCurrentRow = aRow; + for (NCollection_List::Iterator anIterator (myCreators); anIterator.More(); anIterator.Next()) + { + Handle(ViewControl_PaneCreator) aCreator = anIterator.Value(); + ViewControl_Pane* aPane = aCreator->GetPane (anObject->DynamicType()->Name()); + if (!aPane) + continue; + if (aCurrentRow >= aPane->GetTableRowCount (anObject)) + aCurrentRow -= aPane->GetTableRowCount (anObject); + else + return aPane->SetTableData (anObject, aCurrentRow, theColumn, theValue); + } + return anItem->SetTableData (aCurrentRow, theColumn, theValue); +} + +// ======================================================================= +// function : Flags +// purpose : +// ======================================================================= + +Qt::ItemFlags VInspector_TableModelValues::Flags (const QModelIndex& theIndex) const +{ + Qt::ItemFlags aFlags = ViewControl_TableModelValues::Flags (theIndex); + + if (theIndex.column() == 1) + aFlags = aFlags | Qt::ItemIsEditable; + + return aFlags; +} + +// ======================================================================= +// function : RowCount +// purpose : +// ======================================================================= + +int VInspector_TableModelValues::RowCount (const QModelIndex& theParent) const +{ + int aRowCount = 0; + if (!myItem->GetProperties().IsNull()) + aRowCount = myItem->GetProperties()->GetTableRowCount(); + + VInspector_ItemBasePtr anItem = GetItem(); + if (!anItem) + return aRowCount; + + aRowCount += anItem->GetTableRowCount(); + Handle(Standard_Transient) anObject = anItem->GetObject(); + if (anObject.IsNull()) + return aRowCount; + + for (NCollection_List::Iterator anIterator (myCreators); anIterator.More(); anIterator.Next()) + { + Handle(ViewControl_PaneCreator) aCreator = anIterator.Value(); + ViewControl_Pane* aPane = aCreator->GetPane (anObject->DynamicType()->Name()); + if (!aPane) + continue; + aRowCount += aPane->GetTableRowCount (anObject); + } + return aRowCount; +} + +// ======================================================================= +// function : GetEditType +// purpose : +// ======================================================================= + +ViewControl_EditType VInspector_TableModelValues::GetEditType (const int theRow, const int theColumn) const +{ + int aRow = theRow; + if (!myItem->GetProperties().IsNull()) + { + int aPropertiesCount = myItem->GetProperties()->GetTableRowCount(); + if (aRow < aPropertiesCount) + return myItem->GetProperties()->GetTableEditType (theRow, theColumn); + else + aRow = aRow - aPropertiesCount; + } + + if (theColumn == 0) + return ViewControl_EditType_None; + + VInspector_ItemBasePtr anItem = GetItem(); + if (!anItem) + return ViewControl_EditType_None; + + Handle(Standard_Transient) anObject = anItem->GetObject(); + if (anObject.IsNull()) + return anItem->GetTableEditType (aRow, theColumn); + + int aCurrentRow = aRow; + for (NCollection_List::Iterator anIterator (myCreators); anIterator.More(); anIterator.Next()) + { + Handle(ViewControl_PaneCreator) aCreator = anIterator.Value(); + ViewControl_Pane* aPane = aCreator->GetPane (anObject->DynamicType()->Name()); + if (!aPane) + continue; + if (aCurrentRow >= aPane->GetTableRowCount (anObject)) + aCurrentRow -= aPane->GetTableRowCount (anObject); + else + return aPane->GetTableEditType (anObject, aCurrentRow, theColumn); + } + return anItem->GetTableEditType (aCurrentRow, theColumn); +} + +// ======================================================================= +// function : GetEnumValues +// purpose : +// ======================================================================= + +QList VInspector_TableModelValues::GetEnumValues (const int theRow, const int theColumn) const +{ + if (theColumn != 1) + return QList(); + + int aRow = theRow; + if (!myItem->GetProperties().IsNull()) + { + int aPropertiesCount = myItem->GetProperties()->GetTableRowCount(); + if (aRow < aPropertiesCount) + return myItem->GetProperties()->GetTableEnumValues (theRow, theColumn); + else + aRow = aRow - aPropertiesCount; + } + + VInspector_ItemBasePtr anItem = GetItem(); + if (!anItem) + return QList(); + + Handle(Standard_Transient) anObject = anItem->GetObject(); + if (anObject.IsNull()) + return anItem->GetTableEnumValues (aRow, theColumn); + + int aCurrentRow = aRow; + for (NCollection_List::Iterator anIterator (myCreators); anIterator.More(); anIterator.Next()) + { + Handle(ViewControl_PaneCreator) aCreator = anIterator.Value(); + ViewControl_Pane* aPane = aCreator->GetPane (anObject->DynamicType()->Name()); + if (!aPane) + continue; + if (aCurrentRow >= aPane->GetTableRowCount (anObject)) + aCurrentRow -= aPane->GetTableRowCount (anObject); + else + return aPane->GetTableEnumValues (anObject, aCurrentRow, theColumn); + } + return anItem->GetTableEnumValues (aCurrentRow, theColumn); +} + +// ======================================================================= +// function : GetPaneShapes +// purpose : +// ======================================================================= + +void VInspector_TableModelValues::GetPaneShapes (const int theRow, const int theColumn, NCollection_List& theShapes) +{ + int aRow = theRow; + if (!myItem->GetProperties().IsNull()) + { + int aPropertiesCount = myItem->GetProperties()->GetTableRowCount(); + if (aRow < aPropertiesCount) + return;// myItem->GetProperties()->GetEnumValues (theRow, theColumn); + else + aRow = aRow - aPropertiesCount; + } + + VInspector_ItemBasePtr anItem = GetItem(); + if (!anItem) + return; + + Handle(Standard_Transient) anObject = anItem->GetObject(); + if (anObject.IsNull()) + return; + + for (NCollection_List::Iterator anIterator (myCreators); anIterator.More(); anIterator.Next()) + { + Handle(ViewControl_PaneCreator) aCreator = anIterator.Value(); + ViewControl_Pane* aPane = aCreator->GetPane (anObject->DynamicType()->Name()); + if (!aPane) + continue; + + ViewControl_PaneItem* anItem = aPane->GetSelected (anObject, aRow, theColumn); + if (anItem && !anItem->GetShape().IsNull()) + theShapes.Append (anItem->GetShape()); + } +} + +// ======================================================================= +// function : GetItem +// purpose : +// ======================================================================= + +VInspector_ItemBasePtr VInspector_TableModelValues::GetItem() const +{ + return itemDynamicCast(myItem); +} diff --git a/tools/VInspector/VInspector_TableModelValues.hxx b/tools/VInspector/VInspector_TableModelValues.hxx new file mode 100644 index 0000000000..fb917187ec --- /dev/null +++ b/tools/VInspector/VInspector_TableModelValues.hxx @@ -0,0 +1,101 @@ +// 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 VInspector_TableModelValues_H +#define VInspector_TableModelValues_H + +#include +#include +#include + +class ViewControl_PaneCreator; + +#include + +//! \class VInspector_TableModelValues +//! \brief This is an implementation for ViewControl_TableModel to present tree item values +class VInspector_TableModelValues : public ViewControl_TableModelValues +{ +public: + + //! Constructor + Standard_EXPORT VInspector_TableModelValues (const TreeModel_ItemBasePtr& theItem, + const NCollection_List& theCreators); + + //! Destructor + virtual ~VInspector_TableModelValues() Standard_OVERRIDE {} + + //! Returns number of columns. It has two columns: + //! \param theParent an index of the parent item + //! \return an integer value + Standard_EXPORT virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE + { (void)theParent; return 2; } + + //! 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 theRow a model index row + //! \param theColumn a model index column + //! \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 Standard_OVERRIDE; + + //! Sets content of the model index for the given role, it is applyed to internal container of values + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return true if the value is changed + Standard_EXPORT virtual bool SetData (const int theRow, const int theColumn, const QVariant& theValue, + int theRole = Qt::DisplayRole) Standard_OVERRIDE; + + //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable. + //! Additional flag for the column 1 is Qt::ItemIsEditable. + //! \param theIndex a model index + //! \return flags + virtual Qt::ItemFlags Flags (const QModelIndex& theIndex) const Standard_OVERRIDE; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetEditType (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE; + + //! Returns container of pane shapes + //! \param theRow table model row index + //! \param theColumn a model index column + //! \param [out] output container of shapes to add pane new shapes if found + Standard_EXPORT void GetPaneShapes (const int theRow, const int theColumn, NCollection_List& theShapes); + +private: + + //!< Returns source item base + VInspector_ItemBasePtr GetItem() const; + +private: + NCollection_List myCreators; //!< pane creators + TreeModel_ItemBasePtr myItem; //!< source item base +}; + +#endif diff --git a/tools/VInspector/VInspector_Tools.cxx b/tools/VInspector/VInspector_Tools.cxx index eeb52fe983..d443f150bb 100644 --- a/tools/VInspector/VInspector_Tools.cxx +++ b/tools/VInspector/VInspector_Tools.cxx @@ -15,14 +15,29 @@ #include +#include +#include +#include + #include #include +#include +#if OCC_VERSION_HEX < 0x060901 +#include +#endif #include #include #include #include +#include +#include +#include #include -#include +#include +#include +#include +#include + #include #include #include @@ -33,6 +48,8 @@ #include #include +#include + #include // ======================================================================= @@ -52,6 +69,9 @@ TCollection_AsciiString VInspector_Tools::GetShapeTypeInfo (const TopAbs_ShapeEn // ======================================================================= TCollection_AsciiString VInspector_Tools::GetPointerInfo (const Handle(Standard_Transient)& thePointer, const bool isShortInfo) { + if (!thePointer.operator->()) + return ""; + std::ostringstream aPtrStr; aPtrStr << thePointer.operator->(); if (!isShortInfo) @@ -115,10 +135,10 @@ int VInspector_Tools::SelectedOwners (const Handle(AIS_InteractiveContext)& theC // purpose : // ======================================================================= bool VInspector_Tools::IsOwnerSelected (const Handle(AIS_InteractiveContext)& theContext, - const Handle(SelectMgr_EntityOwner)& theOwner) + const Handle(SelectBasics_EntityOwner)& theOwner) { bool anIsSelected = false; - Handle(SelectMgr_EntityOwner) anOwner = theOwner; + Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (theOwner); for (theContext->InitSelected(); theContext->MoreSelected() && !anIsSelected; theContext->NextSelected()) anIsSelected = theContext->SelectedOwner() == anOwner; return anIsSelected; @@ -128,10 +148,10 @@ bool VInspector_Tools::IsOwnerSelected (const Handle(AIS_InteractiveContext)& th // function : ContextOwners // purpose : // ======================================================================= -NCollection_List VInspector_Tools::ContextOwners ( +NCollection_List VInspector_Tools::ContextOwners ( const Handle(AIS_InteractiveContext)& theContext) { - NCollection_List aResultOwners; + NCollection_List aResultOwners; if (theContext.IsNull()) return aResultOwners; @@ -164,8 +184,8 @@ NCollection_List VInspector_Tools::ContextOwners #endif if (anEntity.IsNull()) continue; - const Handle(Select3D_SensitiveEntity)& aBase = anEntity->BaseSensitive(); - Handle(SelectMgr_EntityOwner) anOwner = aBase->OwnerId(); + const Handle(SelectBasics_SensitiveEntity)& aBase = anEntity->BaseSensitive(); + Handle(SelectBasics_EntityOwner) anOwner = aBase->OwnerId(); Standard_Transient* anOwnerPtr = anOwner.operator->(); if (aSelectedIds.contains ((size_t)anOwnerPtr)) continue; @@ -181,17 +201,17 @@ NCollection_List VInspector_Tools::ContextOwners // function : ActiveOwners // purpose : // ======================================================================= -NCollection_List VInspector_Tools::ActiveOwners ( +NCollection_List VInspector_Tools::ActiveOwners ( const Handle(AIS_InteractiveContext)& theContext, - NCollection_List& theEmptySelectableOwners) + NCollection_List& theEmptySelectableOwners) { - NCollection_List aResultOwners; + NCollection_List aResultOwners; // only local context is processed: TODO for global context Handle(AIS_InteractiveContext) aContext = theContext; if (aContext.IsNull()) return aResultOwners; - NCollection_List anActiveOwners; + NCollection_List anActiveOwners; // OCCT BUG:1 - equal pointer owners are appears in the list #if OCC_VERSION_HEX > 0x060901 aContext->MainSelector()->ActiveOwners (anActiveOwners); @@ -199,10 +219,11 @@ NCollection_List VInspector_Tools::ActiveOwners ( anActiveOwners = aContext->MainSelector()->ActiveOwners(); #endif QList aSelectedIds; // Remember of selected address in order to avoid duplicates - for (NCollection_List::Iterator anOwnersIt (anActiveOwners); + Handle(SelectMgr_EntityOwner) anOwner; + for (NCollection_List::Iterator anOwnersIt (anActiveOwners); anOwnersIt.More(); anOwnersIt.Next()) { - const Handle(SelectMgr_EntityOwner)& anOwner = anOwnersIt.Value(); + anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anOwnersIt.Value()); if (anOwner.IsNull()) continue; @@ -225,7 +246,7 @@ NCollection_List VInspector_Tools::ActiveOwners ( // purpose : // ======================================================================= void VInspector_Tools::AddOrRemoveSelectedShapes (const Handle(AIS_InteractiveContext)& theContext, - const NCollection_List& theOwners) + const NCollection_List& theOwners) { // TODO: the next two rows are to be removed later theContext->UnhilightSelected(false); @@ -233,11 +254,23 @@ void VInspector_Tools::AddOrRemoveSelectedShapes (const Handle(AIS_InteractiveCo theContext->UnhilightSelected(Standard_False); - for (NCollection_List::Iterator anOwnersIt(theOwners); + //TODO: processing in local context only +#if OCC_VERSION_HEX < 0x060901 + Handle(AIS_LocalContext) aLContext = theContext->LocalContext(); + TCollection_AsciiString aSelectionName = aLContext->SelectionName(); + aLContext->UnhilightPicked(Standard_False); +#endif + + for (NCollection_List::Iterator anOwnersIt(theOwners); anOwnersIt.More(); anOwnersIt.Next()) { - Handle(SelectMgr_EntityOwner) anOwner = anOwnersIt.Value(); + Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anOwnersIt.Value()); +#if OCC_VERSION_HEX > 0x060901 theContext->AddOrRemoveSelected (anOwner, Standard_False); +#else + AIS_Selection::Selection(aSelectionName.ToCString())->Select(anOwner); + anOwner->SetSelected(Standard_True); +#endif } theContext->UpdateCurrentViewer(); } @@ -401,10 +434,11 @@ TCollection_AsciiString VInspector_Tools::ToName (const VInspector_SelectionType { switch (theValue) { - case SelectMgr_SOS_Any: return "Any"; - case SelectMgr_SOS_Unknown: return "Unknown"; case SelectMgr_SOS_Activated: return "Activated"; case SelectMgr_SOS_Deactivated: return "Deactivated"; + //case SelectMgr_SOS_Sleeping: return "Sleeping"; + case SelectMgr_SOS_Any: return "Any"; + case SelectMgr_SOS_Unknown: return "Unknown"; default: break; } } @@ -466,37 +500,306 @@ TCollection_AsciiString VInspector_Tools::OrientationToName (const TopAbs_Orient } // ======================================================================= -// function : LocationToName +// function : ReadShape // purpose : // ======================================================================= -TCollection_AsciiString VInspector_Tools::LocationToName (const TopLoc_Location& theLocation) +TopoDS_Shape VInspector_Tools::ReadShape (const TCollection_AsciiString& theFileName) +{ + TopoDS_Shape aShape; + + BRep_Builder aBuilder; + BRepTools::Read (aShape, theFileName.ToCString(), aBuilder); + + return aShape; +} + +// ======================================================================= +// function : GetPropertyTableValues +// purpose : +// ======================================================================= +void VInspector_Tools::GetPropertyTableValues (const TreeModel_ItemBasePtr& theItem, + const NCollection_List& theCreators, + QList& theTableValues) +{ + TreeModel_ItemBasePtr anItem = theItem; + VInspector_ItemFolderObjectPtr aFolderItem = itemDynamicCast(anItem); + if (aFolderItem) + { + VInspector_ItemFolderObject::ParentKind aParentKind = aFolderItem->GetParentItemKind(); + if (aParentKind == VInspector_ItemFolderObject::ParentKind_ContextItem || + aParentKind == VInspector_ItemFolderObject::ParentKind_PresentationItem) + anItem = theItem->Parent(); + } + + theTableValues.append (new VInspector_TableModelValues (anItem, theCreators)); +} + +namespace +{ + static Standard_CString VInspector_Table_PrintDisplayActionType[5] = + { + "None", "Display", "Redisplay", "Erase", "Remove" + }; +} + +//======================================================================= +//function : DisplayActionTypeToString +//purpose : +//======================================================================= +Standard_CString VInspector_Tools::DisplayActionTypeToString (VInspector_DisplayActionType theType) +{ + return VInspector_Table_PrintDisplayActionType[theType]; +} + +//======================================================================= +//function : DisplayActionTypeFromString +//purpose : +//======================================================================= +Standard_Boolean VInspector_Tools::DisplayActionTypeFromString (Standard_CString theTypeString, + VInspector_DisplayActionType& theType) +{ + TCollection_AsciiString aName (theTypeString); + for (Standard_Integer aTypeIter = 0; aTypeIter <= VInspector_DisplayActionType_RemoveId; ++aTypeIter) + { + Standard_CString aTypeName = VInspector_Table_PrintDisplayActionType[aTypeIter]; + if (aName == aTypeName) + { + theType = VInspector_DisplayActionType (aTypeIter); + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : ToVariant +//purpose : +//======================================================================= +QVariant VInspector_Tools::ToVariant (const Select3D_BndBox3d& theBoundingBox) +{ + return QString ("(%1, %2, %3), (%4, %5, %6)") + .arg (theBoundingBox.CornerMin().x()).arg (theBoundingBox.CornerMin().y()).arg (theBoundingBox.CornerMin().z()) + .arg (theBoundingBox.CornerMax().x()).arg (theBoundingBox.CornerMax().y()).arg (theBoundingBox.CornerMax().z()); +} + +//======================================================================= +//function : CreateShape +//purpose : +//======================================================================= +TopoDS_Shape VInspector_Tools::CreateShape (const Bnd_Box& theBoundingBox) +{ + if (theBoundingBox.IsVoid() || theBoundingBox.IsWhole()) + return TopoDS_Shape(); + + Standard_Real aXmin, anYmin, aZmin, aXmax, anYmax, aZmax; + theBoundingBox.Get (aXmin, anYmin, aZmin, aXmax, anYmax, aZmax); + + gp_Pnt aPntMin = gp_Pnt (aXmin, anYmin, aZmin); + gp_Pnt aPntMax = gp_Pnt (aXmax, anYmax, aZmax); + + return CreateBoxShape (aPntMin, aPntMax); +} + +//======================================================================= +//function : CreateShape +//purpose : +//======================================================================= +TopoDS_Shape VInspector_Tools::CreateShape (const Bnd_OBB& theBoundingBox) +{ + if (theBoundingBox.IsVoid()) + return TopoDS_Shape(); + + TColgp_Array1OfPnt anArrPnts(0, 8); + theBoundingBox.GetVertex(&anArrPnts(0)); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt (anArrPnts.Value(0)), gp_Pnt (anArrPnts.Value(1)))); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt (anArrPnts.Value(0)), gp_Pnt (anArrPnts.Value(2)))); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt (anArrPnts.Value(1)), gp_Pnt (anArrPnts.Value(3)))); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt (anArrPnts.Value(2)), gp_Pnt (anArrPnts.Value(3)))); + + return aCompound; +} + +//======================================================================= +//function : CreateShape +//purpose : +//======================================================================= +TopoDS_Shape VInspector_Tools::CreateShape (const Select3D_BndBox3d& theBoundingBox) +{ + if (!theBoundingBox.IsValid()) + return TopoDS_Shape(); + + gp_Pnt aPntMin = gp_Pnt (theBoundingBox.CornerMin().x(), theBoundingBox.CornerMin().y(), theBoundingBox.CornerMin().z()); + gp_Pnt aPntMax = gp_Pnt (theBoundingBox.CornerMax().x(), theBoundingBox.CornerMax().y(), theBoundingBox.CornerMax().z()); + + return CreateBoxShape (aPntMin, aPntMax); +} + +//======================================================================= +//function : CreateBoxShape +//purpose : +//======================================================================= +TopoDS_Shape VInspector_Tools::CreateBoxShape (const gp_Pnt& thePntMin, const gp_Pnt& thePntMax) +{ + Standard_Boolean aThinOnX = fabs (thePntMin.X() - thePntMax.X()) < Precision::Confusion(); + Standard_Boolean aThinOnY = fabs (thePntMin.Y() - thePntMax.Y()) < Precision::Confusion(); + Standard_Boolean aThinOnZ = fabs (thePntMin.Z() - thePntMax.Z()) < Precision::Confusion(); + + if (((int)aThinOnX + (int)aThinOnY + (int)aThinOnZ) > 1) // thin box in several directions is a point + { + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (thePntMin)); + return aCompound; + } + + if (aThinOnX || aThinOnY || aThinOnZ) + { + gp_Pnt aPnt1, aPnt2, aPnt3, aPnt4 ; + if (aThinOnX) + { + aPnt1 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMin.Z()); + aPnt2 = gp_Pnt(thePntMin.X(), thePntMax.Y(), thePntMin.Z()); + aPnt3 = gp_Pnt(thePntMin.X(), thePntMax.Y(), thePntMax.Z()); + aPnt4 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMax.Z()); + } + else if (aThinOnY) + { + aPnt1 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMin.Z()); + aPnt2 = gp_Pnt(thePntMax.X(), thePntMin.Y(), thePntMin.Z()); + aPnt3 = gp_Pnt(thePntMax.X(), thePntMin.Y(), thePntMax.Z()); + aPnt4 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMax.Z()); + } + else if (aThinOnZ) + { + aPnt1 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMin.Z()); + aPnt2 = gp_Pnt(thePntMax.X(), thePntMin.Y(), thePntMin.Z()); + aPnt3 = gp_Pnt(thePntMax.X(), thePntMax.Y(), thePntMin.Z()); + aPnt4 = gp_Pnt(thePntMin.X(), thePntMax.Y(), thePntMin.Z()); + } + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (aPnt1, aPnt2)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (aPnt2, aPnt3)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (aPnt3, aPnt4)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (aPnt4, aPnt1)); + + return aCompound; + } + else + { + BRepPrimAPI_MakeBox aBoxBuilder (thePntMin, thePntMax); + return aBoxBuilder.Shape(); + } +} + + +//======================================================================= +//function : ToVariant +//purpose : +//======================================================================= +QVariant VInspector_Tools::ToVariant (const Handle(Graphic3d_IndexBuffer)& theIndexBuffer) +{ + const Handle(Graphic3d_Buffer)& aBuffer = theIndexBuffer; + return VInspector_Tools::ToVariant (aBuffer); +} + +//======================================================================= +//function : ToVariant +//purpose : +//======================================================================= +QVariant VInspector_Tools::ToVariant (const Handle(Graphic3d_Buffer)& theBuffer) { - gp_Trsf aTrsf = theLocation.Transformation(); + if (theBuffer.IsNull()) + return QVariant(); + + QString anInfo; + anInfo = "NbElements = " + QString::number (theBuffer->NbElements) + ","; + anInfo = "NbAttributes = " + QString::number (theBuffer->NbAttributes) + ","; + anInfo = "Stride = " + QString::number (theBuffer->Stride) + ","; + QStringList anAttributes; + for (Standard_Integer anAttribIter = 0; anAttribIter < theBuffer->NbAttributes; ++anAttribIter) + { + const Graphic3d_Attribute& anAttrib = theBuffer->Attribute (anAttribIter); + anAttributes.append(VInspector_Tools::ToString (anAttrib)); + } + return anInfo + " (" + anAttributes.join(", ") + ")"; +} + +//======================================================================= +//function : ToVariant +//purpose : +//======================================================================= +QVariant VInspector_Tools::ToVariant (const Handle(Graphic3d_BoundBuffer)& theBoundBuffer) +{ + //const Handle(Graphic3d_Buffer)& aBuffer = theBoundBuffer; + //Handle(Graphic3d_Buffer) aBuffer = Handle(Graphic3d_Buffer)::DownCast (theBoundBuffer); + //return VInspector_Tools::ToVariant (aBuffer); + return QVariant(); +} +//======================================================================= +//function : ToVariant +//purpose : +//======================================================================= +QVariant VInspector_Tools::ToVariant (const Graphic3d_Mat4d& theMatrix) +{ TCollection_AsciiString aValues; - for (int aRowId = 1; aRowId <= 3; aRowId++) + for (int aRowId = 1; aRowId <= theMatrix.Rows(); aRowId++) { - for (int aColId = 1; aColId <= 4; aColId++) { - aValues += TCollection_AsciiString (aTrsf.Value(aRowId, aColId)); - if (aColId != 4) + for (int aColId = 1; aColId <= theMatrix.Cols(); aColId++) + { + aValues += TCollection_AsciiString (theMatrix.GetValue (aRowId, aColId)); + if (aColId != theMatrix.Rows()) aValues += ","; } - if (aRowId != 3) + if (aRowId != theMatrix.Rows()) aValues += " "; } - return aValues; + + return aValues.ToCString(); } -// ======================================================================= -// function : ReadShape -// purpose : -// ======================================================================= -TopoDS_Shape VInspector_Tools::ReadShape (const TCollection_AsciiString& theFileName) +//======================================================================= +//function : ToVariant +//purpose : +//======================================================================= +QVariant VInspector_Tools::ToVariant (const Graphic3d_Mat4& theMatrix) { - TopoDS_Shape aShape; + TCollection_AsciiString aValues; + for (int aRowId = 1; aRowId <= theMatrix.Rows(); aRowId++) + { + for (int aColId = 1; aColId <= theMatrix.Cols(); aColId++) + { + aValues += TCollection_AsciiString (theMatrix.GetValue (aRowId, aColId)); + if (aColId != theMatrix.Rows()) + aValues += ","; + } + if (aRowId != theMatrix.Rows()) + aValues += " "; + } - BRep_Builder aBuilder; - BRepTools::Read (aShape, theFileName.ToCString(), aBuilder); + return aValues.ToCString(); +} - return aShape; +//======================================================================= +//function : ToString +//purpose : +//======================================================================= +QString VInspector_Tools::ToString (const Graphic3d_Attribute& theAttribute) +{ + Graphic3d_TypeOfAttribute anId = theAttribute.Id; + Graphic3d_TypeOfData aDataType = theAttribute.DataType; + + QString anInfo = Graphic3d::TypeOfAttributeToString (anId); + anInfo += ": "; + anInfo += Graphic3d::TypeOfDataToString (aDataType); + + return anInfo; } diff --git a/tools/VInspector/VInspector_Tools.hxx b/tools/VInspector/VInspector_Tools.hxx index 5b116b446f..4ca765d517 100644 --- a/tools/VInspector/VInspector_Tools.hxx +++ b/tools/VInspector/VInspector_Tools.hxx @@ -17,6 +17,12 @@ #define VInspector_Tools_H #include +#include +#include +#include +#include +#include +#include #include #include #include @@ -26,13 +32,24 @@ #include #include +#include #include +#include + +#include + #include #include #include #include +class ViewControl_TableModelValues; + +class Graphic3d_IndexBuffer; +class Graphic3d_Buffer; +class Graphic3d_BoundBuffer; + //! \class VInspector_Tools //! The class that gives auxiliary methods for Visualization elements manipulation class VInspector_Tools @@ -50,7 +67,7 @@ public: //! \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); + const bool isShortInfo = true); //! Returns number of selected owners for presentation //! \param theContext an interactive context @@ -65,27 +82,27 @@ public: //! \param theOwner a selectable owner //! \return boolean value Standard_EXPORT static bool IsOwnerSelected (const Handle(AIS_InteractiveContext)& theContext, - const Handle(SelectMgr_EntityOwner)& theOwner); + const Handle(SelectBasics_EntityOwner)& theOwner); //! Returns all owners present in the context //! \param theContext an interactive context //! \return container of owners - Standard_EXPORT static NCollection_List ContextOwners ( + Standard_EXPORT static NCollection_List ContextOwners ( const Handle(AIS_InteractiveContext)& theContext); //! Returns active owners in main selector of context //! \param theContext an interactive context //! \param theEmptySelectableOwners container of owners with NULL presentation or not displayed presentation //! \return container of owners - Standard_EXPORT static NCollection_List ActiveOwners ( + Standard_EXPORT static NCollection_List ActiveOwners ( const Handle(AIS_InteractiveContext)& theContext, - NCollection_List& theEmptySelectableOwners); + NCollection_List& theEmptySelectableOwners); //! Unhighlight selected, set selected the owners //! \param theContext an interactive context //! \param theOwners a container of owners Standard_EXPORT static void AddOrRemoveSelectedShapes (const Handle(AIS_InteractiveContext)& theContext, - const NCollection_List& theOwners); + const NCollection_List& theOwners); //! Unhighlight selected, set selected presentations //! \param theContext an interactive context @@ -128,15 +145,93 @@ public: //! \return text value Standard_EXPORT static TCollection_AsciiString OrientationToName (const TopAbs_Orientation& theOrientation); - //! Returns text of orientation - //! \param theLocation a location value - //! \return text value - Standard_EXPORT static TCollection_AsciiString LocationToName (const TopLoc_Location& theLocation); - //! Read Shape using BREP reader //! \param theFileName a file name //! \return shape or NULL Standard_EXPORT static TopoDS_Shape ReadShape (const TCollection_AsciiString& theFileName); + + //! Fills container of table values + //! \param theAlert a message alert + //! \param theTableValue container of values + Standard_EXPORT static void GetPropertyTableValues (const TreeModel_ItemBasePtr& theItem, + const NCollection_List& theCreators, + QList& theTableValues); + + //! Returns the string name for a given type. + //! @param theType action type + //! @return string identifier from the display action type + Standard_EXPORT static Standard_CString DisplayActionTypeToString (VInspector_DisplayActionType theType); + + //! Returns the enumeration type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @return string identifier from the display action type + static VInspector_DisplayActionType DisplayActionTypeFromString (Standard_CString theTypeString) + { + VInspector_DisplayActionType aType = VInspector_DisplayActionType_NoneId; + DisplayActionTypeFromString (theTypeString, aType); + return aType; + } + + //! Determines the enumeration type from the given string identifier (using case-insensitive comparison). + //! @param theTypeString string identifier + //! @param theType detected action type + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean DisplayActionTypeFromString (const Standard_CString theTypeString, + VInspector_DisplayActionType& theType); + + //! Build string presentation of bounding box information in form: (xmin, ymin, zmin), (xmax, ymax, zmax) + //! \param theBoundingBox bounding box + //! \return string presentation + Standard_EXPORT static QVariant ToVariant (const Select3D_BndBox3d& theBoundingBox); + + //! Creates box shape + //! \param theBoundingBox box shape parameters + //! \return created shape + Standard_EXPORT static TopoDS_Shape CreateShape (const Bnd_Box& theBoundingBox); + + //! Creates box shape + //! \param theBoundingBox box shape parameters + //! \return created shape + Standard_EXPORT static TopoDS_Shape CreateShape (const Bnd_OBB& theBoundingBox); + + //! Creates box shape + //! \param thePntMin minimum point on the bounding box + //! \param thePntMax maximum point on the bounding box + //! \return created shape + Standard_EXPORT static TopoDS_Shape CreateBoxShape (const gp_Pnt& thePntMin, const gp_Pnt& thePntMax); + + //! Creates box shape + //! \param theBoundingBox box shape parameters + //! \return created shape + Standard_EXPORT static TopoDS_Shape CreateShape (const Select3D_BndBox3d& theBoundingBox); + + //! Build string presentation of Graphic3D index buffer + //! \param theIndexBuffer index buffer + //! \return string presentation + Standard_EXPORT static QVariant ToVariant (const Handle(Graphic3d_IndexBuffer)& theIndexBuffer); + + //! Build string presentation of Graphic3D buffer + //! \param theBuffer index buffer + //! \return string presentation + Standard_EXPORT static QVariant ToVariant (const Handle(Graphic3d_Buffer)& theBuffer); + + //! Build string presentation of Graphic3D bound buffer + //! \param theBoundBuffer index buffer + //! \return string presentation + Standard_EXPORT static QVariant ToVariant (const Handle(Graphic3d_BoundBuffer)& theBoundBuffer); + + //! Convert matrix values into a text presentation + //! \param theMatrix a matrix of elements + //! \return string presentation + Standard_EXPORT static QVariant ToVariant (const Graphic3d_Mat4d& theMatrix); + + //! Convert matrix values into a text presentation + //! \param theMatrix a matrix of elements + //! \return string presentation + Standard_EXPORT static QVariant ToVariant (const Graphic3d_Mat4& theMatrix); + + Standard_EXPORT static QString ToString (const Graphic3d_Attribute& theAttribute); + }; #endif diff --git a/tools/VInspector/VInspector_ViewModel.cxx b/tools/VInspector/VInspector_ViewModel.cxx index 207ad48541..ea7fac8a5f 100644 --- a/tools/VInspector/VInspector_ViewModel.cxx +++ b/tools/VInspector/VInspector_ViewModel.cxx @@ -17,10 +17,13 @@ #include #include -#include +#include #include -#include -#include +#include + +#include + +#include #include #include @@ -42,28 +45,30 @@ VInspector_ViewModel::VInspector_ViewModel (QObject* theParent) SetHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH)); SetHeaderItem (1, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH)); SetHeaderItem (2, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH)); - SetHeaderItem (3, TreeModel_HeaderSection ("ShapeType", COLUMN_SHAPE_TYPE_WIDTH)); // ItemPresentableObject, ItemSelection + SetHeaderItem (3, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH)); SetHeaderItem (4, TreeModel_HeaderSection ("SelectedOwners", -1)); // ItemContext, ItemPresentableObject, ItemSelection - SetHeaderItem (5, TreeModel_HeaderSection ("ActivatedModes", -1)); // ItemPresentableObject - SetHeaderItem (6, TreeModel_HeaderSection ("DeviationCoefficient", -1, true)); // ItemContext, ItemPresentableObject - SetHeaderItem (7, TreeModel_HeaderSection ("Deflection", -1, true)); // ItemPresentableObject - SetHeaderItem (8, TreeModel_HeaderSection ("IsAutoTriangulation", -1, true)); // ItemPresentableObject - - SetHeaderItem (9, TreeModel_HeaderSection ("SelectionState", -1)); // ItemSelection - SetHeaderItem (10, TreeModel_HeaderSection ("Sensitivity", -1, true)); // ItemSelection - SetHeaderItem (11, TreeModel_HeaderSection ("UpdateStatus", -1, true)); // ItemSelection - SetHeaderItem (12, TreeModel_HeaderSection ("BVHUpdateStatus", -1, true)); // ItemSelection - - SetHeaderItem (13, TreeModel_HeaderSection ("IsActiveForSelection", -1, true)); // ItemSensitiveEntity - SetHeaderItem (14, TreeModel_HeaderSection ("SensitivityFactor", -1, true)); // ItemSensitiveEntity - SetHeaderItem (15, TreeModel_HeaderSection ("NbSubElements", -1, true)); // ItemSensitiveEntity - SetHeaderItem (16, TreeModel_HeaderSection ("Priority", -1, true)); // ItemSensitiveEntity - - SetHeaderItem (17, TreeModel_HeaderSection ("TShape", COLUMN_POINTER_WIDTH, true)); // ItemEntityOwner - SetHeaderItem (18, TreeModel_HeaderSection ("Orientation", -1, true)); // ItemEntityOwner - SetHeaderItem (19, TreeModel_HeaderSection ("Location", -1, true)); // ItemEntityOwner - - SetHeaderItem (20, TreeModel_HeaderSection ("Color", -1)); // ItemPresentableObject + //SetHeaderItem (5, TreeModel_HeaderSection ("ActivatedModes", -1)); // ItemPresentableObject + //SetHeaderItem (6, TreeModel_HeaderSection ("DeviationCoefficient", -1, true)); // ItemContext, ItemPresentableObject + //SetHeaderItem (7, TreeModel_HeaderSection ("Deflection", -1, true)); // ItemPresentableObject + //SetHeaderItem (8, TreeModel_HeaderSection ("IsAutoTriangulation", -1, true)); // ItemPresentableObject + + //SetHeaderItem (9, TreeModel_HeaderSection ("SelectionState", -1)); // ItemSelection + //SetHeaderItem (10, TreeModel_HeaderSection ("Sensitivity", -1, true)); // ItemSelection + //SetHeaderItem (11, TreeModel_HeaderSection ("UpdateStatus", -1, true)); // ItemSelection + //SetHeaderItem (12, TreeModel_HeaderSection ("BVHUpdateStatus", -1, true)); // ItemSelection + + //SetHeaderItem (13, TreeModel_HeaderSection ("IsActiveForSelection", -1, true)); // ItemSensitiveEntity + //SetHeaderItem (14, TreeModel_HeaderSection ("SensitivityFactor", -1, true)); // ItemSensitiveEntity + //SetHeaderItem (15, TreeModel_HeaderSection ("NbSubElements", -1, true)); // ItemSensitiveEntity + //SetHeaderItem (16, TreeModel_HeaderSection ("Priority", -1, true)); // ItemSensitiveEntity + + //SetHeaderItem (17, TreeModel_HeaderSection ("TShape", COLUMN_POINTER_WIDTH, true)); // ItemEntityOwner + //SetHeaderItem (18, TreeModel_HeaderSection ("Orientation", -1, true)); // ItemEntityOwner + //SetHeaderItem (19, TreeModel_HeaderSection ("Location", -1, true)); // ItemEntityOwner + + //SetHeaderItem (20, TreeModel_HeaderSection ("Color", -1)); // ItemPresentableObject + + //SetHeaderItem (21, TreeModel_HeaderSection ("Owner Location", -1, true)); // ItemEntityOwner } // ======================================================================= @@ -95,29 +100,37 @@ void VInspector_ViewModel::SetContext (const Handle(AIS_InteractiveContext)& the // fill root item by the application for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++) itemDynamicCast(myRootItems[aColId])->SetContext (theContext); - EmitLayoutChanged(); + + UpdateTreeModel(); } // ======================================================================= // function : FindPointers // purpose : // ======================================================================= -QModelIndexList VInspector_ViewModel::FindPointers (const QStringList& thePointers) +void VInspector_ViewModel::FindPointers (const QStringList& thePointers, + const QModelIndex& theParent, + QModelIndexList& theFoundIndices) { - QModelIndexList anIndices; - QModelIndex aParentIndex = index (0, 0); + if (thePointers.isEmpty()) + return; + + QModelIndex aParentIndex = theParent.isValid() ? theParent : index (0, 0); TreeModel_ItemBasePtr aParentItem = TreeModel_ModelBase::GetItemByIndex (aParentIndex); // context item for (int aRowId = 0, aCount = aParentItem->rowCount(); aRowId < aCount; aRowId++) { QModelIndex anIndex = index (aRowId, 0, aParentIndex); TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex); - VInspector_ItemPresentableObjectPtr anItemPrs = itemDynamicCast(anItemBase); - if (!anItemPrs) + VInspector_ItemBasePtr aVItem = itemDynamicCast(anItemBase); + if (!aVItem) continue; - if (thePointers.contains (anItemPrs->PointerInfo())) - anIndices.append (anIndex); + Handle(Standard_Transient) anObject = aVItem->GetObject(); + TCollection_AsciiString aPointerInfo = ViewControl_Tools::GetPointerInfo (anObject); + if (thePointers.contains (aPointerInfo.ToCString())) + theFoundIndices.append (anIndex); + + FindPointers (thePointers, anIndex, theFoundIndices); } - return anIndices; } // ======================================================================= @@ -146,7 +159,7 @@ QModelIndex VInspector_ViewModel::FindIndex (const Handle(AIS_InteractiveObject) // purpose : // ======================================================================= void VInspector_ViewModel::GetSelectedOwners (QItemSelectionModel* theSelectionModel, - NCollection_List& theOwners) + NCollection_List& theOwners) { if (!theSelectionModel) return; @@ -165,12 +178,12 @@ void VInspector_ViewModel::GetSelectedOwners (QItemSelectionModel* theSelectionM for (QList::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++) { TreeModel_ItemBasePtr anItem = *anItemIt; - Handle(SelectMgr_EntityOwner) anEntityOwner; - if (VInspector_ItemEntityOwnerPtr anOwnerItem = itemDynamicCast(anItem)) + Handle(SelectBasics_EntityOwner) anEntityOwner; + if (VInspector_ItemSelectBasicsEntityOwnerPtr anOwnerItem = itemDynamicCast(anItem)) { anEntityOwner = anOwnerItem->EntityOwner(); } - else if (VInspector_ItemSensitiveEntityPtr aSensItem = itemDynamicCast(anItem)) + else if (VInspector_ItemSelectMgrSensitiveEntityPtr aSensItem = itemDynamicCast(anItem)) { anEntityOwner = aSensItem->GetSensitiveEntity()->BaseSensitive()->OwnerId(); } diff --git a/tools/VInspector/VInspector_ViewModel.hxx b/tools/VInspector/VInspector_ViewModel.hxx index 839e550057..55bbecf996 100644 --- a/tools/VInspector/VInspector_ViewModel.hxx +++ b/tools/VInspector/VInspector_ViewModel.hxx @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include @@ -59,8 +59,11 @@ public: //! Returns tree view indices for the given pointers of presentable object //! \param thePointers a list of presentation pointers - //! \return container of indices - Standard_EXPORT QModelIndexList FindPointers (const QStringList& thePointers); + //! \param theParent an index of the parent item + //! \param [out] container of indices + Standard_EXPORT void FindPointers (const QStringList& thePointers, + const QModelIndex& theParent, + QModelIndexList& theFoundIndices); //! Returns tree model index of the presentation item in the tree view. //! \param thePresentation a presentation @@ -77,7 +80,7 @@ public: //! \param theSelectionModel a selection model //! \param theOwners an output list of owners Standard_EXPORT static void GetSelectedOwners (QItemSelectionModel* theSelectionModel, - NCollection_List& theOwners); + NCollection_List& theOwners); //! Updates tree model Standard_EXPORT void UpdateTreeModel(); diff --git a/tools/VInspector/VInspector_ViewModelHistory.cxx b/tools/VInspector/VInspector_ViewModelHistory.cxx index de42b99fd7..a8f584ef15 100644 --- a/tools/VInspector/VInspector_ViewModelHistory.cxx +++ b/tools/VInspector/VInspector_ViewModelHistory.cxx @@ -45,11 +45,12 @@ VInspector_ViewModelHistory::VInspector_ViewModelHistory (QObject* theParent, co : TreeModel_ModelBase (theParent) { SetHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH)); - SetHeaderItem (1, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH)); - SetHeaderItem (2, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH)); - SetHeaderItem (3, TreeModel_HeaderSection ("Shape type", COLUMN_SHAPE_TYPE_WIDTH)); - SetHeaderItem (4, TreeModel_HeaderSection ("AIS Name", COLUMN_AIS_NAME_WIDTH)); - SetHeaderItem (5, TreeModel_HeaderSection ("Selected/Highlighted", -1)); + SetHeaderItem (1, TreeModel_HeaderSection ("Visibility", COLUMN_SIZE_WIDTH)); // visualization item + SetHeaderItem (2, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH)); + SetHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH)); + SetHeaderItem (4, TreeModel_HeaderSection ("Shape type", COLUMN_SHAPE_TYPE_WIDTH)); + SetHeaderItem (5, TreeModel_HeaderSection ("AIS Name", COLUMN_AIS_NAME_WIDTH)); + SetHeaderItem (6, TreeModel_HeaderSection ("Selected/Highlighted", -1)); for (int aColumnId = 0, aNbColumns = columnCount(); aColumnId < aNbColumns; aColumnId++) { diff --git a/tools/VInspector/VInspector_Window.cxx b/tools/VInspector/VInspector_Window.cxx index e102fbb709..cb0f36a9ed 100644 --- a/tools/VInspector/VInspector_Window.cxx +++ b/tools/VInspector/VInspector_Window.cxx @@ -15,30 +15,52 @@ #include +#include #include +#include +#include +#include +#include +#include +#include +#include + +#include #include #include +#include #include #include +#include #include +#include -#include #include #include #include #include #include -#include +#include +#include +#include #include +#include +#include +#include #include #include #include #include +#include +#include + +#include #include +#include #include #include @@ -56,6 +78,14 @@ #include #include +//#define DEBUG_TWO_VIEWS +#ifdef DEBUG_TWO_VIEWS +#include +#endif + +const int VINSPECTOR_DEFAULT_PROPERTY_VIEW_WIDTH = 300;//600; +const int VINSPECTOR_DEFAULT_PROPERTY_VIEW_HEIGHT = 1000; + const int VINSPECTOR_DEFAULT_WIDTH = 1250; const int VINSPECTOR_DEFAULT_HEIGHT = 800; @@ -78,6 +108,8 @@ const int VINSPECTOR_DEFAULT_VIEW_POSITION_Y = 60; // TINSPECTOR_DEFAULT_POSITIO VInspector_Window::VInspector_Window() : myParent (0), myExportToShapeViewDialog (0), myViewWindow (0) { + myPreviewParameters = new VInspector_PreviewParameters(); + myMainWindow = new QMainWindow (0); QWidget* aCentralWidget = new QWidget (myMainWindow); @@ -96,7 +128,10 @@ VInspector_Window::VInspector_Window() myTreeView->setSelectionMode (QAbstractItemView::ExtendedSelection); myTreeView->header()->setStretchLastSection (true); myTreeView->setContextMenuPolicy(Qt::CustomContextMenu); + //((ViewControl_TreeView*)myTreeView)->SetPredefinedSize (QSize (VINSPECTOR_DEFAULT_TREE_VIEW_WIDTH, + // VINSPECTOR_DEFAULT_TREE_VIEW_HEIGHT)); VInspector_ViewModel* aTreeModel = new VInspector_ViewModel (myTreeView); + aTreeModel-> AddPropertiesCreator(new VInspector_PropertiesCreator()); myTreeView->setModel (aTreeModel); // hide Visibility column TreeModel_HeaderSection anItem = aTreeModel->GetHeaderItem ((int)TreeModel_ColumnType_Visibility); @@ -110,12 +145,26 @@ VInspector_Window::VInspector_Window() QItemSelectionModel* aSelModel = new QItemSelectionModel (myTreeView->model(), myTreeView); myTreeView->setSelectionModel (aSelModel); connect (aSelModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)), - this, SLOT (onSelectionChanged (const QItemSelection&, const QItemSelection&))); + this, SLOT (onTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&))); aParentLay->addWidget(myTreeView, 1, 0); aParentLay->setRowStretch (1, 1); myMainWindow->setCentralWidget (aCentralWidget); + // property view + myPaneCreators.Append (new VInspectorPaneAIS_PaneCreator()); + aTreeModel->AddPropertiesCreator (new VInspectorPaneAIS_PropertiesCreator()); + + myPropertyView = new ViewControl_PropertyView (myMainWindow, + QSize(VINSPECTOR_DEFAULT_PROPERTY_VIEW_WIDTH, VINSPECTOR_DEFAULT_PROPERTY_VIEW_HEIGHT)); + 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 ())); + myHistoryView = new ViewControl_TreeView (myMainWindow); myHistoryView->setSelectionBehavior (QAbstractItemView::SelectRows); ((ViewControl_TreeView*)myHistoryView)->SetPredefinedSize (QSize (VINSPECTOR_DEFAULT_HISTORY_VIEW_WIDTH, @@ -203,9 +252,16 @@ void VInspector_Window::GetPreferences (TInspectorAPI_PreferencesDataMap& theIte } anItems.clear(); - TreeModel_Tools::SaveState (myHistoryView, anItems, "history_view_"); + VInspector_PreviewParameters::SaveState (myPreviewParameters, anItems, "preview_parameters_"); for (QMap::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++) theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); + + anItems.clear(); + TreeModel_Tools::SaveState (myTreeView, anItems); + for (QMap::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++) + { + theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); + } } // ======================================================================= @@ -230,6 +286,9 @@ void VInspector_Window::SetPreferences (const TInspectorAPI_PreferencesDataMap& else if (TreeModel_Tools::RestoreState (myHistoryView, anItemIt.Key().ToCString(), anItemIt.Value().ToCString(), "history_view_")) continue; + else if (VInspector_PreviewParameters::RestoreState (myPreviewParameters, anItemIt.Key().ToCString(), anItemIt.Value().ToCString(), + "preview_parameters_")) + continue; } } @@ -278,6 +337,172 @@ void VInspector_Window::UpdateContent() myTreeView->scrollTo (aPresentationIndex); } } + + if (!myCallBack.IsNull()) + { + VInspector_ViewModelHistory* aHistoryModel = dynamic_cast + (myHistoryView->model()); + aHistoryModel->Reset(); + aHistoryModel->EmitLayoutChanged(); + } +} + +// ======================================================================= +// function : GetSelectedPresentations +// purpose : +// ======================================================================= +NCollection_List VInspector_Window::GetSelectedPresentations (QItemSelectionModel* theModel) +{ + NCollection_List aSelectedPresentations; + + QList anItems = TreeModel_ModelBase::GetSelectedItems (theModel->selectedIndexes()); + + QList aSelectedIds; // Remember of selected address in order to avoid duplicates + NCollection_List anItemPresentations; + for (QList::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++) + { + TreeModel_ItemBasePtr anItem = *anItemIt; + VInspector_ItemBasePtr aVItem = itemDynamicCast(anItem); + if (!aVItem) + continue; + + anItemPresentations.Clear(); + aVItem->GetPresentations (anItemPresentations); + + for (NCollection_List::Iterator anIt (anItemPresentations); anIt.More(); anIt.Next()) + { + Handle(AIS_InteractiveObject) aPresentation = Handle(AIS_InteractiveObject)::DownCast (anIt.Value()); + if (aSelectedIds.contains ((size_t)aPresentation.operator->())) + continue; + aSelectedIds.append ((size_t)aPresentation.operator->()); + if (!aPresentation.IsNull()) + aSelectedPresentations.Append (aPresentation); + } + } + return aSelectedPresentations; +} + +// ======================================================================= +// function : GetSelectedShapes +// purpose : +// ======================================================================= +NCollection_List VInspector_Window::GetSelectedShapes (const QModelIndexList& theIndices) +{ + NCollection_List aSelectedShapes; + + QList anItems = TreeModel_ModelBase::GetSelectedItems (theIndices); + for (QList::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++) + { + TreeModel_ItemBasePtr anItem = *anItemIt; + VInspector_ItemBasePtr aVItem = itemDynamicCast(anItem); + if (!aVItem /*|| aVItem->Row() == 0*/) + continue; + + TopoDS_Shape aShape = aVItem->GetPresentationShape(); + if (aShape.IsNull()) + continue; + + aSelectedShapes.Append (aShape); + } + + // obtain selection from the property panel + { + QList aPropertyTables; + myPropertyView->GetActiveTables (aPropertyTables); + if (!aPropertyTables.isEmpty()) + { + ViewControl_Table* aFirstTable = aPropertyTables[0]; // TODO: implement for several tables + + Handle(Graphic3d_TransformPers) aSelectedPersistent = GetSelectedTransformPers(); + QModelIndexList aTreeViewSelected = myTreeView->selectionModel()->selectedIndexes(); + GetSelectedPropertyPanelShapes(aTreeViewSelected, + aFirstTable->GetTableView()->selectionModel()->selectedIndexes(), + aSelectedShapes); + } + } + + return aSelectedShapes; +} + +// ======================================================================= +// function : GetSelectedPropertyPanelShapes +// purpose : +// ======================================================================= +void VInspector_Window::GetSelectedPropertyPanelShapes (const QModelIndexList& theTreeViewIndices, + const QModelIndexList& thePropertyPanelIndices, + NCollection_List& theShapes) +{ + QList anItems = TreeModel_ModelBase::GetSelectedItems (theTreeViewIndices); + NCollection_List aPropertyPresentations; + for (QList::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++) + { + TreeModel_ItemBasePtr anItem = *anItemIt; + if (!anItem || anItem->Column() != 0) + continue; + + QList aTableValues; + VInspector_Tools::GetPropertyTableValues (anItem, myPaneCreators, aTableValues); + if (aTableValues.isEmpty()) + continue; + + Handle(TreeModel_ItemProperties) anItemProperties = anItem->GetProperties(); + for (int aTableIt = 0; aTableIt < aTableValues.size(); aTableIt++) + { + VInspector_TableModelValues* aTableVals = dynamic_cast(aTableValues[aTableIt]); + if (!aTableVals) + continue; + + // default shape by NULL selection + aTableVals->GetPaneShapes (-1, -1, theShapes); + + for (QModelIndexList::const_iterator anIndicesIt = thePropertyPanelIndices.begin(); anIndicesIt != thePropertyPanelIndices.end(); anIndicesIt++) + { + QModelIndex anIndex = *anIndicesIt; + aTableVals->GetPaneShapes (anIndex.row(), anIndex.column(), theShapes); + + if (!anItemProperties.IsNull()) + { + anItemProperties->GetPresentations (anIndex.row(), anIndex.column(), aPropertyPresentations); + } + } + } + } + + if (!aPropertyPresentations.IsEmpty()) + { + for (NCollection_List::Iterator aPrsIterator (aPropertyPresentations); aPrsIterator.More(); aPrsIterator.Next()) + { + Handle(ViewControl_TransientShape) aShapePrs = Handle(ViewControl_TransientShape)::DownCast (aPrsIterator.Value()); + if (!aShapePrs.IsNull()) + theShapes.Append (aShapePrs->GetShape()); + } + } +} + +// ======================================================================= +// function : GetSelectedTransformPers +// purpose : +// ======================================================================= +Handle(Graphic3d_TransformPers) VInspector_Window::GetSelectedTransformPers() +{ + QList anItems = TreeModel_ModelBase::GetSelectedItems (myTreeView->selectionModel()->selectedIndexes()); + for (QList::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++) + { + TreeModel_ItemBasePtr anItem = *anItemIt; + VInspector_ItemBasePtr aVItem = itemDynamicCast(anItem); + if (!aVItem) + continue; + + while (aVItem) + { + Handle(Graphic3d_TransformPers) aPers = aVItem->TransformPersistence(); + if (!aPers.IsNull()) + return aPers; + + aVItem = itemDynamicCast(aVItem->Parent()); + } + } + return Handle(Graphic3d_TransformPers)(); } // ======================================================================= @@ -286,8 +511,13 @@ void VInspector_Window::UpdateContent() // ======================================================================= bool VInspector_Window::Init (const NCollection_List& theParameters) { + VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); + if (!aViewModel) + return Standard_False; + Handle(AIS_InteractiveContext) aContext; Handle(VInspector_CallBack) aCallBack; + Standard_Boolean isModelUpdated = Standard_False; for (NCollection_List::Iterator aParamsIt (theParameters); aParamsIt.More(); aParamsIt.Next()) { @@ -297,14 +527,26 @@ bool VInspector_Window::Init (const NCollection_List if (aCallBack.IsNull()) aCallBack = Handle(VInspector_CallBack)::DownCast (anObject); + + if (!Handle(ViewControl_PaneCreator)::DownCast (anObject).IsNull()) + { + Handle(ViewControl_PaneCreator) aPaneCreator = Handle(ViewControl_PaneCreator)::DownCast (anObject); + if (!myPaneCreators.Contains (aPaneCreator)) + myPaneCreators.Append (aPaneCreator); + isModelUpdated = Standard_True; + } + if (!Handle(TreeModel_ItemPropertiesCreator)::DownCast (anObject).IsNull()) + { + Handle(TreeModel_ItemPropertiesCreator) aPropCreator = Handle(TreeModel_ItemPropertiesCreator)::DownCast (anObject); + VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); + aViewModel->AddPropertiesCreator (aPropCreator); + isModelUpdated = Standard_True; + } } - if (aContext.IsNull()) - return false; - VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); - if (aViewModel && aViewModel->GetContext() == aContext) - UpdateTreeModel(); + if (aViewModel->GetContext() != aContext) + SetContext(aContext); else - SetContext (aContext); + isModelUpdated = Standard_True; if (!aCallBack.IsNull() && aCallBack != myCallBack) { @@ -314,6 +556,10 @@ bool VInspector_Window::Init (const NCollection_List myCallBack->SetContext(aContext); myCallBack->SetHistoryModel(aHistoryModel); } + + if (isModelUpdated) + UpdateTreeModel(); + return true; } @@ -323,12 +569,22 @@ bool VInspector_Window::Init (const NCollection_List // ======================================================================= void VInspector_Window::SetContext (const Handle(AIS_InteractiveContext)& theContext) { + if (theContext.IsNull()) + return; + VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); + bool isFirst = aViewModel->GetContext().IsNull(); + aViewModel->SetContext (theContext); myTreeView->setExpanded (aViewModel->index (0, 0), true); if (!myCallBack.IsNull()) myCallBack->SetContext (theContext); + + myPreviewParameters->GetDrawer()->Link (theContext->DefaultDrawer()); + + if (isFirst) + onExportToMessageView(); } // ======================================================================= @@ -354,9 +610,22 @@ bool VInspector_Window::OpenFile(const TCollection_AsciiString& theFileName) if (aShape.IsNull()) return isModelUpdated; +#ifndef DEBUG_COLORED_SHAPE Handle(AIS_Shape) aPresentation = new AIS_Shape (aShape); - aContext->Display (aPresentation, false); - aContext->Load (aPresentation, -1/*selection mode*/); +#else + Handle(AIS_ColoredShape) aPresentation = new AIS_ColoredShape (aShape); + + TopExp_Explorer expS(aShape, TopAbs_EDGE); + for (; expS.More(); expS.Next()) + { + aPresentation->SetCustomColor (expS.Current(), Quantity_Color (Quantity_NOC_GREEN)); + } +#endif + View_Displayer* aDisplayer = myViewWindow->GetDisplayer(); + aDisplayer->DisplayPresentation (aPresentation); + + //aContext->Display (aPresentation, false); + //aContext->Load (aPresentation, -1/*selection mode*/); aContext->UpdateCurrentViewer(); UpdateTreeModel(); @@ -372,8 +641,31 @@ void VInspector_Window::onTreeViewContextMenuRequested(const QPoint& thePosition { QMenu* aMenu = new QMenu (GetMainWindow()); aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Export to ShapeView"), SLOT (onExportToShapeView()), GetMainWindow(), this)); - aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Show"), SLOT (onShow()), GetMainWindow(), this)); - aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Hide"), SLOT (onHide()), GetMainWindow(), this)); + aMenu->addSeparator(); + + QModelIndex anIndex = TreeModel_ModelBase::SingleSelected (myTreeView->selectionModel()->selectedIndexes(), 0); + TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex); + if (anItemBase) + { + if (itemDynamicCast (anItemBase)) + { + aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Export to MessageView"), SLOT (onExportToMessageView()), GetMainWindow(), this)); + aMenu->addSeparator(); + + aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Default preview"), SLOT (onDefaultPreview()), GetMainWindow(), this)); + } + } + + aMenu->addSeparator(); + for (int aTypeId = (int)VInspector_DisplayActionType_DisplayId; aTypeId <= (int)VInspector_DisplayActionType_RemoveId; aTypeId++) + aMenu->addAction (ViewControl_Tools::CreateAction (VInspector_Tools::DisplayActionTypeToString ((VInspector_DisplayActionType) aTypeId), + SLOT (onDisplayActionTypeClicked()), GetMainWindow(), this)); + aMenu->addSeparator(); + + aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Expand"), SLOT (onExpand()), GetMainWindow(), this)); + aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Expand All"), SLOT (onExpandAll()), GetMainWindow(), this)); + aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Collapse All"), SLOT (onCollapseAll()), GetMainWindow(), this)); + QPoint aPoint = myTreeView->mapToGlobal (thePosition); aMenu->exec(aPoint); } @@ -397,18 +689,18 @@ void VInspector_Window::onToolBarActionClicked (const int theActionId) } case VInspector_ToolActionType_SelectPresentationsId: { - bool isChecked = myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked(); + bool isChecked = myToolBar->GetToolButton ((VInspector_ToolActionType)theActionId)->isChecked(); NCollection_List aPresentationsForViewer; if (isChecked) - aPresentationsForViewer = VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel()); + aPresentationsForViewer = GetSelectedPresentations (myTreeView->selectionModel()); Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext(); - VInspector_Tools::AddOrRemovePresentations(aContext, aPresentationsForViewer); + VInspector_Tools::AddOrRemovePresentations (aContext, aPresentationsForViewer); UpdateTreeModel(); break; } case VInspector_ToolActionType_SelectOwnersId: { - NCollection_List anOwnersForViewer; + NCollection_List anOwnersForViewer; if (myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked()) VInspector_ViewModel::GetSelectedOwners(myTreeView->selectionModel(), anOwnersForViewer); VInspector_Tools::AddOrRemoveSelectedShapes(aViewModel->GetContext(), anOwnersForViewer); @@ -421,11 +713,71 @@ void VInspector_Window::onToolBarActionClicked (const int theActionId) } // ======================================================================= -// function : onSelectionChanged +// function : onPropertyPanelShown +// purpose : +// ======================================================================= +void VInspector_Window::onPropertyPanelShown (bool isToggled) +{ + if (!isToggled) + return; + + updatePropertyPanelBySelection(); +} + +// ======================================================================= +// function : onPropertyViewSelectionChanged // purpose : // ======================================================================= -void VInspector_Window::onSelectionChanged (const QItemSelection&, - const QItemSelection&) +void VInspector_Window::onPropertyViewSelectionChanged() +{ + QList aPropertyTables; + myPropertyView->GetActiveTables (aPropertyTables); + if (aPropertyTables.isEmpty()) + return; + + ViewControl_Table* aFirstTable = aPropertyTables[0]; // TODO: implement for several tables + + QMap> aSelectedIndices; + aFirstTable->GetSelectedIndices (aSelectedIndices); + + ViewControl_TableModel* aTableModel = dynamic_cast(aFirstTable->GetTableView()->model()); + ViewControl_TableModelValues* aTableValues = aTableModel->GetModelValues(); + + QStringList aPointers; + for (QMap>::const_iterator aSelIt = aSelectedIndices.begin(); aSelIt != aSelectedIndices.end(); aSelIt++) + { + int aRowId = aSelIt.key(); + QList aColIds = aSelIt.value(); + for (int aColId = 0; aColId < aColIds.size(); aColId++) + { + int aSelectedColId = aColIds[aColId]; + if (aSelectedColId != 1) + continue; + + QString aData = aTableValues->Data (aRowId, aSelectedColId, Qt::DisplayRole).toString(); + if (aData.contains (ViewControl_Tools::GetPointerPrefix().ToCString())) + aPointers.append (aData); + } + } + highlightTreeViewItems (aPointers); + + Handle(Graphic3d_TransformPers) aSelectedPersistent = GetSelectedTransformPers(); + QModelIndexList aTreeViewSelected = myTreeView->selectionModel()->selectedIndexes(); + NCollection_List aSelectedShapes = GetSelectedShapes (aTreeViewSelected); + + GetSelectedPropertyPanelShapes(aTreeViewSelected, + aFirstTable->GetTableView()->selectionModel()->selectedIndexes(), + aSelectedShapes); + + updatePreviewPresentation(aSelectedShapes, aSelectedPersistent); +} + +// ======================================================================= +// function : onTreeViewSelectionChanged +// purpose : +// ======================================================================= +void VInspector_Window::onTreeViewSelectionChanged (const QItemSelection&, + const QItemSelection&) { QApplication::setOverrideCursor (Qt::WaitCursor); @@ -434,6 +786,14 @@ void VInspector_Window::onSelectionChanged (const QItemSelection&, else if (myToolBar->GetToolButton(VInspector_ToolActionType_SelectOwnersId)->isChecked()) onToolBarActionClicked(VInspector_ToolActionType_SelectOwnersId); + if (myPropertyPanelWidget->toggleViewAction()->isChecked()) + updatePropertyPanelBySelection(); + + Handle(Graphic3d_TransformPers) aSelectedPersistent = GetSelectedTransformPers(); + + NCollection_List aSelectedShapes = GetSelectedShapes (myTreeView->selectionModel()->selectedIndexes()); + updatePreviewPresentation(aSelectedShapes, aSelectedPersistent); + QApplication::restoreOverrideCursor(); } @@ -453,20 +813,30 @@ void VInspector_Window::onHistoryViewSelectionChanged (const QItemSelection& the QModelIndexList aSelectedIndices = theSelected.indexes(); QStringList aPointers = aHistoryModel->GetSelectedPointers(aSelectedIndices.first()); + selectTreeViewItems (aPointers); +} - VInspector_ViewModel* aTreeModel = dynamic_cast (myTreeView->model()); - if (!aTreeModel) +// ======================================================================= +// function : onExportToShapeView +// purpose : +// ======================================================================= +void VInspector_Window::onExportToMessageView() +{ + VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); + if (!aViewModel) return; + Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext(); - QModelIndexList anIndices = aTreeModel->FindPointers (aPointers); - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - aSelectionModel->clear(); - for (int anIndicesId = 0, aSize = anIndices.size(); anIndicesId < aSize; anIndicesId++) - { - QModelIndex anIndex = anIndices[anIndicesId]; - myTreeView->setExpanded (aTreeModel->parent (anIndex), true); - aSelectionModel->select (anIndex, QItemSelectionModel::Select); - } + TCollection_AsciiString aPluginName ("TKMessageView"); + NCollection_List aParameters; + if (myParameters->FindParameters (aPluginName)) + aParameters = myParameters->Parameters (aPluginName); + + QStringList anExportedPointers; + anExportedPointers.append (VInspector_Tools::GetPointerInfo (aContext, true).ToCString()); + aParameters.Append (aContext); + + myParameters->SetParameters (aPluginName, aParameters, false);//myExportToShapeViewDialog->IsAccepted()); } // ======================================================================= @@ -475,10 +845,8 @@ void VInspector_Window::onHistoryViewSelectionChanged (const QItemSelection& the // ======================================================================= void VInspector_Window::onExportToShapeView() { - NCollection_List aSelectedPresentations = - VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel()); - if (aSelectedPresentations.Extent() <= 0) - return; + const QModelIndexList anIndices; + NCollection_List aSelectedShapes = GetSelectedShapes (myTreeView->selectionModel()->selectedIndexes()); TCollection_AsciiString aPluginName ("TKShapeView"); NCollection_List aParameters; @@ -490,24 +858,42 @@ void VInspector_Window::onExportToShapeView() anItemNames = myParameters->GetSelectedNames (aPluginName); QStringList anExportedPointers; - for (NCollection_List::Iterator anIOIt (aSelectedPresentations); anIOIt.More(); anIOIt.Next()) + if (aSelectedShapes.Extent() > 0) { - Handle(AIS_Shape) aShapePresentation = Handle(AIS_Shape)::DownCast (anIOIt.Value()); - if (aShapePresentation.IsNull()) - continue; + for (NCollection_List::Iterator anIOIt (aSelectedShapes); anIOIt.More(); anIOIt.Next()) + { + const TopoDS_Shape& aShape = anIOIt.Value(); + if (aShape.IsNull()) + continue; + aParameters.Append (aShape.TShape()); + anItemNames.Append (TInspectorAPI_PluginParameters::ParametersToString(aShape)); + anExportedPointers.append (VInspector_Tools::GetPointerInfo (aShape.TShape(), true).ToCString()); + } + } - const TopoDS_Shape& aShape = aShapePresentation->Shape(); - if (aShape.IsNull()) + // seach for objects to be exported + QList anItems = TreeModel_ModelBase::GetSelectedItems (myTreeView->selectionModel()->selectedIndexes()); + for (QList::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++) + { + TreeModel_ItemBasePtr anItem = *anItemIt; + VInspector_ItemBasePtr aVItem = itemDynamicCast(anItem); + if (!aVItem) + continue; + + Handle(Standard_Transient) anObject = aVItem->GetObject(); + if (anObject.IsNull()) continue; - aParameters.Append (aShape.TShape()); - anItemNames.Append (TInspectorAPI_PluginParameters::ParametersToString(aShape)); - anExportedPointers.append (VInspector_Tools::GetPointerInfo (aShape.TShape(), true).ToCString()); + + aParameters.Append (anObject); + anItemNames.Append (anObject->DynamicType()->Name()); + anExportedPointers.append (VInspector_Tools::GetPointerInfo (anObject, true).ToCString()); } - if (anExportedPointers.empty()) + + if (anExportedPointers.isEmpty()) return; TCollection_AsciiString aPluginShortName = aPluginName.SubString (3, aPluginName.Length()); - QString aMessage = QString ("TShape %1 is sent to %2.") + QString aMessage = QString ("Objects %1 are sent to %2.") .arg (anExportedPointers.join(", ")) .arg (aPluginShortName.ToCString()); QString aQuestion = QString ("Would you like to activate %1 immediately?\n") @@ -523,22 +909,144 @@ void VInspector_Window::onExportToShapeView() } // ======================================================================= -// function : onShow +// function : onDefaultPreview +// purpose : +// ======================================================================= +void VInspector_Window::onDefaultPreview() +{ + VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); + if (!aViewModel) + return; + + Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext(); + if (aContext.IsNull()) + return; + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (gp_Pnt(25., 10., 0.))); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt(20., 20., 0.), gp_Pnt(30., 20., 10.))); + //aBuilder.Add (aCompound, BRepBuilderAPI_MakeFace (gp_Pln (gp_Pnt (20., 30., 0.), gp_Dir (1., 0., 0.))).Face()); + aBuilder.Add (aCompound, VInspector_Tools::CreateBoxShape (gp_Pnt(20., 40., 0.), gp_Pnt(30., 60., 10.))); + + Handle(AIS_Shape) aDefaultPreview = new AIS_Shape (aCompound); + aDefaultPreview->SetAttributes (myPreviewParameters->GetDrawer()); + if (!aContext.IsNull()) + aContext->Display (aDefaultPreview, AIS_Shaded, -1/*do not participate in selection*/, Standard_True); + + UpdateTreeModel(); +} + +// ======================================================================= +// function : onDisplayActionTypeClicked // purpose : // ======================================================================= -void VInspector_Window::onShow() +void VInspector_Window::onDisplayActionTypeClicked() { - displaySelectedPresentations (true); + QAction* anAction = (QAction*)sender(); + + displaySelectedPresentations (VInspector_Tools::DisplayActionTypeFromString (anAction->text().toStdString().c_str())); } // ======================================================================= -// function : onHide +// function : onExpand // purpose : // ======================================================================= -void VInspector_Window::onHide() +void VInspector_Window::onExpand() { - displaySelectedPresentations (false); + QApplication::setOverrideCursor (Qt::WaitCursor); + + QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); + QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); + for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) + { + int aLevels = 2; + TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels); + } + QApplication::restoreOverrideCursor(); +} + +// ======================================================================= +// function : onExpandAll +// purpose : +// ======================================================================= +void VInspector_Window::onExpandAll() +{ + QApplication::setOverrideCursor (Qt::WaitCursor); + + QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); + QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); + for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) + { + int aLevels = -1; + TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels); + } + QApplication::restoreOverrideCursor(); +} + +// ======================================================================= +// function : onCollapseAll +// purpose : +// ======================================================================= +void VInspector_Window::onCollapseAll() +{ + QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); + QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); + for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) + { + int aLevels = -1; + TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], false, aLevels); + } +} + +#ifdef DEBUG_TWO_VIEWS +// ======================================================================= +// function : onViewLeftButtonDown +// purpose : +// ======================================================================= +void VInspector_Window::onViewLeftButtonDown (const int theX, const int theY) +{ + myCameraPrs->StartTransformation (theX, theY); +} + +// ======================================================================= +// function : onViewLeftButtonUp +// purpose : +// ======================================================================= +void VInspector_Window::onViewLeftButtonUp (const int theX, const int theY) +{ + myCameraPrs->StopTransformation (theX, theY); +} + +// ======================================================================= +// function : onViewMoveTo +// purpose : +// ======================================================================= +void VInspector_Window::onViewMoveTo (const int theX, const int theY) +{ + View_Widget* aViewWidget = (View_Widget*) sender(); + + myCameraPrs->Transform (theX, theY, aViewWidget->GetViewer()->GetView()); + + VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); + if (!aViewModel) + return; + Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext(); + if (aContext.IsNull()) + return; + aContext->Redisplay (myCameraPrs, Standard_True); +} + +// ======================================================================= +// function : onViewLeftButtonUp +// purpose : +// ======================================================================= +void VInspector_Window::onViewLeftButtonUp() +{ + } +#endif // ======================================================================= // function : UpdateTreeModel @@ -551,11 +1059,33 @@ void VInspector_Window::UpdateTreeModel() aViewModel->UpdateTreeModel(); } +// ======================================================================= +// function : updatePropertyPanelBySelection +// purpose : +// ======================================================================= +void VInspector_Window::updatePropertyPanelBySelection() +{ + QItemSelectionModel* aModel = myTreeView->selectionModel(); + if (!aModel) + return; + + QModelIndexList aSelected = TreeModel_ModelBase::GetSelected (aModel->selectedIndexes(), 0); + QList aTableValues; + + if (aSelected.size() == 1) + { + TreeModel_ItemBasePtr aSelectedItem = TreeModel_ModelBase::GetItemByIndex(aSelected.first()); + VInspector_Tools::GetPropertyTableValues (aSelectedItem, myPaneCreators, aTableValues); + } + myPropertyView->Init (aTableValues); +} + // ======================================================================= // function : displaySelectedPresentations // purpose : // ======================================================================= -void VInspector_Window::displaySelectedPresentations(const bool theToDisplay) + +void VInspector_Window::displaySelectedPresentations (const VInspector_DisplayActionType theType) { VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); if (!aViewModel) @@ -565,30 +1095,102 @@ void VInspector_Window::displaySelectedPresentations(const bool theToDisplay) if (aContext.IsNull()) return; - NCollection_List aSelectedPresentations = - VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel()); - if (aSelectedPresentations.Extent() <= 0) + QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); + if (!aSelectionModel) + return; + + NCollection_List aSelectedPresentations = GetSelectedPresentations (aSelectionModel); + const QModelIndexList& aSelectedIndices = aSelectionModel->selectedIndexes(); + + bool aPreviewPresentationShown = !myPreviewPresentation.IsNull(); + // the order of objects returned by AIS_InteractiveContext is changed because the processed object is moved from + // Erased to Displayed container or back + aSelectionModel->clear(); + + // redisplay preview presentation if exists + if (aPreviewPresentationShown && theType == VInspector_DisplayActionType_RedisplayId) + { + QList anItems = TreeModel_ModelBase::GetSelectedItems (aSelectedIndices); + for (QList::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++) + { + TreeModel_ItemBasePtr anItem = *anItemIt; + VInspector_ItemBasePtr aVItem = itemDynamicCast(anItem); + if (aVItem) + aVItem->UpdatePresentationShape(); + } + NCollection_List aSelectedShapes = GetSelectedShapes (aSelectedIndices); + updatePreviewPresentation(aSelectedShapes, GetSelectedTransformPers()); + } + + if (aSelectedPresentations.Extent() == 0) return; for (NCollection_List::Iterator anIOIt(aSelectedPresentations); anIOIt.More(); anIOIt.Next()) { Handle(AIS_InteractiveObject) aPresentation = anIOIt.Value(); - if (theToDisplay) + switch (theType) { - aContext->Display(aPresentation, false); - aContext->Load(aPresentation, -1); + case VInspector_DisplayActionType_DisplayId: + { + aContext->Display(aPresentation, false); + aContext->Load(aPresentation, -1); + } + break; + + case VInspector_DisplayActionType_RedisplayId: aContext->Redisplay (aPresentation, false); break; + case VInspector_DisplayActionType_EraseId: aContext->Erase (aPresentation, false); break; + case VInspector_DisplayActionType_RemoveId: aContext->Remove (aPresentation, false); break; + default: break; } - else - aContext->Erase(aPresentation, false); } aContext->UpdateCurrentViewer(); - // the order of objects returned by AIS_InteractiveContext is changed because the processed object is moved from - // Erased to Displayed container or back + UpdateTreeModel(); +} + +// ======================================================================= +// function : highlightTreeViewItems +// purpose : +// ======================================================================= +void VInspector_Window::highlightTreeViewItems (const QStringList& thePointers) +{ + VInspector_ViewModel* aTreeModel = dynamic_cast (myTreeView->model()); + if (!aTreeModel) + return; + + QModelIndexList anIndices; + aTreeModel->FindPointers (thePointers, QModelIndex(), anIndices); + for (int anIndicesId = 0, aSize = anIndices.size(); anIndicesId < aSize; anIndicesId++) + { + QModelIndex anIndex = anIndices[anIndicesId]; + TreeModel_Tools::SetExpandedTo (myTreeView, anIndex); + } + aTreeModel->SetHighlighted (anIndices); + + if (!anIndices.isEmpty()) + myTreeView->scrollTo (anIndices.last()); +} + +// ======================================================================= +// function : selectTreeViewItems +// purpose : +// ======================================================================= +void VInspector_Window::selectTreeViewItems (const QStringList& thePointers) +{ + VInspector_ViewModel* aTreeModel = dynamic_cast (myTreeView->model()); + if (!aTreeModel) + return; + + QModelIndexList anIndices; + aTreeModel->FindPointers (thePointers, QModelIndex(), anIndices); QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); aSelectionModel->clear(); - - UpdateTreeModel(); + for (int anIndicesId = 0, aSize = anIndices.size(); anIndicesId < aSize; anIndicesId++) + { + QModelIndex anIndex = anIndices[anIndicesId]; + TreeModel_Tools::SetExpandedTo (myTreeView, anIndex); + aSelectionModel->select (anIndex, QItemSelectionModel::Select); + } } // ======================================================================= @@ -597,10 +1199,83 @@ void VInspector_Window::displaySelectedPresentations(const bool theToDisplay) // ======================================================================= Handle(AIS_InteractiveContext) VInspector_Window::createView() { - myViewWindow = new View_Window (0); + // create two view windows + Handle(AIS_InteractiveContext) aContext = View_Viewer::CreateStandardViewer(); + + Handle(AIS_Trihedron) aTrihedron = new AIS_Trihedron (new Geom_Axis2Placement (gp::XOY())); + aTrihedron->SetDatumDisplayMode (Prs3d_DM_Shaded); + aContext->Display (aTrihedron, Standard_True); + + myViewWindow = new View_Window (0, aContext, false /*for opening several BREP files*/, true); myViewWindow->GetView()->SetPredefinedSize (VINSPECTOR_DEFAULT_VIEW_WIDTH, VINSPECTOR_DEFAULT_VIEW_HEIGHT); myViewWindow->move (VINSPECTOR_DEFAULT_VIEW_POSITION_X, VINSPECTOR_DEFAULT_VIEW_POSITION_Y); myViewWindow->show(); - return myViewWindow->GetView()->GetViewer()->GetContext(); +#ifdef DEBUG_TWO_VIEWS + myViewWindow->move (VINSPECTOR_DEFAULT_VIEW_POSITION_X - 240, VINSPECTOR_DEFAULT_VIEW_POSITION_Y); + + View_Window* aSecondViewWindow = new View_Window (0, aContext); + aSecondViewWindow->GetView()->SetPredefinedSize (VINSPECTOR_DEFAULT_VIEW_WIDTH, VINSPECTOR_DEFAULT_VIEW_HEIGHT); + aSecondViewWindow->move (VINSPECTOR_DEFAULT_VIEW_POSITION_X + 220, VINSPECTOR_DEFAULT_VIEW_POSITION_Y); + aSecondViewWindow->show(); + + myCameraPrs = new View_CameraPositionPrs (aContext, 0); + aContext->Display (myCameraPrs, Standard_True); + + View_Widget* aViewWidget = myViewWindow->GetView(); + connect (aViewWidget, SIGNAL (leftButtonDown (const int, const int)), + this, SLOT (onViewLeftButtonDown (const int, const int))); + connect (aViewWidget, SIGNAL (leftButtonUp (const int, const int)), + this, SLOT (onViewLeftButtonUp (const int, const int))); + connect (aViewWidget, SIGNAL (moveTo (const int, const int)), + this, SLOT(onViewMoveTo (const int, const int))); +#endif + + return aContext; +} + +// ======================================================================= +// function : updatePreviewPresentation +// purpose : +// ======================================================================= +void VInspector_Window::updatePreviewPresentation (const NCollection_List& theShapes, + const Handle(Graphic3d_TransformPers)& thePersistent) +{ + Handle(AIS_InteractiveContext) aContext; + VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); + if (aViewModel) + aContext = aViewModel->GetContext(); + + if (theShapes.IsEmpty()) + { + if (!aContext.IsNull()) + aContext->Remove (myPreviewPresentation, Standard_True); + myPreviewPresentation = NULL; + return; + } + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + for (NCollection_List::Iterator anIterator (theShapes); anIterator.More(); anIterator.Next()) + { + aBuilder.Add (aCompound, anIterator.Value()); + } + + if (myPreviewPresentation.IsNull()) + { + myPreviewPresentation = new AIS_Shape (aCompound); + myPreviewPresentation->SetAttributes (myPreviewParameters->GetDrawer()); + + myPreviewPresentation->SetTransformPersistence(thePersistent); + if (!aContext.IsNull()) + aContext->Display (myPreviewPresentation, AIS_Shaded, -1/*do not participate in selection*/, Standard_True); + } + else + { + Handle(AIS_Shape)::DownCast (myPreviewPresentation)->Set (aCompound); + myPreviewPresentation->SetTransformPersistence(thePersistent); + if (!aContext.IsNull()) + aContext->Redisplay (myPreviewPresentation, Standard_True); + } } diff --git a/tools/VInspector/VInspector_Window.hxx b/tools/VInspector/VInspector_Window.hxx index 73783f39b0..94c4a2e03d 100644 --- a/tools/VInspector/VInspector_Window.hxx +++ b/tools/VInspector/VInspector_Window.hxx @@ -18,11 +18,14 @@ #include #include -#include +#include #include #include #include +#include + +#include #include #include @@ -30,17 +33,28 @@ #include #include +class VInspector_PreviewParameters; + class ViewControl_MessageDialog; +class ViewControl_PropertyView; class VInspector_ToolBar; + class View_Window; class QAbstractItemModel; class QAction; -class QMainWindow; +class QDockWidget; class QTreeView; class QWidget; +//#define DEBUG_TWO_VIEWS + +#ifdef DEBUG_TWO_VIEWS +class View_CameraPositionPrs; +#endif + + //! \class VInspector_Window //! Window that unites all VInspector controls. class VInspector_Window : public QObject @@ -82,6 +96,26 @@ public: //! Returns main control QWidget* GetMainWindow() const { return myMainWindow; } + //! Returns presentations of selected items in tree model + //! \param theModel selection model + //! \return container of presentations + NCollection_List GetSelectedPresentations (QItemSelectionModel* theModel); + + //! Returns selected shapes + //! \param theModel selection model + //! \return container of shapes + NCollection_List GetSelectedShapes (const QModelIndexList& theIndices); + + //! Returns selected shapes + //! \param theModel selection model + //! \return container of shapes + void GetSelectedPropertyPanelShapes (const QModelIndexList& theTreeViewIndices, + const QModelIndexList& thePropertyPanelIndices, + NCollection_List& theShapes); + + //! Returns the first not zero transform persistent of selected elements + Handle(Graphic3d_TransformPers) GetSelectedTransformPers(); + private: //! Fills controls of the plugin by parameters: @@ -103,6 +137,15 @@ private slots: //! \param theActionId an action identifier in tool bar void onToolBarActionClicked (const int theActionId); + //! 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(); + //! Synchronization selection between history and tree view. Selection by history view //! \param theSelected a selected items //! \param theDeselected a deselected items @@ -113,16 +156,48 @@ private slots: //! check box is checked //! \param theSelected a selected items //! \param theDeselected a deselected items - void onSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected); + void onTreeViewSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected); + + //! Exports the selected context into MessageView for have preview in the context. + void onExportToMessageView(); //! Exports the first selected shape into ShapeViewer plugin. void onExportToShapeView(); - //! Shows selected presentation if it is not shown yet - void onShow(); + //! Displays default preview presentation + void onDefaultPreview(); + + //! Apply activated display action + void onDisplayActionTypeClicked(); + + //! Expand two next levels for all selected item + void onExpand(); - //! Erase selected presentation if it is shown - void onHide(); + //! Expand all levels for all selected items + void onExpandAll(); + + //! Collapse all levels for all selected items + void onCollapseAll(); + +#ifdef DEBUG_TWO_VIEWS + //! Processing mouse down in the view + //! \param theX X mouse position in pixels + //! \param theY Y mouse position in pixels + void onViewLeftButtonDown (const int theX, const int theY); + + //! Processing mouse up in the view + //! \param theX X mouse position in pixels + //! \param theY Y mouse position in pixels + void onViewLeftButtonUp (const int theX, const int theY); + + //! Processing move in the view + //! \param theX X mouse position in pixels + //! \param theY Y mouse position in pixels + void onViewMoveTo (const int theX, const int theY); + + //! Processing left button up + void onViewLeftButtonUp(); +#endif private: @@ -133,29 +208,58 @@ private: //! Updates tree model void UpdateTreeModel(); + //! Updates property panel content by item selected in tree view. + void updatePropertyPanelBySelection(); + //! Set selected in tree view presentations displayed or erased in the current context. Note that erased presentations //! still belongs to the current context until Remove is called. - //! \param theToDisplay if true, presentation is displayed otherwise erased - void displaySelectedPresentations (const bool theToDisplay); + //! \param theType display action type + void displaySelectedPresentations (const VInspector_DisplayActionType theType); + + //! Set items of the pointers highlighted in tree view + //! \param theType display action type + void highlightTreeViewItems (const QStringList& thePointers); + + //! Set items of the pointers selected in tree view + //! \param theType display action type + void selectTreeViewItems (const QStringList& thePointers); //! Creates an istance of 3D view to initialize context. //! \return a context of created view. Handle(AIS_InteractiveContext) createView(); + //!< Updates presentation of preview for parameter shapes. Creates a compound of the shapes + //!< \param theShape container of shapes + //!< \param thePersistent transform persistent to be used in preview presentation + void updatePreviewPresentation (const NCollection_List& theShapes, + const Handle(Graphic3d_TransformPers)& thePersistent); + private: QWidget* myParent; //!< widget, comes when Init window, the window control lays in the layout, updates window title QMainWindow* myMainWindow; //!< main control VInspector_ToolBar* myToolBar; //!< tool bar actions + + QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget + ViewControl_PropertyView* myPropertyView; //!< property control to display model item values if exist + QTreeView* myTreeView; //!< tree view of AIS content QTreeView* myHistoryView; //!< history of AIS context calls Handle(VInspector_CallBack) myCallBack; //!< AIS context call back, if set + NCollection_List myPaneCreators; //!< panes for AIS presentations + ViewControl_MessageDialog* myExportToShapeViewDialog; //!< dialog about exporting TopoDS_Shape to ShapeView plugin View_Window* myViewWindow; //!< temporary view window, it is created if Open is called but context is still NULL Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container + VInspector_PreviewParameters* myPreviewParameters; //!< drawer of preview presentation + Handle(AIS_InteractiveObject) myPreviewPresentation; //!< presentation of preview for a selected object + +#ifdef DEBUG_TWO_VIEWS + Handle(View_CameraPositionPrs) myCameraPrs; +#endif }; #endif diff --git a/tools/VInspectorPaneAIS/FILES b/tools/VInspectorPaneAIS/FILES new file mode 100644 index 0000000000..79a7145510 --- /dev/null +++ b/tools/VInspectorPaneAIS/FILES @@ -0,0 +1,10 @@ +VInspectorPaneAIS_ColoredShape.cxx +VInspectorPaneAIS_ColoredShape.hxx +VInspectorPaneAIS_ItemPrs3dDrawer.cxx +VInspectorPaneAIS_ItemPrs3dDrawer.hxx +VInspectorPaneAIS_PaneCreator.cxx +VInspectorPaneAIS_PaneCreator.hxx +VInspectorPaneAIS_PropertiesCreator.cxx +VInspectorPaneAIS_PropertiesCreator.hxx +VInspectorPaneAIS_Shape.cxx +VInspectorPaneAIS_Shape.hxx \ No newline at end of file diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_ColoredShape.cxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_ColoredShape.cxx new file mode 100644 index 0000000000..281e432fa0 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_ColoredShape.cxx @@ -0,0 +1,59 @@ +// Created on: 2019-04-14 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 +#include + +#include +#include + +#include + +#include + +// ======================================================================= +// function : ChildItemCount +// purpose : +// ======================================================================= +int VInspectorPaneAIS_ColoredShape::ChildItemCount() const +{ + Handle(AIS_ColoredShape) aPrs = GetPresentation(); + if (aPrs.IsNull()) + return 0; + + return aPrs->CustomAspectsMap().Size(); +} + +// ======================================================================= +// function : CreateChildItem +// purpose : +// ======================================================================= +TreeModel_ItemBasePtr VInspectorPaneAIS_ColoredShape::CreateChildItem (int theRow, int theColumn) const +{ + Handle(AIS_ColoredShape) aPrs = GetPresentation(); + if (aPrs.IsNull()) + return TreeModel_ItemBasePtr(); + + return VInspectorPaneAIS_ItemPrs3dDrawer::CreateItem (getItem(), theRow, theColumn); +} + +// ======================================================================= +// function : GetPresentation +// purpose : +// ======================================================================= +Handle(AIS_ColoredShape) VInspectorPaneAIS_ColoredShape::GetPresentation() const +{ + return Handle(AIS_ColoredShape)::DownCast (getItem()->GetObject()); +} diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_ColoredShape.hxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_ColoredShape.hxx new file mode 100644 index 0000000000..c8b65317e0 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_ColoredShape.hxx @@ -0,0 +1,53 @@ +// Created on: 2019-04-14 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspectorPaneAIS_ColoredShape_H +#define VInspectorPaneAIS_ColoredShape_H + +#include +#include +#include + +class AIS_ColoredShape; + +//! \class VInspectorPaneAIS_ColoredShape +//! Item presents information about AIS_InteractiveObject. +//! Parent is item context, children are item selections. +class VInspectorPaneAIS_ColoredShape : public TreeModel_ItemProperties +{ +public: + //! Constructor + VInspectorPaneAIS_ColoredShape (const TreeModel_ItemBasePtr& theItem) : TreeModel_ItemProperties (theItem) {} + + //! Destructor + ~VInspectorPaneAIS_ColoredShape() {} + + //! Returns number of item children + //! \return an integer value, ZERO by default + Standard_EXPORT virtual int ChildItemCount() 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 + Standard_EXPORT virtual TreeModel_ItemBasePtr CreateChildItem (int theRow, int theColumn) const Standard_OVERRIDE; + +protected: + //! Converts transient object to custom presentation type + //! \return custom presentation + Handle(AIS_ColoredShape) GetPresentation() const; +}; + +#endif diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_ItemPrs3dDrawer.cxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_ItemPrs3dDrawer.cxx new file mode 100644 index 0000000000..fe0fd50dc4 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_ItemPrs3dDrawer.cxx @@ -0,0 +1,115 @@ +// Created on: 2018-08-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 + +#include +#include + +#include + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void VInspectorPaneAIS_ItemPrs3dDrawer::Init() +{ + Handle(Prs3d_Drawer) aDrawer; + TCollection_AsciiString aName; + VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast(Parent()); + if (!aParentItem) + { + VInspector_ItemPrs3dDrawer::Init(); + return; + } + + Handle(AIS_ColoredShape) aPrs = Handle(AIS_ColoredShape)::DownCast (aParentItem->GetInteractiveObject()); + const AIS_DataMapOfShapeDrawer& anAspectsMap = aPrs->CustomAspectsMap(); + + int aRowId = Row(); + int anItemRows = TreeModel_ItemBase::RowCountWithoutProperties (aParentItem); + int aCurrentRow = anItemRows; + for (AIS_DataMapOfShapeDrawer::Iterator anIter (anAspectsMap); anIter.More(); anIter.Next(), aCurrentRow++) + { + if (aRowId != aCurrentRow) + continue; + + aDrawer = anIter.Value(); + break; + } + aName = aDrawer.IsNull() ? "NULL" : (TCollection_AsciiString(aDrawer->DynamicType()->Name()) + "_" + (aRowId - anItemRows)); + setDrawer (aDrawer, aName); + TreeModel_ItemBase::Init(); // to use getIO() without circling initialization +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void VInspectorPaneAIS_ItemPrs3dDrawer::Reset() +{ + VInspector_ItemPrs3dDrawer::Reset(); + + myShape = TopoDS_Shape(); +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void VInspectorPaneAIS_ItemPrs3dDrawer::initItem() const +{ + if (IsInitialized()) + return; + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspectorPaneAIS_ItemPrs3dDrawer::GetTableRowCount() const +{ + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return 0; + + return 1 + VInspector_ItemPrs3dDrawer::GetTableRowCount(); +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspectorPaneAIS_ItemPrs3dDrawer::GetTableData (const int theRow, const int theColumn, const int theRole) const +{ + Handle(Prs3d_Drawer) aDrawer = GetDrawer(); + if (aDrawer.IsNull()) + return QVariant(); + + if (theRow == 0) + { + if (theRole == Qt::DisplayRole) + return theColumn == 0 ? QVariant ("TopoDS_Shape") : QVariant(); + else + return QVariant(); + } + + return VInspector_ItemPrs3dDrawer::GetTableData (theRow, theColumn, theRole); +} + diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_ItemPrs3dDrawer.hxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_ItemPrs3dDrawer.hxx new file mode 100644 index 0000000000..d0fbf64c2b --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_ItemPrs3dDrawer.hxx @@ -0,0 +1,79 @@ +// Created on: 2018-08-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 VInspectorPaneAIS_ItemPrs3dDrawer_H +#define VInspectorPaneAIS_ItemPrs3dDrawer_H + +#include +#include +#include + +#include + +class Prs3d_BasicAspect; +class QItemSelectionModel; + +class VInspectorPaneAIS_ItemPrs3dDrawer; +typedef QExplicitlySharedDataPointer VInspectorPaneAIS_ItemPrs3dDrawerPtr; + +//! \class VInspectorPaneAIS_ItemPrs3dDrawer +//! Item presents information about AIS_InteractiveObject. +//! Parent is item context, children are item selections. +class VInspectorPaneAIS_ItemPrs3dDrawer : public VInspector_ItemPrs3dDrawer +{ + +public: + + //! Creates an item wrapped by a shared pointer + static VInspectorPaneAIS_ItemPrs3dDrawerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + { return VInspectorPaneAIS_ItemPrs3dDrawerPtr (new VInspectorPaneAIS_ItemPrs3dDrawer (theParent, theRow, theColumn)); } + //! Destructor + virtual ~VInspectorPaneAIS_ItemPrs3dDrawer() Standard_OVERRIDE {}; + + //! Inits the item, fills internal containers + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Resets cached values + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table rows + //! \return an integer value + virtual int GetTableRowCount() const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE; + +protected: + + //! Initialize the current item. It is empty because Reset() is also empty. + virtual void initItem() const Standard_OVERRIDE; + +private: + + //! Constructor + //! param theParent a parent item + VInspectorPaneAIS_ItemPrs3dDrawer (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) + : VInspector_ItemPrs3dDrawer (theParent, theRow, theColumn) {} + +protected: + + TopoDS_Shape myShape; //!< current shape + + friend class VInspectorPaneAIS_ColoredShape; +}; + +#endif diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_PaneCreator.cxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_PaneCreator.cxx new file mode 100644 index 0000000000..7bde9e2398 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_PaneCreator.cxx @@ -0,0 +1,49 @@ +// Created on: 2018-12-08 +// 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 +#include + +#include + +IMPLEMENT_STANDARD_RTTIEXT(VInspectorPaneAIS_PaneCreator, ViewControl_PaneCreator) + +// ======================================================================= +// function : createPane +// purpose : +// ======================================================================= +ViewControl_Pane* VInspectorPaneAIS_PaneCreator::createPane (const Standard_CString& theName) +{ + if (theName == STANDARD_TYPE (AIS_Shape)->Name()) + return new VInspectorPaneAIS_Shape(); + + return NULL; +} + +// ======================================================================= +// function : buildPresentationShape +// purpose : +// ======================================================================= +ViewControl_Pane* VInspectorPaneAIS_PaneCreator::GetPane (const Standard_CString& theName) +{ + if (myPanes.IsBound (theName)) + return myPanes.Find (theName); + + ViewControl_Pane* aPane = createPane (theName); + if (aPane) + myPanes.Bind (theName, aPane); + + return aPane; +} diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_PaneCreator.hxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_PaneCreator.hxx new file mode 100644 index 0000000000..8c8d0b9361 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_PaneCreator.hxx @@ -0,0 +1,58 @@ +// Created on: 2018-12-08 +// 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 VInspectorPaneAIS_PaneCreator_H +#define VInspectorPaneAIS_PaneCreator_H + +#include +#include + +#include +#include + +#include +#include + +DEFINE_STANDARD_HANDLE (VInspectorPaneAIS_PaneCreator, ViewControl_PaneCreator) + +//! \class VInspectorPaneAIS_PaneCreator +//! \brief An interface to create custom panes by transient object name. +class VInspectorPaneAIS_PaneCreator : public ViewControl_PaneCreator +{ +public: + + //! Constructor + VInspectorPaneAIS_PaneCreator() {} + + //! Destructor + virtual ~VInspectorPaneAIS_PaneCreator() {} + + //! Returns pane for the name, creates a new pane if it does not exist and possible to create + //! \param theName type of the pane + //! \return a pane instance or NULL + virtual ViewControl_Pane* GetPane (const Standard_CString& theName); + + DEFINE_STANDARD_RTTIEXT(VInspectorPaneAIS_PaneCreator, ViewControl_PaneCreator) + +protected: + //! Creates new pane for the name + //! \return pane instance or NULL + ViewControl_Pane* createPane (const Standard_CString& theName); + +private: + NCollection_DataMap myPanes; //!< created panes +}; + +#endif diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_PropertiesCreator.cxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_PropertiesCreator.cxx new file mode 100644 index 0000000000..cee0808a87 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_PropertiesCreator.cxx @@ -0,0 +1,38 @@ +// Created on: 2019-04-14 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 +#include + +#include + +IMPLEMENT_STANDARD_RTTIEXT(VInspectorPaneAIS_PropertiesCreator, TreeModel_ItemPropertiesCreator) + +// ======================================================================= +// function : GetProperties +// purpose : +// ======================================================================= +TreeModel_ItemProperties* VInspectorPaneAIS_PropertiesCreator::GetProperties (const TreeModel_ItemBasePtr& theItem) +{ + Handle(Standard_Transient) anObject = theItem->GetObject(); + if (anObject.IsNull()) + return NULL; + + if (!Handle(AIS_ColoredShape)::DownCast (anObject).IsNull()) + return new VInspectorPaneAIS_ColoredShape (theItem); + + return NULL; +} + diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_PropertiesCreator.hxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_PropertiesCreator.hxx new file mode 100644 index 0000000000..76115eb042 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_PropertiesCreator.hxx @@ -0,0 +1,47 @@ +// Created on: 2019-04-14 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 VInspectorPaneAIS_PropertiesCreator_H +#define VInspectorPaneAIS_PropertiesCreator_H + +#include +#include + +#include + +DEFINE_STANDARD_HANDLE (VInspectorPaneAIS_PropertiesCreator, TreeModel_ItemPropertiesCreator) + +//! \class VInspectorPaneAIS_PropertiesCreator +//! \brief An interface to create custom panes by transient object name. +class VInspectorPaneAIS_PropertiesCreator : public TreeModel_ItemPropertiesCreator +{ +public: + + //! Constructor + VInspectorPaneAIS_PropertiesCreator() {} + + //! Destructor + virtual ~VInspectorPaneAIS_PropertiesCreator() {} + + //! Returns pane for the name, creates a new pane if it does not exist and possible to create + //! \param theName type of the pane + //! \return a pane instance or NULL + virtual TreeModel_ItemProperties* GetProperties (const TreeModel_ItemBasePtr& theItem) Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT(VInspectorPaneAIS_PropertiesCreator, TreeModel_ItemPropertiesCreator) + +}; + +#endif diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_Shape.cxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_Shape.cxx new file mode 100644 index 0000000000..f4378b68d8 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_Shape.cxx @@ -0,0 +1,92 @@ +// Created on: 2018-12-08 +// 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 + +#include +#include +#include + +#include + +#include +#include + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= +int VInspectorPaneAIS_Shape::GetTableRowCount(const Handle(Standard_Transient)& theObject) const +{ + Handle(AIS_Shape) aPrs = GetPresentation (theObject); + if (aPrs.IsNull()) + return 0; + + return 8; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= +QVariant VInspectorPaneAIS_Shape::GetTableData (const Handle(Standard_Transient)& theObject, + const int theRow, const int theColumn, const int theRole) const +{ + Handle(AIS_Shape) aPrs = GetPresentation (theObject); + if (aPrs.IsNull()) + return QVariant(); + + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return ViewControl_Table::SeparatorData(); + case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (AIS_Shape)->Name()) + : ViewControl_Tools::GetPointerInfo (aPrs).ToCString(); + case 2: return ViewControl_Table::SeparatorData(); + case 3: return isFirstColumn ? QVariant ("TShape") + : (aPrs->Shape().IsNull() ? QVariant ("") : ViewControl_Tools::GetPointerInfo (aPrs->Shape().TShape()).ToCString()); + case 4: return isFirstColumn ? QVariant ("ShapeType") + : (aPrs->Shape().IsNull() ? QVariant ("") : TopAbs::ShapeTypeToString (aPrs->Shape().ShapeType())); + case 5: return isFirstColumn ? QVariant ("Orientation") + : (aPrs->Shape().IsNull() ? QVariant ("") : VInspector_Tools::OrientationToName (aPrs->Shape().Orientation()).ToCString()); + case 6: return isFirstColumn ? QVariant ("Location") + : (aPrs->Shape().IsNull() ? QVariant ("") : ViewControl_Tools::ToString (aPrs->Shape().Location()).ToCString()); + case 7: return isFirstColumn ? QVariant ("Deflection") + : (aPrs->Shape().IsNull() ? QVariant ("") : QVariant (Prs3d::GetDeflection(aPrs->Shape(), aPrs->Attributes()))); + + default: return QVariant(); + } + return QVariant(); +} + +// ======================================================================= +// function : GetSelected +// purpose : +// ======================================================================= +ViewControl_PaneItem* VInspectorPaneAIS_Shape::GetSelected (const Handle(Standard_Transient)& theObject, + const int theRow, const int theColumn) +{ + Handle(AIS_Shape) aPrs = GetPresentation (theObject); + if (aPrs.IsNull()) + return NULL; + + ViewControl_PaneItem* aPaneItem = new ViewControl_PaneItem(); + aPaneItem->SetShape (aPrs->Shape()); + + return aPaneItem; +} diff --git a/tools/VInspectorPaneAIS/VInspectorPaneAIS_Shape.hxx b/tools/VInspectorPaneAIS/VInspectorPaneAIS_Shape.hxx new file mode 100644 index 0000000000..eb8ceeca08 --- /dev/null +++ b/tools/VInspectorPaneAIS/VInspectorPaneAIS_Shape.hxx @@ -0,0 +1,64 @@ +// Created on: 2018-12-08 +// 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 VInspectorPaneAIS_Shape_H +#define VInspectorPaneAIS_Shape_H + +#include +#include +#include + +#include + +//! \class VInspectorPaneAIS_Shape +//! Item presents information about AIS_InteractiveObject. +//! Parent is item context, children are item selections. +class VInspectorPaneAIS_Shape : public ViewControl_Pane +{ +public: + //! Constructor + VInspectorPaneAIS_Shape() : ViewControl_Pane() {} + + //! Destructor + ~VInspectorPaneAIS_Shape() {} + + //! Returns number of table rows + //! \return an integer value + Standard_EXPORT virtual int GetTableRowCount(const Handle(Standard_Transient)& theObject) const Standard_OVERRIDE; + + //! Returns table value for the row in form: + //! \param theRow a model index row + //! \param theColumn a model index column + Standard_EXPORT virtual QVariant GetTableData (const Handle(Standard_Transient)& theObject, + const int theRow, + const int theColumn, + const int theRole) const Standard_OVERRIDE; + + //! Return selected element in the pane cell + //! \param theObject current pane object + //! \param theRow a model index row + //! \param theColumn a model index column + Standard_EXPORT virtual ViewControl_PaneItem* GetSelected (const Handle(Standard_Transient)& theObject, + const int theRow, + const int theColumn) Standard_OVERRIDE; + +protected: + //! Converts transient object to custom presentation type + //! \return custom presentation + Handle(AIS_Shape) GetPresentation (const Handle(Standard_Transient)& theObject) const + { return Handle(AIS_Shape)::DownCast (theObject); }; +}; + +#endif diff --git a/tools/View/FILES b/tools/View/FILES index f0c48897a4..0d5ff838ac 100644 --- a/tools/View/FILES +++ b/tools/View/FILES @@ -1,4 +1,6 @@ View.qrc +View_CameraPositionPrs.cxx +View_CameraPositionPrs.hxx View_ContextType.hxx View_Displayer.cxx View_Displayer.hxx diff --git a/tools/View/View_CameraPositionPrs.cxx b/tools/View/View_CameraPositionPrs.cxx new file mode 100644 index 0000000000..45cdfe81ee --- /dev/null +++ b/tools/View/View_CameraPositionPrs.cxx @@ -0,0 +1,338 @@ +// Created on: 2018-12-11 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 + +#include +#include + +#include +#include +#include +#include + +// ======================================================================= +// function : StartTransformation +// purpose : +// ======================================================================= +void View_CameraPositionPrs::StartTransformation (const int theX, const int theY) +{ + myIsTransformationStarted = Standard_True; + myStartPosition = gp_Pnt2d (theX, theY); +} + +// ======================================================================= +// function : StopTransformation +// purpose : +// ======================================================================= +void View_CameraPositionPrs::StopTransformation (const int theX, const int theY) +{ + myIsTransformationStarted = Standard_False; + myStartPosition = gp_Pnt2d (0, 0); + + int aValue = 9; +} + +// ======================================================================= +// function : Transform +// purpose : +// ======================================================================= +void View_CameraPositionPrs::Transform (const int theX, const int theY, const Handle(V3d_View) theView) +{ + // scale camera symmetry according to the center + if (!myIsTransformationStarted) + return; + + Standard_Integer aXDiff = theX - myStartPosition.X(); + Standard_Integer anYDiff = theY - myStartPosition.Y(); + + Handle(V3d_View) aTargetView = GetView(); + if (aTargetView.IsNull()) + return; + TColgp_SequenceOfPnt aPoints = getCameraPoints(aTargetView->Camera()); + TColgp_SequenceOfPnt2d aPixelPoints = projectToView (aPoints, theView); + Standard_Real aWidthInPixels = aPixelPoints.Value(2).Distance (aPixelPoints.Value(1)); + Standard_Real aHeightInPixels = aPixelPoints.Value(3).Distance (aPixelPoints.Value(2)); + + if (aWidthInPixels < Precision::Confusion() || + aHeightInPixels < Precision::Confusion()) + return; + + Standard_Real aXScaleToMove = aXDiff / aWidthInPixels; + Standard_Real anYScaleToMove = anYDiff / aHeightInPixels; + + TColgp_SequenceOfPnt2d aTargetPixelPoints = projectToView (aPoints, aTargetView); + Standard_Real aTargetWidthInPixels = aTargetPixelPoints.Value(2).Distance (aTargetPixelPoints.Value(1)); + Standard_Real aTargetHeightInPixels = aTargetPixelPoints.Value(3).Distance (aTargetPixelPoints.Value(2)); + if (aTargetWidthInPixels < Precision::Confusion() || + aTargetHeightInPixels < Precision::Confusion()) + return; + + gp_XYZ aTargetCameraDimensions = aTargetView->Camera()->ViewDimensions(); + Standard_Real aTargetXDiff = aXScaleToMove * aTargetWidthInPixels; + Standard_Real aTargetYDiff = anYScaleToMove * aTargetHeightInPixels; + + double aRatio = aHeightInPixels / aWidthInPixels; + + bool isXScale = true; + if (aTargetXDiff == 0 && aTargetYDiff == 0) + return; + else if (aTargetXDiff == 0) + isXScale = false; + else if (aTargetYDiff == 0) + isXScale = true; + else // both X, Y are not zero + { + double aDiffRatio = aTargetYDiff / aTargetXDiff; + isXScale = aDiffRatio > aRatio; + } + + Standard_Real aNewScale = 1; + if (isXScale) + { + bool isIncrease = true; + double aScaleSign = isIncrease ? 1.0 : -1.0; + + double aScale = aTargetView->Camera()->Scale(); + Standard_Real aTargetWidthInPixelsNew = aScale + aTargetXDiff * aScaleSign; + aNewScale = aTargetWidthInPixelsNew; + } + else + { + std::cout << "Nothing to do" << std::endl; + myStartPosition = gp_Pnt2d (theX, theY); + return; + } + + aTargetView->Camera()->SetScale (aNewScale); + aTargetView->AutoZFit(); + //aTargetView->ImmediateUpdate(); + //aTargetView->Pan (aTargetXDiff, aTargetYDiff); + + myStartPosition = gp_Pnt2d (theX, theY); + + // move camera center + //if (!myIsTransformationStarted) + // return; + + //Standard_Integer aXDiff = theX - myStartPosition.X(); + //Standard_Integer anYDiff = theY - myStartPosition.Y(); + //aXDiff = -aXDiff; + + //Handle(V3d_View) aTargetView = GetView(); + //if (aTargetView.IsNull()) + // return; + //TColgp_SequenceOfPnt aPoints = getCameraPoints(aTargetView->Camera()); + //TColgp_SequenceOfPnt2d aPixelPoints = projectToView (aPoints, theView); + //Standard_Real aWidthInPixels = aPixelPoints.Value(2).Distance (aPixelPoints.Value(1)); + //Standard_Real aHeightInPixels = aPixelPoints.Value(3).Distance (aPixelPoints.Value(2)); + + //if (aWidthInPixels < Precision::Confusion() || + // aHeightInPixels < Precision::Confusion()) + // return; + + //Standard_Real aXScaleToMove = aXDiff / aWidthInPixels; + //Standard_Real anYScaleToMove = anYDiff / aHeightInPixels; + + //TColgp_SequenceOfPnt2d aTargetPixelPoints = projectToView (aPoints, aTargetView); + //Standard_Real aTargetWidthInPixels = aTargetPixelPoints.Value(2).Distance (aTargetPixelPoints.Value(1)); + //Standard_Real aTargetHeightInPixels = aTargetPixelPoints.Value(3).Distance (aTargetPixelPoints.Value(2)); + //if (aTargetWidthInPixels < Precision::Confusion() || + // aTargetHeightInPixels < Precision::Confusion()) + // return; + + //gp_XYZ aTargetCameraDimensions = aTargetView->Camera()->ViewDimensions(); + //Standard_Real aTargetXDiff = aXScaleToMove * aTargetWidthInPixels; + //Standard_Real aTargetYDiff = anYScaleToMove * aTargetHeightInPixels; + + //aTargetView->Pan (aTargetXDiff, aTargetYDiff); + + //myStartPosition = gp_Pnt2d (theX, theY); +} + +// ======================================================================= +// function : CreateView +// purpose : +// ======================================================================= +void View_CameraPositionPrs::Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + thePresentation->Clear(); + if (GetView().IsNull()) + return; + + Handle (Graphic3d_Camera) aCamera = GetView()->Camera(); + + Handle (Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation); + Handle(Graphic3d_AspectLine3d) aLineAspect = new Graphic3d_AspectLine3d (Quantity_NOC_RED, Aspect_TOL_SOLID, 5); + aGroup->SetGroupPrimitivesAspect (aLineAspect); + + gp_Pnt aCameraCenter = aCamera->Center(); + gp_XYZ aCameraDims = aCamera->ViewDimensions(); + gp_XYZ aCameraHalfDims = 0.5 * aCameraDims; + + gp_Dir anEyeDir (gp_Vec (aCameraCenter, aCamera->Eye())); + gp_Dir anUpVec = aCamera->Up(); + + gp_Dir aZAxis = anEyeDir; + gp_Dir anYAxis = anUpVec; + gp_Dir aXAxis = aZAxis ^ anYAxis; + + aZAxis = gp_Dir ((gp_Vec (aCamera->Eye(), aCameraCenter))); + aZAxis.Reverse(); + double aZValue = 0;//aCamera->Scale(); + + TColgp_SequenceOfPnt aPoints = getCameraPoints (aCamera); + { + //aZValue = aZAxis.Z() * aCamera->Scale(); + + Handle(Graphic3d_ArrayOfPolylines) aSegments = new Graphic3d_ArrayOfPolylines (aPoints.Size()); + for (Standard_Integer aPointIndex = 1, aPointCount = aPoints.Length(); aPointIndex <= aPointCount; aPointIndex++) + { + aSegments->SetVertice (aPointIndex, aPoints (aPointIndex)); + ////aSegments->SetVertice (aPointIndex, gp_Pnt (aPoints (aPointIndex).X(), aPoints (aPointIndex).Y(), aZValue)); + //gp_Pnt aPoint = aPoints (aPointIndex); + //aPoint.Translate(gp_Vec(aCamera->Eye(), gp::Origin())); + + //aSegments->SetVertice (aPointIndex, gp_Pnt (aPoint.X(), aPoint.Y(), aPoint.Z())); + } + aGroup->AddPrimitiveArray (aSegments); + } + + { + aGroup = Prs3d_Root::NewGroup (thePresentation); + aLineAspect = new Graphic3d_AspectLine3d (Quantity_NOC_GREEN, Aspect_TOL_SOLID, 3); + aGroup->SetGroupPrimitivesAspect (aLineAspect); + + //aZValue = aZAxis.Z() * aCamera->Scale(); + aZValue = 20;//aCamera->ZFar() / aCamera->Scale(); + + double aDistance = aCameraCenter.Distance (aCamera->Eye()); + Handle (Graphic3d_Camera) aDefCamera = GetView()->DefaultCamera(); + double aDefCameraScale = aDefCamera->Scale(); + double aScale = aCamera->Scale(); + + double aMoveDistance = -aDistance + aDistance * (1 - aScale / aDefCameraScale); + + //std::cout << "aDistance = " << aDistance << "aScale = " << aScale << "1 - aScale / aDefCameraScale = " << 1 - aScale / aDefCameraScale + // << "aMoveDistance = " << aMoveDistance << std::endl; + + Handle(Graphic3d_ArrayOfPolylines) aSegments = new Graphic3d_ArrayOfPolylines (aPoints.Size()); + for (Standard_Integer aPointIndex = 1, aPointCount = aPoints.Length(); aPointIndex <= aPointCount; aPointIndex++) + { + //aSegments->SetVertice (aPointIndex, aPoints (aPointIndex)); + //aSegments->SetVertice (aPointIndex, gp_Pnt (aPoints (aPointIndex).X(), aPoints (aPointIndex).Y(), aZValue)); + gp_Pnt aPoint = aPoints (aPointIndex); + gp_Dir aDir = gp_Dir (gp_Vec(aCamera->Eye(), aCameraCenter)); + gp_Pnt aNewPoint = gp_Pnt(aPoint.XYZ() + aDir.XYZ() * aMoveDistance); + gp_Vec aVec (aPoint, aNewPoint); + aPoint.Translate(aVec); + + aSegments->SetVertice (aPointIndex, gp_Pnt (aPoint.X(), aPoint.Y(), aPoint.Z())); + + } + aGroup->AddPrimitiveArray (aSegments); + } + + Handle(Graphic3d_ArrayOfPoints) aVertices = new Graphic3d_ArrayOfPoints(1); + aVertices->SetVertice (1, aCameraCenter); + + Handle(Graphic3d_AspectMarker3d) aMarkerAspect = new Graphic3d_AspectMarker3d (Aspect_TOM_PLUS, Quantity_NOC_GREEN, 3); + aGroup->SetGroupPrimitivesAspect (aMarkerAspect); + aGroup->AddPrimitiveArray(aVertices); +} + +// ======================================================================= +// function : ComputeSelection +// purpose : +// ======================================================================= +void View_CameraPositionPrs::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode) +{ +} + +// ======================================================================= +// function : GetCamera +// purpose : +// ======================================================================= +Handle(V3d_View) View_CameraPositionPrs::GetView() const +{ + Handle(V3d_Viewer) aViewer = myContext->CurrentViewer(); + + int aViewId = 0; + for (V3d_ListOfViewIterator anActiveViewIter (aViewer->ActiveViewIterator()); anActiveViewIter.More(); anActiveViewIter.Next()) + { + Handle(V3d_View) aView = anActiveViewIter.Value(); + if (aView->View().IsNull()) + continue; + + if (myViewId == aViewId) + return aView; + aViewId++; + } + return Handle(V3d_View)(); +} + +// ======================================================================= +// function : getCameraPoints +// purpose : +// ======================================================================= +TColgp_SequenceOfPnt View_CameraPositionPrs::getCameraPoints (const Handle (Graphic3d_Camera)& theCamera) +{ + gp_Pnt aCameraCenter = theCamera->Center(); + gp_XYZ aCameraDims = theCamera->ViewDimensions(); + gp_XYZ aCameraHalfDims = 0.5 * aCameraDims; + + gp_Dir anEyeDir (gp_Vec (aCameraCenter, theCamera->Eye())); + gp_Dir anUpVec = theCamera->Up(); + + gp_Dir aZAxis = anEyeDir; + gp_Dir anYAxis = anUpVec; + gp_Dir aXAxis = aZAxis ^ anYAxis; + + aZAxis = gp_Dir ((gp_Vec (theCamera->Eye(), aCameraCenter))); + aZAxis.Reverse(); + double aZValue = 0;//aCamera->Scale(); + + TColgp_SequenceOfPnt aPoints; + aPoints.Append (gp_Pnt (aCameraCenter.XYZ() - aXAxis.XYZ() * aCameraHalfDims.X() + anYAxis.XYZ() * aCameraHalfDims.Y())); + aPoints.Append (gp_Pnt (aCameraCenter.XYZ() + aXAxis.XYZ() * aCameraHalfDims.X() + anYAxis.XYZ() * aCameraHalfDims.Y())); + aPoints.Append (gp_Pnt (aCameraCenter.XYZ() + aXAxis.XYZ() * aCameraHalfDims.X() - anYAxis.XYZ() * aCameraHalfDims.Y())); + aPoints.Append (gp_Pnt (aCameraCenter.XYZ() - aXAxis.XYZ() * aCameraHalfDims.X() - anYAxis.XYZ() * aCameraHalfDims.Y())); + aPoints.Append (gp_Pnt (aCameraCenter.XYZ() - aXAxis.XYZ() * aCameraHalfDims.X() + anYAxis.XYZ() * aCameraHalfDims.Y())); + + return aPoints; +} + +// ======================================================================= +// function : projectToView +// purpose : +// ======================================================================= +TColgp_SequenceOfPnt2d View_CameraPositionPrs::projectToView (const TColgp_SequenceOfPnt& thePoints, + const Handle(V3d_View)& theView) +{ + TColgp_SequenceOfPnt2d aPoints; + + Standard_Integer aX, anY; + for (Standard_Integer aPointIndex = 1, aPointCount = thePoints.Length(); aPointIndex <= aPointCount; aPointIndex++) + { + gp_Pnt aPoint = thePoints (aPointIndex); + + theView->Convert (aPoint.X(), aPoint.Y(), aPoint.Z(), aX, anY); + aPoints.Append (gp_Pnt2d (aX, anY)); + } + return aPoints; +} diff --git a/tools/View/View_CameraPositionPrs.hxx b/tools/View/View_CameraPositionPrs.hxx new file mode 100644 index 0000000000..1e5b726173 --- /dev/null +++ b/tools/View/View_CameraPositionPrs.hxx @@ -0,0 +1,74 @@ +// Created on: 2018-12-11 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 View_View_CameraPositionPrs_H +#define View_View_CameraPositionPrs_H + +#include +#include +#include +#include +#include + +//! \class View_CameraPositionPrs +//! \brief Displays contour of the camera position of another view +class View_CameraPositionPrs : public AIS_InteractiveObject +{ +public: + + //! Constructor + View_CameraPositionPrs (const Handle(AIS_InteractiveContext)& theContext, + const Standard_Integer theViewId) + : myContext (theContext), myViewId (theViewId), myIsTransformationStarted (Standard_False) {} + + //! Destructor + virtual ~View_CameraPositionPrs() {} + + Standard_EXPORT void StartTransformation (const int theX, const int theY); + Standard_EXPORT void StopTransformation (const int theX, const int theY); + Standard_EXPORT void Transform (const int theX, const int theY, const Handle(V3d_View) theView); + +protected: + Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode) Standard_OVERRIDE; + +protected: + //! Returns the camera of the viewer of the context by the view index + //! \return camera instance or NULL + Handle (V3d_View) GetView() const; + + //! Computes the camera bounding points + //! \param theCamera source camera + //! \return container of bound points + TColgp_SequenceOfPnt getCameraPoints (const Handle (Graphic3d_Camera)& theCamera); + + //! Converts container of 3D points in the container of points in pixels on the parameter view + //! \param thePoints container of source points + //! \return container of projectd points + TColgp_SequenceOfPnt2d projectToView (const TColgp_SequenceOfPnt& thePoints, + const Handle(V3d_View)& theView); + +protected: + Handle(AIS_InteractiveContext) myContext; //!< interactive context + Standard_Integer myViewId; //!< index of the view in the viewer + Standard_Boolean myIsTransformationStarted; + gp_Pnt2d myStartPosition; +}; + +#endif // View_CameraPositionPrs_H diff --git a/tools/View/View_Displayer.cxx b/tools/View/View_Displayer.cxx index e218cae80e..a74d190df1 100644 --- a/tools/View/View_Displayer.cxx +++ b/tools/View/View_Displayer.cxx @@ -23,8 +23,10 @@ #include #include #include + #include #include +#include // ======================================================================= // function : Constructor @@ -277,18 +279,7 @@ void View_Displayer::DisplayedPresentations (NCollection_SharedCurrentViewer(); - if (!aViewer.IsNull()) - { - aViewer->InitActiveViews(); - if (aViewer->MoreActiveViews()) - aView = aViewer->ActiveView(); - } - return aView; + return View_Tools::FindActiveView (GetContext()); } // ======================================================================= @@ -322,7 +313,7 @@ Handle(Standard_Transient) View_Displayer::CreatePresentation (const TopoDS_Shap { Handle(AIS_Shape) aShape = new AIS_Shape (theShape); - aShape->Attributes()->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, Quantity_NOC_WHITE, 1.0)); + //aShape->Attributes()->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, Quantity_NOC_WHITE, 1.0)); return aShape; } diff --git a/tools/View/View_Tools.cxx b/tools/View/View_Tools.cxx index 1699446f00..3ed8a92f5e 100644 --- a/tools/View/View_Tools.cxx +++ b/tools/View/View_Tools.cxx @@ -36,6 +36,26 @@ QAction* View_Tools::CreateAction (const QString& theText, const char* theSlot, return anAction; } +// ======================================================================= +// function : GetView +// purpose : +// ======================================================================= +Handle(V3d_View) View_Tools::FindActiveView (const Handle(AIS_InteractiveContext)& theContext) +{ + if (theContext.IsNull()) + return NULL; + + const Handle(V3d_Viewer)& aViewer = theContext->CurrentViewer(); + if (aViewer.IsNull()) + return NULL; + + aViewer->InitActiveViews(); + if (!aViewer->MoreActiveViews()) + return NULL; + + return aViewer->ActiveView(); +} + // ======================================================================= // function : SaveState // purpose : @@ -45,7 +65,11 @@ void View_Tools::SaveState (View_Window* theView, QMap& theIte { 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 (","); diff --git a/tools/View/View_Tools.hxx b/tools/View/View_Tools.hxx index 2c105f7ed6..b3c49a76e0 100644 --- a/tools/View/View_Tools.hxx +++ b/tools/View/View_Tools.hxx @@ -24,6 +24,9 @@ #include #include +#include +#include + class View_Window; class QAction; @@ -44,6 +47,11 @@ public: Standard_EXPORT static QAction* CreateAction (const QString& theText, const char* theSlot, QObject* theParent, QObject* theContext); + + //! Gets current viewer from the context and returns active view of the viewer + //! \return view or NULL + Standard_EXPORT static Handle(V3d_View) FindActiveView (const Handle(AIS_InteractiveContext)& theContext); + //! Save state of three view in a container in form: key, value. It saves: //! - visibiblity of columns, //! - columns width diff --git a/tools/View/View_Viewer.cxx b/tools/View/View_Viewer.cxx index 1b2ed6c105..04907e1479 100644 --- a/tools/View/View_Viewer.cxx +++ b/tools/View/View_Viewer.cxx @@ -19,6 +19,13 @@ #include #include +//#define USE_CLIPPLANE + +#ifdef USE_CLIPPLANE +#include +#include +#endif + // ======================================================================= // function : CreateView // purpose : @@ -26,7 +33,15 @@ void View_Viewer::CreateView() { if (myView.IsNull()) + { myView = myContext->CurrentViewer()->CreateView(); + +#ifdef USE_CLIPPLANE + gp_Pln aPln (gp_Pnt (50, 0, 0), gp_Dir (-1., 0., 0.)); + Handle(Graphic3d_ClipPlane) aClipPlane = new Graphic3d_ClipPlane(aPln); + myView->AddClipPlane (aClipPlane); +#endif + } } // ======================================================================= @@ -41,26 +56,38 @@ void View_Viewer::SetWindow(const Handle(Aspect_Window)& theWindow) } // ======================================================================= -// function : InitStandardViewer +// function : InitViewer +// purpose : +// ======================================================================= +void View_Viewer::InitViewer (const Handle(AIS_InteractiveContext)& theContext) +{ + myContext = theContext; + myViewer = myContext->CurrentViewer(); +} + +// ======================================================================= +// function : CreateStandardViewer // purpose : // ======================================================================= -void View_Viewer::InitStandardViewer() +Handle(AIS_InteractiveContext) View_Viewer::CreateStandardViewer() { Handle(Aspect_DisplayConnection) aDisplayConnection = new Aspect_DisplayConnection(); static Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver (aDisplayConnection); #if OCC_VERSION_HEX > 0x060901 - myViewer = new V3d_Viewer (aGraphicDriver); + Handle(V3d_Viewer) aViewer = new V3d_Viewer (aGraphicDriver); #else TCollection_AsciiString a3DName ("Visu3D"); - myViewer = new V3d_Viewer (aGraphicDriver, a3DName.ToExtString(), "", 1000.0, V3d_XposYnegZpos, Quantity_NOC_GRAY30, - V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT, Standard_True, Standard_False); + Handle(V3d_Viewer) aViewer = new V3d_Viewer (aGraphicDriver, a3DName.ToExtString(), "", 1000.0, V3d_XposYnegZpos, + Quantity_NOC_GRAY30, V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT, Standard_True, Standard_False); #endif - myViewer->SetDefaultLights(); - myViewer->SetLightOn(); - myViewer->SetDefaultBackgroundColor (Quantity_NOC_GRAY30); + aViewer->SetDefaultLights(); + aViewer->SetLightOn(); + aViewer->SetDefaultBackgroundColor (Quantity_NOC_GRAY30); + + Handle(AIS_InteractiveContext) aContext = new AIS_InteractiveContext (aViewer); + aContext->UpdateCurrentViewer(); - myContext = new AIS_InteractiveContext (myViewer); - myContext->UpdateCurrentViewer(); + return aContext; } diff --git a/tools/View/View_Viewer.hxx b/tools/View/View_Viewer.hxx index b05550f76a..d7cf147164 100644 --- a/tools/View/View_Viewer.hxx +++ b/tools/View/View_Viewer.hxx @@ -50,7 +50,11 @@ public: //! Creates OCC components on the window //! \param theWindowHandle an id of the application window - Standard_EXPORT void InitStandardViewer(); + Standard_EXPORT void InitViewer (const Handle(AIS_InteractiveContext)& theContext); + + //! Creates OCC components on the window + //! \param theWindowHandle an id of the application window + Standard_EXPORT static Handle(AIS_InteractiveContext) CreateStandardViewer(); //! Returns an OCC viewer const Handle(V3d_Viewer)& GetViewer() { return myViewer; } diff --git a/tools/View/View_Widget.cxx b/tools/View/View_Widget.cxx index 33230ef59d..3662857967 100644 --- a/tools/View/View_Widget.cxx +++ b/tools/View/View_Widget.cxx @@ -63,16 +63,25 @@ // function : Constructor // purpose : // ======================================================================= -View_Widget::View_Widget (QWidget* theParent, const bool isFitAllActive) +View_Widget::View_Widget (QWidget* theParent, + const Handle(AIS_InteractiveContext)& theContext, + const bool isFitAllActive) : QWidget (theParent), myCurrentMode (View_CurrentAction3d_Nothing), myFirst (true), myDefaultWidth (-1), myDefaultHeight (-1), myViewIsEnabled (true), myXmin (0), myYmin (0), myXmax (0), myYmax (0), myDragButtonDownX (0), myDragButtonDownY (0), myDragMultiButtonDownX (0), myDragMultiButtonDownY (0), myIsRectVisible (false), myRectBand (0), myHasInitProj (Standard_False), myInitVx (0), myInitVy (0), myInitVz (0) { myViewer = new View_Viewer (View_Viewer::DefaultColor()); - myViewer->InitStandardViewer(); + if (!theContext.IsNull()) + myViewer->InitViewer (theContext); + else + { + myViewer->InitViewer (myViewer->CreateStandardViewer()); - myViewer->GetContext()->Display(new AIS_Trihedron (new Geom_Axis2Placement (gp::XOY())), Standard_True); + Handle(AIS_Trihedron) aTrihedron = new AIS_Trihedron (new Geom_Axis2Placement (gp::XOY())); + aTrihedron->SetDatumDisplayMode (Prs3d_DM_Shaded); + myViewer->GetContext()->Display (aTrihedron, Standard_True); + } setAttribute (Qt::WA_PaintOnScreen); setAttribute (Qt::WA_NoSystemBackground); @@ -420,6 +429,7 @@ void View_Widget::processLeftButtonDown (const int theFlags, const QPoint thePoi } } activateCursor (myCurrentMode); + emit leftButtonDown(thePoint.x(), thePoint.y()); } // ======================================================================= @@ -513,8 +523,10 @@ void View_Widget::processLeftButtonUp (const int theFlags, const QPoint thePoint myDragMultiButtonDownX = 0; myDragMultiButtonDownY = 0; + myCurrentMode = View_CurrentAction3d_Nothing; activateCursor (myCurrentMode); emit selectionChanged(); + emit leftButtonUp(thePoint.x(), thePoint.y()); } // ======================================================================= @@ -608,6 +620,7 @@ void View_Widget::processMouseMove (const int theFlags, const QPoint thePoint) else processMoveEvent (thePoint.x(), thePoint.y()); } + emit moveTo (thePoint.x(), thePoint.y()); } // ======================================================================= diff --git a/tools/View/View_Widget.hxx b/tools/View/View_Widget.hxx index 5e6ad9bacb..2693278f5d 100644 --- a/tools/View/View_Widget.hxx +++ b/tools/View/View_Widget.hxx @@ -74,7 +74,9 @@ protected: public: //! Constructor - Standard_EXPORT View_Widget (QWidget* theParent, const bool isFitAllActive); + Standard_EXPORT View_Widget (QWidget* theParent, + const Handle(AIS_InteractiveContext)& theContext, + const bool isFitAllActive); //! Destructor virtual ~View_Widget() {} @@ -125,6 +127,21 @@ signals: //! Sends a signal about selection change if the left mouse button is pressed and current action does not process it void selectionChanged(); + //! Sends a signal about moving to the point in the view + //! \param theX X mouse position in pixels + //! \param theY Y mouse position in pixels + void moveTo (const int theX, const int theY); + + //! Sends a signal about up the left mouse button down + //! \param theX X mouse position in pixels + //! \param theY Y mouse position in pixels + void leftButtonDown (const int theX, const int theY); + + //! Sends a signal about up the left mouse button up + //! \param theX X mouse position in pixels + //! \param theY Y mouse position in pixels + void leftButtonUp (const int theX, const int theY); + //! Sends a signal about display mode change void displayModeClicked(); diff --git a/tools/View/View_Window.cxx b/tools/View/View_Window.cxx index 98edc7485c..f4b6bd621b 100644 --- a/tools/View/View_Window.cxx +++ b/tools/View/View_Window.cxx @@ -43,14 +43,16 @@ const int DEFAULT_SPACING = 3; // function : Constructor // purpose : // ======================================================================= -View_Window::View_Window (QWidget* theParent, const bool isUseKeepView, const bool isFitAllActive) +View_Window::View_Window (QWidget* theParent, + const Handle(AIS_InteractiveContext)& theContext, + const bool isUseKeepView, const bool isFitAllActive) : QWidget (theParent) { QGridLayout* aViewLayout = new QGridLayout (this); aViewLayout->setContentsMargins (0, 0, 0, 0); aViewLayout->setSpacing (DEFAULT_SPACING); - myView = new View_Widget (this, isFitAllActive); + myView = new View_Widget (this, theContext, isFitAllActive); myViewToolBar = new View_ToolBar (this, isUseKeepView); aViewLayout->addWidget (myViewToolBar->GetControl(), 0, 0, 1, 2); connect (myViewToolBar, SIGNAL (contextChanged()), this, SLOT (onViewSelectorActivated())); diff --git a/tools/View/View_Window.hxx b/tools/View/View_Window.hxx index 91eb8018c1..57e95337f4 100644 --- a/tools/View/View_Window.hxx +++ b/tools/View/View_Window.hxx @@ -40,7 +40,9 @@ class View_Window : public QWidget public: //! Constructor - Standard_EXPORT View_Window (QWidget* theParent, const bool isUseKeepView = true, const bool isFitAllActive = true); + Standard_EXPORT View_Window (QWidget* theParent, + const Handle(AIS_InteractiveContext)& theContext = Handle(AIS_InteractiveContext)(), + const bool isUseKeepView = true, const bool isFitAllActive = true); //! Destructor virtual ~View_Window() {} diff --git a/tools/ViewControl/FILES b/tools/ViewControl/FILES index 432c6f8adf..8c21c99ce9 100644 --- a/tools/ViewControl/FILES +++ b/tools/ViewControl/FILES @@ -1,5 +1,31 @@ +ViewControl.hxx +ViewControl_ColorSelector.cxx +ViewControl_ColorSelector.hxx +ViewControl_EditType.hxx ViewControl_MessageDialog.cxx ViewControl_MessageDialog.hxx +ViewControl_Pane.hxx +ViewControl_PaneCreator.cxx +ViewControl_PaneCreator.hxx +ViewControl_PaneItem.hxx +ViewControl_PropertiesStream.cxx +ViewControl_PropertiesStream.hxx +ViewControl_PropertyView.cxx +ViewControl_PropertyView.hxx +ViewControl_Table.cxx +ViewControl_Table.hxx +ViewControl_TableDoubleVector.cxx +ViewControl_TableDoubleVector.hxx +ViewControl_TableItemDelegate.cxx +ViewControl_TableItemDelegate.hxx +ViewControl_TableModel.cxx +ViewControl_TableModel.hxx +ViewControl_TableModelValues.cxx +ViewControl_TableModelValues.hxx +ViewControl_TableModelValuesDefault.cxx +ViewControl_TableModelValuesDefault.hxx ViewControl_Tools.cxx ViewControl_Tools.hxx -ViewControl_TreeView.hxx \ No newline at end of file +ViewControl_TransientShape.cxx +ViewControl_TransientShape.hxx +ViewControl_TreeView.hxx diff --git a/tools/ViewControl/ViewControl.hxx b/tools/ViewControl/ViewControl.hxx new file mode 100644 index 0000000000..1ea5334638 --- /dev/null +++ b/tools/ViewControl/ViewControl.hxx @@ -0,0 +1,33 @@ +// 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 diff --git a/tools/ViewControl/ViewControl_ColorSelector.cxx b/tools/ViewControl/ViewControl_ColorSelector.cxx new file mode 100644 index 0000000000..5129c89d96 --- /dev/null +++ b/tools/ViewControl/ViewControl_ColorSelector.cxx @@ -0,0 +1,608 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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 +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//! Kinds of delegate cell in OCCT Color model to present a custom presentation (rect bounded by a colored frame) +enum ViewControl_ColorDelegateKind +{ + ViewControl_ColorDelegateKind_None, //!< usual item + ViewControl_ColorDelegateKind_Activated, //!< active item + ViewControl_ColorDelegateKind_Highlighted, //!< highlighted item + ViewControl_ColorDelegateKind_Selected //!< selected item +}; + +//! Model for a table of parameters: Current Color, Red, Green, Blue, Alpha, OCCT color name +class ViewControl_ParametersModel : public ViewControl_TableModelValues +{ +public: + ViewControl_ParametersModel (ViewControl_ColorSelector* theSelector) + : ViewControl_TableModelValues(), mySelector (theSelector) {} + virtual ~ViewControl_ParametersModel() {} + + //! Inits model by the parameter color + //! \param theColor model active color + void SetColor (const Quantity_ColorRGBA& theColor, ViewControl_TableModel* theModel) + { myColor = theColor; theModel->EmitLayoutChanged(); } + + //! Returns current selected color + //! \return color value + Quantity_ColorRGBA GetColor() const { return myColor; } + + //! Returns item information(short) for display role. + //! \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 Standard_OVERRIDE + { + if (theRole == Qt::BackgroundRole && theColumn == 1 && theRow == 0) + return ViewControl_ColorSelector::ColorToQColor (myColor); + + if (theRole == Qt::ForegroundRole && theColumn == 1 && theRow >= 2 && theRow <= 5) + return ViewControl_TableModelValues::EditCellColor(); + + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return isFirstColumn ? QVariant ("Color") : QVariant (); + case 1: + { + if (isFirstColumn) + return QVariant ("Name"); + Quantity_NameOfColor aColorName; + if (ViewControl_ColorSelector::IsExactColorName(myColor, aColorName)) + return Quantity::NameOfColorToString (aColorName); + } + break; + case 2: return isFirstColumn ? QVariant ("Red") : ViewControl_Tools::ToVariant (myColor.GetRGB().Red()); + case 3: return isFirstColumn ? QVariant ("Green") : ViewControl_Tools::ToVariant (myColor.GetRGB().Green()); + case 4: return isFirstColumn ? QVariant ("Blue") : ViewControl_Tools::ToVariant (myColor.GetRGB().Blue()); + case 5: return isFirstColumn ? QVariant ("Alpha") : ViewControl_Tools::ToVariant (myColor.Alpha()); + case 6: return isFirstColumn ? QVariant ("Near Name") + : Quantity::NameOfColorToString (myColor.GetRGB().Name()); + } + return QVariant(); + } + + //! Sets content of the model index for the given role, it is applyed to internal container of values + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return true if the value is changed + virtual bool SetData (const int theRow, const int theColumn, const QVariant& theValue, int) + { + if (theColumn != 1 || theRow < 2 || theRow > 5) + return false; + + switch (theRow) + { + case 2: + case 3: + case 4: + { + myColor.ChangeRGB().SetValues (theRow == 2 ? ViewControl_Tools::ToShortRealValue (theValue) : myColor.GetRGB().Red(), + theRow == 3 ? ViewControl_Tools::ToShortRealValue (theValue) : myColor.GetRGB().Green(), + theRow == 4 ? ViewControl_Tools::ToShortRealValue (theValue) : myColor.GetRGB().Blue(), + Quantity_TOC_RGB); + } + break; + case 5: myColor.SetAlpha (ViewControl_Tools::ToShortRealValue (theValue)); break; + } + mySelector->ParameterColorChanged(); + return true; + } + + //! Returns number of tree level line items = colums in table view + virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE + { (void)theParent; return 2; } + + //! Returns onlly one row in table view + virtual int RowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE + { (void)theParent; return 7; } + + //! Returns editable flag for color RGB and alpha rows + //! \return flags + Qt::ItemFlags Flags (const QModelIndex& theIndex) const + { + Qt::ItemFlags aFlags = ViewControl_TableModelValues::Flags (theIndex); + + if (theIndex.column() == 1 && theIndex.row() >= 2 && theIndex.row() <= 5) + aFlags = aFlags | Qt::ItemIsEditable; + + return aFlags; + } + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetEditType (const int theRow, const int theColumn) const + { + if (theColumn == 1 && theRow >= 2 && theRow <= 5) + return ViewControl_EditType_Double; + + return ViewControl_EditType_None; + } + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetEnumValues (const int theRow, const int theColumn) const + { + if (theColumn == 1 && theRow >= 2 && theRow <= 5) + { + QList aValues; + aValues << 0 << 1 << 6; + return aValues; + } + return QList(); + } + +private: + Quantity_ColorRGBA myColor; + ViewControl_ColorSelector* mySelector; +}; + +//! Table of parameters: Red, Green, Blue, Alpha, OCCT color name +class ViewControl_OCCTColorModel : public QAbstractTableModel +{ +public: + ViewControl_OCCTColorModel (QObject* theParent) + : QAbstractTableModel (theParent), myCurrentIndexKind (ViewControl_ColorDelegateKind_None) {} + virtual ~ViewControl_OCCTColorModel() {} + + //! Sets current color, that should have custom presented + //! \param theColor current color + //! \param theKind presentation kind + void SetColor (const Quantity_NameOfColor& theColor, const ViewControl_ColorDelegateKind theKind) + { + int aColorPosition = (int)theColor; + int aRow = (int) (aColorPosition / columnCount()); + int aColumn = aColorPosition - aRow * columnCount(); + myCurrentIndex = index (aRow, aColumn); + myCurrentIndexKind = theKind; + + emit layoutChanged(); + } + + //! Returns OCCT name of color if index position does not exceed Quantity_NameOfColor elements + //! \param theIndex model index + //! \param theNameOfColor [out] OCCT color name + //! \return true if the color is found + bool GetOCCTColor (const QModelIndex& theIndex, Quantity_NameOfColor& theNameOfColor) const + { + int aNameOfColorId = theIndex.row() * columnCount() + theIndex.column(); + if (aNameOfColorId > Quantity_NOC_WHITE) + return false; + theNameOfColor = (Quantity_NameOfColor)aNameOfColorId; + return true; + } + + //! Returns index that has custom presentation + //! \return model index + QModelIndex GetCurrentIndex() const { return myCurrentIndex; } + + //! Returns index color kind that has custom presentation + //! \return kind + ViewControl_ColorDelegateKind GetCurrentIndexKind() const { return myCurrentIndexKind; } + + //! Returns item information(short) for display role. + //! \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 + { + if (theRole != Qt::ToolTipRole) // background is processed in table item delegate + return QVariant(); + + Quantity_NameOfColor aNameOfColor; + if (!GetOCCTColor (theIndex, aNameOfColor)) + return QVariant(); + + if (theRole == Qt::ToolTipRole) + return QString("%1 (%2)").arg(Quantity::NameOfColorToString (aNameOfColor)) + .arg (ViewControl_ColorSelector::ColorToString (Quantity_Color (aNameOfColor))); + return QVariant(); + } + + //! Returns number of tree level line items = colums in table view + virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE + { (void)theParent; return 26; } + + //! Returns onlly one row in table view + virtual int rowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE + { (void)theParent; return 20; } + + //! Returns color for the delegate kind + //! \param theKind kind + //! \return color + static QColor GetKindColor (const ViewControl_ColorDelegateKind theKind) + { + switch (theKind) + { + case ViewControl_ColorDelegateKind_Activated: + case ViewControl_ColorDelegateKind_Highlighted: return Qt::blue; + case ViewControl_ColorDelegateKind_Selected: return Qt::black; + default: break; + } + return QColor(); + } + +private: + QModelIndex myCurrentIndex; //!< index to be presented through item delegate + ViewControl_ColorDelegateKind myCurrentIndexKind; //!< kind of custom item +}; + +//! \class DFBrowser_HighlightDelegate +//! \brief An item delegate to paint in highlight color the cell when the mouse cursor is over it +class ViewControl_OCCTColorDelegate : public QItemDelegate +{ +public: + + //! Constructor + ViewControl_OCCTColorDelegate (QObject* theParent = 0) : QItemDelegate (theParent) {} + + //! Destructor + virtual ~ViewControl_OCCTColorDelegate() Standard_OVERRIDE {} + + //! Redefine of the parent virtual method to color the cell rectangle in highlight style + //! \param thePainter a painter + //! \param theOption a paint options + //! \param theIndex a view index + virtual void paint (QPainter* thePainter, const QStyleOptionViewItem& theOption, + const QModelIndex& theIndex) const Standard_OVERRIDE + { + QRect aBaseRect = theOption.rect; + int aNameOfColorId = theIndex.row() * theIndex.model()->columnCount(theIndex) + theIndex.column(); + Quantity_NameOfColor aNameOfColor = Quantity_NOC_WHITE; + if (aNameOfColorId < (int)Quantity_NOC_WHITE) + aNameOfColor = (Quantity_NameOfColor)aNameOfColorId; + + Quantity_Color anOCCTColor (aNameOfColor); + QColor aQColor = ViewControl_ColorSelector::ColorToQColor (Quantity_ColorRGBA (anOCCTColor)); + thePainter->fillRect (aBaseRect, aQColor); + + QColor aColor; + // highlight cell + if (theOption.state & QStyle::State_MouseOver) + aColor = ViewControl_OCCTColorModel::GetKindColor (ViewControl_ColorDelegateKind_Highlighted); + else + { + const ViewControl_OCCTColorModel* aTableModel = dynamic_cast (theIndex.model()); + QModelIndex anIndex = aTableModel->GetCurrentIndex(); + if (anIndex.isValid() && anIndex.row() == theIndex.row() && anIndex.column() == theIndex.column()) + aColor = ViewControl_OCCTColorModel::GetKindColor (aTableModel->GetCurrentIndexKind()); + } + + if (aColor.isValid()) + { + int aRectSize = 2; + thePainter->fillRect (QRect (aBaseRect.topLeft(), QPoint (aBaseRect.bottomLeft().x() + aRectSize, aBaseRect.bottomLeft().y())), + aColor); + thePainter->fillRect (QRect (QPoint (aBaseRect.topRight().x() - aRectSize, aBaseRect.topRight().y()), aBaseRect.bottomRight()), + aColor); + thePainter->fillRect (QRect (QPoint (aBaseRect.topLeft().x() + aRectSize, aBaseRect.topLeft().y()), + QPoint (aBaseRect.topRight().x() - aRectSize, aBaseRect.topRight().y() + aRectSize)), + aColor); + thePainter->fillRect (QRect (QPoint (aBaseRect.bottomLeft().x() + aRectSize, aBaseRect.bottomLeft().y() - aRectSize), + QPoint (aBaseRect.bottomRight().x() - aRectSize, aBaseRect.bottomRight().y())), + aColor); + } + } +}; + +//! Color picker class +class ViewControl_ColorPicker : public QWidget +{ +public: + ViewControl_ColorPicker (QWidget* theParent) : QWidget (theParent) {} + virtual ~ViewControl_ColorPicker() {} +}; + + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= + +ViewControl_ColorSelector::ViewControl_ColorSelector (QWidget* theParent) +: QDialog (theParent) +{ + QGridLayout* aLayout = new QGridLayout (this); + aLayout->setContentsMargins (0, 0, 0, 0); + + myParameters = new QTableView (this); + ViewControl_TableModel* aTableModel = new ViewControl_TableModel (myParameters); + aTableModel->SetModelValues (new ViewControl_ParametersModel (this)); + myParameters->setModel(aTableModel); + + ViewControl_TableItemDelegate* anItemDelegate = new ViewControl_TableItemDelegate(); + anItemDelegate->SetModelValues (aTableModel->GetModelValues()); + myParameters->setItemDelegate(anItemDelegate); + + myParameters->verticalHeader()->setDefaultSectionSize (myParameters->verticalHeader()->minimumSectionSize()); + myParameters->verticalHeader()->setVisible (false); + myParameters->horizontalHeader()->setVisible (false); + myParameters->setMinimumHeight (myParameters->verticalHeader()->minimumSectionSize() * aTableModel->rowCount() + + TreeModel_Tools::HeaderSectionMargin()); + + QItemSelectionModel* aSelectionModel = new QItemSelectionModel (myParameters->model()); + myParameters->setSelectionMode (QAbstractItemView::SingleSelection); + myParameters->setSelectionModel (aSelectionModel); + connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)), + this, SLOT (onParametersTableSelectionChanged (const QItemSelection&, const QItemSelection&))); + + aLayout->addWidget (myParameters, 0, 0); + + myColorPicker = new ViewControl_ColorPicker (this); + aLayout->addWidget (myColorPicker, 0, 1); + + myOCCTColors = new QTableView (this); + myOCCTColors->setFixedSize (525, 405); + myOCCTColors->verticalHeader()->setDefaultSectionSize (20); + myOCCTColors->verticalHeader()->setVisible (false); + myOCCTColors->horizontalHeader()->setDefaultSectionSize (20); + myOCCTColors->horizontalHeader()->setVisible (false); + myOCCTColors->setModel(new ViewControl_OCCTColorModel(myOCCTColors)); + + myOCCTColors->viewport()->setAttribute (Qt::WA_Hover); + myOCCTColors->setItemDelegate (new ViewControl_OCCTColorDelegate (myOCCTColors)); + + aSelectionModel = new QItemSelectionModel (myOCCTColors->model()); + myOCCTColors->setSelectionMode (QAbstractItemView::SingleSelection); + myOCCTColors->setSelectionModel (aSelectionModel); + connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)), + this, SLOT (onOCCTColorsTableSelectionChanged (const QItemSelection&, const QItemSelection&))); + aLayout->addWidget (myOCCTColors, 1, 0, 1, 2); + + myDialogButtons = new QDialogButtonBox (QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); + connect(myDialogButtons, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(myDialogButtons, &QDialogButtonBox::rejected, this, &QDialog::reject); + + aLayout->addWidget(myDialogButtons, 2, 0, 1, 2); +} + +// ======================================================================= +// function : SetColor +// purpose : +// ======================================================================= + +void ViewControl_ColorSelector::SetColor (const QString& theColor) +{ + Quantity_ColorRGBA aColor = StringToColorRGBA (theColor); + // parameters model + ViewControl_TableModel* aTableModel = dynamic_cast (myParameters->model()); + ViewControl_ParametersModel* aParametersModel = dynamic_cast (aTableModel->GetModelValues()); + aParametersModel->SetColor (aColor, aTableModel); + + // OCCT color model + Quantity_NameOfColor aColorName; + bool isExactColorName = ViewControl_ColorSelector::IsExactColorName(aColor, aColorName); + ViewControl_OCCTColorModel* anOCCTColorModel = dynamic_cast(myOCCTColors->model()); + anOCCTColorModel->SetColor (aColorName, isExactColorName ? ViewControl_ColorDelegateKind_Selected + : ViewControl_ColorDelegateKind_Activated); +} + +// ======================================================================= +// function : GetColor +// purpose : +// ======================================================================= + +QString ViewControl_ColorSelector::GetColor() const +{ + ViewControl_TableModel* aTableModel = dynamic_cast (myParameters->model()); + ViewControl_ParametersModel* aParametersModel = dynamic_cast (aTableModel->GetModelValues()); + + return ColorToString (aParametersModel->GetColor()); +} + +// ======================================================================= +// function : ParameterColorChanged +// purpose : +// ======================================================================= + +void ViewControl_ColorSelector::ParameterColorChanged() +{ + ViewControl_TableModel* aTableModel = dynamic_cast (myParameters->model()); + ViewControl_ParametersModel* aParametersModel = dynamic_cast (aTableModel->GetModelValues()); + Quantity_ColorRGBA aColor = aParametersModel->GetColor(); + + // OCCT color model + Quantity_NameOfColor aColorName; + bool isExactColorName = ViewControl_ColorSelector::IsExactColorName(aColor, aColorName); + ViewControl_OCCTColorModel* anOCCTColorModel = dynamic_cast(myOCCTColors->model()); + anOCCTColorModel->SetColor (aColorName, isExactColorName ? ViewControl_ColorDelegateKind_Selected + : ViewControl_ColorDelegateKind_Activated); +} + +// ======================================================================= +// function : ColorToString +// purpose : +// ======================================================================= + +QString ViewControl_ColorSelector::ColorToString (const Quantity_Color& theColor) +{ + Standard_Real aRed, aGreen, aBlue; + theColor.Values (aRed, aGreen, aBlue, Quantity_TOC_RGB); + return QString::number (aRed) + ViewControl_ColorSelector::ColorSeparator() + + QString::number (aGreen) + ViewControl_ColorSelector::ColorSeparator() + + QString::number (aBlue); +} + +// ======================================================================= +// function : ColorToString +// purpose : +// ======================================================================= + +QString ViewControl_ColorSelector::ColorToString (const Quantity_ColorRGBA& theColor) +{ + const Quantity_Color& aRGBColor = theColor.GetRGB(); + Standard_ShortReal anAlpha = theColor.Alpha(); + + return ColorToString (aRGBColor) + ViewControl_ColorSelector::ColorSeparator() + QString::number (anAlpha); +} + +// ======================================================================= +// function : ColorToQColor +// purpose : +// ======================================================================= + +QColor ViewControl_ColorSelector::ColorToQColor (const Quantity_Color& theColor) +{ + int aDelta = 255; + + Standard_Real aRed, aGreen, aBlue; + theColor.Values (aRed, aGreen, aBlue, Quantity_TOC_RGB); + + return QColor((int)(aRed * aDelta), (int)(aGreen * aDelta), (int)(aBlue * aDelta)); +} + +// ======================================================================= +// function : ColorToQColor +// purpose : +// ======================================================================= + +QColor ViewControl_ColorSelector::ColorToQColor (const Quantity_ColorRGBA& theColor) +{ + int aDelta = 255; + + Standard_Real aRed, aGreen, aBlue; + theColor.GetRGB().Values (aRed, aGreen, aBlue, Quantity_TOC_RGB); + + return QColor((int)(aRed * aDelta), (int)(aGreen * aDelta), (int)(aBlue * aDelta)); +} + +// ======================================================================= +// function : StringToColor +// purpose : +// ======================================================================= + +Quantity_Color ViewControl_ColorSelector::StringToColor (const QString& theColor, Standard_ShortReal& theAlpha) +{ + Quantity_ColorRGBA aColorGRBA = StringToColorRGBA (theColor); + theAlpha = aColorGRBA.Alpha(); + return aColorGRBA.GetRGB(); +} + +// ======================================================================= +// function : StringToColor +// purpose : +// ======================================================================= + +Quantity_Color ViewControl_ColorSelector::StringToColor (const QString& theColor) +{ + return StringToColorRGBA (theColor).GetRGB(); +} + +// ======================================================================= +// function : StringToColorRGBA +// purpose : +// ======================================================================= + +Quantity_ColorRGBA ViewControl_ColorSelector::StringToColorRGBA (const QString& theColor) +{ + float anAlpha = 1.0f; + + QStringList aList = theColor.split (ViewControl_ColorSelector::ColorSeparator(), QString::SkipEmptyParts); + if (aList.size() < 3) + return Quantity_ColorRGBA(); + + if (aList.size() == 4) + anAlpha = aList[3].toFloat(); + + return Quantity_ColorRGBA (aList[0].toFloat(), aList[1].toFloat(), aList[2].toFloat(), anAlpha); +} + +// ======================================================================= +// function : onParametersTableSelectionChanged +// purpose : +// ======================================================================= + +Standard_Boolean ViewControl_ColorSelector::IsExactColorName (const Quantity_ColorRGBA& theColor, + Quantity_NameOfColor& theColorName) +{ + theColorName = theColor.GetRGB().Name(); + return Quantity_Color (theColorName).IsEqual (theColor.GetRGB()); +} + +// ======================================================================= +// function : onParametersTableSelectionChanged +// purpose : +// ======================================================================= + +void ViewControl_ColorSelector::onParametersTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection&) +{ + //Quantity_ColorRGBA aColor = StringToColorRGBA (theColor); + //// parameters model + //ViewControl_TableModel* aTableModel = dynamic_cast (myParameters->model()); + //ViewControl_ParametersModel* aParametersModel = dynamic_cast (aTableModel->GetModelValues()); + //aParametersModel->SetColor (aColor); + + //// OCCT color model + //Quantity_NameOfColor aColorName; + //bool isExactColorName = ViewControl_ColorSelector::IsExactColorName(aColor, aColorName); + //ViewControl_OCCTColorModel* anOCCTColorModel = dynamic_cast(myOCCTColors->model()); + //anOCCTColorModel->SetColor (aColorName, isExactColorName ? ViewControl_ColorDelegateKind_Selected + // : ViewControl_ColorDelegateKind_Activated); +} + +// ======================================================================= +// function : onOCCTColorsTableSelectionChanged +// purpose : +// ======================================================================= + +void ViewControl_ColorSelector::onOCCTColorsTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection&) +{ + QModelIndexList aSelectedIndices = theSelected.indexes(); + if (aSelectedIndices.size() != 1) + return; + + ViewControl_OCCTColorModel* anOCCTColorModel = dynamic_cast(myOCCTColors->model()); + Quantity_NameOfColor aNameOfColor; + if (!anOCCTColorModel->GetOCCTColor (aSelectedIndices.first(), aNameOfColor)) + return; + + anOCCTColorModel->SetColor (aNameOfColor, ViewControl_ColorDelegateKind_Selected); + + // parameters model + ViewControl_TableModel* aTableModel = dynamic_cast (myParameters->model()); + ViewControl_ParametersModel* aParametersModel = dynamic_cast (aTableModel->GetModelValues()); + Quantity_Color anOCCTColor (aNameOfColor); + aParametersModel->SetColor (Quantity_ColorRGBA (anOCCTColor), aTableModel); +} diff --git a/tools/ViewControl/ViewControl_ColorSelector.hxx b/tools/ViewControl/ViewControl_ColorSelector.hxx new file mode 100644 index 0000000000..ad4c8dc3db --- /dev/null +++ b/tools/ViewControl/ViewControl_ColorSelector.hxx @@ -0,0 +1,120 @@ +// Created on: 2018-08-16 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2018 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_ColorSelector_H +#define ViewControl_ColorSelector_H + +#include + +#include + +#include +#include +#include +//#include +#include +#include +#include +#include + +class ViewControl_ColorPicker; +class QDialogButtonBox; +class QTableView; + +//! \class ViewControl_ColorSelector +//! \brief Selector of OCCT color +class VIEWCONTROL_EXPORT ViewControl_ColorSelector : public QDialog +{ + Q_OBJECT +public: + + //! Constructor + ViewControl_ColorSelector (QWidget* theParent); + + //! Destructor + virtual ~ViewControl_ColorSelector() Standard_OVERRIDE {} + + //! Inits control by the color value + //! \param theColor text color value + void SetColor (const QString& theColor); + + //! Returns current selected color value + //! \return text color value + QString GetColor() const; + + //! Updates OCCT color model by changing color in parameter model + void ParameterColorChanged(); + + //! Converts color to string value in form: r;g;b + //! \param theColor color value + //! \return text value + static QString ColorToString (const Quantity_Color& theColor); + + //! Converts color to string value in form: r;g;b;alpha + //! \param theColor color value + //! \return text value + static QString ColorToString (const Quantity_ColorRGBA& theColor); + + //! Converts color to QColor value in form: r;g;b + //! \param theColor color value + //! \return qt color value + static QColor ColorToQColor (const Quantity_Color& theColor); + + //! Converts color to QColor value in form: r;g;b;a + //! \param theColor color value + //! \return qt color value + static QColor ColorToQColor (const Quantity_ColorRGBA& theColor); + + //! Converts string to color value from a form: r;g;b;a + //! \param theColor text color value + //! \return color value + static Quantity_Color StringToColor (const QString& theColor, Standard_ShortReal& theAlpha); + + //! Converts string to color value from a form: r;g;b + //! \param theColor text color value + //! \return color value + static Quantity_Color StringToColor (const QString& theColor); + + //! Converts string to color value from a form: r;g;b;a + //! \param theColor text color value + //! \return color value + static Quantity_ColorRGBA StringToColorRGBA (const QString& theColor); + + static Standard_Boolean IsExactColorName (const Quantity_ColorRGBA& theColor, + Quantity_NameOfColor& theColorName); + +private: + //! Returns symbol used as a separtor of color components in string conversion + //! \return symbol value + static QString ColorSeparator() { return ";"; } + +private slots: + //! Slots listen selection change and update the current control content by selection + //! \param theSelected container of selected items + //! \param theDeselected container of items that become deselected + void onParametersTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected); + + //! Slots listen selection change and update the current control content by selection + //! \param theSelected container of selected items + //! \param theDeselected container of items that become deselected + void onOCCTColorsTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected); + +private: + QTableView* myParameters; //! current color parameters (RGB, alpha, color name) + ViewControl_ColorPicker* myColorPicker; //! color picker + QTableView* myOCCTColors; //! OCCT color values + QDialogButtonBox* myDialogButtons; //! OK/Cancel buttons +}; +#endif diff --git a/tools/ViewControl/ViewControl_EditType.hxx b/tools/ViewControl/ViewControl_EditType.hxx new file mode 100644 index 0000000000..92fba8084e --- /dev/null +++ b/tools/ViewControl/ViewControl_EditType.hxx @@ -0,0 +1,33 @@ +// 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_EditType_H +#define ViewControl_EditType_H + +//! Type of context used in a tool library +enum ViewControl_EditType +{ + ViewControl_EditType_None, //!< View widget is null + ViewControl_EditType_Bool, //!< check box widget + ViewControl_EditType_Color, //!< color selector widget + ViewControl_EditType_Combo, //!< combo box widget + ViewControl_EditType_Double, //!< line edit widget used double validator + ViewControl_EditType_Line, //!< line edit widget + ViewControl_EditType_Spin, //!< spin box widget + ViewControl_EditType_DoubleVector, //!< control to enter three double values + ViewControl_EditType_DoAction //!< control to perform the row action +}; + +#endif diff --git a/tools/ViewControl/ViewControl_Pane.hxx b/tools/ViewControl/ViewControl_Pane.hxx new file mode 100644 index 0000000000..b538fadf24 --- /dev/null +++ b/tools/ViewControl/ViewControl_Pane.hxx @@ -0,0 +1,87 @@ +// Created on: 2018-12-08 +// 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_Pane_H +#define ViewControl_Pane_H + +#include +#include +#include + +#include + +#include +#include +#include +#include + +class ViewControl_PaneItem; + +//! \class ViewControl_PaneItem +//! Pane for getting/setting pane table values +//! +class ViewControl_Pane +{ +public: + + //! Returns number of table rows + //! \param theObject current pane object + //! \return an integer value + virtual int GetTableRowCount (const Handle(Standard_Transient)& theObject) const = 0; + + //! Returns table value for the row in form: + //! \param theObject current pane object + //! \param theRow a model index row + //! \param theColumn a model index column + virtual QVariant GetTableData (const Handle(Standard_Transient)& theObject, + const int theRow, const int theColumn, const int theRole) const = 0; + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theObject current pane object + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetTableEditType (const Handle(Standard_Transient)& theObject, + const int theRow, const int theColumn) const + { (void)theObject; (void)theRow; (void)theColumn; return ViewControl_EditType_None; } + + //! Returns container of string values for enumeration in the model row + //! \param theObject current pane object + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + virtual QList GetTableEnumValues (const Handle(Standard_Transient)& theObject, + const int theRow, const int theColumn) const + { (void)theObject; (void)theRow; (void)theColumn; return QList(); } + + //! Sets the value into the table cell. Only 1st column value might be modified. + //! \param theObject current pane object + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theValue a new cell value + virtual bool SetTableData (const Handle(Standard_Transient)& theObject, + const int theRow, const int theColumn, const QVariant& theValue) + { (void)theObject; (void)theRow; (void)theColumn; (void)theValue; return false; } + + //! Return selected element in the pane cell + //! \param theObject current pane object + //! \param theRow a model index row + //! \param theColumn a model index column + virtual ViewControl_PaneItem* GetSelected (const Handle(Standard_Transient)& theObject, + const int theRow, const int theColumn) + { (void)theObject; (void)theRow; (void)theColumn; return 0; } +}; + +#endif \ No newline at end of file diff --git a/tools/ViewControl/ViewControl_PaneCreator.cxx b/tools/ViewControl/ViewControl_PaneCreator.cxx new file mode 100644 index 0000000000..78098c805b --- /dev/null +++ b/tools/ViewControl/ViewControl_PaneCreator.cxx @@ -0,0 +1,18 @@ +// Created on: 2018-12-08 +// 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 + +IMPLEMENT_STANDARD_RTTIEXT(ViewControl_PaneCreator, Standard_Transient) diff --git a/tools/ViewControl/ViewControl_PaneCreator.hxx b/tools/ViewControl/ViewControl_PaneCreator.hxx new file mode 100644 index 0000000000..5418dbdc3e --- /dev/null +++ b/tools/ViewControl/ViewControl_PaneCreator.hxx @@ -0,0 +1,49 @@ +// Created on: 2018-12-08 +// 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_PaneCreator_H +#define ViewControl_PaneCreator_H + +#include +#include +#include +#include +#include + +class ViewControl_Pane; + +DEFINE_STANDARD_HANDLE (ViewControl_PaneCreator, Standard_Transient) + +//! \class ViewControl_PaneCreator +//! \brief An interface to create custom panes by transient object name. +class ViewControl_PaneCreator : public Standard_Transient +{ +public: + + //! Constructor + ViewControl_PaneCreator() {} + + //! Destructor + virtual ~ViewControl_PaneCreator() {} + + //! Creates pane for type + //! \param theName a type name + //! \return a pane if it can be created for this type or NULL + virtual ViewControl_Pane* GetPane (const Standard_CString& theName) = 0; + + DEFINE_STANDARD_RTTIEXT (ViewControl_PaneCreator, Standard_Transient) +}; + +#endif diff --git a/tools/ViewControl/ViewControl_PaneItem.hxx b/tools/ViewControl/ViewControl_PaneItem.hxx new file mode 100644 index 0000000000..e0c5f4387c --- /dev/null +++ b/tools/ViewControl/ViewControl_PaneItem.hxx @@ -0,0 +1,53 @@ +// Created on: 2018-12-08 +// 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_PaneItem_H +#define ViewControl_PaneItem_H + +#include +#include +#include + +#include + +//! \class ViewControl_PaneItem +//! Container of pane item information + +class ViewControl_PaneItem +{ +public: + + //! Returns shape of the item or NULL + //! \return shape instance + virtual TopoDS_Shape GetShape() { return myShape; } + + //! Sets shape + //! \param theShape shape instance + void SetShape (const TopoDS_Shape& theShape) { myShape = theShape; } + + //! Returns object or NULL + //! \return current object + virtual Handle(Standard_Transient) GetObject() { return myObject; } + + //! Sets object + //! \param theObject an object + virtual void SetObject (Handle(Standard_Transient)& theObject) { myObject = theObject; } + +protected: + TopoDS_Shape myShape; //!< current shape + Handle(Standard_Transient) myObject; //!< current object +}; + +#endif \ No newline at end of file diff --git a/tools/ViewControl/ViewControl_PropertiesStream.cxx b/tools/ViewControl/ViewControl_PropertiesStream.cxx new file mode 100644 index 0000000000..fd5ac5a3f0 --- /dev/null +++ b/tools/ViewControl/ViewControl_PropertiesStream.cxx @@ -0,0 +1,115 @@ +// Created on: 2019-04-28 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 +#include + +#include + +#include + +IMPLEMENT_STANDARD_RTTIEXT(ViewControl_PropertiesStream, TreeModel_ItemProperties) + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void ViewControl_PropertiesStream::Init() +{ + if (!getItem() || !myValues.IsEmpty()) + return; + + Standard_SStream aSStream; + getItem()->Dump (aSStream); + + Message::ConvertStream (aSStream, myColumnCount, myValues); +} + +// ======================================================================= +// function : Reset +// purpose : +// ======================================================================= + +void ViewControl_PropertiesStream::Reset() +{ + if (!getItem()) + return; + myValues.Clear(); + myColumnCount = 0; +} + +// ======================================================================= +// function : initItem +// purpose : +// ======================================================================= + +void ViewControl_PropertiesStream::initItem() const +{ + const_cast(this)->Init(); +} + +// ======================================================================= +// function : GetTableRowCount +// purpose : +// ======================================================================= + +int ViewControl_PropertiesStream::GetTableRowCount() const +{ + initItem(); + + return getValues().Length() / myColumnCount; +} + +// ======================================================================= +// function : GetTableData +// purpose : +// ======================================================================= + +QVariant ViewControl_PropertiesStream::GetTableData (const int theRow, const int theColumn, int theRole) const +{ + if (theRole != Qt::DisplayRole) + return QVariant(); + + initItem(); + + int anIndex = theRow * myColumnCount + theColumn; + if (theRole == Qt::DisplayRole && anIndex < getValues().Length()) + return getValues().Value(anIndex).ToCString(); + + return QVariant(); +} + +// ======================================================================= +// function : GetPresentations +// purpose : +// ======================================================================= + +void ViewControl_PropertiesStream::GetPresentations (const int theRow, + const int theColumn, + NCollection_List& thePresentations) +{ + if (theColumn == 0) + return; + + QVariant aValue = GetTableData (theRow, theColumn, Qt::DisplayRole); + TCollection_AsciiString aStrValue = aValue.toString().toStdString().c_str(); + + gp_XYZ aPoint; + if (!aPoint.FromString (aStrValue)) + return; + + thePresentations.Append (new ViewControl_TransientShape (BRepBuilderAPI_MakeVertex (aPoint))); +} diff --git a/tools/ViewControl/ViewControl_PropertiesStream.hxx b/tools/ViewControl/ViewControl_PropertiesStream.hxx new file mode 100644 index 0000000000..c1317d4190 --- /dev/null +++ b/tools/ViewControl/ViewControl_PropertiesStream.hxx @@ -0,0 +1,91 @@ +// Created on: 2019-04-28 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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_PropertiesStream_H +#define ViewControl_PropertiesStream_H + +#include +#include +#include +#include + +#include +#include + +DEFINE_STANDARD_HANDLE (ViewControl_PropertiesStream, TreeModel_ItemProperties) + +//! \class ViewControl_PropertiesStream +//! \brief This is an interace for ViewControl_TableModel to give real values of the model +//! It should be filled or redefined. +class ViewControl_PropertiesStream : public TreeModel_ItemProperties +{ +public: + + //! Constructor + Standard_EXPORT ViewControl_PropertiesStream (const TreeModel_ItemBasePtr& theItem) + : TreeModel_ItemProperties (theItem) {} + + //! Destructor + virtual ~ViewControl_PropertiesStream() {} + + //! If me has internal values, it should be initialized here. + Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! If the item has internal values, there should be reseted here. + Standard_EXPORT virtual void Reset() Standard_OVERRIDE; + + //! Returns number of table columns + //! \return an integer value + virtual int GetTableColumnCount() const { initItem(); return myColumnCount; } + + //! 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 GetTableRowCount() 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 theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return value intepreted depending on the given role + Standard_EXPORT virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole = Qt::DisplayRole) const Standard_OVERRIDE; + + //! Returns presentation of the attribute to be visualized in the view + //! \param theRow a model index row + //! \param theColumn a model index column + //! \thePresentations [out] container of presentation handles to be visualized + Standard_EXPORT virtual void GetPresentations (const int theRow, const int theColumn, + NCollection_List& thePresentations) Standard_OVERRIDE; + +protected: + //! Returns values + //! @return values + const NCollection_Vector& getValues() const { return myValues; } + +protected: + + //! Initialize me. + Standard_EXPORT void initItem() const; + +public: + DEFINE_STANDARD_RTTIEXT (ViewControl_PropertiesStream, TreeModel_ItemProperties) + +protected: + NCollection_Vector myValues; //!< container of values + Standard_Integer myColumnCount; //!< value to present container of values into table +}; + +#endif diff --git a/tools/ViewControl/ViewControl_PropertyView.cxx b/tools/ViewControl/ViewControl_PropertyView.cxx new file mode 100644 index 0000000000..f2f20c9213 --- /dev/null +++ b/tools/ViewControl/ViewControl_PropertyView.cxx @@ -0,0 +1,219 @@ +// 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 +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +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, const QSize& thePredefinedSize) +: QObject (theParent), myOwnSelectionChangeBlocked (false) +{ + myMainWidget = new ViewControl_Widget (theParent, QSize (1, 100)); + if (!thePredefinedSize.isEmpty()) + ((ViewControl_Widget*)myMainWidget)->SetPredefinedSize (thePredefinedSize); + + 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& 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 (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& 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 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 (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&))); + + 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(); +} diff --git a/tools/ViewControl/ViewControl_PropertyView.hxx b/tools/ViewControl/ViewControl_PropertyView.hxx new file mode 100644 index 0000000000..2cb6f75377 --- /dev/null +++ b/tools/ViewControl/ViewControl_PropertyView.hxx @@ -0,0 +1,99 @@ +// 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 +#include + +#include + +#include +#include +#include +#include + +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, const QSize& thePredefinedSize = QSize()); + + //! 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& 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& theTables); + + //! Clears selection in active tables + Standard_EXPORT void ClearActiveTablesSelection(); + +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 myTables; //!< table view, shown only first tables filled in Init method + QWidget* myCustomWidget; //!< custom view widget +}; +#endif diff --git a/tools/ViewControl/ViewControl_Table.cxx b/tools/ViewControl/ViewControl_Table.cxx new file mode 100644 index 0000000000..fee84d2c06 --- /dev/null +++ b/tools/ViewControl/ViewControl_Table.cxx @@ -0,0 +1,133 @@ +// 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 +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +// ======================================================================= +// 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); + + myTableView = new QTableView (myMainWidget); + myTableView->setVerticalScrollMode (QAbstractItemView::ScrollPerPixel); + + myTableView->setItemDelegate (new ViewControl_TableItemDelegate (theParent)); + + QHeaderView* aVHeader = myTableView->verticalHeader(); + int aDefCellSize = aVHeader->minimumSectionSize(); + aVHeader->setDefaultSectionSize (aDefCellSize); + + aLayout->addWidget (myTableView); +} + +// ======================================================================= +// function : SetModel +// purpose : +// ======================================================================= + +void ViewControl_Table::SetModel (QAbstractTableModel* theModel) +{ + myTableView->setModel (theModel); + + myTableView->setSelectionMode(QAbstractItemView::ExtendedSelection); + QItemSelectionModel* aSelectionModel = new QItemSelectionModel(theModel); + myTableView->setSelectionModel (aSelectionModel); +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= + +void ViewControl_Table::Init (ViewControl_TableModelValues* theModelValues) +{ + myTableView->selectionModel()->clearSelection(); + + ViewControl_TableModel* aModel = dynamic_cast (myTableView->model()); + aModel->SetModelValues (theModelValues); + + ViewControl_TableItemDelegate* aDelegate = dynamic_cast(myTableView->itemDelegate()); + aDelegate->SetModelValues (theModelValues); + + 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()); + + aModel->EmitLayoutChanged(); +} + +// ======================================================================= +// function : GetSelectedIndices +// purpose : +// ======================================================================= + +void ViewControl_Table::GetSelectedIndices (QMap>& theSelectedIndices) +{ + QModelIndexList aSelected = myTableView->selectionModel()->selectedIndexes(); + + int aRow, aColumn; + for (QModelIndexList::const_iterator anIt = aSelected.begin(); anIt != aSelected.end(); anIt++) + { + QModelIndex anIndex = *anIt; + aRow = anIndex.row(); + aColumn = anIndex.column(); + if (!theSelectedIndices.contains (aRow)) + theSelectedIndices.insert (aRow, QList()); + theSelectedIndices[aRow].append (aColumn); + } +} + +// ======================================================================= +// function : SeparatorData +// purpose : +// ======================================================================= + +QString ViewControl_Table::SeparatorData() +{ + return ViewControl_Tools::TableSeparator(); +} diff --git a/tools/ViewControl/ViewControl_Table.hxx b/tools/ViewControl/ViewControl_Table.hxx new file mode 100644 index 0000000000..336f277441 --- /dev/null +++ b/tools/ViewControl/ViewControl_Table.hxx @@ -0,0 +1,84 @@ +// 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 +#include + +#include +#include +#include +#include +#include + +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; } + + //! 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>& aSelectedIndices); + + //! Returns text of separation row in table + //! \return string value + Standard_EXPORT static QString SeparatorData(); + +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 +}; +#endif diff --git a/tools/ViewControl/ViewControl_TableDoubleVector.cxx b/tools/ViewControl/ViewControl_TableDoubleVector.cxx new file mode 100644 index 0000000000..31cb0aea71 --- /dev/null +++ b/tools/ViewControl/ViewControl_TableDoubleVector.cxx @@ -0,0 +1,264 @@ +//----------------------------------------------------------------------------- +// Created on: 2019-03-28 +// Created by: Vadim LEONTIEV +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of commercial software by OPEN CASCADE SAS. +// +// This software is furnished in accordance with the terms and conditions +// of the contract and with the inclusion of this copyright notice. +// This software or any other copy thereof may not be provided or otherwise +// be made available to any third party. +// No ownership title to the software is transferred hereby. +// +// OPEN CASCADE SAS makes no representation or warranties with respect to the +// performance of this software, and specifically disclaims any responsibility +// for any damages, special or consequential, connected with its use. +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +//! Model for a table of parameters: Values: X, Y, Z +class ViewControl_ParametersModelVector : public ViewControl_TableModelValues +{ +public: + ViewControl_ParametersModelVector(ViewControl_TableDoubleVector* theDoubleVector) + : ViewControl_TableModelValues(), myDoubleVector(theDoubleVector) {} + + virtual ~ViewControl_ParametersModelVector() {} + + //! Inits model by the parameters vector + //! \param theVector model the vector + void SetVector(const QList& theVector) + { + if (myVector.isEmpty()) + { myVector.clear(); } + + for (int aNumberVector = 0; aNumberVector < theVector.size(); ++aNumberVector) + { + myVector.append(theVector[aNumberVector]); + } + } + + //! Returns current vector + //! \return vector value to string + QList GetVector() const { return myVector; } + + //! Returns current vector + //! \return vector value to QList + QList GetListFromString(const QString& theVector) const + { + QList aDoubleList; + + QStringList aList = theVector.split(QString(","), QString::SkipEmptyParts); + if (aList.isEmpty()) + return aDoubleList; + + for (int aNumberValue = 0; aNumberValue < aList.size(); ++aNumberValue) + { + aDoubleList.append(QVariant(aList[aNumberValue])); + } + + return aDoubleList; + } + + //! Returns item information(short) for display role. + //! \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 Standard_OVERRIDE + { + if (theRole != Qt::DisplayRole) + return QVariant(); + + bool isFirstColumn = theColumn == 0; + switch (theRow) + { + case 0: return isFirstColumn ? QVariant("X") : myVector[theRow]; + case 1: return isFirstColumn ? QVariant("Y") : myVector[theRow]; + case 2: return isFirstColumn ? QVariant("Z") : myVector[theRow]; + } + return QVariant(); + } + + //! Sets content of the model index for the given role, it is applyed to internal container of values + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return true if the value is changed + virtual bool SetData(const int theRow, const int theColumn, const QVariant& theValue, int) + { + if (theColumn != 1 || theRow < 0 || theRow > 2) + return false; + + switch (theRow) + { + case 0: myVector[theRow] = theValue; break; + case 1: myVector[theRow] = theValue; break; + case 2: myVector[theRow] = theValue; break; + } + + return true; + } + + //! Returns number of tree level line items = colums in table view + virtual int ColumnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE + { (void)theParent; return 2; } + + //! Returns onlly one row in table view + virtual int RowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE + { (void)theParent; return 3; } + + //! Returns editable flag for DoubleVector + //! \return flags + Qt::ItemFlags Flags(const QModelIndex& theIndex) const + { + Qt::ItemFlags aFlags = ViewControl_TableModelValues::Flags(theIndex); + + if (theIndex.column() == 1 && theIndex.row() >= 0 && theIndex.row() <= 2) + aFlags = aFlags | Qt::ItemIsEditable; + + return aFlags; + } + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + virtual ViewControl_EditType GetEditType(const int theRow, const int theColumn) const + { + if (theColumn == 1 && theRow >= 0 && theRow <= 2) + return ViewControl_EditType_Double; + + return ViewControl_EditType_None; + } + +private: + QList myVector; + ViewControl_TableDoubleVector* myDoubleVector; +}; + + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= + +ViewControl_TableDoubleVector::ViewControl_TableDoubleVector(QWidget* theParent) +: QDialog(theParent) +{ + QGridLayout* aLayout = new QGridLayout(this); + aLayout->setContentsMargins(0, 0, 0, 0); + + myParameters = new QTableView(this); + + ViewControl_TableModel* aTableModel = new ViewControl_TableModel(myParameters); + aTableModel->SetModelValues(new ViewControl_ParametersModelVector(this)); + myParameters->setModel(aTableModel); + + ViewControl_TableItemDelegate* anItemDelegate = new ViewControl_TableItemDelegate(); + anItemDelegate->SetModelValues(aTableModel->GetModelValues()); + myParameters->setItemDelegate(anItemDelegate); + + myParameters->verticalHeader()->setDefaultSectionSize(myParameters->verticalHeader()->minimumSectionSize()); + myParameters->verticalHeader()->setVisible(false); + myParameters->horizontalHeader()->setVisible(false); + myParameters->setMinimumHeight(myParameters->verticalHeader()->minimumSectionSize() * aTableModel->rowCount() + + TreeModel_Tools::HeaderSectionMargin()); + myParameters->setMinimumWidth(myParameters->horizontalHeader()->defaultSectionSize() * aTableModel->columnCount() + + TreeModel_Tools::HeaderSectionMargin()); + + QItemSelectionModel* aSelectionModel = new QItemSelectionModel(myParameters->model()); + myParameters->setSelectionMode(QAbstractItemView::SingleSelection); + myParameters->setSelectionModel(aSelectionModel); + + aLayout->addWidget(myParameters, 0, 0); + + myDialogButtons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); + connect(myDialogButtons, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(myDialogButtons, &QDialogButtonBox::rejected, this, &QDialog::reject); + + aLayout->addWidget(myDialogButtons, 1, 0, 1, 2); +} + +// ======================================================================= +// function : SetVectorValue +// purpose : +// ======================================================================= + +void ViewControl_TableDoubleVector::SetVectorValue(const QString& theVector) +{ + QList aVector = GetListVector(theVector); + // parameters model + ViewControl_TableModel* aTableModel = dynamic_cast (myParameters->model()); + ViewControl_ParametersModelVector* aParametersModel = dynamic_cast (aTableModel->GetModelValues()); + aParametersModel->SetVector(aVector); +} + +// ======================================================================= +// function : GetListVector +// purpose : +// ======================================================================= + +QList ViewControl_TableDoubleVector::GetListVector(const QString& theVector) +{ + QList aDoubleList; + + QStringList aList = theVector.split(ViewControl_TableDoubleVector::DoubleSeparator(), QString::SkipEmptyParts); + + if (aList.isEmpty()) + return aDoubleList; + + for (int aNumberValue = 0; aNumberValue < aList.size(); ++aNumberValue) + { + aDoubleList.append(QVariant(aList[aNumberValue])); + } + + return aDoubleList; +} + +// ======================================================================= +// function : GetVector +// purpose : +// ======================================================================= + +QString ViewControl_TableDoubleVector::GetVector() const +{ + ViewControl_TableModel* aTableModel = dynamic_cast (myParameters->model()); + ViewControl_ParametersModelVector* aParametersModel = dynamic_cast (aTableModel->GetModelValues()); + + return VectorToString(aParametersModel->GetVector()); +} + +// ======================================================================= +// function : VectorToString +// purpose : +// ======================================================================= + +QString ViewControl_TableDoubleVector::VectorToString(const QList& theVector) const +{ + QString aVectorToString; + + for (int aNumberValue = 0; aNumberValue < theVector.size(); ++aNumberValue) + { + aVectorToString += theVector[aNumberValue].toString() + DoubleSeparator(); + } + aVectorToString.remove(aVectorToString.length() - 1, 1); + + return aVectorToString; +} + diff --git a/tools/ViewControl/ViewControl_TableDoubleVector.hxx b/tools/ViewControl/ViewControl_TableDoubleVector.hxx new file mode 100644 index 0000000000..06cad5806d --- /dev/null +++ b/tools/ViewControl/ViewControl_TableDoubleVector.hxx @@ -0,0 +1,76 @@ +//----------------------------------------------------------------------------- +// Created on: 2019-03-28 +// Created by: Vadim LEONTIEV +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of commercial software by OPEN CASCADE SAS. +// +// This software is furnished in accordance with the terms and conditions +// of the contract and with the inclusion of this copyright notice. +// This software or any other copy thereof may not be provided or otherwise +// be made available to any third party. +// No ownership title to the software is transferred hereby. +// +// OPEN CASCADE SAS makes no representation or warranties with respect to the +// performance of this software, and specifically disclaims any responsibility +// for any damages, special or consequential, connected with its use. +//----------------------------------------------------------------------------- + +#ifndef ViewControl_TableDoubleVector_H +#define ViewControl_TableDoubleVector_H + +#include +#include + +#include +#include +#include +#include +#include +#include + +class QDialogButtonBox; +class QTableView; + +//! \class ViewControl_PointCoordinates +//! \dialog of change the point coordinates +class VIEWCONTROL_EXPORT ViewControl_TableDoubleVector : public QDialog +{ + Q_OBJECT +public: + + //! Constructor + ViewControl_TableDoubleVector(QWidget* theParent); + + //! Destructor + virtual ~ViewControl_TableDoubleVector() Standard_OVERRIDE{} + + //! Inits control by the vector value + //! \param theVector text vector value + void SetVectorValue(const QString& theVector); + + //! Returns vector value + //! \return QList vector value + static QList ViewControl_TableDoubleVector::GetListVector(const QString& theVector); + + //! Returns vector value + //! \return text vector value + QString GetVector() const; + + //! Converts vector to string value in form + //! \param theVector vector value + //! \return text value + QString VectorToString(const QList& theVector) const; + +private: + //! Returns symbol used as a separtor of vector components in string conversion + //! \return symbol value + static QString DoubleSeparator() { return ","; } + +private: + QTableView* myParameters; //! current vector parameters + QDialogButtonBox* myDialogButtons; //! OK/Cancel buttons + +}; + +#endif // ViewControl_TableDoubleVector_H diff --git a/tools/ViewControl/ViewControl_TableItemDelegate.cxx b/tools/ViewControl/ViewControl_TableItemDelegate.cxx new file mode 100644 index 0000000000..73f5e939a2 --- /dev/null +++ b/tools/ViewControl/ViewControl_TableItemDelegate.cxx @@ -0,0 +1,217 @@ +// Created on: 2018-08-09 +// 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 +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= + +ViewControl_TableItemDelegate::ViewControl_TableItemDelegate (QObject* theParent) + : QItemDelegate (theParent), myModelValues (0) +{ +} + +// ======================================================================= +// function : createEditor +// purpose : +// ======================================================================= + +QWidget* ViewControl_TableItemDelegate::createEditor (QWidget* theParent, + const QStyleOptionViewItem&, + const QModelIndex& theIndex) const +{ + if (!myModelValues) + return 0; + + int aRow = theIndex.row(); + int aColumn = theIndex.column(); + ViewControl_EditType anEditType = myModelValues->GetEditType (aRow, aColumn); + + QWidget* anEditor = createEditorControl (theParent, anEditType); + initEditorParameters (anEditor, anEditType, myModelValues, aRow, aColumn); + return anEditor; +} + +// ======================================================================= +// function : setEditorData +// purpose : +// ======================================================================= + +void ViewControl_TableItemDelegate::setEditorData (QWidget* theEditor, const QModelIndex& theIndex) const +{ + if (!myModelValues) + return; + + int aRow = theIndex.row(); + int aColumn = theIndex.column(); + ViewControl_EditType anEditType = myModelValues->GetEditType (aRow, aColumn); + + setEditorValue (theEditor, anEditType, theIndex.model()->data(theIndex)); +} + +// ======================================================================= +// function : setModelData +// purpose : +// ======================================================================= + +void ViewControl_TableItemDelegate::setModelData (QWidget* theEditor, QAbstractItemModel* theModel, + const QModelIndex& theIndex) const +{ + if (!myModelValues) + return; + + int aRow = theIndex.row(); + int aColumn = theIndex.column(); + ViewControl_EditType anEditType = myModelValues->GetEditType (aRow, aColumn); + + theModel->setData (theIndex, getEditorValue (theEditor, anEditType)); +} + +// ======================================================================= +// function : createEditorControl +// purpose : +// ======================================================================= + +QWidget* ViewControl_TableItemDelegate::createEditorControl (QWidget* theParent, const ViewControl_EditType theEditType) +{ + switch (theEditType) + { + case ViewControl_EditType_None: return 0; + case ViewControl_EditType_Bool: return new QComboBox (theParent); + case ViewControl_EditType_Color: return new ViewControl_ColorSelector (theParent); + case ViewControl_EditType_Combo: return new QComboBox (theParent); + case ViewControl_EditType_Double: + { + QLineEdit* aLineEdit = new QLineEdit (theParent); + aLineEdit->setValidator (new QDoubleValidator (theParent)); + return aLineEdit; + } + case ViewControl_EditType_Line: return new QLineEdit (theParent); + case ViewControl_EditType_Spin: + { + QSpinBox* aSpinBox = new QSpinBox (theParent); + aSpinBox->setRange (IntegerFirst(), IntegerLast()); + return aSpinBox; + } + case ViewControl_EditType_DoAction: return new QPushButton (theParent); + case ViewControl_EditType_DoubleVector: return new ViewControl_TableDoubleVector(theParent); + + default: return 0; + } +} + +// ======================================================================= +// function : initEditorParameters +// purpose : +// ======================================================================= + +void ViewControl_TableItemDelegate::initEditorParameters (QWidget* theEditor, + const ViewControl_EditType theEditType, + ViewControl_TableModelValues* theModelValues, + const int theRow, const int theColumn) +{ + switch (theEditType) + { + case ViewControl_EditType_Bool: + { + (qobject_cast (theEditor))->insertItem(0, "true"); + (qobject_cast (theEditor))->insertItem(1, "false"); + break; + } + case ViewControl_EditType_Combo: + { + QList aValues = theModelValues->GetEnumValues (theRow, theColumn); + for (int aValuesId = 0; aValuesId < aValues.size(); aValuesId++) + (qobject_cast (theEditor))->insertItem(aValuesId, aValues[aValuesId].toString()); + } + break; + case ViewControl_EditType_Double: + { + QList aValues = theModelValues->GetEnumValues (theRow, theColumn); + if (aValues.size() < 3) + break; + + QDoubleValidator* aValidator = (QDoubleValidator*)(qobject_cast (theEditor))->validator(); + aValidator->setBottom (aValues[0].toDouble()); + aValidator->setTop (aValues[1].toDouble()); + aValidator->setDecimals (aValues[2].toInt()); + break; + } + default: break; + } +} + +// ======================================================================= +// function : setEditorValue +// purpose : +// ======================================================================= + +void ViewControl_TableItemDelegate::setEditorValue (QWidget* theEditor, const ViewControl_EditType theEditType, + const QVariant& theValue) +{ + switch (theEditType) + { + case ViewControl_EditType_None: break; + case ViewControl_EditType_Bool: (qobject_cast(theEditor))->setCurrentIndex (theValue.toBool() ? 0 : 1); break; + case ViewControl_EditType_Color: (qobject_cast(theEditor))->SetColor (theValue.toString()); break; + case ViewControl_EditType_Combo: (qobject_cast(theEditor))->setCurrentText (theValue.toString()); break; + case ViewControl_EditType_Double: + case ViewControl_EditType_Line: (qobject_cast(theEditor))->setText (theValue.toString()); break; + case ViewControl_EditType_Spin: (qobject_cast(theEditor))->setValue (theValue.toInt()); break; + case ViewControl_EditType_DoAction: (qobject_cast(theEditor))->setText ("UnSelect"); break; + case ViewControl_EditType_DoubleVector: (qobject_cast(theEditor))->SetVectorValue(theValue.toString()); break; + + default: break; + } +} + +// ======================================================================= +// function : getEditorValue +// purpose : +// ======================================================================= + +QVariant ViewControl_TableItemDelegate::getEditorValue (QWidget* theEditor, const ViewControl_EditType theEditType) +{ + switch (theEditType) + { + case ViewControl_EditType_None: return QVariant(); + case ViewControl_EditType_Bool: return (qobject_cast(theEditor))->currentIndex() == 0 ? true : false; + case ViewControl_EditType_Color: return (qobject_cast(theEditor))->GetColor(); + case ViewControl_EditType_Combo: return (qobject_cast(theEditor))->currentText(); + case ViewControl_EditType_Double: + case ViewControl_EditType_Line: return (qobject_cast(theEditor))->text(); + case ViewControl_EditType_Spin: return (qobject_cast(theEditor))->value(); + case ViewControl_EditType_DoAction: return QVariant ("Clicked"); + case ViewControl_EditType_DoubleVector: return (qobject_cast(theEditor))->GetVector(); + + default: return QVariant(); + } +} diff --git a/tools/ViewControl/ViewControl_TableItemDelegate.hxx b/tools/ViewControl/ViewControl_TableItemDelegate.hxx new file mode 100644 index 0000000000..79d83bfd5f --- /dev/null +++ b/tools/ViewControl/ViewControl_TableItemDelegate.hxx @@ -0,0 +1,96 @@ +// Created on: 2018-08-09 +// 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_TableItemDelegate_H +#define ViewControl_TableItemDelegate_H + +#include +#include + +#include + +class ViewControl_TableModelValues; + +//! \class ViewControl_TableItemDelegate +//! \brief This is an implementation for ViewControl_TableModel to present AIS_InteractiveContext object +class ViewControl_TableItemDelegate : public QItemDelegate +{ +public: + + //! Constructor + //! \param theParent parent object + Standard_EXPORT ViewControl_TableItemDelegate (QObject* theParent = 0); + + //! Destructor + virtual ~ViewControl_TableItemDelegate() Standard_OVERRIDE {} + + //! Sets table model values + //! \param theModelValues instance of model values + void SetModelValues (ViewControl_TableModelValues* theModelValues) { myModelValues = theModelValues; } + + //! Creates widget editor: spin box, combo box or line edit + //! \param theParent parent widget + //! \param theOption style option + //! \param theIndex index of requested widget + virtual QWidget* createEditor (QWidget* theParent, const QStyleOptionViewItem& theOption, + const QModelIndex& theIndex) const Standard_OVERRIDE; + + //! Sets the data to be displayed and edited by the editor from the data model item specified by the model index + //! \param theEditor editor to be filled + //! \param theIndex index of requested widget, contains information about model + virtual void setEditorData (QWidget* theEditor, const QModelIndex& theIndex) const Standard_OVERRIDE; + + //! Gets data from the editor widget and stores it in the specified model at the item index. + //! \param theEditor editor to be filled + //! \param theModel data model + //! \param theIndex index of requested widget, contains information about model + virtual void setModelData (QWidget* theEditor, QAbstractItemModel* theModel, + const QModelIndex& theIndex) const Standard_OVERRIDE; + +private: + //! Creates an editor + //! \param theParent parent widget + //! \param theEditType edition control type + //! \return edit control + static QWidget* createEditorControl (QWidget* theParent, const ViewControl_EditType theEditType); + + //! Inits an editor by model values parameters + //! \param theEditor editor + //! \param theEditType edition control type + //! \param theModelValues custom implementation to provide parameters + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit control + static void initEditorParameters (QWidget* theEditor, const ViewControl_EditType theEditType, + ViewControl_TableModelValues* theModelValues, + const int theRow, const int theColumn); + + //! Sets editor value + //! \param theEditor editor + //! \param theEditType editor typ + //! \param theValue new value + static void setEditorValue (QWidget* theEditor, const ViewControl_EditType theEditType, const QVariant& theValue); + + //! Returns value of spin box editor + //! \param theEditor editor + //! \param theEditType editor typ + //! \return current value + static QVariant getEditorValue (QWidget* theEditor, const ViewControl_EditType theEditType); + +private: + ViewControl_TableModelValues* myModelValues; //!< table model values +}; + +#endif diff --git a/tools/ViewControl/ViewControl_TableModel.cxx b/tools/ViewControl/ViewControl_TableModel.cxx new file mode 100644 index 0000000000..c3b43209b8 --- /dev/null +++ b/tools/ViewControl/ViewControl_TableModel.cxx @@ -0,0 +1,78 @@ +// 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 + +// ======================================================================= +// function : SetModelValues +// purpose : +// ======================================================================= +void ViewControl_TableModel::SetModelValues (ViewControl_TableModelValues* theModelValues) +{ + if (myModelValues) + delete myModelValues; + + myModelValues = theModelValues; +} + +// ======================================================================= +// function : columnCount +// purpose : +// ======================================================================= +int ViewControl_TableModel::columnCount(const QModelIndex& theParent) const +{ + if (!myModelValues) + return 0; + + return myModelValues->ColumnCount (theParent); +} + +// ======================================================================= +// function : rowCount +// purpose : +// ======================================================================= +int ViewControl_TableModel::rowCount(const QModelIndex& theParent ) const +{ + if (!myModelValues) + return 0; + + return 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(); + return myModelValues->Data (aRow, aColumn, theRole); +} + +// ======================================================================= +// function : setData +// purpose : +// ======================================================================= +bool ViewControl_TableModel::setData (const QModelIndex& theIndex, const QVariant& theValue, int theRole) +{ + if (!myModelValues) + return false; + + int aRow = theIndex.row(), aColumn = theIndex.column(); + return myModelValues->SetData (aRow, aColumn, theValue, theRole); +} diff --git a/tools/ViewControl/ViewControl_TableModel.hxx b/tools/ViewControl/ViewControl_TableModel.hxx new file mode 100644 index 0000000000..d0459ea68e --- /dev/null +++ b/tools/ViewControl/ViewControl_TableModel.hxx @@ -0,0 +1,100 @@ +// 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 + +#include + +#include +#include +#include +#include +#include + +#include + +//! \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) { (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; } + + //! 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; + + //! Sets the new value of passed role to tree cell. + //! \param[in] index refers to item in tree. + //! \param[in] value the new value. + //! \param[in] role the role of value. + Standard_EXPORT virtual bool setData (const QModelIndex& theIndex, const QVariant& theValue, int theRole) 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; } + +private: + ViewControl_TableModelValues* myModelValues; //! interface to table values +}; + +#endif diff --git a/tools/ViewControl/ViewControl_TableModelValues.cxx b/tools/ViewControl/ViewControl_TableModelValues.cxx new file mode 100644 index 0000000000..bccb3d24ec --- /dev/null +++ b/tools/ViewControl/ViewControl_TableModelValues.cxx @@ -0,0 +1,159 @@ +// 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 + +#include +#include +#include +#include + +// ======================================================================= +// function : ColumnCount +// purpose : +// ======================================================================= + +int ViewControl_TableModelValues::ColumnCount (const QModelIndex&) const +{ + if (!GetProperties().IsNull()) + return GetProperties()->GetTableColumnCount(); + + return 0; +} + + +// ======================================================================= +// function : RowCount +// purpose : +// ======================================================================= + +int ViewControl_TableModelValues::RowCount (const QModelIndex&) const +{ + if (!GetProperties().IsNull()) + return GetProperties()->GetTableRowCount(); + + return 0; +} + +// ======================================================================= +// function : Data +// purpose : +// ======================================================================= + +QVariant ViewControl_TableModelValues::Data (const int theRow, const int theColumn, int theRole) const +{ + if (!GetProperties().IsNull()) + { + QVariant aValue = GetProperties()->GetTableData (theRow, theColumn, theRole); + if (aValue.isValid()) + return aValue; + } + + 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 : SetData +// purpose : +// ======================================================================= + +bool ViewControl_TableModelValues::SetData (const int theRow, const int theColumn, const QVariant& theValue, int) +{ + if (!GetProperties().IsNull()) + return GetProperties()->SetTableData (theRow, theColumn, theValue); + + return false; +} + +// ======================================================================= +// 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 : GetEditType +// purpose : +// ======================================================================= +ViewControl_EditType ViewControl_TableModelValues::GetEditType (const int theRow, const int theColumn) const +{ + if (!GetProperties().IsNull()) + { + return GetProperties()->GetTableEditType (theRow, theColumn); + } + return ViewControl_EditType_None; +} + +// ======================================================================= +// function : GetEnumValues +// purpose : +// ======================================================================= +QList ViewControl_TableModelValues::GetEnumValues (const int theRow, const int theColumn) const +{ + if (!GetProperties().IsNull()) + { + return GetProperties()->GetTableEnumValues (theRow, theColumn); + } + return QList(); +} + +// ======================================================================= +// function : isItalicHeader +// purpose : +// ======================================================================= +Qt::ItemFlags ViewControl_TableModelValues::Flags (const QModelIndex& theIndex) const +{ + if (!GetProperties().IsNull()) + { + return GetProperties()->GetTableFlags (theIndex.row(), theIndex.column()); + } + return theIndex.isValid() ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags; +} + +// ======================================================================= +// 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(); +} diff --git a/tools/ViewControl/ViewControl_TableModelValues.hxx b/tools/ViewControl/ViewControl_TableModelValues.hxx new file mode 100644 index 0000000000..5250635cd1 --- /dev/null +++ b/tools/ViewControl/ViewControl_TableModelValues.hxx @@ -0,0 +1,174 @@ +// 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 + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +class QItemDelegate; + +//! \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) + { SetOrientation (theOrientation); } + + //! Destructor + virtual ~ViewControl_TableModelValues() {} + + //! Sets item table properties builder + void SetProperties (const Handle(TreeModel_ItemProperties)& theProperties) { myProperties = theProperties; } + + //! Returns item table properties builder + Handle(TreeModel_ItemProperties) GetProperties() const { return myProperties; } + + //! 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 header values for orientation. + //! \param theValues a container of header text values + //! \param theOrientation an orientation of header + void SetHeaderValues (const QList& 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); + } + + //! 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 + Standard_EXPORT virtual int RowCount (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 theRow a model index row + //! \param theColumn a model index column + //! \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; + + //! Sets content of the model index for the given role, it is applyed to internal container of values + //! \param theRow a model index row + //! \param theColumn a model index column + //! \param theRole a view role + //! \return true if the value is changed + Standard_EXPORT virtual bool SetData (const int theRow, const int theColumn, const QVariant& theValue, + int theRole = Qt::DisplayRole); + + //! 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 + Standard_EXPORT virtual Qt::ItemFlags Flags (const QModelIndex& theIndex) const; + + //! Returns item delegate to provide cell editors. By default, it is empty + //! \return delegate + virtual QItemDelegate* GetItemDelegate() { return 0; } + + //! Returns type of edit control for the model index. By default, it is an empty control + //! \param theRow a model index row + //! \param theColumn a model index column + //! \return edit type + Standard_EXPORT virtual ViewControl_EditType GetEditType (const int theRow, const int theColumn) const; + + //! Returns container of string values for enumeration in the model row + //! \param theRow table model row index + //! \param theColumn a model index column + //! \return string values for the enumeration presented in the row or an empty container + Standard_EXPORT virtual QList GetEnumValues (const int theRow, const int theColumn) const; + + //! Returns default color for editable cell + //! \return color value + static QColor EditCellColor() { return QColor (Qt::darkBlue); } + +protected: + //! 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 > myHeaderValues; //!< table header values + QMap myVisibleHeader; //! table header visibility + QMap myDefaultSectionSize; //! table section default size + + Handle(TreeModel_ItemProperties) myProperties; //!< item properties +}; + +#endif diff --git a/tools/ViewControl/ViewControl_TableModelValuesDefault.cxx b/tools/ViewControl/ViewControl_TableModelValuesDefault.cxx new file mode 100644 index 0000000000..104bfbe5de --- /dev/null +++ b/tools/ViewControl/ViewControl_TableModelValuesDefault.cxx @@ -0,0 +1,48 @@ +// 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 + +#include +#include +#include +#include + +// ======================================================================= +// function : ColumnCount +// purpose : +// ======================================================================= + +int ViewControl_TableModelValuesDefault::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_TableModelValuesDefault::Data (const int theRow, const int theColumn, int theRole) const +{ + if (theRole == Qt::DisplayRole) + return myValues.at ((int)getPosition (theRow, theColumn)); + + return ViewControl_TableModelValues::Data (theRow, theColumn, theRole); +} diff --git a/tools/ViewControl/ViewControl_TableModelValuesDefault.hxx b/tools/ViewControl/ViewControl_TableModelValuesDefault.hxx new file mode 100644 index 0000000000..bda3b94d75 --- /dev/null +++ b/tools/ViewControl/ViewControl_TableModelValuesDefault.hxx @@ -0,0 +1,92 @@ +// 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_TableModelValuesDefault_H +#define ViewControl_TableModelValuesDefault_H + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +class QItemDelegate; + +//! \class ViewControl_TableModelValuesDefault +//! \brief This is an interace for ViewControl_TableModel to give real values of the model +//! It should be filled or redefined. +class ViewControl_TableModelValuesDefault : public ViewControl_TableModelValues +{ +public: + + //! Constructor + Standard_EXPORT ViewControl_TableModelValuesDefault (const Qt::Orientation& theOrientation = Qt::Vertical) + : ViewControl_TableModelValues (theOrientation) {} + + //! Destructor + virtual ~ViewControl_TableModelValuesDefault() {} + + //! Fills the model values. + //! \param theValues a container of table model values + void SetValues (const QVector& theValues) { myValues = theValues; } + + //! 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 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 + virtual int RowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE + { 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 theRow a model index row + //! \param theColumn a model index column + //! \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 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 + virtual int GetValuesCount () const { return myValues.size(); } + +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: + + QVector myValues; //! cached container of table values +}; + +#endif diff --git a/tools/ViewControl/ViewControl_Tools.cxx b/tools/ViewControl/ViewControl_Tools.cxx index 99d3e441ef..273f805a5c 100644 --- a/tools/ViewControl/ViewControl_Tools.cxx +++ b/tools/ViewControl/ViewControl_Tools.cxx @@ -14,11 +14,24 @@ // commercial license or contractual agreement. #include +#include + +#include + +#include +#include +#include +#include +#include +#include #include #include +#include +#include #include #include +#include #include #include @@ -43,3 +56,316 @@ void ViewControl_Tools::SetWhiteBackground (QWidget* theControl) 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 (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 = true; + for (int aColumnId = 0, aNbColumns = aTableModel->columnCount(); aColumnId < aNbColumns; aColumnId++) + { + TreeModel_HeaderSection aSection = aModelValues->GetHeaderItem (theOrientation, aColumnId); + if (aSection.IsEmpty()) + continue; + + int aColumnWidth = aSection.GetWidth(); + if (aColumnWidth > 0) + { + theTableView->setColumnWidth (aColumnId, aColumnWidth); + if (aColumnId == aNbColumns - 1) + isStretchLastSection = false; + } + theTableView->setColumnHidden (aColumnId, aSection.IsHidden()); + } + if (isStretchLastSection != theTableView->horizontalHeader()->stretchLastSection()) + theTableView->horizontalHeader()->setStretchLastSection (isStretchLastSection); + + } +} + +// ======================================================================= +// function : GetPointerInfo +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::GetPointerInfo (const Handle(Standard_Transient)& thePointer, const bool isShortInfo) +{ + if (thePointer.IsNull()) + return TCollection_AsciiString(); + + return GetPointerInfo(thePointer.operator->(), isShortInfo); +} + +// ======================================================================= +// function : GetPointerInfo +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::GetPointerInfo (const void* thePointer, const bool isShortInfo) +{ + std::ostringstream aPtrStr; + aPtrStr << thePointer; + 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(GetPointerPrefix()); + return anInfoPtr; + } + } + return aPtrStr.str().c_str(); +} + +// ======================================================================= +// function : ToVariant +// purpose : +// ======================================================================= +QVariant ViewControl_Tools::ToVariant (const Standard_ShortReal theValue) +{ + return QVariant (QLocale().toString (theValue)); +} + +// ======================================================================= +// function : ToVariant +// purpose : +// ======================================================================= +QVariant ViewControl_Tools::ToVariant (const Standard_Real theValue) +{ + return QVariant (QLocale().toString (theValue)); +} + +// ======================================================================= +// function : ToRealValue +// purpose : +// ======================================================================= +Standard_ShortReal ViewControl_Tools::ToShortRealValue (const QVariant& theValue) +{ + return QLocale().toFloat (theValue.toString()); +} + +// ======================================================================= +// function : ToRealValue +// purpose : +// ======================================================================= +Standard_Real ViewControl_Tools::ToRealValue (const QVariant& theValue) +{ + return QLocale().toDouble (theValue.toString()); +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::ToString (const Handle(Geom_Transformation)& theValue) +{ + if (theValue.IsNull()) + return TCollection_AsciiString(); + + return ViewControl_Tools::ToString (theValue->Trsf()); +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::ToString (const gp_Trsf& theValue) +{ + TCollection_AsciiString aValues; + for (int aRowId = 1; aRowId <= 3; aRowId++) + { + for (int aColId = 1; aColId <= 4; aColId++) { + aValues += TCollection_AsciiString (theValue.Value(aRowId, aColId)); + if (aColId != 4) + aValues += ","; + } + if (aRowId != 3) + aValues += " "; + } + return aValues; +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::ToString (const gp_Pnt& thePoint) +{ + return TCollection_AsciiString (thePoint.X()) + "," + + TCollection_AsciiString (thePoint.Y()) + "," + + TCollection_AsciiString (thePoint.Z()); +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::ToString (const gp_Dir& theDir) +{ + return TCollection_AsciiString (theDir.X()) + "," + + TCollection_AsciiString (theDir.Y()) + "," + + TCollection_AsciiString (theDir.Z()); +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::ToString (const gp_XYZ& theValue) +{ + return TCollection_AsciiString (theValue.X()) + "," + + TCollection_AsciiString (theValue.Y()) + "," + + TCollection_AsciiString (theValue.Z()); +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::ToString (const Bnd_Box& theValue) +{ + if (theValue.IsVoid()) + return "Bnd_Box is void"; + + return QString ("(%1, %2, %3), (%4, %5, %6)") + .arg (theValue.CornerMin().X()).arg (theValue.CornerMin().Y()).arg (theValue.CornerMin().Z()) + .arg (theValue.CornerMax().X()).arg (theValue.CornerMax().Y()).arg (theValue.CornerMax().Z()).toStdString().c_str(); + +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::ToString (const Handle(TColgp_HArray1OfPnt)& thePoints) +{ + QStringList aPointList; + for (Standard_Integer aPntIter = thePoints->Lower(); aPntIter <= thePoints->Upper(); ++aPntIter) + aPointList.append(ViewControl_Tools::ToString (thePoints->Value (aPntIter)).ToCString()); + + return aPointList.join(" ,").toStdString().c_str(); +} + +// ======================================================================= +// function : ToString +// purpose : +// ======================================================================= +TCollection_AsciiString ViewControl_Tools::ToString (const TopLoc_Location& theLocation) +{ + return ToString (theLocation.Transformation()); +} + +//======================================================================= +//function : CreateShape +//purpose : +//======================================================================= +TopoDS_Shape ViewControl_Tools::CreateShape (const Bnd_Box& theBoundingBox) +{ + if (theBoundingBox.IsVoid() || theBoundingBox.IsWhole()) + return TopoDS_Shape(); + + Standard_Real aXmin, anYmin, aZmin, aXmax, anYmax, aZmax; + theBoundingBox.Get (aXmin, anYmin, aZmin, aXmax, anYmax, aZmax); + + gp_Pnt aPntMin = gp_Pnt (aXmin, anYmin, aZmin); + gp_Pnt aPntMax = gp_Pnt (aXmax, anYmax, aZmax); + + return CreateBoxShape (aPntMin, aPntMax); +} + +//======================================================================= +//function : CreateShape +//purpose : +//======================================================================= +TopoDS_Shape ViewControl_Tools::CreateShape (const Bnd_OBB& theBoundingBox) +{ + if (theBoundingBox.IsVoid()) + return TopoDS_Shape(); + + TColgp_Array1OfPnt anArrPnts(0, 8); + theBoundingBox.GetVertex(&anArrPnts(0)); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt (anArrPnts.Value(0)), gp_Pnt (anArrPnts.Value(1)))); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt (anArrPnts.Value(0)), gp_Pnt (anArrPnts.Value(2)))); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt (anArrPnts.Value(1)), gp_Pnt (anArrPnts.Value(3)))); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (gp_Pnt (anArrPnts.Value(2)), gp_Pnt (anArrPnts.Value(3)))); + + return aCompound; +} + +//======================================================================= +//function : CreateBoxShape +//purpose : +//======================================================================= +TopoDS_Shape ViewControl_Tools::CreateBoxShape (const gp_Pnt& thePntMin, const gp_Pnt& thePntMax) +{ + Standard_Boolean aThinOnX = fabs (thePntMin.X() - thePntMax.X()) < Precision::Confusion(); + Standard_Boolean aThinOnY = fabs (thePntMin.Y() - thePntMax.Y()) < Precision::Confusion(); + Standard_Boolean aThinOnZ = fabs (thePntMin.Z() - thePntMax.Z()) < Precision::Confusion(); + + if (((int)aThinOnX + (int)aThinOnY + (int)aThinOnZ) > 1) // thin box in several directions is a point + { + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex (thePntMin)); + return aCompound; + } + + if (aThinOnX || aThinOnY || aThinOnZ) + { + gp_Pnt aPnt1, aPnt2, aPnt3, aPnt4 ; + if (aThinOnX) + { + aPnt1 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMin.Z()); + aPnt2 = gp_Pnt(thePntMin.X(), thePntMax.Y(), thePntMin.Z()); + aPnt3 = gp_Pnt(thePntMin.X(), thePntMax.Y(), thePntMax.Z()); + aPnt4 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMax.Z()); + } + else if (aThinOnY) + { + aPnt1 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMin.Z()); + aPnt2 = gp_Pnt(thePntMax.X(), thePntMin.Y(), thePntMin.Z()); + aPnt3 = gp_Pnt(thePntMax.X(), thePntMin.Y(), thePntMax.Z()); + aPnt4 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMax.Z()); + } + else if (aThinOnZ) + { + aPnt1 = gp_Pnt(thePntMin.X(), thePntMin.Y(), thePntMin.Z()); + aPnt2 = gp_Pnt(thePntMax.X(), thePntMin.Y(), thePntMin.Z()); + aPnt3 = gp_Pnt(thePntMax.X(), thePntMax.Y(), thePntMin.Z()); + aPnt4 = gp_Pnt(thePntMin.X(), thePntMax.Y(), thePntMin.Z()); + } + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound (aCompound); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (aPnt1, aPnt2)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (aPnt2, aPnt3)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (aPnt3, aPnt4)); + aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge (aPnt4, aPnt1)); + + return aCompound; + } + else + { + BRepPrimAPI_MakeBox aBoxBuilder (thePntMin, thePntMax); + return aBoxBuilder.Shape(); + } +} diff --git a/tools/ViewControl/ViewControl_Tools.hxx b/tools/ViewControl/ViewControl_Tools.hxx index 7dd4bd4b39..a701d4df0a 100644 --- a/tools/ViewControl/ViewControl_Tools.hxx +++ b/tools/ViewControl/ViewControl_Tools.hxx @@ -16,15 +16,29 @@ #ifndef ViewControl_Tools_H #define ViewControl_Tools_H +#include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include #include #include +#include #include +class Geom_Transformation; + class QAction; class QObject; +class QTableView; class QWidget; //! \class ViewControl_Tools @@ -32,6 +46,9 @@ class QWidget; class ViewControl_Tools { public: + //! Returns text of separation row in table + //! \return string value + static QString TableSeparator() { return "---------------------------"; } //! Creates an action with the given text connected to the slot //! \param theText an action text value @@ -46,6 +63,104 @@ public: //! \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); + + //! Returns default prefix added for each pointer info string + Standard_EXPORT static TCollection_AsciiString GetPointerPrefix() { return "0x"; } + + //! Convert handle 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); + + //! 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 void* thePointer, + const bool isShortInfo = true); + + //! Convert real value to string value + //! \param theValue a short real value + //! \return the string value + Standard_EXPORT static QVariant ToVariant (const Standard_ShortReal theValue); + + //! Convert real value to string value + //! \param theValue a real value + //! \return the string value + Standard_EXPORT static QVariant ToVariant (const Standard_Real theValue); + + //! Convert real value to real value + //! \param theValue a string value + //! \return the real value + Standard_EXPORT static Standard_ShortReal ToShortRealValue (const QVariant& theValue); + + //! Convert real value to string value + //! \param theValue a string value + //! \return the real value + Standard_EXPORT static Standard_Real ToRealValue (const QVariant& theValue); + + //! Returns text of orientation + //! \param theLocation a location value + //! \return text value + Standard_EXPORT static TCollection_AsciiString ToString (const Handle(Geom_Transformation)& theValue); + + //! Returns text of orientation + //! \param theLocation a location value + //! \return text value + Standard_EXPORT static TCollection_AsciiString ToString (const gp_Trsf& theValue); + + //! Returns text of point + //! \param theValue a 3D point + //! \return text value + Standard_EXPORT static TCollection_AsciiString ToString (const gp_Pnt& thePoint); + + //! Returns text of direction + //! \param theValue a direction + //! \return text value + Standard_EXPORT static TCollection_AsciiString ToString (const gp_Dir& theDir); + + //! Returns text of cartesian entity in 3D space + //! \param theValue an entity + //! \return text value + Standard_EXPORT static TCollection_AsciiString ToString (const gp_XYZ& theValue); + + //! Returns text of bounding box in form: (xmin, ymin, zmin), (xmax, ymax, zmax) + //! \param theValue a bounding box + //! \return text value + Standard_EXPORT static TCollection_AsciiString ToString (const Bnd_Box& theValue); + + //! Returns text of array of points + //! \param thePoints points + //! \return text value + Standard_EXPORT static TCollection_AsciiString ToString (const Handle(TColgp_HArray1OfPnt)& thePoints); + + //! Returns text of location + //! \param theLocation object location + //! \return text value + Standard_EXPORT static TCollection_AsciiString ToString (const TopLoc_Location& theLocation); + + //! Creates box shape + //! \param theBoundingBox box shape parameters + //! \return created shape + Standard_EXPORT static TopoDS_Shape CreateShape (const Bnd_Box& theBoundingBox); + + //! Creates box shape + //! \param theBoundingBox box shape parameters + //! \return created shape + Standard_EXPORT static TopoDS_Shape CreateShape (const Bnd_OBB& theBoundingBox); + + //! Creates box shape + //! \param thePntMin minimum point on the bounding box + //! \param thePntMax maximum point on the bounding box + //! \return created shape + Standard_EXPORT static TopoDS_Shape CreateBoxShape (const gp_Pnt& thePntMin, const gp_Pnt& thePntMax); + }; #endif diff --git a/tools/ViewControl/ViewControl_TransientShape.cxx b/tools/ViewControl/ViewControl_TransientShape.cxx new file mode 100644 index 0000000000..fc537b0d81 --- /dev/null +++ b/tools/ViewControl/ViewControl_TransientShape.cxx @@ -0,0 +1,18 @@ +// Created on: 2019-04-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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 + +IMPLEMENT_STANDARD_RTTIEXT(ViewControl_TransientShape, Standard_Transient) diff --git a/tools/ViewControl/ViewControl_TransientShape.hxx b/tools/ViewControl/ViewControl_TransientShape.hxx new file mode 100644 index 0000000000..5b28f7cc99 --- /dev/null +++ b/tools/ViewControl/ViewControl_TransientShape.hxx @@ -0,0 +1,53 @@ +// Created on: 2019-04-15 +// Created by: Natalia ERMOLAEVA +// Copyright (c) 2019 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_TransientShape_H +#define ViewControl_TransientShape_H + +#include +#include +#include +#include +#include + +#include + +DEFINE_STANDARD_HANDLE (ViewControl_TransientShape, Standard_Transient) + +//! \class ViewControl_TransientShape +//! \brief An interface to create custom panes by transient object name. +class ViewControl_TransientShape : public Standard_Transient +{ +public: + + //! Constructor + ViewControl_TransientShape (const TopoDS_Shape& theShape) { SetShape (theShape); } + + //! Destructor + virtual ~ViewControl_TransientShape() {} + + //! Fills current shape + void SetShape (const TopoDS_Shape& theShape) { myShape = theShape; } + + //! Returns current shape + const TopoDS_Shape GetShape() const { return myShape; } + + DEFINE_STANDARD_RTTIEXT (ViewControl_TransientShape, Standard_Transient) + +private: + TopoDS_Shape myShape; +}; + +#endif