// Created on: 1994-12-13 // Created by: Jacques GOUSSARD // Copyright (c) 1994-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 Standard_IMPORT Draw_Viewer dout; //======================================================================= //function : ConvertBndToShape //purpose : Creates TopoDS_Solid from theBox //======================================================================= static void ConvertBndToShape(const Bnd_OBB& theBox, const char* const theName) { if (theBox.IsVoid()) { DBRep::Set (theName, TopoDS_Shape()); return; } const gp_Pnt &aBaryCenter = theBox.Center(); const gp_XYZ &aXDir = theBox.XDirection(), &aYDir = theBox.YDirection(), &aZDir = theBox.ZDirection(); Standard_Real aHalfX = theBox.XHSize(), aHalfY = theBox.YHSize(), aHalfZ = theBox.ZHSize(); gp_Ax2 anAxes(aBaryCenter, aZDir, aXDir); anAxes.SetLocation(aBaryCenter.XYZ() - aHalfX*aXDir - aHalfY*aYDir - aHalfZ*aZDir); TopoDS_Solid aBox = BRepPrimAPI_MakeBox(anAxes, 2.0*aHalfX, 2.0*aHalfY, 2.0*aHalfZ); DBRep::Set(theName, aBox); } //======================================================================= // addpcurve //======================================================================= static Standard_Integer addpcurve(Draw_Interpretor& , Standard_Integer n, const char** a) { if(n < 4) return 1; TopoDS_Shape E = DBRep::Get(a[1]); if (E.IsNull()) return 1; Handle(Geom2d_Curve) PC = DrawTrSurf::GetCurve2d(a[2]); TopoDS_Shape F = DBRep::Get(a[3]); Standard_Real tol = 1.e-7; if (n > 4) { tol = Draw::Atof(a[4]); } BRep_Builder BB; BB.UpdateEdge(TopoDS::Edge(E), PC, TopoDS::Face(F),tol); DBRep::Set(a[1], E); return 0; } //======================================================================= // transform //======================================================================= static Standard_Integer transform(Draw_Interpretor& ,Standard_Integer n,const char** a) { if (n <= 1) return 1; gp_Trsf T; Standard_Integer last = n; const char* aName = a[0]; Standard_Boolean isBasic = Standard_False; Standard_Boolean isCopy = Standard_False; // Check "copy" flag. if (!strcmp(a[n-1], "-copy")) { isCopy = Standard_True; last = --n; } if (!strcmp(aName,"reset")) { } else { isBasic = (aName[0] == 'b'); aName++; if (!strcmp(aName,"move")) { if (n < 3) return 1; TopoDS_Shape SL = DBRep::Get(a[n-1]); if (SL.IsNull()) return 0; T = SL.Location().Transformation(); last = n-1; } else if (!strcmp(aName,"translate")) { if (n < 5) return 1; T.SetTranslation(gp_Vec(Draw::Atof(a[n-3]),Draw::Atof(a[n-2]),Draw::Atof(a[n-1]))); last = n-3; } else if (!strcmp(aName,"rotate")) { if (n < 9) return 1; T.SetRotation(gp_Ax1(gp_Pnt(Draw::Atof(a[n-7]),Draw::Atof(a[n-6]),Draw::Atof(a[n-5])), gp_Vec(Draw::Atof(a[n-4]),Draw::Atof(a[n-3]),Draw::Atof(a[n-2]))), Draw::Atof(a[n-1])* (M_PI / 180.0)); last = n-7; } else if (!strcmp(aName,"mirror")) { if (n < 8) return 1; T.SetMirror(gp_Ax2(gp_Pnt(Draw::Atof(a[n-6]),Draw::Atof(a[n-5]),Draw::Atof(a[n-4])), gp_Vec(Draw::Atof(a[n-3]),Draw::Atof(a[n-2]),Draw::Atof(a[n-1])))); last = n-6; } else if (!strcmp(aName,"scale")) { if (n < 6) return 1; T.SetScale(gp_Pnt(Draw::Atof(a[n-4]),Draw::Atof(a[n-3]),Draw::Atof(a[n-2])),Draw::Atof(a[n-1])); last = n-4; } } if (T.Form() == gp_Identity || isBasic) { TopLoc_Location L(T); for (Standard_Integer i = 1; i < last; i++) { TopoDS_Shape S = DBRep::Get(a[i]); if (S.IsNull()) { std::cerr << "Error: " << a[i] << " is not a valid shape\n"; return 1; } else DBRep::Set(a[i],S.Located(L)); } } else { BRepBuilderAPI_Transform trf(T); for (Standard_Integer i = 1; i < last; i++) { TopoDS_Shape S = DBRep::Get(a[i]); if (S.IsNull()) { std::cerr << "Error: " << a[i] << " is not a valid shape\n"; return 1; } else { trf.Perform(S, isCopy); if (!trf.IsDone()) return 1; DBRep::Set(a[i],trf.Shape()); } } } return 0; } ///======================================================================= // gtransform //======================================================================= static Standard_Integer deform(Draw_Interpretor& di,Standard_Integer n,const char** a) { if (n <= 1) return 1; Standard_Integer last = n; gp_Trsf T; gp_GTrsf GT(T); // gp_Mat rot(Draw::Atof(a[last-3]),0,0,0,Draw::Atof(a[last-2]),0,0,0,Draw::Atof(a[last-1])); gp_Mat rot(Draw::Atof(a[3]),0,0,0,Draw::Atof(a[4]),0,0,0,Draw::Atof(a[5])); GT.SetVectorialPart(rot); last -= 3; BRepBuilderAPI_GTransform gtrf(GT); BRepBuilderAPI_NurbsConvert nbscv; // for (Standard_Integer i = 1; i < last; i++) { // TopoDS_Shape S = DBRep::Get(a[i]); TopoDS_Shape S = DBRep::Get(a[2]); if (S.IsNull()) { //std::cout << a[2] << " is not a valid shape" << std::endl; di << a[2] << " is not a valid shape\n"; } else { gtrf.Perform(S); if (gtrf.IsDone()){ DBRep::Set(a[1],gtrf.Shape()); } else { return 1; } } return 0; } //======================================================================= // tcopy //======================================================================= static Standard_Integer tcopy(Draw_Interpretor& di,Standard_Integer n,const char** a) { Standard_Boolean copyGeom = Standard_True; Standard_Boolean copyMesh = Standard_False; Standard_Integer iFirst = 1; // index of first shape argument if (n > 1) { for (Standard_Integer i = 1; i <= 2; i++) { if (a[i][0] != '-') break; if (a[i][1] == 'n') { copyGeom = Standard_False; iFirst++; } else if (a[i][1] == 'm') { copyMesh = Standard_True; iFirst++; } } } if (n < 3 || (n - iFirst) % 2) { std::cout << "Use: " << a[0] << " [-n(ogeom)] [-m(esh)] shape1 copy1 [shape2 copy2 [...]]" << std::endl; std::cout << "Option -n forbids copying of geometry (it will be shared)" << std::endl; std::cout << "Option -m forces copying of mesh (disabled by default)" << std::endl; return 1; } BRepBuilderAPI_Copy cop; Standard_Integer nbPairs = (n - iFirst) / 2; for (Standard_Integer i=0; i < nbPairs; i++) { cop.Perform(DBRep::Get(a[i+iFirst]), copyGeom, copyMesh); DBRep::Set(a[i+iFirst+1],cop.Shape()); di << a[i+iFirst+1] << " "; } return 0; } //======================================================================= // NurbsConvert //======================================================================= static Standard_Integer nurbsconvert(Draw_Interpretor& di,Standard_Integer n,const char** a) { if (n < 3) return 1; if ((n-1)%2 != 0) return 1; BRepBuilderAPI_NurbsConvert nbscv; for (Standard_Integer i=0; i<(n-1)/2; i++) { TopoDS_Shape S = DBRep::Get(a[2*i+2]); if (S.IsNull()) { //std::cout << a[2*i+2] << " is not a valid shape" << std::endl; di << a[2*i+2] << " is not a valid shape\n"; } else { nbscv.Perform(S); if (nbscv.IsDone()){ DBRep::Set(a[2*i+1],nbscv.Shape()); } else { return 1; } } } return 0; } //======================================================================= // make a 3D edge curve //======================================================================= static Standard_Integer mkedgecurve (Draw_Interpretor& ,Standard_Integer n,const char** a) { if (n < 3) return 1; Standard_Real Tolerance = Draw::Atof(a[2]) ; TopoDS_Shape S = DBRep::Get(a[1]); if (S.IsNull()) return 1; BRepLib::BuildCurves3d(S, Tolerance) ; return 0 ; } //======================================================================= // sameparameter //======================================================================= static Standard_Integer sameparameter(Draw_Interpretor& di,Standard_Integer n,const char** a) { if (n < 2) { di << "Use sameparameter [result] shape [toler]\n"; di << "shape is an initial shape\n"; di << "result is a result shape. if skipped = > initial shape will be modified\n"; di << "toler is tolerance (default is 1.e-7)"; return 1; } Standard_Real aTol = 1.e-7; Standard_Boolean force = !strcmp(a[0],"fsameparameter"); Standard_Real aTol1 = Draw::Atof(a[n-1]); Standard_Boolean IsUseTol = aTol1>0; if (IsUseTol) aTol = aTol1; TopoDS_Shape anInpS = DBRep::Get(IsUseTol ? a[n-2] : a[n-1]); if (anInpS.IsNull()) return 1; if ((n == 4 && IsUseTol) || (n == 3 && !IsUseTol)) { TopoDS_Shape aResultSh; BRepTools_ReShape aResh; BRepLib::SameParameter(anInpS,aResh,aTol,force); aResultSh = aResh.Apply(anInpS); DBRep::Set(a[1],aResultSh); } else { BRepLib::SameParameter(anInpS,aTol,force); DBRep::Set(a[1],anInpS); } return 0; } //======================================================================= //function : updatetol //purpose : //======================================================================= static Standard_Integer updatetol(Draw_Interpretor& di,Standard_Integer n,const char** a) { if (n < 2) { di << "Use updatetololerance [result] shape [param]\n"; di << "shape is an initial shape\n"; di << "result is a result shape. if skipped = > initial shape will be modified\n"; di << "if [param] is absent - not verify of face tolerance, else - perform it"; return 1; } TopoDS_Shape aSh1 = DBRep::Get(a[n-1]); Standard_Boolean IsF = aSh1.IsNull(); TopoDS_Shape anInpS = IsF ? DBRep::Get(a[n-2]) : aSh1; if (anInpS.IsNull()) return 1; if ((n == 4 && IsF) || (n == 3 && !IsF)) { TopoDS_Shape aResultSh; BRepTools_ReShape aResh; BRepLib::UpdateTolerances(anInpS,aResh, IsF); aResultSh = aResh.Apply(anInpS); DBRep::Set(a[1],aResultSh); } else { BRepLib::UpdateTolerances(anInpS, IsF); DBRep::Set(a[1],anInpS); } return 0; } //======================================================================= //function : OrienSolid //purpose : //======================================================================= static Standard_Integer orientsolid(Draw_Interpretor& ,Standard_Integer n,const char** a) { if (n < 2) return 1; TopoDS_Shape S = DBRep::Get(a[1]); if (S.IsNull()) return 1; if (S.ShapeType()!=TopAbs_SOLID) return 1; BRepLib::OrientClosedSolid(TopoDS::Solid(S)); DBRep::Set(a[1],S); return 0; } //======================================================================= //function : getcoords //purpose : //======================================================================= static Standard_Integer getcoords(Draw_Interpretor& di,Standard_Integer n,const char** a) { if(n < 2) return 1; for (Standard_Integer i = 1; i < n; i++) { const TopoDS_Shape aShape = DBRep::Get (a[i]); if (aShape.IsNull()) continue; if (aShape.ShapeType() == TopAbs_VERTEX) { const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape); gp_Pnt aPnt = BRep_Tool::Pnt(aVertex); di << a[i] << " (x,y,z) : " << aPnt.X() << " " << aPnt.Y() << " " << aPnt.Z() << "\n"; } } return 0; } //! Parse 6 real values for defining AABB. static Standard_Boolean parseMinMax (const char** theArgVec, Bnd_Box& theBox) { const TCollection_AsciiString aMin[3] = { theArgVec[0], theArgVec[1], theArgVec[2] }; const TCollection_AsciiString aMax[3] = { theArgVec[3], theArgVec[4], theArgVec[5] }; if (!aMin[0].IsRealValue() || !aMin[1].IsRealValue() || !aMin[2].IsRealValue() || !aMax[0].IsRealValue() || !aMax[1].IsRealValue() || !aMax[2].IsRealValue()) { return Standard_False; } const gp_Pnt aPntMin (aMin[0].RealValue(), aMin[1].RealValue(), aMin[2].RealValue()); const gp_Pnt aPntMax (aMax[0].RealValue(), aMax[1].RealValue(), aMax[2].RealValue()); theBox.SetVoid(); theBox.Add (aPntMin); theBox.Add (aPntMax); return Standard_True; } //======================================================================= //function : BoundBox //purpose : //======================================================================= static Standard_Integer BoundBox(Draw_Interpretor& theDI, Standard_Integer theNArg, const char** theArgVal) { // 1. Parse arguments TopoDS_Shape aShape; Bnd_Box anAABB; Standard_Boolean doPrint = Standard_False; Standard_Boolean doDumpJson = Standard_False; Standard_Boolean useOldSyntax = Standard_False; Standard_Boolean isOBB = Standard_False; Standard_Boolean isTriangulationReq = Standard_True; Standard_Boolean isOptimal = Standard_False; Standard_Boolean isTolerUsed = Standard_False; Standard_Boolean isFinitePart = Standard_False; Standard_Boolean hasToDraw = Standard_True; TCollection_AsciiString anOutVars[6]; TCollection_AsciiString aResShapeName; for (Standard_Integer anArgIter = 1; anArgIter < theNArg; ++anArgIter) { TCollection_AsciiString anArgCase (theArgVal[anArgIter]); anArgCase.LowerCase(); if (anArgCase == "-obb") { isOBB = Standard_True; } else if (anArgCase == "-aabb") { isOBB = Standard_False; } else if (anArgCase == "-shape" && anArgIter + 1 < theNArg && aResShapeName.IsEmpty()) { aResShapeName = theArgVal[++anArgIter]; hasToDraw = Standard_False; } else if (anArgCase == "-dump" || anArgCase == "-print") { doPrint = Standard_True; } else if (anArgCase == "-dumpjson") { doDumpJson = Standard_True; } else if (anArgCase == "-save" && anArgIter + 6 < theNArg && anOutVars[0].IsEmpty()) { for (int aCompIter = 0; aCompIter < 6; ++aCompIter) { anOutVars[aCompIter] = theArgVal[anArgIter + aCompIter + 1]; } anArgIter += 6; } else if (anArgCase == "-notriangulation") { isTriangulationReq = Standard_False; } else if (anArgCase == "-optimal") { isOptimal = Standard_True; } else if (anArgCase == "-exttoler") { isTolerUsed = Standard_True; } else if (anArgCase == "-nodraw") { hasToDraw = Standard_False; } else if (anArgCase == "-finite" || anArgCase == "-finitepart") { isFinitePart = Standard_True; } else if (aShape.IsNull() && !DBRep::Get (theArgVal[anArgIter]).IsNull()) { aShape = DBRep::Get (theArgVal[anArgIter]); } else if (anAABB.IsVoid() && anArgIter + 5 < theNArg && parseMinMax (theArgVal + anArgIter, anAABB)) { anArgIter += 5; } else { std::cout << "Syntax error at argument '" << theArgVal[anArgIter] << "'.\n"; return 1; } } if (anAABB.IsVoid() && aShape.IsNull()) { std::cout << "Syntax error: input is not specified (neither shape nor coordinates)\n"; return 1; } else if (!anAABB.IsVoid() && (isOBB || isOptimal || isTolerUsed)) { std::cout << "Syntax error: Options -obb, -optimal and -extToler cannot be used for explicitly defined AABB.\n"; return 1; } else if (isOBB && !anOutVars[0].IsEmpty()) { std::cout << "Error: Option -save works only with axes-aligned boxes.\n"; return 1; } // enable printing (old syntax) if neither saving to shape nor to DRAW variables is requested if (! doPrint && ! doDumpJson && anOutVars[0].IsEmpty() && aResShapeName.IsEmpty()) { doPrint = Standard_True; useOldSyntax = Standard_True; } // 2. Compute box and save results Handle(Draw_Box) aDB; if (isOBB) { Bnd_OBB anOBB; BRepBndLib::AddOBB(aShape, anOBB, isTriangulationReq, isOptimal, isTolerUsed); if (anOBB.IsVoid()) { theDI << "Void box.\n"; } else if (doPrint) { const gp_Pnt &aBaryCenter= anOBB.Center(); const gp_XYZ &aXDir = anOBB.XDirection(), &aYDir = anOBB.YDirection(), &aZDir = anOBB.ZDirection(); theDI << "Oriented bounding box\n"; theDI << "Center: " << aBaryCenter.X() << " " << aBaryCenter.Y() << " " << aBaryCenter.Z() << "\n"; theDI << "X-axis: " << aXDir.X() << " " << aXDir.Y() << " " << aXDir.Z() << "\n"; theDI << "Y-axis: " << aYDir.X() << " " << aYDir.Y() << " " << aYDir.Z() << "\n"; theDI << "Z-axis: " << aZDir.X() << " " << aZDir.Y() << " " << aZDir.Z() << "\n"; theDI << "Half X: " << anOBB.XHSize() << "\n" << "Half Y: " << anOBB.YHSize() << "\n" << "Half Z: " << anOBB.ZHSize() << "\n"; } if (doDumpJson) { Standard_SStream aStream; anOBB.DumpJson (aStream); theDI << "Oriented bounding box\n"; theDI << Standard_Dump::FormatJson (aStream); } if (hasToDraw && !anOBB.IsVoid()) { aDB = new Draw_Box (anOBB, Draw_orange); } if (!aResShapeName.IsEmpty()) { ConvertBndToShape (anOBB, aResShapeName.ToCString()); } } else // if(!isOBB) { if (!aShape.IsNull()) { anAABB.SetVoid (); if(isOptimal) { BRepBndLib::AddOptimal (aShape, anAABB, isTriangulationReq, isTolerUsed); } else { BRepBndLib::Add (aShape, anAABB, isTriangulationReq); } } if (anAABB.IsVoid()) { theDI << "Void box.\n"; } else { if (isFinitePart && anAABB.IsOpen()) { anAABB = anAABB.FinitePart(); } const gp_Pnt aMin = anAABB.CornerMin(); const gp_Pnt aMax = anAABB.CornerMax(); // print to DRAW if (doPrint) { if (useOldSyntax) { theDI << aMin.X() << " " << aMin.Y() << " " << aMin.Z() << " " << aMax.X() << " " << aMax.Y() << " " << aMax.Z() << "\n"; } else { theDI << "Axes-aligned bounding box\n"; theDI << "X-range: " << aMin.X() << " " << aMax.X() << "\n" << "Y-range: " << aMin.Y() << " " << aMax.Y() << "\n" << "Z-range: " << aMin.Z() << " " << aMax.Z() << "\n"; if (anAABB.IsOpen() && anAABB.HasFinitePart()) { Bnd_Box aFinitAabb = anAABB.FinitePart(); const gp_Pnt aFinMin = aFinitAabb.CornerMin(); const gp_Pnt aFinMax = aFinitAabb.CornerMax(); theDI << "Finite part\n"; theDI << "X-range: " << aFinMin.X() << " " << aFinMax.X() << "\n" << "Y-range: " << aFinMin.Y() << " " << aFinMax.Y() << "\n" << "Z-range: " << aFinMin.Z() << " " << aFinMax.Z() << "\n"; } } } if (doDumpJson) { Standard_SStream aStream; anAABB.DumpJson (aStream); theDI << "Bounding box\n"; theDI << Standard_Dump::FormatJson (aStream); } // save DRAW variables if (!anOutVars[0].IsEmpty()) { Draw::Set (anOutVars[0].ToCString(), aMin.X()); Draw::Set (anOutVars[1].ToCString(), aMin.Y()); Draw::Set (anOutVars[2].ToCString(), aMin.Z()); Draw::Set (anOutVars[3].ToCString(), aMax.X()); Draw::Set (anOutVars[4].ToCString(), aMax.Y()); Draw::Set (anOutVars[5].ToCString(), aMax.Z()); } // add presentation to DRAW viewer if (hasToDraw) { aDB = new Draw_Box (anAABB, Draw_orange); } } // save as shape if (!aResShapeName.IsEmpty()) { ConvertBndToShape (anAABB, aResShapeName.ToCString()); } } if (!aDB.IsNull()) { dout << aDB; } return 0; } //======================================================================= //function : IsBoxesInterfered //purpose : //======================================================================= static Standard_Integer IsBoxesInterfered(Draw_Interpretor& theDI, Standard_Integer theNArg, const char** theArgVal) { if(theNArg < 2) { theDI << "Use: isbbinterf shape1 shape2 [-o].\n"; return 1; } const TopoDS_Shape aShape1 = DBRep::Get(theArgVal[1]); const TopoDS_Shape aShape2 = DBRep::Get(theArgVal[2]); Standard_Boolean isOBB = (theNArg > 3) && (!strcmp(theArgVal[3], "-o")); if(isOBB) { Bnd_OBB anOBB1, anOBB2; BRepBndLib::AddOBB(aShape1, anOBB1); BRepBndLib::AddOBB(aShape2, anOBB2); if(anOBB1.IsOut(anOBB2)) { theDI << "The shapes are NOT interfered by OBB.\n"; } else { theDI << "The shapes are interfered by OBB.\n"; } } else { Bnd_Box anAABB1, anAABB2; BRepBndLib::Add(aShape1, anAABB1); BRepBndLib::Add(aShape2, anAABB2); if(anAABB1.IsOut(anAABB2)) { theDI << "The shapes are NOT interfered by AABB.\n"; } else { theDI << "The shapes are interfered by AABB.\n"; } } return 0; } //======================================================================= //function : gbounding //purpose : //======================================================================= #include #include #include #include #include static Standard_Integer gbounding(Draw_Interpretor& di,Standard_Integer n,const char** a) { if (n != 2 && n != 3) { di << "Usage: gbounding surf/curve/curve2d [-o] \n"; di << "[-o] turn on Optimal mode ('off' by default) \n"; return 1; } else { Standard_Boolean IsOptimal = Standard_False; if (n == 3 && !strcmp(a[2], "-o")) IsOptimal = Standard_True; Standard_Real axmin,aymin,azmin,axmax,aymax,azmax; Bnd_Box B; Bnd_Box2d B2d; Handle(Draw_Box) DB; Standard_Boolean Is3d = Standard_True; Handle(Geom_Curve) C; Handle(Geom_Surface) S; Handle_Geom2d_Curve C2d; S = DrawTrSurf::GetSurface(a[1]); if (!S.IsNull()) { //add surf GeomAdaptor_Surface aGAS(S); if (IsOptimal) BndLib_AddSurface::AddOptimal(aGAS, Precision::Confusion(), B); else BndLib_AddSurface::Add(aGAS, Precision::Confusion(), B); } else { C = DrawTrSurf::GetCurve(a[1]); if (!C.IsNull()) { // add cur GeomAdaptor_Curve aGAC(C); if (IsOptimal) BndLib_Add3dCurve::AddOptimal(aGAC, Precision::Confusion(), B); else BndLib_Add3dCurve::Add(aGAC, Precision::Confusion(), B); } else { C2d = DrawTrSurf::GetCurve2d(a[1]); if (!C2d.IsNull()) { //add cur2d Is3d = Standard_False; if (IsOptimal) BndLib_Add2dCurve::AddOptimal(C2d, C2d->FirstParameter(), C2d->LastParameter(), Precision::Confusion(), B2d); else BndLib_Add2dCurve::Add(C2d, C2d->FirstParameter(), C2d->LastParameter(), Precision::Confusion(), B2d); } else { di << "Wrong argument \n"; return 1; } } } if (Is3d) { B.Get(axmin,aymin,azmin,axmax,aymax,azmax); DB = new Draw_Box(B, Draw_vert); dout< #include static Standard_Integer reperageshape(Draw_Interpretor& di, Standard_Integer narg , const char** a) { Standard_Integer details=0; if(narg<2) return 1; if(narg==3) details=1; const char *id1 = a[1]; TopoDS_Shape TheShape1 = DBRep::Get(id1); //std::cout << "Pick positions with button "< "; di <<"\n --> "; if(Inter.NbPnt()) { for(Standard_Integer i=1; i<=Inter.NbPnt(); i++) { Standard_Integer numface=1; TopExp_Explorer ExF; for(ExF.Init(TheShape1,TopAbs_FACE); ExF.More(); ExF.Next(),numface++) { TopoDS_Face Face=TopoDS::Face(ExF.Current()); if(Face.IsEqual(Inter.Face(i))) { //std::cout<<" "<TMF) TMF=T; if(TTME) TME=T; if(TTMV) TMV=T; if(TAbs(P2.X())) xa = P1.X(); else xa = P2.X(); if(Abs(P1.Y())>Abs(P2.Y())) ya = P1.Y(); else ya = P2.Y(); if(Abs(P1.Z())>Abs(P2.Z())) za = P1.Z(); else za = P2.Z(); P1.SetCoord(xa,ya,za); Handle(Draw_Marker3D) D0 = new Draw_Marker3D(gp_Pnt(P1.X(), P1.Y(), P1.Z()), Draw_Square,Draw_blanc,1); dout << D0; dout.Flush(); //----------------------------------------------------------- dout.Select(id,X,Y,b); dout.GetTrsf(id,T); T.Invert(); z = dout.Zoom(id); PP1.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z,0.0); PP1.Transform(T); dout.Select(id,X,Y,b); dout.GetTrsf(id,T); T.Invert(); z = dout.Zoom(id); PP2.SetCoord((Standard_Real)X /z,(Standard_Real)Y /z,0.0); PP2.Transform(T); if(Abs(PP1.X())>Abs(PP2.X())) xa = PP1.X(); else xa = PP2.X(); if(Abs(PP1.Y())>Abs(PP2.Y())) ya = PP1.Y(); else ya = PP2.Y(); if(Abs(PP1.Z())>Abs(PP2.Z())) za = PP1.Z(); else za = PP2.Z(); PP1.SetCoord(xa,ya,za); Handle(Draw_Segment3D) d = new Draw_Segment3D(P1,PP1,Draw_blanc); dout << d; dout.Flush(); //std::cout<<"\nttran "< static Standard_Integer nproject(Draw_Interpretor& di, Standard_Integer n, const char** a) { if ( n < 4) return 1; TopoDS_Shape InpShape; Standard_Integer arg = 2, i; TopTools_SequenceOfShape Args; Standard_Real Tol = 1.e-4; Standard_Real Tol2d; Standard_Real MaxDistance = 1.e-3; GeomAbs_Shape Continuity = GeomAbs_C2; Standard_Integer MaxDeg = 14; Standard_Integer MaxSeg = 16; while((n > arg) && !(InpShape = DBRep::Get(a[arg])).IsNull()){ Args.Append(InpShape); arg++; } if(Args.Length() < 2) return 1; BRepOffsetAPI_NormalProjection OrtProj(Args.Last()); for(i = 1; i < Args.Length(); i++) OrtProj.Add(Args(i)); if(n > arg) if (!strcmp(a[arg],"-g")) { OrtProj.SetLimit(Standard_False); arg++; } if(n > arg) if (!strcmp(a[arg],"-d")) { arg++; if(n > arg) MaxDistance = Draw::Atof(a[arg++]); OrtProj.SetMaxDistance(MaxDistance); } if(n > arg) { Tol = Max(Draw::Atof(a[arg++]),1.e-10); } if(n > arg) { if (Draw::Atoi(a[arg]) == 0) Continuity = GeomAbs_C0; else if (Draw::Atoi(a[arg]) == 1) Continuity = GeomAbs_C1; arg++; } if(n > arg) { MaxDeg = Draw::Atoi(a[arg++]); if (MaxDeg<1 || MaxDeg>14) MaxDeg = 14; } if(n > arg) MaxSeg = Draw::Atoi(a[arg]); Tol2d = Pow(Tol, 2./3); OrtProj.SetParams(Tol, Tol2d, Continuity, MaxDeg, MaxSeg); OrtProj.Build(); TopTools_ListOfShape Wire; Standard_Boolean IsWire=OrtProj.BuildWire(Wire); if (IsWire) { //std::cout << " BuildWire OK " << std::endl; di << " BuildWire OK \n"; } DBRep::Set(a[1], OrtProj.Shape()); return 0; } //========================================================================== //function : wexplo // exploration of a wire //========================================================================== static Standard_Integer wexplo (Draw_Interpretor&, Standard_Integer argc, const char** argv) { char name[100]; if (argc < 2) return 1; TopoDS_Shape C1 = DBRep::Get (argv[1],TopAbs_WIRE); TopoDS_Shape C2 ; if (argc > 2) C2 = DBRep::Get (argv[2],TopAbs_FACE); if (C1.IsNull()) return 1; BRepTools_WireExplorer we; if (C2.IsNull()) we.Init(TopoDS::Wire(C1)); else we.Init(TopoDS::Wire(C1),TopoDS::Face(C2)); Standard_Integer k = 1; while (we.More()) { TopoDS_Edge E = we.Current(); Sprintf(name,"WEDGE_%d",k); DBRep::Set(name,E); we.Next(); k++; } return 0; } static Standard_Integer scalexyz(Draw_Interpretor& /*di*/, Standard_Integer n, const char** a) { if (n < 6) return 1; TopoDS_Shape aShapeBase = DBRep::Get(a[2]); if (aShapeBase.IsNull()) return 1; Standard_Real aFactorX = Draw::Atof(a[3]); Standard_Real aFactorY = Draw::Atof(a[4]); Standard_Real aFactorZ = Draw::Atof(a[5]); gp_GTrsf aGTrsf; gp_Mat rot (aFactorX, 0, 0, 0, aFactorY, 0, 0, 0, aFactorZ); aGTrsf.SetVectorialPart(rot); BRepBuilderAPI_GTransform aBRepGTrsf (aShapeBase, aGTrsf, Standard_False); if (!aBRepGTrsf.IsDone()) throw Standard_ConstructionError("Scaling not done"); TopoDS_Shape Result = aBRepGTrsf.Shape(); DBRep::Set(a[1], Result); return 0; } //======================================================================= //function : compareshapes //purpose : //======================================================================= static Standard_Integer compareshapes(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n != 3) { di << "Compare shapes. Usage: compare shape1 shape2\n"; return 1; } // get shapes TopoDS_Shape aS1 = DBRep::Get(a[1]); TopoDS_Shape aS2 = DBRep::Get(a[2]); // check shapes if (aS1.IsNull() || aS2.IsNull()) { di << "null shapes\n"; return 0; } // compare shapes if (aS1.IsSame(aS2)) { di << "same shapes\n"; if (aS1.IsEqual(aS2)) { di << "equal shapes\n"; } } else { di << "shapes are not same\n"; } return 0; } //======================================================================= //function : issubshape //purpose : //======================================================================= static Standard_Integer issubshape(Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n != 3) { di << "Check if the shape is sub-shape of other shape and get its index in the shape.\n"; di << "Usage: issubshape subshape shape\n"; return 1; } // get shapes TopoDS_Shape aSubShape = DBRep::Get(a[1]); TopoDS_Shape aShape = DBRep::Get(a[2]); // check shapes if (aSubShape.IsNull() || aShape.IsNull()) { di << "null shapes\n"; return 0; } // find index of the sub-shape in the shape TopTools_MapOfShape aMShapes; // try to find the SubShape in Shape TopExp_Explorer anExp(aShape, aSubShape.ShapeType()); for (; anExp.More(); anExp.Next()) { const TopoDS_Shape& aSS = anExp.Current(); if (aMShapes.Add(aSS)) { if (aSS.IsSame(aSubShape)) { break; } } } // if (anExp.More()) { di << a[1] << " is sub-shape of " << a[2] << ". Index in the shape: " << aMShapes.Extent() << ".\n"; } else { di << a[1] << " is NOT sub-shape of " << a[2] << ".\n"; } // return 0; } void BRepTest::BasicCommands(Draw_Interpretor& theCommands) { static Standard_Boolean done = Standard_False; if (done) return; done = Standard_True; DBRep::BasicCommands(theCommands); const char* g = "TOPOLOGY Basic shape commands"; theCommands.Add("addpcurve", "addpcurve edge 2dcurve face [tol (default 1.e-7)]", __FILE__, addpcurve,g); theCommands.Add("reset", "reset name1 name2 ..., remove location", __FILE__, transform,g); theCommands.Add("tmove", "tmove name1 name2 ... name, set location from name [-copy]", __FILE__, transform,g); theCommands.Add("ttranslate", "ttranslate name1 name2 ... dx dy dz [-copy]", __FILE__, transform,g); theCommands.Add("trotate", "trotate name1 name2 ... x y z dx dy dz angle [-copy]", __FILE__, transform,g); theCommands.Add("tmirror", "tmirror name x y z dx dy dz [-copy]", __FILE__, transform,g); theCommands.Add("tscale", "tscale name x y z scale [-copy]", __FILE__, transform,g); theCommands.Add("tcopy", "tcopy [-n(ogeom)] [-m(esh)] name1 result1 [name2 result2 ...]", __FILE__, tcopy,g); theCommands.Add("bmove", "bmove name1 name2 ... name, set location from name", __FILE__, transform,g); theCommands.Add("btranslate", "btranslate name1 name2 ... dx dy dz", __FILE__, transform,g); theCommands.Add("brotate", "brotate name1 name2 ... x y z dx dy dz angle", __FILE__, transform,g); theCommands.Add("bmirror", "bmirror name x y z dx dy dz", __FILE__, transform,g); theCommands.Add("bscale", "bscale name x y z scale", __FILE__, transform,g); theCommands.Add("precision", "precision [preci]", __FILE__, precision,g); theCommands.Add("mkedgecurve", "mkedgecurve name tolerance", __FILE__, mkedgecurve,g); theCommands.Add("fsameparameter", "fsameparameter shapename [tol (default 1.e-7)], \nforce sameparameter on all edges of the shape", __FILE__, sameparameter,g); theCommands.Add("sameparameter", "sameparameter [result] shape [tol]", __FILE__, sameparameter,g); theCommands.Add("updatetolerance", "updatetolerance [result] shape [param] \n if [param] is absent - not verify of face tolerance, else - perform it", __FILE__, updatetol,g); theCommands.Add("solidorientation", "orientsolid myClosedSolid", __FILE__, orientsolid,g); theCommands.Add("getcoords", "getcoords vertex1 vertex 2... ; shows coords of input vertices", __FILE__, getcoords,g); theCommands.Add ("bounding", "bounding {shape | xmin ymin zmin xmax ymax zmax}" "\n\t\t: [-obb] [-noTriangulation] [-optimal] [-extToler]" "\n\t\t: [-dump] [-print] [-dumpJson] [-shape name] [-nodraw] [-finitePart]" "\n\t\t: [-save xmin ymin zmin xmax ymax zmax]" "\n\t\t:" "\n\t\t: Computes a bounding box. Two types of the source data are supported:" "\n\t\t: a shape or AABB corners (xmin, ymin, zmin, xmax, ymax, zmax)." "\n\t\t:" "\n\t\t: Calculation options (applicable only if input is a shape):" "\n\t\t: -obb Compute Oriented Bounding Box (OBB) instead of AABB." "\n\t\t: -noTriangulation Force use of exact geometry for calculation" "\n\t\t: even if triangulation is present." "\n\t\t: -optimal Force calculation of optimal (more tight) AABB." "\n\t\t: In case of OBB:" "\n\t\t: - for PCA approach applies to initial AABB used in OBB calculation" "\n\t\t: - for DiTo approach modifies the DiTo algorithm to check more axes." "\n\t\t: -extToler Include tolerance of the shape in the resulting box." "\n\t\t:" "\n\t\t: Output options:" "\n\t\t: -dump Prints the information about computed Bounding Box." "\n\t\t: -print Prints the information about computed Bounding Box." "\n\t\t: It is enabled by default (with plain old syntax for AABB)" "\n\t\t: if neither -shape nor -save is specified." "\n\t\t: -dumpJson Prints DumpJson information about Bounding Box." "\n\t\t: -shape Stores computed box as solid in DRAW variable with specified name." "\n\t\t: -save Stores min and max coordinates of AABB in specified variables." "\n\t\t: -noDraw Avoid drawing resulting Bounding Box in DRAW viewer." "\n\t\t: -finite Return finite part of infinite box.", __FILE__, BoundBox, g); // theCommands.Add("gbounding", "gbounding surf/curve/curve2d [-o] ", __FILE__, gbounding,g); theCommands.Add("isbbinterf", "isbbinterf shape1 shape2 [-o]\n" "Checks whether the bounding-boxes created from " "the given shapes are interfered. If \"-o\"-option " "is switched on then the oriented boxes will be checked. " "Otherwise, axes-aligned boxes will be checked.", __FILE__, IsBoxesInterfered, g); theCommands.Add("nurbsconvert", "nurbsconvert result name [result name]", __FILE__, nurbsconvert,g); theCommands.Add("deform", "deform newname name CoeffX CoeffY CoeffZ", __FILE__, deform,g); theCommands.Add("findplane", "findplane name planename ", __FILE__, findplane,g) ; theCommands.Add("maxtolerance", "maxtolerance shape ", __FILE__, maxtolerance,g) ; theCommands.Add("reperageshape", "reperage shape -> list of shape (result of interstion shape , line)", __FILE__, reperageshape,g) ; theCommands.Add("vecdc", "vecdc + Pointe double click ", __FILE__, vecdc,g) ; theCommands.Add("nproject","nproject pj e1 e2 e3 ... surf -g -d [dmax] [Tol [continuity [maxdeg [maxseg]]]", __FILE__, nproject,g); theCommands.Add("wexplo","wexplo wire [face] create WEDGE_i", __FILE__, wexplo,g); theCommands.Add("scalexyz", "scalexyz res shape factor_x factor_y factor_z", __FILE__, scalexyz, g); theCommands.Add("compare", "Compare shapes. Usage: compare shape1 shape2", __FILE__, compareshapes, g); theCommands.Add("issubshape", "issubshape subshape shape\n" "\t\tCheck if the shape is sub-shape of other shape and get its index in the shape.", __FILE__, issubshape, g); }