1 // Created on: 2015-12-23
2 // Created by: Anastasia BORISOVA
3 // Copyright (c) 2015 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <AIS_Manipulator.hxx>
18 #include <AIS_InteractiveContext.hxx>
19 #include <AIS_ManipulatorOwner.hxx>
20 #include <Extrema_ExtElC.hxx>
21 #include <gce_MakeDir.hxx>
22 #include <IntAna_IntConicQuad.hxx>
23 #include <Prs3d_Arrow.hxx>
24 #include <Prs3d_ShadingAspect.hxx>
25 #include <Prs3d_ToolDisk.hxx>
26 #include <Prs3d_ToolSector.hxx>
27 #include <Prs3d_ToolSphere.hxx>
28 #include <Select3D_SensitiveCircle.hxx>
29 #include <Select3D_SensitivePoint.hxx>
30 #include <Select3D_SensitiveSegment.hxx>
31 #include <Select3D_SensitiveTriangulation.hxx>
32 #include <Select3D_SensitivePrimitiveArray.hxx>
33 #include <SelectMgr_SequenceOfOwner.hxx>
34 #include <TColgp_Array1OfPnt.hxx>
35 #include <V3d_View.hxx>
37 IMPLEMENT_STANDARD_HANDLE (AIS_Manipulator, AIS_InteractiveObject)
38 IMPLEMENT_STANDARD_RTTIEXT(AIS_Manipulator, AIS_InteractiveObject)
40 IMPLEMENT_HSEQUENCE(AIS_ManipulatorObjectSequence)
44 //! Return Ax1 for specified direction of Ax2.
45 static gp_Ax1 getAx1FromAx2Dir (const gp_Ax2& theAx2,
50 case 0: return gp_Ax1 (theAx2.Location(), theAx2.XDirection());
51 case 1: return gp_Ax1 (theAx2.Location(), theAx2.YDirection());
52 case 2: return theAx2.Axis();
54 throw Standard_ProgramError ("AIS_Manipulator - Invalid axis index");
57 //! Auxiliary tool for filtering picking ray.
58 class ManipSensRotation
62 ManipSensRotation (const gp_Dir& thePlaneNormal) : myPlaneNormal (thePlaneNormal), myAngleTol (10.0 * M_PI / 180.0) {}
64 //! Checks if picking ray can be used for detection.
65 Standard_Boolean isValidRay (const SelectBasics_SelectingVolumeManager& theMgr) const
67 if (theMgr.GetActiveSelectionType() != SelectBasics_SelectingVolumeManager::Point)
69 return Standard_False;
72 const gp_Vec aRay (theMgr.GetNearPickedPnt(), theMgr.GetFarPickedPnt());
73 return !aRay.IsNormal (myPlaneNormal, myAngleTol);
77 Standard_Real myAngleTol;
80 //! Sensitive circle with filtering picking ray.
81 class ManipSensCircle : public Select3D_SensitiveCircle, public ManipSensRotation
85 ManipSensCircle (const Handle(SelectMgr_EntityOwner)& theOwnerId,
86 const gp_Circ& theCircle,
87 const Standard_Integer theNbPnts)
88 : Select3D_SensitiveCircle (theOwnerId, theCircle, Standard_False, theNbPnts),
89 ManipSensRotation (theCircle.Position().Direction()) {}
91 //! Checks whether the circle overlaps current selecting volume
92 virtual Standard_Boolean Matches (SelectBasics_SelectingVolumeManager& theMgr,
93 SelectBasics_PickResult& thePickResult) Standard_OVERRIDE
95 return isValidRay (theMgr)
96 && Select3D_SensitiveCircle::Matches (theMgr, thePickResult);
100 //! Sensitive triangulation with filtering picking ray.
101 class ManipSensTriangulation : public Select3D_SensitiveTriangulation, public ManipSensRotation
104 ManipSensTriangulation (const Handle(SelectMgr_EntityOwner)& theOwnerId,
105 const Handle(Poly_Triangulation)& theTrg,
106 const gp_Dir& thePlaneNormal)
107 : Select3D_SensitiveTriangulation (theOwnerId, theTrg, TopLoc_Location(), Standard_True),
108 ManipSensRotation (thePlaneNormal) {}
110 //! Checks whether the circle overlaps current selecting volume
111 virtual Standard_Boolean Matches (SelectBasics_SelectingVolumeManager& theMgr,
112 SelectBasics_PickResult& thePickResult) Standard_OVERRIDE
114 return isValidRay (theMgr)
115 && Select3D_SensitiveTriangulation::Matches (theMgr, thePickResult);
120 //=======================================================================
123 //=======================================================================
124 void AIS_Manipulator::init()
126 // Create axis in the default coordinate system. The custom position is applied in local transformation.
127 myAxes[0] = Axis (gp::OX(), Quantity_NOC_RED);
128 myAxes[1] = Axis (gp::OY(), Quantity_NOC_GREEN);
129 myAxes[2] = Axis (gp::OZ(), Quantity_NOC_BLUE1);
131 Graphic3d_MaterialAspect aShadingMaterial;
132 aShadingMaterial.SetSpecularColor(Quantity_NOC_BLACK);
133 aShadingMaterial.SetMaterialType (Graphic3d_MATERIAL_ASPECT);
135 myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
136 myDrawer->ShadingAspect()->Aspect()->SetInteriorStyle (Aspect_IS_SOLID);
137 myDrawer->ShadingAspect()->SetColor (Quantity_NOC_WHITE);
138 myDrawer->ShadingAspect()->SetMaterial (aShadingMaterial);
140 Graphic3d_MaterialAspect aHilightMaterial;
141 aHilightMaterial.SetColor (Quantity_NOC_AZURE);
142 aHilightMaterial.SetAmbientColor (Quantity_NOC_BLACK);
143 aHilightMaterial.SetDiffuseColor (Quantity_NOC_BLACK);
144 aHilightMaterial.SetSpecularColor(Quantity_NOC_BLACK);
145 aHilightMaterial.SetEmissiveColor(Quantity_NOC_BLACK);
146 aHilightMaterial.SetMaterialType (Graphic3d_MATERIAL_ASPECT);
148 myHighlightAspect = new Prs3d_ShadingAspect();
149 myHighlightAspect->Aspect()->SetInteriorStyle (Aspect_IS_SOLID);
150 myHighlightAspect->SetMaterial (aHilightMaterial);
152 Graphic3d_MaterialAspect aDraggerMaterial;
153 aDraggerMaterial.SetAmbientColor (Quantity_NOC_BLACK);
154 aDraggerMaterial.SetDiffuseColor (Quantity_NOC_BLACK);
155 aDraggerMaterial.SetSpecularColor(Quantity_NOC_BLACK);
156 aDraggerMaterial.SetMaterialType(Graphic3d_MATERIAL_ASPECT);
158 myDraggerHighlight = new Prs3d_ShadingAspect();
159 myDraggerHighlight->Aspect()->SetInteriorStyle(Aspect_IS_SOLID);
160 myDraggerHighlight->SetMaterial(aDraggerMaterial);
162 myDraggerHighlight->SetTransparency(0.5);
165 SetZLayer (Graphic3d_ZLayerId_Topmost);
168 //=======================================================================
169 //function : getHighlightPresentation
171 //=======================================================================
172 Handle(Prs3d_Presentation) AIS_Manipulator::getHighlightPresentation (const Handle(SelectMgr_EntityOwner)& theOwner) const
174 Handle(Prs3d_Presentation) aDummyPrs;
175 Handle(AIS_ManipulatorOwner) anOwner = Handle(AIS_ManipulatorOwner)::DownCast (theOwner);
176 if (anOwner.IsNull())
181 switch (anOwner->Mode())
183 case AIS_MM_Translation : return myAxes[anOwner->Index()].TranslatorHighlightPrs();
184 case AIS_MM_Rotation : return myAxes[anOwner->Index()].RotatorHighlightPrs();
185 case AIS_MM_Scaling : return myAxes[anOwner->Index()].ScalerHighlightPrs();
186 case AIS_MM_TranslationPlane: return myAxes[anOwner->Index()].DraggerHighlightPrs();
187 case AIS_MM_None : break;
193 //=======================================================================
194 //function : getGroup
196 //=======================================================================
197 Handle(Graphic3d_Group) AIS_Manipulator::getGroup (const Standard_Integer theIndex, const AIS_ManipulatorMode theMode) const
199 Handle(Graphic3d_Group) aDummyGroup;
201 if (theIndex < 0 || theIndex > 2)
208 case AIS_MM_Translation : return myAxes[theIndex].TranslatorGroup();
209 case AIS_MM_Rotation : return myAxes[theIndex].RotatorGroup();
210 case AIS_MM_Scaling : return myAxes[theIndex].ScalerGroup();
211 case AIS_MM_TranslationPlane: return myAxes[theIndex].DraggerGroup();
212 case AIS_MM_None : break;
218 //=======================================================================
219 //function : Constructor
221 //=======================================================================
222 AIS_Manipulator::AIS_Manipulator()
223 : myPosition (gp::XOY()),
225 myCurrentMode (AIS_MM_None),
226 myIsActivationOnDetection (Standard_False),
227 myIsZoomPersistentMode (Standard_True),
228 myHasStartedTransformation (Standard_False),
229 myStartPosition (gp::XOY()),
230 myStartPick (0.0, 0.0, 0.0),
234 SetMutable (Standard_True);
235 SetDisplayMode (AIS_Shaded);
239 //=======================================================================
240 //function : Constructor
242 //=======================================================================
243 AIS_Manipulator::AIS_Manipulator (const gp_Ax2& thePosition)
244 : myPosition (thePosition),
246 myCurrentMode (AIS_MM_None),
247 myIsActivationOnDetection (Standard_False),
248 myIsZoomPersistentMode (Standard_True),
249 myHasStartedTransformation (Standard_False),
250 myStartPosition (gp::XOY()),
251 myStartPick (0.0, 0.0, 0.0),
255 SetMutable (Standard_True);
256 SetDisplayMode (AIS_Shaded);
260 //=======================================================================
263 //=======================================================================
264 void AIS_Manipulator::SetPart (const Standard_Integer theAxisIndex, const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled)
266 Standard_ProgramError_Raise_if (theAxisIndex < 0 || theAxisIndex > 2, "AIS_Manipulator::SetMode(): axis index should be between 0 and 2");
269 case AIS_MM_Translation:
270 myAxes[theAxisIndex].SetTranslation (theIsEnabled);
273 case AIS_MM_Rotation:
274 myAxes[theAxisIndex].SetRotation (theIsEnabled);
278 myAxes[theAxisIndex].SetScaling (theIsEnabled);
281 case AIS_MM_TranslationPlane:
282 myAxes[theAxisIndex].SetDragging(theIsEnabled);
290 //=======================================================================
293 //=======================================================================
294 void AIS_Manipulator::SetPart (const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled)
296 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
298 SetPart (anIt, theMode, theIsEnabled);
302 //=======================================================================
303 //function : EnableMode
305 //=======================================================================
306 void AIS_Manipulator::EnableMode (const AIS_ManipulatorMode theMode)
313 const Handle(AIS_InteractiveContext)& aContext = GetContext();
314 if (aContext.IsNull())
319 aContext->Activate (this, theMode);
322 //=======================================================================
323 //function : attachToBox
325 //=======================================================================
326 void AIS_Manipulator::attachToBox (const Bnd_Box& theBox)
333 Standard_Real anXmin = 0.0, anYmin = 0.0, aZmin = 0.0, anXmax = 0.0, anYmax = 0.0, aZmax = 0.0;
334 theBox.Get (anXmin, anYmin, aZmin, anXmax, anYmax, aZmax);
336 gp_Ax2 aPosition = gp::XOY();
337 aPosition.SetLocation (gp_Pnt ((anXmin + anXmax) * 0.5, (anYmin + anYmax) * 0.5, (aZmin + aZmax) * 0.5));
338 SetPosition (aPosition);
341 //=======================================================================
342 //function : adjustSize
344 //=======================================================================
345 void AIS_Manipulator::adjustSize (const Bnd_Box& theBox)
347 Standard_Real aXmin = 0., aYmin = 0., aZmin = 0., aXmax = 0., aYmax = 0., aZmax = 0.0;
348 theBox.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
349 Standard_Real aXSize = aXmax - aXmin;
350 Standard_Real aYSize = aYmax - aYmin;
351 Standard_Real aZSize = aZmax - aZmin;
353 SetSize ((Standard_ShortReal) (Max (aXSize, Max (aYSize, aZSize)) * 0.5));
356 //=======================================================================
359 //=======================================================================
360 void AIS_Manipulator::Attach (const Handle(AIS_InteractiveObject)& theObject, const OptionsForAttach& theOptions)
362 if (theObject->IsKind (STANDARD_TYPE(AIS_Manipulator)))
367 Handle(AIS_ManipulatorObjectSequence) aSeq = new AIS_ManipulatorObjectSequence();
368 aSeq->Append (theObject);
369 Attach (aSeq, theOptions);
372 //=======================================================================
375 //=======================================================================
376 void AIS_Manipulator::Attach (const Handle(AIS_ManipulatorObjectSequence)& theObjects, const OptionsForAttach& theOptions)
378 if (theObjects->Size() < 1)
383 SetOwner (theObjects);
385 const Handle(AIS_InteractiveObject)& aCurObject = theObjects->Value (theObjects->Lower());
386 aCurObject->BoundingBox (aBox);
388 if (theOptions.AdjustPosition)
393 if (theOptions.AdjustSize)
398 const Handle(AIS_InteractiveContext)& aContext = Object()->GetContext();
399 if (!aContext.IsNull())
401 if (!aContext->IsDisplayed (this))
403 aContext->Display (this, Standard_False);
407 aContext->Update (this, Standard_False);
408 aContext->RecomputeSelectionOnly (this);
411 aContext->Load (this);
414 if (theOptions.EnableModes)
416 EnableMode (AIS_MM_Rotation);
417 EnableMode (AIS_MM_Translation);
418 EnableMode (AIS_MM_Scaling);
419 EnableMode (AIS_MM_TranslationPlane);
423 //=======================================================================
426 //=======================================================================
427 void AIS_Manipulator::Detach()
429 DeactivateCurrentMode();
436 Handle(AIS_InteractiveObject) anObject = Object();
437 const Handle(AIS_InteractiveContext)& aContext = anObject->GetContext();
438 if (!aContext.IsNull())
440 aContext->Remove (this, Standard_False);
446 //=======================================================================
449 //=======================================================================
450 Handle(AIS_ManipulatorObjectSequence) AIS_Manipulator::Objects() const
452 return Handle(AIS_ManipulatorObjectSequence)::DownCast (GetOwner());
455 //=======================================================================
458 //=======================================================================
459 Handle(AIS_InteractiveObject) AIS_Manipulator::Object (const Standard_Integer theIndex) const
461 Handle(AIS_ManipulatorObjectSequence) anOwner = Handle(AIS_ManipulatorObjectSequence)::DownCast (GetOwner());
463 Standard_ProgramError_Raise_if (theIndex < anOwner->Lower() || theIndex > anOwner->Upper(), "AIS_Manipulator::Object(): wrong index value");
465 if (anOwner.IsNull() || anOwner->IsEmpty())
470 return anOwner->Value (theIndex);
473 //=======================================================================
476 //=======================================================================
477 Handle(AIS_InteractiveObject) AIS_Manipulator::Object() const
482 //=======================================================================
483 //function : ObjectTransformation
485 //=======================================================================
486 Standard_Boolean AIS_Manipulator::ObjectTransformation (const Standard_Integer theMaxX, const Standard_Integer theMaxY,
487 const Handle(V3d_View)& theView, gp_Trsf& theTrsf)
489 // Initialize start reference data
490 if (!myHasStartedTransformation)
492 myStartTrsfs.Clear();
493 Handle(AIS_ManipulatorObjectSequence) anObjects = Objects();
494 for (AIS_ManipulatorObjectSequence::Iterator anObjIter (*anObjects); anObjIter.More(); anObjIter.Next())
496 myStartTrsfs.Append (anObjIter.Value()->LocalTransformation());
498 myStartPosition = myPosition;
501 // Get 3d point with projection vector
502 Graphic3d_Vec3d anInputPoint, aProj;
503 theView->ConvertWithProj (theMaxX, theMaxY, anInputPoint.x(), anInputPoint.y(), anInputPoint.z(), aProj.x(), aProj.y(), aProj.z());
504 const gp_Lin anInputLine (gp_Pnt (anInputPoint.x(), anInputPoint.y(), anInputPoint.z()), gp_Dir (aProj.x(), aProj.y(), aProj.z()));
505 switch (myCurrentMode)
507 case AIS_MM_Translation:
510 const gp_Lin aLine (myStartPosition.Location(), myAxes[myCurrentIndex].Position().Direction());
511 Extrema_ExtElC anExtrema (anInputLine, aLine, Precision::Angular());
512 if (!anExtrema.IsDone()
513 || anExtrema.IsParallel()
514 || anExtrema.NbExt() != 1)
516 // translation cannot be done co-directed with camera
517 return Standard_False;
520 Extrema_POnCurv anExPnts[2];
521 anExtrema.Points (1, anExPnts[0], anExPnts[1]);
522 const gp_Pnt aNewPosition = anExPnts[1].Value();
523 if (!myHasStartedTransformation)
525 myStartPick = aNewPosition;
526 myHasStartedTransformation = Standard_True;
527 return Standard_True;
529 else if (aNewPosition.Distance (myStartPick) < Precision::Confusion())
531 return Standard_False;
535 if (myCurrentMode == AIS_MM_Translation)
537 aNewTrsf.SetTranslation (gp_Vec(myStartPick, aNewPosition));
540 else if (myCurrentMode == AIS_MM_Scaling)
542 if (aNewPosition.Distance (myStartPosition.Location()) < Precision::Confusion())
544 return Standard_False;
547 Standard_Real aCoeff = myStartPosition.Location().Distance (aNewPosition)
548 / myStartPosition.Location().Distance (myStartPick);
549 aNewTrsf.SetScale (myPosition.Location(), aCoeff);
552 return Standard_True;
554 case AIS_MM_Rotation:
556 const gp_Pnt aPosLoc = myStartPosition.Location();
557 const gp_Ax1 aCurrAxis = getAx1FromAx2Dir (myStartPosition, myCurrentIndex);
558 IntAna_IntConicQuad aIntersector (anInputLine, gp_Pln (aPosLoc, aCurrAxis.Direction()), Precision::Angular(), Precision::Intersection());
559 if (!aIntersector.IsDone()
560 || aIntersector.IsParallel()
561 || aIntersector.NbPoints() < 1)
563 return Standard_False;
566 const gp_Pnt aNewPosition = aIntersector.Point (1);
567 if (!myHasStartedTransformation)
569 myStartPick = aNewPosition;
570 myHasStartedTransformation = Standard_True;
571 gp_Dir aStartAxis = gce_MakeDir (aPosLoc, myStartPick);
572 myPrevState = aStartAxis.AngleWithRef (gce_MakeDir(aPosLoc, aNewPosition), aCurrAxis.Direction());
573 return Standard_True;
576 if (aNewPosition.Distance (myStartPick) < Precision::Confusion())
578 return Standard_False;
581 gp_Dir aStartAxis = aPosLoc.IsEqual (myStartPick, Precision::Confusion())
582 ? getAx1FromAx2Dir (myStartPosition, (myCurrentIndex + 1) % 3).Direction()
583 : gce_MakeDir (aPosLoc, myStartPick);
585 gp_Dir aCurrentAxis = gce_MakeDir (aPosLoc, aNewPosition);
586 Standard_Real anAngle = aStartAxis.AngleWithRef (aCurrentAxis, aCurrAxis.Direction());
588 // Change value of an angle if it should have different sign.
589 if (anAngle * myPrevState < 0 && Abs (anAngle) < M_PI_2)
591 Standard_Real aSign = myPrevState > 0 ? -1.0 : 1.0;
592 anAngle = aSign * (M_PI * 2 - anAngle);
595 if (Abs (anAngle) < Precision::Confusion())
597 return Standard_False;
601 aNewTrsf.SetRotation (aCurrAxis, anAngle);
603 myPrevState = anAngle;
604 return Standard_True;
606 case AIS_MM_TranslationPlane:
608 const gp_Pnt aPosLoc = myStartPosition.Location();
609 const gp_Ax1 aCurrAxis = getAx1FromAx2Dir(myStartPosition, myCurrentIndex);
610 IntAna_IntConicQuad aIntersector(anInputLine, gp_Pln(aPosLoc, aCurrAxis.Direction()), Precision::Angular(), Precision::Intersection());
611 if (!aIntersector.IsDone() || aIntersector.NbPoints() < 1)
613 return Standard_False;
616 const gp_Pnt aNewPosition = aIntersector.Point(1);
617 if (!myHasStartedTransformation)
619 myStartPick = aNewPosition;
620 myHasStartedTransformation = Standard_True;
621 return Standard_True;
624 if (aNewPosition.Distance(myStartPick) < Precision::Confusion())
626 return Standard_False;
630 aNewTrsf.SetTranslation(gp_Vec(myStartPick, aNewPosition));
632 return Standard_True;
636 return Standard_False;
639 return Standard_False;
642 //=======================================================================
643 //function : ProcessDragging
645 //=======================================================================
646 Standard_Boolean AIS_Manipulator::ProcessDragging (const Handle(AIS_InteractiveContext)&,
647 const Handle(V3d_View)& theView,
648 const Handle(SelectMgr_EntityOwner)&,
649 const Graphic3d_Vec2i& theDragFrom,
650 const Graphic3d_Vec2i& theDragTo,
651 const AIS_DragAction theAction)
655 case AIS_DragAction_Start:
659 StartTransform (theDragFrom.x(), theDragFrom.y(), theView);
660 return Standard_True;
664 case AIS_DragAction_Update:
666 Transform (theDragTo.x(), theDragTo.y(), theView);
667 return Standard_True;
669 case AIS_DragAction_Abort:
671 StopTransform (false);
672 return Standard_True;
674 case AIS_DragAction_Stop:
677 return Standard_False;
680 //=======================================================================
681 //function : StartTransform
683 //=======================================================================
684 void AIS_Manipulator::StartTransform (const Standard_Integer theX, const Standard_Integer theY, const Handle(V3d_View)& theView)
686 if (myHasStartedTransformation)
692 ObjectTransformation (theX, theY, theView, aTrsf);
695 //=======================================================================
696 //function : StopTransform
698 //=======================================================================
699 void AIS_Manipulator::StopTransform (const Standard_Boolean theToApply)
701 if (!IsAttached() || !myHasStartedTransformation)
706 myHasStartedTransformation = Standard_False;
712 Handle(AIS_ManipulatorObjectSequence) anObjects = Objects();
713 AIS_ManipulatorObjectSequence::Iterator anObjIter (*anObjects);
714 NCollection_Sequence<gp_Trsf>::Iterator aTrsfIter (myStartTrsfs);
715 for (; anObjIter.More(); anObjIter.Next(), aTrsfIter.Next())
717 anObjIter.ChangeValue()->SetLocalTransformation (aTrsfIter.Value());
719 SetPosition (myStartPosition);
722 //=======================================================================
723 //function : Transform
725 //=======================================================================
726 void AIS_Manipulator::Transform (const gp_Trsf& theTrsf)
728 if (!IsAttached() || !myHasStartedTransformation)
734 Handle(AIS_ManipulatorObjectSequence) anObjects = Objects();
735 AIS_ManipulatorObjectSequence::Iterator anObjIter (*anObjects);
736 NCollection_Sequence<gp_Trsf>::Iterator aTrsfIter (myStartTrsfs);
737 for (; anObjIter.More(); anObjIter.Next(), aTrsfIter.Next())
739 const Handle(AIS_InteractiveObject)& anObj = anObjIter.ChangeValue();
740 const gp_Trsf& anOldTrsf = aTrsfIter.Value();
741 const Handle(TopLoc_Datum3D)& aParentTrsf = anObj->CombinedParentTransformation();
742 if (!aParentTrsf.IsNull()
743 && aParentTrsf->Form() != gp_Identity)
745 // recompute local transformation relative to parent transformation
746 const gp_Trsf aNewLocalTrsf = aParentTrsf->Trsf().Inverted() * theTrsf * aParentTrsf->Trsf() * anOldTrsf;
747 anObj->SetLocalTransformation (aNewLocalTrsf);
751 anObj->SetLocalTransformation (theTrsf * anOldTrsf);
756 if ((myCurrentMode == AIS_MM_Translation && myBehaviorOnTransform.FollowTranslation)
757 || (myCurrentMode == AIS_MM_Rotation && myBehaviorOnTransform.FollowRotation)
758 || (myCurrentMode == AIS_MM_TranslationPlane && myBehaviorOnTransform.FollowDragging))
760 gp_Pnt aPos = myStartPosition.Location().Transformed (theTrsf);
761 gp_Dir aVDir = myStartPosition.Direction().Transformed (theTrsf);
762 gp_Dir aXDir = myStartPosition.XDirection().Transformed (theTrsf);
763 SetPosition (gp_Ax2 (aPos, aVDir, aXDir));
767 //=======================================================================
768 //function : Transform
770 //=======================================================================
771 gp_Trsf AIS_Manipulator::Transform (const Standard_Integer thePX, const Standard_Integer thePY,
772 const Handle(V3d_View)& theView)
775 if (ObjectTransformation (thePX, thePY, theView, aTrsf))
783 //=======================================================================
784 //function : SetPosition
786 //=======================================================================
787 void AIS_Manipulator::SetPosition (const gp_Ax2& thePosition)
789 if (!myPosition.Location().IsEqual (thePosition.Location(), Precision::Confusion())
790 || !myPosition.Direction().IsEqual (thePosition.Direction(), Precision::Angular())
791 || !myPosition.XDirection().IsEqual (thePosition.XDirection(), Precision::Angular()))
793 myPosition = thePosition;
794 myAxes[0].SetPosition (getAx1FromAx2Dir (thePosition, 0));
795 myAxes[1].SetPosition (getAx1FromAx2Dir (thePosition, 1));
796 myAxes[2].SetPosition (getAx1FromAx2Dir (thePosition, 2));
797 updateTransformation();
801 //=======================================================================
802 //function : updateTransformation
803 //purpose : set local transformation to avoid graphics recomputation
804 //=======================================================================
805 void AIS_Manipulator::updateTransformation()
809 if (!myIsZoomPersistentMode)
811 aTrsf.SetTransformation (myPosition, gp::XOY());
815 const gp_Dir& aVDir = myPosition.Direction();
816 const gp_Dir& aXDir = myPosition.XDirection();
817 aTrsf.SetTransformation (gp_Ax2 (gp::Origin(), aVDir, aXDir), gp::XOY());
820 Handle(TopLoc_Datum3D) aGeomTrsf = new TopLoc_Datum3D (aTrsf);
821 // we explicitly call here setLocalTransformation() of the base class
822 // since AIS_Manipulator::setLocalTransformation() implementation throws exception
823 // as protection from external calls
824 AIS_InteractiveObject::setLocalTransformation (aGeomTrsf);
825 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
827 myAxes[anIt].Transform (aGeomTrsf);
830 if (myIsZoomPersistentMode)
832 if (TransformPersistence().IsNull()
833 || TransformPersistence()->Mode() != Graphic3d_TMF_ZoomPers
834 || !TransformPersistence()->AnchorPoint().IsEqual (myPosition.Location(), 0.0))
836 setTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_ZoomPers, myPosition.Location()));
841 //=======================================================================
844 //=======================================================================
845 void AIS_Manipulator::SetSize (const Standard_ShortReal theSideLength)
847 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
849 myAxes[anIt].SetSize (theSideLength);
855 //=======================================================================
858 //=======================================================================
859 void AIS_Manipulator::SetGap (const Standard_ShortReal theValue)
861 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
863 myAxes[anIt].SetIndent (theValue);
869 //=======================================================================
870 //function : DeactivateCurrentMode
872 //=======================================================================
873 void AIS_Manipulator::DeactivateCurrentMode()
875 if (!myIsActivationOnDetection)
877 Handle(Graphic3d_Group) aGroup = getGroup (myCurrentIndex, myCurrentMode);
883 Handle(Prs3d_ShadingAspect) anAspect = new Prs3d_ShadingAspect();
884 anAspect->Aspect()->SetInteriorStyle (Aspect_IS_SOLID);
885 anAspect->SetMaterial (myDrawer->ShadingAspect()->Material());
886 if (myCurrentMode == AIS_MM_TranslationPlane)
887 anAspect->SetTransparency(1.0);
890 anAspect->SetTransparency(myDrawer->ShadingAspect()->Transparency());
891 anAspect->SetColor(myAxes[myCurrentIndex].Color());
894 aGroup->SetGroupPrimitivesAspect (anAspect->Aspect());
898 myCurrentMode = AIS_MM_None;
900 if (myHasStartedTransformation)
902 myHasStartedTransformation = Standard_False;
906 //=======================================================================
907 //function : SetZoomPersistence
909 //=======================================================================
910 void AIS_Manipulator::SetZoomPersistence (const Standard_Boolean theToEnable)
912 if (myIsZoomPersistentMode != theToEnable)
917 myIsZoomPersistentMode = theToEnable;
921 setTransformPersistence (Handle(Graphic3d_TransformPers)());
924 updateTransformation();
927 //=======================================================================
928 //function : SetTransformPersistence
930 //=======================================================================
931 void AIS_Manipulator::SetTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers)
933 Standard_ASSERT_RETURN (!myIsZoomPersistentMode,
934 "AIS_Manipulator::SetTransformPersistence: "
935 "Custom settings are not allowed by this class in ZoomPersistence mode",);
937 setTransformPersistence (theTrsfPers);
940 //=======================================================================
941 //function : setTransformPersistence
943 //=======================================================================
944 void AIS_Manipulator::setTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers)
946 AIS_InteractiveObject::SetTransformPersistence (theTrsfPers);
948 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
950 myAxes[anIt].SetTransformPersistence (theTrsfPers);
954 //=======================================================================
955 //function : setLocalTransformation
957 //=======================================================================
958 void AIS_Manipulator::setLocalTransformation (const Handle(TopLoc_Datum3D)& /*theTrsf*/)
960 Standard_ASSERT_INVOKE ("AIS_Manipulator::setLocalTransformation: "
961 "Custom transformation is not supported by this class");
964 //=======================================================================
967 //=======================================================================
968 void AIS_Manipulator::Compute (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
969 const Handle(Prs3d_Presentation)& thePrs,
970 const Standard_Integer theMode)
972 if (theMode != AIS_Shaded)
977 thePrs->SetInfiniteState (Standard_True);
978 thePrs->SetMutable (Standard_True);
979 Handle(Graphic3d_Group) aGroup;
980 Handle(Prs3d_ShadingAspect) anAspect = new Prs3d_ShadingAspect();
981 anAspect->Aspect()->SetInteriorStyle (Aspect_IS_SOLID);
982 anAspect->SetMaterial (myDrawer->ShadingAspect()->Material());
983 anAspect->SetTransparency (myDrawer->ShadingAspect()->Transparency());
986 myCenter.Init (myAxes[0].AxisRadius() * 2.0f, gp::Origin());
987 aGroup = thePrs->NewGroup ();
988 aGroup->SetPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
989 aGroup->AddPrimitiveArray (myCenter.Array());
991 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
994 aGroup = thePrs->NewGroup ();
996 Handle(Prs3d_ShadingAspect) anAspectAx = new Prs3d_ShadingAspect (new Graphic3d_AspectFillArea3d(*anAspect->Aspect()));
997 anAspectAx->SetColor (myAxes[anIt].Color());
998 aGroup->SetGroupPrimitivesAspect (anAspectAx->Aspect());
999 myAxes[anIt].Compute (thePrsMgr, thePrs, anAspectAx);
1000 myAxes[anIt].SetTransformPersistence (TransformPersistence());
1003 updateTransformation();
1006 //=======================================================================
1007 //function : HilightSelected
1009 //=======================================================================
1010 void AIS_Manipulator::HilightSelected (const Handle(PrsMgr_PresentationManager)& thePM,
1011 const SelectMgr_SequenceOfOwner& theSeq)
1013 if (theSeq.IsEmpty())
1018 if (myIsActivationOnDetection)
1023 if (!theSeq (1)->IsKind (STANDARD_TYPE (AIS_ManipulatorOwner)))
1025 thePM->Color (this, GetContext()->HighlightStyle(), 0);
1029 Handle(AIS_ManipulatorOwner) anOwner = Handle(AIS_ManipulatorOwner)::DownCast (theSeq (1));
1030 myHighlightAspect->Aspect()->SetInteriorColor (GetContext()->HighlightStyle()->Color());
1031 Handle(Graphic3d_Group) aGroup = getGroup (anOwner->Index(), anOwner->Mode());
1032 if (aGroup.IsNull())
1037 if (anOwner->Mode() == AIS_MM_TranslationPlane)
1039 myDraggerHighlight->SetColor(myAxes[anOwner->Index()].Color());
1040 aGroup->SetGroupPrimitivesAspect(myDraggerHighlight->Aspect());
1043 aGroup->SetGroupPrimitivesAspect(myHighlightAspect->Aspect());
1045 myCurrentIndex = anOwner->Index();
1046 myCurrentMode = anOwner->Mode();
1049 //=======================================================================
1050 //function : ClearSelected
1052 //=======================================================================
1053 void AIS_Manipulator::ClearSelected()
1055 DeactivateCurrentMode();
1058 //=======================================================================
1059 //function : HilightOwnerWithColor
1061 //=======================================================================
1062 void AIS_Manipulator::HilightOwnerWithColor (const Handle(PrsMgr_PresentationManager)& thePM,
1063 const Handle(Prs3d_Drawer)& theStyle,
1064 const Handle(SelectMgr_EntityOwner)& theOwner)
1066 Handle(AIS_ManipulatorOwner) anOwner = Handle(AIS_ManipulatorOwner)::DownCast (theOwner);
1067 Handle(Prs3d_Presentation) aPresentation = getHighlightPresentation (anOwner);
1068 if (aPresentation.IsNull())
1073 aPresentation->CStructure()->ViewAffinity = thePM->StructureManager()->ObjectAffinity (Handle(Standard_Transient) (this));
1075 if (anOwner->Mode() == AIS_MM_TranslationPlane)
1077 Handle(Prs3d_Drawer) aStyle = new Prs3d_Drawer();
1078 aStyle->SetColor (myAxes[anOwner->Index()].Color());
1079 aStyle->SetTransparency (0.5);
1080 aPresentation->Highlight (aStyle);
1084 aPresentation->Highlight (theStyle);
1087 for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aPresentation->Groups());
1088 aGroupIter.More(); aGroupIter.Next())
1090 Handle(Graphic3d_Group)& aGrp = aGroupIter.ChangeValue();
1093 aGrp->SetGroupPrimitivesAspect (myHighlightAspect->Aspect());
1096 aPresentation->SetZLayer (Graphic3d_ZLayerId_Topmost);
1097 thePM->AddToImmediateList (aPresentation);
1099 if (myIsActivationOnDetection)
1101 if (HasActiveMode())
1103 DeactivateCurrentMode();
1106 myCurrentIndex = anOwner->Index();
1107 myCurrentMode = anOwner->Mode();
1111 //=======================================================================
1112 //function : ComputeSelection
1114 //=======================================================================
1115 void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
1116 const Standard_Integer theMode)
1119 AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode;
1120 if (aMode == AIS_MM_None)
1124 Handle(SelectMgr_EntityOwner) anOwner;
1125 if (aMode == AIS_MM_None)
1127 anOwner = new SelectMgr_EntityOwner (this, 5);
1130 if (aMode == AIS_MM_Translation || aMode == AIS_MM_None)
1132 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
1134 if (!myAxes[anIt].HasTranslation())
1138 const Axis& anAxis = myAxes[anIt];
1139 if (aMode != AIS_MM_None)
1141 anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Translation, 9);
1143 // define sensitivity by line
1144 Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment (anOwner, gp::Origin(), anAxis.TranslatorTipPosition());
1145 aLine->SetSensitivityFactor (15);
1146 theSelection->Add (aLine);
1148 // enlarge sensitivity by triangulation
1149 Handle(Select3D_SensitivePrimitiveArray) aTri = new Select3D_SensitivePrimitiveArray (anOwner);
1150 aTri->InitTriangulation (anAxis.TriangleArray()->Attributes(), anAxis.TriangleArray()->Indices(), TopLoc_Location());
1151 theSelection->Add (aTri);
1155 if (aMode == AIS_MM_Rotation || aMode == AIS_MM_None)
1157 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
1159 if (!myAxes[anIt].HasRotation())
1163 const Axis& anAxis = myAxes[anIt];
1164 if (aMode != AIS_MM_None)
1166 anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Rotation, 9);
1168 // define sensitivity by circle
1169 const gp_Circ aGeomCircle (gp_Ax2 (gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius());
1170 Handle(Select3D_SensitiveCircle) aCircle = new ManipSensCircle (anOwner, aGeomCircle, anAxis.FacettesNumber());
1171 aCircle->SetSensitivityFactor (15);
1172 theSelection->Add (aCircle);
1173 // enlarge sensitivity by triangulation
1174 Handle(Select3D_SensitiveTriangulation) aTri = new ManipSensTriangulation (anOwner, myAxes[anIt].RotatorDisk().Triangulation(), anAxis.ReferenceAxis().Direction());
1175 theSelection->Add (aTri);
1179 if (aMode == AIS_MM_Scaling || aMode == AIS_MM_None)
1181 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
1183 if (!myAxes[anIt].HasScaling())
1187 if (aMode != AIS_MM_None)
1189 anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Scaling, 9);
1191 // define sensitivity by point
1192 Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint (anOwner, myAxes[anIt].ScalerCubePosition());
1193 aPnt->SetSensitivityFactor (15);
1194 theSelection->Add (aPnt);
1195 // enlarge sensitivity by triangulation
1196 Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation (anOwner, myAxes[anIt].ScalerCube().Triangulation(), TopLoc_Location(), Standard_True);
1197 theSelection->Add (aTri);
1201 if (aMode == AIS_MM_TranslationPlane || aMode == AIS_MM_None)
1203 for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
1205 if (!myAxes[anIt].HasDragging())
1209 if (aMode != AIS_MM_None)
1211 anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
1214 // define sensitivity by two crossed lines
1216 aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition();
1217 aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition();
1218 gp_XYZ aMidP = (aP1.XYZ() + aP2.XYZ()) / 2.0;
1220 Handle(Select3D_SensitiveSegment) aLine1 = new Select3D_SensitiveSegment(anOwner, aP1, aP2);
1221 aLine1->SetSensitivityFactor(10);
1222 theSelection->Add(aLine1);
1223 Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, gp::Origin(), aMidP);
1224 aLine2->SetSensitivityFactor(10);
1225 theSelection->Add(aLine2);
1227 // enlarge sensitivity by triangulation
1228 Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].DraggerSector().Triangulation(), TopLoc_Location(), Standard_True);
1229 theSelection->Add(aTri);
1234 //=======================================================================
1238 //=======================================================================
1239 void AIS_Manipulator::Disk::Init (const Standard_ShortReal theInnerRadius,
1240 const Standard_ShortReal theOuterRadius,
1241 const gp_Ax1& thePosition,
1242 const Standard_Integer theSlicesNb,
1243 const Standard_Integer theStacksNb)
1245 myPosition = thePosition;
1246 myInnerRad = theInnerRadius;
1247 myOuterRad = theOuterRadius;
1249 Prs3d_ToolDisk aTool (theInnerRadius, theOuterRadius, theSlicesNb, theStacksNb);
1250 gp_Ax3 aSystem (myPosition.Location(), myPosition.Direction());
1252 aTrsf.SetTransformation (aSystem, gp_Ax3());
1253 myArray = aTool.CreateTriangulation (aTrsf);
1254 myTriangulation = aTool.CreatePolyTriangulation (aTrsf);
1257 //=======================================================================
1261 //=======================================================================
1262 void AIS_Manipulator::Sphere::Init (const Standard_ShortReal theRadius,
1263 const gp_Pnt& thePosition,
1264 const Standard_Integer theSlicesNb,
1265 const Standard_Integer theStacksNb)
1267 myPosition = thePosition;
1268 myRadius = theRadius;
1270 Prs3d_ToolSphere aTool (theRadius, theSlicesNb, theStacksNb);
1272 aTrsf.SetTranslation (gp_Vec(gp::Origin(), thePosition));
1273 myArray = aTool.CreateTriangulation (aTrsf);
1274 myTriangulation = aTool.CreatePolyTriangulation (aTrsf);
1277 //=======================================================================
1281 //=======================================================================
1282 void AIS_Manipulator::Cube::Init (const gp_Ax1& thePosition, const Standard_ShortReal theSize)
1284 myArray = new Graphic3d_ArrayOfTriangles (12 * 3, 0, Standard_True);
1286 Poly_Array1OfTriangle aPolyTriangles (1, 12);
1287 TColgp_Array1OfPnt aPoints (1, 36);
1288 NCollection_Array1<gp_Dir> aNormals (1, 12);
1289 myTriangulation = new Poly_Triangulation (aPoints, aPolyTriangles);
1291 gp_Ax2 aPln (thePosition.Location(), thePosition.Direction());
1292 gp_Pnt aBottomLeft = thePosition.Location().XYZ() - aPln.XDirection().XYZ() * theSize * 0.5 - aPln.YDirection().XYZ() * theSize * 0.5;
1293 gp_Pnt aV2 = aBottomLeft.XYZ() + aPln.YDirection().XYZ() * theSize;
1294 gp_Pnt aV3 = aBottomLeft.XYZ() + aPln.YDirection().XYZ() * theSize + aPln.XDirection().XYZ() * theSize;
1295 gp_Pnt aV4 = aBottomLeft.XYZ() + aPln.XDirection().XYZ() * theSize;
1296 gp_Pnt aTopRight = thePosition.Location().XYZ() + thePosition.Direction().XYZ() * theSize
1297 + aPln.XDirection().XYZ() * theSize * 0.5 + aPln.YDirection().XYZ() * theSize * 0.5;
1298 gp_Pnt aV5 = aTopRight.XYZ() - aPln.YDirection().XYZ() * theSize;
1299 gp_Pnt aV6 = aTopRight.XYZ() - aPln.YDirection().XYZ() * theSize - aPln.XDirection().XYZ() * theSize;
1300 gp_Pnt aV7 = aTopRight.XYZ() - aPln.XDirection().XYZ() * theSize;
1302 gp_Dir aRight ((gp_Vec(aTopRight, aV7) ^ gp_Vec(aTopRight, aV2)).XYZ());
1303 gp_Dir aFront ((gp_Vec(aV3, aV4) ^ gp_Vec(aV3, aV5)).XYZ());
1306 addTriangle (0, aBottomLeft, aV2, aV3, -thePosition.Direction());
1307 addTriangle (1, aBottomLeft, aV3, aV4, -thePosition.Direction());
1310 addTriangle (2, aV3, aV5, aV4, -aFront);
1311 addTriangle (3, aV3, aTopRight, aV5, -aFront);
1314 addTriangle (4, aBottomLeft, aV7, aV2, aFront);
1315 addTriangle (5, aBottomLeft, aV6, aV7, aFront);
1318 addTriangle (6, aV7, aV6, aV5, thePosition.Direction());
1319 addTriangle (7, aTopRight, aV7, aV5, thePosition.Direction());
1322 addTriangle (8, aV6, aV4, aV5, aRight);
1323 addTriangle (9, aBottomLeft, aV4, aV6, aRight);
1326 addTriangle (10, aV3, aV7, aTopRight, -aRight);
1327 addTriangle (11, aV3, aV2, aV7, -aRight);
1330 //=======================================================================
1332 //function : addTriangle
1334 //=======================================================================
1335 void AIS_Manipulator::Cube::addTriangle (const Standard_Integer theIndex,
1336 const gp_Pnt& theP1, const gp_Pnt& theP2, const gp_Pnt& theP3,
1337 const gp_Dir& theNormal)
1339 myTriangulation->SetNode (theIndex * 3 + 1, theP1);
1340 myTriangulation->SetNode (theIndex * 3 + 2, theP2);
1341 myTriangulation->SetNode (theIndex * 3 + 3, theP3);
1343 myTriangulation->SetTriangle (theIndex + 1, Poly_Triangle (theIndex * 3 + 1, theIndex * 3 + 2, theIndex * 3 + 3));
1344 myArray->AddVertex (theP1, theNormal);
1345 myArray->AddVertex (theP2, theNormal);
1346 myArray->AddVertex (theP3, theNormal);
1349 //=======================================================================
1353 //=======================================================================
1354 void AIS_Manipulator::Sector::Init (const Standard_ShortReal theRadius,
1355 const gp_Ax1& thePosition,
1356 const gp_Dir& theXDirection,
1357 const Standard_Integer theSlicesNb,
1358 const Standard_Integer theStacksNb)
1360 Prs3d_ToolSector aTool(theRadius, theSlicesNb, theStacksNb);
1361 gp_Ax3 aSystem(thePosition.Location(), thePosition.Direction(), theXDirection);
1363 aTrsf.SetTransformation(aSystem, gp_Ax3());
1364 myArray = aTool.CreateTriangulation (aTrsf);
1365 myTriangulation = aTool.CreatePolyTriangulation (aTrsf);
1368 //=======================================================================
1370 //function : Constructor
1372 //=======================================================================
1373 AIS_Manipulator::Axis::Axis (const gp_Ax1& theAxis,
1374 const Quantity_Color& theColor,
1375 const Standard_ShortReal theLength)
1376 : myReferenceAxis (theAxis),
1377 myPosition (theAxis),
1379 myHasTranslation (Standard_True),
1380 myLength (theLength),
1381 myAxisRadius (0.5f),
1382 myHasScaling (Standard_True),
1384 myHasRotation (Standard_True),
1385 myInnerRadius (myLength + myBoxSize),
1386 myDiskThickness (myBoxSize * 0.5f),
1388 myHasDragging(Standard_True),
1389 myFacettesNumber (20),
1390 myCircleRadius (myLength + myBoxSize + myBoxSize * 0.5f * 0.5f)
1395 //=======================================================================
1397 //function : Compute
1399 //=======================================================================
1401 void AIS_Manipulator::Axis::Compute (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
1402 const Handle(Prs3d_Presentation)& thePrs,
1403 const Handle(Prs3d_ShadingAspect)& theAspect)
1405 if (myHasTranslation)
1407 const Standard_Real anArrowLength = 0.25 * myLength;
1408 const Standard_Real aCylinderLength = myLength - anArrowLength;
1409 myArrowTipPos = gp_Pnt (0.0, 0.0, 0.0).Translated (myReferenceAxis.Direction().XYZ() * aCylinderLength);
1411 myTriangleArray = Prs3d_Arrow::DrawShaded (gp_Ax1(gp::Origin(), myReferenceAxis.Direction()),
1417 myTranslatorGroup = thePrs->NewGroup();
1418 myTranslatorGroup->SetClosed (true);
1419 myTranslatorGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
1420 myTranslatorGroup->AddPrimitiveArray (myTriangleArray);
1422 if (myHighlightTranslator.IsNull())
1424 myHighlightTranslator = new Prs3d_Presentation (thePrsMgr->StructureManager());
1428 myHighlightTranslator->Clear();
1431 Handle(Graphic3d_Group) aGroup = myHighlightTranslator->CurrentGroup();
1432 aGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
1433 aGroup->AddPrimitiveArray (myTriangleArray);
1439 myCubePos = myReferenceAxis.Direction().XYZ() * (myLength + myIndent);
1440 myCube.Init (gp_Ax1 (myCubePos, myReferenceAxis.Direction()), myBoxSize);
1442 myScalerGroup = thePrs->NewGroup();
1443 myScalerGroup->SetClosed (true);
1444 myScalerGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
1445 myScalerGroup->AddPrimitiveArray (myCube.Array());
1447 if (myHighlightScaler.IsNull())
1449 myHighlightScaler = new Prs3d_Presentation (thePrsMgr->StructureManager());
1453 myHighlightScaler->Clear();
1456 Handle(Graphic3d_Group) aGroup = myHighlightScaler->CurrentGroup();
1457 aGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
1458 aGroup->AddPrimitiveArray (myCube.Array());
1464 myCircleRadius = myInnerRadius + myIndent * 2 + myDiskThickness * 0.5f;
1465 myCircle.Init (myInnerRadius + myIndent * 2, myInnerRadius + myDiskThickness + myIndent * 2, gp_Ax1(gp::Origin(), myReferenceAxis.Direction()), myFacettesNumber * 2);
1466 myRotatorGroup = thePrs->NewGroup ();
1467 myRotatorGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
1468 myRotatorGroup->AddPrimitiveArray (myCircle.Array());
1470 if (myHighlightRotator.IsNull())
1472 myHighlightRotator = new Prs3d_Presentation (thePrsMgr->StructureManager());
1476 myHighlightRotator->Clear();
1479 Handle(Graphic3d_Group) aGroup = myHighlightRotator->CurrentGroup();
1480 aGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
1481 aGroup->AddPrimitiveArray (myCircle.Array());
1488 if (myReferenceAxis.Direction().X() > 0)
1489 aXDirection = gp::DY();
1490 else if (myReferenceAxis.Direction().Y() > 0)
1491 aXDirection = gp::DZ();
1493 aXDirection = gp::DX();
1495 mySector.Init(myInnerRadius + myIndent * 2, gp_Ax1(gp::Origin(), myReferenceAxis.Direction()), aXDirection, myFacettesNumber * 2);
1496 myDraggerGroup = thePrs->NewGroup();
1498 Handle(Graphic3d_AspectFillArea3d) aFillArea = new Graphic3d_AspectFillArea3d();
1499 myDraggerGroup->SetGroupPrimitivesAspect(aFillArea);
1500 myDraggerGroup->AddPrimitiveArray(mySector.Array());
1502 if (myHighlightDragger.IsNull())
1504 myHighlightDragger = new Prs3d_Presentation(thePrsMgr->StructureManager());
1508 myHighlightDragger->Clear();
1511 Handle(Graphic3d_Group) aGroup = myHighlightDragger->CurrentGroup();
1512 aGroup->SetGroupPrimitivesAspect(aFillArea);
1513 aGroup->AddPrimitiveArray(mySector.Array());