From: nds Date: Wed, 12 Feb 2020 20:35:54 +0000 (+0300) Subject: 0031326: Foundation Classes - Init from Json for base OCCT classes X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=b1f22c0e32d9ab5ebae4483340a28cf53cd83b73;p=occt-copy.git 0031326: Foundation Classes - Init from Json for base OCCT classes (cherry picked from commit 39f197676cb85d2b84ad0ff15266eed118cbbaff) (cherry picked from commit 4a5e30db5bbdfc7a77a03d1e55e8a3bee5d79d2d) (cherry picked from commit b4a5214bd281d5ad445d46437c98897cbc292dd9) (cherry picked from commit 982e5220795701b71350c18bf74c6c9a3f61c2a6) --- diff --git a/src/BVH/BVH_Box.hxx b/src/BVH/BVH_Box.hxx index 8e0dc9fac5..8ed7ae7311 100644 --- a/src/BVH/BVH_Box.hxx +++ b/src/BVH/BVH_Box.hxx @@ -201,6 +201,51 @@ public: } } + //! Inits the content of me into the stream + Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) + { + Standard_Integer aPos = theStreamPos; + + Standard_Integer anIsInited = 0; + OCCT_INIT_FIELD_VALUE_INTEGER (theSStream, aPos, anIsInited); + myIsInited = anIsInited != 0; + + int n = Min (N, 3); + if (n == 1) + { + Standard_Real aValue; + OCCT_INIT_FIELD_VALUE_REAL (theSStream, aPos, aValue); + myMinPoint[0] = (T)aValue; + } + if (n == 2) + { + Standard_Real aValue1, aValue2; + OCCT_INIT_VECTOR_CLASS (theSStream, "MinPoint", aPos, n, &aValue1, &aValue2); + myMinPoint[0] = (T)aValue1; + myMinPoint[1] = (T)aValue2; + + OCCT_INIT_VECTOR_CLASS (theSStream, "MaxPoint", aPos, n, &aValue1, &aValue2); + myMaxPoint[0] = (T)aValue1; + myMaxPoint[1] = (T)aValue2; + } + if (n == 3) + { + Standard_Real aValue1, aValue2, aValue3; + OCCT_INIT_VECTOR_CLASS (theSStream, "MinPoint", aPos, n, &aValue1, &aValue2, &aValue3); + myMinPoint[0] = (T)aValue1; + myMinPoint[1] = (T)aValue2; + myMinPoint[2] = (T)aValue3; + + OCCT_INIT_VECTOR_CLASS (theSStream, "MaxPoint", aPos, n, &aValue1, &aValue2, &aValue3); + myMaxPoint[0] = (T)aValue1; + myMaxPoint[1] = (T)aValue2; + myMaxPoint[2] = (T)aValue3; + } + + theStreamPos = aPos; + return Standard_True; + } + public: //! Checks if the Box is out of the other box. diff --git a/src/Bnd/Bnd_Box.cxx b/src/Bnd/Bnd_Box.cxx index cb4fbedad9..18f1f228a5 100644 --- a/src/Bnd/Bnd_Box.cxx +++ b/src/Bnd/Bnd_Box.cxx @@ -983,3 +983,21 @@ void Bnd_Box::DumpJson (Standard_OStream& theOStream, Standard_Integer) const OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Gap) OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Flags) } + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean Bnd_Box::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + OCCT_INIT_VECTOR_CLASS (theSStream, "CornerMin", aPos, 3, &Xmin, &Ymin, &Zmin) + OCCT_INIT_VECTOR_CLASS (theSStream, "CornerMax", aPos, 3, &Xmax, &Ymax, &Zmax) + + OCCT_INIT_FIELD_VALUE_REAL (theSStream, aPos, Gap); + OCCT_INIT_FIELD_VALUE_INTEGER (theSStream, aPos, Flags); + + theStreamPos = aPos; + return Standard_True; +} diff --git a/src/Bnd/Bnd_Box.hxx b/src/Bnd/Bnd_Box.hxx index b716902f07..31af29518e 100644 --- a/src/Bnd/Bnd_Box.hxx +++ b/src/Bnd/Bnd_Box.hxx @@ -305,6 +305,9 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); + protected: //! Bit flags. diff --git a/src/Quantity/Quantity_Color.cxx b/src/Quantity/Quantity_Color.cxx index cb8962e1af..c8f726ca0f 100644 --- a/src/Quantity/Quantity_Color.cxx +++ b/src/Quantity/Quantity_Color.cxx @@ -676,3 +676,17 @@ void Quantity_Color::DumpJson (Standard_OStream& theOStream, Standard_Integer) c { OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "RGB", 3, myRgb.r(), myRgb.g(), myRgb.b()) } + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean Quantity_Color::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + Standard_Real aRed, aGreen, aBlue; + OCCT_INIT_VECTOR_CLASS (theSStream, "RGB", aPos, 3, &aRed, &aGreen, &aBlue) + + SetValues ((Standard_ShortReal)aRed, (Standard_ShortReal)aGreen, (Standard_ShortReal)aBlue, Quantity_TOC_RGB); + return Standard_True; +} diff --git a/src/Quantity/Quantity_Color.hxx b/src/Quantity/Quantity_Color.hxx index 82e3bdc9c8..6471b244d1 100644 --- a/src/Quantity/Quantity_Color.hxx +++ b/src/Quantity/Quantity_Color.hxx @@ -365,6 +365,9 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); + private: //! Returns the values of a predefined color according to the mode. diff --git a/src/Quantity/Quantity_ColorRGBA.cxx b/src/Quantity/Quantity_ColorRGBA.cxx index 80016d8b7e..42cd8f4b70 100644 --- a/src/Quantity/Quantity_ColorRGBA.cxx +++ b/src/Quantity/Quantity_ColorRGBA.cxx @@ -208,3 +208,18 @@ void Quantity_ColorRGBA::DumpJson (Standard_OStream& theOStream, Standard_Intege { OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "RGBA", 4, myRgb.Red(), myRgb.Green(), myRgb.Blue(), myAlpha) } + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean Quantity_ColorRGBA::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + Standard_Real aRed, aGreen, aBlue, anAlpha; + OCCT_INIT_VECTOR_CLASS (theSStream, "RGBA", aPos, 4, &aRed, &aGreen, &aBlue, &anAlpha) + + SetValues ((Standard_ShortReal)aRed, (Standard_ShortReal)aGreen, (Standard_ShortReal)aBlue, (Standard_ShortReal)anAlpha); + return Standard_True; +} diff --git a/src/Quantity/Quantity_ColorRGBA.hxx b/src/Quantity/Quantity_ColorRGBA.hxx index bf4e47b211..7823262791 100644 --- a/src/Quantity/Quantity_ColorRGBA.hxx +++ b/src/Quantity/Quantity_ColorRGBA.hxx @@ -158,6 +158,9 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); + private: static void myTestSize3() { Standard_STATIC_ASSERT (sizeof(float) * 3 == sizeof(Quantity_Color)); } diff --git a/src/Standard/Standard_Dump.cxx b/src/Standard/Standard_Dump.cxx index e897901d97..4f030678dc 100644 --- a/src/Standard/Standard_Dump.cxx +++ b/src/Standard/Standard_Dump.cxx @@ -74,6 +74,139 @@ void Standard_Dump::DumpRealValues (Standard_OStream& theOStream, int theCount, va_end(vl); } +//======================================================================= +//function : ProcessStreamName +//purpose : +//======================================================================= +Standard_Boolean Standard_Dump::ProcessStreamName (const Standard_SStream& theStream, + const TCollection_AsciiString& theName, + Standard_Integer& theStreamPos) +{ + TCollection_AsciiString aText = Text (theStream); + if (aText.IsEmpty()) + return Standard_False; + + if (aText.Length () < theStreamPos) + return Standard_False; + + TCollection_AsciiString aSubText = aText.SubString (theStreamPos, aText.Length()); + if (aSubText.StartsWith (JsonKeyToString (Standard_JsonKey_SeparatorValueToValue))) + { + theStreamPos += JsonKeyLength (Standard_JsonKey_SeparatorValueToValue); + aSubText = aText.SubString (theStreamPos, aText.Length()); + } + TCollection_AsciiString aKeyName = TCollection_AsciiString (JsonKeyToString (Standard_JsonKey_Quote)) + + theName + + TCollection_AsciiString (JsonKeyToString (Standard_JsonKey_Quote)) + + JsonKeyToString (Standard_JsonKey_SeparatorKeyToValue); + Standard_Boolean aResult = aSubText.StartsWith (aKeyName); + if (aResult) + theStreamPos += aKeyName.Length(); + + return aResult; +} + +//======================================================================= +//function : ProcessFieldName +//purpose : +//======================================================================= +Standard_Boolean Standard_Dump::ProcessFieldName (const Standard_SStream& theStream, + const TCollection_AsciiString& theName, + Standard_Integer& theStreamPos) +{ + TCollection_AsciiString aText = Text (theStream); + if (aText.IsEmpty()) + return Standard_False; + + TCollection_AsciiString aSubText = aText.SubString (theStreamPos, aText.Length()); + if (aSubText.StartsWith (JsonKeyToString (Standard_JsonKey_SeparatorValueToValue))) + { + theStreamPos += JsonKeyLength (Standard_JsonKey_SeparatorValueToValue); + aSubText = aText.SubString (theStreamPos, aText.Length()); + } + + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (theName.ToCString()); + TCollection_AsciiString aKeyName = TCollection_AsciiString (JsonKeyToString (Standard_JsonKey_Quote)) + + aName + + TCollection_AsciiString (JsonKeyToString (Standard_JsonKey_Quote)) + + JsonKeyToString (Standard_JsonKey_SeparatorKeyToValue); + + Standard_Boolean aResult = aSubText.StartsWith (aKeyName); + if (aResult) + theStreamPos += aKeyName.Length(); + + return aResult; +} + +//======================================================================= +//function : InitRealValues +//purpose : +//======================================================================= +Standard_Boolean Standard_Dump::InitRealValues (const Standard_SStream& theStream, + Standard_Integer& theStreamPos, + int theCount, ...) +{ + Standard_Integer aStreamPos = theStreamPos + JsonKeyLength (Standard_JsonKey_OpenContainer); + + TCollection_AsciiString aText = Text (theStream); + TCollection_AsciiString aSubText = aText.SubString (aStreamPos, aText.Length()); + + va_list vl; + va_start(vl, theCount); + aStreamPos = 1; + Standard_Integer aClosePos = aSubText.Location (JsonKeyToString (Standard_JsonKey_CloseContainer), aStreamPos, aSubText.Length()); + for(int i = 0; i < theCount; ++i) + { + Standard_Integer aNextPos = (i < theCount-1) ? aSubText.Location (JsonKeyToString (Standard_JsonKey_SeparatorValueToValue), aStreamPos, aSubText.Length()) + : aClosePos; + + TCollection_AsciiString aValueText = aSubText.SubString (aStreamPos, aNextPos - 1); + + if (!aValueText.IsRealValue()) + return Standard_False; + + Standard_Real aValue = aValueText.RealValue(); + *(va_arg(vl, Standard_Real*)) = aValue; + + aStreamPos = aNextPos + JsonKeyLength (Standard_JsonKey_SeparatorValueToValue); + } + va_end(vl); + aClosePos = aText.Location (JsonKeyToString (Standard_JsonKey_CloseContainer), theStreamPos, aText.Length()); + theStreamPos = aClosePos + JsonKeyLength (Standard_JsonKey_CloseContainer); + + return Standard_True; +} + +//======================================================================= +//function : InitValue +//purpose : +//======================================================================= +Standard_Boolean Standard_Dump::InitValue (const Standard_SStream& theStream, + Standard_Integer& theStreamPos, + TCollection_AsciiString& theValue) +{ + Standard_Integer aStreamPos = theStreamPos; + + TCollection_AsciiString aText = Text (theStream); + TCollection_AsciiString aSubText = aText.SubString (aStreamPos, aText.Length()); + + aStreamPos = 1; + Standard_Integer aNextPos = aSubText.Location (JsonKeyToString (Standard_JsonKey_SeparatorValueToValue), aStreamPos, aSubText.Length()); + Standard_JsonKey aNextKey = Standard_JsonKey_SeparatorValueToValue; + + Standard_Integer aCloseChildPos = aSubText.Location (JsonKeyToString (Standard_JsonKey_CloseChild), aStreamPos, aSubText.Length()); + Standard_Boolean isUseClosePos = (aNextPos > 0 && aCloseChildPos > 0 && aCloseChildPos < aNextPos) || !aNextPos; + if (isUseClosePos) + { + aNextPos = aCloseChildPos; + aNextKey = Standard_JsonKey_CloseChild; + } + + theValue = aNextPos ? aSubText.SubString (aStreamPos, aNextPos - 1) : aSubText; + theStreamPos = aNextPos ? (theStreamPos + (aNextPos - aStreamPos) + JsonKeyLength (aNextKey)) : aText.Length(); + return Standard_True; +} + // ======================================================================= // function : GetPointerInfo // purpose : diff --git a/src/Standard/Standard_Dump.hxx b/src/Standard/Standard_Dump.hxx index 72e7ccb45c..846c9cb001 100644 --- a/src/Standard/Standard_Dump.hxx +++ b/src/Standard/Standard_Dump.hxx @@ -77,6 +77,38 @@ theOStream << "\"" << aName << "\": " << theField; \ } +//! @def OCCT_INIT_FIELD_VALUE_REAL +//! Append vector values into output value: "Name": [value_1, value_2, ...] +//! This macro is intended to have only one row for dumped object in Json. +//! It's possible to use it without necessity of OCCT_DUMP_CLASS_BEGIN call, but pay attention that it should be only one row in the object dump. +#define OCCT_INIT_FIELD_VALUE_REAL(theOStream, theStreamPos, theField) \ +{ \ + Standard_Integer aStreamPos = theStreamPos; \ + if (!Standard_Dump::ProcessFieldName (theOStream, #theField, aStreamPos)) \ + return Standard_False; \ + TCollection_AsciiString aValueText; \ + if (!Standard_Dump::InitValue (theOStream, aStreamPos, aValueText) || !aValueText.IsRealValue()) \ + return Standard_False; \ + theField = aValueText.RealValue(); \ + theStreamPos = aStreamPos; \ +} + +//! @def OCCT_INIT_FIELD_VALUE_NUMERICAL +//! Append vector values into output value: "Name": [value_1, value_2, ...] +//! This macro is intended to have only one row for dumped object in Json. +//! It's possible to use it without necessity of OCCT_DUMP_CLASS_BEGIN call, but pay attention that it should be only one row in the object dump. +#define OCCT_INIT_FIELD_VALUE_INTEGER(theOStream, theStreamPos, theField) \ +{ \ + Standard_Integer aStreamPos = theStreamPos; \ + if (!Standard_Dump::ProcessFieldName (theOStream, #theField, aStreamPos)) \ + return Standard_False; \ + TCollection_AsciiString aValueText; \ + if (!Standard_Dump::InitValue (theOStream, aStreamPos, aValueText) || !aValueText.IsIntegerValue()) \ + return Standard_False; \ + theField = aValueText.IntegerValue(); \ + theStreamPos = aStreamPos; \ +} + //! @def OCCT_DUMP_FIELD_VALUE_STRING //! Append into output value: "Name": "Field" #define OCCT_DUMP_FIELD_VALUE_STRING(theOStream, theField) \ @@ -123,6 +155,18 @@ } \ } +//! @def OCCT_INIT_FIELD_VALUES_DUMPED +//! Append into output value: "Name": { field dumped values } +//! It computes Dump of the fields. The expected field is a pointer. +//! Use this macro for fields of the dumped class which has own Dump implementation. +//! The macros is recursive. Recursion is stopped when the depth value becomes equal to zero. +//! Depth = -1 is the default value, dump here is unlimited. +#define OCCT_INIT_FIELD_VALUES_DUMPED(theSStream, theStreamPos, theField) \ +{ \ + if ((theField) == NULL || !(theField)->InitFromJson (theSStream, theStreamPos)) \ + return Standard_False; \ +} + //! @def OCCT_DUMP_FIELD_VALUES_NUMERICAL //! Append real values into output values in an order: [value_1, value_2, ...] //! It computes Dump of the parent. The expected field is a parent class name to call ClassName::Dump. @@ -172,6 +216,20 @@ theOStream << "]"; \ } +//! @def OCCT_INIT_VECTOR_CLASS +//! Append vector values into output value: "Name": [value_1, value_2, ...] +//! This macro is intended to have only one row for dumped object in Json. +//! It's possible to use it without necessity of OCCT_DUMP_CLASS_BEGIN call, but pay attention that it should be only one row in the object dump. +#define OCCT_INIT_VECTOR_CLASS(theOStream, theName, theStreamPos, theCount, ...) \ +{ \ + Standard_Integer aStreamPos = theStreamPos; \ + if (!Standard_Dump::ProcessStreamName (theOStream, theName, aStreamPos)) \ + return Standard_False; \ + if (!Standard_Dump::InitRealValues (theOStream, aStreamPos, theCount, __VA_ARGS__)) \ + return Standard_False; \ + theStreamPos = aStreamPos; \ +} + //! Kind of key in Json string enum Standard_JsonKey { @@ -279,6 +337,38 @@ public: //! @param theCount numer of values Standard_EXPORT static void DumpRealValues (Standard_OStream& theOStream, int theCount, ...); + //! Check whether the parameter name is equal to the name in the stream at position + //! @param theSStream stream with values + //! @param theName stream key value + //! @param theStreamPos current position in the stream + Standard_EXPORT static Standard_Boolean ProcessStreamName (const Standard_SStream& theStream, + const TCollection_AsciiString& theName, + Standard_Integer& theStreamPos); + + //! Check whether the field name is equal to the name in the stream at position + //! @param theSStream stream with values + //! @param theName stream key field value + //! @param theStreamPos current position in the stream + Standard_EXPORT static Standard_Boolean ProcessFieldName (const Standard_SStream& theStream, + const TCollection_AsciiString& theName, + Standard_Integer& theStreamPos); + + //! Unite values in one value using template: value_1, value_2, ..., value_n + //! @param theSStream stream with values + //! @param theStreamPos current position in the stream + //! @param theCount numer of values + Standard_EXPORT static Standard_Boolean InitRealValues (const Standard_SStream& theStream, + Standard_Integer& theStreamPos, + int theCount, ...); + + //! Returns real value + //! @param theSStream stream with values + //! @param theStreamPos current position in the stream + //! @param theValue stream value + Standard_EXPORT static Standard_Boolean InitValue (const Standard_SStream& theStream, + Standard_Integer& theStreamPos, + TCollection_AsciiString& theValue); + //! Convert field name into dump text value, removes "&" and "my" prefixes //! An example, for field myValue, theName is Value, for &myCLass, the name is Class //! @param theField a source value diff --git a/src/gp/gp_Ax1.cxx b/src/gp/gp_Ax1.cxx index 3ee0231b34..378c714395 100644 --- a/src/gp/gp_Ax1.cxx +++ b/src/gp/gp_Ax1.cxx @@ -90,3 +90,17 @@ void gp_Ax1::DumpJson (Standard_OStream& theOStream, Standard_Integer) const OCCT_DUMP_VECTOR_CLASS (theOStream, "Location", 3, loc.X(), loc.Y(), loc.Z()) OCCT_DUMP_VECTOR_CLASS (theOStream, "Direction", 3, vdir.X(), vdir.Y(), vdir.Z()) } + +Standard_Boolean gp_Ax1::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + gp_XYZ& anXYZLoc = loc.ChangeCoord(); + OCCT_INIT_VECTOR_CLASS (theSStream, "Location", aPos, 3, &anXYZLoc.ChangeCoord (1), &anXYZLoc.ChangeCoord (2), &anXYZLoc.ChangeCoord (3)) + gp_XYZ aDir; + OCCT_INIT_VECTOR_CLASS (theSStream, "Direction", aPos, 3, &aDir.ChangeCoord (1), &aDir.ChangeCoord (2), &aDir.ChangeCoord (3)) + SetDirection (aDir); + + theStreamPos = aPos; + return Standard_True; +} diff --git a/src/gp/gp_Ax1.hxx b/src/gp/gp_Ax1.hxx index f71a0829fe..0d9b3683ee 100644 --- a/src/gp/gp_Ax1.hxx +++ b/src/gp/gp_Ax1.hxx @@ -208,7 +208,8 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; - + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff --git a/src/gp/gp_Ax2.cxx b/src/gp/gp_Ax2.cxx index ba8e7b155d..b16071f7fd 100644 --- a/src/gp/gp_Ax2.cxx +++ b/src/gp/gp_Ax2.cxx @@ -122,3 +122,28 @@ void gp_Ax2::DumpJson (Standard_OStream& theOStream, Standard_Integer) const OCCT_DUMP_VECTOR_CLASS (theOStream, "XDirection", 3, vxdir.X(), vxdir.Y(), vxdir.Z()) OCCT_DUMP_VECTOR_CLASS (theOStream, "YDirection", 3, vydir.X(), vydir.Y(), vydir.Z()) } + +Standard_Boolean gp_Ax2::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + gp_XYZ anXYZLoc; + OCCT_INIT_VECTOR_CLASS (theSStream, "Location", aPos, 3, &anXYZLoc.ChangeCoord (1), &anXYZLoc.ChangeCoord (2), &anXYZLoc.ChangeCoord (3)) + SetLocation (anXYZLoc); + + gp_XYZ aDir; + OCCT_INIT_VECTOR_CLASS (theSStream, "Direction", aPos, 3, &aDir.ChangeCoord (1), &aDir.ChangeCoord (2), &aDir.ChangeCoord (3)) + gp_XYZ aXDir; + OCCT_INIT_VECTOR_CLASS (theSStream, "XDirection", aPos, 3, &aXDir.ChangeCoord (1), &aXDir.ChangeCoord (2), &aXDir.ChangeCoord (3)) + gp_XYZ anYDir; + OCCT_INIT_VECTOR_CLASS (theSStream, "YDirection", aPos, 3, &anYDir.ChangeCoord (1), &anYDir.ChangeCoord (2), &anYDir.ChangeCoord (3)) + + SetXDirection (aXDir); + SetYDirection (anYDir); + + if (!Direction().IsEqual (aDir, Precision::Confusion())) + return Standard_False; + + theStreamPos = aPos; + return Standard_True; +} diff --git a/src/gp/gp_Ax2.hxx b/src/gp/gp_Ax2.hxx index 1586dfed73..50b243c8ac 100644 --- a/src/gp/gp_Ax2.hxx +++ b/src/gp/gp_Ax2.hxx @@ -326,6 +326,9 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); + protected: diff --git a/src/gp/gp_Ax3.cxx b/src/gp/gp_Ax3.cxx index ec5e8b7c4d..93e6d35757 100644 --- a/src/gp/gp_Ax3.cxx +++ b/src/gp/gp_Ax3.cxx @@ -115,3 +115,25 @@ void gp_Ax3::DumpJson (Standard_OStream& theOStream, Standard_Integer) const OCCT_DUMP_VECTOR_CLASS (theOStream, "XDirection", 3, XDirection().X(), XDirection().Y(), XDirection().Z()) OCCT_DUMP_VECTOR_CLASS (theOStream, "YDirection", 3, YDirection().X(), YDirection().Y(), YDirection().Z()) } + +Standard_Boolean gp_Ax3::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + gp_XYZ anXYZLoc; + OCCT_INIT_VECTOR_CLASS (theSStream, "Location", aPos, 3, &anXYZLoc.ChangeCoord (1), &anXYZLoc.ChangeCoord (2), &anXYZLoc.ChangeCoord (3)) + SetLocation (anXYZLoc); + + gp_XYZ aDir; + OCCT_INIT_VECTOR_CLASS (theSStream, "Direction", aPos, 3, &aDir.ChangeCoord (1), &aDir.ChangeCoord (2), &aDir.ChangeCoord (3)) + gp_XYZ aXDir; + OCCT_INIT_VECTOR_CLASS (theSStream, "XDirection", aPos, 3, &aXDir.ChangeCoord (1), &aXDir.ChangeCoord (2), &aXDir.ChangeCoord (3)) + gp_XYZ anYDir; + OCCT_INIT_VECTOR_CLASS (theSStream, "YDirection", aPos, 3, &anYDir.ChangeCoord (1), &anYDir.ChangeCoord (2), &anYDir.ChangeCoord (3)) + + SetXDirection (aXDir); + SetYDirection (anYDir); + + theStreamPos = aPos; + return Standard_True; +} diff --git a/src/gp/gp_Ax3.hxx b/src/gp/gp_Ax3.hxx index 50068bea7b..6424a14012 100644 --- a/src/gp/gp_Ax3.hxx +++ b/src/gp/gp_Ax3.hxx @@ -293,7 +293,8 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; - + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff --git a/src/gp/gp_Dir.cxx b/src/gp/gp_Dir.cxx index 0714a34e6b..68b57b9a1b 100644 --- a/src/gp/gp_Dir.cxx +++ b/src/gp/gp_Dir.cxx @@ -144,3 +144,13 @@ void gp_Dir::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_Dir", 3, coord.X(), coord.Y(), coord.Z()) } + +Standard_Boolean gp_Dir::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + OCCT_INIT_VECTOR_CLASS (theSStream, "gp_Dir", aPos, 3, &coord.ChangeCoord (1), &coord.ChangeCoord (2), &coord.ChangeCoord (3)) + + theStreamPos = aPos; + return Standard_True; +} diff --git a/src/gp/gp_Dir.hxx b/src/gp/gp_Dir.hxx index 0892155c00..8322c2a621 100644 --- a/src/gp/gp_Dir.hxx +++ b/src/gp/gp_Dir.hxx @@ -266,6 +266,8 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff --git a/src/gp/gp_Pnt.cxx b/src/gp/gp_Pnt.cxx index 10a9b5d434..e4541aeeb4 100644 --- a/src/gp/gp_Pnt.cxx +++ b/src/gp/gp_Pnt.cxx @@ -90,3 +90,13 @@ void gp_Pnt::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_Pnt", 3, coord.X(), coord.Y(), coord.Z()) } + +Standard_Boolean gp_Pnt::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + OCCT_INIT_VECTOR_CLASS (theSStream, "gp_Pnt", aPos, 3, &coord.ChangeCoord (1), &coord.ChangeCoord (2), &coord.ChangeCoord (3)) + + theStreamPos = aPos; + return Standard_True; +} diff --git a/src/gp/gp_Pnt.hxx b/src/gp/gp_Pnt.hxx index b9c4b5c087..3211e6a9b1 100644 --- a/src/gp/gp_Pnt.hxx +++ b/src/gp/gp_Pnt.hxx @@ -177,7 +177,8 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; - + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff --git a/src/gp/gp_Trsf.cxx b/src/gp/gp_Trsf.cxx index 9a4e299de5..f673419efa 100644 --- a/src/gp/gp_Trsf.cxx +++ b/src/gp/gp_Trsf.cxx @@ -864,3 +864,37 @@ void gp_Trsf::DumpJson (Standard_OStream& theOStream, Standard_Integer) const OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, shape) OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, scale) } + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean gp_Trsf::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + gp_XYZ anXYZLoc; + OCCT_INIT_VECTOR_CLASS (theSStream, "Location", aPos, 3, &anXYZLoc.ChangeCoord (1), &anXYZLoc.ChangeCoord (2), &anXYZLoc.ChangeCoord (3)) + SetTranslation (anXYZLoc); + + Standard_Real mymatrix[3][3]; + OCCT_INIT_VECTOR_CLASS (theSStream, "Matrix", aPos, 9, &mymatrix[0][0], &mymatrix[0][1], &mymatrix[0][2], + &mymatrix[1][0], &mymatrix[1][1], &mymatrix[1][2], + &mymatrix[2][0], &mymatrix[2][1], &mymatrix[2][2]) + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + matrix.SetValue (i + 1, j + 1, mymatrix[i][j]); + } + } + + Standard_Real myshape; + OCCT_INIT_FIELD_VALUE_INTEGER (theSStream, aPos, myshape); + shape = (gp_TrsfForm)((Standard_Integer)myshape); + + OCCT_INIT_FIELD_VALUE_REAL (theSStream, aPos, scale); + + theStreamPos = aPos; + return Standard_True; +} diff --git a/src/gp/gp_Trsf.hxx b/src/gp/gp_Trsf.hxx index 82c15e91c1..5e67718cac 100644 --- a/src/gp/gp_Trsf.hxx +++ b/src/gp/gp_Trsf.hxx @@ -25,6 +25,7 @@ #include #include #include +#include #include class Standard_ConstructionError; @@ -353,6 +354,9 @@ void operator *= (const gp_Trsf& T) //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); + friend class gp_GTrsf; protected: diff --git a/src/gp/gp_XYZ.cxx b/src/gp/gp_XYZ.cxx index 0599ad950e..06e20730e9 100644 --- a/src/gp/gp_XYZ.cxx +++ b/src/gp/gp_XYZ.cxx @@ -42,3 +42,17 @@ void gp_XYZ::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_XYZ", 3, x, y, z) } + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean gp_XYZ::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + OCCT_INIT_VECTOR_CLASS (theSStream, "gp_XYZ", aPos, 3, &x, &y, &z) + + theStreamPos = aPos; + return Standard_True; +} + diff --git a/src/gp/gp_XYZ.hxx b/src/gp/gp_XYZ.hxx index e3b49d82ec..a0fa59e6b8 100644 --- a/src/gp/gp_XYZ.hxx +++ b/src/gp/gp_XYZ.hxx @@ -24,6 +24,7 @@ #include #include +#include class Standard_ConstructionError; class Standard_OutOfRange; @@ -330,6 +331,9 @@ public: //! Dumps the content of me into the stream Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me into the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); + protected: diff --git a/tools/Convert/Convert_Tools.cxx b/tools/Convert/Convert_Tools.cxx index 47b640738d..d422933a9c 100644 --- a/tools/Convert/Convert_Tools.cxx +++ b/tools/Convert/Convert_Tools.cxx @@ -41,6 +41,18 @@ void Convert_Tools::ConvertStreamToPresentations (const Standard_SStream&, const Standard_Integer, NCollection_List&) { + + Select3D_BndBox3d aSelectBndBox; + if (aSelectBndBox.InitFromJson (theSStream, aStartPos)) + { + TopoDS_Shape aShape; + + gp_Pnt aPntMin = gp_Pnt (aSelectBndBox.CornerMin().x(), aSelectBndBox.CornerMin().y(), aSelectBndBox.CornerMin().z()); + gp_Pnt aPntMax = gp_Pnt (aSelectBndBox.CornerMax().x(), aSelectBndBox.CornerMax().y(), aSelectBndBox.CornerMax().z()); + if (CreateBoxShape (aPntMin, aPntMax, aShape)) + thePresentations.Append (new Convert_TransientShape (aShape)); + return; + } } //======================================================================= diff --git a/tools/TreeModel/TreeModel_ItemBase.cxx b/tools/TreeModel/TreeModel_ItemBase.cxx index 38ef9b23ca..1b23b909cb 100644 --- a/tools/TreeModel/TreeModel_ItemBase.cxx +++ b/tools/TreeModel/TreeModel_ItemBase.cxx @@ -92,6 +92,22 @@ TreeModel_ItemBasePtr TreeModel_ItemBase::Child (int theRow, int theColumn, cons return anItem; } +// ======================================================================= +// function : Presentations +// purpose : +// ======================================================================= +void TreeModel_ItemBase::Presentations (NCollection_List& thePresentations) +{ + if (Column() != 0) + return; + + const Handle(TreeModel_ItemProperties)& anItemProperties = Properties(); + if (anItemProperties) + { + anItemProperties->Presentations (thePresentations); + } +} + // ======================================================================= // function : currentItem // purpose : diff --git a/tools/TreeModel/TreeModel_ItemBase.hxx b/tools/TreeModel/TreeModel_ItemBase.hxx index 99f7d21068..752da3922a 100644 --- a/tools/TreeModel/TreeModel_ItemBase.hxx +++ b/tools/TreeModel/TreeModel_ItemBase.hxx @@ -149,6 +149,7 @@ public: //! Returns the item properties const Handle(TreeModel_ItemProperties)& Properties() const { return myProperties; } + Standard_EXPORT virtual void Presentations (NCollection_List& thePresentations); protected: //! \param theParent the parent item diff --git a/tools/VInspector/VInspector_ItemPresentableObject.cxx b/tools/VInspector/VInspector_ItemPresentableObject.cxx index 135170ea1b..9babba37ff 100644 --- a/tools/VInspector/VInspector_ItemPresentableObject.cxx +++ b/tools/VInspector/VInspector_ItemPresentableObject.cxx @@ -156,7 +156,7 @@ void VInspector_ItemPresentableObject::Init() } std::sort (aListOfIOSorted.begin(), aListOfIOSorted.end()); - int aCurrentIndex = 0; + int aCurrentIndex = 1; /* Properties item of context*/ for (std::vector::const_iterator anIOIt = aListOfIOSorted.begin(); anIOIt != aListOfIOSorted.end(); anIOIt++, aCurrentIndex++) { if (aCurrentIndex != aRowId) @@ -228,9 +228,10 @@ QString VInspector_ItemPresentableObject::PointerInfo() const // ======================================================================= void VInspector_ItemPresentableObject::Presentations (NCollection_List& thePresentations) { + TreeModel_ItemBase::Presentations (thePresentations); + if (Column() != 0) return; - thePresentations.Append (GetInteractiveObject()); } diff --git a/tools/VInspector/VInspector_Window.cxx b/tools/VInspector/VInspector_Window.cxx index 22ed9e50f6..1991dbe631 100644 --- a/tools/VInspector/VInspector_Window.cxx +++ b/tools/VInspector/VInspector_Window.cxx @@ -22,7 +22,6 @@ #include #include -#include #include #include @@ -392,7 +391,10 @@ void VInspector_Window::SelectedShapes (NCollection_List(anItem); if (!aVItem /*|| aVItem->Row() == 0*/) + { + anItem->Presentations (theSelPresentations); continue; + } TopoDS_Shape aShape = aVItem->GetPresentationShape(); if (aShape.IsNull()) @@ -595,15 +597,11 @@ void VInspector_Window::onTreeViewSelectionChanged (const QItemSelection&, if (!anItemBase) continue; - const Handle(TreeModel_ItemProperties)& anItemProperties = anItemBase->Properties(); - if (anItemProperties) - { - anItemProperties->Presentations (aSelPresentations); - } + anItemBase->Presentations (aSelPresentations); } SelectedShapes (aSelPresentations); - displayer()->DisplayPreview()->UpdatePreview (View_DisplayActionType_DisplayId, aSelPresentations, myViewWindow->ViewWidget()->DisplayMode()); + displayer()->UpdatePreview (View_DisplayActionType_DisplayId, aSelPresentations); } // ======================================================================= diff --git a/tools/View/View_DisplayPreview.cxx b/tools/View/View_DisplayPreview.cxx index 7e6c55123b..e129416f33 100644 --- a/tools/View/View_DisplayPreview.cxx +++ b/tools/View/View_DisplayPreview.cxx @@ -79,12 +79,13 @@ void View_DisplayPreview::SetContext (const Handle(AIS_InteractiveContext)& theC // purpose : // ======================================================================= void View_DisplayPreview::UpdatePreview (const View_DisplayActionType, - const NCollection_List& thePresentations, - int theDisplayMode) + const NCollection_List& thePresentations) { if (myContext.IsNull()) return; + int aPreviewDisplayMode = AIS_Shaded; + // clear previous previews for (NCollection_List::Iterator anIterator (myPreviewReadyPresentations); anIterator.More(); anIterator.Next()) { @@ -115,7 +116,7 @@ void View_DisplayPreview::UpdatePreview (const View_DisplayActionType, Handle(AIS_InteractiveObject) aPrs = Handle(AIS_InteractiveObject)::DownCast (anIterator.Value()); if (!aPrs.IsNull() && aPrs->GetContext().IsNull()/*is not displayed in another context*/) { - myContext->Display (aPrs, theDisplayMode, -1/*does not participate in selection*/, Standard_True); + myContext->Display (aPrs, aPreviewDisplayMode, -1/*does not participate in selection*/, Standard_True); enableGlobalClipping(aPrs, false); myPreviewReadyPresentations.Append (aPrs); } @@ -128,7 +129,7 @@ void View_DisplayPreview::UpdatePreview (const View_DisplayActionType, myPreviewPresentation->Attributes()->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_O_PLUS, aColor, 3.0)); myPreviewPresentation->SetAttributes (myPreviewParameters->GetDrawer()); - myContext->Display (myPreviewPresentation, theDisplayMode, -1/*does not participate in selection*/, Standard_True); + myContext->Display (myPreviewPresentation, aPreviewDisplayMode, -1/*does not participate in selection*/, Standard_True); enableGlobalClipping(myPreviewPresentation, false); } else @@ -140,28 +141,3 @@ void View_DisplayPreview::UpdatePreview (const View_DisplayActionType, } } } - -// ======================================================================= -// function : SetDisplayMode -// purpose : -// ======================================================================= -void View_DisplayPreview::SetDisplayMode (const int theDisplayMode, const bool theToUpdateViewer) -{ - if (myContext.IsNull()) - return; - - if (!myPreviewPresentation.IsNull()) - { - if (myContext == myPreviewPresentation->GetContext()) - myContext->SetDisplayMode (myPreviewPresentation, theDisplayMode, Standard_False); - } - - for (NCollection_List::Iterator aPreviewIt (myPreviewReadyPresentations); aPreviewIt.More(); aPreviewIt.Next()) - { - if (myContext == aPreviewIt.Value()->GetContext()) - myContext->SetDisplayMode (aPreviewIt.Value(), theDisplayMode, Standard_False); - } - - if (theToUpdateViewer) - myContext->UpdateCurrentViewer(); -} diff --git a/tools/View/View_DisplayPreview.hxx b/tools/View/View_DisplayPreview.hxx index 530bfea248..550e681289 100644 --- a/tools/View/View_DisplayPreview.hxx +++ b/tools/View/View_DisplayPreview.hxx @@ -53,12 +53,7 @@ public: //! Updates visibility of the presentations for the display type Standard_EXPORT void UpdatePreview (const View_DisplayActionType theType, - const NCollection_List& thePresentations, - int theDisplayMode); - - //! Sets display mode for all displayed presentations - Standard_EXPORT void SetDisplayMode (const int theDisplayMode, - const bool theToUpdateViewer = true); + const NCollection_List& thePresentations); //! Returns true if preview presentation is shown Standard_Boolean HasPreview() const { return !myPreviewPresentation.IsNull(); } diff --git a/tools/View/View_Displayer.cxx b/tools/View/View_Displayer.cxx index 9d36606c96..72c1c28ec7 100644 --- a/tools/View/View_Displayer.cxx +++ b/tools/View/View_Displayer.cxx @@ -34,7 +34,7 @@ // purpose : // ======================================================================= View_Displayer::View_Displayer() -: myIsKeepPresentations (false), myFitAllActive (false), myDisplayMode (-1) +: myIsKeepPresentations (false), myFitAllActive (false), myDisplayMode (0) { myDisplayPreview = new View_DisplayPreview(); } @@ -79,8 +79,6 @@ void View_Displayer::SetDisplayMode (const int theDisplayMode, for (AIS_ListIteratorOfListOfInteractive aDisplayedIt (aDisplayed); aDisplayedIt.More(); aDisplayedIt.Next()) GetContext()->SetDisplayMode (aDisplayedIt.Value(), theDisplayMode, Standard_False); - myDisplayPreview->SetDisplayMode (theDisplayMode, Standard_False); - if (theToUpdateViewer) UpdateViewer(); } @@ -270,7 +268,7 @@ bool View_Displayer::IsVisible (const TopoDS_Shape& theShape, const View_Present void View_Displayer::UpdatePreview (const View_DisplayActionType theType, const NCollection_List& thePresentations) { - myDisplayPreview->UpdatePreview (theType, thePresentations, myDisplayMode); + myDisplayPreview->UpdatePreview (theType, thePresentations); if (!myIsKeepPresentations || myFitAllActive) fitAllView(); } diff --git a/tools/View/View_PreviewParameters.cxx b/tools/View/View_PreviewParameters.cxx index 8cc48d06b1..f6375e5658 100644 --- a/tools/View/View_PreviewParameters.cxx +++ b/tools/View/View_PreviewParameters.cxx @@ -28,6 +28,7 @@ View_PreviewParameters::View_PreviewParameters() myDrawer = new Prs3d_Drawer(); Quantity_Color aColor(Quantity_NOC_TOMATO); + Standard_ShortReal aTransparency = 0.8; // point parameters myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_O_PLUS, aColor, 3.0)); @@ -41,6 +42,10 @@ View_PreviewParameters::View_PreviewParameters() 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); }