1 // Created on: 1998-09-23
2 // Created by: Denis PASCAL
3 // Copyright (c) 1998-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.
18 #include <DDataStd_DrawDriver.hxx>
19 #include <DDataStd_DrawPresentation.hxx>
21 #include <Draw_Drawable3D.hxx>
22 #include <Draw_Viewer.hxx>
23 #include <Standard_GUID.hxx>
24 #include <Standard_Type.hxx>
25 #include <TDF_Attribute.hxx>
26 #include <TDF_AttributeDelta.hxx>
27 #include <TDF_DefaultDeltaOnModification.hxx>
28 #include <TDF_DefaultDeltaOnRemoval.hxx>
29 #include <TDF_DeltaOnAddition.hxx>
30 #include <TDF_Label.hxx>
31 #include <TDF_RelocationTable.hxx>
32 #include <TDF_Tool.hxx>
34 IMPLEMENT_STANDARD_RTTIEXT(DDataStd_DrawPresentation,TDF_Attribute)
37 extern Draw_Viewer dout;
39 Standard_IMPORT Draw_Viewer dout;
41 //=======================================================================
42 //function : IsDisplayed
44 //=======================================================================
46 Standard_Boolean DDataStd_DrawPresentation::IsDisplayed (const TDF_Label& L)
48 Handle(DDataStd_DrawPresentation) P;
49 if (L.FindAttribute(DDataStd_DrawPresentation::GetID(),P)) {
50 return P->IsDisplayed();
52 return Standard_False;
56 //=======================================================================
57 //function : HasPresentation
59 //=======================================================================
61 Standard_Boolean DDataStd_DrawPresentation::HasPresentation (const TDF_Label& L)
63 return (L.IsAttribute(DDataStd_DrawPresentation::GetID()));
66 //=======================================================================
69 //=======================================================================
71 void DDataStd_DrawPresentation::Display (const TDF_Label& L)
73 Handle(DDataStd_DrawPresentation) P;
75 if (!L.FindAttribute(DDataStd_DrawPresentation::GetID(),P)) {
76 P = new DDataStd_DrawPresentation ();
80 if (P->IsDisplayed()) return;
81 if (P->GetDrawable().IsNull()) P->DrawBuild();
82 DrawDisplay (P->Label(),P);
83 P->SetDisplayed(Standard_True);
86 //=======================================================================
89 //=======================================================================
91 void DDataStd_DrawPresentation::Erase(const TDF_Label& L)
93 Handle(DDataStd_DrawPresentation) P;
94 if (L.FindAttribute(DDataStd_DrawPresentation::GetID(),P)) {
95 if (P->IsDisplayed()) {
96 DrawErase (P->Label(),P);
97 P->SetDisplayed(Standard_False);
102 //=======================================================================
105 //=======================================================================
107 void DDataStd_DrawPresentation::Update (const TDF_Label& L)
109 Handle(DDataStd_DrawPresentation) P;
110 if (L.FindAttribute(DDataStd_DrawPresentation::GetID(),P)) {
111 DrawErase(P->Label(),P);
114 DrawDisplay (P->Label(),P);
115 P->SetDisplayed(Standard_True);
119 //=======================================================================
121 //purpose : idem GUID DDataStd Display
122 //=======================================================================
124 const Standard_GUID& DDataStd_DrawPresentation::GetID()
126 static Standard_GUID DDataStd_DrawPresentationID("1c0296d4-6dbc-22d4-b9c8-0070b0ee301b");
127 return DDataStd_DrawPresentationID;
131 //=======================================================================
132 //function : DDataStd_DrawPresentation
134 //=======================================================================
136 DDataStd_DrawPresentation::DDataStd_DrawPresentation () : isDisplayed(Standard_False) {}
139 //=======================================================================
140 //function : SetDisplayed
142 //=======================================================================
144 void DDataStd_DrawPresentation::SetDisplayed (const Standard_Boolean status)
146 isDisplayed = status;
149 //=======================================================================
150 //function : IsDisplayed
152 //=======================================================================
154 Standard_Boolean DDataStd_DrawPresentation::IsDisplayed () const
159 //=======================================================================
160 //function : SetDrawable
162 //=======================================================================
164 void DDataStd_DrawPresentation::SetDrawable (const Handle(Draw_Drawable3D)& D)
169 //=======================================================================
170 //function : GetDrawable
172 //=======================================================================
174 Handle(Draw_Drawable3D) DDataStd_DrawPresentation::GetDrawable () const
179 //=======================================================================
182 //=======================================================================
184 const Standard_GUID& DDataStd_DrawPresentation::ID() const { return GetID(); }
187 //=======================================================================
188 //function : NewEmpty
190 //=======================================================================
192 Handle(TDF_Attribute) DDataStd_DrawPresentation::NewEmpty() const
194 return new DDataStd_DrawPresentation ();
197 //=======================================================================
200 //=======================================================================
202 void DDataStd_DrawPresentation::Restore (const Handle(TDF_Attribute)& With)
204 //std::cout<< "DDataStd_DrawPresentation::Restore" << std::endl;
205 isDisplayed = Handle(DDataStd_DrawPresentation)::DownCast (With)->IsDisplayed();
206 myDrawable = Handle(DDataStd_DrawPresentation)::DownCast (With)->GetDrawable();
209 //=======================================================================
212 //=======================================================================
214 void DDataStd_DrawPresentation::Paste (const Handle(TDF_Attribute)& Into,
215 const Handle(TDF_RelocationTable)&) const
217 Handle(DDataStd_DrawPresentation)::DownCast(Into)->SetDisplayed(isDisplayed);
218 Handle(DDataStd_DrawPresentation)::DownCast(Into)->SetDrawable(myDrawable);
221 //=======================================================================
222 //function : AfterAddition
223 //purpose : erase if displayed
224 //=======================================================================
226 void DDataStd_DrawPresentation::AfterAddition()
228 //std::cout<< "DDataStd_DrawPresentation::AfterAddition" << std::endl;
229 //if (isDisplayed) DrawDisplay ();
232 //=======================================================================
233 //function : BeforeRemoval
234 //purpose : erase if displayed
235 //=======================================================================
237 void DDataStd_DrawPresentation::BeforeRemoval()
239 //std::cout<< "DDataStd_DrawPresentation::BeforeRemoval" << std::endl;
240 //if (isDisplayed) DrawErase ();
243 //=======================================================================
244 //function : BeforeForget
245 //purpose : erase if displayed
246 //=======================================================================
248 void DDataStd_DrawPresentation::BeforeForget()
250 //std::cout<< "DDataStd_DrawPresentation::BeforeForget" << std::endl;
251 if (isDisplayed) DrawErase (Label(),this);
255 //=======================================================================
256 //function : AfterResume
257 //purpose : display if displayed
258 //=======================================================================
260 void DDataStd_DrawPresentation::AfterResume()
262 //std::cout<< "DDataStd_DrawPresentation::AfterResume"<< std::endl;
263 if (isDisplayed) DrawDisplay (Label(),this);
266 //=======================================================================
267 //function : BeforeUndo
268 //purpose : the associated NamedShape should be present
269 //=======================================================================
271 Standard_Boolean DDataStd_DrawPresentation::BeforeUndo (const Handle(TDF_AttributeDelta)& AD,
272 const Standard_Boolean /*forceIt*/)
274 Handle(DDataStd_DrawPresentation) Pme = this;
275 Handle(DDataStd_DrawPresentation) Pdt = Handle(DDataStd_DrawPresentation)::DownCast(AD->Attribute());
276 Handle(DDataStd_DrawPresentation) Pfw;
277 if (AD->Label().FindAttribute(GetID(),Pfw)) {
278 //std::cout<< "DDataStd_DrawPresentation::BeforeUndo : attribute in framework" << std::endl;
281 //std::cout<< "DDataStd_DrawPresentation::BeforeUndo : attribute not in framework" << std::endl;
284 if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) {
285 //std::cout<< "DDataStd_DrawPresentation::BeforeUndo : delta on addition" << std::endl;
286 if (Pfw->IsDisplayed()) DrawErase(AD->Label(),Pfw);
287 //TDF appelle BeforeRemoval effacer
289 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) {
290 //std::cout<< "DDataStd_DrawPresentation::BeforeUndo : delta on removal" << std::endl;
292 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification))) {
293 //std::cout<< "DDataStd_DrawPresentation::BeforeUndo : delta on modification" << std::endl;
294 if (Pfw->IsDisplayed()) DrawErase(AD->Label(),Pfw);
297 //std::cout<< "DDataStd_DrawPresentation::BeforeUndo : unknown delta" << std::endl;
299 //if (Label().IsNull()) std::cout<< "DDataStd_DrawPresentation::BeforeUndo : null label" << std::endl;
300 return Standard_True;
304 //=======================================================================
305 //function : AfterUndo
306 //purpose : associated NamedShape should be present
307 //=======================================================================
309 Standard_Boolean DDataStd_DrawPresentation::AfterUndo (const Handle(TDF_AttributeDelta)& AD,
310 const Standard_Boolean /*forceIt*/)
312 Handle(DDataStd_DrawPresentation) Pme = this;
313 Handle(DDataStd_DrawPresentation) Pdt = Handle(DDataStd_DrawPresentation)::DownCast(AD->Attribute());
314 Handle(DDataStd_DrawPresentation) Pfw;
315 if (AD->Label().FindAttribute(GetID(),Pfw)) {
316 //std::cout<< "DDataStd_DrawPresentation::AfterUndo : attribute in framework" << std::endl;
319 //std::cout<< "DDataStd_DrawPresentation::AfterUndo : attribute not in framework" << std::endl;
323 if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) {
324 //std::cout<< "DDataStd_DrawPresentation::AfterUndo : delta on addition" << std::endl;
326 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) {
327 //std::cout<< "DDataStd_DrawPresentation::AfterUndo : delta on removal" << std::endl;
328 if (Pdt->IsDisplayed()) DrawDisplay(AD->Label(),Pdt);
330 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification))) {
331 //std::cout<< "DDataStd_DrawPresentation::AfterUndo : delta on modification" << std::endl;
332 if (Pdt->IsDisplayed()) DrawDisplay(AD->Label(),Pdt);
335 //std::cout<< "DDataStd_DrawPresentation::AfterUndo : unknown delta" << std::endl;
337 //if (Label().IsNull()) std::cout<< "DDataStd_DrawPresentation::AfterUndo : null label" << std::endl;
338 return Standard_True;
343 //=======================================================================
344 //function : DrawBuild
346 //=======================================================================
348 void DDataStd_DrawPresentation::DrawBuild ()
350 //std::cout<< "DDataStd_DrawPresentation::DrawBuild" << std::endl;
351 Handle(DDataStd_DrawDriver) DD = DDataStd_DrawDriver::Get();
353 DD = new DDataStd_DrawDriver ();
354 DDataStd_DrawDriver::Set(DD);
356 Handle(Draw_Drawable3D) D3D = DD->Drawable(Label());
357 if (D3D.IsNull()) std::cout<< "DDataStd_DrawPresentation::DrawBuild : null drawable" << std::endl;
363 //=======================================================================
364 //function : DrawDisplay
366 //=======================================================================
368 void DDataStd_DrawPresentation::DrawDisplay (const TDF_Label& L,
369 const Handle(DDataStd_DrawPresentation)& P)
372 if (!P->GetDrawable().IsNull()) {
373 TCollection_AsciiString S;
374 TDF_Tool::Entry(L,S);
375 Standard_CString name = S.ToCString();
376 Draw::Set(name,P->GetDrawable());
380 //std::cout<< "DDataStd_DrawPresentation::DrawDisplay : null Drawable" << std::endl;
384 std::cout<< "DDataStd_DrawPresentation::DrawDisplay : null Label" << std::endl;
387 //=======================================================================
388 //function : DrawErase
390 //=======================================================================
392 void DDataStd_DrawPresentation::DrawErase (const TDF_Label& L,
393 const Handle(DDataStd_DrawPresentation)& P)
396 if (!P->GetDrawable().IsNull()) {
397 dout.RemoveDrawable(P->GetDrawable());
401 //std::cout<< "DDataStd_DrawPresentation::DrawErase : null Drawable" << std::endl;
405 std::cout<< "DDataStd_DrawPresentation::DrawErase : null Label" << std::endl;