+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();
+ }
+}
+
+//================================================================================
+/*!
+ * \brief Convert methods of 1D hypotheses to my own methods
+ * \param theCommand - The called hypothesis method
+ */
+//================================================================================
+
+void _pyLayerDistributionHypo::Process( const Handle(_pyCommand)& theCommand)
+{
+ if ( theCommand->GetMethod() != "SetLayerDistribution" )
+ return;
+
+ const _pyID& hyp1dID = theCommand->GetArg( 1 );
+ // Handle(_pyHypothesis) hyp1d = theGen->FindHyp( hyp1dID );
+ // if ( hyp1d.IsNull() && ! my1dHyp.IsNull()) // apparently hypId changed at study restoration
+ // {
+ // TCollection_AsciiString cmd =
+ // my1dHyp->GetCreationCmd()->GetIndentation() + hyp1dID + " = " + my1dHyp->GetID();
+ // Handle(_pyCommand) newCmd = theGen->AddCommand( cmd );
+ // theGen->SetCommandAfter( newCmd, my1dHyp->GetCreationCmd() );
+ // hyp1d = my1dHyp;
+ // }
+ // else if ( !my1dHyp.IsNull() && hyp1dID != my1dHyp->GetID() )
+ // {
+ // // 1D hypo is already set, so distribution changes and the old
+ // // 1D hypo is thrown away
+ // my1dHyp->ClearAllCommands();
+ // }
+ // my1dHyp = hyp1d;
+ // //my1dHyp->SetRemovedFromStudy( false );
+
+ // if ( !myArgCommands.empty() )
+ // myArgCommands.back()->Clear();
+ myCurCrMethod->myArgs.push_back( hyp1dID );
+ myArgCommands.push_back( theCommand );
+}
+
+//================================================================================
+/*!
+ * \brief
+ * \param theAdditionCmd - command to be converted
+ * \param theMesh - mesh instance
+ * \retval bool - status
+ */
+//================================================================================