mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-02-20 23:59:42 +05:00
NPAL14856: Get The Normal of a Face. And merge MakePipeShellsWithoutPath from 3.2.X.
This commit is contained in:
parent
8d6ca361a1
commit
ecab0565f5
@ -910,7 +910,15 @@ module GEOM
|
||||
in GEOM_Object thePath,
|
||||
in boolean theWithContact ,
|
||||
in boolean theWithCorrection );
|
||||
|
||||
|
||||
/*!
|
||||
* Create solids between given sections
|
||||
* \param theSeqBases - list of sections (shell or face).
|
||||
* \param theLocations - list of corresponding vertexes
|
||||
* \return New GEOM_Object, containing the created solids.
|
||||
*/
|
||||
GEOM_Object MakePipeShellsWithoutPath (in ListOfGO theSeqBases,
|
||||
in ListOfGO theLocations);
|
||||
};
|
||||
|
||||
/*!
|
||||
@ -1792,7 +1800,7 @@ module GEOM
|
||||
GEOM_Object MakeCircleThreePnt (in GEOM_Object thePnt1,
|
||||
in GEOM_Object thePnt2,
|
||||
in GEOM_Object thePnt3);
|
||||
/*!
|
||||
/*!
|
||||
* Create a circle with given center, with a radius equals the distance from center to Point1
|
||||
* and on a plane defined by all of three points.
|
||||
* \param thePnt1,thePnt2,thePnt3 Points, defining the circle.
|
||||
@ -1938,6 +1946,7 @@ module GEOM
|
||||
in double theR1,
|
||||
in double theR2,
|
||||
in ListOfLong theEdges);
|
||||
|
||||
/*!
|
||||
* Perform a fillet on all edges of the specified faces of the given shape.
|
||||
* \param theShape Shape, to perform fillet on.
|
||||
@ -1954,6 +1963,7 @@ module GEOM
|
||||
in double theR1,
|
||||
in double theR2,
|
||||
in ListOfLong theFaces);
|
||||
|
||||
/*!
|
||||
* Perform a symmetric chamfer on all edges of the given shape.
|
||||
* \param theShape Shape, to perform chamfer on.
|
||||
@ -1984,6 +1994,7 @@ module GEOM
|
||||
GEOM_Object MakeChamferEdgeAD (in GEOM_Object theShape,
|
||||
in double theD, in double theAngle,
|
||||
in long theFace1, in long theFace2);
|
||||
|
||||
/*!
|
||||
* Perform a chamfer on all edges of the specified faces.
|
||||
* with distance D1 on the first specified face (if several for one edge)
|
||||
@ -2026,6 +2037,7 @@ module GEOM
|
||||
GEOM_Object MakeChamferEdgesAD (in GEOM_Object theShape,
|
||||
in double theD, in double theAngle,
|
||||
in ListOfLong theEdges);
|
||||
|
||||
/*!
|
||||
* Perform an Archimde operation on the given shape with given parameters.
|
||||
* The object presenting the resulting face is returned
|
||||
@ -2331,6 +2343,17 @@ module GEOM
|
||||
*/
|
||||
GEOM_Object GetCentreOfMass (in GEOM_Object theShape);
|
||||
|
||||
/*!
|
||||
* Get a vector, representing the normal of theFace.
|
||||
* If the face is not planar, theOptionalPoint is obligatory.
|
||||
* \param theFace Shape (face) to define the normal of.
|
||||
* \param theOptionalPoint Shape (point) to define the normal at.
|
||||
* Can be NULL in case of planar face.
|
||||
* \return New GEOM_Object, containing the created normal vector.
|
||||
*/
|
||||
GEOM_Object GetNormal (in GEOM_Object theFace,
|
||||
in GEOM_Object theOptionalPoint);
|
||||
|
||||
/*!
|
||||
* Get inertia matrix and moments of inertia of theShape.
|
||||
* \param theShape Shape to calculate inertia of.
|
||||
|
@ -184,6 +184,9 @@ module GEOM
|
||||
in boolean theWithContact ,
|
||||
in boolean theWithCorrection );
|
||||
|
||||
GEOM_Object MakePipeShellsWithoutPath (in ListOfGO theSeqBases,
|
||||
in ListOfGO theLocations );
|
||||
|
||||
//-----------------------------------------------------------//
|
||||
// BooleanOperations //
|
||||
//-----------------------------------------------------------//
|
||||
|
@ -98,6 +98,7 @@ multirotationsimple.png \
|
||||
multitranslation.png \
|
||||
multitranslationdouble.png \
|
||||
multitranslationsimple.png \
|
||||
normale.png \
|
||||
offset.png \
|
||||
orientation.png \
|
||||
partition.png \
|
||||
|
BIN
resources/normale.png
Normal file
BIN
resources/normale.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 260 B |
@ -209,6 +209,10 @@ msgstr "partitionplane.png"
|
||||
msgid "ICON_DLG_CENTERMASS"
|
||||
msgstr "centergravity.png"
|
||||
|
||||
#NormaleDlg
|
||||
msgid "ICON_DLG_NORMALE"
|
||||
msgstr "normale.png"
|
||||
|
||||
#BoundingBoxDlg
|
||||
msgid "ICON_DLG_BOUNDING_BOX"
|
||||
msgstr "bounding.png"
|
||||
@ -738,8 +742,8 @@ msgstr "point_coord.png"
|
||||
msgid "ICO_BASIC_PROPS"
|
||||
msgstr "basicproperties.png"
|
||||
|
||||
msgid "ICO_MASS_CENTER"
|
||||
msgstr "centergravity.png"
|
||||
msgid "ICO_NORMALE"
|
||||
msgstr "normale.png"
|
||||
|
||||
msgid "ICO_INERTIA"
|
||||
msgstr "axisinertia.png"
|
||||
|
@ -588,6 +588,13 @@ msgstr "Bounding Box"
|
||||
msgid "GEOM_CMASS"
|
||||
msgstr "Center Of Mass"
|
||||
|
||||
#Normale
|
||||
msgid "GEOM_NORMALE"
|
||||
msgstr "Normale To A Face"
|
||||
|
||||
msgid "GEOM_VECTOR_NORMALE"
|
||||
msgstr "Vector_Normale"
|
||||
|
||||
#Basic Properties
|
||||
msgid "GEOM_PROPERTIES"
|
||||
msgstr "Basic Properties"
|
||||
@ -862,6 +869,10 @@ msgstr "Circle Construction"
|
||||
msgid "GEOM_CMASS_TITLE"
|
||||
msgstr "Center Of Mass Construction"
|
||||
|
||||
#: GeometryGUI_NormaleDlg.cxx:57
|
||||
msgid "GEOM_NORMALE_TITLE"
|
||||
msgstr "Create Normale To A Face"
|
||||
|
||||
msgid "GEOM_PLANE_SIZE"
|
||||
msgstr "Size of plane :"
|
||||
|
||||
@ -2727,6 +2738,15 @@ msgstr "Center of mass"
|
||||
msgid "STB_MASS_CENTER"
|
||||
msgstr "Compute center of mass"
|
||||
|
||||
msgid "TOP_NORMALE"
|
||||
msgstr "Compute normale to a face"
|
||||
|
||||
msgid "MEN_NORMALE"
|
||||
msgstr "Normale to a face"
|
||||
|
||||
msgid "STB_NORMALE"
|
||||
msgstr "Compute normale to a face in a point (optional)"
|
||||
|
||||
msgid "TOP_INERTIA"
|
||||
msgstr "Compute intertia"
|
||||
|
||||
|
@ -524,6 +524,7 @@ void GeometryGUI::OnGUIEvent( int id )
|
||||
else if( id == 701 || // MENU MEASURE - PROPERTIES
|
||||
id == 702 || // MENU MEASURE - CDG
|
||||
id == 703 || // MENU MEASURE - INERTIA
|
||||
id == 704 || // MENU MEASURE - NORMALE
|
||||
id == 7041 || // MENU MEASURE - BOUNDING BOX
|
||||
id == 7042 || // MENU MEASURE - MIN DISTANCE
|
||||
id == 7043 || // MENU MEASURE - ANGLE
|
||||
@ -847,6 +848,7 @@ void GeometryGUI::initialize( CAM_Application* app )
|
||||
createGeomAction( 701, "BASIC_PROPS" );
|
||||
createGeomAction( 702, "MASS_CENTER" );
|
||||
createGeomAction( 703, "INERTIA" );
|
||||
createGeomAction( 704, "NORMALE" );
|
||||
createGeomAction( 7041, "BND_BOX" );
|
||||
createGeomAction( 7042, "MIN_DIST" );
|
||||
createGeomAction( 7043, "MEASURE_ANGLE" );
|
||||
@ -1002,6 +1004,7 @@ void GeometryGUI::initialize( CAM_Application* app )
|
||||
createMenu( separator(), measurId, -1 );
|
||||
createMenu( 702, measurId, -1 );
|
||||
createMenu( 703, measurId, -1 );
|
||||
createMenu( 704, measurId, -1 );
|
||||
// NPAL16572: move "Check free boundaries" and "Check free faces" from "Repair" to "Measure"
|
||||
createMenu( separator(), measurId, -1 );
|
||||
createMenu( 609, measurId, -1 );
|
||||
|
@ -1375,6 +1375,23 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections(
|
||||
|
||||
pyDump<< "], [";
|
||||
|
||||
for(i =1 ; i <= nbSubBases; i++) {
|
||||
|
||||
Handle(Standard_Transient) anItem = theSubBases->Value(i);
|
||||
if(anItem.IsNull())
|
||||
continue;
|
||||
|
||||
Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
|
||||
if(!anObj.IsNull()) {
|
||||
pyDump<< anObj;
|
||||
if(i < nbBases)
|
||||
pyDump<<", ";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pyDump<< "], [";
|
||||
|
||||
for(i =1 ; i <= nbLocs; i++) {
|
||||
|
||||
Handle(Standard_Transient) anItem = theLocations->Value(i);
|
||||
@ -1396,3 +1413,135 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections(
|
||||
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* MakePipeShellsWithoutPath
|
||||
*/
|
||||
//=============================================================================
|
||||
Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath(
|
||||
const Handle(TColStd_HSequenceOfTransient)& theBases,
|
||||
const Handle(TColStd_HSequenceOfTransient)& theLocations)
|
||||
{
|
||||
Handle(GEOM_Object) anObj;
|
||||
SetErrorCode(KO);
|
||||
if(theBases.IsNull())
|
||||
return anObj;
|
||||
|
||||
Standard_Integer nbBases = theBases->Length();
|
||||
|
||||
if (!nbBases)
|
||||
return anObj;
|
||||
|
||||
Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length());
|
||||
|
||||
//Add a new Pipe object
|
||||
Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE);
|
||||
|
||||
//Add a new Pipe function
|
||||
|
||||
Handle(GEOM_Function) aFunction =
|
||||
aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_SHELLS_WITHOUT_PATH);
|
||||
if (aFunction.IsNull()) return anObj;
|
||||
|
||||
//Check if the function is set correctly
|
||||
if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj;
|
||||
|
||||
GEOMImpl_IPipeShellSect aCI (aFunction);
|
||||
|
||||
Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
|
||||
Handle(TColStd_HSequenceOfTransient) aSeqLocs = new TColStd_HSequenceOfTransient;
|
||||
|
||||
Standard_Integer i =1;
|
||||
for( ; i <= nbBases; i++) {
|
||||
|
||||
Handle(Standard_Transient) anItem = theBases->Value(i);
|
||||
if(anItem.IsNull())
|
||||
continue;
|
||||
Handle(GEOM_Object) aBase = Handle(GEOM_Object)::DownCast(anItem);
|
||||
if(aBase.IsNull())
|
||||
continue;
|
||||
Handle(GEOM_Function) aRefBase = aBase->GetLastFunction();
|
||||
if(aRefBase.IsNull())
|
||||
continue;
|
||||
|
||||
if(nbLocs) {
|
||||
Handle(Standard_Transient) anItemLoc = theLocations->Value(i);
|
||||
if(anItemLoc.IsNull())
|
||||
continue;
|
||||
Handle(GEOM_Object) aLoc = Handle(GEOM_Object)::DownCast(anItemLoc);
|
||||
if(aLoc.IsNull())
|
||||
continue;
|
||||
Handle(GEOM_Function) aRefLoc = aLoc->GetLastFunction();
|
||||
if(aRefLoc.IsNull())
|
||||
continue;
|
||||
aSeqLocs->Append(aRefLoc);
|
||||
}
|
||||
|
||||
aSeqBases->Append(aRefBase);
|
||||
}
|
||||
|
||||
if(!aSeqBases->Length())
|
||||
return anObj;
|
||||
|
||||
aCI.SetBases(aSeqBases);
|
||||
aCI.SetLocations(aSeqLocs);
|
||||
|
||||
//Compute the Pipe value
|
||||
try {
|
||||
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
|
||||
OCC_CATCH_SIGNALS;
|
||||
#endif
|
||||
if (!GetSolver()->ComputeFunction(aFunction)) {
|
||||
SetErrorCode("Pipe with shell sections without path driver failed");
|
||||
return anObj;
|
||||
}
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
|
||||
SetErrorCode(aFail->GetMessageString());
|
||||
return anObj;
|
||||
}
|
||||
|
||||
//Make a Python command
|
||||
GEOM::TPythonDump pyDump(aFunction);
|
||||
pyDump << aPipeDS << " = geompy.MakePipeShellsWithoutPath([";
|
||||
|
||||
for(i =1 ; i <= nbBases; i++) {
|
||||
|
||||
Handle(Standard_Transient) anItem = theBases->Value(i);
|
||||
if(anItem.IsNull())
|
||||
continue;
|
||||
|
||||
Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
|
||||
if(!anObj.IsNull()) {
|
||||
pyDump<< anObj;
|
||||
if(i < nbBases)
|
||||
pyDump<<", ";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pyDump<< "], [";
|
||||
|
||||
for(i =1 ; i <= nbLocs; i++) {
|
||||
|
||||
Handle(Standard_Transient) anItem = theLocations->Value(i);
|
||||
if(anItem.IsNull())
|
||||
continue;
|
||||
|
||||
Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem);
|
||||
if(!anObj.IsNull()) {
|
||||
pyDump<< anObj;
|
||||
if(i < nbLocs)
|
||||
pyDump<<", ";
|
||||
}
|
||||
}
|
||||
|
||||
pyDump<< "])";
|
||||
|
||||
SetErrorCode(OK);
|
||||
return aPipeDS;
|
||||
|
||||
}
|
||||
|
||||
|
@ -94,6 +94,10 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations {
|
||||
bool theWithContact,
|
||||
bool theWithCorrections);
|
||||
|
||||
Standard_EXPORT Handle(GEOM_Object) MakePipeShellsWithoutPath(
|
||||
const Handle(TColStd_HSequenceOfTransient)& theBases,
|
||||
const Handle(TColStd_HSequenceOfTransient)& theLocations);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -22,10 +22,15 @@
|
||||
|
||||
#include "GEOM_Function.hxx"
|
||||
|
||||
#define MEASURE_ARG_BASE 1
|
||||
//#define MEASURE_ARG_BASE 1
|
||||
//#define MEASURE_ARG_POINT 2
|
||||
|
||||
class GEOMImpl_IMeasure
|
||||
{
|
||||
enum {
|
||||
MEASURE_ARG_BASE = 1,
|
||||
MEASURE_ARG_POINT = 2
|
||||
};
|
||||
public:
|
||||
|
||||
GEOMImpl_IMeasure(Handle(GEOM_Function) theFunction): _func(theFunction) {}
|
||||
@ -35,6 +40,11 @@ class GEOMImpl_IMeasure
|
||||
|
||||
Handle(GEOM_Function) GetBase() { return _func->GetReference(MEASURE_ARG_BASE); }
|
||||
|
||||
void SetPoint(Handle(GEOM_Function) thePnt)
|
||||
{ _func->SetReference(MEASURE_ARG_POINT, thePnt); }
|
||||
|
||||
Handle(GEOM_Function) GetPoint() { return _func->GetReference(MEASURE_ARG_POINT); }
|
||||
|
||||
private:
|
||||
|
||||
Handle(GEOM_Function) _func;
|
||||
|
@ -878,6 +878,70 @@ Handle(GEOM_Object) GEOMImpl_IMeasureOperations::GetCentreOfMass
|
||||
return aCDG;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* GetNormal
|
||||
*/
|
||||
//=============================================================================
|
||||
Handle(GEOM_Object) GEOMImpl_IMeasureOperations::GetNormal
|
||||
(Handle(GEOM_Object) theFace,
|
||||
Handle(GEOM_Object) theOptionalPoint)
|
||||
{
|
||||
SetErrorCode(KO);
|
||||
|
||||
if (theFace.IsNull()) return NULL;
|
||||
|
||||
//Add a new Normale object
|
||||
Handle(GEOM_Object) aNorm = GetEngine()->AddObject(GetDocID(), GEOM_VECTOR);
|
||||
|
||||
//Add a new Normale function
|
||||
Handle(GEOM_Function) aFunction =
|
||||
aNorm->AddFunction(GEOMImpl_MeasureDriver::GetID(), VECTOR_FACE_NORMALE);
|
||||
if (aFunction.IsNull()) return NULL;
|
||||
|
||||
//Check if the function is set correctly
|
||||
if (aFunction->GetDriverGUID() != GEOMImpl_MeasureDriver::GetID()) return NULL;
|
||||
|
||||
GEOMImpl_IMeasure aCI (aFunction);
|
||||
|
||||
Handle(GEOM_Function) aFace = theFace->GetLastFunction();
|
||||
if (aFace.IsNull()) return NULL;
|
||||
|
||||
aCI.SetBase(aFace);
|
||||
|
||||
if (!theOptionalPoint.IsNull()) {
|
||||
Handle(GEOM_Function) anOptPnt = theOptionalPoint->GetLastFunction();
|
||||
aCI.SetPoint(anOptPnt);
|
||||
}
|
||||
|
||||
//Compute the Normale value
|
||||
try {
|
||||
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
|
||||
OCC_CATCH_SIGNALS;
|
||||
#endif
|
||||
if (!GetSolver()->ComputeFunction(aFunction)) {
|
||||
SetErrorCode("Measure driver failed to compute normake of face");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
|
||||
SetErrorCode(aFail->GetMessageString());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//Make a Python command
|
||||
GEOM::TPythonDump pd (aFunction);
|
||||
pd << aNorm << " = geompy.GetNormal(" << theFace;
|
||||
if (!theOptionalPoint.IsNull()) {
|
||||
pd << ", " << theOptionalPoint;
|
||||
}
|
||||
pd << ")";
|
||||
|
||||
SetErrorCode(OK);
|
||||
return aNorm;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* GetBasicProperties
|
||||
|
@ -90,6 +90,9 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations {
|
||||
|
||||
Standard_EXPORT Handle(GEOM_Object) GetCentreOfMass (Handle(GEOM_Object) theShape);
|
||||
|
||||
Standard_EXPORT Handle(GEOM_Object) GetNormal (Handle(GEOM_Object) theFace,
|
||||
Handle(GEOM_Object) theOptionalPoint);
|
||||
|
||||
Standard_EXPORT void GetBasicProperties (Handle(GEOM_Object) theShape,
|
||||
Standard_Real& theLength,
|
||||
Standard_Real& theSurfArea,
|
||||
|
@ -29,12 +29,20 @@
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <BRepGProp.hxx>
|
||||
#include <BRepBuilderAPI_MakeVertex.hxx>
|
||||
#include <BRepBuilderAPI_MakeEdge.hxx>
|
||||
|
||||
#include <TopAbs.hxx>
|
||||
#include <TopoDS.hxx>
|
||||
#include <TopoDS_Shape.hxx>
|
||||
|
||||
#include <GProp_GProps.hxx>
|
||||
#include <GeomLProp_SLProps.hxx>
|
||||
#include <Geom_Surface.hxx>
|
||||
|
||||
#include <Bnd_Box.hxx>
|
||||
#include <BRepBndLib.hxx>
|
||||
#include <BRepAdaptor_Surface.hxx>
|
||||
#include <ShapeAnalysis_Surface.hxx>
|
||||
|
||||
#include <gp_Pnt.hxx>
|
||||
#include <Precision.hxx>
|
||||
@ -73,7 +81,8 @@ Standard_Integer GEOMImpl_MeasureDriver::Execute(TFunction_Logbook& log) const
|
||||
|
||||
TopoDS_Shape aShape;
|
||||
|
||||
if (aType == CDG_MEASURE) {
|
||||
if (aType == CDG_MEASURE)
|
||||
{
|
||||
Handle(GEOM_Function) aRefBase = aCI.GetBase();
|
||||
TopoDS_Shape aShapeBase = aRefBase->GetValue();
|
||||
if (aShapeBase.IsNull()) {
|
||||
@ -97,8 +106,99 @@ Standard_Integer GEOMImpl_MeasureDriver::Execute(TFunction_Logbook& log) const
|
||||
}
|
||||
|
||||
aShape = BRepBuilderAPI_MakeVertex(aCenterMass).Shape();
|
||||
}
|
||||
else if (aType == VECTOR_FACE_NORMALE)
|
||||
{
|
||||
// Face
|
||||
Handle(GEOM_Function) aRefBase = aCI.GetBase();
|
||||
TopoDS_Shape aShapeBase = aRefBase->GetValue();
|
||||
if (aShapeBase.IsNull()) {
|
||||
Standard_NullObject::Raise("Face for normale calculation is null");
|
||||
}
|
||||
if (aShapeBase.ShapeType() != TopAbs_FACE) {
|
||||
Standard_NullObject::Raise("Shape for normale calculation is not a face");
|
||||
}
|
||||
TopoDS_Face aFace = TopoDS::Face(aShapeBase);
|
||||
|
||||
} else {
|
||||
// Point
|
||||
gp_Pnt p1 (0,0,0);
|
||||
|
||||
Handle(GEOM_Function) aPntFunc = aCI.GetPoint();
|
||||
if (!aPntFunc.IsNull())
|
||||
{
|
||||
TopoDS_Shape anOptPnt = aPntFunc->GetValue();
|
||||
if (anOptPnt.IsNull())
|
||||
Standard_NullObject::Raise("Invalid shape given for point argument");
|
||||
p1 = BRep_Tool::Pnt(TopoDS::Vertex(anOptPnt));
|
||||
}
|
||||
else
|
||||
{
|
||||
gp_Ax3 aPos = GEOMImpl_IMeasureOperations::GetPosition(aFace);
|
||||
p1 = aPos.Location();
|
||||
}
|
||||
|
||||
// Point parameters on surface
|
||||
Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace);
|
||||
Handle(ShapeAnalysis_Surface) aSurfAna = new ShapeAnalysis_Surface (aSurf);
|
||||
gp_Pnt2d pUV = aSurfAna->ValueOfUV(p1, Precision::Confusion());
|
||||
|
||||
// Normal direction
|
||||
gp_Vec Vec1,Vec2;
|
||||
BRepAdaptor_Surface SF (aFace);
|
||||
SF.D1(pUV.X(), pUV.Y(), p1, Vec1, Vec2);
|
||||
gp_Vec V = Vec1.Crossed(Vec2);
|
||||
Standard_Real mod = V.Magnitude();
|
||||
if (mod < Precision::Confusion())
|
||||
Standard_NullObject::Raise("Normal vector of a face has null magnitude");
|
||||
|
||||
// Set length of normal vector to average radius of curvature
|
||||
Standard_Real radius = 0.0;
|
||||
GeomLProp_SLProps aProperties (aSurf, pUV.X(), pUV.Y(), 2, Precision::Confusion());
|
||||
if (aProperties.IsCurvatureDefined()) {
|
||||
Standard_Real radius1 = Abs(aProperties.MinCurvature());
|
||||
Standard_Real radius2 = Abs(aProperties.MaxCurvature());
|
||||
if (Abs(radius1) > Precision::Confusion()) {
|
||||
radius = 1.0 / radius1;
|
||||
if (Abs(radius2) > Precision::Confusion()) {
|
||||
radius = (radius + 1.0 / radius2) / 2.0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (Abs(radius2) > Precision::Confusion()) {
|
||||
radius = 1.0 / radius2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set length of normal vector to average dimension of the face
|
||||
// (only if average radius of curvature is not appropriate)
|
||||
if (radius < Precision::Confusion()) {
|
||||
Bnd_Box B;
|
||||
Standard_Real Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
|
||||
BRepBndLib::Add(aFace, B);
|
||||
B.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax);
|
||||
radius = ((Xmax - Xmin) + (Ymax - Ymin) + (Zmax - Zmin)) / 3.0;
|
||||
}
|
||||
|
||||
if (radius < Precision::Confusion())
|
||||
radius = 1.0;
|
||||
|
||||
V *= radius / mod;
|
||||
|
||||
// consider the face orientation
|
||||
if (aFace.Orientation() == TopAbs_REVERSED ||
|
||||
aFace.Orientation() == TopAbs_INTERNAL) {
|
||||
V = - V;
|
||||
}
|
||||
|
||||
// Edge
|
||||
gp_Pnt p2 = p1.Translated(V);
|
||||
BRepBuilderAPI_MakeEdge aBuilder (p1, p2);
|
||||
if (!aBuilder.IsDone())
|
||||
Standard_NullObject::Raise("Vector construction failed");
|
||||
aShape = aBuilder.Shape();
|
||||
}
|
||||
else {
|
||||
}
|
||||
|
||||
if (aShape.IsNull()) return 0;
|
||||
@ -107,7 +207,7 @@ Standard_Integer GEOMImpl_MeasureDriver::Execute(TFunction_Logbook& log) const
|
||||
|
||||
log.SetTouched(Label());
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -97,6 +97,7 @@
|
||||
#define VECTOR_TWO_PNT 1
|
||||
#define VECTOR_DX_DY_DZ 2
|
||||
#define VECTOR_TANGENT_CURVE_PAR 3
|
||||
#define VECTOR_FACE_NORMALE 4
|
||||
|
||||
#define PLANE_PNT_VEC 1
|
||||
#define PLANE_FACE 2
|
||||
|
@ -597,7 +597,7 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithShellSections
|
||||
CORBA::Boolean theWithContact,
|
||||
CORBA::Boolean theWithCorrections)
|
||||
{
|
||||
GEOM::GEOM_Object_var aGEOMObject;
|
||||
GEOM::GEOM_Object_var aGEOMObject;
|
||||
|
||||
//Set a not done flag
|
||||
GetOperations()->SetNotDone();
|
||||
@ -659,3 +659,57 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithShellSections
|
||||
|
||||
return GetObject(anObject);
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* MakePipeShellsWithoutPath
|
||||
*/
|
||||
//=============================================================================
|
||||
GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath
|
||||
(const GEOM::ListOfGO& theBases,
|
||||
const GEOM::ListOfGO& theLocations)
|
||||
{
|
||||
GEOM::GEOM_Object_var aGEOMObject;
|
||||
|
||||
//Set a not done flag
|
||||
GetOperations()->SetNotDone();
|
||||
Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient;
|
||||
Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient;
|
||||
int ind=0, aNbBases=0, aNbLocs=0;
|
||||
|
||||
//Get the shapes
|
||||
aNbBases = theBases.length();
|
||||
aNbLocs = theLocations.length();
|
||||
|
||||
if( aNbLocs && aNbBases != aNbLocs)
|
||||
return aGEOMObject._retn();
|
||||
|
||||
for (ind = 0; ind < aNbBases; ind++) {
|
||||
if (theBases[ind] == NULL) continue;
|
||||
Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->
|
||||
GetObject(theBases[ind]->GetStudyID(), theBases[ind]->GetEntry());
|
||||
if(aBase.IsNull())
|
||||
continue;
|
||||
if(aNbLocs) {
|
||||
Handle(GEOM_Object) aLoc = GetOperations()->GetEngine()->GetObject
|
||||
(theLocations[ind]->GetStudyID(), theLocations[ind]->GetEntry());
|
||||
if(aLoc.IsNull())
|
||||
continue;
|
||||
aSeqLocations->Append(aLoc);
|
||||
}
|
||||
aSeqBases->Append(aBase);
|
||||
}
|
||||
|
||||
if(!aSeqBases->Length())
|
||||
return aGEOMObject._retn();
|
||||
|
||||
// Make pipe
|
||||
Handle(GEOM_Object) anObject =
|
||||
GetOperations()->MakePipeShellsWithoutPath(aSeqBases,aSeqLocations);
|
||||
|
||||
if (!GetOperations()->IsDone() || anObject.IsNull())
|
||||
return aGEOMObject._retn();
|
||||
|
||||
return GetObject(anObject);
|
||||
}
|
||||
|
@ -113,6 +113,9 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i :
|
||||
CORBA::Boolean theWithContact,
|
||||
CORBA::Boolean theWithCorrections);
|
||||
|
||||
GEOM::GEOM_Object_ptr MakePipeShellsWithoutPath(const GEOM::ListOfGO& theBases,
|
||||
const GEOM::ListOfGO& theLocations);
|
||||
|
||||
::GEOMImpl_I3DPrimOperations* GetOperations()
|
||||
{ return (::GEOMImpl_I3DPrimOperations*)GetImpl(); }
|
||||
};
|
||||
|
@ -141,7 +141,7 @@ GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetCentreOfMass
|
||||
//Set a not done flag
|
||||
GetOperations()->SetNotDone();
|
||||
|
||||
if (theShape == NULL) return aGEOMObject._retn();
|
||||
if (CORBA::is_nil(theShape)) return aGEOMObject._retn();
|
||||
|
||||
//Get the reference shape
|
||||
Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject
|
||||
@ -157,6 +157,41 @@ GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetCentreOfMass
|
||||
return GetObject(anObject);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* GetNormal
|
||||
*/
|
||||
//=============================================================================
|
||||
GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetNormal
|
||||
(GEOM::GEOM_Object_ptr theFace,
|
||||
GEOM::GEOM_Object_ptr theOptionalPoint)
|
||||
{
|
||||
GEOM::GEOM_Object_var aGEOMObject;
|
||||
|
||||
//Set a not done flag
|
||||
GetOperations()->SetNotDone();
|
||||
|
||||
if (CORBA::is_nil(theFace)) return aGEOMObject._retn();
|
||||
|
||||
//Get the reference shape
|
||||
Handle(GEOM_Object) aFace = GetOperations()->GetEngine()->GetObject
|
||||
(theFace->GetStudyID(), theFace->GetEntry());
|
||||
|
||||
if (aFace.IsNull()) return aGEOMObject._retn();
|
||||
|
||||
// Make Vector - normal to theFace (in point theOptionalPoint if the face is not planar)
|
||||
Handle(GEOM_Object) anOptionalPoint;
|
||||
if (!CORBA::is_nil(theOptionalPoint)) {
|
||||
anOptionalPoint = GetOperations()->GetEngine()->GetObject
|
||||
(theOptionalPoint->GetStudyID(), theOptionalPoint->GetEntry());
|
||||
}
|
||||
Handle(GEOM_Object) anObject = GetOperations()->GetNormal(aFace, anOptionalPoint);
|
||||
if (!GetOperations()->IsDone() || anObject.IsNull())
|
||||
return aGEOMObject._retn();
|
||||
|
||||
return GetObject(anObject);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* GetBasicProperties
|
||||
|
@ -56,6 +56,9 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i :
|
||||
|
||||
GEOM::GEOM_Object_ptr GetCentreOfMass (GEOM::GEOM_Object_ptr theShape);
|
||||
|
||||
GEOM::GEOM_Object_ptr GetNormal (GEOM::GEOM_Object_ptr theFace,
|
||||
GEOM::GEOM_Object_ptr theOptionalPoint);
|
||||
|
||||
void GetInertia (GEOM::GEOM_Object_ptr theShape,
|
||||
CORBA::Double& I11, CORBA::Double& I12, CORBA::Double& I13,
|
||||
CORBA::Double& I21, CORBA::Double& I22, CORBA::Double& I23,
|
||||
|
@ -993,6 +993,7 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithDifferentSections
|
||||
return anObj;
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
// MakePipe:
|
||||
//=============================================================================
|
||||
@ -1015,6 +1016,24 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithShellSections
|
||||
return anObj;
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
// MakePipe:
|
||||
//=============================================================================
|
||||
GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeShellsWithoutPath
|
||||
(const GEOM::ListOfGO& theBases,
|
||||
const GEOM::ListOfGO& theLocations)
|
||||
{
|
||||
beginService( " GEOM_Superv_i::MakePipeShellsWithoutPath" );
|
||||
MESSAGE("GEOM_Superv_i::MakePipeShellsWithoutPath");
|
||||
get3DPrimOp();
|
||||
GEOM::GEOM_Object_ptr anObj =
|
||||
my3DPrimOp->MakePipeShellsWithoutPath(theBases,theLocations);
|
||||
endService( " GEOM_Superv_i::MakePipeShellsWithoutPath" );
|
||||
return anObj;
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
// MakeFuse:
|
||||
//=============================================================================
|
||||
|
@ -244,6 +244,9 @@ public:
|
||||
CORBA::Boolean theWithContact,
|
||||
CORBA::Boolean theWithCorrections);
|
||||
|
||||
GEOM::GEOM_Object_ptr MakePipeShellsWithoutPath(const GEOM::ListOfGO& theBases,
|
||||
const GEOM::ListOfGO& theLocations);
|
||||
|
||||
//-----------------------------------------------------------//
|
||||
// BooleanOperations //
|
||||
//-----------------------------------------------------------//
|
||||
|
@ -109,6 +109,22 @@ def TestMeasureOperations (geompy, math):
|
||||
if Coords[0] != 5 or Coords[1] != 15 or Coords[2] != 35:
|
||||
print "But must be (5, 15, 35)"
|
||||
|
||||
####### GetNormal #######
|
||||
|
||||
faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
|
||||
face0 = faces[0]
|
||||
vnorm = geompy.GetNormal(face0)
|
||||
if vnorm is None:
|
||||
raise RuntimeError, "GetNormal(face0) failed"
|
||||
else:
|
||||
geompy.addToStudy(face0, "Face0")
|
||||
geompy.addToStudy(vnorm, "Normale to Face0")
|
||||
print "\nNormale of face has been successfully obtained:"
|
||||
#Coords = geompy.PointCoordinates(pcdg)
|
||||
#print "(", Coords[0], ", ", Coords[1], ", ", Coords[2], ")"
|
||||
#if Coords[0] != 5 or Coords[1] != 15 or Coords[2] != 35:
|
||||
# print "But must be (5, 15, 35)"
|
||||
|
||||
####### MinDistance #######
|
||||
|
||||
MinDist = geompy.MinDistance(box, cube)
|
||||
|
@ -731,9 +731,12 @@ class geompyDC(GEOM._objref_GEOM_Gen):
|
||||
# orthogonal to the spine tangent in the correspondent point
|
||||
# @return New GEOM_Object, containing the created pipe.
|
||||
#
|
||||
# Example: see GEOM_TestAll.py
|
||||
def MakePipeWithDifferentSections(self,theSeqBases, theLocations,thePath,theWithContact,theWithCorrection):
|
||||
anObj = self.PrimOp.MakePipeWithDifferentSections(theSeqBases, theLocations,thePath,theWithContact,theWithCorrection)
|
||||
def MakePipeWithDifferentSections(self, theSeqBases,
|
||||
theLocations, thePath,
|
||||
theWithContact, theWithCorrection):
|
||||
anObj = self.PrimOp.MakePipeWithDifferentSections(theSeqBases,
|
||||
theLocations, thePath,
|
||||
theWithContact, theWithCorrection)
|
||||
if self.PrimOp.IsDone() == 0:
|
||||
print "MakePipeWithDifferentSections : ", self.PrimOp.GetErrorCode()
|
||||
return anObj
|
||||
@ -755,7 +758,6 @@ class geompyDC(GEOM._objref_GEOM_Gen):
|
||||
# orthogonal to the spine tangent in the correspondent point
|
||||
# @return New GEOM_Object, containing the created solids.
|
||||
#
|
||||
# Example: see GEOM_TestAll.py
|
||||
def MakePipeWithShellSections(self,theSeqBases, theSeqSubBases,
|
||||
theLocations, thePath,
|
||||
theWithContact, theWithCorrection):
|
||||
@ -765,7 +767,50 @@ class geompyDC(GEOM._objref_GEOM_Gen):
|
||||
if self.PrimOp.IsDone() == 0:
|
||||
print "MakePipeWithShellSections : ", self.PrimOp.GetErrorCode()
|
||||
return anObj
|
||||
|
||||
|
||||
def MakePipeWithShellSectionsBySteps(self, theSeqBases, theSeqSubBases,
|
||||
theLocations, thePath,
|
||||
theWithContact, theWithCorrection):
|
||||
res = []
|
||||
nbsect = len(theSeqBases)
|
||||
nbsubsect = len(theSeqSubBases)
|
||||
#print "nbsect = ",nbsect
|
||||
for i in range(1,nbsect):
|
||||
#print " i = ",i
|
||||
tmpSeqBases = [ theSeqBases[i-1], theSeqBases[i] ]
|
||||
tmpLocations = [ theLocations[i-1], theLocations[i] ]
|
||||
tmpSeqSubBases = []
|
||||
if nbsubsect>0: tmpSeqSubBases = [ theSeqSubBases[i-1], theSeqSubBases[i] ]
|
||||
anObj = self.PrimOp.MakePipeWithShellSections(tmpSeqBases, tmpSeqSubBases,
|
||||
tmpLocations, thePath,
|
||||
theWithContact, theWithCorrection)
|
||||
if self.PrimOp.IsDone() == 0:
|
||||
print "Problems with pipe creation between ",i," and ",i+1," sections"
|
||||
print "MakePipeWithShellSections : ", self.PrimOp.GetErrorCode()
|
||||
break
|
||||
else:
|
||||
print "Pipe between ",i," and ",i+1," sections is OK"
|
||||
res.append(anObj)
|
||||
pass
|
||||
pass
|
||||
|
||||
resc = self.MakeCompound(res)
|
||||
#resc = self.MakeSewing(res, 0.001)
|
||||
#print "resc: ",resc
|
||||
return resc
|
||||
|
||||
## Create solids between given sections
|
||||
# @param theSeqBases - list of sections (shell or face).
|
||||
# @param theLocations - list of corresponding vertexes
|
||||
# @return New GEOM_Object, containing the created solids.
|
||||
#
|
||||
def MakePipeShellsWithoutPath(self, theSeqBases, theLocations):
|
||||
anObj = self.PrimOp.MakePipeShellsWithoutPath(theSeqBases, theLocations)
|
||||
if self.PrimOp.IsDone() == 0:
|
||||
print "MakePipeShellsWithoutPath : ", self.PrimOp.GetErrorCode()
|
||||
return anObj
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Create base shapes
|
||||
# -----------------------------------------------------------------------------
|
||||
@ -2099,6 +2144,19 @@ class geompyDC(GEOM._objref_GEOM_Gen):
|
||||
print "GetCentreOfMass : ", self.MeasuOp.GetErrorCode()
|
||||
return anObj
|
||||
|
||||
## Get a normale to the given face. If the point is not given,
|
||||
# the normale is calculated at the center of mass.
|
||||
# @param theFace Face to define normale of.
|
||||
# @param theOptionalPoint Point to compute the normale at.
|
||||
# @return New GEOM_Object, containing the created vector.
|
||||
#
|
||||
# Example: see GEOM_TestMeasures.py
|
||||
def GetNormal(self, theFace, theOptionalPoint = None):
|
||||
anObj = self.MeasuOp.GetNormal(theFace, theOptionalPoint)
|
||||
if self.MeasuOp.IsDone() == 0:
|
||||
print "GetNormal : ", self.MeasuOp.GetErrorCode()
|
||||
return anObj
|
||||
|
||||
## Check a topology of the given shape.
|
||||
# @param theShape Shape to check validity of.
|
||||
# @param theIsCheckGeom If FALSE, only the shape's topology will be checked,
|
||||
|
@ -47,6 +47,7 @@ dist_libMeasureGUI_la_SOURCES = \
|
||||
MeasureGUI_Skeleton.cxx \
|
||||
MeasureGUI_PropertiesDlg.cxx \
|
||||
MeasureGUI_CenterMassDlg.cxx \
|
||||
MeasureGUI_NormaleDlg.cxx \
|
||||
MeasureGUI_InertiaDlg.cxx \
|
||||
MeasureGUI_BndBoxDlg.cxx \
|
||||
MeasureGUI_DistanceDlg.cxx \
|
||||
@ -68,6 +69,7 @@ MOC_FILES = \
|
||||
MeasureGUI_Skeleton_moc.cxx \
|
||||
MeasureGUI_PropertiesDlg_moc.cxx \
|
||||
MeasureGUI_CenterMassDlg_moc.cxx \
|
||||
MeasureGUI_NormaleDlg_moc.cxx \
|
||||
MeasureGUI_InertiaDlg_moc.cxx \
|
||||
MeasureGUI_BndBoxDlg_moc.cxx \
|
||||
MeasureGUI_DistanceDlg_moc.cxx \
|
||||
|
@ -35,6 +35,7 @@
|
||||
|
||||
#include "MeasureGUI_PropertiesDlg.h" // Method PROPERTIES
|
||||
#include "MeasureGUI_CenterMassDlg.h" // Method CENTER MASS
|
||||
#include "MeasureGUI_NormaleDlg.h" // Method NORMALE
|
||||
#include "MeasureGUI_InertiaDlg.h" // Method INERTIA
|
||||
#include "MeasureGUI_BndBoxDlg.h" // Method BNDBOX
|
||||
#include "MeasureGUI_DistanceDlg.h" // Method DISTANCE
|
||||
@ -78,6 +79,7 @@ bool MeasureGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent )
|
||||
case 701 : new MeasureGUI_PropertiesDlg (getGeometryGUI(), parent); break; // LENGTH, AREA AND VOLUME
|
||||
case 702 : new MeasureGUI_CenterMassDlg (getGeometryGUI(), parent); break; // CENTER MASS
|
||||
case 703 : new MeasureGUI_InertiaDlg (getGeometryGUI(), parent); break; // INERTIA
|
||||
case 704 : new MeasureGUI_NormaleDlg (getGeometryGUI(), parent); break; // NORMALE
|
||||
case 7041: new MeasureGUI_BndBoxDlg (getGeometryGUI(), parent); break; // BOUNDING BOX
|
||||
case 7042: new MeasureGUI_DistanceDlg (getGeometryGUI(), parent); break; // MIN DISTANCE
|
||||
case 7043: new MeasureGUI_AngleDlg (getGeometryGUI(), parent); break; // ANGLE
|
||||
|
281
src/MeasureGUI/MeasureGUI_NormaleDlg.cxx
Normal file
281
src/MeasureGUI/MeasureGUI_NormaleDlg.cxx
Normal file
@ -0,0 +1,281 @@
|
||||
// GEOM GEOMGUI : GUI for Geometry component
|
||||
//
|
||||
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
|
||||
//
|
||||
//
|
||||
//
|
||||
// File : MeasureGUI_NormaleDlg.cxx
|
||||
// Author : Julia DOROVSKIKH
|
||||
// Module : GEOM
|
||||
// $Header$
|
||||
|
||||
#include "MeasureGUI_NormaleDlg.h"
|
||||
|
||||
#include "SUIT_Session.h"
|
||||
#include "SalomeApp_Application.h"
|
||||
#include "LightApp_SelectionMgr.h"
|
||||
|
||||
#include <qlabel.h>
|
||||
|
||||
#include "GEOMImpl_Types.hxx"
|
||||
|
||||
#include "utilities.h"
|
||||
|
||||
//=================================================================================
|
||||
// class : MeasureGUI_NormaleDlg()
|
||||
// purpose : Constructs a MeasureGUI_NormaleDlg which is a child of 'parent', with the
|
||||
// name 'name' and widget flags set to 'f'.
|
||||
// The dialog will by default be modeless, unless you set 'modal' to
|
||||
// TRUE to construct a modal dialog.
|
||||
//=================================================================================
|
||||
MeasureGUI_NormaleDlg::MeasureGUI_NormaleDlg (GeometryGUI* theGeometryGUI, QWidget* parent,
|
||||
const char* name, bool modal, WFlags fl)
|
||||
:GEOMBase_Skeleton(theGeometryGUI, parent, name, modal, WStyle_Customize |
|
||||
WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu)
|
||||
{
|
||||
SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
|
||||
QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_NORMALE")));
|
||||
QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
|
||||
|
||||
setCaption(tr("GEOM_NORMALE_TITLE"));
|
||||
|
||||
/***************************************************************/
|
||||
GroupConstructors->setTitle(tr("GEOM_NORMALE"));
|
||||
RadioButton1->setPixmap(image0);
|
||||
RadioButton2->close(TRUE);
|
||||
RadioButton3->close(TRUE);
|
||||
|
||||
GroupArgs = new DlgRef_2Sel_QTD (this, "GroupArgs");
|
||||
GroupArgs->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
|
||||
|
||||
GroupArgs->TextLabel1->setText(tr("GEOM_FACE"));
|
||||
GroupArgs->TextLabel2->setText(tr("GEOM_POINT"));
|
||||
|
||||
GroupArgs->PushButton1->setPixmap(image1);
|
||||
GroupArgs->PushButton2->setPixmap(image1);
|
||||
|
||||
Layout1->addWidget(GroupArgs, 2, 0);
|
||||
/***************************************************************/
|
||||
|
||||
setHelpFileName("normale.htm");
|
||||
|
||||
Init();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : ~MeasureGUI_NormaleDlg()
|
||||
// purpose : Destroys the object and frees any allocated resources
|
||||
//=================================================================================
|
||||
MeasureGUI_NormaleDlg::~MeasureGUI_NormaleDlg()
|
||||
{
|
||||
// no need to delete child widgets, Qt does it all for us
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : Init()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void MeasureGUI_NormaleDlg::Init()
|
||||
{
|
||||
/* init variables */
|
||||
GroupArgs->LineEdit1->setReadOnly(true);
|
||||
GroupArgs->LineEdit2->setReadOnly(true);
|
||||
|
||||
myFace = GEOM::GEOM_Object::_nil();
|
||||
myPoint = GEOM::GEOM_Object::_nil();
|
||||
|
||||
myEditCurrentArgument = GroupArgs->LineEdit1;
|
||||
globalSelection(GEOM_FACE);
|
||||
|
||||
/* signals and slots connections */
|
||||
connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
|
||||
connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
|
||||
|
||||
connect(GroupArgs->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||||
connect(GroupArgs->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
|
||||
|
||||
connect(GroupArgs->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
|
||||
connect(GroupArgs->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
|
||||
|
||||
connect(myGeomGUI->getApp()->selectionMgr(),
|
||||
SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
|
||||
|
||||
initName(tr("GEOM_VECTOR_NORMALE"));
|
||||
|
||||
//ConstructorsClicked(0);
|
||||
SelectionIntoArgument();
|
||||
|
||||
/* displays Dialog */
|
||||
GroupArgs->show();
|
||||
this->show();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : ClickOnOk()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void MeasureGUI_NormaleDlg::ClickOnOk()
|
||||
{
|
||||
if (ClickOnApply())
|
||||
ClickOnCancel();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : ClickOnApply()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
bool MeasureGUI_NormaleDlg::ClickOnApply()
|
||||
{
|
||||
if (!onAccept())
|
||||
return false;
|
||||
|
||||
initName();
|
||||
return true;
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : SelectionIntoArgument()
|
||||
// purpose : Called when selection as changed or other case
|
||||
//=================================================================================
|
||||
void MeasureGUI_NormaleDlg::SelectionIntoArgument()
|
||||
{
|
||||
erasePreview();
|
||||
myEditCurrentArgument->setText("");
|
||||
|
||||
if (myEditCurrentArgument == GroupArgs->LineEdit1) {
|
||||
myFace = GEOM::GEOM_Object::_nil();
|
||||
}
|
||||
else if (myEditCurrentArgument == GroupArgs->LineEdit2) {
|
||||
myPoint = GEOM::GEOM_Object::_nil();
|
||||
}
|
||||
|
||||
if (IObjectCount() != 1)
|
||||
return;
|
||||
|
||||
// nbSel == 1
|
||||
Standard_Boolean testResult = Standard_False;
|
||||
GEOM::GEOM_Object_var aSelectedObject =
|
||||
GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult);
|
||||
|
||||
if (!testResult)
|
||||
return;
|
||||
|
||||
if (myEditCurrentArgument == GroupArgs->LineEdit1) {
|
||||
myFace = aSelectedObject;
|
||||
}
|
||||
else if (myEditCurrentArgument == GroupArgs->LineEdit2) {
|
||||
myPoint = aSelectedObject;
|
||||
}
|
||||
|
||||
myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject));
|
||||
|
||||
displayPreview();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : LineEditReturnPressed()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void MeasureGUI_NormaleDlg::LineEditReturnPressed()
|
||||
{
|
||||
QLineEdit* send = (QLineEdit*)sender();
|
||||
if (send == GroupArgs->LineEdit1 ||
|
||||
send == GroupArgs->LineEdit2)
|
||||
{
|
||||
myEditCurrentArgument = send;
|
||||
GEOMBase_Skeleton::LineEditReturnPressed();
|
||||
}
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : SetEditCurrentArgument()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void MeasureGUI_NormaleDlg::SetEditCurrentArgument()
|
||||
{
|
||||
QPushButton* send = (QPushButton*)sender();
|
||||
|
||||
if (send == GroupArgs->PushButton1) {
|
||||
myEditCurrentArgument = GroupArgs->LineEdit1;
|
||||
globalSelection(GEOM_FACE);
|
||||
}
|
||||
else if (send == GroupArgs->PushButton2) {
|
||||
myEditCurrentArgument = GroupArgs->LineEdit2;
|
||||
globalSelection(GEOM_POINT);
|
||||
}
|
||||
|
||||
myEditCurrentArgument->setFocus();
|
||||
SelectionIntoArgument();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : ActivateThisDialog()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void MeasureGUI_NormaleDlg::ActivateThisDialog()
|
||||
{
|
||||
GEOMBase_Skeleton::ActivateThisDialog();
|
||||
|
||||
SelectionIntoArgument();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : enterEvent()
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
void MeasureGUI_NormaleDlg::enterEvent (QEvent* e)
|
||||
{
|
||||
if (!GroupConstructors->isEnabled())
|
||||
ActivateThisDialog();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : createOperation
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
GEOM::GEOM_IOperations_ptr MeasureGUI_NormaleDlg::createOperation()
|
||||
{
|
||||
return getGeomEngine()->GetIMeasureOperations(getStudyId());
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : isValid
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
bool MeasureGUI_NormaleDlg::isValid (QString&)
|
||||
{
|
||||
//return !CORBA::is_nil(myFace) && !CORBA::is_nil(myPoint);
|
||||
return !CORBA::is_nil(myFace);
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : execute
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
bool MeasureGUI_NormaleDlg::execute (ObjectList& objects)
|
||||
{
|
||||
GEOM::GEOM_Object_var anObj =
|
||||
GEOM::GEOM_IMeasureOperations::_narrow(getOperation())->GetNormal(myFace, myPoint);
|
||||
|
||||
if (!anObj->_is_nil())
|
||||
objects.push_back(anObj._retn());
|
||||
|
||||
return true;
|
||||
}
|
74
src/MeasureGUI/MeasureGUI_NormaleDlg.h
Normal file
74
src/MeasureGUI/MeasureGUI_NormaleDlg.h
Normal file
@ -0,0 +1,74 @@
|
||||
// GEOM GEOMGUI : GUI for Geometry component
|
||||
//
|
||||
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
|
||||
//
|
||||
//
|
||||
//
|
||||
// File : MeasureGUI_NormaleDlg.h
|
||||
// Author : Julia DOROVSKIKH
|
||||
// Module : GEOM
|
||||
|
||||
#ifndef DIALOGBOX_NORMALE_H
|
||||
#define DIALOGBOX_NORMALE_H
|
||||
|
||||
#include "GEOM_MeasureGUI.hxx"
|
||||
|
||||
#include "GEOMBase_Skeleton.h"
|
||||
#include "DlgRef_2Sel_QTD.h"
|
||||
|
||||
//=================================================================================
|
||||
// class : MeasureGUI_NormaleDlg
|
||||
// purpose :
|
||||
//=================================================================================
|
||||
class GEOM_MEASUREGUI_EXPORT MeasureGUI_NormaleDlg : public GEOMBase_Skeleton
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MeasureGUI_NormaleDlg (GeometryGUI* theGeometryGUI, QWidget* parent = 0,
|
||||
const char* name = 0, bool modal = FALSE, WFlags fl = 0);
|
||||
~MeasureGUI_NormaleDlg();
|
||||
|
||||
protected:
|
||||
// redefined from GEOMBase_Helper
|
||||
virtual GEOM::GEOM_IOperations_ptr createOperation();
|
||||
virtual bool isValid (QString& msg);
|
||||
virtual bool execute (ObjectList& objects);
|
||||
|
||||
private:
|
||||
void Init();
|
||||
void enterEvent (QEvent* e);
|
||||
|
||||
GEOM::GEOM_Object_var myFace;
|
||||
GEOM::GEOM_Object_var myPoint;
|
||||
|
||||
DlgRef_2Sel_QTD* GroupArgs;
|
||||
|
||||
private slots:
|
||||
void ClickOnOk();
|
||||
bool ClickOnApply();
|
||||
|
||||
void ActivateThisDialog();
|
||||
void LineEditReturnPressed();
|
||||
void SelectionIntoArgument();
|
||||
void SetEditCurrentArgument();
|
||||
};
|
||||
|
||||
#endif // DIALOGBOX_NORMALE_H
|
Loading…
Reference in New Issue
Block a user