mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-12-26 17:30:35 +05:00
Algorithm of dependencies definition was updated and replaced. Auxiliry convertation functions were added.
This commit is contained in:
parent
6f0049749d
commit
fa14a07690
@ -5096,11 +5096,12 @@ module GEOM
|
|||||||
* \return texture byte array
|
* \return texture byte array
|
||||||
* Example of using:
|
* Example of using:
|
||||||
* SALOMEDS::TMPFile_var SeqFile =
|
* SALOMEDS::TMPFile_var SeqFile =
|
||||||
* myGeometryGUI->GetGeomGen()->GetDependencyTree( aListOfIORs );
|
* myGeometryGUI->GetGeomGen()->GetDependencyTree( aStudy, aListOfIORs );
|
||||||
* char* buf;
|
* char* buf;
|
||||||
* buf = (char*) &SeqFile[0];
|
* buf = (char*) &SeqFile[0];
|
||||||
*/
|
*/
|
||||||
SALOMEDS::TMPFile GetDependencyTree(in string_array strValues);
|
SALOMEDS::TMPFile GetDependencyTree(in SALOMEDS::Study theStudy,
|
||||||
|
in string_array strValues);
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include <GeometryGUI.h>
|
#include <GeometryGUI.h>
|
||||||
#include "GeometryGUI_Operations.h"
|
#include "GeometryGUI_Operations.h"
|
||||||
|
#include <GEOMBase.h>
|
||||||
#include <GEOM_Operation.h>
|
#include <GEOM_Operation.h>
|
||||||
#include <GEOM_Displayer.h>
|
#include <GEOM_Displayer.h>
|
||||||
|
|
||||||
@ -1044,146 +1045,6 @@ void GEOMToolsGUI::deactivate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
|
||||||
// function :
|
|
||||||
// purpose :
|
|
||||||
//=======================================================================
|
|
||||||
std::string GEOMToolsGUI::getDependencyTree( QStringList rootObjectIORs )
|
|
||||||
{
|
|
||||||
// fill in the tree structure
|
|
||||||
DependencyTree tree;
|
|
||||||
foreach( QString ior, rootObjectIORs ) {
|
|
||||||
GEOM::GEOM_Object_ptr anObj = GEOMBase::GetObjectFromIOR( ior );
|
|
||||||
QList<NodeLevel> upLevelList;
|
|
||||||
getUpwardDependency( anObj, upLevelList );
|
|
||||||
QList<NodeLevel> downLevelList;
|
|
||||||
getDownwardDependency( anObj, downLevelList );
|
|
||||||
tree.insert( ior, QPair<QList<NodeLevel>, QList<NodeLevel> >( upLevelList, downLevelList ) );
|
|
||||||
}
|
|
||||||
// translation the tree into string
|
|
||||||
std::string treeStr;
|
|
||||||
DependencyTree::iterator i;
|
|
||||||
for ( i = tree.begin(); i != tree.end(); ++i ) {
|
|
||||||
treeStr.append( i.key().toUtf8().constData() );
|
|
||||||
treeStr.append( "-" );
|
|
||||||
QList<NodeLevel> upLevelList = i.value().first;
|
|
||||||
treeStr.append( "upward" );
|
|
||||||
treeStr.append( "{" );
|
|
||||||
foreach( NodeLevel level, upLevelList ) {
|
|
||||||
NodeLevel::iterator upIter;
|
|
||||||
for ( upIter = level.begin(); upIter != level.end(); ++upIter ) {
|
|
||||||
treeStr.append( upIter.key().toUtf8().constData() );
|
|
||||||
treeStr.append( "_" );
|
|
||||||
treeStr.append( QStringList(upIter.value()).join("_").toUtf8().constData() );
|
|
||||||
treeStr.append( upIter+1 == level.end() ? ";" : "," );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
treeStr.append( "}" );
|
|
||||||
QList<NodeLevel> downLevelList = i.value().second;
|
|
||||||
treeStr.append( "downward" );
|
|
||||||
treeStr.append( "{" );
|
|
||||||
foreach( NodeLevel level, downLevelList ) {
|
|
||||||
NodeLevel::iterator downIter;
|
|
||||||
for ( downIter = level.begin(); downIter != level.end(); ++downIter ) {
|
|
||||||
treeStr.append( downIter.key().toUtf8().constData() );
|
|
||||||
treeStr.append( "_" );
|
|
||||||
treeStr.append( QStringList(downIter.value()).join("_").toUtf8().constData() );
|
|
||||||
treeStr.append( downIter+1 == level.end() ? ";" : "," );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
treeStr.append("}");
|
|
||||||
}
|
|
||||||
return treeStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================
|
|
||||||
// function :
|
|
||||||
// purpose :
|
|
||||||
//=======================================================================
|
|
||||||
void GEOMToolsGUI::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
|
|
||||||
QList<NodeLevel> &upLevelList,
|
|
||||||
int level )
|
|
||||||
{
|
|
||||||
QString aGboIOR = GEOMBase::GetIORFromObject(GEOM::GEOM_Object::_narrow(gbo));
|
|
||||||
GEOM::ListOfGBO_var depList = gbo->GetDependency();
|
|
||||||
for( int j = 0; j < depList->length(); j++ ) {
|
|
||||||
if ( level > 0 ) {
|
|
||||||
QStringList anIORs;
|
|
||||||
NodeLevel aLevelMap;
|
|
||||||
if ( level-1 >= upLevelList.size() ) {
|
|
||||||
upLevelList.append( aLevelMap );
|
|
||||||
} else {
|
|
||||||
aLevelMap = upLevelList.at(level-1);
|
|
||||||
if ( aLevelMap.contains( aGboIOR ) )
|
|
||||||
anIORs = aLevelMap.value( aGboIOR );
|
|
||||||
}
|
|
||||||
anIORs << GEOMBase::GetIORFromObject(GEOM::GEOM_Object::_narrow(depList[j]));
|
|
||||||
aLevelMap.insert( aGboIOR, anIORs );
|
|
||||||
}
|
|
||||||
getUpwardDependency(depList[j], upLevelList, level++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================
|
|
||||||
// function :
|
|
||||||
// purpose :
|
|
||||||
//=======================================================================
|
|
||||||
void GEOMToolsGUI::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
|
|
||||||
QList<NodeLevel> &downLevelList,
|
|
||||||
int level )
|
|
||||||
{
|
|
||||||
SalomeApp_Application* app =
|
|
||||||
dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
|
|
||||||
if ( !app )
|
|
||||||
return;
|
|
||||||
|
|
||||||
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
|
|
||||||
if ( !appStudy )
|
|
||||||
return;
|
|
||||||
|
|
||||||
_PTR(Study) aStudy = appStudy->studyDS();
|
|
||||||
|
|
||||||
// get GEOM component
|
|
||||||
CORBA::String_var geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() );
|
|
||||||
QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR.in() ) );
|
|
||||||
|
|
||||||
_PTR(SObject) comp = aStudy->FindObjectID( geomComp.toLatin1().data() );
|
|
||||||
if ( !comp )
|
|
||||||
return;
|
|
||||||
|
|
||||||
_PTR(ChildIterator) it ( aStudy->NewChildIterator( comp ) );
|
|
||||||
for ( it->InitEx( true ); it->More(); it->Next() ) {
|
|
||||||
_PTR(SObject) child( it->Value() );
|
|
||||||
CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject( child );
|
|
||||||
GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
|
|
||||||
if( CORBA::is_nil( geomObj ) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
GEOM::ListOfGBO_var depList = geomObj->GetDependency();
|
|
||||||
if( depList->length() == 0 )
|
|
||||||
continue;
|
|
||||||
QString aGoIOR = GEOMBase::GetIORFromObject( geomObj );
|
|
||||||
|
|
||||||
for( int i = 0; i < depList->length(); i++ ) {
|
|
||||||
if ( depList[i]->IsSame( gbo ) ) {
|
|
||||||
QStringList anIORs;
|
|
||||||
NodeLevel aLevelMap;
|
|
||||||
if ( level >= downLevelList.size() ) {
|
|
||||||
aLevelMap = NodeLevel();
|
|
||||||
downLevelList.append( aLevelMap );
|
|
||||||
} else {
|
|
||||||
aLevelMap = downLevelList.at(level);
|
|
||||||
if ( aLevelMap.contains( aGoIOR ) )
|
|
||||||
anIORs = aLevelMap.value( aGoIOR );
|
|
||||||
}
|
|
||||||
anIORs << GEOMBase::GetIORFromObject(GEOM::GEOM_Object::_narrow(depList[i]));
|
|
||||||
aLevelMap.insert( aGoIOR, anIORs );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getDownwardDependency(geomObj, downLevelList, level++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//=====================================================================================
|
//=====================================================================================
|
||||||
// EXPORTED METHODS
|
// EXPORTED METHODS
|
||||||
//=====================================================================================
|
//=====================================================================================
|
||||||
|
@ -30,7 +30,6 @@
|
|||||||
#include "GEOM_ToolsGUI.hxx"
|
#include "GEOM_ToolsGUI.hxx"
|
||||||
|
|
||||||
#include <GEOMGUI.h>
|
#include <GEOMGUI.h>
|
||||||
#include <GEOMBase.h>
|
|
||||||
#include <SALOMEDSClient.hxx>
|
#include <SALOMEDSClient.hxx>
|
||||||
|
|
||||||
class GEOM_Displayer;
|
class GEOM_Displayer;
|
||||||
@ -43,11 +42,6 @@ class Handle_SALOME_InteractiveObject;
|
|||||||
class Handle_AIS_InteractiveContext;
|
class Handle_AIS_InteractiveContext;
|
||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QMap>
|
|
||||||
#include <QPair>
|
|
||||||
|
|
||||||
typedef QMap< QString, QStringList > NodeLevel;
|
|
||||||
typedef QMap< QString, QPair<QList<NodeLevel>, QList<NodeLevel> > > DependencyTree;
|
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
// class : GEOMToolsGUI
|
// class : GEOMToolsGUI
|
||||||
@ -66,14 +60,6 @@ public:
|
|||||||
|
|
||||||
enum ActionType { SHOWDLG, INCR, DECR };
|
enum ActionType { SHOWDLG, INCR, DECR };
|
||||||
|
|
||||||
std::string getDependencyTree( QStringList rootObjectIORs );
|
|
||||||
void getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
|
|
||||||
QList<NodeLevel> &upLevelList,
|
|
||||||
int level = 0 );
|
|
||||||
void getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
|
|
||||||
QList<NodeLevel> &downLevelList,
|
|
||||||
int level = 0 );
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Import and export topology methods
|
// Import and export topology methods
|
||||||
bool Import();
|
bool Import();
|
||||||
|
@ -87,6 +87,7 @@
|
|||||||
#include <ElSLib.hxx>
|
#include <ElSLib.hxx>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include <Standard_Failure.hxx>
|
#include <Standard_Failure.hxx>
|
||||||
#include <Standard_NullObject.hxx>
|
#include <Standard_NullObject.hxx>
|
||||||
@ -94,11 +95,13 @@
|
|||||||
|
|
||||||
#define STD_SORT_ALGO 1
|
#define STD_SORT_ALGO 1
|
||||||
|
|
||||||
|
namespace GEOMUtils {
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : GetPosition
|
//function : GetPosition
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
gp_Ax3 GEOMUtils::GetPosition (const TopoDS_Shape& theShape)
|
gp_Ax3 GetPosition (const TopoDS_Shape& theShape)
|
||||||
{
|
{
|
||||||
gp_Ax3 aResult;
|
gp_Ax3 aResult;
|
||||||
|
|
||||||
@ -158,7 +161,7 @@ gp_Ax3 GEOMUtils::GetPosition (const TopoDS_Shape& theShape)
|
|||||||
//function : GetVector
|
//function : GetVector
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
gp_Vec GEOMUtils::GetVector (const TopoDS_Shape& theShape,
|
gp_Vec GetVector (const TopoDS_Shape& theShape,
|
||||||
Standard_Boolean doConsiderOrientation)
|
Standard_Boolean doConsiderOrientation)
|
||||||
{
|
{
|
||||||
if (theShape.IsNull())
|
if (theShape.IsNull())
|
||||||
@ -227,7 +230,7 @@ std::pair<double, double> ShapeToDouble (const TopoDS_Shape& S, bool isOldSortin
|
|||||||
//function : CompareShapes::operator()
|
//function : CompareShapes::operator()
|
||||||
//purpose : used by std::sort(), called from SortShapes()
|
//purpose : used by std::sort(), called from SortShapes()
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
bool GEOMUtils::CompareShapes::operator() (const TopoDS_Shape& theShape1,
|
bool CompareShapes::operator() (const TopoDS_Shape& theShape1,
|
||||||
const TopoDS_Shape& theShape2)
|
const TopoDS_Shape& theShape2)
|
||||||
{
|
{
|
||||||
if (!myMap.IsBound(theShape1)) {
|
if (!myMap.IsBound(theShape1)) {
|
||||||
@ -287,7 +290,7 @@ bool GEOMUtils::CompareShapes::operator() (const TopoDS_Shape& theShape1,
|
|||||||
//function : SortShapes
|
//function : SortShapes
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void GEOMUtils::SortShapes (TopTools_ListOfShape& SL,
|
void SortShapes (TopTools_ListOfShape& SL,
|
||||||
const Standard_Boolean isOldSorting)
|
const Standard_Boolean isOldSorting)
|
||||||
{
|
{
|
||||||
#ifdef STD_SORT_ALGO
|
#ifdef STD_SORT_ALGO
|
||||||
@ -425,7 +428,7 @@ void GEOMUtils::SortShapes (TopTools_ListOfShape& SL,
|
|||||||
//function : CompsolidToCompound
|
//function : CompsolidToCompound
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
TopoDS_Shape GEOMUtils::CompsolidToCompound (const TopoDS_Shape& theCompsolid)
|
TopoDS_Shape CompsolidToCompound (const TopoDS_Shape& theCompsolid)
|
||||||
{
|
{
|
||||||
if (theCompsolid.ShapeType() != TopAbs_COMPSOLID) {
|
if (theCompsolid.ShapeType() != TopAbs_COMPSOLID) {
|
||||||
return theCompsolid;
|
return theCompsolid;
|
||||||
@ -452,7 +455,7 @@ TopoDS_Shape GEOMUtils::CompsolidToCompound (const TopoDS_Shape& theCompsolid)
|
|||||||
//function : AddSimpleShapes
|
//function : AddSimpleShapes
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void GEOMUtils::AddSimpleShapes (const TopoDS_Shape& theShape, TopTools_ListOfShape& theList)
|
void AddSimpleShapes (const TopoDS_Shape& theShape, TopTools_ListOfShape& theList)
|
||||||
{
|
{
|
||||||
if (theShape.ShapeType() != TopAbs_COMPOUND &&
|
if (theShape.ShapeType() != TopAbs_COMPOUND &&
|
||||||
theShape.ShapeType() != TopAbs_COMPSOLID) {
|
theShape.ShapeType() != TopAbs_COMPSOLID) {
|
||||||
@ -480,7 +483,7 @@ void GEOMUtils::AddSimpleShapes (const TopoDS_Shape& theShape, TopTools_ListOfSh
|
|||||||
//function : CheckTriangulation
|
//function : CheckTriangulation
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
bool GEOMUtils::CheckTriangulation (const TopoDS_Shape& aShape)
|
bool CheckTriangulation (const TopoDS_Shape& aShape)
|
||||||
{
|
{
|
||||||
bool isTriangulation = true;
|
bool isTriangulation = true;
|
||||||
|
|
||||||
@ -530,7 +533,7 @@ bool GEOMUtils::CheckTriangulation (const TopoDS_Shape& aShape)
|
|||||||
//function : GetTypeOfSimplePart
|
//function : GetTypeOfSimplePart
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
TopAbs_ShapeEnum GEOMUtils::GetTypeOfSimplePart (const TopoDS_Shape& theShape)
|
TopAbs_ShapeEnum GetTypeOfSimplePart (const TopoDS_Shape& theShape)
|
||||||
{
|
{
|
||||||
TopAbs_ShapeEnum aType = theShape.ShapeType();
|
TopAbs_ShapeEnum aType = theShape.ShapeType();
|
||||||
if (aType == TopAbs_VERTEX) return TopAbs_VERTEX;
|
if (aType == TopAbs_VERTEX) return TopAbs_VERTEX;
|
||||||
@ -551,7 +554,7 @@ TopAbs_ShapeEnum GEOMUtils::GetTypeOfSimplePart (const TopoDS_Shape& theShape)
|
|||||||
//function : GetEdgeNearPoint
|
//function : GetEdgeNearPoint
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
TopoDS_Shape GEOMUtils::GetEdgeNearPoint (const TopoDS_Shape& theShape,
|
TopoDS_Shape GetEdgeNearPoint (const TopoDS_Shape& theShape,
|
||||||
const TopoDS_Vertex& thePoint)
|
const TopoDS_Vertex& thePoint)
|
||||||
{
|
{
|
||||||
TopoDS_Shape aResult;
|
TopoDS_Shape aResult;
|
||||||
@ -619,7 +622,7 @@ TopoDS_Shape GEOMUtils::GetEdgeNearPoint (const TopoDS_Shape& theShape,
|
|||||||
//function : PreciseBoundingBox
|
//function : PreciseBoundingBox
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
Standard_Boolean GEOMUtils::PreciseBoundingBox
|
Standard_Boolean PreciseBoundingBox
|
||||||
(const TopoDS_Shape &theShape, Bnd_Box &theBox)
|
(const TopoDS_Shape &theShape, Bnd_Box &theBox)
|
||||||
{
|
{
|
||||||
Standard_Real aBound[6];
|
Standard_Real aBound[6];
|
||||||
@ -665,7 +668,7 @@ Standard_Boolean GEOMUtils::PreciseBoundingBox
|
|||||||
|
|
||||||
// Get minimal distance between planar face and shape.
|
// Get minimal distance between planar face and shape.
|
||||||
Standard_Real aMinDist =
|
Standard_Real aMinDist =
|
||||||
GEOMUtils::GetMinDistance(aFace, theShape, aPMin[0], aPMin[1]);
|
GetMinDistance(aFace, theShape, aPMin[0], aPMin[1]);
|
||||||
|
|
||||||
if (aMinDist < 0.) {
|
if (aMinDist < 0.) {
|
||||||
return Standard_False;
|
return Standard_False;
|
||||||
@ -681,173 +684,20 @@ Standard_Boolean GEOMUtils::PreciseBoundingBox
|
|||||||
return Standard_True;
|
return Standard_True;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
|
||||||
//function : GetMinDistanceSingular
|
|
||||||
//purpose :
|
|
||||||
//=======================================================================
|
|
||||||
double GEOMUtils::GetMinDistanceSingular(const TopoDS_Shape& aSh1,
|
|
||||||
const TopoDS_Shape& aSh2,
|
|
||||||
gp_Pnt& Ptmp1, gp_Pnt& Ptmp2)
|
|
||||||
{
|
|
||||||
TopoDS_Shape tmpSh1;
|
|
||||||
TopoDS_Shape tmpSh2;
|
|
||||||
Standard_Real AddDist1 = 0.;
|
|
||||||
Standard_Real AddDist2 = 0.;
|
|
||||||
Standard_Boolean IsChange1 = GEOMUtils::ModifyShape(aSh1, tmpSh1, AddDist1);
|
|
||||||
Standard_Boolean IsChange2 = GEOMUtils::ModifyShape(aSh2, tmpSh2, AddDist2);
|
|
||||||
|
|
||||||
if( !IsChange1 && !IsChange2 )
|
|
||||||
return -2.0;
|
|
||||||
|
|
||||||
BRepExtrema_DistShapeShape dst(tmpSh1,tmpSh2);
|
|
||||||
if (dst.IsDone()) {
|
|
||||||
double MinDist = 1.e9;
|
|
||||||
gp_Pnt PMin1, PMin2, P1, P2;
|
|
||||||
for (int i = 1; i <= dst.NbSolution(); i++) {
|
|
||||||
P1 = dst.PointOnShape1(i);
|
|
||||||
P2 = dst.PointOnShape2(i);
|
|
||||||
Standard_Real Dist = P1.Distance(P2);
|
|
||||||
if (MinDist > Dist) {
|
|
||||||
MinDist = Dist;
|
|
||||||
PMin1 = P1;
|
|
||||||
PMin2 = P2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(MinDist<1.e-7) {
|
|
||||||
Ptmp1 = PMin1;
|
|
||||||
Ptmp2 = PMin2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
gp_Dir aDir(gp_Vec(PMin1,PMin2));
|
|
||||||
if( MinDist > (AddDist1+AddDist2) ) {
|
|
||||||
Ptmp1 = gp_Pnt( PMin1.X() + aDir.X()*AddDist1,
|
|
||||||
PMin1.Y() + aDir.Y()*AddDist1,
|
|
||||||
PMin1.Z() + aDir.Z()*AddDist1 );
|
|
||||||
Ptmp2 = gp_Pnt( PMin2.X() - aDir.X()*AddDist2,
|
|
||||||
PMin2.Y() - aDir.Y()*AddDist2,
|
|
||||||
PMin2.Z() - aDir.Z()*AddDist2 );
|
|
||||||
return (MinDist - AddDist1 - AddDist2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if( AddDist1 > 0 ) {
|
|
||||||
Ptmp1 = gp_Pnt( PMin1.X() + aDir.X()*AddDist1,
|
|
||||||
PMin1.Y() + aDir.Y()*AddDist1,
|
|
||||||
PMin1.Z() + aDir.Z()*AddDist1 );
|
|
||||||
Ptmp2 = Ptmp1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Ptmp2 = gp_Pnt( PMin2.X() - aDir.X()*AddDist2,
|
|
||||||
PMin2.Y() - aDir.Y()*AddDist2,
|
|
||||||
PMin2.Z() - aDir.Z()*AddDist2 );
|
|
||||||
Ptmp1 = Ptmp2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
double res = MinDist - AddDist1 - AddDist2;
|
|
||||||
if(res<0.) res = 0.0;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
return -2.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================
|
|
||||||
//function : GetMinDistance
|
|
||||||
//purpose :
|
|
||||||
//=======================================================================
|
|
||||||
Standard_Real GEOMUtils::GetMinDistance
|
|
||||||
(const TopoDS_Shape& theShape1,
|
|
||||||
const TopoDS_Shape& theShape2,
|
|
||||||
gp_Pnt& thePnt1, gp_Pnt& thePnt2)
|
|
||||||
{
|
|
||||||
Standard_Real aResult = 1.e9;
|
|
||||||
|
|
||||||
// Issue 0020231: A min distance bug with torus and vertex.
|
|
||||||
// Make GetMinDistance() return zero if a sole VERTEX is inside any of SOLIDs
|
|
||||||
|
|
||||||
// which of shapes consists of only one vertex?
|
|
||||||
TopExp_Explorer exp1(theShape1,TopAbs_VERTEX), exp2(theShape2,TopAbs_VERTEX);
|
|
||||||
TopoDS_Shape V1 = exp1.More() ? exp1.Current() : TopoDS_Shape();
|
|
||||||
TopoDS_Shape V2 = exp2.More() ? exp2.Current() : TopoDS_Shape();
|
|
||||||
exp1.Next(); exp2.Next();
|
|
||||||
if ( exp1.More() ) V1.Nullify();
|
|
||||||
if ( exp2.More() ) V2.Nullify();
|
|
||||||
// vertex and container of solids
|
|
||||||
TopoDS_Shape V = V1.IsNull() ? V2 : V1;
|
|
||||||
TopoDS_Shape S = V1.IsNull() ? theShape1 : theShape2;
|
|
||||||
if ( !V.IsNull() ) {
|
|
||||||
// classify vertex against solids
|
|
||||||
gp_Pnt p = BRep_Tool::Pnt( TopoDS::Vertex( V ) );
|
|
||||||
for ( exp1.Init( S, TopAbs_SOLID ); exp1.More(); exp1.Next() ) {
|
|
||||||
BRepClass3d_SolidClassifier classifier( exp1.Current(), p, 1e-6);
|
|
||||||
if ( classifier.State() == TopAbs_IN ) {
|
|
||||||
thePnt1 = p;
|
|
||||||
thePnt2 = p;
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// End Issue 0020231
|
|
||||||
|
|
||||||
// skl 30.06.2008
|
|
||||||
// additional workaround for bugs 19899, 19908 and 19910 from Mantis
|
|
||||||
double dist = GEOMUtils::GetMinDistanceSingular
|
|
||||||
(theShape1, theShape2, thePnt1, thePnt2);
|
|
||||||
|
|
||||||
if (dist > -1.0) {
|
|
||||||
return dist;
|
|
||||||
}
|
|
||||||
|
|
||||||
BRepExtrema_DistShapeShape dst (theShape1, theShape2);
|
|
||||||
if (dst.IsDone()) {
|
|
||||||
gp_Pnt P1, P2;
|
|
||||||
|
|
||||||
for (int i = 1; i <= dst.NbSolution(); i++) {
|
|
||||||
P1 = dst.PointOnShape1(i);
|
|
||||||
P2 = dst.PointOnShape2(i);
|
|
||||||
|
|
||||||
Standard_Real Dist = P1.Distance(P2);
|
|
||||||
if (aResult > Dist) {
|
|
||||||
aResult = Dist;
|
|
||||||
thePnt1 = P1;
|
|
||||||
thePnt2 = P2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return aResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================
|
|
||||||
// function : ConvertClickToPoint()
|
|
||||||
// purpose : Returns the point clicked in 3D view
|
|
||||||
//=======================================================================
|
|
||||||
gp_Pnt GEOMUtils::ConvertClickToPoint( int x, int y, Handle(V3d_View) aView )
|
|
||||||
{
|
|
||||||
V3d_Coordinate XEye, YEye, ZEye, XAt, YAt, ZAt;
|
|
||||||
aView->Eye( XEye, YEye, ZEye );
|
|
||||||
|
|
||||||
aView->At( XAt, YAt, ZAt );
|
|
||||||
gp_Pnt EyePoint( XEye, YEye, ZEye );
|
|
||||||
gp_Pnt AtPoint( XAt, YAt, ZAt );
|
|
||||||
|
|
||||||
gp_Vec EyeVector( EyePoint, AtPoint );
|
|
||||||
gp_Dir EyeDir( EyeVector );
|
|
||||||
|
|
||||||
gp_Pln PlaneOfTheView = gp_Pln( AtPoint, EyeDir );
|
|
||||||
Standard_Real X, Y, Z;
|
|
||||||
aView->Convert( x, y, X, Y, Z );
|
|
||||||
gp_Pnt ConvertedPoint( X, Y, Z );
|
|
||||||
|
|
||||||
gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project( PlaneOfTheView, ConvertedPoint );
|
|
||||||
gp_Pnt ResultPoint = ElSLib::Value( ConvertedPointOnPlane.X(), ConvertedPointOnPlane.Y(), PlaneOfTheView );
|
|
||||||
return ResultPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
// function : ModifyShape
|
// function : ModifyShape
|
||||||
// purpose :
|
// purpose : This function constructs and returns modified shape
|
||||||
|
// from the original one for singular cases.
|
||||||
|
// It is used for the method GetMinDistanceSingular.
|
||||||
|
//
|
||||||
|
// \param theShape the original shape
|
||||||
|
// \param theModifiedShape output parameter. The modified shape.
|
||||||
|
// \param theAddDist output parameter. The added distance for modified shape.
|
||||||
|
// \retval true if the shape is modified; false otherwise.
|
||||||
|
//
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
Standard_Boolean GEOMUtils::ModifyShape(const TopoDS_Shape &theShape,
|
Standard_Boolean ModifyShape(const TopoDS_Shape &theShape,
|
||||||
TopoDS_Shape &theModifiedShape,
|
TopoDS_Shape &theModifiedShape,
|
||||||
Standard_Real &theAddDist)
|
Standard_Real &theAddDist)
|
||||||
{
|
{
|
||||||
@ -950,3 +800,297 @@ Standard_Boolean GEOMUtils::ModifyShape(const TopoDS_Shape &theShape,
|
|||||||
|
|
||||||
return isModified;
|
return isModified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : GetMinDistanceSingular
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
double GetMinDistanceSingular(const TopoDS_Shape& aSh1,
|
||||||
|
const TopoDS_Shape& aSh2,
|
||||||
|
gp_Pnt& Ptmp1, gp_Pnt& Ptmp2)
|
||||||
|
{
|
||||||
|
TopoDS_Shape tmpSh1;
|
||||||
|
TopoDS_Shape tmpSh2;
|
||||||
|
Standard_Real AddDist1 = 0.;
|
||||||
|
Standard_Real AddDist2 = 0.;
|
||||||
|
Standard_Boolean IsChange1 = ModifyShape(aSh1, tmpSh1, AddDist1);
|
||||||
|
Standard_Boolean IsChange2 = ModifyShape(aSh2, tmpSh2, AddDist2);
|
||||||
|
|
||||||
|
if( !IsChange1 && !IsChange2 )
|
||||||
|
return -2.0;
|
||||||
|
|
||||||
|
BRepExtrema_DistShapeShape dst(tmpSh1,tmpSh2);
|
||||||
|
if (dst.IsDone()) {
|
||||||
|
double MinDist = 1.e9;
|
||||||
|
gp_Pnt PMin1, PMin2, P1, P2;
|
||||||
|
for (int i = 1; i <= dst.NbSolution(); i++) {
|
||||||
|
P1 = dst.PointOnShape1(i);
|
||||||
|
P2 = dst.PointOnShape2(i);
|
||||||
|
Standard_Real Dist = P1.Distance(P2);
|
||||||
|
if (MinDist > Dist) {
|
||||||
|
MinDist = Dist;
|
||||||
|
PMin1 = P1;
|
||||||
|
PMin2 = P2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(MinDist<1.e-7) {
|
||||||
|
Ptmp1 = PMin1;
|
||||||
|
Ptmp2 = PMin2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gp_Dir aDir(gp_Vec(PMin1,PMin2));
|
||||||
|
if( MinDist > (AddDist1+AddDist2) ) {
|
||||||
|
Ptmp1 = gp_Pnt( PMin1.X() + aDir.X()*AddDist1,
|
||||||
|
PMin1.Y() + aDir.Y()*AddDist1,
|
||||||
|
PMin1.Z() + aDir.Z()*AddDist1 );
|
||||||
|
Ptmp2 = gp_Pnt( PMin2.X() - aDir.X()*AddDist2,
|
||||||
|
PMin2.Y() - aDir.Y()*AddDist2,
|
||||||
|
PMin2.Z() - aDir.Z()*AddDist2 );
|
||||||
|
return (MinDist - AddDist1 - AddDist2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if( AddDist1 > 0 ) {
|
||||||
|
Ptmp1 = gp_Pnt( PMin1.X() + aDir.X()*AddDist1,
|
||||||
|
PMin1.Y() + aDir.Y()*AddDist1,
|
||||||
|
PMin1.Z() + aDir.Z()*AddDist1 );
|
||||||
|
Ptmp2 = Ptmp1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Ptmp2 = gp_Pnt( PMin2.X() - aDir.X()*AddDist2,
|
||||||
|
PMin2.Y() - aDir.Y()*AddDist2,
|
||||||
|
PMin2.Z() - aDir.Z()*AddDist2 );
|
||||||
|
Ptmp1 = Ptmp2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
double res = MinDist - AddDist1 - AddDist2;
|
||||||
|
if(res<0.) res = 0.0;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return -2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : GetMinDistance
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Real GetMinDistance
|
||||||
|
(const TopoDS_Shape& theShape1,
|
||||||
|
const TopoDS_Shape& theShape2,
|
||||||
|
gp_Pnt& thePnt1, gp_Pnt& thePnt2)
|
||||||
|
{
|
||||||
|
Standard_Real aResult = 1.e9;
|
||||||
|
|
||||||
|
// Issue 0020231: A min distance bug with torus and vertex.
|
||||||
|
// Make GetMinDistance() return zero if a sole VERTEX is inside any of SOLIDs
|
||||||
|
|
||||||
|
// which of shapes consists of only one vertex?
|
||||||
|
TopExp_Explorer exp1(theShape1,TopAbs_VERTEX), exp2(theShape2,TopAbs_VERTEX);
|
||||||
|
TopoDS_Shape V1 = exp1.More() ? exp1.Current() : TopoDS_Shape();
|
||||||
|
TopoDS_Shape V2 = exp2.More() ? exp2.Current() : TopoDS_Shape();
|
||||||
|
exp1.Next(); exp2.Next();
|
||||||
|
if ( exp1.More() ) V1.Nullify();
|
||||||
|
if ( exp2.More() ) V2.Nullify();
|
||||||
|
// vertex and container of solids
|
||||||
|
TopoDS_Shape V = V1.IsNull() ? V2 : V1;
|
||||||
|
TopoDS_Shape S = V1.IsNull() ? theShape1 : theShape2;
|
||||||
|
if ( !V.IsNull() ) {
|
||||||
|
// classify vertex against solids
|
||||||
|
gp_Pnt p = BRep_Tool::Pnt( TopoDS::Vertex( V ) );
|
||||||
|
for ( exp1.Init( S, TopAbs_SOLID ); exp1.More(); exp1.Next() ) {
|
||||||
|
BRepClass3d_SolidClassifier classifier( exp1.Current(), p, 1e-6);
|
||||||
|
if ( classifier.State() == TopAbs_IN ) {
|
||||||
|
thePnt1 = p;
|
||||||
|
thePnt2 = p;
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// End Issue 0020231
|
||||||
|
|
||||||
|
// skl 30.06.2008
|
||||||
|
// additional workaround for bugs 19899, 19908 and 19910 from Mantis
|
||||||
|
double dist = GetMinDistanceSingular
|
||||||
|
(theShape1, theShape2, thePnt1, thePnt2);
|
||||||
|
|
||||||
|
if (dist > -1.0) {
|
||||||
|
return dist;
|
||||||
|
}
|
||||||
|
|
||||||
|
BRepExtrema_DistShapeShape dst (theShape1, theShape2);
|
||||||
|
if (dst.IsDone()) {
|
||||||
|
gp_Pnt P1, P2;
|
||||||
|
|
||||||
|
for (int i = 1; i <= dst.NbSolution(); i++) {
|
||||||
|
P1 = dst.PointOnShape1(i);
|
||||||
|
P2 = dst.PointOnShape2(i);
|
||||||
|
|
||||||
|
Standard_Real Dist = P1.Distance(P2);
|
||||||
|
if (aResult > Dist) {
|
||||||
|
aResult = Dist;
|
||||||
|
thePnt1 = P1;
|
||||||
|
thePnt2 = P2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// function : ConvertClickToPoint()
|
||||||
|
// purpose : Returns the point clicked in 3D view
|
||||||
|
//=======================================================================
|
||||||
|
gp_Pnt ConvertClickToPoint( int x, int y, Handle(V3d_View) aView )
|
||||||
|
{
|
||||||
|
V3d_Coordinate XEye, YEye, ZEye, XAt, YAt, ZAt;
|
||||||
|
aView->Eye( XEye, YEye, ZEye );
|
||||||
|
|
||||||
|
aView->At( XAt, YAt, ZAt );
|
||||||
|
gp_Pnt EyePoint( XEye, YEye, ZEye );
|
||||||
|
gp_Pnt AtPoint( XAt, YAt, ZAt );
|
||||||
|
|
||||||
|
gp_Vec EyeVector( EyePoint, AtPoint );
|
||||||
|
gp_Dir EyeDir( EyeVector );
|
||||||
|
|
||||||
|
gp_Pln PlaneOfTheView = gp_Pln( AtPoint, EyeDir );
|
||||||
|
Standard_Real X, Y, Z;
|
||||||
|
aView->Convert( x, y, X, Y, Z );
|
||||||
|
gp_Pnt ConvertedPoint( X, Y, Z );
|
||||||
|
|
||||||
|
gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project( PlaneOfTheView, ConvertedPoint );
|
||||||
|
gp_Pnt ResultPoint = ElSLib::Value( ConvertedPointOnPlane.X(), ConvertedPointOnPlane.Y(), PlaneOfTheView );
|
||||||
|
return ResultPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// function : ConvertTreeToString()
|
||||||
|
// purpose : Returns the string representation of dependency tree
|
||||||
|
//=======================================================================
|
||||||
|
void ConvertTreeToString( const TreeModel &tree,
|
||||||
|
std::string &treeStr )
|
||||||
|
{
|
||||||
|
TreeModel::const_iterator i;
|
||||||
|
for ( i = tree.begin(); i != tree.end(); ++i ) {
|
||||||
|
treeStr.append( i->first );
|
||||||
|
treeStr.append( "-" );
|
||||||
|
std::vector<LevelInfo> upLevelList = i->second.first;
|
||||||
|
treeStr.append( "upward" );
|
||||||
|
treeStr.append( "{" );
|
||||||
|
for( std::vector<LevelInfo>::iterator j = upLevelList.begin();
|
||||||
|
j != upLevelList.end(); ++j ) {
|
||||||
|
LevelInfo level = (*j);
|
||||||
|
LevelInfo::iterator upIter;
|
||||||
|
for ( upIter = level.begin(); upIter != level.end(); ++upIter ) {
|
||||||
|
treeStr.append( upIter->first );
|
||||||
|
for ( std::vector<std::string>::iterator k = upIter->second.begin();
|
||||||
|
k != upIter->second.end(); ++k ) {
|
||||||
|
treeStr.append( "_" );
|
||||||
|
treeStr.append( *k );
|
||||||
|
}
|
||||||
|
treeStr.append( upIter++ == level.end() ? ";" : "," );
|
||||||
|
upIter--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
treeStr.append( "}" );
|
||||||
|
std::vector<LevelInfo> downLevelList = i->second.second;
|
||||||
|
treeStr.append( "downward" );
|
||||||
|
treeStr.append( "{" );
|
||||||
|
for( std::vector<LevelInfo>::iterator j = downLevelList.begin();
|
||||||
|
j != downLevelList.end(); ++j ) {
|
||||||
|
LevelInfo level = (*j);
|
||||||
|
LevelInfo::iterator downIter;
|
||||||
|
for ( downIter = level.begin(); downIter != level.end(); ++downIter ) {
|
||||||
|
treeStr.append( downIter->first );
|
||||||
|
for ( std::vector<std::string>::iterator k = downIter->second.begin();
|
||||||
|
k != downIter->second.end(); ++k ) {
|
||||||
|
treeStr.append( "_" );
|
||||||
|
treeStr.append( *k );
|
||||||
|
}
|
||||||
|
treeStr.append( downIter++ == level.end() ? ";" : "," );
|
||||||
|
downIter--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
treeStr.append("}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LevelsList parseWard( const std::string& theData, std::size_t& theCursor )
|
||||||
|
{
|
||||||
|
std::size_t indexStart = theData.find( "{", theCursor ) + 1;
|
||||||
|
std::size_t indexEnd = theData.find( "}", indexStart );
|
||||||
|
|
||||||
|
std::string ward = theData.substr( indexStart, indexEnd - indexStart );
|
||||||
|
std::stringstream ss(ward);
|
||||||
|
std::string substr;
|
||||||
|
std::vector<std::string> levelsListStr;
|
||||||
|
while ( std::getline( ss, substr, ';' ) ) {
|
||||||
|
if ( !substr.empty() )
|
||||||
|
levelsListStr.push_back( substr );
|
||||||
|
}
|
||||||
|
LevelsList levelsListData;
|
||||||
|
for( int level = 0; level < levelsListStr.size(); level++ ) {
|
||||||
|
std::cout<<" Level" << level + 1 << ":" << std::endl;
|
||||||
|
std::vector<std::string> namesListStr;
|
||||||
|
ss.str( levelsListStr[level] );
|
||||||
|
while ( std::getline( ss, substr, ',' ) ) {
|
||||||
|
if ( !substr.empty() )
|
||||||
|
namesListStr.push_back( substr );
|
||||||
|
}
|
||||||
|
LevelInfo levelInfoData;
|
||||||
|
for( int node = 0; node < namesListStr.size(); node++ ) {
|
||||||
|
std::vector<std::string> linksListStr;
|
||||||
|
ss.str( namesListStr[node] );
|
||||||
|
while ( std::getline( ss, substr, '_' ) ) {
|
||||||
|
if ( !substr.empty() )
|
||||||
|
linksListStr.push_back( substr );
|
||||||
|
}
|
||||||
|
std::string nodeItem = linksListStr[0];
|
||||||
|
if( !nodeItem.empty() ) {
|
||||||
|
NodeLinks linksListData;
|
||||||
|
std::cout<<" " << nodeItem << " - ";
|
||||||
|
for( int link = 1; link < linksListStr.size(); link++ ) {
|
||||||
|
std::string linkItem = linksListStr[link];
|
||||||
|
linksListData.push_back( linkItem );
|
||||||
|
std::cout << linkItem << ", ";
|
||||||
|
}// Links
|
||||||
|
levelInfoData[nodeItem] = linksListData;
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
}// Level's objects
|
||||||
|
levelsListData.push_back(levelInfoData);
|
||||||
|
}// Levels
|
||||||
|
|
||||||
|
theCursor = indexEnd + 1;
|
||||||
|
return levelsListData;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// function : ConvertStringToTree()
|
||||||
|
// purpose : Returns the dependency tree
|
||||||
|
//=======================================================================
|
||||||
|
void ConvertStringToTree( const std::string &theData,
|
||||||
|
TreeModel &tree )
|
||||||
|
{
|
||||||
|
std::size_t cursor = 0;
|
||||||
|
|
||||||
|
while( theData.find('-',cursor) != std::string::npos ) //find next selected object
|
||||||
|
{
|
||||||
|
std::size_t objectIndex = theData.find( '-', cursor );
|
||||||
|
std::string objectEntry = theData.substr( cursor, objectIndex - cursor );
|
||||||
|
std::cout<<"\n\nMainObject = " << objectEntry <<std::endl;
|
||||||
|
cursor = objectIndex;
|
||||||
|
|
||||||
|
std::size_t upwardIndexBegin = theData.find("{",cursor) + 1;
|
||||||
|
std::size_t upwardIndexFinish = theData.find("}",upwardIndexBegin);
|
||||||
|
std::cout<<" Upward:" << std::endl ;
|
||||||
|
LevelsList upwardList = parseWard( theData, cursor );
|
||||||
|
|
||||||
|
std::cout<<" Downward:" << std::endl;
|
||||||
|
LevelsList downwardList = parseWard( theData, cursor );
|
||||||
|
|
||||||
|
tree[objectEntry] = std::pair<LevelsList,LevelsList>( upwardList, downwardList );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} //namespace GEOMUtils
|
||||||
|
@ -40,6 +40,11 @@
|
|||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
class Bnd_Box;
|
class Bnd_Box;
|
||||||
|
|
||||||
inline Standard_Boolean IsEqual (const TopoDS_Shape& S1, const TopoDS_Shape& S2)
|
inline Standard_Boolean IsEqual (const TopoDS_Shape& S1, const TopoDS_Shape& S2)
|
||||||
@ -47,9 +52,13 @@ inline Standard_Boolean IsEqual (const TopoDS_Shape& S1, const TopoDS_Shape& S2)
|
|||||||
return S1.IsSame(S2);
|
return S1.IsSame(S2);
|
||||||
}
|
}
|
||||||
|
|
||||||
class GEOMUtils {
|
namespace GEOMUtils {
|
||||||
|
|
||||||
|
typedef std::vector<std::string> NodeLinks;
|
||||||
|
typedef std::map<std::string, NodeLinks> LevelInfo;
|
||||||
|
typedef std::vector<LevelInfo> LevelsList;
|
||||||
|
typedef std::map<std::string,std::pair<LevelsList,LevelsList> > TreeModel;
|
||||||
|
|
||||||
public:
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Get Local Coordinate System, corresponding to the given shape.
|
* \brief Get Local Coordinate System, corresponding to the given shape.
|
||||||
*
|
*
|
||||||
@ -57,7 +66,7 @@ class GEOMUtils {
|
|||||||
* Axes of the LCS are obtained from shape's location or,
|
* Axes of the LCS are obtained from shape's location or,
|
||||||
* if the shape is a planar face, from position of its plane.
|
* if the shape is a planar face, from position of its plane.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static gp_Ax3 GetPosition (const TopoDS_Shape& theShape);
|
Standard_EXPORT gp_Ax3 GetPosition (const TopoDS_Shape& theShape);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Get vector, defined by the given edge.
|
* \brief Get vector, defined by the given edge.
|
||||||
@ -67,7 +76,7 @@ class GEOMUtils {
|
|||||||
* the same edge can have different orientation depending on the way it was
|
* the same edge can have different orientation depending on the way it was
|
||||||
* extracted from a shape.
|
* extracted from a shape.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static gp_Vec GetVector (const TopoDS_Shape& theShape,
|
Standard_EXPORT gp_Vec GetVector (const TopoDS_Shape& theShape,
|
||||||
Standard_Boolean doConsiderOrientation);
|
Standard_Boolean doConsiderOrientation);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -89,7 +98,7 @@ class GEOMUtils {
|
|||||||
/*!
|
/*!
|
||||||
* \brief Sort shapes by their centers of mass, using formula X*999 + Y*99 + Z*0.9
|
* \brief Sort shapes by their centers of mass, using formula X*999 + Y*99 + Z*0.9
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static void SortShapes (TopTools_ListOfShape& SL,
|
Standard_EXPORT void SortShapes (TopTools_ListOfShape& SL,
|
||||||
const Standard_Boolean isOldSorting = Standard_True);
|
const Standard_Boolean isOldSorting = Standard_True);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -100,7 +109,7 @@ class GEOMUtils {
|
|||||||
* \param theCompsolid The compsolid to be converted.
|
* \param theCompsolid The compsolid to be converted.
|
||||||
* \retval TopoDS_Shape Returns the resulting compound.
|
* \retval TopoDS_Shape Returns the resulting compound.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static TopoDS_Shape CompsolidToCompound (const TopoDS_Shape& theCompsolid);
|
Standard_EXPORT TopoDS_Shape CompsolidToCompound (const TopoDS_Shape& theCompsolid);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Recursively extract all shapes from compounds and compsolids of the given shape into theList.
|
* \brief Recursively extract all shapes from compounds and compsolids of the given shape into theList.
|
||||||
@ -110,7 +119,7 @@ class GEOMUtils {
|
|||||||
* \param theShape The shape to be exploded.
|
* \param theShape The shape to be exploded.
|
||||||
* \param theList Output parameter.
|
* \param theList Output parameter.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static void AddSimpleShapes (const TopoDS_Shape& theShape,
|
Standard_EXPORT void AddSimpleShapes (const TopoDS_Shape& theShape,
|
||||||
TopTools_ListOfShape& theList);
|
TopTools_ListOfShape& theList);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -118,14 +127,14 @@ class GEOMUtils {
|
|||||||
* \param theShape The shape to check/build triangulation on.
|
* \param theShape The shape to check/build triangulation on.
|
||||||
* \retval bool Returns false if the shape has no faces, i.e. impossible to build triangulation.
|
* \retval bool Returns false if the shape has no faces, i.e. impossible to build triangulation.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static bool CheckTriangulation (const TopoDS_Shape& theShape);
|
Standard_EXPORT bool CheckTriangulation (const TopoDS_Shape& theShape);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Return type of shape for explode. In case of compound it will be a type of its first sub shape.
|
* \brief Return type of shape for explode. In case of compound it will be a type of its first sub shape.
|
||||||
* \param theShape The shape to get type of.
|
* \param theShape The shape to get type of.
|
||||||
* \retval TopAbs_ShapeEnum Return type of shape for explode.
|
* \retval TopAbs_ShapeEnum Return type of shape for explode.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static TopAbs_ShapeEnum GetTypeOfSimplePart (const TopoDS_Shape& theShape);
|
Standard_EXPORT TopAbs_ShapeEnum GetTypeOfSimplePart (const TopoDS_Shape& theShape);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Find an edge of theShape, closest to thePoint.
|
* \brief Find an edge of theShape, closest to thePoint.
|
||||||
@ -134,7 +143,7 @@ class GEOMUtils {
|
|||||||
* \param thePoint The point near the required edge.
|
* \param thePoint The point near the required edge.
|
||||||
* \retval TopoDS_Shape Returns the found edge or an empty shape if multiple edges found.
|
* \retval TopoDS_Shape Returns the found edge or an empty shape if multiple edges found.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static TopoDS_Shape GetEdgeNearPoint (const TopoDS_Shape& theShape,
|
Standard_EXPORT TopoDS_Shape GetEdgeNearPoint (const TopoDS_Shape& theShape,
|
||||||
const TopoDS_Vertex& thePoint);
|
const TopoDS_Vertex& thePoint);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -144,7 +153,7 @@ class GEOMUtils {
|
|||||||
* \param theBox rough bounding box on input; precise bounding box on output.
|
* \param theBox rough bounding box on input; precise bounding box on output.
|
||||||
* \retval Standard_True in case of success; Standard_False otherwise.
|
* \retval Standard_True in case of success; Standard_False otherwise.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static Standard_Boolean PreciseBoundingBox
|
Standard_EXPORT Standard_Boolean PreciseBoundingBox
|
||||||
(const TopoDS_Shape &theShape, Bnd_Box &theBox);
|
(const TopoDS_Shape &theShape, Bnd_Box &theBox);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -157,7 +166,7 @@ class GEOMUtils {
|
|||||||
* \param Ptmp2 the output result point on the second shape
|
* \param Ptmp2 the output result point on the second shape
|
||||||
* \retval negative value if it is not a singular case; actual distance for singular case.
|
* \retval negative value if it is not a singular case; actual distance for singular case.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static Standard_Real GetMinDistanceSingular
|
Standard_EXPORT Standard_Real GetMinDistanceSingular
|
||||||
(const TopoDS_Shape& aSh1,
|
(const TopoDS_Shape& aSh1,
|
||||||
const TopoDS_Shape& aSh2,
|
const TopoDS_Shape& aSh2,
|
||||||
gp_Pnt& Ptmp1, gp_Pnt& Ptmp2);
|
gp_Pnt& Ptmp1, gp_Pnt& Ptmp2);
|
||||||
@ -171,7 +180,7 @@ class GEOMUtils {
|
|||||||
* \param thePnt2 the output result point on the second shape
|
* \param thePnt2 the output result point on the second shape
|
||||||
* \retval negative value in case of failure; otherwise the real distance.
|
* \retval negative value in case of failure; otherwise the real distance.
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static Standard_Real GetMinDistance
|
Standard_EXPORT Standard_Real GetMinDistance
|
||||||
(const TopoDS_Shape& theShape1,
|
(const TopoDS_Shape& theShape1,
|
||||||
const TopoDS_Shape& theShape2,
|
const TopoDS_Shape& theShape2,
|
||||||
gp_Pnt& thePnt1, gp_Pnt& thePnt2);
|
gp_Pnt& thePnt1, gp_Pnt& thePnt2);
|
||||||
@ -184,23 +193,13 @@ class GEOMUtils {
|
|||||||
* \param theView View where the given point takes place.
|
* \param theView View where the given point takes place.
|
||||||
* \retval gp_Pnt Returns the point clicked in 3D view
|
* \retval gp_Pnt Returns the point clicked in 3D view
|
||||||
*/
|
*/
|
||||||
Standard_EXPORT static gp_Pnt ConvertClickToPoint( int x, int y, Handle(V3d_View) theView );
|
Standard_EXPORT gp_Pnt ConvertClickToPoint( int x, int y, Handle(V3d_View) theView );
|
||||||
|
|
||||||
private:
|
Standard_EXPORT void ConvertTreeToString( const TreeModel &theTree,
|
||||||
|
std::string &DependencyStr );
|
||||||
/**
|
|
||||||
* This function constructs and returns modified shape from the original one
|
|
||||||
* for singular cases. It is used for the method GetMinDistanceSingular.
|
|
||||||
*
|
|
||||||
* \param theShape the original shape
|
|
||||||
* \param theModifiedShape output parameter. The modified shape.
|
|
||||||
* \param theAddDist output parameter. The added distance for modified shape.
|
|
||||||
* \retval true if the shape is modified; false otherwise.
|
|
||||||
*/
|
|
||||||
static Standard_Boolean ModifyShape(const TopoDS_Shape &theShape,
|
|
||||||
TopoDS_Shape &theModifiedShape,
|
|
||||||
Standard_Real &theAddDist);
|
|
||||||
|
|
||||||
|
Standard_EXPORT void ConvertStringToTree( const std::string &theDependencyStr,
|
||||||
|
TreeModel &tree );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ INCLUDE_DIRECTORIES(
|
|||||||
${PROJECT_SOURCE_DIR}/src/GEOMImpl
|
${PROJECT_SOURCE_DIR}/src/GEOMImpl
|
||||||
${PROJECT_SOURCE_DIR}/src/GEOM
|
${PROJECT_SOURCE_DIR}/src/GEOM
|
||||||
${PROJECT_SOURCE_DIR}/src/GEOMAlgo
|
${PROJECT_SOURCE_DIR}/src/GEOMAlgo
|
||||||
|
${PROJECT_SOURCE_DIR}/src/GEOMUtils
|
||||||
${PROJECT_SOURCE_DIR}/src/XAO
|
${PROJECT_SOURCE_DIR}/src/XAO
|
||||||
${PROJECT_BINARY_DIR}/idl
|
${PROJECT_BINARY_DIR}/idl
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
@ -3043,8 +3043,107 @@ Engines::ListOfData* GEOM_Gen_i::getModifiedData(CORBA::Long studyId)
|
|||||||
// function :
|
// function :
|
||||||
// purpose :
|
// purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
SALOMEDS::TMPFile* GEOM_Gen_i::GetDependencyTree(const GEOM::string_array&) {
|
SALOMEDS::TMPFile* GEOM_Gen_i::GetDependencyTree( SALOMEDS::Study_ptr theStudy,
|
||||||
|
const GEOM::string_array& theObjectIORs ) {
|
||||||
|
// fill in the tree structure
|
||||||
|
GEOMUtils::TreeModel tree;
|
||||||
|
|
||||||
|
// foreach( QString ior, theObjectIORs ) {
|
||||||
|
std::string ior;
|
||||||
|
for ( int i = 0; i < theObjectIORs.length(); i++ ) {
|
||||||
|
ior = theObjectIORs[i].in();
|
||||||
|
GEOM::GEOM_Object_ptr anObj = GetIORFromString( ior.c_str() );
|
||||||
|
GEOMUtils::LevelsList upLevelList;
|
||||||
|
getUpwardDependency( anObj, upLevelList );
|
||||||
|
GEOMUtils::LevelsList downLevelList;
|
||||||
|
getDownwardDependency( theStudy, anObj, downLevelList );
|
||||||
|
tree.insert( std::pair<std::string, std::pair<GEOMUtils::LevelsList,GEOMUtils::LevelsList> >(ior, std::pair<GEOMUtils::LevelsList,GEOMUtils::LevelsList>( upLevelList, downLevelList ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// translation the tree into string
|
||||||
|
std::string treeStr;
|
||||||
|
GEOMUtils::ConvertTreeToString( tree, treeStr );
|
||||||
|
|
||||||
|
char* aBuffer = (char*)CORBA::string_dup(treeStr.c_str());
|
||||||
|
int aBufferSize = strlen((char*)aBuffer);
|
||||||
|
|
||||||
|
CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer;
|
||||||
|
|
||||||
|
SALOMEDS::TMPFile_var aStream = new SALOMEDS::TMPFile(aBufferSize, aBufferSize, anOctetBuf, 1);
|
||||||
|
|
||||||
|
return aStream._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// function :
|
||||||
|
// purpose :
|
||||||
|
//=======================================================================
|
||||||
|
void GEOM_Gen_i::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
|
||||||
|
GEOMUtils::LevelsList &upLevelList,
|
||||||
|
int level ) {
|
||||||
|
std::string aGboIOR = GetStringFromIOR(GEOM::GEOM_Object::_narrow(gbo));
|
||||||
|
GEOM::ListOfGBO_var depList = gbo->GetDependency();
|
||||||
|
for( int j = 0; j < depList->length(); j++ ) {
|
||||||
|
if ( level > 0 ) {
|
||||||
|
GEOMUtils::NodeLinks anIORs;
|
||||||
|
GEOMUtils::LevelInfo aLevelMap;
|
||||||
|
if ( level-1 >= upLevelList.size() ) {
|
||||||
|
upLevelList.push_back( aLevelMap );
|
||||||
|
} else {
|
||||||
|
aLevelMap = upLevelList.at(level-1);
|
||||||
|
if ( aLevelMap.count( aGboIOR ) > 0 )
|
||||||
|
anIORs = aLevelMap[ aGboIOR ];
|
||||||
|
}
|
||||||
|
anIORs.push_back( GetStringFromIOR(GEOM::GEOM_Object::_narrow(depList[j])) );
|
||||||
|
aLevelMap.insert( std::pair<std::string, GEOMUtils::NodeLinks>(aGboIOR, anIORs) );
|
||||||
|
}
|
||||||
|
getUpwardDependency(depList[j], upLevelList, level++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// function :
|
||||||
|
// purpose :
|
||||||
|
//=======================================================================
|
||||||
|
void GEOM_Gen_i::getDownwardDependency( SALOMEDS::Study_ptr theStudy,
|
||||||
|
GEOM::GEOM_BaseObject_ptr gbo,
|
||||||
|
GEOMUtils::LevelsList &downLevelList,
|
||||||
|
int level ) {
|
||||||
|
SALOMEDS::SComponent_var comp = theStudy->FindComponent("GEOM");
|
||||||
|
if ( !comp )
|
||||||
|
return;
|
||||||
|
|
||||||
|
SALOMEDS::ChildIterator_var it = theStudy->NewChildIterator( comp );
|
||||||
|
for ( it->InitEx( true ); it->More(); it->Next() ) {
|
||||||
|
SALOMEDS::SObject_var child = it->Value();
|
||||||
|
CORBA::Object_var corbaObj = child->GetObject();
|
||||||
|
GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
|
||||||
|
if( CORBA::is_nil( geomObj ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
GEOM::ListOfGBO_var depList = geomObj->GetDependency();
|
||||||
|
if( depList->length() == 0 )
|
||||||
|
continue;
|
||||||
|
std::string aGoIOR = GetStringFromIOR( geomObj );
|
||||||
|
|
||||||
|
for( int i = 0; i < depList->length(); i++ ) {
|
||||||
|
if ( depList[i]->IsSame( gbo ) ) {
|
||||||
|
GEOMUtils::NodeLinks anIORs;
|
||||||
|
GEOMUtils::LevelInfo aLevelMap;
|
||||||
|
if ( level >= downLevelList.size() ) {
|
||||||
|
aLevelMap = GEOMUtils::LevelInfo();
|
||||||
|
downLevelList.push_back( aLevelMap );
|
||||||
|
} else {
|
||||||
|
aLevelMap = downLevelList.at(level);
|
||||||
|
if ( aLevelMap.count( aGoIOR ) > 0 )
|
||||||
|
anIORs = aLevelMap[ aGoIOR ];
|
||||||
|
}
|
||||||
|
anIORs.push_back( GetStringFromIOR(GEOM::GEOM_Object::_narrow(depList[i])));
|
||||||
|
aLevelMap.insert( std::pair<std::string, GEOMUtils::NodeLinks>(aGoIOR, anIORs) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getDownwardDependency(theStudy, geomObj, downLevelList, level++);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=====================================================================================
|
//=====================================================================================
|
||||||
|
@ -51,11 +51,13 @@
|
|||||||
#include "GEOM_IMeasureOperations_i.hh"
|
#include "GEOM_IMeasureOperations_i.hh"
|
||||||
#include "GEOM_IGroupOperations_i.hh"
|
#include "GEOM_IGroupOperations_i.hh"
|
||||||
#include "GEOM_IFieldOperations_i.hh"
|
#include "GEOM_IFieldOperations_i.hh"
|
||||||
|
#include "GEOMUtils.hxx"
|
||||||
|
|
||||||
#include <TopTools_IndexedMapOfShape.hxx>
|
#include <TopTools_IndexedMapOfShape.hxx>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
//#include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
|
//#include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
|
||||||
@ -197,7 +199,8 @@ class GEOM_I_EXPORT GEOM_Gen_i: virtual public POA_GEOM::GEOM_Gen, virtual publi
|
|||||||
CORBA::Boolean theInheritFirstArg,
|
CORBA::Boolean theInheritFirstArg,
|
||||||
CORBA::Boolean theAddPrefix);
|
CORBA::Boolean theAddPrefix);
|
||||||
|
|
||||||
SALOMEDS::TMPFile* GetDependencyTree(const GEOM::string_array&);
|
SALOMEDS::TMPFile* GetDependencyTree(SALOMEDS::Study_ptr theStudy,
|
||||||
|
const GEOM::string_array& theObjectIORs);
|
||||||
|
|
||||||
//-----------------------------------------------------------------------//
|
//-----------------------------------------------------------------------//
|
||||||
// Transaction methods //
|
// Transaction methods //
|
||||||
@ -368,6 +371,15 @@ class GEOM_I_EXPORT GEOM_Gen_i: virtual public POA_GEOM::GEOM_Gen, virtual publi
|
|||||||
const Standard_CString& GrName,
|
const Standard_CString& GrName,
|
||||||
GEOM::ListOfGO_var aResList);
|
GEOM::ListOfGO_var aResList);
|
||||||
|
|
||||||
|
void getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
|
||||||
|
GEOMUtils::LevelsList &upLevelList,
|
||||||
|
int level = 0 );
|
||||||
|
|
||||||
|
void getDownwardDependency( SALOMEDS::Study_ptr theStudy,
|
||||||
|
GEOM::GEOM_BaseObject_ptr gbo,
|
||||||
|
GEOMUtils::LevelsList &downLevelList,
|
||||||
|
int level = 0 );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
::GEOMImpl_Gen* _impl;
|
::GEOMImpl_Gen* _impl;
|
||||||
|
Loading…
Reference in New Issue
Block a user