+ if ( IsInStudy() )
+ {
+ list< Handle(_pyObject) >::iterator obj = myReferredObjs.begin();
+ for ( ; obj != myReferredObjs.end(); ++obj )
+ if ( (*obj)->CanClear() )
+ return true;
+ return false;
+ }
+ return true;
+}
+
+//================================================================================
+/*!
+ * \brief Clear my commands depending on usage by meshes
+ */
+//================================================================================
+
+void _pyHypothesis::ClearCommands()
+{
+ // if ( !theGen->IsToKeepAllCommands() )
+ // {
+ // bool isUsed = false;
+ // int lastComputeOrder = 0;
+ // list<Handle(_pyCommand) >::iterator cmd = myComputeCmds.begin();
+ // for ( ; cmd != myComputeCmds.end(); ++cmd )
+ // if ( ! (*cmd)->IsEmpty() )
+ // {
+ // isUsed = true;
+ // if ( (*cmd)->GetOrderNb() > lastComputeOrder )
+ // lastComputeOrder = (*cmd)->GetOrderNb();
+ // }
+ // if ( !isUsed )
+ // {
+ // SetRemovedFromStudy( true );
+ // }
+ // else
+ // {
+ // // clear my commands invoked after lastComputeOrder
+ // // map<TCollection_AsciiString, list< Handle(_pyCommand) > >::iterator m2c;
+ // // for ( m2c = myMeth2Commands.begin(); m2c != myMeth2Commands.end(); ++m2c )
+ // // {
+ // // list< Handle(_pyCommand)> & cmds = m2c->second;
+ // // if ( !cmds.empty() && cmds.back()->GetOrderNb() > lastComputeOrder )
+ // // cmds.back()->Clear();
+ // // }
+ // }
+ // }
+ _pyObject::ClearCommands();
+}
+
+//================================================================================
+/*!
+ * \brief Find arguments that are objects like mesh, group, geometry
+ * \param meshes - referred meshes (directly or indirrectly)
+ * \retval bool - false if a referred geometry is not in the study
+ */
+//================================================================================
+
+bool _pyHypothesis::GetReferredMeshesAndGeom( list< Handle(_pyMesh) >& meshes )
+{
+ if ( IsAlgo() ) return true;
+
+ bool geomPublished = true;
+ vector< _AString > args;
+ TType2CrMethod::iterator type2meth = myAlgoType2CreationMethod.begin();
+ for ( ; type2meth != myAlgoType2CreationMethod.end(); ++type2meth )
+ {
+ CreationMethod& crMethod = type2meth->second;
+ args.insert( args.end(), crMethod.myArgs.begin(), crMethod.myArgs.end());
+ }
+ list<Handle(_pyCommand)>::iterator cmd = myUnusedCommands.begin();
+ for ( ; cmd != myUnusedCommands.end(); ++cmd ) {
+ for ( int nb = (*cmd)->GetNbArgs(); nb; --nb )
+ args.push_back( (*cmd)->GetArg( nb ));
+ }
+
+ for ( size_t i = 0; i < args.size(); ++i )
+ {
+ list< _pyID > idList = _pyCommand::GetStudyEntries( args[ i ]);
+ if ( idList.empty() && !args[ i ].IsEmpty() )
+ idList.push_back( args[ i ]);
+ list< _pyID >::iterator id = idList.begin();
+ for ( ; id != idList.end(); ++id )
+ {
+ Handle(_pyObject) obj = theGen->FindObject( *id );
+ if ( obj.IsNull() ) obj = theGen->FindHyp( *id );
+ if ( obj.IsNull() )
+ {
+ if ( theGen->IsGeomObject( *id ) && theGen->IsNotPublished( *id ))
+ geomPublished = false;
+ }
+ else
+ {
+ myReferredObjs.push_back( obj );
+ Handle(_pyMesh) mesh = ObjectToMesh( obj );
+ if ( !mesh.IsNull() )
+ meshes.push_back( mesh );
+ // prevent clearing not published hyps referred e.g. by "LayerDistribution"
+ else if ( obj->IsKind( STANDARD_TYPE( _pyHypothesis )) && this->IsInStudy() )
+ obj->SetRemovedFromStudy( false );
+ }
+ }
+ }
+ return geomPublished;
+}
+
+//================================================================================
+/*!
+ * \brief Remember theCommand setting a parameter
+ */
+//================================================================================
+
+void _pyHypothesis::rememberCmdOfParameter( const Handle(_pyCommand) & theCommand )
+{
+ // parameters are discriminated by method name
+ _AString method = theCommand->GetMethod();
+ if ( myAccumulativeMethods.count( method ))
+ return; // this method adds values and not override the previus value
+
+ // discriminate commands setting different parameters via one method
+ // by passing parameter names like e.g. SetOption("size", "0.2")
+ if ( theCommand->GetString().FirstLocationInSet( "'\"", 1, theCommand->Length() ) &&
+ theCommand->GetNbArgs() > 1 )
+ {
+ // mangle method by appending a 1st textual arg
+ for ( int iArg = 1; iArg <= theCommand->GetNbArgs(); ++iArg )
+ {
+ const TCollection_AsciiString& arg = theCommand->GetArg( iArg );
+ if ( arg.Value(1) != '\"' && arg.Value(1) != '\'' ) continue;
+ if ( !isalpha( arg.Value(2))) continue;
+ method += arg;
+ break;
+ }
+ }
+ // parameters are discriminated by method name
+ list< Handle(_pyCommand)>& cmds = myMeth2Commands[ method /*theCommand->GetMethod()*/ ];
+ if ( !cmds.empty() && !isCmdUsedForCompute( cmds.back() ))
+ {
+ cmds.back()->Clear(); // previous parameter value has not been used
+ cmds.back() = theCommand;
+ }
+ else
+ {
+ cmds.push_back( theCommand );
+ }
+}
+
+//================================================================================
+/*!
+ * \brief Return true if a setting parameter command ha been used to compute mesh
+ */
+//================================================================================
+
+bool _pyHypothesis::isCmdUsedForCompute( const Handle(_pyCommand) & cmd,
+ _pyCommand::TAddr avoidComputeAddr ) const
+{
+ bool isUsed = false;
+ map< _pyCommand::TAddr, list<Handle(_pyCommand) > >::const_iterator addr2cmds =
+ myComputeAddr2Cmds.begin();
+ for ( ; addr2cmds != myComputeAddr2Cmds.end() && !isUsed; ++addr2cmds )
+ {
+ if ( addr2cmds->first == avoidComputeAddr ) continue;
+ const list<Handle(_pyCommand)> & cmds = addr2cmds->second;
+ isUsed = ( std::find( cmds.begin(), cmds.end(), cmd ) != cmds.end() );
+ }
+ return isUsed;
+}
+
+//================================================================================
+/*!
+ * \brief Save commands setting parameters as they are used for a mesh computation
+ */
+//================================================================================
+
+void _pyHypothesis::MeshComputed( const Handle(_pyCommand)& theComputeCmd )
+{
+ myComputeCmds.push_back( theComputeCmd );
+ list<Handle(_pyCommand)>& savedCmds = myComputeAddr2Cmds[ theComputeCmd->GetAddress() ];
+
+ map<TCollection_AsciiString, list< Handle(_pyCommand) > >::iterator m2c;
+ for ( m2c = myMeth2Commands.begin(); m2c != myMeth2Commands.end(); ++m2c )
+ savedCmds.push_back( m2c->second.back() );
+}
+
+//================================================================================
+/*!
+ * \brief Clear commands setting parameters as a mesh computed using them is cleared
+ */
+//================================================================================
+
+void _pyHypothesis::ComputeDiscarded( const Handle(_pyCommand)& theComputeCmd )
+{
+ list<Handle(_pyCommand)>& savedCmds = myComputeAddr2Cmds[ theComputeCmd->GetAddress() ];
+
+ list<Handle(_pyCommand)>::iterator cmd = savedCmds.begin();
+ for ( ; cmd != savedCmds.end(); ++cmd )
+ {
+ // check if a cmd has been used to compute another mesh
+ if ( isCmdUsedForCompute( *cmd, theComputeCmd->GetAddress() ))
+ continue;
+ // check if a cmd is a sole command setting its parameter;
+ // don't use method name for search as it can change
+ map<TCollection_AsciiString, list<Handle(_pyCommand)> >::iterator
+ m2cmds = myMeth2Commands.begin();
+ for ( ; m2cmds != myMeth2Commands.end(); ++m2cmds )
+ {
+ list< Handle(_pyCommand)>& cmds = m2cmds->second;
+ list< Handle(_pyCommand)>::iterator cmdIt = std::find( cmds.begin(), cmds.end(), *cmd );
+ if ( cmdIt != cmds.end() )
+ {
+ if ( cmds.back() != *cmd )
+ {
+ cmds.erase( cmdIt );
+ (*cmd)->Clear();
+ }
+ break;
+ }
+ }
+ }
+ myComputeAddr2Cmds.erase( theComputeCmd->GetAddress() );
+}
+
+//================================================================================
+/*!
+ * \brief Sets an argNb-th argument of current creation command
+ * \param argNb - argument index countered from 1
+ */
+//================================================================================
+
+void _pyHypothesis::setCreationArg( const int argNb, const _AString& arg )
+{
+ if ( myCurCrMethod )
+ {
+ while ( myCurCrMethod->myArgs.size() < argNb )
+ myCurCrMethod->myArgs.push_back( "None" );
+ if ( arg.IsEmpty() )
+ myCurCrMethod->myArgs[ argNb-1 ] = "None";
+ else
+ myCurCrMethod->myArgs[ argNb-1 ] = arg;
+ }
+}
+
+
+//================================================================================
+/*!
+ * \brief Remember hypothesis parameter values
+ * \param theCommand - The called hypothesis method
+ */
+//================================================================================
+
+void _pyComplexParamHypo::Process( const Handle(_pyCommand)& theCommand)
+{
+ if ( GetAlgoType() == "Cartesian_3D" )
+ {
+ // CartesianParameters3D hyp
+
+ if ( theCommand->GetMethod() == "SetSizeThreshold" )
+ {
+ setCreationArg( 4, theCommand->GetArg( 1 ));
+ myArgCommands.push_back( theCommand );
+ return;
+ }
+ if ( theCommand->GetMethod() == "SetGrid" ||
+ theCommand->GetMethod() == "SetGridSpacing" )
+ {
+ TCollection_AsciiString axis = theCommand->GetArg( theCommand->GetNbArgs() );
+ int iArg = axis.Value(1) - '0';
+ if ( theCommand->GetMethod() == "SetGrid" )
+ {
+ setCreationArg( 1+iArg, theCommand->GetArg( 1 ));
+ }
+ else
+ {
+ myCurCrMethod->myArgs[ iArg ] = "[ ";
+ myCurCrMethod->myArgs[ iArg ] += theCommand->GetArg( 1 );
+ myCurCrMethod->myArgs[ iArg ] += ", ";
+ myCurCrMethod->myArgs[ iArg ] += theCommand->GetArg( 2 );
+ myCurCrMethod->myArgs[ iArg ] += "]";
+ }
+ myArgCommands.push_back( theCommand );
+ rememberCmdOfParameter( theCommand );
+ return;
+ }
+ }
+
+ if( theCommand->GetMethod() == "SetLength" )
+ {
+ // NOW it is OBSOLETE
+ // ex: hyp.SetLength(start, 1)
+ // hyp.SetLength(end, 0)
+ ASSERT(( theCommand->GetArg( 2 ).IsIntegerValue() ));
+ int i = 1 - theCommand->GetArg( 2 ).IntegerValue();
+ TType2CrMethod::iterator type2meth = myAlgoType2CreationMethod.begin();
+ for ( ; type2meth != myAlgoType2CreationMethod.end(); ++type2meth )
+ {
+ CreationMethod& crMethod = type2meth->second;
+ while ( crMethod.myArgs.size() < i+1 )
+ crMethod.myArgs.push_back( "[]" );
+ crMethod.myArgs[ i ] = theCommand->GetArg( 1 ); // arg value
+ }
+ myArgCommands.push_back( theCommand );
+ }
+ else
+ {
+ _pyHypothesis::Process( theCommand );
+ }
+}
+//================================================================================
+/*!
+ * \brief Clear SetObjectEntry() as it is called by methods of Mesh_Segment
+ */
+//================================================================================
+
+void _pyComplexParamHypo::Flush()
+{
+ if ( IsWrapped() )
+ {
+ list < Handle(_pyCommand) >::iterator cmd = myUnusedCommands.begin();
+ for ( ; cmd != myUnusedCommands.end(); ++cmd )
+ if ((*cmd)->GetMethod() == "SetObjectEntry" )
+ (*cmd)->Clear();
+ }
+}
+