d366406615eadde05a4b1c8ab0ddcc27e92de0a6
[occt.git] / src / Graphic3d / Graphic3d_Structure.hxx
1 // Created on: 1991-06-12
2 // Created by: NW,JPB,CAL
3 // Copyright (c) 1991-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #ifndef _Graphic3d_Structure_HeaderFile
18 #define _Graphic3d_Structure_HeaderFile
19
20 #include <Standard.hxx>
21 #include <Standard_Type.hxx>
22
23 #include <Graphic3d_CStructure.hxx>
24 #include <Graphic3d_IndexedMapOfAddress.hxx>
25 #include <Standard_Address.hxx>
26 #include <Graphic3d_TypeOfStructure.hxx>
27 #include <Standard_Transient.hxx>
28 #include <Standard_Boolean.hxx>
29 #include <Standard_Integer.hxx>
30 #include <Graphic3d_ZLayerId.hxx>
31 #include <Graphic3d_SequenceOfHClipPlane.hxx>
32 #include <Standard_Real.hxx>
33 #include <Graphic3d_SequenceOfGroup.hxx>
34 #include <Graphic3d_TypeOfConnection.hxx>
35 #include <Graphic3d_MapOfStructure.hxx>
36 #include <Graphic3d_TypeOfComposition.hxx>
37 #include <Graphic3d_TransformPers.hxx>
38 #include <Graphic3d_TransModeFlags.hxx>
39 #include <Graphic3d_BndBox4f.hxx>
40 #include <Graphic3d_BndBox4d.hxx>
41 #include <Graphic3d_Vertex.hxx>
42 class Graphic3d_PriorityDefinitionError;
43 class Graphic3d_StructureDefinitionError;
44 class Graphic3d_TransformError;
45 class Graphic3d_Group;
46 class Graphic3d_StructureManager;
47 class Graphic3d_DataStructureManager;
48 class Bnd_Box;
49 class gp_Pnt;
50
51
52 class Graphic3d_Structure;
53 DEFINE_STANDARD_HANDLE(Graphic3d_Structure, Standard_Transient)
54
55 //! This class allows the definition a graphic object.
56 //! This graphic structure can be displayed,
57 //! erased, or highlighted.
58 //! This graphic structure can be connected with
59 //! another graphic structure.
60 //! Keywords: Structure, StructureManager, Display, Erase, Highlight,
61 //! UnHighlight, Visible, Priority, Selectable, Visible,
62 //! Visual, Connection, Ancestors, Descendants, Transformation
63 class Graphic3d_Structure : public Standard_Transient
64 {
65
66 public:
67
68   
69   //! Creates a graphic object in the manager theManager.
70   //! It will appear in all the views of the visualiser.
71   //! The structure is not displayed when it is created.
72   Standard_EXPORT Graphic3d_Structure(const Handle(Graphic3d_StructureManager)& theManager);
73   
74   //! Creates a shadow link to existing graphic object.
75   Standard_EXPORT Graphic3d_Structure(const Handle(Graphic3d_StructureManager)& theManager, const Handle(Graphic3d_Structure)& thePrs);
76   
77   //! if WithDestruction == Standard_True then
78   //! suppress all the groups of primitives in the structure.
79   //! and it is mandatory to create a new group in <me>.
80   //! if WithDestruction == Standard_False then
81   //! clears all the groups of primitives in the structure.
82   //! and all the groups are conserved and empty.
83   //! They will be erased at the next screen update.
84   //! The structure itself is conserved.
85   //! The transformation and the attributes of <me> are conserved.
86   //! The childs of <me> are conserved.
87   Standard_EXPORT virtual void Clear (const Standard_Boolean WithDestruction = Standard_True);
88   
89   //! Suppresses the structure <me>.
90   //! It will be erased at the next screen update.
91   Standard_EXPORT ~Graphic3d_Structure();
92   
93   //! Displays the structure <me> in all the views of the visualiser.
94   Standard_EXPORT virtual void Display();
95   
96   //! Returns the current display priority for the
97   //! structure <me>.
98   Standard_EXPORT Standard_Integer DisplayPriority() const;
99   
100   //! Erases the structure <me> in all the views
101   //! of the visualiser.
102   Standard_EXPORT virtual void Erase();
103   
104   //! Highlights the structure in all the views with the given style
105   //! @param theStyle [in] the style (type of highlighting: box/color, color and opacity)
106   //! @param theToUpdateMgr [in] defines whether related computed structures will be
107   //! highlighted via structure manager or not
108   Standard_EXPORT void Highlight (const Handle(Graphic3d_PresentationAttributes)& theStyle, const Standard_Boolean theToUpdateMgr = Standard_True);
109   
110   //! Suppress the structure <me>.
111   //! It will be erased at the next screen update.
112   //! Warning: No more graphic operations in <me> after this call.
113   //! Category: Methods to modify the class definition
114   Standard_EXPORT void Remove();
115   
116   //! Computes axis-aligned bounding box of a structure.
117   Standard_EXPORT virtual void CalculateBoundBox();
118   
119   //! If <theToSet> is Standard_True then <me> is infinite and
120   //! the MinMaxValues method method return :
121   //! theXMin = theYMin = theZMin = RealFirst().
122   //! theXMax = theYMax = theZMax = RealLast().
123   //! By default, <me> is not infinite but empty.
124   Standard_EXPORT void SetInfiniteState (const Standard_Boolean theToSet);
125   
126   //! Modifies the order of displaying the structure.
127   //! Values are between 0 and 10.
128   //! Structures are drawn according to their display priorities
129   //! in ascending order.
130   //! A structure of priority 10 is displayed the last and appears over the others.
131   //! The default value is 5.
132   //! Category: Methods to modify the class definition
133   //! Warning: If <me> is displayed then the SetDisplayPriority
134   //! method erase <me> and display <me> with the
135   //! new priority.
136   //! Raises PriorityDefinitionError if <Priority> is
137   //! greater than 10 or a negative value.
138   Standard_EXPORT void SetDisplayPriority (const Standard_Integer Priority);
139   
140   //! Reset the current priority of the structure to the
141   //! previous priority.
142   //! Category: Methods to modify the class definition
143   //! Warning: If <me> is displayed then the SetDisplayPriority
144   //! method erase <me> and display <me> with the
145   //! previous priority.
146   Standard_EXPORT void ResetDisplayPriority();
147   
148   //! Set Z layer ID for the structure. The Z layer mechanism
149   //! allows to display structures presented in higher layers in overlay
150   //! of structures in lower layers by switching off z buffer depth
151   //! test between layers
152   Standard_EXPORT void SetZLayer (const Graphic3d_ZLayerId theLayerId);
153   
154   //! Get Z layer ID of displayed structure. The method
155   //! returns -1 if the structure has no ID (deleted from graphic driver).
156   Standard_EXPORT Graphic3d_ZLayerId GetZLayer() const;
157   
158   //! Changes a sequence of clip planes slicing the structure on rendering.
159   //! @param thePlanes [in] the set of clip planes.
160   Standard_EXPORT void SetClipPlanes (const Handle(Graphic3d_SequenceOfHClipPlane)& thePlanes);
161   
162   //! Get clip planes slicing the structure on rendering.
163   //! @return set of clip planes.
164   Standard_EXPORT const Handle(Graphic3d_SequenceOfHClipPlane)& ClipPlanes() const;
165
166   //! Modifies the visibility indicator to Standard_True or
167   //! Standard_False for the structure <me>.
168   //! The default value at the definition of <me> is
169   //! Standard_True.
170   Standard_EXPORT void SetVisible (const Standard_Boolean AValue);
171   
172   //! Modifies the visualisation mode for the structure <me>.
173   Standard_EXPORT virtual void SetVisual (const Graphic3d_TypeOfStructure AVisual);
174   
175   //! Modifies the minimum and maximum zoom coefficients
176   //! for the structure <me>.
177   //! The default value at the definition of <me> is unlimited.
178   //! Category: Methods to modify the class definition
179   //! Warning: Raises StructureDefinitionError if <LimitInf> is
180   //! greater than <LimitSup> or if <LimitInf> or
181   //! <LimitSup> is a negative value.
182   Standard_EXPORT void SetZoomLimit (const Standard_Real LimitInf, const Standard_Real LimitSup);
183   
184   //! marks the structure <me> representing wired structure needed for
185   //! highlight only so it won't be added to BVH tree.
186   //! Category: Methods to modify the class definition
187   Standard_EXPORT void SetIsForHighlight (const Standard_Boolean isForHighlight);
188   
189   //! Suppresses the highlight for the structure <me>
190   //! in all the views of the visualiser.
191   Standard_EXPORT void UnHighlight();
192   
193   Standard_EXPORT virtual void Compute();
194   
195   //! Returns the new Structure defined for the new visualization
196   Standard_EXPORT virtual Handle(Graphic3d_Structure) Compute (const Handle(Graphic3d_DataStructureManager)& aProjector);
197   
198   //! Returns the new Structure defined for the new visualization
199   Standard_EXPORT virtual Handle(Graphic3d_Structure) Compute (const Handle(Graphic3d_DataStructureManager)& theProjector,
200                                                                const Handle(Geom_Transformation)& theTrsf);
201   
202   //! Returns the new Structure defined for the new visualization
203   Standard_EXPORT virtual void Compute (const Handle(Graphic3d_DataStructureManager)& aProjector, Handle(Graphic3d_Structure)& aStructure);
204   
205   //! Returns the new Structure defined for the new visualization
206   Standard_EXPORT virtual void Compute (const Handle(Graphic3d_DataStructureManager)& theProjector,
207                                         const Handle(Geom_Transformation)& theTrsf,
208                                         Handle(Graphic3d_Structure)& theStructure);
209
210   //! Forces a new construction of the structure <me>
211   //! if <me> is displayed and TOS_COMPUTED.
212   Standard_EXPORT void ReCompute();
213   
214   //! Forces a new construction of the structure <me>
215   //! if <me> is displayed in <aProjetor> and TOS_COMPUTED.
216   Standard_EXPORT void ReCompute (const Handle(Graphic3d_DataStructureManager)& aProjector);
217   
218   //! Returns Standard_True if the structure <me> contains
219   //! Polygons, Triangles or Quadrangles.
220   Standard_EXPORT Standard_Boolean ContainsFacet() const;
221
222   //! Returns the groups sequence included in the structure <me> (internal storage).
223   Standard_EXPORT const Graphic3d_SequenceOfGroup& Groups() const;
224   
225   //! Returns the current number of groups in the
226   //! structure <me>.
227   Standard_EXPORT Standard_Integer NumberOfGroups() const;
228   
229   //! Append new group to this structure.
230   Standard_EXPORT Handle(Graphic3d_Group) NewGroup();
231   
232   //! Returns the highlight color for the Highlight method
233   //! with the highlight method TOHM_COLOR or TOHM_BOUNDBOX.
234   Standard_EXPORT const Handle(Graphic3d_PresentationAttributes)& HighlightStyle() const;
235   
236   //! Returns Standard_True if the structure <me> is deleted.
237   //! <me> is deleted after the call Remove (me).
238   Standard_EXPORT Standard_Boolean IsDeleted() const;
239   
240   //! Returns the display indicator for the structure <me>.
241   Standard_EXPORT virtual Standard_Boolean IsDisplayed() const;
242   
243   //! Returns Standard_True if the structure <me> is empty.
244   //! Warning: A structure is empty if :
245   //! it do not have group or all the groups are empties
246   //! and it do not have descendant or all the descendants
247   //! are empties.
248   Standard_EXPORT Standard_Boolean IsEmpty() const;
249   
250   //! Returns Standard_True if the structure <me> is infinite.
251   Standard_EXPORT Standard_Boolean IsInfinite() const;
252   
253   //! Returns the highlight indicator for the structure <me>.
254   Standard_EXPORT virtual Standard_Boolean IsHighlighted() const;
255   
256   //! Returns Standard_True if the structure <me> is transformed.
257   //! <=> The transformation != Identity.
258   Standard_EXPORT Standard_Boolean IsTransformed() const;
259   
260   //! Returns the visibility indicator for the structure <me>.
261   Standard_EXPORT Standard_Boolean IsVisible() const;
262
263   //! Returns the coordinates of the boundary box of the structure <me>.
264   //! If <theToIgnoreInfiniteFlag> is TRUE, the method returns actual graphical
265   //! boundaries of the Graphic3d_Group components. Otherwise, the
266   //! method returns boundaries taking into account infinite state
267   //! of the structure. This approach generally used for application
268   //! specific fit operation (e.g. fitting the model into screen,
269   //! not taking into accout infinite helper elements).
270   //! Warning: If the structure <me> is empty then the empty box is returned,
271   //! If the structure <me> is infinite then the whole box is returned.
272   Standard_EXPORT Bnd_Box MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag = Standard_False) const;
273
274   //! Returns the visualisation mode for the structure <me>.
275   Standard_EXPORT Graphic3d_TypeOfStructure Visual() const;
276   
277   //! Returns Standard_True if the connection is possible between
278   //! <AStructure1> and <AStructure2> without a creation
279   //! of a cycle.
280   //!
281   //! It's not possible to call the method
282   //! AStructure1->Connect (AStructure2, TypeOfConnection)
283   //! if
284   //! - the set of all ancestors of <AStructure1> contains
285   //! <AStructure1> and if the
286   //! TypeOfConnection == TOC_DESCENDANT
287   //! - the set of all descendants of <AStructure1> contains
288   //! <AStructure2> and if the
289   //! TypeOfConnection == TOC_ANCESTOR
290   Standard_EXPORT static Standard_Boolean AcceptConnection (const Handle(Graphic3d_Structure)& AStructure1, const Handle(Graphic3d_Structure)& AStructure2, const Graphic3d_TypeOfConnection AType);
291   
292   //! Returns the group of structures to which <me> is connected.
293   Standard_EXPORT void Ancestors (Graphic3d_MapOfStructure& SG) const;
294   
295   //! If Atype is TOC_DESCENDANT then add <AStructure>
296   //! as a child structure of  <me>.
297   //! If Atype is TOC_ANCESTOR then add <AStructure>
298   //! as a parent structure of <me>.
299   //! The connection propagates Display, Highlight, Erase,
300   //! Remove, and stacks the transformations.
301   //! No connection if the graph of the structures
302   //! contains a cycle and <WithCheck> is Standard_True;
303   Standard_EXPORT void Connect (const Handle(Graphic3d_Structure)& AStructure, const Graphic3d_TypeOfConnection AType, const Standard_Boolean WithCheck = Standard_False);
304   
305   //! Returns the group of structures connected to <me>.
306   Standard_EXPORT void Descendants (Graphic3d_MapOfStructure& SG) const;
307   
308   //! Suppress the connection between <AStructure> and <me>.
309   Standard_EXPORT void Disconnect (const Handle(Graphic3d_Structure)& AStructure);
310   
311   //! If Atype is TOC_DESCENDANT then suppress all
312   //! the connections with the child structures of <me>.
313   //! If Atype is TOC_ANCESTOR then suppress all
314   //! the connections with the parent structures of <me>.
315   Standard_EXPORT void DisconnectAll (const Graphic3d_TypeOfConnection AType);
316   
317   //! Returns <ASet> the group of structures :
318   //! - directly or indirectly connected to <AStructure> if the
319   //! TypeOfConnection == TOC_DESCENDANT
320   //! - to which <AStructure> is directly or indirectly connected
321   //! if the TypeOfConnection == TOC_ANCESTOR
322   Standard_EXPORT static void Network (const Handle(Graphic3d_Structure)& AStructure, const Graphic3d_TypeOfConnection AType, Graphic3d_MapOfStructure& ASet);
323   
324   Standard_EXPORT void SetOwner (const Standard_Address Owner);
325   
326   Standard_EXPORT Standard_Address Owner() const;
327   
328   Standard_EXPORT void SetHLRValidation (const Standard_Boolean AFlag);
329   
330   Standard_EXPORT Standard_Boolean HLRValidation() const;
331
332   //! Return local transformation.
333   const Handle(Geom_Transformation)& Transformation() const { return myCStructure->Transformation(); }
334
335   //! Modifies the current local transformation
336   Standard_EXPORT void SetTransformation (const Handle(Geom_Transformation)& theTrsf);
337
338   Standard_DEPRECATED("This method is deprecated - SetTransformation() should be called instead")
339   void Transform (const Handle(Geom_Transformation)& theTrsf) { SetTransformation (theTrsf); }
340
341   //! Modifies the current transform persistence (pan, zoom or rotate)
342   Standard_EXPORT void SetTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers);
343
344   //! @return transform persistence of the presentable object.
345   const Handle(Graphic3d_TransformPers)& TransformPersistence() const { return myCStructure->TransformPersistence(); }
346
347   //! Sets if the structure location has mutable nature (content or location will be changed regularly).
348   Standard_EXPORT void SetMutable (const Standard_Boolean theIsMutable);
349   
350   //! Returns true if structure has mutable nature (content or location are be changed regularly).
351   //! Mutable structure will be managed in different way than static onces.
352   Standard_EXPORT Standard_Boolean IsMutable() const;
353   
354   Standard_EXPORT Graphic3d_TypeOfStructure ComputeVisual() const;
355   
356   //! Clears the structure <me>.
357   Standard_EXPORT void GraphicClear (const Standard_Boolean WithDestruction);
358   
359   Standard_EXPORT void GraphicConnect (const Handle(Graphic3d_Structure)& ADaughter);
360   
361   Standard_EXPORT void GraphicDisconnect (const Handle(Graphic3d_Structure)& ADaughter);
362
363   //! Internal method which sets new transformation without calling graphic manager callbacks.
364   Standard_EXPORT void GraphicTransform (const Handle(Geom_Transformation)& theTrsf);
365
366   //! Returns the identification number of the structure <me>.
367   Standard_EXPORT Standard_Integer Identification() const;
368   
369   //! Prints informations about the network associated
370   //! with the structure <AStructure>.
371   Standard_EXPORT static void PrintNetwork (const Handle(Graphic3d_Structure)& AStructure, const Graphic3d_TypeOfConnection AType);
372   
373   //! Suppress the adress <APtr> in the list
374   //! of descendants or in the list of ancestors.
375   Standard_EXPORT void Remove (const Standard_Address APtr, const Graphic3d_TypeOfConnection AType);
376   
377   Standard_EXPORT void SetComputeVisual (const Graphic3d_TypeOfStructure AVisual);
378   
379   //! Transforms theX, theY, theZ with the transformation theTrsf.
380   Standard_EXPORT static void Transforms (const gp_Trsf& theTrsf,
381                                           const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ,
382                                           Standard_Real& theNewX, Standard_Real& theNewY, Standard_Real& theNewZ);
383
384   //! Returns the low-level structure
385   const Handle(Graphic3d_CStructure)& CStructure() const { return myCStructure; }
386
387 friend class Graphic3d_Group;
388
389
390   DEFINE_STANDARD_RTTIEXT(Graphic3d_Structure,Standard_Transient)
391
392 protected:
393
394   //! Transforms boundaries with <theTrsf> transformation.
395   Standard_EXPORT static void TransformBoundaries (const gp_Trsf& theTrsf,
396                                                    Standard_Real& theXMin, Standard_Real& theYMin, Standard_Real& theZMin,
397                                                    Standard_Real& theXMax, Standard_Real& theYMax, Standard_Real& theZMax);
398
399   //! Appends new descendant structure.
400   Standard_EXPORT Standard_Boolean AppendDescendant (const Standard_Address theDescendant);
401   
402   //! Removes the given descendant structure.
403   Standard_EXPORT Standard_Boolean RemoveDescendant (const Standard_Address theDescendant);
404   
405   //! Appends new ancestor structure.
406   Standard_EXPORT Standard_Boolean AppendAncestor (const Standard_Address theAncestor);
407   
408   //! Removes the given ancestor structure.
409   Standard_EXPORT Standard_Boolean RemoveAncestor (const Standard_Address theAncestor);
410
411 private:
412
413   //! Suppress in the structure <me>, the group theGroup.
414   //! It will be erased at the next screen update.
415   Standard_EXPORT void Remove (const Handle(Graphic3d_Group)& theGroup);
416   
417   //! Manages the number of groups in the structure <me>
418   //! which contains facet.
419   //! Polygons, Triangles or Quadrangles.
420   //! <ADelta> = +1 or -1
421   Standard_EXPORT void GroupsWithFacet (const Standard_Integer ADelta);
422   
423   //! Returns the extreme coordinates found in the structure <me> without transformation applied.
424   Standard_EXPORT Graphic3d_BndBox4f minMaxCoord() const;
425   
426   //! Gets untransformed bounding box from structure.
427   Standard_EXPORT void getBox (Graphic3d_BndBox3d& theBox, const Standard_Boolean theToIgnoreInfiniteFlag = Standard_False) const;
428   
429   //! Adds transformed (with myCStructure->Transformation) bounding box of structure to theBox.
430   Standard_EXPORT void addTransformed (Graphic3d_BndBox3d& theBox, const Standard_Boolean theToIgnoreInfiniteFlag = Standard_False) const;
431   
432   //! Returns the manager to which <me> is associated.
433   Standard_EXPORT Handle(Graphic3d_StructureManager) StructureManager() const;
434   
435   //! Calls the Update method of the StructureManager which contains the Structure <me>.
436   //! If theUpdateLayer is true then invalidates bounding box of ZLayer.
437   Standard_EXPORT void Update (const bool theUpdateLayer = false) const;
438
439 protected:
440
441   Graphic3d_StructureManager* myStructureManager;
442   Graphic3d_TypeOfStructure   myComputeVisual;
443
444   Handle(Graphic3d_CStructure) myCStructure;
445   Graphic3d_IndexedMapOfAddress myAncestors;
446   Graphic3d_IndexedMapOfAddress myDescendants;
447   Standard_Address myOwner;
448   Graphic3d_TypeOfStructure myVisual;
449
450 };
451
452 #endif // _Graphic3d_Structure_HeaderFile