From ce13c99e9b5c9d4c201cbaa1e73477f0c414abc0 Mon Sep 17 00:00:00 2001 From: dpasukhi Date: Sun, 28 May 2023 13:18:14 +0100 Subject: [PATCH] // completed base animation XCAF getting/setting object Going to test on CAD format import --- src/XCAFDoc/XCAFDoc_Animation.cxx | 61 ++++++++++++++++++++++----- src/XCAFDoc/XCAFDoc_AnimationTool.cxx | 8 ++-- src/XCAFDoc/XCAFDoc_AnimationTool.hxx | 2 +- 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/XCAFDoc/XCAFDoc_Animation.cxx b/src/XCAFDoc/XCAFDoc_Animation.cxx index d5ad8aac77..42bc08e709 100644 --- a/src/XCAFDoc/XCAFDoc_Animation.cxx +++ b/src/XCAFDoc/XCAFDoc_Animation.cxx @@ -13,17 +13,23 @@ #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 IMPLEMENT_DERIVED_ATTRIBUTE(XCAFDoc_Animation, TDataStd_GenericEmpty) @@ -329,13 +335,36 @@ Handle(XCAFAnimObjects_AnimObject) XCAFDoc_Animation::GetObject() const { continue; } - Handle(TDataStd_IntegerArray) aDimArr; - if (!anOperL.FindAttribute(AnimValuesDimensionGUID(), aDimArr)) + Handle(TDataStd_IntegerArray) aDimAtrArr; + if (!anOperL.FindAttribute(AnimValuesDimensionGUID(), aDimAtrArr) || + aDimAtrArr->Length() != 2) { continue; } + Handle(TDataStd_RealArray) aValuesAtrArr; + if (!anOperL.FindAttribute(AnimValuesGUID(), aValuesAtrArr) || + (aDimAtrArr->Value(1) * aDimAtrArr->Value(2)) != aValuesAtrArr->Length()) + { + continue; + } + NCollection_Array2 aValuesArr(1, aDimAtrArr->Value(1), 1, aDimAtrArr->Value(2)); + int aValuesInd = 1; + for (NCollection_Array2::Iterator aOperValIter(aValuesArr); + aOperValIter.More(); aOperValIter.Next(), aValuesInd++) + { + aOperValIter.ChangeValue() = aValuesAtrArr->Value(aValuesInd); + } Handle(TDataStd_RealArray) aTimeStampsAttr; - anOperL.FindAttribute(AnimTimeStampsValuesGUID(), aTimeStampsAttr); + NCollection_Array1 aTimeStampsArr; + if (anOperL.FindAttribute(AnimTimeStampsValuesGUID(), aTimeStampsAttr) && + aTimeStampsAttr->Length() == aValuesArr.NbRows()) + { + aTimeStampsArr.Resize(1, aTimeStampsAttr->Length(), false); + for (int anTimeStampInd = 1; anTimeStampInd <= aTimeStampsAttr->Length(); anTimeStampInd++) + { + aTimeStampsArr.SetValue(anTimeStampInd, aTimeStampsAttr->Value(anTimeStampInd)); + } + } Handle(TDataStd_UAttribute) anInvertAttr; const bool anIsInvert = anOperL.FindAttribute(AnimInvertRefGUID(), anInvertAttr); Handle(XCAFAnimObjects_Operation) aNewOperObj; @@ -349,10 +378,12 @@ Handle(XCAFAnimObjects_AnimObject) XCAFDoc_Animation::GetObject() const continue; } TCollection_AsciiString aOperName = aOperNameAttr->Get(); + aNewOperObj = new XCAFAnimObjects_CustomOperation(aValuesArr, aTimeStampsArr, aOperName); break; } case XCAFAnimObjects_OperationType_Orient: { + aNewOperObj = new XCAFAnimObjects_Orient(aValuesArr, aTimeStampsArr); break; } case XCAFAnimObjects_OperationType_Rotate: @@ -364,25 +395,35 @@ Handle(XCAFAnimObjects_AnimObject) XCAFDoc_Animation::GetObject() const } const XCAFAnimObjects_Rotate::XCAFAnimObjects_Rotate_Type aRotateType = static_cast(aRotateTypeAttr->Get()); + aNewOperObj = new XCAFAnimObjects_Rotate(aValuesArr, aTimeStampsArr, aRotateType); break; } case XCAFAnimObjects_OperationType_Scale: { + aNewOperObj = new XCAFAnimObjects_Scale(aValuesArr, aTimeStampsArr); break; } case XCAFAnimObjects_OperationType_Skew: { + aNewOperObj = new XCAFAnimObjects_Skew(aValuesArr, aTimeStampsArr); break; } case XCAFAnimObjects_OperationType_Transform: { + aNewOperObj = new XCAFAnimObjects_Transform(aValuesArr, aTimeStampsArr); break; } case XCAFAnimObjects_OperationType_Translate: { + aNewOperObj = new XCAFAnimObjects_Translate(aValuesArr, aTimeStampsArr); break; } } + if (aNewOperObj.IsNull()) + { + continue; + } + anOrderedOperations.Append(aNewOperObj); } return anObj; } diff --git a/src/XCAFDoc/XCAFDoc_AnimationTool.cxx b/src/XCAFDoc/XCAFDoc_AnimationTool.cxx index 6f6927a6fa..bb8036086f 100644 --- a/src/XCAFDoc/XCAFDoc_AnimationTool.cxx +++ b/src/XCAFDoc/XCAFDoc_AnimationTool.cxx @@ -15,13 +15,13 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include #include > +#include IMPLEMENT_DERIVED_ATTRIBUTE_WITH_TYPE(XCAFDoc_AnimationTool, TDataStd_GenericEmpty, "xcaf", "AnimationTool") diff --git a/src/XCAFDoc/XCAFDoc_AnimationTool.hxx b/src/XCAFDoc/XCAFDoc_AnimationTool.hxx index f67809d02f..df66527a76 100644 --- a/src/XCAFDoc/XCAFDoc_AnimationTool.hxx +++ b/src/XCAFDoc/XCAFDoc_AnimationTool.hxx @@ -15,8 +15,8 @@ #ifndef _XCAFDoc_AnimationTool_HeaderFile #define _XCAFDoc_AnimationTool_HeaderFile -#include #include +#include //! A tool to store shapes in an XDE //! document in the form of assembly structure, and to maintain this structure.