// Created on: 1998-09-07 // Created by: Denis PASCAL // Copyright (c) 1998-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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include IMPLEMENT_STANDARD_RTTIEXT(DDataStd_DrawDriver,Standard_Transient) // attribut affichable // drawable object static Standard_Integer DISCRET = 100; static Standard_Integer NBISOS = 10; static Standard_Real THESIZE = 1000.; static Handle(DDataStd_DrawDriver) DrawDriver; Handle(DDataStd_DrawDriver) DDataStd_DrawDriver::Get () {return DrawDriver; } void DDataStd_DrawDriver::Set (const Handle(DDataStd_DrawDriver)& DD) {DrawDriver = DD; } //======================================================================= //function : Displayer //purpose : //======================================================================= DDataStd_DrawDriver::DDataStd_DrawDriver () {} //======================================================================= //function : Geometry //purpose : //======================================================================= static TopoDS_Shape Geometry (const Handle(TDataXtd_Constraint)& A, const Standard_Integer i, TopAbs_ShapeEnum T) { TopoDS_Shape S = TNaming_Tool::GetShape(A->GetGeometry(i)); if (!S.IsNull()) { if (T != TopAbs_SHAPE && T != S.ShapeType()) S.Nullify(); } return S; } //======================================================================= //function : Drawable //purpose : //======================================================================= Handle(Draw_Drawable3D) DDataStd_DrawDriver::Drawable (const TDF_Label& L) const { // CONSTRAINT Handle(TDataXtd_Constraint) CTR; if (L.FindAttribute(TDataXtd_Constraint::GetID(),CTR)) { return DrawableConstraint(CTR); } // OBJECT TopoDS_Shape s; //Handle(TDataStd_Object) OBJ; //if (L.FindAttribute(TDataStd_Object::GetID(),OBJ)) { // return DrawableShape (L,Draw_vert); //} // DATUM Handle(TDataXtd_Point) POINT; if (L.FindAttribute(TDataXtd_Point::GetID(),POINT)) { return DrawableShape (L,Draw_magenta,Standard_False); } Handle(TDataXtd_Axis) AXIS; if (L.FindAttribute(TDataXtd_Axis::GetID(),AXIS)) { return DrawableShape (L,Draw_magenta,Standard_False); } Handle(TDataXtd_Plane) PLANE; if (L.FindAttribute(TDataXtd_Plane::GetID(),PLANE)) { return DrawableShape(L,Draw_magenta,Standard_False); } // Standard GEOMETRY Handle(TDataXtd_Geometry) STD_GEOM; if (L.FindAttribute(TDataXtd_Geometry::GetID(),STD_GEOM)) { switch (STD_GEOM->GetType()) { case TDataXtd_POINT : { return DrawableShape(L,Draw_jaune,Standard_False); } case TDataXtd_LINE : case TDataXtd_CIRCLE : case TDataXtd_ELLIPSE : case TDataXtd_SPLINE : { return DrawableShape(L,Draw_cyan,Standard_False); } case TDataXtd_ANY_GEOM : { break; } default : { break; } } } // PURE SHAPE Handle(TNaming_NamedShape) NS; if (L.FindAttribute(TNaming_NamedShape::GetID(),NS)) { return DrawableShape (NS->Label(),Draw_jaune); } Handle(Draw_Drawable3D) D3D; return D3D; } //======================================================================= //function : DrawableConstraint //purpose : //======================================================================= Handle(Draw_Drawable3D) DDataStd_DrawDriver::DrawableConstraint (const Handle(TDataXtd_Constraint)& A) const { Handle(DrawDim_Dimension) D; switch (A->GetType()) { case TDataXtd_RADIUS: { if (A->IsPlanar()) { D = new DrawDim_PlanarRadius (TNaming_Tool::GetShape(A->GetGeometry(1))); } else { TopoDS_Shape aLocalShape = Geometry(A,1,TopAbs_FACE); TopoDS_Face F1 = TopoDS::Face(aLocalShape); // TopoDS_Face F1 = TopoDS::Face(Geometry(A,1,TopAbs_FACE)); if (!F1.IsNull()) D = new DrawDim_Radius(F1); } } break; case TDataXtd_DIAMETER: if (A->IsPlanar()) { D = new DrawDim_PlanarDiameter (TNaming_Tool::GetShape(A->GetGeometry(1))); } break; case TDataXtd_MINOR_RADIUS: break; case TDataXtd_MAJOR_RADIUS: break; case TDataXtd_TANGENT: break; case TDataXtd_PARALLEL: break; case TDataXtd_PERPENDICULAR: break; case TDataXtd_CONCENTRIC: break; case TDataXtd_COINCIDENT: break; case TDataXtd_DISTANCE: { if (A->IsPlanar()) { D = new DrawDim_PlanarDistance (TNaming_Tool::GetShape(A->GetGeometry(1)), TNaming_Tool::GetShape(A->GetGeometry(2))); } break; } case TDataXtd_ANGLE: { if (A->IsPlanar()) { Handle(DrawDim_PlanarAngle) DAng = new DrawDim_PlanarAngle (TNaming_Tool::GetShape(A->GetGeometry(1)), TNaming_Tool::GetShape(A->GetGeometry(2))); DAng->Sector(A->Reversed(),A->Inverted()); TopoDS_Shape aLocalShape = TNaming_Tool::GetShape(A->GetPlane()); DAng->SetPlane(TopoDS::Face(aLocalShape)); // DAng->SetPlane(TopoDS::Face(TNaming_Tool::GetShape(A->GetPlane()))); D = DAng; } else { TopoDS_Shape aLocalShape = Geometry(A,1,TopAbs_FACE); TopoDS_Face F1 = TopoDS::Face(aLocalShape); aLocalShape = Geometry(A,2,TopAbs_FACE); TopoDS_Face F2 = TopoDS::Face(aLocalShape); // TopoDS_Face F1 = TopoDS::Face(Geometry(A,1,TopAbs_FACE)); // TopoDS_Face F2 = TopoDS::Face(Geometry(A,2,TopAbs_FACE)); if (!F1.IsNull() && !F2.IsNull()) D = new DrawDim_Angle(F1,F2); } } break; case TDataXtd_EQUAL_RADIUS: { } break; case TDataXtd_SYMMETRY: break; case TDataXtd_MIDPOINT: break; case TDataXtd_EQUAL_DISTANCE: break; case TDataXtd_FIX: break; case TDataXtd_RIGID: break; case TDataXtd_FROM: break; case TDataXtd_AXIS: break; case TDataXtd_MATE: { TopoDS_Shape aLocalShape = Geometry(A,1,TopAbs_FACE); TopoDS_Face F1 = TopoDS::Face(aLocalShape); aLocalShape = Geometry(A,2,TopAbs_FACE); TopoDS_Face F2 = TopoDS::Face(aLocalShape); // TopoDS_Face F1 = TopoDS::Face(Geometry(A,1,TopAbs_FACE)); // TopoDS_Face F2 = TopoDS::Face(Geometry(A,2,TopAbs_FACE)); if (!F1.IsNull() && !F2.IsNull()) D = new DrawDim_Distance(F1,F2); } break; case TDataXtd_ALIGN_FACES: { TopoDS_Shape aLocalShape = Geometry(A,1,TopAbs_FACE) ; TopoDS_Face F1 = TopoDS::Face(aLocalShape); aLocalShape = Geometry(A,2,TopAbs_FACE) ; TopoDS_Face F2 = TopoDS::Face(aLocalShape); // TopoDS_Face F1 = TopoDS::Face(Geometry(A,1,TopAbs_FACE)); // TopoDS_Face F2 = TopoDS::Face(Geometry(A,2,TopAbs_FACE)); if (!F1.IsNull() && !F2.IsNull()) D = new DrawDim_Distance(F1,F2); } break; case TDataXtd_ALIGN_AXES: break; case TDataXtd_AXES_ANGLE: break; case TDataXtd_FACES_ANGLE: break; case TDataXtd_ROUND: break; case TDataXtd_OFFSET : break; } if (!D.IsNull()) { if (!A->GetValue().IsNull()) { Standard_Real val = A->GetValue()->Get(); Standard_DISABLE_DEPRECATION_WARNINGS if (A->GetValue()->GetDimension() == TDataStd_ANGULAR) val = (180. * val) / M_PI; Standard_ENABLE_DEPRECATION_WARNINGS D->SetValue(val); } // unverified constraints are red (default is white) if (!A->Verified()) D->TextColor(Draw_rouge); } return D; } //======================================================================= //function : DrawableShape //purpose : //======================================================================= Handle(Draw_Drawable3D) DDataStd_DrawDriver::DrawableShape (const TDF_Label& L, const Draw_ColorKind color, const Standard_Boolean current) const { Handle(Draw_Drawable3D) DS; Handle(TNaming_NamedShape) NS; if (L.FindAttribute(TNaming_NamedShape::GetID(),NS)) { TopoDS_Shape S; if (current) S = TNaming_Tool::CurrentShape (NS); else S = TNaming_Tool::GetShape (NS); DS = DrawableShape (S,color); } return DS; } //======================================================================= //function : DrawableShape //purpose : //======================================================================= Handle(Draw_Drawable3D) DDataStd_DrawDriver::DrawableShape (const TopoDS_Shape& s, const Draw_ColorKind color) { Handle(DBRep_DrawableShape) DS; DS = new DBRep_DrawableShape (s,color,color,color,Draw_bleu,THESIZE,NBISOS,DISCRET); return DS; }