summaryrefslogtreecommitdiff
path: root/src/XmlTObjDrivers/XmlTObjDrivers_ReferenceDriver.cxx
blob: 98f02181decb39b2f5950d999bdd7636837f1d7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// File      : XmlTObjDrivers_ReferenceDriver.cxx
// Created   : Wed Nov 24 11:18:43 2004
// Author    : Edward AGAPOV
// Copyright:   Open CASCADE  2007
// The original implementation Copyright: (C) RINA S.p.A


#include "XmlTObjDrivers_ReferenceDriver.hxx"

#include <CDM_MessageDriver.hxx>
#include <TDF_Tool.hxx>
#include <TDF_Attribute.hxx>

#include <XmlObjMgt.hxx>
#include <XmlObjMgt_Persistent.hxx>
#include <XmlObjMgt_RRelocationTable.hxx>

#include <TObj_TReference.hxx>
#include <TObj_Model.hxx>
#include <TObj_Object.hxx>
#include <TObj_Assistant.hxx>
#include <TDF_ChildIterator.hxx>


IMPLEMENT_STANDARD_HANDLE(XmlTObjDrivers_ReferenceDriver,XmlMDF_ADriver)
IMPLEMENT_STANDARD_RTTIEXT(XmlTObjDrivers_ReferenceDriver,XmlMDF_ADriver)

IMPLEMENT_DOMSTRING (MasterEntry,        "master")
IMPLEMENT_DOMSTRING (ReferredEntry,      "entry")
IMPLEMENT_DOMSTRING (ReferredModelEntry, "modelentry")

//=======================================================================
//function : XmlTObjDrivers_ReferenceDriver
//purpose  : constructor
//=======================================================================

XmlTObjDrivers_ReferenceDriver::XmlTObjDrivers_ReferenceDriver
                         (const Handle(CDM_MessageDriver)& theMessageDriver)
: XmlMDF_ADriver( theMessageDriver, NULL)
{
}

//=======================================================================
//function : NewEmpty
//purpose  : Creates a new attribute
//=======================================================================

Handle(TDF_Attribute) XmlTObjDrivers_ReferenceDriver::NewEmpty() const
{
  return new TObj_TReference;
}

//=======================================================================
//function : Paste
//purpose  : Translate the contents of <aSource> and put it
//           into <aTarget>, using the relocation table
//           <aRelocTable> to keep the sharings.
//=======================================================================

Standard_Boolean XmlTObjDrivers_ReferenceDriver::Paste
                         (const XmlObjMgt_Persistent&  Source,
                          const Handle(TDF_Attribute)& Target,
                          XmlObjMgt_RRelocationTable&  /*RelocTable*/) const
{
  const XmlObjMgt_Element& anElement = Source;
  
  // get entries
  TCollection_AsciiString RefEntry    = anElement.getAttribute(::ReferredEntry());
  TCollection_AsciiString MasterEntry = anElement.getAttribute(::MasterEntry());
  // entry in model holder
  TCollection_AsciiString InHolderEntry =
    anElement.getAttribute(::ReferredModelEntry());

  // master label
  TDF_Label aLabel, aMasterLabel;
  TDF_Tool::Label (Target->Label().Data(), MasterEntry, aMasterLabel);
  // referred label
  if (InHolderEntry.IsEmpty())
    TDF_Tool::Label (Target->Label().Data(), RefEntry, aLabel, Standard_True);
  else
  {
    Handle(TObj_Model) aModel = Handle(TObj_Model)::DownCast
      ( TObj_Assistant::FindModel( InHolderEntry.ToCString() ));
    TDF_Tool::Label (aModel->GetLabel().Data(), RefEntry, aLabel, Standard_True);
  }
  Handle(TObj_TReference) aTarget =
    Handle(TObj_TReference)::DownCast (Target);
  aTarget->Set ( aLabel, aMasterLabel );

  return !aLabel.IsNull() && !aMasterLabel.IsNull();
}

//=======================================================================
//function : Paste
//purpose  : Translate the contents of <aSource> and put it
//           into <aTarget>, using the relocation table
//           <aRelocTable> to keep the sharings.
//           Store master and referred labels as entry, the other model referred
//           as entry in model-container
//=======================================================================

void XmlTObjDrivers_ReferenceDriver::Paste
                         (const Handle(TDF_Attribute)& Source,
                          XmlObjMgt_Persistent&        Target,
                          XmlObjMgt_SRelocationTable&  /*RelocTable*/) const
{
  Handle(TObj_TReference) aSource =
    Handle(TObj_TReference)::DownCast (Source);

  Handle(TObj_Object) aLObject = aSource->Get();
  if (aLObject.IsNull())
    return;

  // referred entry
  TCollection_AsciiString entry;
  TDF_Label aLabel = aLObject->GetLabel();
  TDF_Tool::Entry( aLabel, entry );
  Target.Element().setAttribute(::ReferredEntry(), entry.ToCString());

  // master entry
  entry.Clear();
  TDF_Label aMasterLabel = aSource->GetMasterLabel();
  TDF_Tool::Entry( aMasterLabel, entry );
  Target.Element().setAttribute(::MasterEntry(), entry.ToCString());

  // is reference to other document 
  if (aLabel.Root() == aMasterLabel.Root()) return;

  Handle(TObj_Model) aModel =
    Handle(TObj_Model)::DownCast( aLObject->GetModel() );
  TCollection_AsciiString aModelName( aModel->GetModelName()->String() );
  Target.Element().setAttribute(::ReferredModelEntry(), aModelName.ToCString());
}