public void set(GeoElement geo) {
    GeoSurfaceCartesian3D geoSurface = (GeoSurfaceCartesian3D) geo;

    fun = new Function[3];
    for (int i = 0; i < 3; i++) {
      fun[i] = new FunctionNVar(geoSurface.fun[i], kernel);
      // Application.debug(fun[i].toString());
    }

    startParam = geoSurface.startParam;
    endParam = geoSurface.endParam;
    isDefined = geoSurface.isDefined;

    // macro OUTPUT
    if (geo.getConstruction() != cons && isAlgoMacroOutput()) {
      if (!geo.isIndependent()) {
        // this object is an output object of AlgoMacro
        // we need to check the references to all geos in its function's expression
        AlgoMacro algoMacro = (AlgoMacro) getParentAlgorithm();
        for (int i = 0; i < 3; i++) algoMacro.initFunction(fun[i]);
      }
    }

    // distFun = new ParametricCurveDistanceFunction(this);

  }