1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/SWDRAW/SWDRAW_ShapeUpgrade.cxx
jgv 6669db4159 0032999: Modeling Algorithms - New option in ShapeUpgrade_ShapeDivide algorithm: splitting into N parts, into N*M parts
1. Multiple changes in ShapeUpgrade_ShapeDivideArea, ShapeUpgrade_FaceDivide, ShapeUpgrade_FaceDivideArea, ShapeUpgrade_SplitSurface, ShapeUpgrade_SplitSurfaceArea: new methods NbParts and SetSplittingByNumber, changes in ShapeUpgrade_FaceDivideArea::Perform and ShapeUpgrade_SplitSurfaceArea::Compute concerning new modes of splitting.
2. New Draw command "DT_SplitByNumber" for testing new modes of splitting.
3. New subgroups "split_number" and "split_two_numbers" in the group of tests "heal" for testing new modes of splitting.
2022-08-04 18:20:00 +03:00

1697 lines
53 KiB
C++

// Created on: 1999-03-09
// Created by: data exchange team
// Copyright (c) 1999-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.
//gka,rln 30.04.99 S4137: new commands for testing ShapeDivide added, some removed
//abv,pdn 05.05.99 S4174: new commands for testing ShapeDivide added, some removed
//pdn,gka 10.06.99 S4189: command DT_ShapeConvertRev added
#include <BRep_Tool.hxx>
#include <BRep_Builder.hxx>
#include <BRepBuilderAPI.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <BRepTest_Objects.hxx>
#include <BRepTools.hxx>
#include <BRepTools_ReShape.hxx>
#include <DBRep.hxx>
#include <Draw.hxx>
#include <Draw_Interpretor.hxx>
#include <DrawTrSurf.hxx>
#include <Geom2d_Curve.hxx>
#include <Geom2d_OffsetCurve.hxx>
#include <Geom_Curve.hxx>
#include <Geom_OffsetCurve.hxx>
#include <Geom_Plane.hxx>
#include <Geom_RectangularTrimmedSurface.hxx>
#include <Geom_Surface.hxx>
#include <Message.hxx>
#include <Precision.hxx>
#include <ShapeBuild_ReShape.hxx>
#include <ShapeCustom.hxx>
#include <ShapeExtend_CompositeSurface.hxx>
#include <ShapeFix.hxx>
#include <ShapeFix_ComposeShell.hxx>
#include <ShapeUpgrade.hxx>
#include <ShapeUpgrade_RemoveInternalWires.hxx>
#include <ShapeUpgrade_RemoveLocations.hxx>
#include <ShapeUpgrade_ShapeConvertToBezier.hxx>
#include <ShapeUpgrade_ShapeDivideAngle.hxx>
#include <ShapeUpgrade_ShapeDivideArea.hxx>
#include <ShapeUpgrade_ShapeDivideClosed.hxx>
#include <ShapeUpgrade_ShapeDivideContinuity.hxx>
#include <ShapeUpgrade_SplitCurve2dContinuity.hxx>
#include <ShapeUpgrade_SplitCurve3dContinuity.hxx>
#include <ShapeUpgrade_SplitSurfaceContinuity.hxx>
#include <ShapeUpgrade_UnifySameDomain.hxx>
#include <SWDRAW.hxx>
#include <SWDRAW_ShapeUpgrade.hxx>
#include <TCollection_AsciiString.hxx>
#include <TColGeom2d_HArray1OfCurve.hxx>
#include <TColGeom_HArray1OfCurve.hxx>
#include <TColGeom_HArray2OfSurface.hxx>
#include <TColStd_Array1OfReal.hxx>
#include <TColStd_HArray1OfReal.hxx>
#include <TColStd_HSequenceOfReal.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Shell.hxx>
#include <TopoDS_Wire.hxx>
#include <stdio.h>
//#include <SWDRAW_ShapeUpgrade.hxx>
//#include <ShapeUpgrade_SupportModification.hxx>
//#include <ShapeExtend_WireData.hxx>
//#include <ShapeAnalysis_Shell.hxx>
//#include <ShapeAnalysis_WireOrder.hxx>
//#include <ShapeAnalysis_Wire.hxx>
//#include <ShapeUpgrade_ShellSewing.hxx>
// the plane (equation z=0) shared by PlaneDividedFaceContinuity and PlaneGridShell
//static Handle(Geom_Plane) ThePlane= new Geom_Plane(0,0,1,0);
//=======================================================================
//function : DT_ShapeDivide
//purpose :
//=======================================================================
static Standard_Integer DT_ShapeDivide (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
// DT_ShapeDivide result Shape Tol
// a[1]= result
// a[2]= input Face/Surface
// a[3] si n>3= Wire/Face
// a[n-1]= Tolerance
if (n<3) {
di << "bad number of arguments\n";
return 1;
}
// try to read a shape:
TopoDS_Shape inputShape=DBRep::Get(a[2]);
if (inputShape.IsNull()) {
di << "Unknown shape\n";
return 1;
}
// a[2] is a shape. managing:
// DT_ShapeDivide result Face Tol
// giving a face is available only in the constructor:
// we make the whole and quit.
ShapeUpgrade_ShapeDivideContinuity tool(inputShape);
// tolerance is optional
if (n==4) {
Standard_Real Tol=Draw::Atof(a[3]);
tool.SetTolerance(Tol);
}
// theTool.SetGlobalCriterion(GeomAbs_C1);
tool.Perform();
TopoDS_Shape res = tool.Result();
if ( tool.Status ( ShapeExtend_OK ) ) di << "Status: OK\n";
if ( tool.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1\n";
if ( tool.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2\n";
if ( tool.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3\n";
if ( tool.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4\n";
if ( tool.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5\n";
if ( tool.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6\n";
if ( tool.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7\n";
if ( tool.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8\n";
if ( tool.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1\n";
if ( tool.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2\n";
if ( tool.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3\n";
if ( tool.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4\n";
if ( tool.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5\n";
if ( tool.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6\n";
if ( tool.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7\n";
if ( tool.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8\n";
// fixes
ShapeFix::SameParameter ( res, Standard_False );
DBRep::Set(a[1],res);
return 0;
}
static Standard_Integer DT_ShapeConvertRev (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
if (n<5) {
di << "bad number of arguments\n";
return 1;
}
// try to read a shape:
TopoDS_Shape inputShape=DBRep::Get(a[2]);
if (inputShape.IsNull()) {
di << "Unknown shape\n";
return 1;
}
Standard_Integer c2d = Draw::Atoi(a[3]);
Standard_Integer c3d = Draw::Atoi(a[4]);
TopoDS_Shape revsh = ShapeCustom::ConvertToRevolution (inputShape);
if (revsh.IsNull()) { di<<"NO RESULT\n"; return 1; }
else if (revsh == inputShape) { di<<"No modif\n";}
else di<<"ConvertToRevolution -> Result : \n";
ShapeUpgrade_ShapeConvertToBezier tool(revsh);
tool.SetSurfaceConversion(Standard_True);
if(c2d)
tool.Set2dConversion(Standard_True);
if(c3d) {
tool.Set3dConversion(Standard_True);
if(n > 5)
tool.Set3dLineConversion(Standard_False);
if(n > 6)
tool.Set3dCircleConversion(Standard_False);
if(n > 7)
tool.Set3dConicConversion(Standard_False);
}
tool.Perform();
TopoDS_Shape res = tool.Result();
if ( tool.Status ( ShapeExtend_OK ) ) di << "Status: OK\n";
if ( tool.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1\n";
if ( tool.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2\n";
if ( tool.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3\n";
if ( tool.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4\n";
if ( tool.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5\n";
if ( tool.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6\n";
if ( tool.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7\n";
if ( tool.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8\n";
if ( tool.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1\n";
if ( tool.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2\n";
if ( tool.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3\n";
if ( tool.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4\n";
if ( tool.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5\n";
if ( tool.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6\n";
if ( tool.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7\n";
if ( tool.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8\n";
// fixes
ShapeFix::SameParameter ( res, Standard_False );
DBRep::Set(a[1],res);
return 0;
}
/*
if (!inputShape.IsNull()) {
// a[2] is a shape. managing:
// DT_ShapeDivide result Face Tol
TopoDS_Face inputFace = TopoDS::Face(inputShape);
if (inputFace.IsNull()) {
di << a[2] << " is not a face\n";
return 1;
}
// giving a face is available only in the constructor:
// we make the whole and quit.
ShapeUpgrade_ShapeDivideContinuity theTool(inputFace);
// tolerance is optional
if (n==4) {
Standard_Real Tol=Draw::Atof(a[n-1]);
theTool.SetTolerance(Tol);
}
theTool.SetGlobalCriterion(GeomAbs_C1);
theTool.Build();
if (!theTool.IsDone()) {
ShapeUpgrade_Error theError=theTool.Error();
di << "Not done: error=";
if (theError==ShapeUpgrade_Done)
di << "Done\n";
else if (theError==ShapeUpgrade_NotDone)
di << "NotDone\n";
else if (theError==ShapeUpgrade_EmptyShell)
di << "EmptyShell\n";
else if (theError==ShapeUpgrade_InvalidCriterion)
di << "InvalidCriterion\n";
else if (theError==ShapeUpgrade_InvalidGridSurface)
di << "InvalidGridSurface\n";
else if (theError==ShapeUpgrade_DegeneratedEdge)
di << "DegeneratedEdge\n";
else if (theError==ShapeUpgrade_NoSurface)
di << "NoSurface\n";
else if (theError==ShapeUpgrade_NoTolerance)
di << "NoTolerance\n";
return 1;
}
TopoDS_Shell res = theTool.Shell();
DBRep::Set(a[1],res);
return 0;
}
else {
// not a face: we can use the empty consturctor.
ShapeUpgrade_ShapeDivideContinuity theTool;
Standard_Real Tol=Draw::Atof(a[n-1]);
theTool.SetTolerance(Tol);
theTool.SetGlobalCriterion(GeomAbs_C1);
// try to read a surface:
Handle(Geom_Surface) GS = DrawTrSurf::GetSurface(a[2]);
if (! GS.IsNull()) {
// a[2] is a surface. managing the configurations:
// DT_ShapeDivide result Surface Tol
// DT_ShapeDivide result Surface Face Tol
// DT_ShapeDivide result Surface Wire Surf Tol
theTool.SetSupport(GS);
// try to read a Wire or a Face:
if (n>=5) {
TopoDS_Shape inputBoundary=DBRep::Get(a[3]);
if (inputBoundary.IsNull()) {
di << "Invalid Boundary\n";
return 1;
}
TopoDS_Wire WireBoundary = TopoDS::Wire(inputBoundary);
if (!WireBoundary.IsNull()) {
// DT_ShapeDivide result Surface Wire Surf Tol
Handle(Geom_Surface) WireSupport = DrawTrSurf::GetSurface(a[4]);
if (WireSupport.IsNull()) {
di << "Invalid Surface supporting the Wire\n";
return 1;
}
theTool.SetBoundary(WireBoundary, WireSupport);
}
else {
TopoDS_Face FaceBoundary = TopoDS::Face(inputBoundary);
// DT_ShapeDivide result Surface Face Tol
theTool.SetBoundary(FaceBoundary);
}
}
}
else {
// it must be a grid: managing the configurations:
// DT_ShapeDivide result NbU NbV {Surf_u_v...} Tol
// DT_ShapeDivide result NbU NbV {Surf_u_v...} Face Tol
// DT_ShapeDivide result NbU NbV {Surf_u_v...} Wire Surf Tol
if (n<6) {
di << "bad number of arguments for grid input\n";
return 1;
}
// number of surf:
Standard_Integer NbU=Draw::Atoi(a[2]);
Standard_Integer NbV=Draw::Atoi(a[3]);
if (n < 4+NbU*NbV+1) {
di << "bad number of arguments\n";
return 1;
}
Handle(TColGeom_HArray2OfSurface)
TheGridSurf= new TColGeom_HArray2OfSurface(1,NbU,1,NbV);
for (Standard_Integer iu=1; iu<=NbU; iu++) {
for (Standard_Integer jv=1; jv<=NbV; jv++) {
Handle(Geom_Surface) GS = DrawTrSurf::GetSurface(a[4+(iu-1)*NbV+jv-1]);
TheGridSurf->SetValue(iu,jv,GS);
}
}
theTool.SetSupport(TheGridSurf,Tol);
// try to read a Wire or a Face:
if (n>=6+NbU*NbV) {
TopoDS_Shape inputBoundary=DBRep::Get(a[4+NbU*NbV]);
if (inputBoundary.IsNull()) {
di << "Invalid Boundary\n";
return 1;
}
TopoDS_Wire WireBoundary = TopoDS::Wire(inputBoundary);
if (!WireBoundary.IsNull()) {
// DT_ShapeDivide result Surface Wire Surf Tol
Handle(Geom_Surface) WireSupport = DrawTrSurf::GetSurface(a[4+NbU*NbV+1]);
if (WireSupport.IsNull()) {
di << "Invalid Surface supporting the Wire\n";
return 1;
}
theTool.SetBoundary(WireBoundary, WireSupport);
}
else {
TopoDS_Face FaceBoundary = TopoDS::Face(inputBoundary);
// DT_ShapeDivide result Surface Face Tol
theTool.SetBoundary(FaceBoundary);
}
}
}
theTool.Build();
if (!theTool.IsDone()) {
ShapeUpgrade_Error theError=theTool.Error();
di << "Not done: error=";
if (theError==ShapeUpgrade_Done)
di << "Done\n";
else if (theError==ShapeUpgrade_NotDone)
di << "NotDone\n";
else if (theError==ShapeUpgrade_EmptyShell)
di << "EmptyShell\n";
else if (theError==ShapeUpgrade_InvalidCriterion)
di << "InvalidCriterion\n";
else if (theError==ShapeUpgrade_InvalidGridSurface)
di << "InvalidGridSurface\n";
else if (theError==ShapeUpgrade_DegeneratedEdge)
di << "DegeneratedEdge\n";
else if (theError==ShapeUpgrade_NoSurface)
di << "NoSurface\n";
else if (theError==ShapeUpgrade_NoTolerance)
di << "NoTolerance\n";
return 1;
}
TopoDS_Shell res = theTool.Shell();
DBRep::Set(a[1],res);
return 0;
}
}
*/
static Standard_Integer DT_ShapeConvert (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
if (n<5) {
di << "bad number of arguments\n";
return 1;
}
// try to read a shape:
TopoDS_Shape inputShape=DBRep::Get(a[2]);
if (inputShape.IsNull()) {
di << "Unknown shape\n";
return 1;
}
Standard_Integer c2d = Draw::Atoi(a[3]);
Standard_Integer c3d = Draw::Atoi(a[4]);
ShapeUpgrade_ShapeConvertToBezier tool(inputShape);
tool.SetSurfaceConversion(Standard_True);
if(c2d)
tool.Set2dConversion(Standard_True);
if(c3d)
tool.Set3dConversion(Standard_True);
tool.Perform();
TopoDS_Shape res = tool.Result();
if ( tool.Status ( ShapeExtend_OK ) ) di << "Status: OK\n";
if ( tool.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1\n";
if ( tool.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2\n";
if ( tool.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3\n";
if ( tool.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4\n";
if ( tool.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5\n";
if ( tool.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6\n";
if ( tool.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7\n";
if ( tool.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8\n";
if ( tool.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1\n";
if ( tool.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2\n";
if ( tool.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3\n";
if ( tool.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4\n";
if ( tool.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5\n";
if ( tool.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6\n";
if ( tool.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7\n";
if ( tool.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8\n";
// fixes
ShapeFix::SameParameter ( res, Standard_False );
DBRep::Set(a[1],res);
return 0;
}
static Standard_Integer DT_SplitAngle(Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
if (n<3) {
di << "bad number of arguments\n";
return 1;
}
TopoDS_Shape inputShape=DBRep::Get(a[2]);
if (inputShape.IsNull()) {
di << "Unknown shape\n";
return 1;
}
Standard_Real maxangle = 95;
if ( n >3 ) {
maxangle = Draw::Atof ( a[3] );
if ( maxangle <1 ) maxangle = 1;
}
ShapeUpgrade_ShapeDivideAngle tool(maxangle * M_PI/180,inputShape);
tool.Perform();
TopoDS_Shape res = tool.Result();
if ( tool.Status ( ShapeExtend_OK ) ) di << "Status: OK\n";
if ( tool.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1\n";
if ( tool.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2\n";
if ( tool.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3\n";
if ( tool.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4\n";
if ( tool.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5\n";
if ( tool.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6\n";
if ( tool.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7\n";
if ( tool.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8\n";
if ( tool.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1\n";
if ( tool.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2\n";
if ( tool.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3\n";
if ( tool.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4\n";
if ( tool.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5\n";
if ( tool.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6\n";
if ( tool.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7\n";
if ( tool.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8\n";
// fixes
ShapeFix::SameParameter ( res, Standard_False );
DBRep::Set(a[1],res);
return 0;
}
/*
//=======================================================================
//function : DT_PlaneDividedFace
//purpose : Transfer into a plane with boundary divided
//
//
//=======================================================================
static Standard_Integer DT_PlaneDividedFace (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
// a[1]= result
// a[2]= input Face
// a[3]= Tolerance
if (n !=4) {
di << "bad number of arguments\n";
return 1;
}
Standard_Real Tol=Draw::Atof(a[3]);
TopoDS_Shape inputShape=DBRep::Get(a[2]);
TopoDS_Face inputFace = TopoDS::Face(inputShape);
if (inputFace.IsNull()) {
di << a[2] << " is not a face\n";
return 1;
}
ShapeUpgrade_PlaneDividedFace theTool(ThePlane);
theTool.Init(inputFace);
//theTool.SetBoundaryCriterion(GeomAbs_C1);
//theTool.SetTolerance(Tol);
theTool.Build();
if (!theTool.IsDone()) {
di << "Not done\n";
return 1;
}
TopoDS_Face res = theTool.Face();
DBRep::Set(a[1],res);
Standard_Real the2d3dFactor=theTool.Get2d3dFactor();
di << "2d3dFactor="<<the2d3dFactor<< "\n";
return 0;
}
//=======================================================================
//function : DT_PlaneGridShell
//purpose : Create a Plane Grid Shell from U and V knots
//
//
//=======================================================================
static Standard_Integer DT_PlaneGridShell (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
if (n < 4) return 1;
// a[1]= result
// a[2]= NbU >=2
// a[3]= NbV >=2
// a[4..]= {UKnots}
// a[4+NbU...] = {VKnots}
// a[4+NbU+NbV+1] = Tol
// number of knots:
Standard_Integer NbU=Draw::Atoi(a[2]);
Standard_Integer NbV=Draw::Atoi(a[3]);
if (n != 4+NbU+NbV+1) {
di << "bad number of arguments\n";
return 1;
}
TColStd_Array1OfReal TheUKnots(1,NbU);
TColStd_Array1OfReal TheVKnots(1,NbV);
for (Standard_Integer ii=1; ii<=NbU; ii++) {
TheUKnots(ii)=Draw::Atof(a[4+ii-1]);
}
for (ii=1; ii<=NbV; ii++) {
TheVKnots(ii)=Draw::Atof(a[4+NbU+ii-1]);
}
Standard_Real Tol=Draw::Atof(a[4+NbU+NbV]);
ShapeUpgrade_PlaneGridShell TheGrid(ThePlane,TheUKnots,TheVKnots,Tol);
TopoDS_Shell res = TheGrid.Shell();
DBRep::Set(a[1],res);
return 0;
}
//=======================================================================
//function : DT_PlaneFaceCommon
//purpose : Common between a plane Face and a Shell whose all Faces are
// laying in the same plane
//
//
//=======================================================================
static Standard_Integer DT_PlaneFaceCommon (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
// a[1]= result
// a[2]= input Face
// a[3]= input Shell
if (n !=4) {
di << "bad number of arguments\n";
return 1;
}
TopoDS_Shape inputShape= DBRep::Get(a[2]);
TopoDS_Face inputFace = TopoDS::Face(inputShape);
if (inputFace.IsNull()) {
di << a[2] << " is not a face\n";
return 1;
}
inputShape = DBRep::Get(a[3]);
TopoDS_Shell inputShell = TopoDS::Shell(inputShape);
if (inputShell.IsNull()) {
di << a[3] << " is not a shell\n";
return 1;
}
ShapeUpgrade_PlaneFaceCommon theTool;
theTool.Init(inputFace,inputShell);
TopoDS_Shell res = theTool.Shell();
DBRep::Set(a[1],res);
return 0;
}*/
//=======================================================================
//function : DT_SplitCurve
//purpose : Splits the curve with C1 criterion
//
//
//=======================================================================
static Standard_Integer DT_SplitCurve (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
// a[1]= input curve. This name is used with a suffix to name the output curves
// a[2]= Tolerance
if (n < 3) {
di << "bad number of arguments\n";
return 1;
}
Standard_Real Tol=Draw::Atof(a[2]);
Handle(Geom_Curve) GC = DrawTrSurf::GetCurve(a[1]);
if ( GC.IsNull()) return 1;
Standard_Integer Split = Draw::Atoi(a[3]);
Handle(ShapeUpgrade_SplitCurve3dContinuity) theTool = new ShapeUpgrade_SplitCurve3dContinuity;
theTool->Init(GC);
theTool->SetTolerance (Tol);
theTool->SetCriterion (GeomAbs_C1);
if(Split == 1) {
Handle(TColStd_HSequenceOfReal) spval = new TColStd_HSequenceOfReal;
for(Standard_Integer i = 1; i<=5; i++) spval->Append(i);
theTool->SetSplitValues(spval);
}
theTool->Perform (Standard_True);
Handle(TColGeom_HArray1OfCurve) theCurves= theTool->GetCurves();
Standard_Integer NbC=theCurves->Length();
for (Standard_Integer icurv=1; icurv<=NbC; icurv++) {
char name[100];
Sprintf(name,"%s%s%d",a[1],"_",icurv);
char* newname = name;
DrawTrSurf::Set(newname, theCurves->Value(icurv));
di.AppendElement(newname);
}
return 0;
}
//=======================================================================
//function : DT_SplitCurve2d
//purpose : Splits the curve with C1 criterion
//
//
//=======================================================================
static Standard_Integer DT_SplitCurve2d (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
// a[1]= input 2d curve. This name is used with a suffix to name the output curves
// a[2]= Tolerance
if (n < 3) {
di << "bad number of arguments\n";
return 1;
}
Standard_Real Tol=Draw::Atof(a[2]);
Handle(Geom2d_Curve) GC = DrawTrSurf::GetCurve2d(a[1]);
if ( GC.IsNull()) return 1;
Standard_Integer Split = Draw::Atoi(a[3]);
Handle(ShapeUpgrade_SplitCurve2dContinuity) theTool = new ShapeUpgrade_SplitCurve2dContinuity;
theTool->Init(GC);
theTool->SetTolerance (Tol);
theTool->SetCriterion (GeomAbs_C1);
if(Split == 1) {
Handle(TColStd_HSequenceOfReal) spval = new TColStd_HSequenceOfReal;
for(Standard_Integer i = 1; i<=5; i++) spval->Append(i);
theTool->SetSplitValues(spval);
}
theTool->Perform (Standard_True);
Handle(TColGeom2d_HArray1OfCurve) theCurves= theTool->GetCurves();
Standard_Integer NbC=theCurves->Length();
for (Standard_Integer icurv=1; icurv<=NbC; icurv++) {
char name[100];
Sprintf(name,"%s%s%d",a[1],"_",icurv);
char* newname = name;
DrawTrSurf::Set(newname, theCurves->Value(icurv));
di.AppendElement(newname);
}
return 0;
}
//=======================================================================
//function : DT_SplitSurface
//purpose : Splits the surface with C1 criterion
//
//
//=======================================================================
/*
static Standard_Integer DT_SplitWire (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
if (n <3) {
di << "bad number of arguments\n";
return 1;
}
TopoDS_Face source = TopoDS::Face(DBRep::Get(a[2]));
if(source.IsNull()) {
di <<"Shape is not face\n";
return 1;
}
TopoDS_Iterator wi(source);
if(!wi.More()) {
di <<"Shape is face without wire\n";
return 1;
}
TopoDS_Wire wire = TopoDS::Wire(wi.Value());
Handle(ShapeUpgrade_WireDivideContinuity) tool = new ShapeUpgrade_WireDivideContinuity;
tool->Init(wire,source);
if(n >=4 ) {
Standard_Real Tol=Draw::Atof(a[3]);
}
Handle(ShapeBuild_ReShape) context = new ShapeBuild_ReShape;
tool->Perform(context);
TopoDS_Wire result = tool->Wire();
DBRep::Set(a[1],result);
return 0;
}
*/
/*
static Standard_Integer DT_SplitFace (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
if (n <3) {
di << "bad number of arguments\n";
return 1;
}
TopoDS_Face source = TopoDS::Face(DBRep::Get(a[2]));
if(source.IsNull()) {
di <<"Shape is not face\n";
return 1;
}
Handle(ShapeUpgrade_ShapeDivideContinuity) tool = new ShapeUpgrade_FaceDivideContinuity;
tool->Init(source);
if(n >=4 ) {
Standard_Real Tol=Draw::Atof(a[3]);
tool->SetPrecision(Tol);
}
Handle(ShapeBuild_ReShape) context = new ShapeBuild_ReShape;
tool->Perform(context);
TopoDS_Shape result = tool->Result();
if ( tool->Status ( ShapeExtend_OK ) ) di << "Status: OK\n";
if ( tool->Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1\n";
if ( tool->Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2\n";
if ( tool->Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3\n";
if ( tool->Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4\n";
if ( tool->Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5\n";
if ( tool->Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6\n";
if ( tool->Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7\n";
if ( tool->Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8\n";
if ( tool->Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1\n";
if ( tool->Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2\n";
if ( tool->Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3\n";
if ( tool->Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4\n";
if ( tool->Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5\n";
if ( tool->Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6\n";
if ( tool->Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7\n";
if ( tool->Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8\n";
// fixes
ShapeFix::SameParameter ( result, Standard_False );
DBRep::Set(a[1],result);
return 0;
}
*/
static Standard_Integer DT_SplitSurface (Draw_Interpretor& di,
Standard_Integer n, const char** a)
{
// a[1]= result (used with a suffix to name the output surfaces)
// a[2]= input surface.
// a[3]= Tolerance
// a[1]= result
// a[2]= nbU
// a[3]= nbV
// a[3+1]..a[3+nbU*nbV] = Input Surfaces
// a[4+nbU*nbV]= Tolerance
if (n <4) {
di << "bad number of arguments\n";
return 1;
}
Handle(ShapeUpgrade_SplitSurfaceContinuity) theTool = new ShapeUpgrade_SplitSurfaceContinuity;//S4137
Standard_Real Tol=Draw::Atof(a[3]);
Standard_Integer Split = Draw::Atoi(a[4]);
theTool->SetTolerance(Tol);
theTool->SetCriterion(GeomAbs_C1);
Handle(Geom_Surface) GS = DrawTrSurf::GetSurface(a[2]);
/*
if ( GS.IsNull()) {
// Case of composite grid surface
di << "composite surf\n";
Standard_Integer nbU=Draw::Atoi(a[2]);
Standard_Integer nbV=Draw::Atoi(a[3]);
if (nbU==0 || nbV==0) return 1;
Handle(TColGeom_HArray2OfSurface)
theGrid= new TColGeom_HArray2OfSurface(1,nbU,1,nbV);
for (Standard_Integer iu=1; iu<=nbU; iu++) {
for (Standard_Integer iv=1; iv<=nbV; iv++) {
Handle(Geom_Surface) GS = DrawTrSurf::GetSurface(a[3+(iu-1)*nbV+iv]);
theGrid->SetValue(iu,iv,GS);
}
}
di << "appel a SplitSurface::Init\n";
theTool->Init(theGrid);
}
else {*/
// Case of single surface
di << "single surf\n";
di << "appel a SplitSurface::Init\n";
theTool->Init(GS);
if(Split ==1) {
Handle(TColStd_HSequenceOfReal) spval = new TColStd_HSequenceOfReal;
for(Standard_Integer i = 1; i<=5; i++) spval->Append(i);
theTool->SetUSplitValues(spval);
theTool->SetVSplitValues(spval);
}
di << "appel a SplitSurface::Build\n";
theTool->Build(Standard_True);
di << "appel a SplitSurface::GlobalU/VKnots\n";
Handle(ShapeExtend_CompositeSurface) Grid = theTool->ResSurfaces();
Handle(TColStd_HArray1OfReal) GlobalU=Grid->UJointValues();
Handle(TColStd_HArray1OfReal) GlobalV=Grid->VJointValues();
Standard_Integer nbGlU=GlobalU->Length();
Standard_Integer nbGlV=GlobalV->Length();
di << "nb GlobalU ; nb GlobalV="<<nbGlU<<" "<<nbGlV;
for (Standard_Integer iu=1; iu<=nbGlU; iu++)
di <<" "<< GlobalU->Value(iu);
// di <<"\n";
// di << "nb GlobalV="<<nbGlV;
for (Standard_Integer iv=1; iv<=nbGlV; iv++)
di <<" "<< GlobalV->Value(iv);
di <<"\n";
di << "appel a Surfaces\n";
Handle(TColGeom_HArray2OfSurface) theSurfaces= Grid->Patches();
di << "transfert resultat\n";
Standard_Integer NbRow=theSurfaces->ColLength();
Standard_Integer NbCol=theSurfaces->RowLength();
for (Standard_Integer irow=1; irow<=NbRow; irow++) {
for (Standard_Integer icol=1; icol<=NbCol; icol++) {
char name[100];
Sprintf(name,"%s%s%d%s%d",a[1],"_",irow,"_",icol);
char* newname = name;
DrawTrSurf::Set(newname, theSurfaces->Value(irow, icol));
di.AppendElement(newname);
}
}
return 0;
}
//---------------gka
//=======================================================================
//function : offset2dcurve
//purpose :
//
//=======================================================================
static Standard_Integer offset2dcurve
(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (argc < 4) {
di<<"result + curve + offset\n";
return 1 /* Error */;
}
// Standard_CString arg1 = argv[1];
// Standard_CString arg2 = argv[2];
Standard_Real Offset = Draw::Atof(argv[3]);
Handle(Geom2d_Curve) GC = DrawTrSurf::GetCurve2d(argv[2]);
if ( GC.IsNull()) return 1;
Handle(Geom2d_OffsetCurve) offcrv = new Geom2d_OffsetCurve(GC,Offset);
DrawTrSurf::Set(argv[1], offcrv);
return 0;
}
//=======================================================================
//function : offsetcurve
//purpose :
//
//=======================================================================
static Standard_Integer offsetcurve
(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (argc < 5) {
di<<"result + curve + offset + Dir\n";
return 1 /* Error */;
}
// Standard_CString arg1 = argv[1];
// Standard_CString arg2 = argv[2];
Standard_Real Offset = Draw::Atof(argv[3]);
Handle(Geom_Curve) GC = DrawTrSurf::GetCurve(argv[2]);
if ( GC.IsNull()) return 1;
gp_Pnt point;
DrawTrSurf::GetPoint(argv[4],point);
gp_Dir dir(point.XYZ());
Handle(Geom_OffsetCurve) offcrv = new Geom_OffsetCurve(GC,Offset,dir);
DrawTrSurf::Set(argv[1], offcrv);
return 0;
}
//=======================================================================
//function : compose shell
//purpose :
//=======================================================================
static Standard_Integer splitface
(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (argc < 5) {
di << "Split face: splitface result face [u usplit1 usplit2...] [v vsplit1 vsplit2 ...]\n";
return 1;
}
TopoDS_Shape aLocalShape = DBRep::Get(argv[2]) ;
TopoDS_Face face = TopoDS::Face ( aLocalShape );
if ( face.IsNull() ) {
di << argv[2] << " is not Face\n";
return 1;
}
Handle(Geom_Surface) S = BRep_Tool::Surface ( face );
Standard_Real Uf, Ul, Vf, Vl;
BRepTools::UVBounds ( face, Uf, Ul, Vf, Vl );
Standard_Real Umin, Umax, Vmin, Vmax;
S->Bounds ( Umin, Umax, Vmin, Vmax );
if ( Uf < Umin && ! S->IsUPeriodic() ) Uf = Umin;
else if ( Uf > Umin ) {
if ( Precision::IsInfinite(Umin) ) Uf -= 100;
else Uf = Umin;
}
if ( Vf < Vmin && ! S->IsVPeriodic() ) Vf = Vmin;
else if ( Vf > Vmin ) {
if ( Precision::IsInfinite(Vmin) ) Vf -= 100;
else Vf = Vmin;
}
if ( Ul > Umax && ! S->IsUPeriodic() ) Ul = Umax;
else if ( Ul < Umax ) {
if ( Precision::IsInfinite(Umax) ) Ul += 100;
else Ul = Umax;
}
if ( Vl > Vmax && ! S->IsVPeriodic() ) Vl = Vmax;
else if ( Vl < Vmax ) {
if ( Precision::IsInfinite(Vmax) ) Vl += 100;
else Vl = Vmax;
}
TColStd_SequenceOfReal uval;
TColStd_SequenceOfReal vval;
Standard_Boolean byV = Standard_False;
Standard_Integer i; // svv Jan11 2000 : porting on DEC
for ( i=3; i < argc; i++ ) {
if ( argv[i][0] == 'u' ) byV = Standard_False;
else if ( argv[i][0] == 'v' ) byV = Standard_True;
else {
Standard_Real val = Draw::Atof ( argv[i] );
TColStd_SequenceOfReal &vals = ( byV ? vval : uval );
if ( vals.Length() >0 && val - vals.Last() < Precision::PConfusion() ) {
di << "Values should be sorted in increasing order; skipped\n";
continue;
}
if ( ( byV && ( val < Vf+Precision::PConfusion() ||
val > Vl-Precision::PConfusion() ) ) ||
(!byV && ( val < Uf+Precision::PConfusion() ||
val > Ul-Precision::PConfusion() ) ) ) {
di << "Values should be inside range of surface; skipped\n";
continue;
}
vals.Append ( val );
}
}
if ( uval.Length() <1 && vval.Length() <1 ) {
di << "No splitting defined\n";
return 1;
}
if ( uval.Length() >0 ) {
di << "Splitting by U: ";
for ( Standard_Integer j=1; j <= uval.Length(); j++ ) {
//std::cout << ( i >j ? ", " : "" ) << uval(j);
if (i >j) {
di << ", ";
} else {
di << "";
}
di << uval(j);
}
di << "\n";
}
if ( vval.Length() >0 ) {
di << "Splitting by V: ";
for ( Standard_Integer j=1; j <= vval.Length(); j++ ) {
//std::cout << ( j >1 ? ", " : "" ) << vval(j);
if (j >1) {
di << ", ";
} else {
di << "";
}
di << vval(j);
}
di << "\n";
}
Handle(TColGeom_HArray2OfSurface) AS = new TColGeom_HArray2OfSurface ( 1, uval.Length()+1,
1, vval.Length()+1 );
for ( i=0; i <= uval.Length(); i++ ) {
Standard_Real umin = ( i ? uval(i) : Uf );
Standard_Real umax = ( i < uval.Length() ? uval(i+1) : Ul );
for ( Standard_Integer j=0; j <= vval.Length(); j++ ) {
Standard_Real vmin = ( j ? vval(j) : Vf );
Standard_Real vmax = ( j < vval.Length() ? vval(j+1) : Vl );
Handle(Geom_RectangularTrimmedSurface) rect =
new Geom_RectangularTrimmedSurface ( S, umin, umax, vmin, vmax );
AS->SetValue ( i+1, j+1, rect );
}
}
Handle(ShapeExtend_CompositeSurface) Grid = new ShapeExtend_CompositeSurface;
if ( ! Grid->Init ( AS ) ) di << "Grid badly connected!\n";
ShapeFix_ComposeShell SUCS;
TopLoc_Location l;
SUCS.Init ( Grid, l, face, Precision::Confusion() );
Handle(ShapeBuild_ReShape) RS = new ShapeBuild_ReShape;
SUCS.SetContext( RS );
SUCS.Perform ();
if ( SUCS.Status ( ShapeExtend_OK ) ) di << "Status: OK\n";
if ( SUCS.Status ( ShapeExtend_DONE1 ) ) di << "Status: DONE1\n";
if ( SUCS.Status ( ShapeExtend_DONE2 ) ) di << "Status: DONE2\n";
if ( SUCS.Status ( ShapeExtend_DONE3 ) ) di << "Status: DONE3\n";
if ( SUCS.Status ( ShapeExtend_DONE4 ) ) di << "Status: DONE4\n";
if ( SUCS.Status ( ShapeExtend_DONE5 ) ) di << "Status: DONE5\n";
if ( SUCS.Status ( ShapeExtend_DONE6 ) ) di << "Status: DONE6\n";
if ( SUCS.Status ( ShapeExtend_DONE7 ) ) di << "Status: DONE7\n";
if ( SUCS.Status ( ShapeExtend_DONE8 ) ) di << "Status: DONE8\n";
if ( SUCS.Status ( ShapeExtend_FAIL1 ) ) di << "Status: FAIL1\n";
if ( SUCS.Status ( ShapeExtend_FAIL2 ) ) di << "Status: FAIL2\n";
if ( SUCS.Status ( ShapeExtend_FAIL3 ) ) di << "Status: FAIL3\n";
if ( SUCS.Status ( ShapeExtend_FAIL4 ) ) di << "Status: FAIL4\n";
if ( SUCS.Status ( ShapeExtend_FAIL5 ) ) di << "Status: FAIL5\n";
if ( SUCS.Status ( ShapeExtend_FAIL6 ) ) di << "Status: FAIL6\n";
if ( SUCS.Status ( ShapeExtend_FAIL7 ) ) di << "Status: FAIL7\n";
if ( SUCS.Status ( ShapeExtend_FAIL8 ) ) di << "Status: FAIL8\n";
TopoDS_Shape sh = SUCS.Result();
ShapeFix::SameParameter ( sh, Standard_False );
DBRep::Set ( argv[1], sh );
return 0;
}
static Standard_Integer converttobspline
(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (argc<3) {
di << "Use: " << argv[0] << " result shape [options=ero]\n";
di << "where options is combination of letters indicating kinds of\n";
di << "surfaces to be converted:\n";
di << "e - extrusion\n";
di << "r - revolution\n";
di << "o - offset\n";
di << "p - plane";
return 1;
}
const char *options = ( argc > 3 ? argv[3] : "ero" );
TopoDS_Shape inputShape=DBRep::Get(argv[2]);
if (inputShape.IsNull()) {
di << "Unknown shape\n";
return 1;
}
TopoDS_Shape revsh = ShapeCustom::ConvertToRevolution (inputShape);
TopoDS_Shape res =
ShapeCustom::ConvertToBSpline (revsh, strchr (options, 'e') != 0,
strchr (options, 'r') != 0,
strchr (options, 'o') != 0,
strchr (options, 'p') != 0);
ShapeFix::SameParameter ( res, Standard_False );
DBRep::Set ( argv[1], res );
return 0;
}
static Standard_Integer splitclosed (Draw_Interpretor& di,
Standard_Integer argc,
const char** argv)
{
if (argc<3) {
di << "bad number of arguments\n";
return 1;
}
TopoDS_Shape inputShape=DBRep::Get(argv[2]);
if (inputShape.IsNull()) {
di << "Unknown shape\n";
return 1;
}
ShapeUpgrade_ShapeDivideClosed tool (inputShape);
tool.Perform();
TopoDS_Shape res = tool.Result();
ShapeFix::SameParameter ( res, Standard_False );
DBRep::Set ( argv[1], res );
return 0;
}
static Standard_Integer splitarea (Draw_Interpretor& di,
Standard_Integer argc,
const char** argv)
{
if (argc<4) {
di << "bad number of arguments\n";
return 1;
}
TopoDS_Shape inputShape=DBRep::Get(argv[2]);
if (inputShape.IsNull()) {
di << "Unknown shape\n";
return 1;
}
Standard_Real aMaxArea = Draw::Atof(argv[3]);
ShapeUpgrade_ShapeDivideArea tool (inputShape);
if(argc >4) {
Standard_Real prec = Draw::Atof(argv[4]);
tool.SetPrecision(prec);
}
tool.MaxArea() = aMaxArea;
tool.Perform();
TopoDS_Shape res = tool.Result();
ShapeFix::SameParameter ( res, Standard_False );
DBRep::Set ( argv[1], res );
return 0;
}
static Standard_Integer splitbynumber (Draw_Interpretor& di,
Standard_Integer argc,
const char** argv)
{
if (argc < 4) {
di << "bad number of arguments\n";
return 1;
}
TopoDS_Shape inputShape=DBRep::Get(argv[2], TopAbs_FACE);
if (inputShape.IsNull()) {
di << "Unknown face\n";
return 1;
}
Standard_Integer aNbParts, aNumber1 = 0, aNumber2 = 0;
aNbParts = aNumber1 = Draw::Atoi (argv[3]);
if (argc > 4)
aNumber2 = Draw::Atoi (argv[4]);
if (argc == 4 && aNbParts <= 0)
{
di << "Incorrect number of parts\n";
return 1;
}
if (argc == 5 &&
(aNumber1 <= 0 || aNumber2 <= 0))
{
di << "Incorrect numbers in U or V\n";
return 1;
}
ShapeUpgrade_ShapeDivideArea tool (inputShape);
tool.SetSplittingByNumber (Standard_True);
if (argc == 4)
tool.NbParts() = aNbParts;
else
tool.SetNumbersUVSplits (aNumber1, aNumber2);
tool.Perform();
TopoDS_Shape res = tool.Result();
ShapeFix::SameParameter ( res, Standard_False );
DBRep::Set ( argv[1], res );
return 0;
}
static Standard_Integer removeinternalwires (Draw_Interpretor& di,
Standard_Integer argc,
const char** argv)
{
if (argc<4) {
di << "bad number of arguments\n";
return 1;
}
Standard_Real aMinArea = Draw::Atof(argv[2]);
TopoDS_Shape inputShape=DBRep::Get(argv[3]);
if (inputShape.IsNull()) {
di << "Unknown shape\n";
return 1;
}
Handle(ShapeUpgrade_RemoveInternalWires) aTool;
TopTools_SequenceOfShape aSeqShapes;
if(inputShape.ShapeType() < TopAbs_WIRE)
aTool = new ShapeUpgrade_RemoveInternalWires(inputShape);
else {
di<<"Invalid type of first shape: should be FACE,SHELL,SOLID or COMPOUND\n";
return 1;
}
Standard_Integer k = 4;
Standard_Boolean isShape = Standard_True;
Standard_Boolean aModeRemoveFaces =Standard_True;
for( ; k < argc; k++) {
if(isShape) {
TopoDS_Shape aShape=DBRep::Get(argv[k]);
isShape = !aShape.IsNull();
if(isShape) {
if(aShape.ShapeType() == TopAbs_FACE || aShape.ShapeType() == TopAbs_WIRE)
aSeqShapes.Append(aShape);
}
}
if(!isShape)
aModeRemoveFaces = (Draw::Atoi(argv[k]) == 1);
}
aTool->MinArea() = aMinArea;
aTool->RemoveFaceMode() = aModeRemoveFaces;
if(aSeqShapes.Length())
aTool->Perform(aSeqShapes);
else
aTool->Perform();
if(aTool->Status(ShapeExtend_FAIL1))
di<<"Initial shape has invalid type\n";
else if(aTool->Status(ShapeExtend_FAIL2))
di<<"Specified sub-shape is not belonged to whole shape\n";
if(aTool->Status(ShapeExtend_DONE1)) {
const TopTools_SequenceOfShape& aRemovedWires =aTool->RemovedWires();
di<<aRemovedWires.Length()<<" internal wires were removed\n";
}
if(aTool->Status(ShapeExtend_DONE2)) {
const TopTools_SequenceOfShape& aRemovedFaces =aTool->RemovedFaces();
di<<aRemovedFaces.Length()<<" small faces were removed\n";
}
TopoDS_Shape res = aTool->GetResult();
DBRep::Set ( argv[1], res );
return 0;
}
static Standard_Integer removeloc (Draw_Interpretor& di,
Standard_Integer argc,
const char** argv)
{
if (argc<3) {
di << "bad number of arguments. Should be: removeloc res shape [remove_level(see ShapeEnum)]\n";
return 1;
}
TopoDS_Shape aShape = DBRep::Get(argv[2]);
if(aShape.IsNull())
return 1;
ShapeUpgrade_RemoveLocations aRemLoc;
if (argc > 3)
aRemLoc.SetRemoveLevel((TopAbs_ShapeEnum)Draw::Atoi(argv[3]));
aRemLoc.Remove(aShape);
TopoDS_Shape aNewShape = aRemLoc.GetResult();
DBRep::Set(argv[1],aNewShape);
return 0;
}
static ShapeUpgrade_UnifySameDomain& Unifier() {
static ShapeUpgrade_UnifySameDomain sUnifier;
return sUnifier;
}
//=======================================================================
// unifysamedom
//=======================================================================
static Standard_Integer unifysamedom(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
if (n < 3)
{
di << "Use unifysamedom result shape [s1 s2 ...] [-f] [-e] [-nosafe] [+b] [+i] [-t val] [-a val]\n";
di << "options:\n";
di << "s1 s2 ... to keep the given edges during unification of faces\n";
di << "-f to switch off 'unify-faces' mode \n";
di << "-e to switch off 'unify-edges' mode\n";
di << "-nosafe to switch off 'safe input shape' mode\n";
di << "+b to switch on 'concat bspline' mode\n";
di << "+i to switch on 'allow internal edges' mode\n";
di << "-t val to set linear tolerance\n";
di << "-a val to set angular tolerance (in degrees)\n";
di << "'unify-faces' and 'unify-edges' modes are switched on by default";
return 1;
}
TopoDS_Shape aShape = DBRep::Get(a[2]);
if (aShape.IsNull())
return 1;
// default values
Standard_Boolean anUFaces = Standard_True;
Standard_Boolean anUEdges = Standard_True;
Standard_Boolean anConBS = Standard_False;
Standard_Boolean isAllowInternal = Standard_False;
Standard_Boolean isSafeInputMode = Standard_True;
Standard_Real aLinTol = Precision::Confusion();
Standard_Real aAngTol = Precision::Angular();
TopoDS_Shape aKeepShape;
TopTools_MapOfShape aMapOfShapes;
if (n > 3)
for ( int i = 3; i < n; i++ )
{
aKeepShape = DBRep::Get(a[i]);
if (!aKeepShape.IsNull()) {
aMapOfShapes.Add(aKeepShape);
}
else {
if ( !strcmp(a[i], "-f"))
anUFaces = Standard_False;
else if (!strcmp(a[i], "-e"))
anUEdges = Standard_False;
else if (!strcmp(a[i], "-nosafe"))
isSafeInputMode = Standard_False;
else if (!strcmp(a[i], "+b"))
anConBS = Standard_True;
else if (!strcmp(a[i], "+i"))
isAllowInternal = Standard_True;
else if (!strcmp(a[i], "-t") || !strcmp(a[i], "-a"))
{
if (++i < n)
{
if (a[i-1][1] == 't')
aLinTol = Draw::Atof(a[i]);
else
aAngTol = Draw::Atof(a[i]) * (M_PI / 180.0);
}
else
{
di << "value expected after " << a[i-1];
return 1;
}
}
}
}
Unifier().Initialize(aShape, anUEdges, anUFaces, anConBS);
Unifier().KeepShapes(aMapOfShapes);
Unifier().SetSafeInputMode(isSafeInputMode);
Unifier().AllowInternalEdges(isAllowInternal);
Unifier().SetLinearTolerance(aLinTol);
Unifier().SetAngularTolerance(aAngTol);
Unifier().Build();
TopoDS_Shape Result = Unifier().Shape();
if (BRepTest_Objects::IsHistoryNeeded())
BRepTest_Objects::SetHistory(Unifier().History());
DBRep::Set(a[1], Result);
return 0;
}
static Standard_Integer copytranslate(Draw_Interpretor& di,
Standard_Integer argc,
const char** argv)
{
if (argc<6) {
di << "bad number of arguments. Should be: copytranslate res shape dx dy dz\n";
return 1;
}
TopoDS_Shape aShape = DBRep::Get(argv[2]);
if(aShape.IsNull())
return 1;
Standard_Real aDx = Draw::Atof(argv[3]);
Standard_Real aDy = Draw::Atof(argv[4]);
Standard_Real aDz = Draw::Atof(argv[5]);
gp_Trsf aTrsf;
aTrsf.SetTranslation(gp_Vec(aDx, aDy, aDz));
BRepBuilderAPI_Transform builderTransform(aTrsf);
builderTransform.Perform (aShape, true);
TopoDS_Shape aNewShape = builderTransform.Shape();
DBRep::Set(argv[1],aNewShape);
return 0;
}
static Standard_Integer reshape(Draw_Interpretor& /*theDI*/,
Standard_Integer theArgc,
const char** theArgv)
{
if ( theArgc < 4 )
{
Message::SendFail() << "Error: wrong number of arguments. Type 'help " << theArgv[0] << "'";
return 1;
}
TopoDS_Shape aSource = DBRep::Get(theArgv[2]);
if ( aSource.IsNull() )
{
Message::SendFail() << "Error: source shape ('" << theArgv[2] << "') is null";
return 1;
}
Handle(BRepTools_ReShape) aReShaper = new BRepTools_ReShape;
TopAbs_ShapeEnum aShapeLevel = TopAbs_SHAPE;
// Record the requested modifications
for ( Standard_Integer i = 3; i < theArgc; ++i )
{
Standard_CString anArg = theArgv[i];
TCollection_AsciiString anOpt(anArg);
anOpt.LowerCase();
if ( anOpt == "-replace" )
{
if ( theArgc - i < 3 )
{
Message::SendFail() << "Error: not enough arguments for replacement";
return 1;
}
TopoDS_Shape aWhat = DBRep::Get(theArgv[++i]);
if ( aWhat.IsNull() )
{
Message::SendFail() << "Error: argument shape ('" << theArgv[i] << "') is null";
return 1;
}
TopoDS_Shape aWith = DBRep::Get(theArgv[++i]);
if ( aWith.IsNull() )
{
Message::SendFail() << "Error: replacement shape ('" << theArgv[i] << "') is null";
return 1;
}
aReShaper->Replace(aWhat, aWith);
}
else if ( anOpt == "-remove" )
{
if ( theArgc - i < 2 )
{
Message::SendFail() << "Error: not enough arguments for removal";
return 1;
}
TopoDS_Shape aWhat = DBRep::Get(theArgv[++i]);
if ( aWhat.IsNull() )
{
Message::SendFail() << "Error: shape to remove ('" << theArgv[i] << "') is null";
return 1;
}
aReShaper->Remove(aWhat);
}
else if (anOpt == "-until")
{
if (theArgc - i < 2)
{
Message::SendFail() << "Error: not enough arguments for level specification";
return 1;
}
Standard_CString aLevelCStr = theArgv[++i];
TCollection_AsciiString aLevelStr(aLevelCStr);
aLevelStr.LowerCase();
if (aLevelStr == "compound" ||
aLevelStr == "cd")
aShapeLevel = TopAbs_COMPOUND;
else if (aLevelStr == "compsolid" ||
aLevelStr == "c")
aShapeLevel = TopAbs_COMPSOLID;
else if (aLevelStr == "solid" ||
aLevelStr == "so")
aShapeLevel = TopAbs_SOLID;
else if (aLevelStr == "shell" ||
aLevelStr == "sh")
aShapeLevel = TopAbs_SHELL;
else if (aLevelStr == "face" ||
aLevelStr == "f")
aShapeLevel = TopAbs_FACE;
else if (aLevelStr == "wire" ||
aLevelStr == "w")
aShapeLevel = TopAbs_WIRE;
else if (aLevelStr == "edge" ||
aLevelStr == "e")
aShapeLevel = TopAbs_EDGE;
else if (aLevelStr == "vertex" ||
aLevelStr == "v")
aShapeLevel = TopAbs_VERTEX;
else if (aLevelStr == "shape" ||
aLevelStr == "s")
aShapeLevel = TopAbs_SHAPE;
else
{
Message::SendFail() << "Error: unknown shape type '" << theArgv[i] << "'";
return 1;
}
}
else
{
Message::SendFail() << "Error: invalid syntax at " << anOpt;
return 1;
}
}
// Apply all the recorded modifications
TopoDS_Shape aResult = aReShaper->Apply(aSource, aShapeLevel);
if ( aResult.IsNull() )
{
Message::SendFail() << "Error: result shape is null";
return 1;
}
DBRep::Set(theArgv[1], aResult);
return 0;
}
//=======================================================================
//function : InitCommands
//purpose :
//=======================================================================
void SWDRAW_ShapeUpgrade::InitCommands(Draw_Interpretor& theCommands)
{
static Standard_Integer initactor = 0;
if (initactor)
{
return;
}
initactor = 1;
Standard_CString g = SWDRAW::GroupName(); // "Tests of DivideTool";
theCommands.Add("DT_ShapeDivide",
"DT_ShapeDivide Result Shape Tol: Divides shape with C1 Criterion",
__FILE__,
DT_ShapeDivide,g);
theCommands.Add("DT_SplitAngle",
"DT_SplitAngle Result Shape [MaxAngle=95]: Divides revolved surfaces on segments less MaxAngle deg",
__FILE__,
DT_SplitAngle,g);
theCommands.Add("DT_ShapeConvert",
"DT_ShapeConvert Result Shape convert2d convert3d: Converts curves to beziers",
__FILE__,
DT_ShapeConvert,g);
theCommands.Add("DT_ShapeConvertRev",
"DT_ShapeConvert Result Shape convert2d convert3d: Converts curves to beziers",
__FILE__,
DT_ShapeConvertRev,g);
/* theCommands.Add("DT_PlaneDividedFace",
"DT_PlaneDividedFace Result Face Tol: Transfer into a plane with boundary divided",
__FILE__,
DT_PlaneDividedFace,g);
theCommands.Add("DT_PlaneGridShell",
"DT_PlaneGridShell Result NbU NbV {UKnots} {VKnots} Tol : Create a plane grid Shell",
__FILE__,
DT_PlaneGridShell,g);
theCommands.Add("DT_PlaneFaceCommon",
"DT_PlaneFaceCommon Result Face Shell: Common between a plane Face and a Shell",
__FILE__,
DT_PlaneFaceCommon,g);*/
theCommands.Add("DT_SplitCurve2d",
"DT_SplitCurve2d Curve Tol: Splits the curve with C1 criterion",
__FILE__,
DT_SplitCurve2d,g);
theCommands.Add("DT_SplitCurve",
"DT_SplitCurve Curve Tol: Splits the curve with C1 criterion",
__FILE__,
DT_SplitCurve,g);
theCommands.Add("DT_SplitSurface",
"DT_SplitSurface Result Surface/GridSurf Tol: Splits the surface with C1 criterion",
__FILE__,
DT_SplitSurface,g);
/*theCommands.Add("DT_SupportModification",
"DT_SupportModification Result Shell Surface 2d3dFactor: Surface will support all the faces",
__FILE__,
DT_SupportModification,g);*/
// theCommands.Add("DT_SpltWire","DT_SpltWire Result Wire Tol",
// __FILE__,DT_SplitWire,g);
// theCommands.Add("DT_SplitFace", "DT_SplitFace Result Face Tol",
// __FILE__, DT_SplitFace,g);
// theCommands.Add("DT_Debug", "DT_Debug 0/1 : activation/desactivation of the debug messages",
// __FILE__, DT_Debug,g);
// theCommands.Add ("shellsolid","option[a-b-c-f] shape result",
// __FILE__,shellsolid,g);
theCommands.Add ("offset2dcurve","result curve offset",
__FILE__,offset2dcurve,g);
theCommands.Add ("offsetcurve","result curve offset dir",
__FILE__,offsetcurve,g);
theCommands.Add ("splitface","result face [u usplit1 usplit2...] [v vsplit1 vsplit2 ...]",
__FILE__,splitface,g);
theCommands.Add ("DT_ToBspl","result shape [options=erop]",
__FILE__,converttobspline,g);
theCommands.Add ("DT_ClosedSplit","result shape",
__FILE__,splitclosed,g);
theCommands.Add ("DT_SplitByArea","result shape maxarea [preci]",
__FILE__,splitarea,g);
theCommands.Add ("DT_SplitByNumber","result face number [number2]",
__FILE__,splitbynumber,g);
theCommands.Add ("RemoveIntWires","result minarea wholeshape [faces or wires] [moderemoveface ]",
__FILE__,removeinternalwires,g);
theCommands.Add ("removeloc","result shape [remove_level(see ShapeEnum)]",__FILE__,removeloc,g);
theCommands.Add ("unifysamedom",
"unifysamedom result shape [s1 s2 ...] [-f] [-e] [-nosafe] [+b] [+i] [-t val] [-a val]",
__FILE__,unifysamedom,g);
theCommands.Add ("copytranslate","result shape dx dy dz",__FILE__,copytranslate,g);
theCommands.Add ("reshape",
"\n reshape : result shape [-replace what with] [-remove what] [-until level]"
"\n Basic utility for topological modification: "
"\n '-replace what with' Replaces 'what' sub-shape with 'with' sub-shape"
"\n '-remove what' Removes 'what' sub-shape"
"\n Requests '-replace' and '-remove' can be repeated many times."
"\n '-until level' specifies level until which shape for replcement/removal"
"\n will be searched.",
__FILE__, reshape, g);
}