// Created on: 1993-07-21 // Created by: Remi LEQUETTE // Copyright (c) 1993-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 // memory management #ifdef _WIN32 extern Draw_Viewer dout; #endif #define Characters(IArg) (strspn (Arg[IArg], "0123456789.+-eE") != strlen (Arg[IArg])) #define Float(IArg) (strspn (Arg[IArg], "0123456789+-") != strlen (Arg[IArg])) //========================================== // useful methods //========================================== Standard_EXPORT void DBRep_WriteColorOrientation () { std::cout << "\nrouge FORWARD"; std::cout << "\nbleu REVERSED"; std::cout << "\nrose EXTERNAL"; std::cout << "\norange INTERNAL"<ChangeNbIsos (NbIsos) ; } else { di << "Number of isos for " << Arg[IArg] << " : " << Shape2->NbIsos() << "\n"; } } } } if (Change) dout.RepaintAll() ; } return 0 ; } //======================================================================= // hlr //======================================================================= static Standard_Integer hlr (Draw_Interpretor& di, Standard_Integer n, const char **a) { if (n <= 1) { if (withHLR) { di << " HLR"; if (withRgN) di << " RgNLines"; else { if (withRg1) di << " Rg1Lines"; else di << " no RegLines"; } if (withHid) di << " HiddenLines"; else di << " no HiddenLines"; di << "\n"; if (withHLR) { di << "Angle of discretization : "; di << anglHLR * 180 / M_PI << " degrees\n"; } } else di << " wireframe"; di << "\n"; return 0 ; } if (n == 2) { if (!strcasecmp(a[1],"nohlr")) withHLR = Standard_False; else if (!strcasecmp(a[1],"hlr" )) withHLR = Standard_True; else if (!strcasecmp(a[1],"nohid")) withHid = Standard_False; else if (!strcasecmp(a[1],"hid" )) { withHLR = Standard_True; withHid = Standard_True; } else if (!strcasecmp(a[1],"norg1")) { withRg1 = Standard_False; withRgN = Standard_False; } else if (!strcasecmp(a[1],"rg1" )) { withHLR = Standard_True; withRg1 = Standard_True; withRgN = Standard_False; } else if (!strcasecmp(a[1],"norgn")) { withRgN = Standard_False; } else if (!strcasecmp(a[1],"rgn" )) { withHLR = Standard_True; withRg1 = Standard_True; withRgN = Standard_True; } else if (!strcasecmp(a[1],"ang" )) { di << "Angle de discretisation : "; di << anglHLR * 180 / M_PI << " degres\n"; } else return 1; } Standard_Integer nFirst = 2; if (n >= 3 && !strcasecmp(a[1],"ang" )) { nFirst = 3; if (n == 3) { Standard_Real ang = Draw::Atof(a[2]); anglHLR = ang * M_PI / 180; if (anglHLR < HAngMin) anglHLR = HAngMin; if (anglHLR > HAngMax) anglHLR = HAngMax; } di << "Angle of discretization : "; di << anglHLR * 180 / M_PI << " degrees\n"; } if (n >= nFirst + 1) { for (Standard_Integer i = nFirst ; i < n; i++) { Handle (Draw_Drawable3D) D = Draw::Get (a[i]) ; if (!D.IsNull()) { Handle (DBRep_DrawableShape) S = Handle (DBRep_DrawableShape)::DownCast (D) ; if (!S.IsNull()) { Standard_Boolean localHLR, localRg1, localRgN, localHid; Standard_Real localAng; S->GetDisplayHLR(localHLR, localRg1, localRgN, localHid, localAng); if (!strcasecmp(a[1],"nohlr")) localHLR = Standard_False; else if (!strcasecmp(a[1],"hlr" )) localHLR = Standard_True; else if (!strcasecmp(a[1],"nohid")) localHid = Standard_False; else if (!strcasecmp(a[1],"hid" )) { localHLR = Standard_True; localHid = Standard_True; } else if (!strcasecmp(a[1],"norg1")) { localRg1 = Standard_False; localRgN = Standard_False; } else if (!strcasecmp(a[1],"rg1" )) { localHLR = Standard_True; localRg1 = Standard_True; localRgN = Standard_False; } else if (!strcasecmp(a[1],"norgn")) { localRgN = Standard_False; } else if (!strcasecmp(a[1],"rgn" )) { localHLR = Standard_True; localRg1 = Standard_True; localRgN = Standard_True; } else if (!strcasecmp(a[1],"ang" )) { Standard_Real ang = Draw::Atof(a[2]); localAng = ang * M_PI / 180; } else return 1; S->DisplayHLR(localHLR, localRg1, localRgN, localHid, localAng); } } } } dout.RepaintAll() ; return 0 ; } //======================================================================= // dispor, dispcon //======================================================================= static Standard_Integer dispor (Draw_Interpretor& , Standard_Integer n, const char** a) { Standard_Boolean d = !strcasecmp(a[0],"vori"); if (d) DBRep_WriteColorOrientation(); Standard_Integer i; for (i = 1; i < n; i++) { Handle(Draw_Drawable3D) d1 = Draw::Get(a[i]); if (!d1.IsNull()) { Handle(DBRep_DrawableShape) d2 = Handle(DBRep_DrawableShape)::DownCast(d1); if (!d2.IsNull()) { d2->DisplayOrientation(d); Draw::Repaint(); } } } return 0; } //======================================================================= // discretisation //======================================================================= static Standard_Integer discretisation(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n <= 1) di << "Current number of points : "<DisplayTriangulation(!(d2->DisplayTriangulation())); } } } } Draw::Repaint(); return 0; } //======================================================================= // tclean //======================================================================= static Standard_Integer tclean(Draw_Interpretor& , Standard_Integer n, const char** a) { if (n == 1) return 1; Standard_Integer aStart = 1; Standard_Boolean toRemoveGeometry = Standard_False; if (strcmp(a[1], "-geom") == 0) { aStart++; toRemoveGeometry = Standard_True; } for (Standard_Integer i = aStart; i < n; i++) { TopoDS_Shape S = DBRep::Get(a[i]); if (toRemoveGeometry) BRepTools::CleanGeometry(S); else BRepTools::Clean(S); } return 0; } //======================================================================= // polygons //======================================================================= static Standard_Integer polygons(Draw_Interpretor& , Standard_Integer n, const char** a) { if (n < 1) return 1; if (n == 1) { disppolygons = !disppolygons; #ifdef OCCT_DEBUG if (disppolygons) std::cout <<"Polygons are always displayed"<DisplayPolygons(!(d2->DisplayPolygons())); } } } } Draw::Repaint(); return 0; } //======================================================================= // compound //======================================================================= static Standard_Integer compound(Draw_Interpretor& , Standard_Integer n, const char** a) { if (n <= 1) return 1; BRep_Builder B; TopoDS_Compound C; B.MakeCompound(C); for (Standard_Integer i = 1; i < n-1; i++) { TopoDS_Shape S2 = DBRep::Get(a[i]); if (!S2.IsNull()) B.Add(C,S2); } DBRep::Set(a[n-1],C); return 0; } //======================================================================= // emptycopy //======================================================================= static Standard_Integer emptycopy(Draw_Interpretor& , Standard_Integer n, const char** a) { if (n <= 1) return 1; TopoDS_Shape S = DBRep::Get(a[(n == 2) ? 1 : 2]); if (S.IsNull()) return 1; S.EmptyCopy(); DBRep::Set(a[1],S); return 0; } //======================================================================= // add //======================================================================= static Standard_Integer add(Draw_Interpretor& , Standard_Integer n, const char** a) { if (n < 3) return 1; BRep_Builder B; TopoDS_Shape S1 = DBRep::Get(a[1]); if (S1.IsNull()) return 1; TopoDS_Shape S2 = DBRep::Get(a[2]); if (S2.IsNull()) return 1; B.Add(S2,S1); DBRep::Set(a[2],S2); return 0; } //======================================================================= // explode //======================================================================= static Standard_Integer explode(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n <= 1) return 1; TopoDS_Shape S = DBRep::Get(a[1]); if (S.IsNull()) return 0; char newname[1024]; strcpy(newname,a[1]); char* p = newname; while (*p != '\0') p++; *p = '_'; p++; Standard_Integer i = 0; if (n == 2) { TopoDS_Iterator itr(S); while (itr.More()) { i++; Sprintf(p,"%d",i); DBRep::Set(newname,itr.Value()); di.AppendElement(newname); itr.Next(); } } else { // explode a type TopAbs_ShapeEnum typ; switch (a[2][0]) { case 'C' : case 'c' : if ((a[2][1] == 'd')||(a[2][1] == 'D')) typ = TopAbs_COMPOUND; else typ = TopAbs_COMPSOLID; break; case 'S' : case 's' : if ((a[2][1] == 'O')||(a[2][1] == 'o')) typ = TopAbs_SOLID; else if ((a[2][1] == 'H')||(a[2][1] == 'h')) typ = TopAbs_SHELL; else return 1; break; case 'F' : case 'f' : typ = TopAbs_FACE; break; case 'W' : case 'w' : typ = TopAbs_WIRE; break; case 'E' : case 'e' : typ = TopAbs_EDGE; break; case 'V' : case 'v' : typ = TopAbs_VERTEX; break; default : return 1; } TopTools_MapOfShape M; M.Add(S); TopExp_Explorer ex(S,typ); for (; ex.More(); ex.Next()) { const TopoDS_Shape& Sx = ex.Current(); Standard_Boolean added = M.Add(Sx); if (added) { i++; Sprintf(p,"%d",i); DBRep::Set(newname,Sx); di.AppendElement(newname); } } } return 0; } //======================================================================= // nexplode : stable numbered explode (from Serguey Nizhny) //======================================================================= static Standard_Integer nexplode(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n <= 2) return 1; TopoDS_Shape S = DBRep::Get(a[1]); if (S.IsNull()) return 0; char newname[1024]; strcpy(newname,a[1]); char* p = newname; while (*p != '\0') p++; *p = '_'; p++; TopAbs_ShapeEnum typ; // explode a type switch (a[2][0]) { case 'F' : case 'f' : typ = TopAbs_FACE; break; case 'E' : case 'e' : typ = TopAbs_EDGE; break; case 'V' : case 'v' : typ = TopAbs_VERTEX; break; default : return 1; } TopTools_IndexedMapOfShape IMOStmp; TopTools_MapOfShape MShape; IMOStmp.Add(S); TopExp::MapShapes(S,typ,IMOStmp); TopExp_Explorer Exp(S,typ); Standard_Integer MaxShapes, Index = 0; MaxShapes = IMOStmp.Extent()-1; TopTools_Array1OfShape aShapes(1,MaxShapes); // explode while (Exp.More()) { if (MShape.Add(Exp.Current())) { Index++; aShapes.SetValue(Index,Exp.Current()); } Exp.Next(); } // TColStd_Array1OfInteger OrderInd(1,MaxShapes); gp_Pnt GPoint; GProp_GProps GPr; Standard_Integer aTemp; TColStd_Array1OfReal MidXYZ(1,MaxShapes); //X,Y,Z; Standard_Boolean NoSort = Standard_True; // // Computing of CentreOfMass for edge and face // and for vertex use its point for (Index=1; Index <= MaxShapes; Index++) { OrderInd.SetValue(Index,Index); const TopoDS_Shape& aS = aShapes(Index); if (aS.ShapeType() != TopAbs_VERTEX) { BRepGProp::LinearProperties(aS, GPr); GPoint = GPr.CentreOfMass(); } else { GPoint = BRep_Tool::Pnt(TopoDS::Vertex(aS)); } MidXYZ.SetValue(Index, GPoint.X()*999 + GPoint.Y()*99 + GPoint.Z()*0.9); } // Sorting while(NoSort) { NoSort = Standard_False; for (Index=1; Index < MaxShapes; Index++) { if (MidXYZ(OrderInd(Index)) > MidXYZ(OrderInd(Index+1))) { aTemp = OrderInd(Index); OrderInd(Index) = OrderInd(Index+1); OrderInd(Index+1) = aTemp; NoSort = Standard_True; } } } // Check of equality of MidXYZ for (Index=1; Index < MaxShapes; Index++) { if (MidXYZ(OrderInd(Index+1)) == MidXYZ(OrderInd(Index))) di<<"Warning! For this shape the results may be incorrect.\n"; } for (Index=1 ;Index <= MaxShapes; Index++) { Sprintf(p,"%d",Index); DBRep::Set(newname,aShapes(OrderInd(Index))); di.AppendElement(newname); } return 0; } //======================================================================= // exwire //======================================================================= static Standard_Integer exwire(Draw_Interpretor& , Standard_Integer n, const char** a) { if (n <= 1) return 1; TopoDS_Shape S = DBRep::Get(a[1]); if (S.IsNull()) return 0; if (S.ShapeType() != TopAbs_WIRE) return 0; char newname[1024]; strcpy(newname,a[1]); char* p = newname; while (*p != '\0') p++; *p = '_'; p++; Standard_Integer i = 0; BRepTools_WireExplorer ex(TopoDS::Wire(S)); while (ex.More()) { i++; Sprintf(p,"%d",i); DBRep::Set(newname,ex.Current()); ex.Next(); } return 0; } //======================================================================= // invert //======================================================================= static Standard_Integer invert(Draw_Interpretor& , Standard_Integer n, const char** a) { if (n <= 1) return 1; TopoDS_Shape S = DBRep::Get(a[1]); if (S.IsNull()) return 0; BRep_Builder B; TopoDS_Shape NS = S.EmptyCopied(); NS.Closed (S.Closed()); TopoDS_Iterator itr(S); while (itr.More()) { B.Add(NS,itr.Value().Reversed()); itr.Next(); } DBRep::Set(a[1],NS); return 0; } //======================================================================= // orientation, reverse, complement //======================================================================= static Standard_Integer orientation(Draw_Interpretor& , Standard_Integer n, const char** a) { if (n <= 1) return 1; Standard_Integer cas = 0; TopAbs_Orientation ori=TopAbs_FORWARD; Standard_Integer last = n; if (!strcasecmp(a[0],"orientation")) { if (n <= 2) return 1; last--; switch (*a[n-1]) { case 'F' : ori = TopAbs_FORWARD; break; case 'R' : ori = TopAbs_REVERSED; break; case 'I' : ori = TopAbs_INTERNAL; break; case 'E' : ori = TopAbs_EXTERNAL; break; } } else if (!strcasecmp(a[0],"treverse")) { cas = -1; } else if (!strcasecmp(a[0],"complement")) { cas = -2; } for (Standard_Integer i = 1; i < last; i++) { TopoDS_Shape S = DBRep::Get(a[i]); if (!S.IsNull()) { if (cas == -2) S.Complement(); else if (cas == -1) S.Reverse(); else S.Orientation(ori); DBRep::Set(a[i],S); } } return 0; } #include //======================================================================= // numshapes same as nbshapes but the output is cout //======================================================================= static Standard_Integer numshapes(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n < 2) return 1; Standard_Integer i; TopExp_Explorer ex; for (i = 1; i < n; i++) { TopoDS_Shape S = DBRep::Get(a[i]); if (!S.IsNull()) { BRepTools_ShapeSet BS; BS.Add(S); di <<"Number of shapes in "<. //======================================================================= static void DumpExtent(const TopoDS_Shape& aS, TCollection_AsciiString& aStr) { const int aNbTypes=8; const char *pNames[aNbTypes+1]={ " SHAPE : ", " COMPOUND : ", " COMPSOLID : ", " SOLID : ", " SHELL : ", " FACE : ", " WIRE : ", " EDGE : ", " VERTEX : " }; Standard_Integer i, aNb, aNbSh; TopAbs_ShapeEnum aType; TopTools_IndexedMapOfShape aM; // aNbSh=0; // for (i=aNbTypes-1; i>=0; --i) { aM.Clear(); aType=(TopAbs_ShapeEnum)i; TopExp::MapShapes(aS, aType, aM); aNb=aM.Extent(); aStr=aStr+pNames[i+1]+TCollection_AsciiString(aNb)+"\n"; aNbSh+=aNb; } aStr=aStr+pNames[0]+TCollection_AsciiString(aNbSh)+"\n"; } //======================================================================= // nbshapes //======================================================================= static Standard_Integer nbshapes(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n < 2) return 1; Standard_Integer i; Standard_Boolean aTotal; TopExp_Explorer ex; // aTotal = !strcmp(a[n-1], "-t") ? Standard_True : Standard_False; // for (i = 1; i < n; i++) { TopoDS_Shape S = DBRep::Get(a[i]); if (!S.IsNull()) { di<<"Number of shapes in "<=1\n"; return 1; } } else if (aParam == "-nbalongv" || aParam == "-nbv") { ++anArgIter; aNbAlongV = anArgIter< theArgNum ? Draw::Atoi (theArgs[anArgIter]) : 0; if (aNbAlongV < 1) { std::cout << "Syntax error: NbAlongV should be >=1\n"; return 1; } } else if (aParam == "-nbalong" || aParam == "-nbuv") { ++anArgIter; aNbAlongU = anArgIter< theArgNum ? Draw::Atoi (theArgs[anArgIter]) : 0; aNbAlongV = aNbAlongU; if (aNbAlongU < 1) { std::cout << "Syntax error: NbAlong should be >=1\n"; return 1; } } else if (aParam == "-print") { bPrint = Standard_True; } else { std::cout << "Syntax error: unknown argument '" << aParam << "'\n"; return 1; } } DBRep_WriteColorOrientation(); NCollection_DataMap > > aNormals; if (toUseMesh) { DBRep_DrawableShape::addMeshNormals (aNormals, aShape, aLength); } else { DBRep_DrawableShape::addSurfaceNormals (aNormals, aShape, aLength, aNbAlongU, aNbAlongV); } for (NCollection_DataMap > >::Iterator aFaceIt (aNormals); aFaceIt.More(); aFaceIt.Next()) { Standard_Boolean bReverse = Standard_False; TopAbs_Orientation aFaceOri = aFaceIt.Key().Orientation(); const Draw_Color aColor = DBRep_ColorOrientation (aFaceOri); if (aFaceOri == TopAbs_REVERSED) bReverse = Standard_True; for (NCollection_Vector >::Iterator aNormalsIt (aFaceIt.Value()); aNormalsIt.More(); aNormalsIt.Next()) { const std::pair& aVec = aNormalsIt.Value(); Handle(Draw_Segment3D) aSeg = new Draw_Segment3D(aVec.first, aVec.second, aColor); dout << aSeg; if (bPrint) { // Make the normal vector from the points gp_Vec aV(aVec.first, aVec.second); if (bReverse) aV.Reverse(); // Print values of the vector avoiding printing "-0" values theDI << "(" << (aV.X() == 0 ? 0 : aV.X()) << ", " << (aV.Y() == 0 ? 0 : aV.Y()) << ", " << (aV.Z() == 0 ? 0 : aV.Z()) << ")\n"; } } } return 0; } //======================================================================= //function : Set //purpose : //======================================================================= void DBRep::Set(const Standard_CString Name, const TopoDS_Shape& S) { Handle(DBRep_DrawableShape) D = new DBRep_DrawableShape(S, Draw_vert, Draw_jaune, Draw_rouge, Draw_bleu, size, nbIsos, discret); D->DisplayTriangulation(disptriangles); D->DisplayPolygons(disppolygons); D->DisplayHLR(withHLR,withRg1,withRgN,withHid,anglHLR); Draw::Set(Name,D); } //======================================================================= //function : getShape //purpose : //======================================================================= TopoDS_Shape DBRep::getShape (Standard_CString& theName, TopAbs_ShapeEnum theType, Standard_Boolean theToComplain) { const Standard_Boolean toPick = theName[0] == '.'; Handle(DBRep_DrawableShape) aDrawable = Handle(DBRep_DrawableShape)::DownCast (Draw::Get (theName)); if (aDrawable.IsNull()) { return TopoDS_Shape(); } TopoDS_Shape aShape = aDrawable->Shape(); if (theType != TopAbs_SHAPE && theType != aShape.ShapeType() && toPick) { // try to find prom pick Standard_Real u, v; DBRep_DrawableShape::LastPick (aShape, u, v); } if (theType != TopAbs_SHAPE && theType != aShape.ShapeType()) { if (theToComplain) { std::cout << theName << " is not a "; TopAbs::Print (theType, std::cout); std::cout << " but a "; TopAbs::Print (aShape.ShapeType(), std::cout); std::cout << std::endl; } return TopoDS_Shape(); } return aShape; } static Standard_Integer XProgress (Draw_Interpretor& di, Standard_Integer argc, const char **argv) { for ( Standard_Integer i=1; i < argc; i++ ) { Standard_Boolean turn = Standard_True; if ( argv[i][0] == '-' ) turn = Standard_False; else if ( argv[i][0] != '+' ) continue; TCollection_AsciiString anArgCase (argv[i]); anArgCase.LowerCase(); if ( argv[i][1] == 't' ) Draw_ProgressIndicator::DefaultTclMode() = turn; else if (argv[i][1] == 'c') Draw_ProgressIndicator::DefaultConsoleMode() = turn; else if ( argv[i][1] == 'g' ) Draw_ProgressIndicator::DefaultGraphMode() = turn; else if ( ! strcmp ( argv[i], "-stop" ) && i+1 < argc ) { Standard_Address aPtr = 0; if (sscanf (argv[++i], "%p", &aPtr) == 1) Draw_ProgressIndicator::StopIndicator() = aPtr; return 0; } } di << "Progress Indicator defaults: tcl mode is "; if ( Draw_ProgressIndicator::DefaultTclMode() ) { di<<"ON"; } else { di<<"OFF"; } di<<", console mode is "; if (Draw_ProgressIndicator::DefaultConsoleMode()) { di << "ON"; } else { di << "OFF"; } di << ", graphical mode is "; if ( Draw_ProgressIndicator::DefaultGraphMode() ) { di<<"ON"; } else { di<<"OFF"; } di<< "\n"; return 0; } //======================================================================= // binsave //======================================================================= static Standard_Integer binsave(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n <= 2) return 1; TopoDS_Shape aShape = DBRep::Get (a[1]); if (aShape.IsNull()) { di << a[1] << " is not a shape"; return 1; } if (!BinTools::Write (aShape, a[2])) { di << "Cannot write to the file " << a[2]; return 1; } di << a[1]; return 0; } //======================================================================= // binrestore //======================================================================= static Standard_Integer binrestore(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n <= 2) return 1; TopoDS_Shape aShape; if (!BinTools::Read (aShape, a[1])) { di << "Cannot read from the file " << a[1]; return 1; } DBRep::Set (a[2], aShape); di << a[2]; return 0; } //======================================================================= // removeinternals //======================================================================= static Standard_Integer removeInternals (Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n < 2) { di.PrintHelp (a[0]); return 1; } TopoDS_Shape aShape = DBRep::Get (a[1]); if (aShape.IsNull()) { di << a[1] << "is a null shape\n"; return 1; } Standard_Boolean isForce = Standard_False; if (n > 2) { isForce = (Draw::Atoi (a[2]) != 0); } BRepTools::RemoveInternals (aShape, isForce); DBRep::Set (a[1], aShape); return 0; } //======================================================================= //function : BasicCommands //purpose : //======================================================================= static Standard_Boolean done = Standard_False; void DBRep::BasicCommands(Draw_Interpretor& theCommands) { if (done) return; done = Standard_True; Draw::Commands(theCommands); const char* g = "Basic shape commands"; theCommands.Add("isos","isos [name1 ...] [nbisos]",__FILE__,isos,g); theCommands.Add("hlr" ,"[no]hlr, rg1, rgn, hid, ang",__FILE__,hlr ,g); theCommands.Add("vori","vori [name1 ...], edges are colored by orientation (see vconn)",__FILE__,dispor,g); theCommands.Add("triangles", "triangles [name1]..., display triangles of shapes if exists",__FILE__, triangles, g); theCommands.Add("tclean", "tclean [-geom] [name1]..., depending on using or not key -geom, \n" "\t erase geometry objects from shapes - key is used or \n" "\t erase triangulations and polygons on triangulations from shapes - key is omitted \n", __FILE__, tclean, g); theCommands.Add("polygons", "polygons [name1]..., display polygons of shapes if exists",__FILE__, polygons, g); theCommands.Add("vconn","vconn [name1 ...] , edges are colored by number of faces (see vori)",__FILE__,dispor,g); theCommands.Add("discretisation","discretisation [nbpoints]",__FILE__,discretisation,g); theCommands.Add("compound","compound [name1 name2 ..] compound",__FILE__,compound,g); theCommands.Add("add", "add what where" "\n adds shape \"what\" to shape \"where\" ", __FILE__,add,g); theCommands.Add("explode","explode name [Cd/C/So/Sh/F/W/E/V]",__FILE__,explode,g); theCommands.Add("nexplode","stable numbered explode for vertex, edge and face: nexplode name [V/E/F]",__FILE__,nexplode,g); theCommands.Add("exwire","exwire wirename",__FILE__,exwire,g); theCommands.Add("emptycopy","emptycopy [copyshape] originalshape",__FILE__,emptycopy,g); theCommands.Add("check","check shape1 shape2 ...",__FILE__,check,g); theCommands.Add("orientation","orientation name1 name2.. F/R/E/I",__FILE__,orientation,g); theCommands.Add("treverse","treverse name1 name2 ...",__FILE__,orientation,g); theCommands.Add("complement","complement name1 name2 ...",__FILE__,orientation,g); theCommands.Add("invert","invert name, reverse subshapes",__FILE__,invert,g); theCommands.Add("normals","normals shape [Length {10}] [-NbAlongU {1}] [-NbAlongV {1}] [-UseMesh] [-print], display normals",__FILE__,normals,g); theCommands.Add("nbshapes", "\n nbshapes s - shows the number of sub-shapes in ;\n nbshapes s -t - shows the number of sub-shapes in counting the same sub-shapes with different location as different sub-shapes.", __FILE__,nbshapes,g); theCommands.Add("numshapes","numshapes s; size of shape",__FILE__,numshapes,g); theCommands.Add("countshapes","countshapes s; count of shape",__FILE__,countshapes,g); theCommands.Add("setflags", "setflags shape_name flag1[flag2...]\n sets flags for shape(free, modidfied, checked, orientable, closed, infinite, convex, locked), for exmple or if necessary unflag ", __FILE__,setFlags,g); // theCommands.Add("dumpmmgt", // "dump le contenu du gestionnaire de memoire",__FILE__,dumpmmgt,g); theCommands.Add("purgemmgt", "returns the free memory from the system to the memory manager", __FILE__,purgemmgt,g); // Add command for DRAW-specific ProgressIndicator theCommands.Add ( "XProgress", "XProgress [+|-t] [+|-c] [+|-g]" "\n\t\t The options are:" "\n\t\t +|-t : switch on/off output to tcl of Progress Indicator" "\n\t\t +|-c : switch on/off output to cout of Progress Indicator" "\n\t\t +|-g : switch on/off graphical mode of Progress Indicator", XProgress,"DE: General"); theCommands.Add("binsave", "binsave shape filename\n" "\t\tsave the shape in the binary format file", __FILE__, binsave, g); theCommands.Add("binrestore", "binrestore filename shape\n" "\t\trestore the shape from the binary format file", __FILE__, binrestore, g); theCommands.Add ("removeinternals", "removeinternals shape [force flag {0/1}]" "\n\t\t Removes sub-shapes with internal orientation from the shape.\n" "\n\t\t Force flag disables the check on topological connectivity and" "removes all internal sub-shapes\n", __FILE__, removeInternals, g); } //======================================================================= //function : HLRMode //purpose : //======================================================================= Standard_Boolean DBRep::HLRMode() { return withHLR; } //======================================================================= //function : Rg1Mode //purpose : //======================================================================= Standard_Boolean DBRep::Rg1Mode() { return withRg1; } //======================================================================= //function : RgNMode //purpose : //======================================================================= Standard_Boolean DBRep::RgNMode() { return withRgN; } //======================================================================= //function : HidMode //purpose : //======================================================================= Standard_Boolean DBRep::HidMode() { return withHid; } //======================================================================= //function : HLRAngle //purpose : //======================================================================= Standard_Real DBRep::HLRAngle() { return anglHLR; } //======================================================================= //function : //purpose : save and restore shapes //======================================================================= static Standard_Boolean stest(const Handle(Draw_Drawable3D)& d) { return d->IsInstance(STANDARD_TYPE(DBRep_DrawableShape)); } static void ssave(const Handle(Draw_Drawable3D)&d, std::ostream& OS) { Handle(DBRep_DrawableShape) N = Handle(DBRep_DrawableShape)::DownCast(d); BRep_Builder B; BRepTools_ShapeSet S(B); S.Add (N->Shape()); Handle(Draw_ProgressIndicator) aProgress = Draw::GetProgressBar(); S.Write(OS, Message_ProgressIndicator::Start(aProgress)); if (! aProgress.IsNull() && aProgress->UserBreak()) return; S.Write(N->Shape(),OS); } static Handle(Draw_Drawable3D) srestore (std::istream& IS) { BRep_Builder B; BRepTools_ShapeSet S(B); Handle(Draw_ProgressIndicator) aProgress = Draw::GetProgressBar(); S.Read(IS, Message_ProgressIndicator::Start(aProgress)); Handle(DBRep_DrawableShape) N; if (! aProgress.IsNull() && aProgress->UserBreak()) return N; TopoDS_Shape theShape; S.Read(theShape,IS ); N = new DBRep_DrawableShape(theShape, Draw_vert, Draw_jaune, Draw_rouge, Draw_bleu, size, nbIsos, discret); N->DisplayTriangulation(disptriangles); N->DisplayPolygons(disppolygons); N->DisplayHLR(withHLR,withRg1,withRgN,withHid,anglHLR); return N; } static Draw_SaveAndRestore ssr("DBRep_DrawableShape", stest,ssave,srestore); void dumps (const TopoDS_Shape& S) { BRepTools::Dump(S,std::cout); } //======================================================================= //function : NbIsos //purpose : //======================================================================= Standard_Integer DBRep::NbIsos() { return nbIsos; } //======================================================================= //function : Discretisation //purpose : //======================================================================= Standard_Integer DBRep::Discretisation() { return discret; }