1 // Created by: NW,JPB,CAL
2 // Copyright (c) 1991-1999 Matra Datavision
3 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
20 // Modified 1/08/97 ; PCT : ajout texture mapping
21 // 20/08/97 ; PCT : ajout transparence pour texture
22 // 11/97 ; CAL : gestion du GraphicClear
23 // 11/97 ; CAL : ajout pointer StructPtr
24 // 11/97 ; CAL : amelioration de l'effacement SetManager
25 // CAL : 15 janvier 1998
26 // Ajout de la methode IsTransformed dans une Structure.
27 // (Permet la transmission de cette Trsf vers
28 // la structure COMPUTED si necessaire)
29 // Ajout de la methode IsRotated dans une Structure.
30 // (Permet de connaitre le type de transformation
31 // pour declencher le calcul des parties cachees
32 // de maniere plus sioux)
33 // Ajout de 3 nouvelles methodes Compute virtual dans Structure.
34 // (Permet des Compute un peu plus specialises)
35 // Ajout des 2 methodes sur Owner dans Structure.
36 // (evite de calculer 2 fois les parties cachees
37 // pour 2 representations differentes affichees
38 // d'un meme Presentable Object (Owner))
39 // Ajout des 2 methodes sur HLRValidation dans Structure.
40 // (permet de valider ou d'invalider le calcul des
41 // parties cachees sur certaines representations)
42 // Ajout de la transmission de la transformation d'une structure
44 // 24/2/98 ; CAL : Modification de la gestion des champs
46 // Patch, erreur dans la gestion du nombre de Group avec
47 // facettes dans Graphic3d_Structure avec une operation
48 // de Clear. (PRO12795)
49 // FGU : 30 Avril 1998
52 // Perfs. Connection entre structures COMPUTED.
53 // 30/11/98 ; FMN : S4069. Textes always visible.
54 // 22/03/04 ; SAN : OCC4895 High-level interface for controlling polygon offsets
56 #define G003 //EUG 26/01/00 Degeneration management
58 #define BUC60918 //GG 31/05/01 A transparente structure priority must have the
59 // MAX_PRIORITY value so, the highlighted structure must have
60 // MAX_PRIORITY-1 value.
61 // Add ResetDisplayPriority() method.
63 #define OCC1174 // SAV 08/01/03 Added back face interior color controling
69 //-Design Declaration of variables specific to graphic structures
71 //-Warning A structure is defined in a manager
72 // This is a sequence of groups of primitives
90 #include <Graphic3d_Structure.ixx>
91 #include <Graphic3d_Structure.pxx>
93 #include <Graphic3d_GraphicDevice.hxx>
94 #include <Graphic3d_GraphicDriver.hxx>
95 #include <Graphic3d_MaterialAspect.hxx>
97 #include <Graphic3d_MapOfStructure.hxx>
98 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
100 #include <Quantity_Color.hxx>
101 #include <TColStd_Array2OfReal.hxx>
102 #include <Graphic3d_TextureMap.hxx>
104 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
105 #include <Aspect_PolygonOffsetMode.hxx>
106 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
110 //-Global data definitions
114 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& AManager):
118 MyHighlightColor (Quantity_NOC_WHITE)
121 Standard_Integer i, j;
125 Handle(Graphic3d_AspectLine3d) aAspectLine3d =
126 new Graphic3d_AspectLine3d ();
127 Handle(Graphic3d_AspectText3d) aAspectText3d =
128 new Graphic3d_AspectText3d ();
129 Handle(Graphic3d_AspectMarker3d) aAspectMarker3d =
130 new Graphic3d_AspectMarker3d ();
131 Handle(Graphic3d_AspectFillArea3d) aAspectFillArea3d =
132 new Graphic3d_AspectFillArea3d ();
134 // Return default values
135 AManager->PrimitivesAspect (aAspectLine3d, aAspectText3d,
136 aAspectMarker3d, aAspectFillArea3d);
138 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
139 // It is necessary to set default polygon offsets for a new presentation
140 aAspectFillArea3d->SetPolygonOffsets( Aspect_POM_Fill, 1., 0. );
141 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
143 // Update the associated CStructure
144 UpdateStructure (aAspectLine3d, aAspectText3d,
145 aAspectMarker3d, aAspectFillArea3d);
147 MyFirstPtrStructureManager = MyPtrStructureManager =
148 (void *) AManager.operator->();
149 MyCStructure.Id = int (AManager->NewIdentification ());
151 MyCStructure.IsOpen = 0;
152 MyCStructure.IsDeleted = 0;
154 MyCStructure.Composition = 0; /* Graphic3d_TOC_REPLACE */
159 MyCStructure.Transformation[i][j] = float (1.0);
161 MyCStructure.Transformation[i][j] = float (0.0);
163 MyCStructure.Priority = int (Structure_MAX_PRIORITY / 2);
164 MyCStructure.PreviousPriority = MyCStructure.Priority;
165 MyCStructure.stick = 0,
166 MyCStructure.highlight = 0,
167 MyCStructure.visible = 1,
168 MyCStructure.pick = 1;
169 MyCStructure.ContainsFacet = 0,
170 MyCStructure.IsInfinite = 0,
171 MyCStructure.HLRValidation = 0;
173 MyCStructure.ContextLine.IsDef = 1,
174 MyCStructure.ContextFillArea.IsDef = 1,
175 MyCStructure.ContextMarker.IsDef = 1,
176 MyCStructure.ContextText.IsDef = 1;
178 MyCStructure.ContextLine.IsSet = 0,
179 MyCStructure.ContextFillArea.IsSet = 0,
180 MyCStructure.ContextMarker.IsSet = 0,
181 MyCStructure.ContextText.IsSet = 0;
183 MyVisual = Graphic3d_TOS_ALL;
184 MyComputeVisual = Graphic3d_TOS_ALL;
186 /* ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */
187 /*MyCStructure.TransformPersistence.IsDef = 1;*/
188 MyCStructure.TransformPersistence.IsSet = 0;
189 MyCStructure.TransformPersistence.Flag = Graphic3d_TMF_None;
190 MyCStructure.TransformPersistence.Point.x = 0.0;
191 MyCStructure.TransformPersistence.Point.y = 0.0;
192 MyCStructure.TransformPersistence.Point.z = 0.0;
193 /* ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */
194 Handle(Aspect_GraphicDriver) agd =
195 (AManager->GraphicDevice ())->GraphicDriver ();
197 MyGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
199 MyGraphicDriver->Structure (MyCStructure);
202 cout << "Graphic3d_Structure::Create (" << MyCStructure.Id << ")\n";
209 void Graphic3d_Structure::Destroy () {
212 cout << "Graphic3d_Structure::Destroy (" << MyCStructure.Id << ")\n";
215 // as MyFirstPtrStructureManager can be already destroyed,
216 // avoid attempts to access it
217 MyFirstPtrStructureManager = 0;
224 void Graphic3d_Structure::Clear (const Standard_Boolean WithDestruction)
226 if (IsDeleted()) return;
228 MyCStructure.ContainsFacet = 0;
230 // clean groups in graphics driver at first
231 GraphicClear (WithDestruction);
233 // only then remove group references
237 MyStructureManager->Clear (this, WithDestruction);
242 void Graphic3d_Structure::Remove () {
244 if (IsDeleted ()) return;
247 if (MyDescendants.Length () != 0) {
248 cout << "The structure " << MyCStructure.Id << " have "
249 << MyDescendants.Length () << " descendants.\n" << flush;
251 if (MyAncestors.Length () != 0) {
252 cout << "The structure " << MyCStructure.Id << " have "
253 << MyAncestors.Length () << " ancestors.\n" << flush;
257 Standard_Integer i, Length;
259 // clean groups in graphics driver at first; this is also should be done
260 // to avoid unwanted group cleaning in group's destructor
261 // Pass Standard_False to Clear(..) method to avoid updating in
262 // structure manager, it isn't necessary, besides of it structure manager
263 // could be already destroyed and invalid pointers used in structure;
264 Length = MyGroups.Length();
265 for (Standard_Integer aGrId = 1; aGrId <= Length; ++aGrId)
266 MyGroups.ChangeValue (aGrId)->Clear (Standard_False);
268 // Standard_Address APtr = (void *) This ().operator->();
269 Standard_Address APtr = (void *) this;
270 // It is necessary to remove the eventual pointer on the structure
271 // that can be destroyed, in the list of descendants
272 // of ancesters of this structure and in the list of ancesters
273 // of descendants of the same structure.
275 Length = MyDescendants.Length ();
276 for (i=1; i<=Length; i++)
277 ((Graphic3d_Structure *)
278 (MyDescendants.Value (i)))->Remove (APtr, Graphic3d_TOC_ANCESTOR);
280 Length = MyAncestors.Length ();
281 for (i=1; i<=Length; i++)
282 ((Graphic3d_Structure *)
283 (MyAncestors.Value (i)))->Remove (APtr, Graphic3d_TOC_DESCENDANT);
285 MyCStructure.ContainsFacet = 0;
286 MyCStructure.IsDeleted = 1;
288 // Destruction of me in the graphic library
289 MyGraphicDriver->RemoveStructure (MyCStructure);
291 // Liberation of the identification if the destroyed structure
292 // in the first manager that performs creation of the structure.
293 if ( MyFirstPtrStructureManager )
294 MyFirstStructureManager->Remove (Standard_Integer (MyCStructure.Id));
298 void Graphic3d_Structure::Display () {
300 if (IsDeleted ()) return;
302 if (! MyCStructure.stick) {
303 MyCStructure.stick = 1;
304 MyStructureManager->Display (this);
309 void Graphic3d_Structure::Display (const Standard_Integer Priority) {
311 if (IsDeleted ()) return;
313 SetDisplayPriority (Priority);
315 if (! MyCStructure.stick) {
316 MyCStructure.stick = 1;
317 MyStructureManager->Display (this);
322 void Graphic3d_Structure::SetDisplayPriority (const Standard_Integer Priority) {
324 if (IsDeleted ()) return;
327 if( Priority == MyCStructure.Priority ) return;
330 MyCStructure.PreviousPriority = MyCStructure.Priority;
331 MyCStructure.Priority = int (Priority);
333 if (MyCStructure.Priority != MyCStructure.PreviousPriority) {
334 if ( (MyCStructure.Priority > Structure_MAX_PRIORITY) ||
335 (MyCStructure.Priority < Structure_MIN_PRIORITY) )
336 Graphic3d_PriorityDefinitionError::Raise
337 ("Bad value for StructurePriority");
339 if (MyCStructure.stick)
340 MyStructureManager->ChangeDisplayPriority (this,
341 Standard_Integer (MyCStructure.PreviousPriority),
342 Standard_Integer (MyCStructure.Priority));
348 void Graphic3d_Structure::ResetDisplayPriority () {
350 if (IsDeleted ()) return;
352 if (MyCStructure.Priority != MyCStructure.PreviousPriority) {
353 Standard_Integer priority = MyCStructure.Priority;
354 MyCStructure.Priority = MyCStructure.PreviousPriority;
356 if (MyCStructure.stick)
357 MyStructureManager->ChangeDisplayPriority (this,
359 Standard_Integer (MyCStructure.Priority));
365 Standard_Integer Graphic3d_Structure::DisplayPriority () const {
367 return Standard_Integer (MyCStructure.Priority);
371 void Graphic3d_Structure::Erase () {
373 if (IsDeleted ()) return;
375 if (MyCStructure.stick) {
376 MyCStructure.stick = 0;
377 MyStructureManager->Erase (this);
382 void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod AMethod) {
384 if (IsDeleted ()) return;
386 // Highlight on already Highlighted structure.
387 if (MyCStructure.highlight) {
389 Aspect_TypeOfUpdate UpdateMode = MyStructureManager->UpdateMode ();
390 if (UpdateMode == Aspect_TOU_WAIT)
393 // To avoid call of method : Update ()
394 // Not useful and can be costly.
395 MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
397 MyStructureManager->SetUpdateMode (UpdateMode);
402 SetDisplayPriority (Standard_Integer (Structure_MAX_PRIORITY)-1);
404 SetDisplayPriority (Standard_Integer (Structure_MAX_PRIORITY));
407 GraphicHighlight (AMethod);
408 MyStructureManager->Highlight (this, AMethod);
414 void Graphic3d_Structure::SetHighlightColor (const Quantity_Color& AColor) {
416 if (IsDeleted ()) return;
418 if (! MyCStructure.highlight)
419 MyHighlightColor = AColor;
421 // Change highlight color on already Highlighted structure.
423 Aspect_TypeOfUpdate UpdateMode = MyStructureManager->UpdateMode ();
424 if (UpdateMode == Aspect_TOU_WAIT)
427 // To avoid call of method : Update ()
428 // Not useful and can be costly.
429 MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
431 MyStructureManager->SetUpdateMode (UpdateMode);
433 MyHighlightColor = AColor;
434 Highlight (MyHighlightMethod);
439 void Graphic3d_Structure::SetVisible (const Standard_Boolean AValue) {
441 if (IsDeleted ()) return;
443 MyCStructure.visible = AValue ? 1:0;
445 MyGraphicDriver->NameSetStructure (MyCStructure);
448 MyStructureManager->Visible (this);
450 MyStructureManager->Invisible (this);
456 void Graphic3d_Structure::SetPick (const Standard_Boolean AValue) {
458 if (IsDeleted ()) return;
460 MyCStructure.pick = AValue ? 1:0;
462 MyGraphicDriver->NameSetStructure (MyCStructure);
465 MyStructureManager->Detectable (this);
467 MyStructureManager->Undetectable (this);
473 void Graphic3d_Structure::UnHighlight () {
475 if (IsDeleted ()) return;
477 if (MyCStructure.highlight) {
478 MyCStructure.highlight = 0;
480 GraphicUnHighlight ();
481 MyStructureManager->UnHighlight (this);
483 ResetDisplayPriority();
486 (Standard_Integer (MyCStructure.PreviousPriority));
493 Quantity_Color Graphic3d_Structure::HighlightColor () const {
495 return (MyHighlightColor);
499 Standard_Boolean Graphic3d_Structure::IsDisplayed () const {
501 if (MyCStructure.stick)
502 return (Standard_True);
504 return (Standard_False);
508 Standard_Boolean Graphic3d_Structure::IsDeleted () const {
510 if (MyCStructure.IsDeleted)
511 return (Standard_True);
513 return (Standard_False);
517 Standard_Boolean Graphic3d_Structure::IsHighlighted () const {
519 if (MyCStructure.highlight)
520 return (Standard_True);
522 return (Standard_False);
526 Standard_Boolean Graphic3d_Structure::IsSelectable () const {
528 if (MyCStructure.pick)
529 return (Standard_True);
531 return (Standard_False);
535 Standard_Boolean Graphic3d_Structure::IsVisible () const {
537 if (MyCStructure.visible)
538 return (Standard_True);
540 return (Standard_False);
544 Standard_Boolean Graphic3d_Structure::IsRotated () const {
546 // A somewhat light test !
547 return ( MyCStructure.Transformation[0][1] != 0.
548 || MyCStructure.Transformation[0][2] != 0.
549 || MyCStructure.Transformation[1][0] != 0.
550 || MyCStructure.Transformation[1][2] != 0.
551 || MyCStructure.Transformation[2][0] != 0.
552 || MyCStructure.Transformation[2][1] != 0. );
556 Standard_Boolean Graphic3d_Structure::IsTransformed () const {
558 Standard_Boolean Result = Standard_False;
559 Standard_Integer i, j;
561 for (i=0; i<=3 && ! Result; i++)
562 for (j=0; j<=3 && ! Result; j++)
564 Result = MyCStructure.Transformation[i][j] != 1.;
566 Result = MyCStructure.Transformation[i][j] != 0.;
569 cout << "Structure " << Identification ();
571 cout << " is transformed\n" << flush;
573 cout << " is not transformed\n" << flush;
580 Standard_Boolean Graphic3d_Structure::ContainsFacet () const {
582 if (IsDeleted ()) return (Standard_False);
584 // A structure contains at least one facet :
585 // if one of these groups contains at least one facet.
587 Standard_Boolean Result1 = Standard_False;
588 Standard_Boolean Result2 = Standard_False;
589 Standard_Integer i, Length;
591 Result1 = (MyCStructure.ContainsFacet > 0);
593 // If one of groups contains at least one facet, the structure contains it too.
594 if (Result1) return (Result1);
596 Length = MyDescendants.Length ();
598 // Stop at the first descendant containing at least one facet.
599 for (i=1; i<=Length && ! Result2; i++)
600 Result2 = ((Graphic3d_Structure *)
601 (MyDescendants.Value (i)))->ContainsFacet ();
607 Standard_Boolean Graphic3d_Structure::IsEmpty () const {
609 if (IsDeleted ()) return (Standard_True);
611 // A structure is empty :
612 // if all these groups are empty or if all
613 // groups are empty and all their descendants
614 // are empty or if all its descendants are empty.
616 Standard_Boolean Result1 = Standard_True;
617 Standard_Integer i, Length = MyGroups.Length ();
619 // Stop at the first non-empty group
620 for (i=1; i<=Length && Result1; i++)
621 Result1 = (MyGroups.Value (i))->IsEmpty ();
623 // If a group is non-empty the structure is also non-empty.
624 if (! Result1) return (Standard_False);
626 Standard_Boolean Result2 = Standard_True;
628 Length = MyDescendants.Length ();
630 // Stop at the first non-empty descendant
631 for (i=1; i<=Length && Result2; i++)
632 Result2 = ((Graphic3d_Structure *)
633 (MyDescendants.Value (i)))->IsEmpty ();
639 void Graphic3d_Structure::PrimitivesAspect (Handle(Graphic3d_AspectLine3d)& CTXL, Handle(Graphic3d_AspectText3d)& CTXT, Handle(Graphic3d_AspectMarker3d)& CTXM, Handle(Graphic3d_AspectFillArea3d)& CTXF) const {
641 CTXL = Line3dAspect ();
642 CTXT = Text3dAspect ();
643 CTXM = Marker3dAspect ();
644 CTXF = FillArea3dAspect ();
648 void Graphic3d_Structure::GroupsWithFacet (const Standard_Integer ADelta) {
650 MyCStructure.ContainsFacet = MyCStructure.ContainsFacet + ADelta;
651 if (MyCStructure.ContainsFacet < 0) MyCStructure.ContainsFacet = 0;
654 cout << "MyCStructure.ContainsFacet " << MyCStructure.ContainsFacet;
655 cout << endl << flush;
660 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ) {
662 // Implemented by Presentation
666 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& , const TColStd_Array2OfReal& ) {
668 // Implemented by Presentation
672 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& , Handle(Graphic3d_Structure)& ) {
674 // Implemented by Presentation
677 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& , const TColStd_Array2OfReal& , Handle(Graphic3d_Structure)& ) {
679 // Implemented by Presentation
682 void Graphic3d_Structure::ReCompute () {
684 MyStructureManager->ReCompute (this);
688 void Graphic3d_Structure::ReCompute (const Handle(Graphic3d_DataStructureManager)& aProjector) {
690 MyStructureManager->ReCompute (this, aProjector);
694 void Graphic3d_Structure::SetInfiniteState (const Standard_Boolean AValue) {
696 MyCStructure.IsInfinite = AValue ? 1:0;
700 Standard_Boolean Graphic3d_Structure::IsInfinite () const {
702 if (IsDeleted ()) return (Standard_True);
704 if (MyCStructure.IsInfinite)
705 return (Standard_True);
707 return (Standard_False);
711 void Graphic3d_Structure::GraphicClear (const Standard_Boolean WithDestruction)
713 // clean and empty each group
714 Standard_Integer Length = MyGroups.Length();
715 for (Standard_Integer aGrId = 1; aGrId <= Length; ++aGrId)
717 MyGroups.ChangeValue (aGrId)->Clear();
722 while (!MyGroups.IsEmpty())
724 Handle(Graphic3d_Group) aGroup = MyGroups.First();
728 MyGraphicDriver->ClearStructure (MyCStructure);
732 void Graphic3d_Structure::GraphicConnect (const Handle(Graphic3d_Structure)& theDaughter)
734 MyGraphicDriver->Connect (MyCStructure, theDaughter->MyCStructure);
737 void Graphic3d_Structure::GraphicDisconnect (const Handle(Graphic3d_Structure)& theDaughter)
739 MyGraphicDriver->Disconnect (MyCStructure, theDaughter->MyCStructure);
742 Handle(Graphic3d_AspectLine3d) Graphic3d_Structure::Line3dAspect () const {
744 Standard_Real R, G, B;
745 Standard_Real AWidth;
746 Quantity_Color AColor;
747 Aspect_TypeOfLine ALType;
750 R = Standard_Real (MyCStructure.ContextLine.Color.r);
751 G = Standard_Real (MyCStructure.ContextLine.Color.g);
752 B = Standard_Real (MyCStructure.ContextLine.Color.b);
753 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
754 ALType = Aspect_TypeOfLine (MyCStructure.ContextLine.LineType);
755 AWidth = Standard_Real (MyCStructure.ContextLine.Width);
757 Handle(Graphic3d_AspectLine3d) CTXL =
758 new Graphic3d_AspectLine3d (AColor, ALType, AWidth);
764 Handle(Graphic3d_AspectText3d) Graphic3d_Structure::Text3dAspect () const {
766 Standard_Real R, G, B;
767 Standard_CString AFont;
768 Standard_Real ASpace;
769 Standard_Real AnExpansion;
770 Quantity_Color AColor;
771 Aspect_TypeOfStyleText AStyle;
772 Aspect_TypeOfDisplayText ADisplayType;
775 R = Standard_Real (MyCStructure.ContextText.Color.r);
776 G = Standard_Real (MyCStructure.ContextText.Color.g);
777 B = Standard_Real (MyCStructure.ContextText.Color.b);
778 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
779 AFont = Standard_CString (MyCStructure.ContextText.Font);
780 AnExpansion = Standard_Real (MyCStructure.ContextText.Expan);
781 ASpace = Standard_Real (MyCStructure.ContextText.Space);
782 AStyle = Aspect_TypeOfStyleText (MyCStructure.ContextText.Style);
783 ADisplayType = Aspect_TypeOfDisplayText (MyCStructure.ContextText.DisplayType);
785 Handle(Graphic3d_AspectText3d) CTXT =
786 new Graphic3d_AspectText3d (AColor, AFont, AnExpansion, ASpace,AStyle,ADisplayType);
792 Handle(Graphic3d_AspectMarker3d) Graphic3d_Structure::Marker3dAspect () const {
794 Standard_Real R, G, B;
795 Standard_Real AScale;
796 Quantity_Color AColor;
797 Aspect_TypeOfMarker AMType;
800 R = Standard_Real (MyCStructure.ContextMarker.Color.r);
801 G = Standard_Real (MyCStructure.ContextMarker.Color.g);
802 B = Standard_Real (MyCStructure.ContextMarker.Color.b);
803 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
804 AMType = Aspect_TypeOfMarker (MyCStructure.ContextMarker.MarkerType);
805 AScale = Standard_Real (MyCStructure.ContextMarker.Scale);
807 Handle(Graphic3d_AspectMarker3d) CTXM =
808 new Graphic3d_AspectMarker3d (AMType, AColor, AScale);
814 Handle(Graphic3d_AspectFillArea3d) Graphic3d_Structure::FillArea3dAspect () const {
816 Standard_Real R, G, B;
817 Standard_Real AWidth;
818 Quantity_Color AColor;
819 Quantity_Color AnIntColor;
820 Quantity_Color AnEdgeColor;
821 Aspect_TypeOfLine ALType;
822 Aspect_InteriorStyle AStyle;
823 Standard_Boolean EdgeOn = Standard_False;
824 Graphic3d_MaterialAspect Front;
825 Graphic3d_MaterialAspect Back;
828 AStyle = Aspect_InteriorStyle (MyCStructure.ContextFillArea.Style);
829 R = Standard_Real (MyCStructure.ContextFillArea.IntColor.r);
830 G = Standard_Real (MyCStructure.ContextFillArea.IntColor.g);
831 B = Standard_Real (MyCStructure.ContextFillArea.IntColor.b);
832 AnIntColor.SetValues (R, G, B, Quantity_TOC_RGB);
834 if (MyCStructure.ContextFillArea.Edge == 1) EdgeOn = Standard_True;
835 R = Standard_Real (MyCStructure.ContextFillArea.EdgeColor.r);
836 G = Standard_Real (MyCStructure.ContextFillArea.EdgeColor.g);
837 B = Standard_Real (MyCStructure.ContextFillArea.EdgeColor.b);
838 AnEdgeColor.SetValues (R, G, B, Quantity_TOC_RGB);
839 ALType = Aspect_TypeOfLine (MyCStructure.ContextFillArea.LineType);
840 AWidth = Standard_Real (MyCStructure.ContextFillArea.Width);
843 Standard_Real (MyCStructure.ContextFillArea.Back.Shininess));
845 Standard_Real (MyCStructure.ContextFillArea.Back.Ambient));
847 Standard_Real (MyCStructure.ContextFillArea.Back.Diffuse));
849 Standard_Real (MyCStructure.ContextFillArea.Back.Specular));
850 Back.SetTransparency (
851 Standard_Real (MyCStructure.ContextFillArea.Back.Transparency));
853 Standard_Real (MyCStructure.ContextFillArea.Back.Emission));
854 if (MyCStructure.ContextFillArea.Back.IsAmbient == 1)
855 Back.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
857 Back.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
858 if (MyCStructure.ContextFillArea.Back.IsDiffuse == 1)
859 Back.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
861 Back.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
862 if (MyCStructure.ContextFillArea.Back.IsSpecular == 1)
863 Back.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
865 Back.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
866 if (MyCStructure.ContextFillArea.Back.IsEmission == 1)
867 Back.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
869 Back.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
871 R = Standard_Real (MyCStructure.ContextFillArea.Back.ColorSpec.r);
872 G = Standard_Real (MyCStructure.ContextFillArea.Back.ColorSpec.g);
873 B = Standard_Real (MyCStructure.ContextFillArea.Back.ColorSpec.b);
874 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
875 Back.SetSpecularColor (AColor);
877 R = Standard_Real (MyCStructure.ContextFillArea.Back.ColorAmb.r);
878 G = Standard_Real (MyCStructure.ContextFillArea.Back.ColorAmb.g);
879 B = Standard_Real (MyCStructure.ContextFillArea.Back.ColorAmb.b);
880 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
881 Back.SetAmbientColor (AColor);
883 R = Standard_Real (MyCStructure.ContextFillArea.Back.ColorDif.r);
884 G = Standard_Real (MyCStructure.ContextFillArea.Back.ColorDif.g);
885 B = Standard_Real (MyCStructure.ContextFillArea.Back.ColorDif.b);
886 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
887 Back.SetDiffuseColor (AColor);
889 R = Standard_Real (MyCStructure.ContextFillArea.Back.ColorEms.r);
890 G = Standard_Real (MyCStructure.ContextFillArea.Back.ColorEms.g);
891 B = Standard_Real (MyCStructure.ContextFillArea.Back.ColorEms.b);
892 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
893 Back.SetEmissiveColor (AColor);
895 Back.SetEnvReflexion (MyCStructure.ContextFillArea.Back.EnvReflexion);
897 Graphic3d_TypeOfMaterial mType =
898 MyCStructure.ContextFillArea.Back.IsPhysic ?
899 Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT;
900 Back.SetMaterialType(mType);
904 Standard_Real (MyCStructure.ContextFillArea.Front.Shininess));
906 Standard_Real (MyCStructure.ContextFillArea.Front.Ambient));
908 Standard_Real (MyCStructure.ContextFillArea.Front.Diffuse));
910 Standard_Real (MyCStructure.ContextFillArea.Front.Specular));
911 Front.SetTransparency (
912 Standard_Real (MyCStructure.ContextFillArea.Front.Transparency));
914 Standard_Real (MyCStructure.ContextFillArea.Front.Emission));
915 if (MyCStructure.ContextFillArea.Front.IsAmbient == 1)
916 Front.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
918 Front.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
919 if (MyCStructure.ContextFillArea.Front.IsDiffuse == 1)
920 Front.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
922 Front.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
923 if (MyCStructure.ContextFillArea.Front.IsSpecular == 1)
924 Front.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
926 Front.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
927 if (MyCStructure.ContextFillArea.Front.Emission == 1)
928 Front.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
930 Front.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
932 R = Standard_Real (MyCStructure.ContextFillArea.Front.ColorSpec.r);
933 G = Standard_Real (MyCStructure.ContextFillArea.Front.ColorSpec.g);
934 B = Standard_Real (MyCStructure.ContextFillArea.Front.ColorSpec.b);
935 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
936 Front.SetSpecularColor (AColor);
938 R = Standard_Real (MyCStructure.ContextFillArea.Front.ColorAmb.r);
939 G = Standard_Real (MyCStructure.ContextFillArea.Front.ColorAmb.g);
940 B = Standard_Real (MyCStructure.ContextFillArea.Front.ColorAmb.b);
941 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
942 Front.SetAmbientColor (AColor);
944 R = Standard_Real (MyCStructure.ContextFillArea.Front.ColorDif.r);
945 G = Standard_Real (MyCStructure.ContextFillArea.Front.ColorDif.g);
946 B = Standard_Real (MyCStructure.ContextFillArea.Front.ColorDif.b);
947 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
948 Front.SetDiffuseColor (AColor);
950 R = Standard_Real (MyCStructure.ContextFillArea.Front.ColorEms.r);
951 G = Standard_Real (MyCStructure.ContextFillArea.Front.ColorEms.g);
952 B = Standard_Real (MyCStructure.ContextFillArea.Front.ColorEms.b);
953 AColor.SetValues (R, G, B, Quantity_TOC_RGB);
954 Front.SetEmissiveColor (AColor);
956 Front.SetEnvReflexion (MyCStructure.ContextFillArea.Front.EnvReflexion);
958 mType = MyCStructure.ContextFillArea.Front.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT;
959 Front.SetMaterialType(mType);
961 Handle(Graphic3d_AspectFillArea3d) CTXF =
962 new Graphic3d_AspectFillArea3d (AStyle, AnIntColor, AnEdgeColor, ALType, AWidth, Front, Back);
970 CTXF->SetHatchStyle(Aspect_HatchStyle (MyCStructure.ContextFillArea.Hatch));
972 // Front and Back face
973 if (MyCStructure.ContextFillArea.Distinguish == 1)
974 CTXF->SetDistinguishOn ();
976 CTXF->SetDistinguishOff ();
977 if (MyCStructure.ContextFillArea.BackFace == 1)
978 CTXF->SuppressBackFace ();
980 CTXF->AllowBackFace ();
982 CTXF->SetTextureMap (MyCStructure.ContextFillArea.Texture.TextureMap);
983 if (MyCStructure.ContextFillArea.Texture.doTextureMap == 1)
985 CTXF->SetTextureMapOn();
989 CTXF->SetTextureMapOff();
992 Aspect_TypeOfDegenerateModel dMode = Aspect_TypeOfDegenerateModel(
993 MyCStructure.ContextFillArea.DegenerationMode);
994 Quantity_Ratio dRatio =
995 MyCStructure.ContextFillArea.SkipRatio;
996 CTXF->SetDegenerateModel(dMode,dRatio);
999 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
1000 CTXF->SetPolygonOffsets(MyCStructure.ContextFillArea.PolygonOffsetMode,
1001 MyCStructure.ContextFillArea.PolygonOffsetFactor,
1002 MyCStructure.ContextFillArea.PolygonOffsetUnits);
1003 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
1009 const Graphic3d_SequenceOfGroup& Graphic3d_Structure::Groups() const {
1013 Standard_Integer Graphic3d_Structure::NumberOfGroups () const {
1014 return (MyGroups.Length ());
1017 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& CTX) {
1019 if (IsDeleted ()) return;
1021 Standard_Real R, G, B;
1022 Standard_Real AWidth;
1023 Quantity_Color AColor;
1024 Aspect_TypeOfLine ALType;
1026 CTX->Values (AColor, ALType, AWidth);
1027 AColor.Values (R, G, B, Quantity_TOC_RGB);
1029 MyCStructure.ContextLine.Color.r = float (R);
1030 MyCStructure.ContextLine.Color.g = float (G);
1031 MyCStructure.ContextLine.Color.b = float (B);
1032 MyCStructure.ContextLine.LineType = int (ALType);
1033 MyCStructure.ContextLine.Width = float (AWidth);
1034 MyCStructure.ContextLine.IsDef = 1;
1036 MyGraphicDriver->ContextStructure (MyCStructure);
1039 // Attributes are "IsSet" during the first update
1040 // of context (line, marker...)
1041 MyCStructure.ContextLine.IsSet = 1;
1042 MyCStructure.ContextFillArea.IsSet = 1;
1043 MyCStructure.ContextMarker.IsSet = 1;
1044 MyCStructure.ContextText.IsSet = 1;
1050 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& CTX) {
1052 if (IsDeleted ()) return;
1054 Standard_Real R, G, B;
1055 Standard_Real AWidth;
1056 Quantity_Color AnIntColor;
1057 Quantity_Color BackIntColor;
1058 Quantity_Color AnEdgeColor;
1059 Aspect_TypeOfLine ALType;
1060 Aspect_InteriorStyle AStyle;
1062 CTX->Values (AStyle, AnIntColor, BackIntColor, AnEdgeColor, ALType, AWidth);
1063 AnIntColor.Values (R, G, B, Quantity_TOC_RGB);
1065 MyCStructure.ContextFillArea.Style = int (AStyle);
1066 MyCStructure.ContextFillArea.IntColor.r = float (R);
1067 MyCStructure.ContextFillArea.IntColor.g = float (G);
1068 MyCStructure.ContextFillArea.IntColor.b = float (B);
1071 if ( CTX->Distinguish() )
1072 BackIntColor.Values( R, G, B, Quantity_TOC_RGB );
1074 MyCStructure.ContextFillArea.BackIntColor.r = float( R );
1075 MyCStructure.ContextFillArea.BackIntColor.g = float( G );
1076 MyCStructure.ContextFillArea.BackIntColor.b = float( B );
1080 MyCStructure.ContextFillArea.Edge = CTX->Edge () ? 1:0;
1081 AnEdgeColor.Values (R, G, B, Quantity_TOC_RGB);
1082 MyCStructure.ContextFillArea.EdgeColor.r = float (R);
1083 MyCStructure.ContextFillArea.EdgeColor.g = float (G);
1084 MyCStructure.ContextFillArea.EdgeColor.b = float (B);
1085 MyCStructure.ContextFillArea.LineType = int (ALType);
1086 MyCStructure.ContextFillArea.Width = float (AWidth);
1087 MyCStructure.ContextFillArea.Hatch = int (CTX->HatchStyle ());
1089 Quantity_Ratio ratio;
1090 MyCStructure.ContextFillArea.DegenerationMode =
1091 int (CTX->DegenerateModel(ratio));
1092 MyCStructure.ContextFillArea.SkipRatio = float (ratio);
1095 /*** Front and Back face ***/
1096 MyCStructure.ContextFillArea.Distinguish = CTX->Distinguish () ? 1:0;
1097 MyCStructure.ContextFillArea.BackFace = CTX->BackFace () ? 1:0;
1099 /*** Back Material ***/
1100 // Light specificity
1101 MyCStructure.ContextFillArea.Back.Shininess =
1102 float ((CTX->BackMaterial ()).Shininess ());
1103 MyCStructure.ContextFillArea.Back.Ambient =
1104 float ((CTX->BackMaterial ()).Ambient ());
1105 MyCStructure.ContextFillArea.Back.Diffuse =
1106 float ((CTX->BackMaterial ()).Diffuse ());
1107 MyCStructure.ContextFillArea.Back.Specular =
1108 float ((CTX->BackMaterial ()).Specular ());
1109 MyCStructure.ContextFillArea.Back.Transparency =
1110 float ((CTX->BackMaterial ()).Transparency ());
1111 MyCStructure.ContextFillArea.Back.Emission =
1112 float ((CTX->BackMaterial ()).Emissive ());
1115 MyCStructure.ContextFillArea.Back.IsAmbient =
1116 ( (CTX->BackMaterial ()).ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0 );
1117 MyCStructure.ContextFillArea.Back.IsDiffuse =
1118 ( (CTX->BackMaterial ()).ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0 );
1119 MyCStructure.ContextFillArea.Back.IsSpecular =
1120 ( (CTX->BackMaterial ()).ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0 );
1121 MyCStructure.ContextFillArea.Back.IsEmission =
1122 ( (CTX->BackMaterial ()).ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0 );
1126 const Graphic3d_MaterialAspect ama = CTX->BackMaterial () ;
1127 Standard_Boolean amt = ama.MaterialType(Graphic3d_MATERIAL_PHYSIC) ;
1128 MyCStructure.ContextFillArea.Back.IsPhysic = ( amt ? 1 : 0 );
1131 MyCStructure.ContextFillArea.Back.ColorSpec.r =
1132 float (((CTX->BackMaterial ()).SpecularColor ()).Red ());
1133 MyCStructure.ContextFillArea.Back.ColorSpec.g =
1134 float (((CTX->BackMaterial ()).SpecularColor ()).Green ());
1135 MyCStructure.ContextFillArea.Back.ColorSpec.b =
1136 float (((CTX->BackMaterial ()).SpecularColor ()).Blue ());
1139 MyCStructure.ContextFillArea.Back.ColorAmb.r =
1140 float (((CTX->BackMaterial ()).AmbientColor ()).Red ());
1141 MyCStructure.ContextFillArea.Back.ColorAmb.g =
1142 float (((CTX->BackMaterial ()).AmbientColor ()).Green ());
1143 MyCStructure.ContextFillArea.Back.ColorAmb.b =
1144 float (((CTX->BackMaterial ()).AmbientColor ()).Blue ());
1147 MyCStructure.ContextFillArea.Back.ColorDif.r =
1148 float (((CTX->BackMaterial ()).DiffuseColor ()).Red ());
1149 MyCStructure.ContextFillArea.Back.ColorDif.g =
1150 float (((CTX->BackMaterial ()).DiffuseColor ()).Green ());
1151 MyCStructure.ContextFillArea.Back.ColorDif.b =
1152 float (((CTX->BackMaterial ()).DiffuseColor ()).Blue ());
1155 MyCStructure.ContextFillArea.Back.ColorEms.r =
1156 float (((CTX->BackMaterial ()).EmissiveColor ()).Red ());
1157 MyCStructure.ContextFillArea.Back.ColorEms.g =
1158 float (((CTX->BackMaterial ()).EmissiveColor ()).Green ());
1159 MyCStructure.ContextFillArea.Back.ColorEms.b =
1160 float (((CTX->BackMaterial ()).EmissiveColor ()).Blue ());
1162 MyCStructure.ContextFillArea.Back.EnvReflexion =
1163 float ((CTX->BackMaterial ()).EnvReflexion());
1165 /*** Front Material ***/
1166 // Light specificity
1167 MyCStructure.ContextFillArea.Front.Shininess =
1168 float ((CTX->FrontMaterial ()).Shininess ());
1169 MyCStructure.ContextFillArea.Front.Ambient =
1170 float ((CTX->FrontMaterial ()).Ambient ());
1171 MyCStructure.ContextFillArea.Front.Diffuse =
1172 float ((CTX->FrontMaterial ()).Diffuse ());
1173 MyCStructure.ContextFillArea.Front.Specular =
1174 float ((CTX->FrontMaterial ()).Specular ());
1175 MyCStructure.ContextFillArea.Front.Transparency =
1176 float ((CTX->FrontMaterial ()).Transparency ());
1177 MyCStructure.ContextFillArea.Front.Emission =
1178 float ((CTX->FrontMaterial ()).Emissive ());
1181 MyCStructure.ContextFillArea.Front.IsAmbient =
1182 ( (CTX->FrontMaterial ()).ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0 );
1183 MyCStructure.ContextFillArea.Front.IsDiffuse =
1184 ( (CTX->FrontMaterial ()).ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0 );
1185 MyCStructure.ContextFillArea.Front.IsSpecular =
1186 ( (CTX->FrontMaterial ()).ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0 );
1187 MyCStructure.ContextFillArea.Front.IsEmission =
1188 ( (CTX->FrontMaterial ()).ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0 );
1192 const Graphic3d_MaterialAspect amas = CTX->FrontMaterial () ;
1193 Standard_Boolean amty = amas.MaterialType(Graphic3d_MATERIAL_PHYSIC) ;
1194 MyCStructure.ContextFillArea.Front.IsPhysic = ( amty ? 1 : 0 );
1197 MyCStructure.ContextFillArea.Front.ColorSpec.r =
1198 float (((CTX->FrontMaterial ()).SpecularColor ()).Red ());
1199 MyCStructure.ContextFillArea.Front.ColorSpec.g =
1200 float (((CTX->FrontMaterial ()).SpecularColor ()).Green ());
1201 MyCStructure.ContextFillArea.Front.ColorSpec.b =
1202 float (((CTX->FrontMaterial ()).SpecularColor ()).Blue ());
1205 MyCStructure.ContextFillArea.Front.ColorAmb.r =
1206 float (((CTX->FrontMaterial ()).AmbientColor ()).Red ());
1207 MyCStructure.ContextFillArea.Front.ColorAmb.g =
1208 float (((CTX->FrontMaterial ()).AmbientColor ()).Green ());
1209 MyCStructure.ContextFillArea.Front.ColorAmb.b =
1210 float (((CTX->FrontMaterial ()).AmbientColor ()).Blue ());
1213 MyCStructure.ContextFillArea.Front.ColorDif.r =
1214 float (((CTX->FrontMaterial ()).DiffuseColor ()).Red ());
1215 MyCStructure.ContextFillArea.Front.ColorDif.g =
1216 float (((CTX->FrontMaterial ()).DiffuseColor ()).Green ());
1217 MyCStructure.ContextFillArea.Front.ColorDif.b =
1218 float (((CTX->FrontMaterial ()).DiffuseColor ()).Blue ());
1221 MyCStructure.ContextFillArea.Front.ColorEms.r =
1222 float (((CTX->FrontMaterial ()).EmissiveColor ()).Red ());
1223 MyCStructure.ContextFillArea.Front.ColorEms.g =
1224 float (((CTX->FrontMaterial ()).EmissiveColor ()).Green ());
1225 MyCStructure.ContextFillArea.Front.ColorEms.b =
1226 float (((CTX->FrontMaterial ()).EmissiveColor ()).Blue ());
1228 MyCStructure.ContextFillArea.Front.EnvReflexion =
1229 float ((CTX->FrontMaterial ()).EnvReflexion());
1231 MyCStructure.ContextFillArea.IsDef = 1; // Definition material ok
1233 MyCStructure.ContextFillArea.Texture.TextureMap = CTX->TextureMap();
1234 MyCStructure.ContextFillArea.Texture.doTextureMap = CTX->TextureMapState() ? 1 : 0;
1236 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
1237 Standard_Integer aPolyMode;
1238 Standard_ShortReal aPolyFactor, aPolyUnits;
1239 CTX->PolygonOffsets(aPolyMode, aPolyFactor, aPolyUnits);
1240 MyCStructure.ContextFillArea.PolygonOffsetMode = aPolyMode;
1241 MyCStructure.ContextFillArea.PolygonOffsetFactor = (Standard_ShortReal)aPolyFactor;
1242 MyCStructure.ContextFillArea.PolygonOffsetUnits = (Standard_ShortReal)aPolyUnits;
1243 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
1245 MyGraphicDriver->ContextStructure (MyCStructure);
1247 MyGraphicDriver -> DegenerateStructure (MyCStructure);
1251 // Attributes are "IsSet" during the first update
1252 // of context (line, marker...)
1253 MyCStructure.ContextLine.IsSet = 1;
1254 MyCStructure.ContextFillArea.IsSet = 1;
1255 MyCStructure.ContextMarker.IsSet = 1;
1256 MyCStructure.ContextText.IsSet = 1;
1262 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& CTX) {
1264 if (IsDeleted ()) return;
1266 Standard_Real R, G, B;
1267 Standard_Real Rs, Gs, Bs;
1268 Standard_CString AFont;
1269 Standard_Real ASpace;
1270 Standard_Real AnExpansion;
1271 Quantity_Color AColor;
1272 Aspect_TypeOfStyleText AStyle;
1273 Aspect_TypeOfDisplayText ADisplayType;
1274 Quantity_Color AColorSubTitle;
1275 Standard_Boolean ATextZoomable;
1276 Standard_Real ATextAngle;
1277 Font_FontAspect ATextFontAspect;
1279 CTX->Values (AColor, AFont, AnExpansion, ASpace, AStyle, ADisplayType,AColorSubTitle,ATextZoomable,ATextAngle,ATextFontAspect);
1280 AColor.Values (R, G, B, Quantity_TOC_RGB);
1281 AColorSubTitle.Values (Rs, Gs, Bs, Quantity_TOC_RGB);
1283 MyCStructure.ContextText.Color.r = float (R);
1284 MyCStructure.ContextText.Color.g = float (G);
1285 MyCStructure.ContextText.Color.b = float (B);
1286 MyCStructure.ContextText.Font = (char*) (AFont);
1287 MyCStructure.ContextText.Expan = float (AnExpansion);
1288 MyCStructure.ContextText.Space = float (ASpace);
1289 MyCStructure.ContextText.Style = int (AStyle);
1290 MyCStructure.ContextText.DisplayType = int (ADisplayType);
1291 MyCStructure.ContextText.ColorSubTitle.r = float (Rs);
1292 MyCStructure.ContextText.ColorSubTitle.g = float (Gs);
1293 MyCStructure.ContextText.ColorSubTitle.b = float (Bs);
1294 MyCStructure.ContextText.TextZoomable = ATextZoomable;
1295 MyCStructure.ContextText.TextAngle = float (ATextAngle);
1296 MyCStructure.ContextText.TextFontAspect = int (ATextFontAspect);
1298 MyCStructure.ContextText.IsDef = 1;
1300 MyGraphicDriver->ContextStructure (MyCStructure);
1303 // Attributes are "IsSet" during the first update of a context (line, marker...)
1304 MyCStructure.ContextLine.IsSet = 1;
1305 MyCStructure.ContextFillArea.IsSet = 1;
1306 MyCStructure.ContextMarker.IsSet = 1;
1307 MyCStructure.ContextText.IsSet = 1;
1313 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& CTX) {
1315 if (IsDeleted ()) return;
1317 Standard_Real R, G, B;
1318 Standard_Real AScale;
1319 Quantity_Color AColor;
1320 Aspect_TypeOfMarker AMType;
1322 CTX->Values (AColor, AMType, AScale);
1323 AColor.Values (R, G, B, Quantity_TOC_RGB);
1325 MyCStructure.ContextMarker.Color.r = float (R);
1326 MyCStructure.ContextMarker.Color.g = float (G);
1327 MyCStructure.ContextMarker.Color.b = float (B);
1328 MyCStructure.ContextMarker.MarkerType = int (AMType);
1329 MyCStructure.ContextMarker.Scale = float (AScale);
1330 MyCStructure.ContextMarker.IsDef = 1;
1332 MyGraphicDriver->ContextStructure (MyCStructure);
1334 // Attributes are "IsSet" during the first update of a context (line, marker...)
1335 MyCStructure.ContextLine.IsSet = 1;
1336 MyCStructure.ContextFillArea.IsSet = 1;
1337 MyCStructure.ContextMarker.IsSet = 1;
1338 MyCStructure.ContextText.IsSet = 1;
1344 void Graphic3d_Structure::SetVisual (const Graphic3d_TypeOfStructure AVisual) {
1346 if (IsDeleted ()) return;
1347 if (MyVisual == AVisual) return;
1349 if (! MyCStructure.stick) {
1351 SetComputeVisual (AVisual);
1355 Aspect_TypeOfUpdate UpdateMode = MyStructureManager->UpdateMode ();
1356 if (UpdateMode == Aspect_TOU_WAIT) {
1359 SetComputeVisual (AVisual);
1363 // To avoid calling method : Update ()
1364 // Not useful and can be costly.
1365 MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
1368 SetComputeVisual (AVisual);
1369 MyStructureManager->SetUpdateMode (UpdateMode);
1376 void Graphic3d_Structure::SetZoomLimit (const Standard_Real LimitInf, const Standard_Real LimitSup) {
1378 if (LimitInf <= 0.0)
1379 Graphic3d_StructureDefinitionError::Raise
1380 ("Bad value for ZoomLimit inf");
1382 if (LimitSup <= 0.0)
1383 Graphic3d_StructureDefinitionError::Raise
1384 ("Bad value for ZoomLimit sup");
1386 if (LimitSup < LimitInf)
1387 Graphic3d_StructureDefinitionError::Raise
1388 ("ZoomLimit sup < ZoomLimit inf");
1392 Graphic3d_TypeOfStructure Graphic3d_Structure::Visual () const {
1398 Standard_Boolean Graphic3d_Structure::AcceptConnection (const Handle(Graphic3d_Structure)& AStructure1, const Handle(Graphic3d_Structure)& AStructure2, const Graphic3d_TypeOfConnection AType) {
1400 Graphic3d_MapOfStructure ASet;
1403 Graphic3d_Structure::Network (AStructure2, AType, ASet);
1405 return (! ASet.Contains (AStructure1));
1409 void Graphic3d_Structure::Ancestors (Graphic3d_MapOfStructure &SG) const {
1411 Standard_Integer i, Length = MyAncestors.Length ();
1413 for (i=1; i<=Length; i++)
1414 SG.Add ((Graphic3d_Structure *) (MyAncestors.Value (i)));
1419 void Graphic3d_Structure::SetOwner (const Standard_Address Owner) {
1425 Standard_Address Graphic3d_Structure::Owner () const {
1431 void Graphic3d_Structure::Descendants (Graphic3d_MapOfStructure& SG) const {
1433 Standard_Integer i, Length = MyDescendants.Length ();
1435 for (i=1; i<=Length; i++)
1436 SG.Add ((Graphic3d_Structure *) (MyDescendants.Value (i)));
1440 void Graphic3d_Structure::Connect (const Handle(Graphic3d_Structure)& AStructure, const Graphic3d_TypeOfConnection AType, const Standard_Boolean WithCheck) {
1442 if (IsDeleted ()) return;
1446 if (! Graphic3d_Structure::AcceptConnection
1447 (this, AStructure, AType))
1455 case Graphic3d_TOC_DESCENDANT :
1457 Standard_Integer indexD = 0;
1458 Standard_Integer LengthD = MyDescendants.Length ();
1459 for (i=1; i<=LengthD && indexD==0; i++)
1460 if ((void *) (MyDescendants.Value (i)) ==
1461 (void *) (AStructure.operator->())) indexD = i;
1464 MyDescendants.Append ((void *) AStructure.operator->());
1465 AStructure->Connect (this, Graphic3d_TOC_ANCESTOR);
1467 GraphicConnect (AStructure);
1468 MyStructureManager->Connect (this, AStructure);
1475 case Graphic3d_TOC_ANCESTOR :
1477 Standard_Integer indexA = 0;
1478 Standard_Integer LengthA = MyAncestors.Length ();
1479 for (i=1; i<=LengthA && indexA==0; i++)
1480 if ((void *) (MyAncestors.Value (i)) ==
1481 (void *) (AStructure.operator->())) indexA = i;
1484 MyAncestors.Append ((void *) AStructure.operator->());
1485 AStructure->Connect (this, Graphic3d_TOC_DESCENDANT);
1487 // MyGraphicDriver->Connect is called in case
1488 // if connection between parent and child
1496 void Graphic3d_Structure::Disconnect (const Handle(Graphic3d_Structure)& AStructure) {
1498 if (IsDeleted ()) return;
1502 Standard_Integer indexD = 0;
1503 Standard_Integer LengthD = MyDescendants.Length ();
1504 for (i=1; i<=LengthD && indexD==0; i++)
1505 if ((void *) (MyDescendants.Value (i)) ==
1506 (void *) (AStructure.operator->())) indexD = i;
1508 // Search in the Descendants
1510 MyDescendants.Remove (indexD);
1511 AStructure->Disconnect (this);
1513 GraphicDisconnect (AStructure);
1514 MyStructureManager->Disconnect (this, AStructure);
1519 Standard_Integer indexA = 0;
1520 Standard_Integer LengthA = MyAncestors.Length ();
1521 for (i=1; i<=LengthA && indexA==0; i++)
1522 if ((void *) (MyAncestors.Value (i)) ==
1523 (void *) (AStructure.operator->())) indexA = i;
1525 // Search in the Ancestors
1527 MyAncestors.Remove (indexA);
1528 AStructure->Disconnect (this);
1530 // No call of MyGraphicDriver->Disconnect
1531 // in case of an ancestor
1537 void Graphic3d_Structure::DisconnectAll (const Graphic3d_TypeOfConnection AType) {
1539 if (IsDeleted ()) return;
1541 Standard_Integer i, Length;
1546 case Graphic3d_TOC_DESCENDANT :
1547 Length = MyDescendants.Length ();
1548 for (i=1; i<=Length; i++)
1549 // Value (1) instead of Value (i) as MyDescendants
1551 // Graphic3d_Structure::Disconnect (AStructure)
1552 // that takes AStructure from MyDescendants
1553 ((Graphic3d_Structure *)
1554 (MyDescendants.Value (1)))->Disconnect (this);
1556 case Graphic3d_TOC_ANCESTOR :
1557 Length = MyAncestors.Length ();
1558 for (i=1; i<=Length; i++)
1559 // Value (1) instead of Value (i) as MyAncestors
1561 // Graphic3d_Structure::Disconnect (AStructure)
1562 // that takes AStructure from MyAncestors
1563 ((Graphic3d_Structure *)
1564 (MyAncestors.Value (1)))->Disconnect (this);
1570 Graphic3d_TypeOfComposition Graphic3d_Structure::Composition () const {
1572 if (MyCStructure.Composition)
1573 return (Graphic3d_TOC_POSTCONCATENATE);
1575 return (Graphic3d_TOC_REPLACE);
1579 void Graphic3d_Structure::SetTransform (const TColStd_Array2OfReal& AMatrix, const Graphic3d_TypeOfComposition AType) {
1581 if (IsDeleted ()) return;
1583 Standard_Integer lr, ur, lc, uc;
1584 Standard_Real valuetrsf;
1585 Standard_Real valueoldtrsf;
1586 Standard_Real valuenewtrsf;
1587 Standard_Integer i, j, k;
1588 TColStd_Array2OfReal TheTrsf (0, 3, 0, 3);
1589 TColStd_Array2OfReal NewTrsf (0, 3, 0, 3);
1590 TColStd_Array2OfReal AMatrix44 (0, 3, 0, 3);
1592 // Assign the new transformation in an array [0..3][0..3]
1593 // Avoid problemes if the user has defined matrice [1..4][1..4]
1594 // or [3..6][-1..2] !!
1595 lr = AMatrix.LowerRow ();
1596 ur = AMatrix.UpperRow ();
1597 lc = AMatrix.LowerCol ();
1598 uc = AMatrix.UpperCol ();
1600 if ( (ur - lr + 1 != 4) || (uc - lc + 1 != 4) )
1601 Graphic3d_TransformError::Raise
1602 ("Transform : not a 4x4 matrix");
1604 if (AType == Graphic3d_TOC_REPLACE) {
1605 MyCStructure.Composition = 0;
1606 // Update of CStructure
1607 for (i=0; i<=3; i++)
1608 for (j=0; j<=3; j++) {
1609 MyCStructure.Transformation[i][j] =
1610 float (AMatrix (lr + i, lc + j));
1611 NewTrsf (i, j) = AMatrix (lr + i, lc + j);
1615 if (AType == Graphic3d_TOC_POSTCONCATENATE) {
1616 MyCStructure.Composition = 1;
1617 // To simplify management of indices
1618 for (i=0; i<=3; i++)
1619 for (j=0; j<=3; j++)
1620 AMatrix44 (i, j) = AMatrix (lr + i, lc + j);
1621 // Calculation of the product of matrices
1622 for (i=0; i<=3; i++)
1623 for (j=0; j<=3; j++) {
1624 NewTrsf (i, j) = 0.0;
1625 for (k=0; k<=3; k++) {
1626 valueoldtrsf = MyCStructure.Transformation[i][k];
1627 valuetrsf = AMatrix44 (k, j);
1628 valuenewtrsf = NewTrsf (i, j) +
1629 valueoldtrsf * valuetrsf;
1630 NewTrsf (i, j) = valuenewtrsf;
1633 // Update of CStructure
1634 for (i=0; i<=3; i++)
1635 for (j=0; j<=3; j++)
1636 MyCStructure.Transformation[i][j] = float (NewTrsf (i, j));
1639 // If transformation, no validation of hidden already calculated parts.
1643 GraphicTransform (NewTrsf);
1644 MyStructureManager->SetTransform (this, NewTrsf);
1650 void Graphic3d_Structure::Transform (TColStd_Array2OfReal& AMatrix) const {
1652 Standard_Integer lr = AMatrix.LowerRow ();
1653 Standard_Integer ur = AMatrix.UpperRow ();
1654 Standard_Integer lc = AMatrix.LowerCol ();
1655 Standard_Integer uc = AMatrix.UpperCol ();
1657 if ( (ur - lr + 1 != 4) || (uc - lc + 1 != 4) )
1658 Graphic3d_TransformError::Raise
1659 ("Transform : not a 4x4 matrix");
1661 for (Standard_Integer i=0; i<=3; i++)
1662 for (Standard_Integer j=0; j<=3; j++)
1663 AMatrix (lr + i, lc + j) = MyCStructure.Transformation[i][j];
1667 void Graphic3d_Structure::MinMaxValues (Standard_Real& XMin, Standard_Real& YMin, Standard_Real& ZMin, Standard_Real& XMax, Standard_Real& YMax, Standard_Real& ZMax) const {
1669 Standard_Real RL = RealLast ();
1670 Standard_Real RF = RealFirst ();
1672 Standard_Real XTMin, YTMin, ZTMin, XTMax, YTMax, ZTMax, U, V, W;
1674 MinMaxCoord (XTMin, YTMin, ZTMin, XTMax, YTMax, ZTMax);
1675 if ((XTMin == RF) && (YTMin == RF) &&
1676 (ZTMin == RF) && (XTMax == RL) &&
1677 (YTMax == RL) && (ZTMax == RL)) {
1678 // Case impossible as it would mean that
1679 // the structure is empty
1689 Standard_Integer i, j;
1690 TColStd_Array2OfReal TheTrsf (0, 3, 0, 3);
1692 for (i=0; i<=3; i++)
1693 for (j=0; j<=3; j++)
1694 TheTrsf (i, j) = MyCStructure.Transformation[i][j];
1696 Graphic3d_Structure::Transforms
1697 (TheTrsf, XTMin, YTMin, ZTMin, XMin, YMin, ZMin);
1698 Graphic3d_Structure::Transforms
1699 (TheTrsf, XTMax, YTMax, ZTMax, XMax, YMax, ZMax);
1700 Graphic3d_Structure::Transforms
1701 (TheTrsf, XTMin, YTMin, ZTMax, U, V, W);
1702 XMin = Min(U,XMin) ; XMax = Max(U,XMax) ;
1703 YMin = Min(V,YMin) ; YMax = Max(V,YMax) ;
1704 ZMin = Min(W,ZMin) ; ZMax = Max(W,ZMax) ;
1705 Graphic3d_Structure::Transforms
1706 (TheTrsf, XTMax, YTMin, ZTMax, U, V, W);
1707 XMin = Min(U,XMin) ; XMax = Max(U,XMax) ;
1708 YMin = Min(V,YMin) ; YMax = Max(V,YMax) ;
1709 ZMin = Min(W,ZMin) ; ZMax = Max(W,ZMax) ;
1710 Graphic3d_Structure::Transforms
1711 (TheTrsf, XTMax, YTMin, ZTMin, U, V, W);
1712 XMin = Min(U,XMin) ; XMax = Max(U,XMax) ;
1713 YMin = Min(V,YMin) ; YMax = Max(V,YMax) ;
1714 ZMin = Min(W,ZMin) ; ZMax = Max(W,ZMax) ;
1715 Graphic3d_Structure::Transforms
1716 (TheTrsf, XTMax, YTMax, ZTMin, U, V, W);
1717 XMin = Min(U,XMin) ; XMax = Max(U,XMax) ;
1718 YMin = Min(V,YMin) ; YMax = Max(V,YMax) ;
1719 ZMin = Min(W,ZMin) ; ZMax = Max(W,ZMax) ;
1720 Graphic3d_Structure::Transforms
1721 (TheTrsf, XTMin, YTMax, ZTMax, U, V, W);
1722 XMin = Min(U,XMin) ; XMax = Max(U,XMax) ;
1723 YMin = Min(V,YMin) ; YMax = Max(V,YMax) ;
1724 ZMin = Min(W,ZMin) ; ZMax = Max(W,ZMax) ;
1725 Graphic3d_Structure::Transforms
1726 (TheTrsf, XTMin, YTMax, ZTMin, U, V, W);
1727 XMin = Min(U,XMin) ; XMax = Max(U,XMax) ;
1728 YMin = Min(V,YMin) ; YMax = Max(V,YMax) ;
1729 ZMin = Min(W,ZMin) ; ZMax = Max(W,ZMax) ;
1733 Standard_Integer Graphic3d_Structure::Identification () const {
1735 Standard_Integer Result = MyCStructure.Id;
1741 void Graphic3d_Structure::SetTransformPersistence( const Graphic3d_TransModeFlags& AFlag )
1743 SetTransformPersistence( AFlag, gp_Pnt( 0, 0, 0 ) );
1746 void Graphic3d_Structure::SetTransformPersistence( const Graphic3d_TransModeFlags& AFlag,
1747 const gp_Pnt& APoint )
1749 if (IsDeleted ()) return;
1751 MyCStructure.TransformPersistence.Flag = AFlag;
1752 MyCStructure.TransformPersistence.Point.x = float (APoint.X());
1753 MyCStructure.TransformPersistence.Point.y = float (APoint.Y());
1754 MyCStructure.TransformPersistence.Point.z = float (APoint.Z());
1755 //MyStructureManager->Update ();
1757 MyGraphicDriver->ContextStructure( MyCStructure );
1759 MyCStructure.TransformPersistence.IsSet = 1;
1762 Graphic3d_TransModeFlags Graphic3d_Structure::TransformPersistenceMode() const
1764 return MyCStructure.TransformPersistence.Flag;
1767 gp_Pnt Graphic3d_Structure::TransformPersistencePoint() const
1769 gp_Pnt aPnt( 0., 0., 0. );
1770 aPnt.SetX( MyCStructure.TransformPersistence.Point.x );
1771 aPnt.SetY( MyCStructure.TransformPersistence.Point.y );
1772 aPnt.SetZ( MyCStructure.TransformPersistence.Point.z );
1777 void Graphic3d_Structure::Add (const Handle(Graphic3d_Group)& AGroup) {
1779 // Method called only by the constructor of Graphic3d_Group
1780 // It is easy to check presence of <AGroup>
1781 // in sequence MyGroups.
1782 MyGroups.Append (AGroup);
1786 void Graphic3d_Structure::Remove (const Standard_Address APtr, const Graphic3d_TypeOfConnection AType) {
1788 Standard_Integer i, index, length;
1792 case Graphic3d_TOC_DESCENDANT :
1794 length = MyDescendants.Length ();
1795 for (i=1; i<=length && index==0; i++)
1796 if ((void *) (MyDescendants.Value (i)) == APtr)
1799 MyDescendants.Remove (index);
1802 cout << "Error, Graphic3d_Structure::Remove\n";
1806 case Graphic3d_TOC_ANCESTOR :
1808 length = MyAncestors.Length ();
1809 for (i=1; i<=length && index==0; i++)
1810 if ((void *) (MyAncestors.Value (i)) == APtr)
1813 MyAncestors.Remove (index);
1816 cout << "Error, Graphic3d_Structure::Remove\n";
1823 void Graphic3d_Structure::Remove (const Handle(Graphic3d_Group)& AGroup) {
1825 const Standard_Integer Length = MyGroups.Length ();
1827 for (Standard_Integer i=1; i<=Length; i++)
1828 if (MyGroups.Value (i) == AGroup)
1830 MyGroups.Remove (i);
1835 Handle(Graphic3d_StructureManager) Graphic3d_Structure::StructureManager () const {
1839 (Handle(Graphic3d_StructureManager)::DownCast(Handle(Standard_Transient)
1840 ((Standard_Transient*) MyPtrStructureManager)));
1842 return MyStructureManager;
1848 void Graphic3d_Structure::MinMaxCoord (Standard_Real& XMin, Standard_Real& YMin, Standard_Real& ZMin, Standard_Real& XMax, Standard_Real& YMax, Standard_Real& ZMax) const {
1850 Standard_Real RL = RealLast ();
1851 Standard_Real RF = RealFirst ();
1853 Standard_Real Xm, Ym, Zm, XM, YM, ZM;
1855 //Bounding borders of infinite line has been calculated as own point
1856 //in center of this line
1857 if (IsEmpty () || IsInfinite ()) {
1859 for (int i=1; i<=MyGroups.Length (); i++)
1860 if (! (MyGroups.Value (i))->IsEmpty () ) {
1861 (MyGroups.Value (i))->MinMaxValues(Xm, Ym, Zm, XM, YM, ZM);
1862 Graphic3d_Vertex vertex1(Xm, Ym, Zm);
1863 Graphic3d_Vertex vertex2(XM, YM, ZM);
1864 const Standard_Real distance = vertex1.Distance( vertex2 );
1865 if( distance >= 500000.0){
1866 XMin = XMax = 0.5*(Xm+ XM);
1867 YMin = YMax = 0.5*(Ym+ YM);
1868 ZMin = ZMax = 0.5*(Zm+ ZM);
1889 Standard_Integer i, Length;
1891 Length = MyGroups.Length ();
1892 for (i=1; i<=Length; i++)
1893 if (! (MyGroups.Value (i))->IsEmpty () ) {
1894 (MyGroups.Value (i))->MinMaxValues(Xm, Ym, Zm, XM, YM, ZM);
1895 if (Xm < XMin) XMin = Xm;
1896 if (Ym < YMin) YMin = Ym;
1897 if (Zm < ZMin) ZMin = Zm;
1898 if (XM > XMax) XMax = XM;
1899 if (YM > YMax) YMax = YM;
1900 if (ZM > ZMax) ZMax = ZM;
1903 Length = MyDescendants.Length ();
1904 for (i=1; i<=Length; i++)
1905 if (! ((Graphic3d_Structure *)
1906 (MyDescendants.Value (i)))->IsEmpty () ) {
1907 ((Graphic3d_Structure *)
1908 (MyDescendants.Value (i)))->MinMaxValues (Xm, Ym, Zm, XM, YM, ZM);
1910 if (Xm < XMin) XMin = Xm;
1911 if (Ym < YMin) YMin = Ym;
1912 if (Zm < ZMin) ZMin = Zm;
1913 if (XM > XMax) XMax = XM;
1914 if (YM > YMax) YMax = YM;
1915 if (ZM > ZMax) ZMax = ZM;
1918 if ((XMin == RL) && (YMin == RL) &&
1919 (ZMin == RL) && (XMax == RF) &&
1920 (YMax == RF) && (ZMax == RF)) {
1921 // Case impossible as it would mean
1922 // that the structure is empty
1936 void Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& ATrsf, const Standard_Real X, const Standard_Real Y, const Standard_Real Z, Standard_Real& NewX, Standard_Real& NewY, Standard_Real& NewZ) {
1938 Standard_Real A, B, C, D;
1940 Standard_Real RL = RealLast ();
1941 Standard_Real RF = RealFirst ();
1943 if ((X == RF) || (Y == RF) || (Z == RF) ||
1944 (X == RL) || (Y == RL) || (Z == RL)) {
1954 NewX = A * X + B * Y + C * Z + D;
1959 NewY = A * X + B * Y + C * Z + D;
1964 NewZ = A * X + B * Y + C * Z + D;
1969 Graphic3d_Vector Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& ATrsf, const Graphic3d_Vector& Coord) {
1971 Standard_Real NewX, NewY, NewZ;
1972 Graphic3d_Vector Result;
1974 Graphic3d_Structure::Transforms
1975 (ATrsf, Coord.X (), Coord.Y (), Coord.Z (), NewX, NewY, NewZ);
1976 Result.SetCoord (NewX, NewY, NewZ);
1982 Graphic3d_Vertex Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& ATrsf, const Graphic3d_Vertex& Coord) {
1984 Standard_Real NewX, NewY, NewZ;
1985 Graphic3d_Vertex Result;
1987 Graphic3d_Structure::Transforms
1988 (ATrsf, Coord.X (), Coord.Y (), Coord.Z (), NewX, NewY, NewZ);
1989 Result.SetCoord (NewX, NewY, NewZ);
1995 void Graphic3d_Structure::Network (const Handle(Graphic3d_Structure)& AStructure, const Graphic3d_TypeOfConnection AType, Graphic3d_MapOfStructure& ASet) {
1998 Graphic3d_MapOfStructure h1;
1999 Graphic3d_MapOfStructure h2;
2000 AStructure->Descendants (h1);
2001 AStructure->Ancestors (h2);
2003 Graphic3d_MapIteratorOfMapOfStructure IteratorD (h1);
2004 Graphic3d_MapIteratorOfMapOfStructure IteratorA (h2);
2006 ASet.Add (AStructure);
2012 case Graphic3d_TOC_DESCENDANT :
2013 while (IteratorD.More ()) {
2014 Graphic3d_Structure::Network
2015 (IteratorD.Key (), AType, ASet);
2016 // IteratorD.Next () is located on the next structure
2021 case Graphic3d_TOC_ANCESTOR :
2022 while (IteratorA.More ()) {
2023 Graphic3d_Structure::Network
2024 (IteratorA.Key (), AType, ASet);
2025 // IteratorA.Next () is located on the next structure
2033 void Graphic3d_Structure::PrintNetwork (const Handle(Graphic3d_Structure)& AStructure, const Graphic3d_TypeOfConnection AType)
2036 Graphic3d_MapOfStructure ASet;
2038 Graphic3d_MapIteratorOfMapOfStructure IteratorASet (ASet);
2040 Graphic3d_Structure::Network (AStructure, AType, ASet);
2042 while (IteratorASet.More ()) {
2044 << (IteratorASet.Key ())->Identification () << "\n";
2045 IteratorASet.Next ();
2051 void Graphic3d_Structure::Update () const
2054 if (IsDeleted ()) return;
2056 if (MyStructureManager->UpdateMode () == Aspect_TOU_ASAP)
2057 MyStructureManager->Update ();
2061 void Graphic3d_Structure::UpdateStructure (const Handle(Graphic3d_AspectLine3d)& CTXL, const Handle(Graphic3d_AspectText3d)& CTXT, const Handle(Graphic3d_AspectMarker3d)& CTXM, const Handle(Graphic3d_AspectFillArea3d)& CTXF)
2064 Standard_Real R, G, B;
2065 Standard_Real Rs, Gs, Bs;
2066 Standard_CString AFont;
2067 Standard_Real ASpace;
2068 Standard_Real AnExpansion;
2069 Standard_Real AWidth;
2070 Standard_Real AScale;
2071 Quantity_Color AColor;
2072 Quantity_Color AnIntColor;
2073 Quantity_Color BackIntColor;
2074 Quantity_Color AnEdgeColor;
2075 Aspect_TypeOfLine ALType;
2076 Aspect_TypeOfMarker AMType;
2077 Aspect_InteriorStyle AStyle;
2078 Aspect_TypeOfStyleText AStyleT;
2079 Aspect_TypeOfDisplayText ADisplayType;
2080 Quantity_Color AColorSubTitle;
2081 Standard_Boolean ATextZoomable;
2082 Standard_Real ATextAngle;
2083 Font_FontAspect ATextFontAspect;
2086 CTXL->Values (AColor, ALType, AWidth);
2087 AColor.Values (R, G, B, Quantity_TOC_RGB);
2089 MyCStructure.ContextLine.Color.r = float (R);
2090 MyCStructure.ContextLine.Color.g = float (G);
2091 MyCStructure.ContextLine.Color.b = float (B);
2092 MyCStructure.ContextLine.LineType = int (ALType);
2093 MyCStructure.ContextLine.Width = float (AWidth);
2095 CTXM->Values (AColor, AMType, AScale);
2096 AColor.Values (R, G, B, Quantity_TOC_RGB);
2098 MyCStructure.ContextMarker.Color.r = float (R);
2099 MyCStructure.ContextMarker.Color.g = float (G);
2100 MyCStructure.ContextMarker.Color.b = float (B);
2101 MyCStructure.ContextMarker.MarkerType = int (AMType);
2102 MyCStructure.ContextMarker.Scale = float (AScale);
2104 CTXT->Values (AColor, AFont, AnExpansion, ASpace,AStyleT,ADisplayType,AColorSubTitle,ATextZoomable,ATextAngle,ATextFontAspect);
2105 AColor.Values (R, G, B, Quantity_TOC_RGB);
2106 AColorSubTitle.Values (Rs, Gs, Bs, Quantity_TOC_RGB);
2108 MyCStructure.ContextText.Color.r = float (R);
2109 MyCStructure.ContextText.Color.g = float (G);
2110 MyCStructure.ContextText.Color.b = float (B);
2111 MyCStructure.ContextText.Font = (char*) (AFont);
2112 MyCStructure.ContextText.Expan = float (AnExpansion);
2113 MyCStructure.ContextText.Style = int (AStyleT);
2114 MyCStructure.ContextText.DisplayType = int (ADisplayType);
2115 MyCStructure.ContextText.Space = float (ASpace);
2116 MyCStructure.ContextText.ColorSubTitle.r = float (Rs);
2117 MyCStructure.ContextText.ColorSubTitle.g = float (Gs);
2118 MyCStructure.ContextText.ColorSubTitle.b = float (Bs);
2119 MyCStructure.ContextText.TextZoomable = ATextZoomable;
2120 MyCStructure.ContextText.TextAngle = float (ATextAngle);
2121 MyCStructure.ContextText.TextFontAspect = int (ATextFontAspect);
2125 CTXF->Values (AStyle, AnIntColor, BackIntColor, AnEdgeColor, ALType, AWidth);
2126 AnIntColor.Values (R, G, B, Quantity_TOC_RGB);
2128 MyCStructure.ContextFillArea.Style = int (AStyle);
2129 MyCStructure.ContextFillArea.IntColor.r = float (R);
2130 MyCStructure.ContextFillArea.IntColor.g = float (G);
2131 MyCStructure.ContextFillArea.IntColor.b = float (B);
2133 if ( CTXF->Distinguish() )
2134 BackIntColor.Values( R, G, B, Quantity_TOC_RGB );
2136 MyCStructure.ContextFillArea.BackIntColor.r = float( R );
2137 MyCStructure.ContextFillArea.BackIntColor.g = float( G );
2138 MyCStructure.ContextFillArea.BackIntColor.b = float( B );
2141 MyCStructure.ContextFillArea.Edge = CTXF->Edge () ? 1:0;
2142 AnEdgeColor.Values (R, G, B, Quantity_TOC_RGB);
2143 MyCStructure.ContextFillArea.EdgeColor.r = float (R);
2144 MyCStructure.ContextFillArea.EdgeColor.g = float (G);
2145 MyCStructure.ContextFillArea.EdgeColor.b = float (B);
2146 MyCStructure.ContextFillArea.LineType = int (ALType);
2147 MyCStructure.ContextFillArea.Width = float (AWidth);
2148 MyCStructure.ContextFillArea.Hatch = int (CTXF->HatchStyle ());
2150 Quantity_Ratio ratio;
2151 MyCStructure.ContextFillArea.DegenerationMode =
2152 int (CTXF->DegenerateModel(ratio));
2153 MyCStructure.ContextFillArea.SkipRatio = float (ratio);
2157 /*** Front and Back face ***/
2158 MyCStructure.ContextFillArea.Distinguish = CTXF->Distinguish () ? 1:0;
2159 MyCStructure.ContextFillArea.BackFace = CTXF->BackFace () ? 1:0;
2160 /*** Back Material ***/
2161 // Light specificity
2162 MyCStructure.ContextFillArea.Back.Shininess =
2163 float ((CTXF->BackMaterial ()).Shininess ());
2164 MyCStructure.ContextFillArea.Back.Ambient =
2165 float ((CTXF->BackMaterial ()).Ambient ());
2166 MyCStructure.ContextFillArea.Back.Diffuse =
2167 float ((CTXF->BackMaterial ()).Diffuse ());
2168 MyCStructure.ContextFillArea.Back.Specular =
2169 float ((CTXF->BackMaterial ()).Specular ());
2170 MyCStructure.ContextFillArea.Back.Transparency =
2171 float ((CTXF->BackMaterial ()).Transparency ());
2172 MyCStructure.ContextFillArea.Back.Emission =
2173 float ((CTXF->BackMaterial ()).Emissive ());
2176 MyCStructure.ContextFillArea.Back.IsAmbient =
2177 ( (CTXF->BackMaterial ()).ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0 );
2178 MyCStructure.ContextFillArea.Back.IsDiffuse =
2179 ( (CTXF->BackMaterial ()).ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0 );
2180 MyCStructure.ContextFillArea.Back.IsSpecular =
2181 ( (CTXF->BackMaterial ()).ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0 );
2182 MyCStructure.ContextFillArea.Back.IsEmission =
2183 ( (CTXF->BackMaterial ()).ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0 );
2187 const Graphic3d_MaterialAspect ama = CTXF->BackMaterial () ;
2188 Standard_Boolean amt = ama.MaterialType(Graphic3d_MATERIAL_PHYSIC) ;
2189 MyCStructure.ContextFillArea.Back.IsPhysic = ( amt ? 1 : 0 );
2192 MyCStructure.ContextFillArea.Back.ColorSpec.r =
2193 float (((CTXF->BackMaterial ()).SpecularColor ()).Red ());
2194 MyCStructure.ContextFillArea.Back.ColorSpec.g =
2195 float (((CTXF->BackMaterial ()).SpecularColor ()).Green ());
2196 MyCStructure.ContextFillArea.Back.ColorSpec.b =
2197 float (((CTXF->BackMaterial ()).SpecularColor ()).Blue ());
2200 MyCStructure.ContextFillArea.Back.ColorAmb.r =
2201 float (((CTXF->BackMaterial ()).AmbientColor ()).Red ());
2202 MyCStructure.ContextFillArea.Back.ColorAmb.g =
2203 float (((CTXF->BackMaterial ()).AmbientColor ()).Green ());
2204 MyCStructure.ContextFillArea.Back.ColorAmb.b =
2205 float (((CTXF->BackMaterial ()).AmbientColor ()).Blue ());
2208 MyCStructure.ContextFillArea.Back.ColorDif.r =
2209 float (((CTXF->BackMaterial ()).DiffuseColor ()).Red ());
2210 MyCStructure.ContextFillArea.Back.ColorDif.g =
2211 float (((CTXF->BackMaterial ()).DiffuseColor ()).Green ());
2212 MyCStructure.ContextFillArea.Back.ColorDif.b =
2213 float (((CTXF->BackMaterial ()).DiffuseColor ()).Blue ());
2216 MyCStructure.ContextFillArea.Back.ColorEms.r =
2217 float (((CTXF->BackMaterial ()).EmissiveColor ()).Red ());
2218 MyCStructure.ContextFillArea.Back.ColorEms.g =
2219 float (((CTXF->BackMaterial ()).EmissiveColor ()).Green ());
2220 MyCStructure.ContextFillArea.Back.ColorEms.b =
2221 float (((CTXF->BackMaterial ()).EmissiveColor ()).Blue ());
2223 MyCStructure.ContextFillArea.Back.EnvReflexion =
2224 float ((CTXF->BackMaterial ()).EnvReflexion());
2226 /*** Front Material ***/
2227 // Light specificity
2228 MyCStructure.ContextFillArea.Front.Shininess =
2229 float ((CTXF->FrontMaterial ()).Shininess ());
2230 MyCStructure.ContextFillArea.Front.Ambient =
2231 float ((CTXF->FrontMaterial ()).Ambient ());
2232 MyCStructure.ContextFillArea.Front.Diffuse =
2233 float ((CTXF->FrontMaterial ()).Diffuse ());
2234 MyCStructure.ContextFillArea.Front.Specular =
2235 float ((CTXF->FrontMaterial ()).Specular ());
2236 MyCStructure.ContextFillArea.Front.Transparency =
2237 float ((CTXF->FrontMaterial ()).Transparency ());
2238 MyCStructure.ContextFillArea.Front.Emission =
2239 float ((CTXF->FrontMaterial ()).Emissive ());
2242 MyCStructure.ContextFillArea.Front.IsAmbient =
2243 ( (CTXF->FrontMaterial ()).ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0 );
2244 MyCStructure.ContextFillArea.Front.IsDiffuse =
2245 ( (CTXF->FrontMaterial ()).ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0 );
2246 MyCStructure.ContextFillArea.Front.IsSpecular =
2247 ( (CTXF->FrontMaterial ()).ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0 );
2248 MyCStructure.ContextFillArea.Front.IsEmission =
2249 ( (CTXF->FrontMaterial ()).ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0 );
2253 const Graphic3d_MaterialAspect amas = CTXF->FrontMaterial () ;
2254 Standard_Boolean amty = amas.MaterialType(Graphic3d_MATERIAL_PHYSIC) ;
2255 MyCStructure.ContextFillArea.Front.IsPhysic = ( amty ? 1 : 0 );
2258 MyCStructure.ContextFillArea.Front.ColorSpec.r =
2259 float (((CTXF->FrontMaterial ()).SpecularColor ()).Red ());
2260 MyCStructure.ContextFillArea.Front.ColorSpec.g =
2261 float (((CTXF->FrontMaterial ()).SpecularColor ()).Green ());
2262 MyCStructure.ContextFillArea.Front.ColorSpec.b =
2263 float (((CTXF->FrontMaterial ()).SpecularColor ()).Blue ());
2266 MyCStructure.ContextFillArea.Front.ColorAmb.r =
2267 float (((CTXF->FrontMaterial ()).AmbientColor ()).Red ());
2268 MyCStructure.ContextFillArea.Front.ColorAmb.g =
2269 float (((CTXF->FrontMaterial ()).AmbientColor ()).Green ());
2270 MyCStructure.ContextFillArea.Front.ColorAmb.b =
2271 float (((CTXF->FrontMaterial ()).AmbientColor ()).Blue ());
2274 MyCStructure.ContextFillArea.Front.ColorDif.r =
2275 float (((CTXF->FrontMaterial ()).DiffuseColor ()).Red ());
2276 MyCStructure.ContextFillArea.Front.ColorDif.g =
2277 float (((CTXF->FrontMaterial ()).DiffuseColor ()).Green ());
2278 MyCStructure.ContextFillArea.Front.ColorDif.b =
2279 float (((CTXF->FrontMaterial ()).DiffuseColor ()).Blue ());
2282 MyCStructure.ContextFillArea.Front.ColorEms.r =
2283 float (((CTXF->FrontMaterial ()).EmissiveColor ()).Red ());
2284 MyCStructure.ContextFillArea.Front.ColorEms.g =
2285 float (((CTXF->FrontMaterial ()).EmissiveColor ()).Green ());
2286 MyCStructure.ContextFillArea.Front.ColorEms.b =
2287 float (((CTXF->FrontMaterial ()).EmissiveColor ()).Blue ());
2289 MyCStructure.ContextFillArea.Front.EnvReflexion =
2290 float ((CTXF->FrontMaterial ()).EnvReflexion());
2292 MyCStructure.ContextFillArea.Texture.TextureMap = CTXF->TextureMap();
2293 MyCStructure.ContextFillArea.Texture.doTextureMap = CTXF->TextureMapState() ? 1 : 0;
2295 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
2296 Standard_Integer aPolyMode;
2297 Standard_ShortReal aPolyFactor, aPolyUnits;
2298 CTXF->PolygonOffsets(aPolyMode, aPolyFactor, aPolyUnits);
2299 MyCStructure.ContextFillArea.PolygonOffsetMode = aPolyMode;
2300 MyCStructure.ContextFillArea.PolygonOffsetFactor = (Standard_ShortReal)aPolyFactor;
2301 MyCStructure.ContextFillArea.PolygonOffsetUnits = (Standard_ShortReal)aPolyUnits;
2302 // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
2305 void Graphic3d_Structure::GraphicHighlight (const Aspect_TypeOfHighlightMethod AMethod) {
2307 Standard_Real XMin, YMin, ZMin, XMax, YMax, ZMax;
2308 Standard_Real R, G, B;
2310 MyCStructure.highlight = 1;
2311 MyHighlightMethod = AMethod;
2315 case Aspect_TOHM_COLOR :
2316 MyHighlightColor.Values (R, G, B, Quantity_TOC_RGB);
2317 MyGraphicDriver->HighlightColor
2318 (MyCStructure, float (R), float (G),
2319 float (B) , Standard_True);
2320 MyGraphicDriver->NameSetStructure (MyCStructure);
2322 case Aspect_TOHM_BLINK :
2323 MyGraphicDriver->Blink (MyCStructure, Standard_True);
2324 MyGraphicDriver->NameSetStructure (MyCStructure);
2326 case Aspect_TOHM_BOUNDBOX :
2327 if (IsEmpty () || IsInfinite ()) {
2328 // Empty or infinite structure
2329 XMin = YMin = ZMin = 0.;
2330 XMax = YMax = ZMax = 0.;
2334 (XMin, YMin, ZMin, XMax, YMax, ZMax);
2336 MyCStructure.BoundBox.Pmin.x = float (XMin);
2337 MyCStructure.BoundBox.Pmin.y = float (YMin);
2338 MyCStructure.BoundBox.Pmin.z = float (ZMin);
2339 MyCStructure.BoundBox.Pmax.x = float (XMax);
2340 MyCStructure.BoundBox.Pmax.y = float (YMax);
2341 MyCStructure.BoundBox.Pmax.z = float (ZMax);
2342 MyHighlightColor.Values (R, G, B, Quantity_TOC_RGB);
2343 MyCStructure.BoundBox.Color.r = float (R);
2344 MyCStructure.BoundBox.Color.g = float (G);
2345 MyCStructure.BoundBox.Color.b = float (B);
2346 MyGraphicDriver->BoundaryBox (MyCStructure, Standard_True);
2352 void Graphic3d_Structure::GraphicTransform (const TColStd_Array2OfReal& AMatrix) {
2354 Standard_Integer i, j;
2356 for (i=0; i<=3; i++)
2357 for (j=0; j<=3; j++)
2358 MyCStructure.Transformation[i][j] = float (AMatrix (i, j));
2360 MyGraphicDriver->TransformStructure (MyCStructure);
2364 void Graphic3d_Structure::GraphicUnHighlight () {
2366 MyCStructure.highlight = 0;
2368 switch (MyHighlightMethod)
2370 case Aspect_TOHM_COLOR :
2371 MyGraphicDriver->HighlightColor
2372 (MyCStructure, 0.0, 0.0, 0.0 , Standard_False);
2373 MyGraphicDriver->NameSetStructure (MyCStructure);
2375 case Aspect_TOHM_BLINK :
2376 MyGraphicDriver->Blink (MyCStructure, Standard_False);
2377 MyGraphicDriver->NameSetStructure (MyCStructure);
2379 case Aspect_TOHM_BOUNDBOX :
2380 MyGraphicDriver->BoundaryBox
2381 (MyCStructure, Standard_False);
2382 MyGraphicDriver->NameSetStructure (MyCStructure);
2388 Graphic3d_TypeOfStructure Graphic3d_Structure::ComputeVisual () const {
2390 return (MyComputeVisual);
2394 void Graphic3d_Structure::SetComputeVisual (const Graphic3d_TypeOfStructure AVisual) {
2396 // The ComputeVisual is saved only if the structure is
2397 // declared TOS_ALL, TOS_WIREFRAME or TOS_SHADING.
2398 // This declaration permits to calculate
2399 // proper representation of the structure calculated by Compute
2400 // instead of passage to TOS_COMPUTED.
2401 if (AVisual != Graphic3d_TOS_COMPUTED)
2402 MyComputeVisual = AVisual;
2406 void Graphic3d_Structure::Plot (const Handle(Graphic3d_Plotter)& ) {
2410 void Graphic3d_Structure::SetManager (const Handle(Graphic3d_StructureManager)& AManager, const Standard_Boolean WithPropagation) {
2412 // All connected structures should follow ?
2414 if (WithPropagation) {
2415 Standard_Integer i, Length;
2416 Length = MyDescendants.Length ();
2417 for (i=1; i<=Length; i++)
2418 ((Graphic3d_Structure *)
2419 (MyDescendants.Value (i)))->SetStructureManager (AManager);
2421 Length = MyAncestors.Length ();
2422 for (i=1; i<=Length; i++)
2423 ((Graphic3d_Structure *)
2424 (MyAncestors.Value (i)))->SetStructureManager (AManager);
2428 // change of identification ?
2429 // MyStructureManager->Remove (Standard_Integer (MyCStructure.Id));
2430 // AManager->NewIdentification ();
2431 // MyCStructure.Id = int (AManager->NewIdentification ());
2433 Aspect_TypeOfUpdate UpdateMode = MyStructureManager->UpdateMode ();
2434 Aspect_TypeOfUpdate NewUpdateMode = AManager->UpdateMode ();
2435 MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
2436 AManager->SetUpdateMode (Aspect_TOU_WAIT);
2438 if (MyCStructure.stick) {
2439 MyStructureManager->Erase (this);
2440 AManager->Display (this);
2443 if (MyCStructure.highlight) {
2446 if (MyCStructure.visible) {
2447 MyStructureManager->Invisible (this);
2448 AManager->Visible (this);
2451 if (MyCStructure.pick) {
2452 MyStructureManager->Undetectable (this);
2453 AManager->Detectable (this);
2456 MyStructureManager->SetUpdateMode (UpdateMode);
2457 AManager->SetUpdateMode (NewUpdateMode);
2460 MyPtrStructureManager = (void *) AManager.operator->();
2464 void Graphic3d_Structure::SetHLRValidation (const Standard_Boolean AFlag) {
2466 MyCStructure.HLRValidation = AFlag ? 1:0;
2470 Standard_Boolean Graphic3d_Structure::HLRValidation () const {
2472 // Hidden parts stored in <me> are valid if :
2473 // 1/ the owner is defined.
2474 // 2/ they are not invalid.
2476 Standard_Boolean Result = MyOwner != NULL && MyCStructure.HLRValidation != 0;
2482 //=======================================================================
2483 //function : CStructure
2485 //=======================================================================
2487 Graphic3d_CStructure* Graphic3d_Structure::CStructure()
2489 return &MyCStructure;
2492 //=======================================================================
2493 //function : SetZLayer
2495 //=======================================================================
2497 void Graphic3d_Structure::SetZLayer (const Standard_Integer theLayerId)
2499 // if the structure is not displayed, unable to change its display layer
2503 MyStructureManager->ChangeZLayer (this, theLayerId);
2506 //=======================================================================
2507 //function : GetZLayer
2509 //=======================================================================
2511 Standard_Integer Graphic3d_Structure::GetZLayer () const
2513 return MyStructureManager->GetZLayer (this);