1 // Created on: 1995-08-02
2 // Created by: Arnaud BOUZY/Odile Olivier
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
18 #include <AIS_InteractiveContext.hxx>
19 #include <AIS_Plane.hxx>
20 #include <Aspect_TypeOfLine.hxx>
21 #include <DsgPrs_ShadedPlanePresentation.hxx>
22 #include <DsgPrs_XYZPlanePresentation.hxx>
24 #include <Geom_Axis2Placement.hxx>
25 #include <Geom_Plane.hxx>
26 #include <Geom_Transformation.hxx>
27 #include <GeomAdaptor_Surface.hxx>
29 #include <Graphic3d_ArrayOfQuadrangles.hxx>
30 #include <Graphic3d_AspectFillArea3d.hxx>
31 #include <Graphic3d_AspectLine3d.hxx>
32 #include <Graphic3d_Group.hxx>
33 #include <Graphic3d_MaterialAspect.hxx>
34 #include <Graphic3d_Structure.hxx>
35 #include <Poly_Triangulation.hxx>
36 #include <Precision.hxx>
37 #include <Prs3d_DatumAspect.hxx>
38 #include <Prs3d_Drawer.hxx>
39 #include <Prs3d_LineAspect.hxx>
40 #include <Prs3d_PlaneAspect.hxx>
41 #include <Prs3d_Presentation.hxx>
42 #include <Prs3d_Projector.hxx>
43 #include <Prs3d_ShadingAspect.hxx>
44 #include <Quantity_Color.hxx>
45 #include <Select3D_SensitiveTriangulation.hxx>
46 #include <SelectBasics_EntityOwner.hxx>
47 #include <SelectMgr_EntityOwner.hxx>
48 #include <Standard_Type.hxx>
49 #include <StdPrs_Plane.hxx>
50 #include <StdPrs_ShadedShape.hxx>
51 #include <StdPrs_ShadedSurface.hxx>
52 #include <TColgp_Array1OfPnt.hxx>
53 #include <TColgp_HArray1OfPnt.hxx>
54 #include <TCollection_AsciiString.hxx>
55 #include <UnitsAPI.hxx>
57 IMPLEMENT_STANDARD_RTTIEXT(AIS_Plane,AIS_InteractiveObject)
59 //=======================================================================
60 //function : AIS_Plane
62 //=======================================================================
63 AIS_Plane::AIS_Plane(const Handle(Geom_Plane)& aComponent,
64 const Standard_Boolean aCurrentMode):
65 myComponent(aComponent),
66 myCenter(gp_Pnt(0.,0.,0.)),
67 myCurrentMode(aCurrentMode),
68 myAutomaticPosition(Standard_True),
69 myTypeOfPlane(AIS_TOPL_Unknown),
70 myIsXYZPlane(Standard_False),
71 myTypeOfSensitivity (Select3D_TOS_BOUNDARY)
73 InitDrawerAttributes();
76 //=======================================================================
77 //function : AIS_Plane
78 //purpose : avec une position
79 //=======================================================================
80 AIS_Plane::AIS_Plane(const Handle(Geom_Plane)& aComponent,
81 const gp_Pnt& aCenter,
82 const Standard_Boolean aCurrentMode):
83 myComponent(aComponent),
85 myCurrentMode(aCurrentMode),
86 myAutomaticPosition(Standard_True),
87 myTypeOfPlane(AIS_TOPL_Unknown),
88 myIsXYZPlane(Standard_False),
89 myTypeOfSensitivity (Select3D_TOS_BOUNDARY)
91 InitDrawerAttributes();
94 //=======================================================================
95 //function : AIS_Plane
97 //=======================================================================
98 AIS_Plane::AIS_Plane(const Handle(Geom_Plane)& aComponent,
99 const gp_Pnt& aCenter,
102 const Standard_Boolean aCurrentMode):
103 myComponent(aComponent),
107 myCurrentMode(aCurrentMode),
108 myAutomaticPosition(Standard_False),
109 myTypeOfPlane(AIS_TOPL_Unknown),
110 myIsXYZPlane(Standard_False),
111 myTypeOfSensitivity (Select3D_TOS_BOUNDARY)
113 InitDrawerAttributes();
117 //=======================================================================
118 //function : AIS_Plane
119 //purpose : XYPlane, XZPlane, YZPlane
120 //=======================================================================
121 AIS_Plane::AIS_Plane(const Handle(Geom_Axis2Placement)& aComponent,
122 const AIS_TypeOfPlane aPlaneType,
123 const Standard_Boolean aCurrentMode):
125 myCurrentMode(aCurrentMode),
126 myAutomaticPosition(Standard_True),
127 myTypeOfPlane(aPlaneType),
128 myIsXYZPlane(Standard_True),
129 myTypeOfSensitivity (Select3D_TOS_BOUNDARY)
131 InitDrawerAttributes();
138 //=======================================================================
139 //function : SetComponent
141 //=======================================================================
143 void AIS_Plane::SetComponent(const Handle(Geom_Plane)& aComponent)
145 myComponent = aComponent;
146 myTypeOfPlane = AIS_TOPL_Unknown;
147 myIsXYZPlane = Standard_False;
148 //myCenter = gp_Pnt(0.,0.,0.);
149 myAutomaticPosition = Standard_True;
152 //=======================================================================
155 //=======================================================================
157 AIS_KindOfInteractive AIS_Plane::Type() const
158 {return AIS_KOI_Datum;}
161 //=======================================================================
162 //function : Signature
164 //=======================================================================
166 Standard_Integer AIS_Plane::Signature() const
170 //=======================================================================
171 //function : Axis2Placement
173 //=======================================================================
175 Handle(Geom_Axis2Placement) AIS_Plane::Axis2Placement()
177 Handle(Geom_Axis2Placement) Bid;
178 return IsXYZPlane() ? myAx2:Bid;
180 //=======================================================================
181 //function : SetAxis2Placement
183 //=======================================================================
185 void AIS_Plane::SetAxis2Placement(const Handle(Geom_Axis2Placement)& aComponent,
186 const AIS_TypeOfPlane aPlaneType)
188 myTypeOfPlane = aPlaneType;
189 myIsXYZPlane = Standard_True;
191 myAutomaticPosition = Standard_True;
195 //=======================================================================
196 //function : PlaneAttributes
198 //=======================================================================
199 Standard_Boolean AIS_Plane::PlaneAttributes(Handle(Geom_Plane)& aComponent,
204 Standard_Boolean aStatus (Standard_False);
205 if (!myAutomaticPosition){
206 aComponent = myComponent;
210 aStatus = Standard_True;
215 //=======================================================================
216 //function : SetPlaneAttributes
218 //=======================================================================
219 void AIS_Plane::SetPlaneAttributes(const Handle(Geom_Plane)& aComponent,
220 const gp_Pnt& aCenter,
224 myAutomaticPosition = Standard_False;
225 myComponent = aComponent;
229 myTypeOfPlane = AIS_TOPL_Unknown;
230 myIsXYZPlane = Standard_False;
233 //=======================================================================
236 //=======================================================================
237 void AIS_Plane::Compute(const Handle(PrsMgr_PresentationManager3d)& ,
238 const Handle(Prs3d_Presentation)& aPresentation,
239 const Standard_Integer aMode)
241 aPresentation->Clear();
244 aPresentation->SetInfiniteState(myInfiniteState);
245 myDrawer->PlaneAspect()->EdgesAspect()->SetWidth(myCurrentMode == 0? 1 : 3);
254 const Handle(Geom_Plane)& pl = myComponent;
255 Handle(Geom_Plane) thegoodpl (Handle(Geom_Plane)::DownCast(pl->Translated(pl->Location(),myCenter)));
256 GeomAdaptor_Surface surf(thegoodpl);
257 StdPrs_Plane::Add(aPresentation,surf,myDrawer);
260 DsgPrs_XYZPlanePresentation::Add(aPresentation,myDrawer,myCenter,myPmin,myPmax);
268 Handle(Prs3d_PlaneAspect) theaspect = myDrawer->PlaneAspect();
269 Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation);
270 TheGroup->SetPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
272 const Standard_Real Xmax = 0.5*Standard_Real(theaspect->PlaneXLength());
273 const Standard_Real Ymax = 0.5*Standard_Real(theaspect->PlaneYLength());
275 Handle(Graphic3d_ArrayOfQuadrangles) aQuads = new Graphic3d_ArrayOfQuadrangles(4);
277 myComponent->D0(-Xmax,Ymax,p1);
278 aQuads->AddVertex(p1);
279 myComponent->D0(Xmax,Ymax,p1);
280 aQuads->AddVertex(p1);
281 myComponent->D0(Xmax,-Ymax,p1);
282 aQuads->AddVertex(p1);
283 myComponent->D0(-Xmax,-Ymax,p1);
284 aQuads->AddVertex(p1);
286 TheGroup->AddPrimitiveArray(aQuads);
289 DsgPrs_ShadedPlanePresentation::Add(aPresentation,myDrawer,myCenter,myPmin,myPmax);
295 void AIS_Plane::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation)
297 PrsMgr_PresentableObject::Compute(aProjector, aTransformation, aPresentation);
300 //=======================================================================
301 //function : ComputeSelection
303 //=======================================================================
304 void AIS_Plane::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer /*theMode*/)
306 theSelection->Clear();
307 Handle(SelectMgr_EntityOwner) aSensitiveOwner = new SelectMgr_EntityOwner (this, 10);
308 Handle(Poly_Triangulation) aSensitivePoly;
312 // plane representing rectangle
313 Standard_Real aLengthX = myDrawer->PlaneAspect()->PlaneXLength() / 2.0;
314 Standard_Real aLengthY = myDrawer->PlaneAspect()->PlaneYLength() / 2.0;
315 Handle(Geom_Plane) aPlane =
316 Handle(Geom_Plane)::DownCast (myComponent->Translated (myComponent->Location(), myCenter));
318 TColgp_Array1OfPnt aRectanglePoints (1, 4);
319 aPlane->D0 ( aLengthX, aLengthY, aRectanglePoints.ChangeValue (1));
320 aPlane->D0 ( aLengthX, -aLengthY, aRectanglePoints.ChangeValue (2));
321 aPlane->D0 (-aLengthX, -aLengthY, aRectanglePoints.ChangeValue (3));
322 aPlane->D0 (-aLengthX, aLengthY, aRectanglePoints.ChangeValue (4));
324 Poly_Array1OfTriangle aTriangles (1, 2);
325 aTriangles.ChangeValue (1) = Poly_Triangle (1, 2, 3);
326 aTriangles.ChangeValue (2) = Poly_Triangle (1, 3, 4);
328 aSensitivePoly = new Poly_Triangulation (aRectanglePoints, aTriangles);
332 // plane representing triangle
333 TColgp_Array1OfPnt aTrianglePoints (1, 3);
334 aTrianglePoints.ChangeValue (1) = myCenter;
335 aTrianglePoints.ChangeValue (2) = myPmin;
336 aTrianglePoints.ChangeValue (3) = myPmax;
338 Poly_Array1OfTriangle aTriangles (1, 1);
339 aTriangles.ChangeValue (1) = Poly_Triangle(1, 2, 3);
341 aSensitivePoly = new Poly_Triangulation (aTrianglePoints, aTriangles);
344 Standard_Boolean isSensitiveInterior = myTypeOfSensitivity == Select3D_TOS_INTERIOR;
346 Handle(Select3D_SensitiveTriangulation) aSensitive =
347 new Select3D_SensitiveTriangulation (aSensitiveOwner,
350 isSensitiveInterior);
352 theSelection->Add(aSensitive);
355 //=======================================================================
358 //=======================================================================
359 void AIS_Plane::SetSize(const Standard_Real aLength)
361 SetSize(aLength,aLength);
364 void AIS_Plane::SetSize(const Standard_Real aXLength,
365 const Standard_Real aYLength)
367 //if the plane already has a proper color or size,
368 //there is already a specific PlaneAspect and DatumAspect
370 Handle(Prs3d_PlaneAspect) PA;
371 Handle(Prs3d_DatumAspect) DA;
373 PA = myDrawer->PlaneAspect();
374 DA = myDrawer->DatumAspect();
376 Standard_Boolean yenavaitPA(Standard_True),yenavaitDA(Standard_True);
377 if(myDrawer->HasLink() && myDrawer->Link()->PlaneAspect() == PA){
378 yenavaitPA = Standard_False;
379 PA = new Prs3d_PlaneAspect();}
380 if(myDrawer->HasLink() && myDrawer->Link()->DatumAspect() == DA){
381 yenavaitDA = Standard_False;
382 DA = new Prs3d_DatumAspect();
385 PA->SetPlaneLength(aXLength,aYLength);
386 DA->SetAxisLength(aXLength,aYLength,aXLength);
389 myDrawer->SetPlaneAspect(PA);
391 myDrawer->SetDatumAspect(DA);
394 myHasOwnSize = Standard_True;
400 //=======================================================================
401 //function : UnsetSize
402 //purpose : If there is a color, the size is restaured from the drawer of the context...
403 //=======================================================================
404 void AIS_Plane::UnsetSize()
407 if(!myHasOwnSize) return;
410 myDrawer->SetPlaneAspect (Handle(Prs3d_PlaneAspect)());
411 myDrawer->SetDatumAspect (Handle(Prs3d_DatumAspect)());
414 const Handle(Prs3d_PlaneAspect) PA = myDrawer->HasLink() ? myDrawer->Link()->PlaneAspect() :
415 new Prs3d_PlaneAspect();
416 const Handle(Prs3d_DatumAspect) DA = myDrawer->HasLink() ? myDrawer->Link()->DatumAspect() :
417 new Prs3d_DatumAspect();
419 myDrawer->PlaneAspect()->SetPlaneLength(PA->PlaneXLength(),PA->PlaneYLength());
420 myDrawer->DatumAspect()->SetAxisLength(DA->FirstAxisLength(),
421 DA->SecondAxisLength(),
422 DA->ThirdAxisLength());
425 myHasOwnSize = Standard_False;
431 //=======================================================================
434 //=======================================================================
436 Standard_Boolean AIS_Plane::Size(Standard_Real& X,Standard_Real& Y) const
438 X = myDrawer->PlaneAspect()->PlaneXLength();
439 Y = myDrawer->PlaneAspect()->PlaneYLength();
440 return Abs(X-Y)<=Precision::Confusion();
444 //=======================================================================
445 //function : SetColor
447 //=======================================================================
450 void AIS_Plane::SetColor(const Quantity_NameOfColor aCol)
452 SetColor(Quantity_Color(aCol));
455 void AIS_Plane::SetColor(const Quantity_Color &aCol)
457 // if the plane already has its proper size, there is an already created planeaspect
458 // Standard_Boolean yenadeja = hasOwnColor || myHasOwnSize;
459 Handle(Prs3d_PlaneAspect) PA;
460 Handle(Prs3d_DatumAspect) DA;
462 PA = myDrawer->PlaneAspect();
463 DA = myDrawer->DatumAspect();
465 Standard_Boolean yenavaitPA(Standard_True),yenavaitDA(Standard_True);
466 if(myDrawer->HasLink() && myDrawer->Link()->PlaneAspect() == PA){
467 yenavaitPA = Standard_False;
468 PA = new Prs3d_PlaneAspect();}
469 if(myDrawer->HasLink() && myDrawer->Link()->DatumAspect() == DA){
470 yenavaitDA = Standard_False;
471 DA = new Prs3d_DatumAspect();
474 PA->EdgesAspect()->SetColor(aCol);
475 DA->FirstAxisAspect()->SetColor(aCol);
476 DA->SecondAxisAspect()->SetColor(aCol);
477 DA->ThirdAxisAspect()->SetColor(aCol);
480 myDrawer->SetPlaneAspect(PA);
482 myDrawer->SetDatumAspect(DA);
484 myDrawer->ShadingAspect()->SetColor(aCol);
486 hasOwnColor=Standard_True;
489 //=======================================================================
490 //function : SetColor
492 //=======================================================================
493 void AIS_Plane::UnsetColor()
495 if(!hasOwnColor) return;
498 myDrawer->SetPlaneAspect (Handle(Prs3d_PlaneAspect)());
499 myDrawer->SetDatumAspect (Handle(Prs3d_DatumAspect)());
502 const Handle(Prs3d_PlaneAspect) PA = myDrawer->HasLink() ? myDrawer->Link()->PlaneAspect() :
503 new Prs3d_PlaneAspect();
504 // const Handle(Prs3d_DatumAspect)& DA = myDrawer->Link()->DatumAspect();
505 Quantity_NameOfColor Col = PA->EdgesAspect()->Aspect()->Color().Name();
506 myDrawer->PlaneAspect()->EdgesAspect()->SetColor(Col);
508 myDrawer->DatumAspect()->FirstAxisAspect()->SetColor(Col);
509 myDrawer->DatumAspect()->SecondAxisAspect()->SetColor(Col);
510 myDrawer->DatumAspect()->ThirdAxisAspect()->SetColor(Col);
514 hasOwnColor=Standard_False;
518 //=======================================================================
519 //function : ComputeFrame
521 //=======================================================================
522 void AIS_Plane::ComputeFrame()
525 const Handle(Geom_Plane)& pl = myComponent;
528 if (myAutomaticPosition) {
529 ElSLib::Parameters(pl->Pln(),myCenter,U,V);
530 pl->D0 (U, V, myCenter);
533 Handle(Geom_Plane) thegoodpl (Handle(Geom_Plane)::DownCast(pl->Translated(pl->Location(),myCenter)));
534 ElSLib::Parameters(thegoodpl->Pln(),myPmin,U,V);
538 if (U < 10*Precision::Confusion()) U=0.1;
539 if (V < 10*Precision::Confusion()) V=0.1;
541 myDrawer->PlaneAspect()->SetPlaneLength(U,V);
545 //=======================================================================
547 //purpose : to avoid warning
548 //=======================================================================
549 void AIS_Plane::Compute(const Handle(Prs3d_Projector)&,
550 const Handle(Prs3d_Presentation)&)
554 //=======================================================================
555 //function : ComputeFields
557 //=======================================================================
558 void AIS_Plane::ComputeFields()
561 Handle (Prs3d_DatumAspect) DA = myDrawer->DatumAspect();
563 gp_Pnt Orig = myAx2->Ax2().Location();
564 gp_Dir oX = myAx2->Ax2().XDirection();
565 gp_Dir oY = myAx2->Ax2().YDirection();
566 gp_Dir oZ = myAx2->Ax2().Direction();
568 Standard_Real xo,yo,zo,x1,y1,z1,x2,y2,z2,x3,y3,z3,x4=0,y4=0,z4=0;
569 Standard_Real x5=0,y5=0,z5=0;
570 Orig.Coord(xo,yo,zo);
574 Standard_Real DS1 = DA->FirstAxisLength();
575 Standard_Real DS2 = DA->SecondAxisLength();
576 Standard_Real DS3 = DA->ThirdAxisLength();
579 switch (myTypeOfPlane) {
580 case AIS_TOPL_XYPlane:
583 myComponent = new Geom_Plane(XYP);
584 x4=xo+x1*DS1; y4=yo+y1*DS1; z4=zo+z1*DS1;
585 x5=xo+x2*DS2; y5=yo+y2*DS2; z5=zo+z2*DS2;
588 case AIS_TOPL_XZPlane:
591 myComponent = new Geom_Plane(XZP);
592 x4=xo+x1*DS1; y4=yo+y1*DS1; z4=zo+z1*DS1;
593 x5=xo+x3*DS3; y5=yo+y3*DS3; z5=zo+z3*DS3;
596 case AIS_TOPL_YZPlane:
599 myComponent = new Geom_Plane(XZP);
600 x4=xo+x2*DS2; y4=yo+y2*DS2; z4=zo+z2*DS2;
601 x5=xo+x3*DS3; y5=yo+y3*DS3; z5=zo+z3*DS3;
607 myPmin.SetCoord(x4,y4,z4);
608 myPmax.SetCoord(x5,y5,z5);
612 //=======================================================================
613 //function : InitDrawerAttributes
615 //=======================================================================
617 void AIS_Plane::InitDrawerAttributes()
620 Handle(Prs3d_ShadingAspect) shasp = new Prs3d_ShadingAspect();
621 shasp->SetMaterial(Graphic3d_NOM_PLASTIC);
622 shasp->SetColor(Quantity_NOC_GRAY40);
623 myDrawer->SetShadingAspect(shasp);
624 Handle(Graphic3d_AspectFillArea3d) asf = shasp->Aspect();
625 Graphic3d_MaterialAspect asp = asf->FrontMaterial();
626 asp.SetTransparency(0.8);
627 asf->SetFrontMaterial(asp);
628 asf->SetBackMaterial(asp);
633 //=======================================================================
634 //function : AcceptDisplayMode
636 //=======================================================================
638 Standard_Boolean AIS_Plane::
639 AcceptDisplayMode(const Standard_Integer aMode) const
643 //=======================================================================
644 //function : SetContext
646 //=======================================================================
648 void AIS_Plane::SetContext(const Handle(AIS_InteractiveContext)& Ctx)
650 AIS_InteractiveObject::SetContext(Ctx);