// Created on: 1995-10-09 // Created by: Arnaud BOUZY/Odile Olivier // Copyright (c) 1995-1999 Matra Datavision // Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define POINT_SELECTION_MODE #define PATCH_TO_OCCT_710 IMPLEMENT_STANDARD_RTTIEXT(AIS_Trihedron, AIS_InteractiveObject) static Standard_Boolean IsInList(const TColStd_ListOfInteger& LL, const Standard_Integer aMode) { TColStd_ListIteratorOfListOfInteger It(LL); for (;It.More(); It.Next()){ if (It.Value() == aMode) return Standard_True; } return Standard_False; } //======================================================================= //function : AIS_Trihedron //purpose : //======================================================================= AIS_Trihedron::AIS_Trihedron(const Handle(Geom_Axis2Placement)& theComponent) : myHasOwnSize(Standard_False), myHasOwnTextColor(Standard_False), myHasOwnArrowColor(Standard_False), myComponent(theComponent), myDisplayMode(Prs3d_DM_WireFrame) { // default presentation parameters SetDisplayMode (0); SetHilightMode (0); // datum creation Handle (Prs3d_DatumAspect) aDatumAspect = new Prs3d_DatumAspect(); myDrawer->SetDatumAspect(aDatumAspect); // entities to provide custom selection Quantity_Color aHighlightColor = Quantity_NOC_GRAY80; myHighlightAspect = new Prs3d_ShadingAspect(); myHighlightAspect->Aspect()->SetInteriorStyle (Aspect_IS_SOLID); myHighlightAspect->SetColor(aHighlightColor); Graphic3d_MaterialAspect aHighlightMaterial; aHighlightMaterial.SetColor (aHighlightColor); myHighlightAspect->SetMaterial (aHighlightMaterial); Handle(Prs3d_LineAspect) aLineAspect = aDatumAspect->LineAspect(Prs3d_DP_XAxis); myHighlightLineAspect = new Prs3d_LineAspect(aHighlightColor, aLineAspect->Aspect()->Type(), aLineAspect->Aspect()->Width()); myHighlightPointAspect = new Prs3d_PointAspect(Aspect_TOM_PLUS, aHighlightColor, 1.0); // selection priorities mySelectionPriority.Bind(Prs3d_DP_None, 5); // complete triedron: priority 5 (same as faces) mySelectionPriority.Bind(Prs3d_DP_Origin, 8); // origin: priority 8 for (int i = Prs3d_DP_XAxis; i <= Prs3d_DP_ZAxis; i++) mySelectionPriority.Bind((Prs3d_DatumParts)i, 7); // axes: priority: 7 for (int i = Prs3d_DP_XOYAxis; i <= Prs3d_DP_XOZAxis; i++) mySelectionPriority.Bind((Prs3d_DatumParts)i, 5); // planes: priority: 5 // trihedron labels myLabel.Bind(Prs3d_DP_XAxis, "X"); myLabel.Bind(Prs3d_DP_YAxis, "Y"); myLabel.Bind(Prs3d_DP_ZAxis, "Z"); Aspect_TypeOfMarker aPointMarker = Aspect_TOM_POINT; myPointAspect = new Prs3d_PointAspect(aPointMarker, aHighlightColor, 0.1); } //======================================================================= //function : SetComponent //purpose : //======================================================================= void AIS_Trihedron::SetComponent(const Handle(Geom_Axis2Placement)& theComponent) { myComponent = theComponent; LoadRecomputable (AIS_WireFrame); } //======================================================================= //function : SetSize //purpose : //======================================================================= void AIS_Trihedron::SetSize(const Standard_Real aValue) { myHasOwnSize = Standard_True; myDrawer->DatumAspect()->SetAxisLength(aValue, aValue, aValue); Update(); UpdateSelection(); } //======================================================================= //function : UnsetSize //purpose : if the object has 1 color, the default size of the // drawer is reproduced, otherwise DatumAspect becomes null //======================================================================= void AIS_Trihedron::UnsetSize() { if(!myHasOwnSize) return; myHasOwnSize = Standard_False; if(hasOwnColor){ const Handle(Prs3d_DatumAspect) DA = myDrawer->HasLink() ? myDrawer->Link()->DatumAspect() : new Prs3d_DatumAspect(); myDrawer->DatumAspect()->SetAxisLength(DA->AxisLength(Prs3d_DP_XAxis), DA->AxisLength(Prs3d_DP_YAxis), DA->AxisLength(Prs3d_DP_ZAxis)); } else Update(); UpdateSelection(); } //======================================================================= //function : Size //purpose : //======================================================================= Standard_Real AIS_Trihedron::Size() const { return myDrawer->DatumAspect()->AxisLength(Prs3d_DP_XAxis); } //======================================================================= //function : Compute //purpose : //======================================================================= void AIS_Trihedron::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, const Handle(Prs3d_Presentation)& thePrs, const Standard_Integer /*theMode*/) { thePrs->SetInfiniteState (Standard_True); gp_Ax2 anAxis(myComponent->Ax2()); myDrawer->DatumAspect()->UpdatePrimitives(myDisplayMode, anAxis.Location(), anAxis.XDirection(), anAxis.YDirection(), anAxis.Direction()); ComputePresentation (thePrsMgr, thePrs); } //======================================================================= //function : Compute //purpose : //======================================================================= void AIS_Trihedron::Compute (const Handle(Prs3d_Projector)& theProjector, const Handle(Geom_Transformation)& theTrsf, const Handle(Prs3d_Presentation)& thePrs) { PrsMgr_PresentableObject::Compute (theProjector, theTrsf, thePrs); } //======================================================================= //function : ComputeSelection //purpose : //======================================================================= void AIS_Trihedron::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer theMode) { theSelection->Clear(); Handle(Prs3d_DatumAspect) anAspect = Attributes()->DatumAspect(); switch (theMode) { case 0: // complete triedron: only 1 owner { Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner (this, mySelectionPriority.Find(Prs3d_DP_None)); bool isShadingMode = DatumDisplayMode() == Prs3d_DM_Shaded; for (int i = isShadingMode ? Prs3d_DP_Origin : Prs3d_DP_XAxis; i <= Prs3d_DP_ZAxis; i++) { Prs3d_DatumParts aPart = (Prs3d_DatumParts)i; if (!anAspect->DrawDatumPart(aPart)) continue; theSelection->Add (CreateSensitiveEntity(aPart, anOwner)); } } break; case 1: // origin { Prs3d_DatumParts aPart = Prs3d_DP_Origin; if (anAspect->DrawDatumPart(aPart)) { Handle(SelectMgr_EntityOwner) anOwner = new AIS_TrihedronOwner (this, aPart, mySelectionPriority.Find(aPart)); Handle(Graphic3d_ArrayOfPrimitives) aPrimitives = anAspect->ArrayOfPrimitives(aPart); theSelection->Add (CreateSensitiveEntity(aPart, anOwner)); } } break; case 2: // axes { for (int i = Prs3d_DP_XAxis; i <= Prs3d_DP_ZAxis; i++) { Prs3d_DatumParts aPart = (Prs3d_DatumParts)i; if (!anAspect->DrawDatumPart(aPart)) continue; Handle(SelectMgr_EntityOwner) anOwner = new AIS_TrihedronOwner (this, aPart, mySelectionPriority.Find(aPart)); theSelection->Add (CreateSensitiveEntity(aPart, anOwner)); } } break; case 3: // main planes { /// Creates Trihedron owner for each trihedron plane { #ifndef PATCH_TO_OCCT_710 for (int i = Prs3d_DP_XOYAxis; i <= Prs3d_DP_XOZAxis; i++) { Prs3d_DatumParts aPart = (Prs3d_DatumParts)i; if (!anAspect->DrawDatumPart(aPart)) continue; Handle(SelectMgr_EntityOwner) anOwner = new AIS_TrihedronOwner (this, aPart, mySelectionPriority.Find(aPart)); theSelection->Add (CreateSensitiveEntity(aPart, anOwner)); } #endif } } break; default: break; } } //======================================================================= //function : IsAutoHilight //purpose : //======================================================================= Standard_Boolean AIS_Trihedron::IsAutoHilight() const { // highlight is processed in the current presentation return false; } //======================================================================= //function : HilightOwnerWithColor //purpose : //======================================================================= void AIS_Trihedron::HilightOwnerWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, const Handle(Graphic3d_HighlightStyle)& theStyle, const Handle(SelectMgr_EntityOwner)& theOwner) { Handle(AIS_TrihedronOwner) anOwner = Handle(AIS_TrihedronOwner)::DownCast (theOwner); if (anOwner.IsNull()) { /// default 0 selectin mode Standard_Integer aHiMode = HasHilightMode() ? HilightMode() : 0; thePM->Color (this, theStyle, aHiMode, NULL, Graphic3d_ZLayerId_Top); } else { Handle(Prs3d_Presentation) aPresentation = GetHilightPresentation(thePM); if (!aPresentation.IsNull()) { aPresentation->Clear(); const Prs3d_DatumParts& aPart = anOwner->DatumPart(); Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (aPresentation); Handle(Prs3d_DatumAspect) anAspect = Attributes()->DatumAspect(); if (aPart >= Prs3d_DP_XOYAxis && aPart <= Prs3d_DP_XOZAxis) { // planes selection is equal in both shading and wireframe mode aGroup->SetGroupPrimitivesAspect (myHighlightLineAspect->Aspect()); } else { if (DatumDisplayMode() == Prs3d_DM_Shaded) aGroup->SetGroupPrimitivesAspect (anAspect->ShadingAspect(aPart)->Aspect()); else { if (aPart == Prs3d_DP_Origin) aGroup->SetGroupPrimitivesAspect (myHighlightPointAspect->Aspect()); else aGroup->SetGroupPrimitivesAspect (anAspect->LineAspect(aPart)->Aspect()); } } aGroup->AddPrimitiveArray (anAspect->ArrayOfPrimitives(aPart)); aPresentation->Highlight (theStyle); thePM->AddToImmediateList (aPresentation); } } } //======================================================================== //function : HilightSelected //purpose : //======================================================================== void AIS_Trihedron::HilightSelected (const Handle(PrsMgr_PresentationManager3d)& thePM, const SelectMgr_SequenceOfOwner& theOwners) { if (theOwners.IsEmpty() || GetContext().IsNull()) { return; } Handle(Prs3d_DatumAspect) anAspect = Attributes()->DatumAspect(); bool isShadingMode = DatumDisplayMode() == Prs3d_DM_Shaded; SelectMgr_SequenceOfOwner::Iterator anIterator(theOwners); #ifndef PATCH_TO_OCCT_710 const Handle(Prs3d_Drawer)& aContextSelStyle = GetContext()->SelectionStyle(); const Quantity_Color& aSelectionColor = aContextSelStyle->Color(); #else const Quantity_Color& aSelectionColor = GetContext()->SelectionStyle()->Color(); #endif for (; anIterator.More(); anIterator.Next()) { const Handle(SelectMgr_EntityOwner)& anOwner = anIterator.Value(); if (!anOwner->IsKind (STANDARD_TYPE (AIS_TrihedronOwner))) { #ifdef PATCH_TO_OCCT_710 thePM->Color (this, GetContext()->SelectionStyle(), 0); #else thePM->Color (this, aContextSelStyle, 0); #endif } else { Handle(AIS_TrihedronOwner) aTrihedronOwner = Handle(AIS_TrihedronOwner)::DownCast (anOwner); const Prs3d_DatumParts& aPart = aTrihedronOwner->DatumPart(); if (mySelectedParts.Contains(aPart)) { // the owner has been already selected continue; } Handle(Graphic3d_Group) aGroup; if (!myPartToGroup.Find(aTrihedronOwner->DatumPart(), aGroup) ) { // graphical group for this owner was not created continue; } if (aPart >= Prs3d_DP_XOYAxis && aPart <= Prs3d_DP_XOZAxis) { Handle(Prs3d_LineAspect) aLineAspect = myHighlightLineAspect; aLineAspect->SetColor(aSelectionColor); aGroup->SetGroupPrimitivesAspect (aLineAspect->Aspect()); } else { if (isShadingMode) { Handle(Prs3d_ShadingAspect) aShadingAspect = myHighlightAspect; aShadingAspect->SetColor(aSelectionColor); aGroup->SetGroupPrimitivesAspect (aShadingAspect->Aspect()); } else { if (aPart == Prs3d_DP_Origin) { #ifndef POINT_SELECTION_MODE #ifdef PATCH_TO_OCCT_710 myPointAspect->SetColor(aSelectionColor); myPointAspect->SetTypeOfMarker(Aspect_TOM_PLUS); #else Handle(Prs3d_PointAspect) aPointAspect = myHighlightPointAspect; aPointAspect->SetColor(aSelectionColor); aGroup->SetGroupPrimitivesAspect (aPointAspect->Aspect()); #endif #else anAspect->PointAspect()->SetTypeOfMarker(Aspect_TOM_PLUS); #endif } else { Handle(Prs3d_LineAspect) aLineAspect = myHighlightLineAspect; aLineAspect->SetColor(aSelectionColor); aGroup->SetGroupPrimitivesAspect (aLineAspect->Aspect()); } } } mySelectedParts.Append(aPart); } } SynchronizeAspects(); } //======================================================================= //function : ClearSelected //purpose : //======================================================================= void AIS_Trihedron::ClearSelected() { NCollection_List::Iterator anIterator(mySelectedParts); Handle(Prs3d_DatumAspect) anAspect = Attributes()->DatumAspect(); bool isShadingMode = DatumDisplayMode() == Prs3d_DM_Shaded; for (; anIterator.More(); anIterator.Next()) { Prs3d_DatumParts aPart = anIterator.Value(); Handle(Graphic3d_Group) aGroup = myPartToGroup.Find(aPart); if (aPart >= Prs3d_DP_XOYAxis && aPart <= Prs3d_DP_XOZAxis) { aGroup->SetGroupPrimitivesAspect (anAspect->LineAspect(aPart)->Aspect()); } if (isShadingMode) aGroup->SetGroupPrimitivesAspect (anAspect->ShadingAspect(aPart)->Aspect()); else { if (aPart == Prs3d_DP_Origin) { #ifndef POINT_SELECTION_MODE #ifdef PATCH_TO_OCCT_710 myPointAspect->SetTypeOfMarker(Aspect_TOM_POINT); aGroup->SetGroupPrimitivesAspect(myPointAspect->Aspect()); #else aGroup->SetGroupPrimitivesAspect (anAspect->PointAspect()->Aspect()); #endif #else anAspect->PointAspect()->SetTypeOfMarker(Aspect_TOM_EMPTY); SynchronizeAspects(); #endif } else aGroup->SetGroupPrimitivesAspect (anAspect->LineAspect(aPart)->Aspect()); } } mySelectedParts.Clear(); } //======================================================================= //function : ComputePresentation //purpose : //======================================================================= void AIS_Trihedron::ComputePresentation (const Handle(PrsMgr_PresentationManager3d)& /*thePrsMgr*/, const Handle(Prs3d_Presentation)& thePrs) { myPartToGroup.Clear(); Handle(Prs3d_DatumAspect) anAspect = Attributes()->DatumAspect(); bool isShadingMode = DatumDisplayMode() == Prs3d_DM_Shaded; // display origin { // Origin is visualized only in shading mode Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePrs); Prs3d_DatumParts aPart = Prs3d_DP_Origin; #ifdef PATCH_TO_OCCT_710 // Origin is visualized only in shading mode //Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePrs); //Prs3d_DatumParts aPart = Prs3d_DP_Origin; myPartToGroup.Bind(aPart, aGroup); if (isShadingMode) aGroup->SetGroupPrimitivesAspect (anAspect->ShadingAspect(aPart)->Aspect()); else aGroup->SetGroupPrimitivesAspect(myPointAspect->Aspect()); aGroup->AddPrimitiveArray (anAspect->ArrayOfPrimitives(aPart)); #else if (anAspect->DrawDatumPart(aPart)) { myPartToGroup.Bind(aPart, aGroup); if (isShadingMode) aGroup->SetGroupPrimitivesAspect (anAspect->ShadingAspect(aPart)->Aspect()); else { aGroup->SetGroupPrimitivesAspect (anAspect->PointAspect()->Aspect()); } aGroup->AddPrimitiveArray (anAspect->ArrayOfPrimitives(aPart)); } #endif } // display axes { for (Standard_Integer anAxisIter = Prs3d_DP_XAxis; anAxisIter <= Prs3d_DP_ZAxis; ++anAxisIter) { Prs3d_DatumParts aPart = (Prs3d_DatumParts)anAxisIter; if (!anAspect->DrawDatumPart(aPart)) continue; { Handle(Graphic3d_Group) anAxisGroup = Prs3d_Root::NewGroup (thePrs); myPartToGroup.Bind(aPart, anAxisGroup); if (isShadingMode) anAxisGroup->SetGroupPrimitivesAspect (anAspect->ShadingAspect(aPart)->Aspect()); else anAxisGroup->SetGroupPrimitivesAspect (anAspect->LineAspect(aPart)->Aspect()); anAxisGroup->AddPrimitiveArray (anAspect->ArrayOfPrimitives(aPart)); // draw arrow Handle(Graphic3d_Group) anArrowGroup = Prs3d_Root::NewGroup (thePrs); anArrowGroup->SetPrimitivesAspect(anAspect->ArrowAspect()->Aspect()); Prs3d_DatumParts anArrowPart = anAspect->ArrowPartForAxis(aPart); if (!anAspect->DrawDatumPart(anArrowPart)) continue; anArrowGroup->AddPrimitiveArray (anAspect->ArrayOfPrimitives(anArrowPart)); } } } // display labels if (anAspect->ToDrawLabels()) { Handle(Geom_Axis2Placement) aComponent = myComponent; gp_Pnt anOrigin = aComponent->Location(); for (Standard_Integer anAxisIter = Prs3d_DP_XAxis; anAxisIter <= Prs3d_DP_ZAxis; ++anAxisIter) { Prs3d_DatumParts aPart = (Prs3d_DatumParts)anAxisIter; if (!anAspect->DrawDatumPart(aPart)) continue; Standard_Real anAxisLength = anAspect->AxisLength(aPart); TCollection_ExtendedString aLabel = myLabel.Find(aPart); gp_Dir aDir; switch (aPart) { case Prs3d_DP_XAxis: aDir = aComponent->XDirection(); break; case Prs3d_DP_YAxis: aDir = aComponent->YDirection(); break; case Prs3d_DP_ZAxis: aDir = aComponent->Direction(); break; default: break; } Handle(Graphic3d_Group) aLabelGroup = Prs3d_Root::NewGroup (thePrs); gp_Pnt aPoint = anOrigin.XYZ() + aDir.XYZ()*anAxisLength; Prs3d_Text::Draw (aLabelGroup, anAspect->TextAspect(), aLabel, aPoint); } } // planes invisible group for planes selection /// plane selection mode is available only in wireframe mode #ifndef PATCH_TO_OCCT_710 for (Standard_Integer anAxisIter = Prs3d_DP_XOYAxis; anAxisIter <= Prs3d_DP_XOZAxis; ++anAxisIter) { Prs3d_DatumParts aPart = (Prs3d_DatumParts)anAxisIter; if (!anAspect->DrawDatumPart(aPart)) continue; { Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePrs); myPartToGroup.Bind(aPart, aGroup); const Handle(Graphic3d_AspectLine3d)& aLineAspect = anAspect->LineAspect(aPart)->Aspect(); aLineAspect->SetType(Aspect_TOL_EMPTY); aGroup->AddPrimitiveArray (anAspect->ArrayOfPrimitives(aPart)); aGroup->SetGroupPrimitivesAspect (aLineAspect); } } #endif } //======================================================================= //function : LoadRecomputable //purpose : //======================================================================= void AIS_Trihedron::LoadRecomputable(const Standard_Integer TheMode) { myRecomputeEveryPrs = Standard_False; if(!IsInList(myToRecomputeModes,TheMode)) myToRecomputeModes.Append(TheMode); } //======================================================================= //function : SetColor //purpose : //======================================================================= void AIS_Trihedron::SetColor (const Prs3d_DatumParts& thePart, const Quantity_Color& theColor) { myDrawer->DatumAspect()->ShadingAspect(thePart)->SetColor(theColor); if (thePart != Prs3d_DP_Origin) myDrawer->DatumAspect()->LineAspect(thePart)->SetColor(theColor); } //======================================================================= //function : SetTextColor //purpose : //======================================================================= void AIS_Trihedron::SetTextColor (const Quantity_NameOfColor theColor) { SetTextColor(Quantity_Color(theColor)); } //======================================================================= //function : SetTextColor //purpose : //======================================================================= void AIS_Trihedron::SetTextColor (const Quantity_Color& theColor) { myDrawer->DatumAspect()->TextAspect()->SetColor(theColor); } Quantity_Color AIS_Trihedron::Color (const Prs3d_DatumParts& thePart) { Quantity_Color aColor; if (DatumDisplayMode() == Prs3d_DM_Shaded) { aColor = myDrawer->DatumAspect()->ShadingAspect(thePart)->Color(); } else { aColor = myDrawer->DatumAspect()->LineAspect(thePart)->Aspect()->Color(); } return aColor; } //======================================================================= //function : SetOriginColor //purpose : //======================================================================= void AIS_Trihedron::SetOriginColor (const Quantity_Color& theColor) { if (DatumDisplayMode() == Prs3d_DM_Shaded) { SetColor(Prs3d_DP_Origin, theColor); } } //======================================================================= //function : SetXAxisColor //purpose : //======================================================================= void AIS_Trihedron::SetXAxisColor (const Quantity_Color& theColor) { SetColor(Prs3d_DP_XAxis, theColor); } //======================================================================= //function : SetYAxisColor //purpose : //======================================================================= void AIS_Trihedron::SetYAxisColor (const Quantity_Color& theColor) { SetColor(Prs3d_DP_YAxis, theColor); } //======================================================================= //function : SetAxisColor //purpose : //======================================================================= void AIS_Trihedron::SetAxisColor (const Quantity_Color& theColor) { SetColor(Prs3d_DP_ZAxis, theColor); } //======================================================================= //function : SetColor //purpose : //======================================================================= void AIS_Trihedron::SetColor (const Quantity_NameOfColor theColor) { SetColor(Quantity_Color(theColor)); } void AIS_Trihedron::SetColor (const Quantity_Color& theColor) { hasOwnColor = Standard_True; #ifndef PATCH_TO_OCCT_710 myDrawer->SetColor(theColor); #endif SetColor(Prs3d_DP_Origin, theColor); SetColor(Prs3d_DP_XAxis, theColor); SetColor(Prs3d_DP_YAxis, theColor); SetColor(Prs3d_DP_ZAxis, theColor); } void AIS_Trihedron::SetArrowColor (const Quantity_NameOfColor theColor) { SetArrowColor(Quantity_Color(theColor)); } void AIS_Trihedron::SetArrowColor (const Quantity_Color& theColor) { myHasOwnArrowColor = Standard_True; myDrawer->DatumAspect()->ArrowAspect()->SetColor(theColor); } //======================================================================= Standard_Boolean AIS_Trihedron::HasTextColor() const { return myHasOwnTextColor; } //======================================================================= Quantity_Color AIS_Trihedron::TextColor() const { return myDrawer->DatumAspect()->TextAspect()->Aspect()->Color(); } //======================================================================= Standard_Boolean AIS_Trihedron::HasArrowColor () const { return myHasOwnArrowColor; } //======================================================================= Quantity_Color AIS_Trihedron::ArrowColor () const { return myDrawer->DatumAspect()->ArrowAspect()->Aspect()->Color(); } //======================================================================= //function : Type //purpose : //======================================================================= AIS_KindOfInteractive AIS_Trihedron::Type () const { return AIS_KOI_Datum; } //======================================================================= //function : Signature //purpose : //======================================================================= Standard_Integer AIS_Trihedron::Signature () const { return 3; } //======================================================================= //function : AcceptDisplayMode //purpose : //======================================================================= Standard_Boolean AIS_Trihedron::AcceptDisplayMode (const Standard_Integer theMode) const { return theMode == AIS_WireFrame || theMode == AIS_Shaded; } //======================================================================= //function : UnsetColor //purpose : //======================================================================= void AIS_Trihedron::UnsetColor() { hasOwnColor=Standard_False; Quantity_Color aDefaultColor = Quantity_NOC_LIGHTSTEELBLUE4; SetColor(aDefaultColor); if( HasTextColor() ) { SetTextColor(aDefaultColor.Name()); myHasOwnTextColor = Standard_False; } if( HasArrowColor() ) { SetArrowColor(aDefaultColor.Name()); myHasOwnArrowColor = Standard_False; } } Handle(SelectBasics_SensitiveEntity) AIS_Trihedron::CreateSensitiveEntity( const Prs3d_DatumParts& thePart, const Handle(SelectBasics_EntityOwner)& theOwner) const { Handle(SelectBasics_SensitiveEntity) aSelectEntity; Handle(Prs3d_DatumAspect) anAspect = Attributes()->DatumAspect(); Handle(Graphic3d_ArrayOfPrimitives) aPrimitives = anAspect->ArrayOfPrimitives(thePart); if (aPrimitives.IsNull()) return aSelectEntity; #ifndef PATCH_TO_OCCT_710 if (thePart >= Prs3d_DP_XOYAxis && thePart <= Prs3d_DP_XOZAxis) { // plane Standard_Real aX1, anY1, aZ1, aX2, anY2, aZ2, aX3, anY3, aZ3; aPrimitives->Vertice(1, aX1, anY1, aZ1); aPrimitives->Vertice(2, aX2, anY2, aZ2); aPrimitives->Vertice(3, aX3, anY3, aZ3); aSelectEntity = new Select3D_SensitiveTriangle(theOwner, gp_Pnt(aX1, anY1, aZ1), gp_Pnt(aX2, anY2, aZ2), gp_Pnt(aX3, anY3, aZ3)); } else if (DatumDisplayMode() == Prs3d_DM_Shaded) #else if (DatumDisplayMode() == Prs3d_DM_Shaded) #endif { Handle(Select3D_SensitivePrimitiveArray) aSelArray = new Select3D_SensitivePrimitiveArray (theOwner); aSelArray->InitTriangulation (aPrimitives->Attributes(), aPrimitives->Indices(), TopLoc_Location()); aSelectEntity = aSelArray; } else { if (!Handle(Graphic3d_ArrayOfPoints)::DownCast(aPrimitives).IsNull()) { Standard_Real aX, anY, aZ; aPrimitives->Vertice(1, aX, anY, aZ); aSelectEntity = new Select3D_SensitivePoint(theOwner, gp_Pnt(aX, anY, aZ)); } else if (!Handle(Graphic3d_ArrayOfSegments)::DownCast(aPrimitives).IsNull()) { Standard_Real aX1, anY1, aZ1, aX2, anY2, aZ2; aPrimitives->Vertice(1, aX1, anY1, aZ1); aPrimitives->Vertice(2, aX2, anY2, aZ2); aSelectEntity = new Select3D_SensitiveSegment(theOwner, gp_Pnt(aX1, anY1, aZ1), gp_Pnt(aX2, anY2, aZ2)); } } return aSelectEntity; }