| 1 | // Created on: 2001-08-31 |
| 2 | // Created by: Julia DOROVSKIKH |
| 3 | // Copyright (c) 2001-2014 OPEN CASCADE SAS |
| 4 | // |
| 5 | // This file is part of Open CASCADE Technology software library. |
| 6 | // |
| 7 | // This library is free software; you can redistribute it and/or modify it under |
| 8 | // the terms of the GNU Lesser General Public License version 2.1 as published |
| 9 | // by the Free Software Foundation, with special exception defined in the file |
| 10 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
| 11 | // distribution for complete text of the license and disclaimer of any warranty. |
| 12 | // |
| 13 | // Alternatively, this file may be used under the terms of Open CASCADE |
| 14 | // commercial license or contractual agreement. |
| 15 | |
| 16 | #include <XmlMNaming_NamingDriver.ixx> |
| 17 | |
| 18 | #include <XmlObjMgt.hxx> |
| 19 | #include <XmlMNaming.hxx> |
| 20 | #include <TNaming_Name.hxx> |
| 21 | #include <TNaming_Naming.hxx> |
| 22 | #include <TNaming_NamedShape.hxx> |
| 23 | #include <TNaming_ListIteratorOfListOfNamedShape.hxx> |
| 24 | #include <TNaming_Iterator.hxx> |
| 25 | #include <TDF_Tool.hxx> |
| 26 | |
| 27 | //======================================================================= |
| 28 | static TopAbs_ShapeEnum ShapeEnumFromString (const XmlObjMgt_DOMString&); |
| 29 | static TNaming_NameType NameTypeFromString (const XmlObjMgt_DOMString&); |
| 30 | |
| 31 | static const XmlObjMgt_DOMString& ShapeEnumToString (const TopAbs_ShapeEnum); |
| 32 | static const XmlObjMgt_DOMString& NameTypeToString (const TNaming_NameType); |
| 33 | |
| 34 | IMPLEMENT_DOMSTRING (IndexString, "index") |
| 35 | IMPLEMENT_DOMSTRING (StopNamedShapeString, "stopNS") |
| 36 | IMPLEMENT_DOMSTRING (TypeString, "nametype") |
| 37 | IMPLEMENT_DOMSTRING (ShapeTypeString, "shapetype") |
| 38 | IMPLEMENT_DOMSTRING (ArgumentsString, "arguments") |
| 39 | IMPLEMENT_DOMSTRING (ContextLabelString, "contextlabel") |
| 40 | IMPLEMENT_DOMSTRING (OrientString, "orientation") |
| 41 | |
| 42 | IMPLEMENT_DOMSTRING (NTUnknownString, "unknown") |
| 43 | IMPLEMENT_DOMSTRING (NTIdentityString, "identity") |
| 44 | IMPLEMENT_DOMSTRING (NTModifUntilString, "modifuntil") |
| 45 | IMPLEMENT_DOMSTRING (NTGenerationString, "generation") |
| 46 | IMPLEMENT_DOMSTRING (NTIntersectionString, "intersection") |
| 47 | IMPLEMENT_DOMSTRING (NTUnionString, "union") |
| 48 | IMPLEMENT_DOMSTRING (NTSubtractionString, "subtraction") |
| 49 | IMPLEMENT_DOMSTRING (NTConstShapeString, "constshape") |
| 50 | IMPLEMENT_DOMSTRING (NTFilterByNeighString, "filterbyneigh") |
| 51 | IMPLEMENT_DOMSTRING (NTOrientationString, "orientation") |
| 52 | IMPLEMENT_DOMSTRING (NTWireInString, "wirein") |
| 53 | IMPLEMENT_DOMSTRING (NTShellInString, "shellin") |
| 54 | |
| 55 | IMPLEMENT_DOMSTRING (ShCompoundString, "compound") |
| 56 | IMPLEMENT_DOMSTRING (ShCompsolidString, "compsolid") |
| 57 | IMPLEMENT_DOMSTRING (ShSolidString, "solid") |
| 58 | IMPLEMENT_DOMSTRING (ShShellString, "shell") |
| 59 | IMPLEMENT_DOMSTRING (ShFaceString, "face") |
| 60 | IMPLEMENT_DOMSTRING (ShWireString, "wire") |
| 61 | IMPLEMENT_DOMSTRING (ShEdgeString, "edge") |
| 62 | IMPLEMENT_DOMSTRING (ShVertexString, "vertex") |
| 63 | IMPLEMENT_DOMSTRING (ShShapeString, "shape") |
| 64 | |
| 65 | //======================================================================= |
| 66 | //function : XmlMNaming_NamingDriver |
| 67 | //purpose : Constructor |
| 68 | //======================================================================= |
| 69 | XmlMNaming_NamingDriver::XmlMNaming_NamingDriver |
| 70 | (const Handle(CDM_MessageDriver)& theMsgDriver) |
| 71 | : XmlMDF_ADriver (theMsgDriver, NULL) |
| 72 | {} |
| 73 | |
| 74 | //======================================================================= |
| 75 | //function : NewEmpty |
| 76 | //purpose : |
| 77 | //======================================================================= |
| 78 | Handle(TDF_Attribute) XmlMNaming_NamingDriver::NewEmpty() const |
| 79 | { |
| 80 | return (new TNaming_Naming()); |
| 81 | } |
| 82 | |
| 83 | //======================================================================= |
| 84 | //function : Paste |
| 85 | //purpose : persistent -> transient (retrieve) |
| 86 | //======================================================================= |
| 87 | Standard_Boolean XmlMNaming_NamingDriver::Paste |
| 88 | (const XmlObjMgt_Persistent& theSource, |
| 89 | const Handle(TDF_Attribute)& theTarget, |
| 90 | XmlObjMgt_RRelocationTable& theRelocTable) const |
| 91 | { |
| 92 | const XmlObjMgt_Element& anElem = theSource; |
| 93 | Handle(TNaming_Naming) aNg = Handle(TNaming_Naming)::DownCast(theTarget); |
| 94 | |
| 95 | TNaming_Name& aNgName = aNg->ChangeName(); |
| 96 | |
| 97 | // type and shape type |
| 98 | aNgName.Type (NameTypeFromString (anElem.getAttribute(::TypeString()))); |
| 99 | aNgName.ShapeType(ShapeEnumFromString(anElem.getAttribute(::ShapeTypeString()))); |
| 100 | |
| 101 | Standard_Integer aNb; |
| 102 | Handle(TNaming_NamedShape) NS; |
| 103 | TCollection_ExtendedString aMsgString; |
| 104 | |
| 105 | XmlObjMgt_DOMString aDOMStr = anElem.getAttribute(::ArgumentsString()); |
| 106 | if (aDOMStr != NULL) |
| 107 | { |
| 108 | Standard_CString aGs = Standard_CString(aDOMStr.GetString()); |
| 109 | |
| 110 | // first argument |
| 111 | if (!XmlObjMgt::GetInteger(aGs, aNb)) |
| 112 | { |
| 113 | aMsgString = TCollection_ExtendedString |
| 114 | ("XmlMNaming_NamingDriver: Cannot retrieve reference " |
| 115 | "on first Argument from \"") + aDOMStr + "\""; |
| 116 | WriteMessage (aMsgString); |
| 117 | return Standard_False; |
| 118 | } |
| 119 | while (aNb > 0) |
| 120 | { |
| 121 | if (theRelocTable.IsBound(aNb)) |
| 122 | NS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb)); |
| 123 | else |
| 124 | { |
| 125 | NS = new TNaming_NamedShape; |
| 126 | theRelocTable.Bind(aNb, NS); |
| 127 | } |
| 128 | aNgName.Append(NS); |
| 129 | |
| 130 | // next argument |
| 131 | if (!XmlObjMgt::GetInteger(aGs, aNb)) aNb = 0; |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | // stop named shape |
| 136 | aDOMStr = anElem.getAttribute(::StopNamedShapeString()); |
| 137 | if (aDOMStr != NULL) |
| 138 | { |
| 139 | if (!aDOMStr.GetInteger(aNb)) |
| 140 | { |
| 141 | aMsgString = TCollection_ExtendedString |
| 142 | ("XmlMNaming_NamingDriver: Cannot retrieve reference " |
| 143 | "on StopNamedShape from \"") + aDOMStr + "\""; |
| 144 | WriteMessage (aMsgString); |
| 145 | return Standard_False; |
| 146 | } |
| 147 | if (aNb > 0) |
| 148 | { |
| 149 | if (theRelocTable.IsBound(aNb)) |
| 150 | NS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb)); |
| 151 | else |
| 152 | { |
| 153 | NS = new TNaming_NamedShape; |
| 154 | theRelocTable.Bind(aNb, NS); |
| 155 | } |
| 156 | aNgName.StopNamedShape(NS); |
| 157 | } |
| 158 | } |
| 159 | |
| 160 | // index |
| 161 | aDOMStr = anElem.getAttribute(::IndexString()); |
| 162 | if (!aDOMStr.GetInteger(aNb)) |
| 163 | { |
| 164 | aMsgString = TCollection_ExtendedString |
| 165 | ("XmlMNaming_NamingDriver: Cannot retrieve " |
| 166 | "integer value of Index from \"") + aDOMStr + "\""; |
| 167 | WriteMessage (aMsgString); |
| 168 | return Standard_False; |
| 169 | } |
| 170 | aNgName.Index(aNb); |
| 171 | // |
| 172 | #ifdef DEB |
| 173 | //cout << "CurDocVersion = " << XmlMNaming::DocumentVersion() <<endl; |
| 174 | #endif |
| 175 | if(XmlMNaming::DocumentVersion() > 3) { |
| 176 | XmlObjMgt_DOMString aDomEntry = anElem.getAttribute(::ContextLabelString()); |
| 177 | if (aDomEntry != NULL) |
| 178 | { |
| 179 | TCollection_AsciiString anEntry; |
| 180 | if (XmlObjMgt::GetTagEntryString (aDomEntry, anEntry) == Standard_False) |
| 181 | { |
| 182 | TCollection_ExtendedString aMessage = |
| 183 | TCollection_ExtendedString ("Cannot retrieve Entry from \"") |
| 184 | + aDomEntry + '\"'; |
| 185 | WriteMessage (aMessage); |
| 186 | return Standard_False; |
| 187 | } |
| 188 | |
| 189 | // find label by entry |
| 190 | TDF_Label tLab; // Null label. |
| 191 | if (anEntry.Length() > 0) { |
| 192 | TDF_Tool::Label(aNg->Label().Data(), anEntry, tLab, Standard_True); |
| 193 | aNgName.ContextLabel(tLab); |
| 194 | #ifdef DEB |
| 195 | cout << "Retrieving Context Label = " << anEntry.ToCString() <<endl; |
| 196 | #endif |
| 197 | } |
| 198 | } |
| 199 | #ifdef DEB |
| 200 | else |
| 201 | cout << "Retrieving Context Label is NULL" <<endl; |
| 202 | #endif |
| 203 | |
| 204 | if(XmlMNaming::DocumentVersion() > 4 && XmlMNaming::DocumentVersion() < 7) { |
| 205 | // Orientation processing - converting from old format |
| 206 | Handle(TNaming_NamedShape) aNS; |
| 207 | if (aNg->Label().FindAttribute(TNaming_NamedShape::GetID(), aNS)) { |
| 208 | //const TDF_Label& aLab = aNS->Label(); |
| 209 | TNaming_Iterator itL (aNS); |
| 210 | for (; itL.More(); itL.Next()) { |
| 211 | const TopoDS_Shape& S = itL.NewShape(); |
| 212 | if (S.IsNull()) continue; |
| 213 | if(aNS->Evolution() == TNaming_SELECTED) { |
| 214 | if (itL.More() && itL.NewShape().ShapeType() != TopAbs_VERTEX && |
| 215 | !itL.OldShape().IsNull() && itL.OldShape().ShapeType() == TopAbs_VERTEX ) {//OR-N |
| 216 | TopAbs_Orientation OrientationToApply = itL.OldShape().Orientation(); |
| 217 | aNgName.Orientation(OrientationToApply); |
| 218 | } |
| 219 | } |
| 220 | } |
| 221 | } |
| 222 | } |
| 223 | if(XmlMNaming::DocumentVersion() > 6) { |
| 224 | aDOMStr = anElem.getAttribute(::OrientString()); |
| 225 | if (!aDOMStr.GetInteger(aNb)) |
| 226 | { |
| 227 | aMsgString = TCollection_ExtendedString |
| 228 | ("XmlMNaming_NamingDriver: Cannot retrieve " |
| 229 | "integer value of orientation from \"") + aDOMStr + "\""; |
| 230 | WriteMessage (aMsgString); |
| 231 | return Standard_False; |
| 232 | } |
| 233 | aNgName.Orientation((TopAbs_Orientation)aNb); |
| 234 | } |
| 235 | // or. end |
| 236 | } |
| 237 | #ifdef DEB |
| 238 | else if(XmlMNaming::DocumentVersion() == -1) |
| 239 | cout << "Current DocVersion field is not initialized. " <<endl; |
| 240 | else |
| 241 | cout << "Current DocVersion = " << XmlMNaming::DocumentVersion() <<endl; |
| 242 | #endif |
| 243 | return Standard_True; |
| 244 | } |
| 245 | |
| 246 | //======================================================================= |
| 247 | //function : Paste |
| 248 | //purpose : transient -> persistent (store) |
| 249 | //======================================================================= |
| 250 | void XmlMNaming_NamingDriver::Paste |
| 251 | (const Handle(TDF_Attribute)& theSource, |
| 252 | XmlObjMgt_Persistent& theTarget, |
| 253 | XmlObjMgt_SRelocationTable& theRelocTable) const |
| 254 | { |
| 255 | Handle(TNaming_Naming) aNg = Handle(TNaming_Naming)::DownCast(theSource); |
| 256 | XmlObjMgt_Element& anElem = theTarget; |
| 257 | const TNaming_Name& aNgName = aNg->GetName(); |
| 258 | |
| 259 | // type and shape type |
| 260 | anElem.setAttribute(::TypeString(), NameTypeToString(aNgName.Type())); |
| 261 | anElem.setAttribute(::ShapeTypeString(), ShapeEnumToString(aNgName.ShapeType())); |
| 262 | |
| 263 | Standard_Integer aNb; |
| 264 | |
| 265 | // arguments |
| 266 | Standard_Integer NbArgs = aNgName.Arguments().Extent(); |
| 267 | if (NbArgs > 0) |
| 268 | { |
| 269 | TCollection_AsciiString anArgsStr; |
| 270 | for (TNaming_ListIteratorOfListOfNamedShape it (aNgName.Arguments()); it.More(); it.Next()) |
| 271 | { |
| 272 | Handle(TNaming_NamedShape) anArg = it.Value(); |
| 273 | aNb = 0; |
| 274 | if (!anArg.IsNull()) |
| 275 | { |
| 276 | aNb = theRelocTable.FindIndex(anArg); |
| 277 | if (aNb == 0) |
| 278 | { |
| 279 | aNb = theRelocTable.Add(anArg); |
| 280 | } |
| 281 | anArgsStr += TCollection_AsciiString(aNb) + " "; |
| 282 | } |
| 283 | else anArgsStr += "0 "; |
| 284 | } |
| 285 | anElem.setAttribute(::ArgumentsString(), anArgsStr.ToCString()); |
| 286 | } |
| 287 | |
| 288 | // stop named shape |
| 289 | Handle(TNaming_NamedShape) aSNS = aNgName.StopNamedShape(); |
| 290 | if (!aSNS.IsNull()) |
| 291 | { |
| 292 | aNb = theRelocTable.FindIndex(aSNS); |
| 293 | if (aNb == 0) |
| 294 | { |
| 295 | aNb = theRelocTable.Add(aSNS); |
| 296 | } |
| 297 | anElem.setAttribute(::StopNamedShapeString(), aNb); |
| 298 | } |
| 299 | |
| 300 | // index |
| 301 | anElem.setAttribute(::IndexString(), aNgName.Index()); |
| 302 | |
| 303 | // context label |
| 304 | TCollection_AsciiString anEntry; |
| 305 | if(!aNgName.ContextLabel().IsNull()) |
| 306 | TDF_Tool::Entry(aNgName.ContextLabel(), anEntry); |
| 307 | XmlObjMgt_DOMString aDOMString; |
| 308 | XmlObjMgt::SetTagEntryString (aDOMString, anEntry); |
| 309 | anElem.setAttribute(::ContextLabelString(), aDOMString); |
| 310 | #ifdef DEB |
| 311 | cout << "XmlMNaming_NamingDriver::Store: ContextLabel Entry = " << anEntry << endl; |
| 312 | if (aDOMString != NULL) |
| 313 | { |
| 314 | Standard_CString aStr = Standard_CString(aDOMString.GetString()); |
| 315 | cout << "XmlMNaming_NamingDriver::Store: ContextLabel DOMString = " << aStr << endl; |
| 316 | } else |
| 317 | cout << "XmlMNaming_NamingDriver::Store: aDOMString is NULL" <<endl; |
| 318 | #endif |
| 319 | |
| 320 | // orientation |
| 321 | anElem.setAttribute(::OrientString(), (Standard_Integer)aNgName.Orientation()); |
| 322 | |
| 323 | } |
| 324 | |
| 325 | //======================================================================= |
| 326 | //function : ShapeEnumToString |
| 327 | //purpose : |
| 328 | //======================================================================= |
| 329 | static const XmlObjMgt_DOMString& ShapeEnumToString (const TopAbs_ShapeEnum theE) |
| 330 | { |
| 331 | switch (theE) |
| 332 | { |
| 333 | case TopAbs_COMPOUND : return ::ShCompoundString(); |
| 334 | case TopAbs_COMPSOLID : return ::ShCompsolidString(); |
| 335 | case TopAbs_SOLID : return ::ShSolidString(); |
| 336 | case TopAbs_SHELL : return ::ShShellString(); |
| 337 | case TopAbs_FACE : return ::ShFaceString(); |
| 338 | case TopAbs_WIRE : return ::ShWireString(); |
| 339 | case TopAbs_EDGE : return ::ShEdgeString(); |
| 340 | case TopAbs_VERTEX : return ::ShVertexString(); |
| 341 | case TopAbs_SHAPE : return ::ShShapeString(); |
| 342 | } |
| 343 | static XmlObjMgt_DOMString aNullString; |
| 344 | return aNullString; // To avoid compilation error message. |
| 345 | } |
| 346 | |
| 347 | //======================================================================= |
| 348 | //function : NameTypeToString |
| 349 | //purpose : |
| 350 | //======================================================================= |
| 351 | static const XmlObjMgt_DOMString& NameTypeToString (const TNaming_NameType theE) |
| 352 | { |
| 353 | switch (theE) |
| 354 | { |
| 355 | case TNaming_UNKNOWN : return ::NTUnknownString(); |
| 356 | case TNaming_IDENTITY : return ::NTIdentityString(); |
| 357 | case TNaming_MODIFUNTIL : return ::NTModifUntilString(); |
| 358 | case TNaming_GENERATION : return ::NTGenerationString(); |
| 359 | case TNaming_INTERSECTION : return ::NTIntersectionString(); |
| 360 | case TNaming_UNION : return ::NTUnionString(); |
| 361 | case TNaming_SUBSTRACTION : return ::NTSubtractionString(); |
| 362 | case TNaming_CONSTSHAPE : return ::NTConstShapeString(); |
| 363 | case TNaming_FILTERBYNEIGHBOURGS : return ::NTFilterByNeighString(); |
| 364 | case TNaming_ORIENTATION : return ::NTOrientationString(); |
| 365 | case TNaming_WIREIN : return ::NTWireInString(); |
| 366 | case TNaming_SHELLIN : return ::NTShellInString(); |
| 367 | default: |
| 368 | Standard_DomainError::Raise("TNaming_NameType; enum term unknown "); |
| 369 | } |
| 370 | static XmlObjMgt_DOMString aNullString; |
| 371 | return aNullString; // To avoid compilation error message. |
| 372 | } |
| 373 | |
| 374 | //======================================================================= |
| 375 | //function : ShapeEnumFromString |
| 376 | //purpose : |
| 377 | //======================================================================= |
| 378 | static TopAbs_ShapeEnum ShapeEnumFromString (const XmlObjMgt_DOMString& theString) |
| 379 | { |
| 380 | TopAbs_ShapeEnum aResult = TopAbs_SHAPE; |
| 381 | if (!theString.equals (::ShShapeString())) |
| 382 | { |
| 383 | if (theString.equals (::ShCompoundString())) |
| 384 | aResult = TopAbs_COMPOUND; |
| 385 | else if (theString.equals (::ShCompsolidString())) |
| 386 | aResult = TopAbs_COMPSOLID; |
| 387 | else if (theString.equals (::ShSolidString())) |
| 388 | aResult = TopAbs_SOLID; |
| 389 | else if (theString.equals (::ShShellString())) |
| 390 | aResult = TopAbs_SHELL; |
| 391 | else if (theString.equals (::ShFaceString())) |
| 392 | aResult = TopAbs_FACE; |
| 393 | else if (theString.equals (::ShWireString())) |
| 394 | aResult = TopAbs_WIRE; |
| 395 | else if (theString.equals (::ShEdgeString())) |
| 396 | aResult = TopAbs_EDGE; |
| 397 | else if (theString.equals (::ShVertexString())) |
| 398 | aResult = TopAbs_VERTEX; |
| 399 | else |
| 400 | Standard_DomainError::Raise |
| 401 | ("TopAbs_ShapeEnum; string value without enum term equivalence"); |
| 402 | } |
| 403 | return aResult; |
| 404 | } |
| 405 | |
| 406 | //======================================================================= |
| 407 | //function : NameTypeFromString |
| 408 | //purpose : |
| 409 | //======================================================================= |
| 410 | static TNaming_NameType NameTypeFromString (const XmlObjMgt_DOMString& theString) |
| 411 | { |
| 412 | TNaming_NameType aResult = TNaming_UNKNOWN; |
| 413 | if (!theString.equals (::NTUnknownString())) |
| 414 | { |
| 415 | if (theString.equals (::NTIdentityString())) |
| 416 | aResult = TNaming_IDENTITY; |
| 417 | else if (theString.equals (::NTModifUntilString())) |
| 418 | aResult = TNaming_MODIFUNTIL; |
| 419 | else if (theString.equals (::NTGenerationString())) |
| 420 | aResult = TNaming_GENERATION; |
| 421 | else if (theString.equals (::NTIntersectionString())) |
| 422 | aResult = TNaming_INTERSECTION; |
| 423 | else if (theString.equals (::NTUnionString())) |
| 424 | aResult = TNaming_UNION; |
| 425 | else if (theString.equals (::NTSubtractionString())) |
| 426 | aResult = TNaming_SUBSTRACTION; |
| 427 | else if (theString.equals (::NTConstShapeString())) |
| 428 | aResult = TNaming_CONSTSHAPE; |
| 429 | else if (theString.equals (::NTFilterByNeighString())) |
| 430 | aResult = TNaming_FILTERBYNEIGHBOURGS; |
| 431 | else if (theString.equals (::NTOrientationString())) |
| 432 | aResult = TNaming_ORIENTATION; |
| 433 | else if (theString.equals (::NTWireInString())) |
| 434 | aResult = TNaming_WIREIN; |
| 435 | else if (theString.equals (::NTShellInString())) |
| 436 | aResult = TNaming_SHELLIN; |
| 437 | else |
| 438 | Standard_DomainError::Raise |
| 439 | ("TNaming_NameType; string value without enum term equivalence"); |
| 440 | } |
| 441 | return aResult; |
| 442 | } |