cEqDirecteDistorsion:: cEqDirecteDistorsion
(  
     cParamIntrinsequeFormel & aPIF,
     eTypeEqDisDirecre         Usage,
     bool                Code2Gen
)  :
   mUsage     (Usage),
   mSet       (*aPIF.Set()),
   mPIF       (aPIF),
   mP1        ("PIm1"),
   mP2        ("PIm2"),
   mResidu    (P1_EDD(mPIF,mP1.PtF(),Usage) - mP2.PtF()),
   mNameType  (    "cEqDirectDist" 
                 +  mPIF.NameType() 
		 +  (Usage2Str(Usage))
		 +"_CodGen"
              )
{
     mPIF.IncInterv().SetName("Calib");
     mLInterv.AddInterv(mPIF.IncInterv());

     mFoncEqResidu = cElCompiledFonc::AllocFromName(mNameType);

    if (Code2Gen)
    {
        GenCode();
        return;
    }


    if (mFoncEqResidu==0)
    {
       std::cout << "Name = " << mNameType << "\n";
       ELISE_ASSERT(false,"Can Get Code Comp for cEqCalibCroisee");      
       mFoncEqResidu = cElCompiledFonc::DynamicAlloc(mLInterv,Fonc_Num(0));
    }

    mFoncEqResidu->SetMappingCur(mLInterv,&mSet);


    mP1.InitAdr(*mFoncEqResidu);
    mP2.InitAdr(*mFoncEqResidu);

    aPIF.InitStateOfFoncteur(mFoncEqResidu,0);
    mSet.AddFonct(mFoncEqResidu);
}
cEqCalibCroisee::cEqCalibCroisee
(
       bool                      SensC2M,
       cParamIntrinsequeFormel & aPIF,
       cRotationFormelle *       aRot,
       bool                      Code2Gen
)  :
   mSet       (*aPIF.Set()),
   mPIF       (aPIF),
   mRotCalc   ( aRot ? 
                aRot :
                mSet.NewRotation(eRotCOptFige,ElRotation3D(Pt3dr(0,0,0),0,0,0))
              ),
   mRot2Destr (aRot ? 0 : mRotCalc),
   mP1        ("PIm1"),
   mN2        ("DirEsp2"),
   mResidu    (   SensC2M ?
                  (    PointNorm1(mPIF.Cam2DirRayMonde(mP1.PtF(),0))
                       - mRotCalc->VectM2C(mN2.PtF())
                  )  :
		  AdZ0(mP1.PtF() -mPIF.DirRayMonde2Cam(mRotCalc->VectM2C(mN2.PtF()),0))
              ),
   mNameType  ("cEqCalibCroisee_" +  mPIF.NameType() +"_CodGen" + std::string(SensC2M ? "C2M" : "M2C"))
{

    // Test de coherence, si rotation vient de l'exterieur
    ELISE_ASSERT
    (
        (&mSet==mRotCalc->Set()),
        "Set incoherence in cEqObsRotVect::cEqObsRotVect"
    );

   // En mode utilisation,  assurele lien les numeros d'inconnu de mRotCalc et 
   // la numerotation interne; en mode generation de code cree l'intervale de ref
     mRotCalc->IncInterv().SetName("Orient");
     mPIF.IncInterv().SetName("Calib");
     mLInterv.AddInterv(mRotCalc->IncInterv());
     mLInterv.AddInterv(mPIF.IncInterv());

    // Cette etape va creer  un objet de type "cEqCalibCroisee_Calib_CodeGen",
    // tant que le code n'a pas ete genere et linke, il n'y a aucune
    // raison pour que cet objet puisse etre cree, la valeur 0 sera alors
    // retournee
    mFoncEqResidu = cElCompiledFonc::AllocFromName(mNameType);


    if (Code2Gen)
    {
        GenCode();
        // En phase de generation il n'y a pas grand chose de plus a faire
        return;
    }

    // En theorie le mecanisme permet de fonctionner meme sans generation
    // de code par un mode degrade "interprete" ou toute les evaluation sont
    // faite directement a partir des Fonc_Num ;  cette fonctionnalite n'est
    // pas vraiment maintenue (par exemple elle ne gere par les contraintes
    // multiple);  on conserve l'architecture de code  "au cas ou "mais 
    // on en interdit l'usage

    if (mFoncEqResidu==0)
    {
       std::cout << "Name = " << mNameType << "\n";
       ELISE_ASSERT(false,"Can Get Code Comp for cEqCalibCroisee");      
       mFoncEqResidu = cElCompiledFonc::DynamicAlloc(mLInterv,Fonc_Num(0));
    }

    // Cree dans l'objet la lut vers les numero d'inconnues
    mFoncEqResidu->SetMappingCur(mLInterv,&mSet);


    // Le code genere fait reference au valeur de P1 et P2;
    // pour pouvoir repidement faire l'initialisation on memorise
    // leur adresse (on envoie un nom, on recupere une adresse)
    // ceci est encapsule dans cP3d_Etat_PhgrF qui gere les variables
    // d'etat triple correspondant des points 3D
    mP1.InitAdr(*mFoncEqResidu);
    mN2.InitAdr(*mFoncEqResidu);

    aPIF.InitStateOfFoncteur(mFoncEqResidu,0);

    // Il est necessaire que  mSet connaisse l'ensemble de ses "foncteur"
    // pour  :
    //    1- assurer la mise a jour des inconnues dans le cas d'un processus iteratif
    //    2- assurer la destruction

    mSet.AddFonct(mFoncEqResidu);
}