1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-03 14:10:33 +03:00

0031326: Foundation Classes - Init from Json for base OCCT classes

(cherry picked from commit 39f197676cb85d2b84ad0ff15266eed118cbbaff)
(cherry picked from commit 4a5e30db5bbdfc7a77a03d1e55e8a3bee5d79d2d)
This commit is contained in:
nds
2020-02-12 23:35:54 +03:00
committed by nds
parent 9358c97d65
commit b4a5214bd2
32 changed files with 522 additions and 51 deletions

View File

@@ -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.

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -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;
}

View File

@@ -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)); }

View File

@@ -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 :

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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:

View File

@@ -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;
}

View File

@@ -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:

View File

@@ -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;
}

View File

@@ -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:

View File

@@ -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;
}

View File

@@ -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:

View File

@@ -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;
}

View File

@@ -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:

View File

@@ -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;
}

View File

@@ -25,6 +25,7 @@
#include <Standard_Integer.hxx>
#include <Standard_Handle.hxx>
#include <Standard_OStream.hxx>
#include <Standard_SStream.hxx>
#include <Standard_Real.hxx>
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:

View File

@@ -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;
}

View File

@@ -24,6 +24,7 @@
#include <Standard_Boolean.hxx>
#include <Standard_OStream.hxx>
#include <Standard_SStream.hxx>
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:

View File

@@ -41,6 +41,18 @@ void Convert_Tools::ConvertStreamToPresentations (const Standard_SStream&,
const Standard_Integer,
NCollection_List<Handle(Standard_Transient)>&)
{
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;
}
}
//=======================================================================

View File

@@ -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<Handle(Standard_Transient)>& thePresentations)
{
if (Column() != 0)
return;
const Handle(TreeModel_ItemProperties)& anItemProperties = Properties();
if (anItemProperties)
{
anItemProperties->Presentations (thePresentations);
}
}
// =======================================================================
// function : currentItem
// purpose :

View File

@@ -149,6 +149,7 @@ public:
//! Returns the item properties
const Handle(TreeModel_ItemProperties)& Properties() const { return myProperties; }
Standard_EXPORT virtual void Presentations (NCollection_List<Handle(Standard_Transient)>& thePresentations);
protected:
//! \param theParent the parent item

View File

@@ -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<Handle(AIS_InteractiveObject)>::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<Handle(Standard_Transient)>& thePresentations)
{
TreeModel_ItemBase::Presentations (thePresentations);
if (Column() != 0)
return;
thePresentations.Append (GetInteractiveObject());
}

View File

@@ -22,7 +22,6 @@
#include <inspector/TreeModel_ColumnType.hxx>
#include <inspector/TreeModel_ContextMenu.hxx>
#include <inspector/TreeModel_ItemProperties.hxx>
#include <inspector/TreeModel_Tools.hxx>
#include <inspector/ViewControl_MessageDialog.hxx>
@@ -392,7 +391,10 @@ void VInspector_Window::SelectedShapes (NCollection_List<Handle(Standard_Transie
TreeModel_ItemBasePtr anItem = *anItemIt;
VInspector_ItemBasePtr aVItem = itemDynamicCast<VInspector_ItemBase>(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);
}
// =======================================================================

View File

@@ -79,12 +79,13 @@ void View_DisplayPreview::SetContext (const Handle(AIS_InteractiveContext)& theC
// purpose :
// =======================================================================
void View_DisplayPreview::UpdatePreview (const View_DisplayActionType,
const NCollection_List<Handle(Standard_Transient)>& thePresentations,
int theDisplayMode)
const NCollection_List<Handle(Standard_Transient)>& thePresentations)
{
if (myContext.IsNull())
return;
int aPreviewDisplayMode = AIS_Shaded;
// clear previous previews
for (NCollection_List<Handle(AIS_InteractiveObject)>::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<Handle(AIS_InteractiveObject)>::Iterator aPreviewIt (myPreviewReadyPresentations); aPreviewIt.More(); aPreviewIt.Next())
{
if (myContext == aPreviewIt.Value()->GetContext())
myContext->SetDisplayMode (aPreviewIt.Value(), theDisplayMode, Standard_False);
}
if (theToUpdateViewer)
myContext->UpdateCurrentViewer();
}

View File

@@ -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<Handle(Standard_Transient)>& thePresentations,
int theDisplayMode);
//! Sets display mode for all displayed presentations
Standard_EXPORT void SetDisplayMode (const int theDisplayMode,
const bool theToUpdateViewer = true);
const NCollection_List<Handle(Standard_Transient)>& thePresentations);
//! Returns true if preview presentation is shown
Standard_Boolean HasPreview() const { return !myPreviewPresentation.IsNull(); }

View File

@@ -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<Handle(Standard_Transient)>& thePresentations)
{
myDisplayPreview->UpdatePreview (theType, thePresentations, myDisplayMode);
myDisplayPreview->UpdatePreview (theType, thePresentations);
if (!myIsKeepPresentations || myFitAllActive)
fitAllView();
}

View File

@@ -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);
}