1 // Created on: 1999-06-16
2 // Created by: Sergey RUIN
3 // Copyright (c) 1999-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <TDataStd_RealArray.ixx>
18 #include <TDataStd_DeltaOnModificationOfRealArray.hxx>
19 #include <TDF_DefaultDeltaOnModification.hxx>
21 //=======================================================================
24 //=======================================================================
26 const Standard_GUID& TDataStd_RealArray::GetID()
28 static Standard_GUID TDataStd_RealArrayID ("2a96b61e-ec8b-11d0-bee7-080009dc3333");
29 return TDataStd_RealArrayID;
33 //=======================================================================
34 //function : TDataStd_RealArray
35 //purpose : Empty Constructor
36 //=======================================================================
38 TDataStd_RealArray::TDataStd_RealArray() : myIsDelta(Standard_False){}
40 //=======================================================================
43 //=======================================================================
45 void TDataStd_RealArray::Init(const Standard_Integer lower,
46 const Standard_Integer upper)
48 Backup(); // jfa 15.01.2003 for LH3D1378
50 myValue = new TColStd_HArray1OfReal(lower, upper, 0.);
53 //=======================================================================
56 //=======================================================================
58 Handle(TDataStd_RealArray) TDataStd_RealArray::Set
59 (const TDF_Label& label,
60 const Standard_Integer lower,
61 const Standard_Integer upper,
62 const Standard_Boolean isDelta)
64 Handle(TDataStd_RealArray) A;
65 if (!label.FindAttribute (TDataStd_RealArray::GetID(), A)) {
66 A = new TDataStd_RealArray;
67 A->Init (lower, upper);
69 label.AddAttribute(A);
71 else if (lower != A->Lower() || upper != A->Upper())
73 A->Init (lower, upper);
79 //=======================================================================
82 //=======================================================================
84 void TDataStd_RealArray::SetValue (const Standard_Integer index,
85 const Standard_Real value)
88 if(myValue.IsNull()) return;
89 if(myValue->Value(index) == value)
92 myValue->SetValue(index, value);
96 //=======================================================================
99 //=======================================================================
101 Standard_Real TDataStd_RealArray::Value (const Standard_Integer index) const
103 if(myValue.IsNull()) return RealFirst();
104 return myValue->Value(index);
109 //=======================================================================
112 //=======================================================================
113 Standard_Integer TDataStd_RealArray::Lower (void) const
115 if(myValue.IsNull()) return 0;
116 return myValue->Lower();
120 //=======================================================================
123 //=======================================================================
124 Standard_Integer TDataStd_RealArray::Upper (void) const
126 if(myValue.IsNull()) return 0;
127 return myValue->Upper();
131 //=======================================================================
134 //=======================================================================
135 Standard_Integer TDataStd_RealArray::Length (void) const
137 if(myValue.IsNull()) return 0;
138 return myValue->Length();
142 //=======================================================================
143 //function : ChangeArray
144 //purpose : If value of <newArray> differs from <myValue>, Backup
145 // : performed and myValue refers to new instance of HArray1OfReal
146 // : that holds <newArray>
147 //=======================================================================
149 void TDataStd_RealArray::ChangeArray(const Handle(TColStd_HArray1OfReal)& newArray,
150 const Standard_Boolean isCheckItems)
152 Standard_Integer aLower = newArray->Lower();
153 Standard_Integer anUpper = newArray->Upper();
154 Standard_Boolean aDimEqual = Standard_False;
157 if (Lower() == aLower && Upper() == anUpper ) {
158 aDimEqual = Standard_True;
159 Standard_Boolean isEqual = Standard_True;
161 for(i = aLower; i <= anUpper; i++) {
162 if(myValue->Value(i) != newArray->Value(i)) {
163 isEqual = Standard_False;
174 if(myValue.IsNull() || !aDimEqual)
175 myValue = new TColStd_HArray1OfReal(aLower, anUpper);
177 for(i = aLower; i <= anUpper; i++)
178 myValue->SetValue(i, newArray->Value(i));
181 //=======================================================================
184 //=======================================================================
186 const Standard_GUID& TDataStd_RealArray::ID () const { return GetID(); }
189 //=======================================================================
190 //function : NewEmpty
192 //=======================================================================
194 Handle(TDF_Attribute) TDataStd_RealArray::NewEmpty () const
196 return new TDataStd_RealArray();
199 //=======================================================================
202 //=======================================================================
204 void TDataStd_RealArray::Restore(const Handle(TDF_Attribute)& With)
206 Standard_Integer i, lower, upper;
207 Handle(TDataStd_RealArray) anArray = Handle(TDataStd_RealArray)::DownCast(With);
208 if(!anArray->myValue.IsNull()) {
209 lower = anArray->Lower();
210 upper = anArray->Upper();
211 myIsDelta = anArray->myIsDelta;
212 myValue = new TColStd_HArray1OfReal(lower, upper);
213 for(i = lower; i<=upper; i++)
214 myValue->SetValue(i, anArray->Value(i));
220 //=======================================================================
223 //=======================================================================
225 void TDataStd_RealArray::Paste (const Handle(TDF_Attribute)& Into,
226 const Handle(TDF_RelocationTable)& ) const
228 if(!myValue.IsNull()) {
229 Handle(TDataStd_RealArray) anAtt = Handle(TDataStd_RealArray)::DownCast(Into);
230 if(!anAtt.IsNull()) {
231 anAtt->ChangeArray( myValue, Standard_False );
232 anAtt->SetDelta(myIsDelta);
237 //=======================================================================
240 //=======================================================================
242 Standard_OStream& TDataStd_RealArray::Dump (Standard_OStream& anOS) const
244 anOS << "\nRealArray::" << this <<" :";
245 if(!myValue.IsNull()) {
246 Standard_Integer i, lower, upper;
247 lower = myValue->Lower();
248 upper = myValue->Upper();
249 for(i = lower; i<=upper; i++)
250 anOS << " " <<myValue->Value(i);
252 anOS << " Delta is " << (myIsDelta ? "ON":"OFF");
257 //=======================================================================
258 //function : DeltaOnModification
260 //=======================================================================
262 Handle(TDF_DeltaOnModification) TDataStd_RealArray::DeltaOnModification
263 (const Handle(TDF_Attribute)& OldAtt) const
266 return new TDataStd_DeltaOnModificationOfRealArray(Handle(TDataStd_RealArray)::DownCast (OldAtt));
267 else return new TDF_DefaultDeltaOnModification(OldAtt);