7.5.6. Generation of the boundary particles for particulate boundary model

Add an option to create offset shapes with sharp edges
This commit is contained in:
eap 2017-12-21 19:41:40 +03:00
parent b014700d7c
commit 15ed55a71a
17 changed files with 180 additions and 77 deletions

View File

@ -11,13 +11,16 @@ gg = salome.ImportComponentGUI("GEOM")
box = geompy.MakeBox(20, 20, 20, 200, 200, 200) box = geompy.MakeBox(20, 20, 20, 200, 200, 200)
# create a new object as offset of the given object # create a new object as offset of the given object
offset = geompy.MakeOffset(box, 70.) offset = geompy.MakeOffset(box, 70.)
offset2 = geompy.MakeOffsetIntersectionJoin(box, 70.)
# add objects in the study # add objects in the study
id_box = geompy.addToStudy(box, "Box") id_box = geompy.addToStudy(box, "Box")
id_offset = geompy.addToStudy(offset, "Offset") id_offset = geompy.addToStudy(offset, "Offset")
id_offset2 = geompy.addToStudy(offset2, "Offset_intersection_join")
# display the results # display the results
gg.createAndDisplayGO(id_box) gg.createAndDisplayGO(id_box)
gg.setDisplayMode(id_box,1) gg.setDisplayMode(id_box,1)
gg.createAndDisplayGO(id_offset) gg.createAndDisplayGO(id_offset)
gg.createAndDisplayGO(id_offset2)

0
doc/salome/gui/GEOM/images/transformation11.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -7,7 +7,12 @@
\n This operation translates each point of an \b Object (a set of \n This operation translates each point of an \b Object (a set of
Objects) along a local normal by a given \b Offset distance (signed Objects) along a local normal by a given \b Offset distance (signed
number, negative value meaning inner offset). number, negative value meaning inner offset). Gaps between translated
adjacent surfaces are filled in either of two ways:
- if <b>Join by pipes</b> is activated, they are filled with pipes;
- else the surfaces are extended and intersected, so that sharp edges
are preserved.
\n \b Offset operation is applicable to faces, shells and solids. \n \b Offset operation is applicable to faces, shells and solids.
\n \ref restore_presentation_parameters_page "Advanced options". \n \ref restore_presentation_parameters_page "Advanced options".
@ -16,9 +21,12 @@ number, negative value meaning inner offset).
\n <b>Example:</b> \n <b>Example:</b>
\image html offsetsn.png "The box and its offset surface" \image html offsetsn.png "The box and its offset surface (Join by pipes activated)"
\n <b>TUI Command:</b>
- Gaps filled by pipes: <em>geompy.MakeOffset(Shape, Offset),</em>
- Gaps filled by intersection: <em>geompy.MakeOffsetIntersectionJoin(Shape, Offset),</em>
\n <b>TUI Command:</b> <em>geompy.MakeOffset(Shape, Offset),</em>
where Shape is a shape(s) which has to be an offset, Offset is a value of where Shape is a shape(s) which has to be an offset, Offset is a value of
the offset. the offset.
\n <b>Arguments:</b> Name + Object (face(s), shell(s), solid(s)) + \n <b>Arguments:</b> Name + Object (face(s), shell(s), solid(s)) +

View File

@ -1300,17 +1300,23 @@ module GEOM
* \brief Replace the given object by its offset. * \brief Replace the given object by its offset.
* \param theObject The base object for the offset. * \param theObject The base object for the offset.
* \param theOffset Offset value. * \param theOffset Offset value.
* \param theJoinByPipes To join offset surfaces by pipes or by intersection.
* \return theObject. * \return theObject.
*/ */
GEOM_Object OffsetShape (in GEOM_Object theObject, in double theOffset); GEOM_Object OffsetShape (in GEOM_Object theObject,
in double theOffset,
in boolean theJoinByPipes);
/*! /*!
* \brief Create new object as offset of the given one. * \brief Create new object as offset of the given one.
* \param theObject The base object for the offset. * \param theObject The base object for the offset.
* \param theOffset Offset value. * \param theOffset Offset value.
* \param theJoinByPipes To join offset surfaces by pipes or by intersection.
* \return New GEOM_Object, containing the offset object. * \return New GEOM_Object, containing the offset object.
*/ */
GEOM_Object OffsetShapeCopy (in GEOM_Object theObject, in double theOffset); GEOM_Object OffsetShapeCopy (in GEOM_Object theObject,
in double theOffset,
in boolean theJoinByPipes);
/*! /*!
* \brief Create new object as projection of the given one on a 2D surface. * \brief Create new object as projection of the given one on a 2D surface.

7
src/GEOMGUI/GEOM_msg_en.ts Normal file → Executable file
View File

@ -7653,6 +7653,13 @@ Do you want to create new material?</translation>
<translation>Rotation angle</translation> <translation>Rotation angle</translation>
</message> </message>
</context> </context>
<context>
<name>TransformationGUI_OffsetDlg</name>
<message>
<source>GEOM_JOIN_BY_PIPES</source>
<translation>Join by pipes</translation>
</message>
</context>
<context> <context>
<name>OperationGUI_ExtractionDlg</name> <name>OperationGUI_ExtractionDlg</name>
<message> <message>

View File

@ -29,6 +29,7 @@
#define OFF_ARG_VALUE 2 #define OFF_ARG_VALUE 2
#define OFF_ARG_IDS 3 #define OFF_ARG_IDS 3
#define OFF_ARG_PARAM 4 #define OFF_ARG_PARAM 4
#define OFF_ARG_JOIN 5
class GEOMImpl_IOffset class GEOMImpl_IOffset
{ {
@ -48,6 +49,10 @@ class GEOMImpl_IOffset
Standard_Boolean GetParam() { return _func->GetInteger(OFF_ARG_PARAM); } Standard_Boolean GetParam() { return _func->GetInteger(OFF_ARG_PARAM); }
void SetJoinByPipes(Standard_Boolean theValue) { _func->SetInteger(OFF_ARG_JOIN, theValue); }
Standard_Boolean GetJoinByPipes() { return _func->GetInteger(OFF_ARG_JOIN); }
void SetFaceIDs(const Handle(TColStd_HArray1OfInteger)& theFaceIDs) void SetFaceIDs(const Handle(TColStd_HArray1OfInteger)& theFaceIDs)
{ _func->SetIntegerArray(OFF_ARG_IDS, theFaceIDs); } { _func->SetIntegerArray(OFF_ARG_IDS, theFaceIDs); }

View File

@ -1053,8 +1053,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorAxisCopy
* OffsetShape * OffsetShape
*/ */
//============================================================================= //=============================================================================
Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape Handle(GEOM_Object)
(Handle(GEOM_Object) theObject, double theOffset) GEOMImpl_ITransformOperations::OffsetShape (Handle(GEOM_Object) theObject,
double theOffset,
bool theJoinByPipes)
{ {
SetErrorCode(KO); SetErrorCode(KO);
@ -1072,8 +1074,9 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape
if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL; if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL;
GEOMImpl_IOffset aTI (aFunction); GEOMImpl_IOffset aTI (aFunction);
aTI.SetShape(anOriginal); aTI.SetShape( anOriginal );
aTI.SetValue(theOffset); aTI.SetValue( theOffset );
aTI.SetJoinByPipes( theJoinByPipes );
//Compute the offset //Compute the offset
try { try {
@ -1102,8 +1105,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape
* OffsetShapeCopy * OffsetShapeCopy
*/ */
//============================================================================= //=============================================================================
Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy Handle(GEOM_Object)
(Handle(GEOM_Object) theObject, double theOffset) GEOMImpl_ITransformOperations::OffsetShapeCopy( Handle(GEOM_Object) theObject,
double theOffset,
bool theJoinByPipes)
{ {
SetErrorCode(KO); SetErrorCode(KO);
@ -1124,8 +1129,9 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy
if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL; if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL;
GEOMImpl_IOffset aTI (aFunction); GEOMImpl_IOffset aTI (aFunction);
aTI.SetShape(anOriginal); aTI.SetShape( anOriginal );
aTI.SetValue(theOffset); aTI.SetValue( theOffset );
aTI.SetJoinByPipes( theJoinByPipes );
//Compute the offset //Compute the offset
try { try {

View File

@ -105,10 +105,12 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations
Handle(GEOM_Object) thePoint); Handle(GEOM_Object) thePoint);
Standard_EXPORT Handle(GEOM_Object) OffsetShape (Handle(GEOM_Object) theObject, Standard_EXPORT Handle(GEOM_Object) OffsetShape (Handle(GEOM_Object) theObject,
double theOffset); double theOffset,
bool theJoinByPipes);
Standard_EXPORT Handle(GEOM_Object) OffsetShapeCopy (Handle(GEOM_Object) theObject, Standard_EXPORT Handle(GEOM_Object) OffsetShapeCopy (Handle(GEOM_Object) theObject,
double theOffset); double theOffset,
bool theJoinByPipes);
Standard_EXPORT Handle(GEOM_Object) ProjectShapeCopy (Handle(GEOM_Object) theSource, Standard_EXPORT Handle(GEOM_Object) ProjectShapeCopy (Handle(GEOM_Object) theSource,
Handle(GEOM_Object) theTarget); Handle(GEOM_Object) theTarget);

View File

@ -86,11 +86,19 @@ Standard_Integer GEOMImpl_OffsetDriver::Execute(LOGBOOK& log) const
StdFail_NotDone::Raise(aMsg.ToCString()); StdFail_NotDone::Raise(aMsg.ToCString());
} }
if (aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY) { if ( aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY )
BRepOffsetAPI_MakeOffsetShape MO (aShapeBase, {
BRepOffset_Mode aMode = BRepOffset_Skin;
Standard_Boolean anIntersection = Standard_False, aSelfInter = Standard_False;
BRepOffsetAPI_MakeOffsetShape MO( aShapeBase,
aCI.GetValue(), aCI.GetValue(),
aTol); aTol,
if (MO.IsDone()) { aMode,
anIntersection,
aSelfInter,
aCI.GetJoinByPipes() ? GeomAbs_Arc : GeomAbs_Intersection );
if ( MO.IsDone() ) {
aShape = MO.Shape(); aShape = MO.Shape();
if ( !GEOMUtils::CheckShape(aShape, true) && !GEOMUtils::FixShapeTolerance(aShape) ) if ( !GEOMUtils::CheckShape(aShape, true) && !GEOMUtils::FixShapeTolerance(aShape) )
Standard_ConstructionError::Raise("Boolean operation aborted : non valid shape result"); Standard_ConstructionError::Raise("Boolean operation aborted : non valid shape result");

View File

@ -313,6 +313,8 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID");
aNamePrefix = "Group_Of_Solids_"; aNamePrefix = "Group_Of_Solids_";
break; break;
default:
aNamePrefix = "Group_";
} }
} else if ( mytype == GEOM_MARKER ) { } else if ( mytype == GEOM_MARKER ) {
aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS"); aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS");
@ -2558,7 +2560,7 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::AddSubShape (GEOM::GEOM_Object_ptr theMainSh
if (aMainShape.IsNull()) return GEOM::GEOM_Object::_nil(); if (aMainShape.IsNull()) return GEOM::GEOM_Object::_nil();
Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1, theIndices.length()); Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1, theIndices.length());
for(Standard_Integer i = 0; i<theIndices.length(); i++) anArray->SetValue(i+1, theIndices[i]); for(CORBA::ULong i = 0; i<theIndices.length(); i++) anArray->SetValue(i+1, theIndices[i]);
HANDLE_NAMESPACE(GEOM_Object) anObject = _impl->AddSubShape(aMainShape, anArray, true); HANDLE_NAMESPACE(GEOM_Object) anObject = _impl->AddSubShape(aMainShape, anArray, true);
if(anObject.IsNull()) return GEOM::GEOM_Object::_nil(); if(anObject.IsNull()) return GEOM::GEOM_Object::_nil();
@ -2943,7 +2945,7 @@ void GEOM_Gen_i::Move( const GEOM::object_list& what,
} }
} }
for ( int i = 0; i < what.length(); i++ ) { for ( CORBA::ULong i = 0; i < what.length(); i++ ) {
SALOMEDS::SObject_var sobj = what[i]; SALOMEDS::SObject_var sobj = what[i];
if ( CORBA::is_nil( sobj ) ) continue; // skip bad object if ( CORBA::is_nil( sobj ) ) continue; // skip bad object
// insert the object to the use case tree // insert the object to the use case tree
@ -2964,7 +2966,7 @@ SALOMEDS::TMPFile* GEOM_Gen_i::GetDependencyTree( SALOMEDS::Study_ptr theStudy,
GEOMUtils::TreeModel tree; GEOMUtils::TreeModel tree;
std::string entry; std::string entry;
for ( int i = 0; i < theObjectEntries.length(); i++ ) { for ( CORBA::ULong i = 0; i < theObjectEntries.length(); i++ ) {
// process objects one-by-one // process objects one-by-one
entry = theObjectEntries[i].in(); entry = theObjectEntries[i].in();
GEOM::GEOM_BaseObject_var anObj = GetObject( theStudy->StudyId(), entry.c_str() ); GEOM::GEOM_BaseObject_var anObj = GetObject( theStudy->StudyId(), entry.c_str() );
@ -3007,7 +3009,7 @@ void GEOM_Gen_i::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
GEOMUtils::NodeLinks anEntries; GEOMUtils::NodeLinks anEntries;
GEOMUtils::LevelInfo aLevelMap; GEOMUtils::LevelInfo aLevelMap;
if ( level > 0 ) { if ( level > 0 ) {
if ( level-1 >= upLevelList.size() ) { if ( level-1 >= (int)upLevelList.size() ) {
// create a new map // create a new map
upLevelList.push_back( aLevelMap ); upLevelList.push_back( aLevelMap );
} else { } else {
@ -3021,7 +3023,7 @@ void GEOM_Gen_i::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
// get objects on that the current one depends // get objects on that the current one depends
GEOM::ListOfGBO_var depList = gbo->GetDependency(); GEOM::ListOfGBO_var depList = gbo->GetDependency();
std::string aDepEntry; std::string aDepEntry;
for( int j = 0; j < depList->length(); j++ ) { for( CORBA::ULong j = 0; j < depList->length(); j++ ) {
if ( depList[j]->_is_nil() ) if ( depList[j]->_is_nil() )
continue; continue;
aDepEntry = depList[j]->GetEntry(); aDepEntry = depList[j]->GetEntry();
@ -3077,7 +3079,7 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
continue; continue;
std::string aGoEntry = geomObj->GetEntry(); std::string aGoEntry = geomObj->GetEntry();
// go through dependencies of current object to check whether it depends on the given object // go through dependencies of current object to check whether it depends on the given object
for( int i = 0; i < depList->length(); i++ ) { for( CORBA::ULong i = 0; i < depList->length(); i++ ) {
if ( depList[i]->_is_nil() ) if ( depList[i]->_is_nil() )
continue; continue;
if ( depList[i]->_is_equivalent( gbo ) ) { if ( depList[i]->_is_equivalent( gbo ) ) {
@ -3091,7 +3093,7 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
GEOMUtils::NodeLinks anEntries; GEOMUtils::NodeLinks anEntries;
GEOMUtils::LevelInfo aLevelMap; GEOMUtils::LevelInfo aLevelMap;
anEntries.push_back( aGboEntry ); anEntries.push_back( aGboEntry );
if ( level >= downLevelList.size() ) { if ( level >= (int)downLevelList.size() ) {
downLevelList.push_back( aLevelMap ); downLevelList.push_back( aLevelMap );
} else { } else {
aLevelMap = downLevelList.at(level); aLevelMap = downLevelList.at(level);
@ -3115,13 +3117,13 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
// purpose : Fills 3 lists that is used to clean study of redundant objects // purpose : Fills 3 lists that is used to clean study of redundant objects
//============================================================================== //==============================================================================
void GEOM_Gen_i::GetEntriesToReduceStudy(SALOMEDS::Study_ptr theStudy, void GEOM_Gen_i::GetEntriesToReduceStudy(SALOMEDS::Study_ptr theStudy,
GEOM::string_array& theSelectedEntries, GEOM::string_array& theSelectedEntries,
GEOM::string_array& theParentEntries, GEOM::string_array& theParentEntries,
GEOM::string_array& theSubEntries, GEOM::string_array& theSubEntries,
GEOM::string_array& theOtherEntries) GEOM::string_array& theOtherEntries)
{ {
std::set<std::string> aSelected, aParents, aChildren, anOthers; std::set<std::string> aSelected, aParents, aChildren, anOthers;
for ( int i = 0; i < theSelectedEntries.length(); i++ ) { for ( CORBA::ULong i = 0; i < theSelectedEntries.length(); i++ ) {
aSelected.insert( CORBA::string_dup( theSelectedEntries[i] ) ); aSelected.insert( CORBA::string_dup( theSelectedEntries[i] ) );
} }
@ -3247,7 +3249,7 @@ void GEOM_Gen_i::includeParentDependencies(GEOM::GEOM_BaseObject_ptr geomObj,
return; return;
// go through dependencies of current object to check whether it depends on the given object // go through dependencies of current object to check whether it depends on the given object
std::string aDepEntry; std::string aDepEntry;
for( int i = 0; i < depList->length(); i++ ) { for( CORBA::ULong i = 0; i < depList->length(); i++ ) {
aDepEntry = depList[i]->GetEntry(); aDepEntry = depList[i]->GetEntry();
if ( depList[i]->_is_nil() || if ( depList[i]->_is_nil() ||
aDepEntry == anEntry || // skip self-depending aDepEntry == anEntry || // skip self-depending

View File

@ -68,7 +68,7 @@
//===================================================================== //=====================================================================
class GEOM_I_EXPORT GEOM_GenericOperationsCreator class GEOM_I_EXPORT GEOM_GenericOperationsCreator
{ {
public: public:
// Create operations // Create operations
virtual GEOM_IOperations_i* Create (PortableServer::POA_ptr thePOA, virtual GEOM_IOperations_i* Create (PortableServer::POA_ptr thePOA,
int theStudyId, int theStudyId,
@ -76,6 +76,7 @@ public:
::GEOMImpl_Gen* theGenImpl) = 0; ::GEOMImpl_Gen* theGenImpl) = 0;
// return the name of IDL module // return the name of IDL module
//virtual std::string GetModuleName() = 0; //virtual std::string GetModuleName() = 0;
virtual ~GEOM_GenericOperationsCreator() {}
}; };
//===================================================================== //=====================================================================

View File

@ -609,9 +609,10 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPointCopy
* OffsetShape * OffsetShape
*/ */
//============================================================================= //=============================================================================
GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape GEOM::GEOM_Object_ptr
(GEOM::GEOM_Object_ptr theObject, GEOM_ITransformOperations_i::OffsetShape (GEOM::GEOM_Object_ptr theObject,
CORBA::Double theOffset) CORBA::Double theOffset,
CORBA::Boolean theJoinByPipes)
{ {
GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
@ -631,7 +632,7 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape
if (aBasicObject.IsNull()) return aGEOMObject._retn(); if (aBasicObject.IsNull()) return aGEOMObject._retn();
//Create the offset shape //Create the offset shape
GetOperations()->OffsetShape(aBasicObject, theOffset); GetOperations()->OffsetShape( aBasicObject, theOffset, theJoinByPipes );
// Update GUI. // Update GUI.
UpdateGUIForObject(theObject); UpdateGUIForObject(theObject);
@ -644,9 +645,10 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape
* OffsetShapeCopy * OffsetShapeCopy
*/ */
//============================================================================= //=============================================================================
GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy GEOM::GEOM_Object_ptr
(GEOM::GEOM_Object_ptr theObject, GEOM_ITransformOperations_i::OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject,
CORBA::Double theOffset) CORBA::Double theOffset,
CORBA::Boolean theJoinByPipes)
{ {
GEOM::GEOM_Object_var aGEOMObject; GEOM::GEOM_Object_var aGEOMObject;
@ -658,7 +660,8 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy
if (aBasicObject.IsNull()) return aGEOMObject._retn(); if (aBasicObject.IsNull()) return aGEOMObject._retn();
//Create the offset shape //Create the offset shape
HANDLE_NAMESPACE(GEOM_Object) anObject = GetOperations()->OffsetShapeCopy(aBasicObject, theOffset); HANDLE_NAMESPACE(GEOM_Object) anObject =
GetOperations()->OffsetShapeCopy(aBasicObject, theOffset, theJoinByPipes);
if (!GetOperations()->IsDone() || anObject.IsNull()) if (!GetOperations()->IsDone() || anObject.IsNull())
return aGEOMObject._retn(); return aGEOMObject._retn();

View File

@ -135,10 +135,12 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
GEOM::GEOM_Object_ptr thePoint); GEOM::GEOM_Object_ptr thePoint);
GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject,
CORBA::Double theOffset); CORBA::Double theOffset,
CORBA::Boolean theJoinByPipes);
GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject,
CORBA::Double theOffset); CORBA::Double theOffset,
CORBA::Boolean theJoinByPipes);
GEOM::GEOM_Object_ptr ProjectShapeCopy (GEOM::GEOM_Object_ptr theSource, GEOM::GEOM_Object_ptr ProjectShapeCopy (GEOM::GEOM_Object_ptr theSource,
GEOM::GEOM_Object_ptr theTarget); GEOM::GEOM_Object_ptr theTarget);

View File

@ -9228,14 +9228,15 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
""" """
theOffset, Parameters = ParseParameters(theOffset) theOffset, Parameters = ParseParameters(theOffset)
if theCopy: if theCopy:
anObj = self.TrsfOp.OffsetShapeCopy(theObject, theOffset) anObj = self.TrsfOp.OffsetShapeCopy(theObject, theOffset, True)
else: else:
anObj = self.TrsfOp.OffsetShape(theObject, theOffset) anObj = self.TrsfOp.OffsetShape(theObject, theOffset, True)
RaiseIfFailed("Offset", self.TrsfOp) RaiseIfFailed("Offset", self.TrsfOp)
anObj.SetParameters(Parameters) anObj.SetParameters(Parameters)
return anObj return anObj
## Create new object as offset of the given one. ## Create new object as offset of the given one. Gap between two adjacent
# offset surfaces is filled by a pipe.
# @param theObject The base object for the offset. # @param theObject The base object for the offset.
# @param theOffset Offset value. # @param theOffset Offset value.
# @param theName Object name; when specified, this parameter is used # @param theName Object name; when specified, this parameter is used
@ -9244,11 +9245,13 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
# #
# @return New GEOM.GEOM_Object, containing the offset object. # @return New GEOM.GEOM_Object, containing the offset object.
# #
# @sa MakeOffsetIntersectionJoin
# @ref tui_offset "Example" # @ref tui_offset "Example"
@ManageTransactions("TrsfOp") @ManageTransactions("TrsfOp")
def MakeOffset(self, theObject, theOffset, theName=None): def MakeOffset(self, theObject, theOffset, theName=None):
""" """
Create new object as offset of the given one. Create new object as offset of the given one. Gap between adjacent
offset surfaces is filled by a pipe.
Parameters: Parameters:
theObject The base object for the offset. theObject The base object for the offset.
@ -9267,7 +9270,48 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
""" """
# Example: see GEOM_TestAll.py # Example: see GEOM_TestAll.py
theOffset, Parameters = ParseParameters(theOffset) theOffset, Parameters = ParseParameters(theOffset)
anObj = self.TrsfOp.OffsetShapeCopy(theObject, theOffset) anObj = self.TrsfOp.OffsetShapeCopy( theObject, theOffset, True )
RaiseIfFailed("OffsetShapeCopy", self.TrsfOp)
anObj.SetParameters(Parameters)
self._autoPublish(anObj, theName, "offset")
return anObj
## Create new object as offset of the given one. Gap between adjacent
# offset surfaces is filled by extending and intersecting them.
# @param theObject The base object for the offset.
# @param theOffset Offset value.
# @param theName Object name; when specified, this parameter is used
# for result publication in the study. Otherwise, if automatic
# publication is switched on, default value is used for result name.
#
# @return New GEOM.GEOM_Object, containing the offset object.
#
# @sa MakeOffset
# @ref tui_offset "Example"
@ManageTransactions("TrsfOp")
def MakeOffsetIntersectionJoin(self, theObject, theOffset, theName=None):
"""
Create new object as offset of the given one. Gap between adjacent
offset surfaces is filled by extending and intersecting them.
Parameters:
theObject The base object for the offset.
theOffset Offset value.
theName Object name; when specified, this parameter is used
for result publication in the study. Otherwise, if automatic
publication is switched on, default value is used for result name.
Returns:
New GEOM.GEOM_Object, containing the offset object.
Example of usage:
box = geompy.MakeBox(20, 20, 20, 200, 200, 200)
# create a new box extended by 70
offset = geompy.MakeOffsetIntersectionJoin(box, 70.)
"""
# Example: see GEOM_TestAll.py
theOffset, Parameters = ParseParameters( theOffset )
anObj = self.TrsfOp.OffsetShapeCopy( theObject, theOffset, False )
RaiseIfFailed("OffsetShapeCopy", self.TrsfOp) RaiseIfFailed("OffsetShapeCopy", self.TrsfOp)
anObj.SetParameters(Parameters) anObj.SetParameters(Parameters)
self._autoPublish(anObj, theName, "offset") self._autoPublish(anObj, theName, "offset")

View File

@ -63,10 +63,8 @@ TransformationGUI_OffsetDlg::TransformationGUI_OffsetDlg( GeometryGUI* theGeomet
GroupPoints->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) ); GroupPoints->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) );
GroupPoints->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); GroupPoints->TextLabel1->setText( tr( "GEOM_OBJECTS" ) );
GroupPoints->TextLabel2->setText( tr( "GEOM_OFFSET" ) ); GroupPoints->TextLabel2->setText( tr( "GEOM_OFFSET" ) );
GroupPoints->CheckButton1->setText( tr( "GEOM_CREATE_COPY" ) ); GroupPoints->CheckButton1->setText( tr( "GEOM_JOIN_BY_PIPES" ) );
GroupPoints->CheckButton1->setChecked( true );
// san -- modification of an exisitng object by offset is not allowed
GroupPoints->CheckButton1->hide();
GroupPoints->PushButton1->setIcon( image1 ); GroupPoints->PushButton1->setIcon( image1 );
@ -111,10 +109,6 @@ void TransformationGUI_OffsetDlg::Init()
initSpinBox( GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); initSpinBox( GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" );
GroupPoints->SpinBox_DX->setValue( 1e-05 ); GroupPoints->SpinBox_DX->setValue( 1e-05 );
// Activate Create a Copy mode
GroupPoints->CheckButton1->setChecked( true );
CreateCopyModeChanged();
mainFrame()->GroupBoxPublish->show(); mainFrame()->GroupBoxPublish->show();
/* signals and slots connections */ /* signals and slots connections */
@ -126,7 +120,7 @@ void TransformationGUI_OffsetDlg::Init()
SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
connect( GroupPoints->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) ); connect( GroupPoints->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) );
connect( GroupPoints->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( CreateCopyModeChanged() ) ); connect( GroupPoints->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( JoinModeChanged() ) );
initName( tr( "GEOM_OFFSET" ) ); initName( tr( "GEOM_OFFSET" ) );
@ -271,10 +265,10 @@ bool TransformationGUI_OffsetDlg::execute( ObjectList& objects )
GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation()); GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation());
if ( GroupPoints->CheckButton1->isChecked() || IsPreview() ) { if ( true /*GroupPoints->CheckButton1->isChecked() || IsPreview()*/ ) {
for ( int i = 0; i < myObjects.count(); i++ ) { for ( int i = 0; i < myObjects.count(); i++ ) {
anObj = anOper->OffsetShapeCopy( myObjects[i].get(), GetOffset() ); anObj = anOper->OffsetShapeCopy( myObjects[i].get(), GetOffset(), GetIsJoinByPipes() );
if ( !anObj->_is_nil() ) { if ( !anObj->_is_nil() ) {
if(!IsPreview()) { if(!IsPreview()) {
anObj->SetParameters(GroupPoints->SpinBox_DX->text().toLatin1().constData()); anObj->SetParameters(GroupPoints->SpinBox_DX->text().toLatin1().constData());
@ -285,7 +279,7 @@ bool TransformationGUI_OffsetDlg::execute( ObjectList& objects )
} }
else { else {
for ( int i = 0; i < myObjects.count(); i++ ) { for ( int i = 0; i < myObjects.count(); i++ ) {
anObj = anOper->OffsetShape( myObjects[i].get(), GetOffset() ); anObj = anOper->OffsetShape( myObjects[i].get(), GetOffset(), GetIsJoinByPipes() );
if ( !anObj->_is_nil() ) if ( !anObj->_is_nil() )
objects.push_back( anObj._retn() ); objects.push_back( anObj._retn() );
} }
@ -320,13 +314,24 @@ double TransformationGUI_OffsetDlg::GetOffset() const
return GroupPoints->SpinBox_DX->value(); return GroupPoints->SpinBox_DX->value();
} }
//=======================================================================
//function : GetIsJoinByPipes
//purpose :
//=======================================================================
bool TransformationGUI_OffsetDlg::GetIsJoinByPipes() const
{
return GroupPoints->CheckButton1->isChecked();
}
//================================================================================= //=================================================================================
// function : CreateCopyModeChanged() // function : JoinModeChanged()
// purpose : // purpose :
//================================================================================= //=================================================================================
void TransformationGUI_OffsetDlg::CreateCopyModeChanged() void TransformationGUI_OffsetDlg::JoinModeChanged()
{ {
mainFrame()->GroupBoxName->setEnabled( GroupPoints->CheckButton1->isChecked() ); processPreview();
//mainFrame()->GroupBoxName->setEnabled( GroupPoints->CheckButton1->isChecked() );
} }
//================================================================================= //=================================================================================

View File

@ -57,6 +57,7 @@ private:
void Init(); void Init();
void enterEvent( QEvent* ); void enterEvent( QEvent* );
double GetOffset() const; double GetOffset() const;
bool GetIsJoinByPipes() const;
private: private:
QList<GEOM::GeomObjPtr> myObjects; QList<GEOM::GeomObjPtr> myObjects;
@ -70,7 +71,7 @@ private slots:
void SelectionIntoArgument(); void SelectionIntoArgument();
void SetEditCurrentArgument(); void SetEditCurrentArgument();
void ValueChangedInSpinBox(); void ValueChangedInSpinBox();
void CreateCopyModeChanged(); void JoinModeChanged();
}; };
#endif // TRANSFORMATIONGUI_OFFSETDLG_H #endif // TRANSFORMATIONGUI_OFFSETDLG_H

View File

@ -72,7 +72,7 @@ CORBA::Boolean XAOPlugin_IOperations_i::ExportXAO( GEOM::GEOM_Object_ptr shape,
Handle(GEOM_Object) reference = GetObjectImpl( shape ); Handle(GEOM_Object) reference = GetObjectImpl( shape );
// Get the reference groups // Get the reference groups
int ind = 0; CORBA::ULong ind = 0;
std::list<Handle(GEOM_Object)> groupsObj; std::list<Handle(GEOM_Object)> groupsObj;
for (; ind < groups.length(); ind++) for (; ind < groups.length(); ind++)
{ {