From 15ed55a71a875d6878ab95acec1c6ee6e8bec82b Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 21 Dec 2017 19:41:40 +0300 Subject: [PATCH] 7.5.6. Generation of the boundary particles for particulate boundary model Add an option to create offset shapes with sharp edges --- .../transformation_operations_ex06.py | 7 ++- .../gui/GEOM/images/transformation11.png | Bin .../gui/GEOM/input/offset_operation.doc | 14 ++++- idl/GEOM_Gen.idl | 10 +++- src/GEOMGUI/GEOM_msg_en.ts | 7 +++ src/GEOMImpl/GEOMImpl_IOffset.hxx | 5 ++ .../GEOMImpl_ITransformOperations.cxx | 22 ++++--- .../GEOMImpl_ITransformOperations.hxx | 6 +- src/GEOMImpl/GEOMImpl_OffsetDriver.cxx | 16 +++-- src/GEOM_I/GEOM_Gen_i.cc | 28 ++++----- src/GEOM_I/GEOM_Gen_i.hh | 3 +- src/GEOM_I/GEOM_ITransformOperations_i.cc | 19 +++--- src/GEOM_I/GEOM_ITransformOperations_i.hh | 6 +- src/GEOM_SWIG/geomBuilder.py | 54 +++++++++++++++-- .../TransformationGUI_OffsetDlg.cxx | 55 ++++++++++-------- .../TransformationGUI_OffsetDlg.h | 3 +- src/XAOPlugin/XAOPlugin_IOperations_i.cc | 2 +- 17 files changed, 180 insertions(+), 77 deletions(-) mode change 100755 => 100644 doc/salome/gui/GEOM/images/transformation11.png mode change 100644 => 100755 src/GEOMGUI/GEOM_msg_en.ts diff --git a/doc/salome/examples/transformation_operations_ex06.py b/doc/salome/examples/transformation_operations_ex06.py index 64f8b6615..f448d4a4e 100644 --- a/doc/salome/examples/transformation_operations_ex06.py +++ b/doc/salome/examples/transformation_operations_ex06.py @@ -11,13 +11,16 @@ gg = salome.ImportComponentGUI("GEOM") box = geompy.MakeBox(20, 20, 20, 200, 200, 200) # 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 id_box = geompy.addToStudy(box, "Box") id_offset = geompy.addToStudy(offset, "Offset") +id_offset2 = geompy.addToStudy(offset2, "Offset_intersection_join") # display the results gg.createAndDisplayGO(id_box) gg.setDisplayMode(id_box,1) -gg.createAndDisplayGO(id_offset) +gg.createAndDisplayGO(id_offset) +gg.createAndDisplayGO(id_offset2) diff --git a/doc/salome/gui/GEOM/images/transformation11.png b/doc/salome/gui/GEOM/images/transformation11.png old mode 100755 new mode 100644 diff --git a/doc/salome/gui/GEOM/input/offset_operation.doc b/doc/salome/gui/GEOM/input/offset_operation.doc index b1baac12b..d3d1fd197 100644 --- a/doc/salome/gui/GEOM/input/offset_operation.doc +++ b/doc/salome/gui/GEOM/input/offset_operation.doc @@ -7,7 +7,12 @@ \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 -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 Join by pipes 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 \ref restore_presentation_parameters_page "Advanced options". @@ -16,9 +21,12 @@ number, negative value meaning inner offset). \n Example: -\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 TUI Command: +- Gaps filled by pipes: geompy.MakeOffset(Shape, Offset), +- Gaps filled by intersection: geompy.MakeOffsetIntersectionJoin(Shape, Offset), -\n TUI Command: geompy.MakeOffset(Shape, Offset), where Shape is a shape(s) which has to be an offset, Offset is a value of the offset. \n Arguments: Name + Object (face(s), shell(s), solid(s)) + diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 66f23e436..ca76b8f1d 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1300,17 +1300,23 @@ module GEOM * \brief Replace the given object by its offset. * \param theObject The base object for the offset. * \param theOffset Offset value. + * \param theJoinByPipes To join offset surfaces by pipes or by intersection. * \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. * \param theObject The base object for the offset. * \param theOffset Offset value. + * \param theJoinByPipes To join offset surfaces by pipes or by intersection. * \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. diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts old mode 100644 new mode 100755 index 7591ab083..5e4b02b20 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -7653,6 +7653,13 @@ Do you want to create new material? Rotation angle + + TransformationGUI_OffsetDlg + + GEOM_JOIN_BY_PIPES + Join by pipes + + OperationGUI_ExtractionDlg diff --git a/src/GEOMImpl/GEOMImpl_IOffset.hxx b/src/GEOMImpl/GEOMImpl_IOffset.hxx index 200797cb9..fea75eac9 100644 --- a/src/GEOMImpl/GEOMImpl_IOffset.hxx +++ b/src/GEOMImpl/GEOMImpl_IOffset.hxx @@ -29,6 +29,7 @@ #define OFF_ARG_VALUE 2 #define OFF_ARG_IDS 3 #define OFF_ARG_PARAM 4 +#define OFF_ARG_JOIN 5 class GEOMImpl_IOffset { @@ -48,6 +49,10 @@ class GEOMImpl_IOffset 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) { _func->SetIntegerArray(OFF_ARG_IDS, theFaceIDs); } diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx index 34af46dff..efe5929ca 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx @@ -1053,8 +1053,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorAxisCopy * OffsetShape */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape - (Handle(GEOM_Object) theObject, double theOffset) +Handle(GEOM_Object) +GEOMImpl_ITransformOperations::OffsetShape (Handle(GEOM_Object) theObject, + double theOffset, + bool theJoinByPipes) { SetErrorCode(KO); @@ -1072,8 +1074,9 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL; GEOMImpl_IOffset aTI (aFunction); - aTI.SetShape(anOriginal); - aTI.SetValue(theOffset); + aTI.SetShape( anOriginal ); + aTI.SetValue( theOffset ); + aTI.SetJoinByPipes( theJoinByPipes ); //Compute the offset try { @@ -1102,8 +1105,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape * OffsetShapeCopy */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy - (Handle(GEOM_Object) theObject, double theOffset) +Handle(GEOM_Object) +GEOMImpl_ITransformOperations::OffsetShapeCopy( Handle(GEOM_Object) theObject, + double theOffset, + bool theJoinByPipes) { SetErrorCode(KO); @@ -1124,8 +1129,9 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL; GEOMImpl_IOffset aTI (aFunction); - aTI.SetShape(anOriginal); - aTI.SetValue(theOffset); + aTI.SetShape( anOriginal ); + aTI.SetValue( theOffset ); + aTI.SetJoinByPipes( theJoinByPipes ); //Compute the offset try { diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx index 46fb60dcb..db5adae66 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx @@ -105,10 +105,12 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations Handle(GEOM_Object) thePoint); 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, - double theOffset); + double theOffset, + bool theJoinByPipes); Standard_EXPORT Handle(GEOM_Object) ProjectShapeCopy (Handle(GEOM_Object) theSource, Handle(GEOM_Object) theTarget); diff --git a/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx b/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx index d5bf48b4f..b23578f6c 100644 --- a/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx @@ -86,11 +86,19 @@ Standard_Integer GEOMImpl_OffsetDriver::Execute(LOGBOOK& log) const StdFail_NotDone::Raise(aMsg.ToCString()); } - if (aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY) { - BRepOffsetAPI_MakeOffsetShape MO (aShapeBase, + if ( aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY ) + { + BRepOffset_Mode aMode = BRepOffset_Skin; + Standard_Boolean anIntersection = Standard_False, aSelfInter = Standard_False; + BRepOffsetAPI_MakeOffsetShape MO( aShapeBase, aCI.GetValue(), - aTol); - if (MO.IsDone()) { + aTol, + aMode, + anIntersection, + aSelfInter, + aCI.GetJoinByPipes() ? GeomAbs_Arc : GeomAbs_Intersection ); + + if ( MO.IsDone() ) { aShape = MO.Shape(); if ( !GEOMUtils::CheckShape(aShape, true) && !GEOMUtils::FixShapeTolerance(aShape) ) Standard_ConstructionError::Raise("Boolean operation aborted : non valid shape result"); diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index aac522ccc..866264a6c 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -313,6 +313,8 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID"); aNamePrefix = "Group_Of_Solids_"; break; + default: + aNamePrefix = "Group_"; } } else if ( mytype == GEOM_MARKER ) { 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(); Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1, theIndices.length()); - for(Standard_Integer i = 0; iSetValue(i+1, theIndices[i]); + for(CORBA::ULong i = 0; iSetValue(i+1, theIndices[i]); HANDLE_NAMESPACE(GEOM_Object) anObject = _impl->AddSubShape(aMainShape, anArray, true); 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]; if ( CORBA::is_nil( sobj ) ) continue; // skip bad object // 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; 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 entry = theObjectEntries[i].in(); 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::LevelInfo aLevelMap; if ( level > 0 ) { - if ( level-1 >= upLevelList.size() ) { + if ( level-1 >= (int)upLevelList.size() ) { // create a new map upLevelList.push_back( aLevelMap ); } else { @@ -3021,7 +3023,7 @@ void GEOM_Gen_i::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo, // get objects on that the current one depends GEOM::ListOfGBO_var depList = gbo->GetDependency(); 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() ) continue; aDepEntry = depList[j]->GetEntry(); @@ -3077,7 +3079,7 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo, continue; std::string aGoEntry = geomObj->GetEntry(); // 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() ) continue; if ( depList[i]->_is_equivalent( gbo ) ) { @@ -3091,7 +3093,7 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo, GEOMUtils::NodeLinks anEntries; GEOMUtils::LevelInfo aLevelMap; anEntries.push_back( aGboEntry ); - if ( level >= downLevelList.size() ) { + if ( level >= (int)downLevelList.size() ) { downLevelList.push_back( aLevelMap ); } else { 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 //============================================================================== void GEOM_Gen_i::GetEntriesToReduceStudy(SALOMEDS::Study_ptr theStudy, - GEOM::string_array& theSelectedEntries, - GEOM::string_array& theParentEntries, - GEOM::string_array& theSubEntries, - GEOM::string_array& theOtherEntries) + GEOM::string_array& theSelectedEntries, + GEOM::string_array& theParentEntries, + GEOM::string_array& theSubEntries, + GEOM::string_array& theOtherEntries) { std::set 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] ) ); } @@ -3247,7 +3249,7 @@ void GEOM_Gen_i::includeParentDependencies(GEOM::GEOM_BaseObject_ptr geomObj, return; // go through dependencies of current object to check whether it depends on the given object std::string aDepEntry; - for( int i = 0; i < depList->length(); i++ ) { + for( CORBA::ULong i = 0; i < depList->length(); i++ ) { aDepEntry = depList[i]->GetEntry(); if ( depList[i]->_is_nil() || aDepEntry == anEntry || // skip self-depending diff --git a/src/GEOM_I/GEOM_Gen_i.hh b/src/GEOM_I/GEOM_Gen_i.hh index 34641ec7e..da2bcb4b6 100644 --- a/src/GEOM_I/GEOM_Gen_i.hh +++ b/src/GEOM_I/GEOM_Gen_i.hh @@ -68,7 +68,7 @@ //===================================================================== class GEOM_I_EXPORT GEOM_GenericOperationsCreator { -public: + public: // Create operations virtual GEOM_IOperations_i* Create (PortableServer::POA_ptr thePOA, int theStudyId, @@ -76,6 +76,7 @@ public: ::GEOMImpl_Gen* theGenImpl) = 0; // return the name of IDL module //virtual std::string GetModuleName() = 0; + virtual ~GEOM_GenericOperationsCreator() {} }; //===================================================================== diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.cc b/src/GEOM_I/GEOM_ITransformOperations_i.cc index e8e2fcd2d..93b0cdda2 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.cc +++ b/src/GEOM_I/GEOM_ITransformOperations_i.cc @@ -609,9 +609,10 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPointCopy * OffsetShape */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape - (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset) +GEOM::GEOM_Object_ptr +GEOM_ITransformOperations_i::OffsetShape (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset, + CORBA::Boolean theJoinByPipes) { 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(); //Create the offset shape - GetOperations()->OffsetShape(aBasicObject, theOffset); + GetOperations()->OffsetShape( aBasicObject, theOffset, theJoinByPipes ); // Update GUI. UpdateGUIForObject(theObject); @@ -644,9 +645,10 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape * OffsetShapeCopy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy - (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset) +GEOM::GEOM_Object_ptr +GEOM_ITransformOperations_i::OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset, + CORBA::Boolean theJoinByPipes) { GEOM::GEOM_Object_var aGEOMObject; @@ -658,7 +660,8 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy if (aBasicObject.IsNull()) return aGEOMObject._retn(); //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()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.hh b/src/GEOM_I/GEOM_ITransformOperations_i.hh index 3e06acfb8..b4b4f9a05 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.hh +++ b/src/GEOM_I/GEOM_ITransformOperations_i.hh @@ -135,10 +135,12 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i : GEOM::GEOM_Object_ptr thePoint); 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, - CORBA::Double theOffset); + CORBA::Double theOffset, + CORBA::Boolean theJoinByPipes); GEOM::GEOM_Object_ptr ProjectShapeCopy (GEOM::GEOM_Object_ptr theSource, GEOM::GEOM_Object_ptr theTarget); diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index b46ff1c66..cd40bbf68 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -9228,14 +9228,15 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): """ theOffset, Parameters = ParseParameters(theOffset) if theCopy: - anObj = self.TrsfOp.OffsetShapeCopy(theObject, theOffset) + anObj = self.TrsfOp.OffsetShapeCopy(theObject, theOffset, True) else: - anObj = self.TrsfOp.OffsetShape(theObject, theOffset) + anObj = self.TrsfOp.OffsetShape(theObject, theOffset, True) RaiseIfFailed("Offset", self.TrsfOp) anObj.SetParameters(Parameters) 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 theOffset Offset value. # @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. # + # @sa MakeOffsetIntersectionJoin # @ref tui_offset "Example" @ManageTransactions("TrsfOp") 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: theObject The base object for the offset. @@ -9267,7 +9270,48 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestAll.py 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) anObj.SetParameters(Parameters) self._autoPublish(anObj, theName, "offset") diff --git a/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx b/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx index f4157b6bd..2e2916f03 100644 --- a/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx @@ -58,26 +58,24 @@ TransformationGUI_OffsetDlg::TransformationGUI_OffsetDlg( GeometryGUI* theGeomet mainFrame()->RadioButton2->close(); mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->close(); - + GroupPoints = new DlgRef_1Sel1Spin1Check( centralWidget() ); GroupPoints->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) ); GroupPoints->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); GroupPoints->TextLabel2->setText( tr( "GEOM_OFFSET" ) ); - GroupPoints->CheckButton1->setText( tr( "GEOM_CREATE_COPY" ) ); - - // san -- modification of an exisitng object by offset is not allowed - GroupPoints->CheckButton1->hide(); + GroupPoints->CheckButton1->setText( tr( "GEOM_JOIN_BY_PIPES" ) ); + GroupPoints->CheckButton1->setChecked( true ); GroupPoints->PushButton1->setIcon( image1 ); - + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( GroupPoints ); - + /***************************************************************/ setHelpFileName( "offset_operation_page.html" ); - + Init(); } @@ -97,37 +95,33 @@ TransformationGUI_OffsetDlg::~TransformationGUI_OffsetDlg() // purpose : //================================================================================= void TransformationGUI_OffsetDlg::Init() -{ +{ /* init variables */ myEditCurrentArgument = GroupPoints->LineEdit1; GroupPoints->LineEdit1->setReadOnly( true ); myObjects.clear(); - + /* Get setting of step value from file configuration */ double step = 1; - + /* min, max, step and decimals for spin boxes & initial values */ initSpinBox( GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); GroupPoints->SpinBox_DX->setValue( 1e-05 ); - - // Activate Create a Copy mode - GroupPoints->CheckButton1->setChecked( true ); - CreateCopyModeChanged(); mainFrame()->GroupBoxPublish->show(); /* signals and slots connections */ connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); - + connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); - connect( myGeomGUI->getApp()->selectionMgr(), + connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); 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" ) ); globalSelection( GEOM_ALLSHAPES ); @@ -271,10 +265,10 @@ bool TransformationGUI_OffsetDlg::execute( ObjectList& objects ) 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++ ) { - anObj = anOper->OffsetShapeCopy( myObjects[i].get(), GetOffset() ); + anObj = anOper->OffsetShapeCopy( myObjects[i].get(), GetOffset(), GetIsJoinByPipes() ); if ( !anObj->_is_nil() ) { if(!IsPreview()) { anObj->SetParameters(GroupPoints->SpinBox_DX->text().toLatin1().constData()); @@ -285,7 +279,7 @@ bool TransformationGUI_OffsetDlg::execute( ObjectList& objects ) } else { 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() ) objects.push_back( anObj._retn() ); } @@ -320,13 +314,24 @@ double TransformationGUI_OffsetDlg::GetOffset() const return GroupPoints->SpinBox_DX->value(); } +//======================================================================= +//function : GetIsJoinByPipes +//purpose : +//======================================================================= + +bool TransformationGUI_OffsetDlg::GetIsJoinByPipes() const +{ + return GroupPoints->CheckButton1->isChecked(); +} + //================================================================================= -// function : CreateCopyModeChanged() +// function : JoinModeChanged() // purpose : //================================================================================= -void TransformationGUI_OffsetDlg::CreateCopyModeChanged() +void TransformationGUI_OffsetDlg::JoinModeChanged() { - mainFrame()->GroupBoxName->setEnabled( GroupPoints->CheckButton1->isChecked() ); + processPreview(); + //mainFrame()->GroupBoxName->setEnabled( GroupPoints->CheckButton1->isChecked() ); } //================================================================================= diff --git a/src/TransformationGUI/TransformationGUI_OffsetDlg.h b/src/TransformationGUI/TransformationGUI_OffsetDlg.h index c2ec78c41..54295bf29 100644 --- a/src/TransformationGUI/TransformationGUI_OffsetDlg.h +++ b/src/TransformationGUI/TransformationGUI_OffsetDlg.h @@ -57,6 +57,7 @@ private: void Init(); void enterEvent( QEvent* ); double GetOffset() const; + bool GetIsJoinByPipes() const; private: QList myObjects; @@ -70,7 +71,7 @@ private slots: void SelectionIntoArgument(); void SetEditCurrentArgument(); void ValueChangedInSpinBox(); - void CreateCopyModeChanged(); + void JoinModeChanged(); }; #endif // TRANSFORMATIONGUI_OFFSETDLG_H diff --git a/src/XAOPlugin/XAOPlugin_IOperations_i.cc b/src/XAOPlugin/XAOPlugin_IOperations_i.cc index fa26fe5f0..9e11eca2d 100644 --- a/src/XAOPlugin/XAOPlugin_IOperations_i.cc +++ b/src/XAOPlugin/XAOPlugin_IOperations_i.cc @@ -72,7 +72,7 @@ CORBA::Boolean XAOPlugin_IOperations_i::ExportXAO( GEOM::GEOM_Object_ptr shape, Handle(GEOM_Object) reference = GetObjectImpl( shape ); // Get the reference groups - int ind = 0; + CORBA::ULong ind = 0; std::list groupsObj; for (; ind < groups.length(); ind++) { -- 2.39.2