Exemplo n.º 1
0
    def add_output_pdm(self, master):

        self.power_deviation_matrix_minimum_count = self.addEntry(
            master, "PDM Minimum Count:",
            validation.ValidateNonNegativeInteger(master),
            self.config.power_deviation_matrix_minimum_count)
        self.power_deviation_matrix_method = self.addOption(
            master, "PDM Method:",
            ["Average of Deviations", "Deviation of Averages"],
            self.config.power_deviation_matrix_method)

        self.addTitleRow(master, "Power Deviation Matrix Dimensions (Output):")
        self.power_deviation_matrix_grid_box = PowerDeviationMatrixGridBox(
            master, self, self.row, self.inputColumn)
        self.power_deviation_matrix_grid_box.add_items(
            self.config.calculated_power_deviation_matrix_dimensions)
        self.row += 1

        self.validate_pdm = validation.ValidatePDM(
            master, self.power_deviation_matrix_grid_box)
        self.validations.append(self.validate_datasets)
        self.validate_pdm.messageLabel.grid(row=self.row,
                                            sticky=tk.W,
                                            column=self.messageColumn)

        self.power_deviation_matrix_grid_box.onChange += self.validate_pdm.validate
Exemplo n.º 2
0
    def add_output_pdm(self, master):

        self.power_deviation_matrix_minimum_count = self.addEntry(master, "PDM Minimum Count:", validation.ValidateNonNegativeInteger(master), self.config.power_deviation_matrix_minimum_count)
        self.power_deviation_matrix_method = self.addOption(master, "PDM Method:", ["Average of Deviations", "Deviation of Averages"], self.config.power_deviation_matrix_method)

        self.addTitleRow(master, "Power Deviation Matrix Dimensions (Output):")
        self.power_deviation_matrix_grid_box = PowerDeviationMatrixGridBox(master, self, self.row, self.inputColumn)
        self.power_deviation_matrix_grid_box.add_items(self.config.calculated_power_deviation_matrix_dimensions)
        self.row += 1

        self.validate_pdm = validation.ValidatePDM(master, self.power_deviation_matrix_grid_box)
        self.validations.append(self.validate_datasets)
        self.validate_pdm.messageLabel.grid(row=self.row, sticky=tk.W, column=self.messageColumn)

        self.power_deviation_matrix_grid_box.onChange += self.validate_pdm.validate
Exemplo n.º 3
0
class AnalysisConfigurationDialog(base_dialog.BaseConfigurationDialog):
    def getInitialFileName(self):
        return "Analysis"

    def add_general(self, master, path):

        self.powerCurveMinimumCount = self.addEntry(
            master, "Power Curve Minimum Count:",
            validation.ValidatePositiveInteger(master),
            self.config.powerCurveMinimumCount)

        powerCurveModes = [
            "Specified", "AllMeasured", "InnerMeasured", "OuterMeasured"
        ]
        self.powerCurveMode = self.addOption(master,
                                             "Reference Power Curve Mode:",
                                             powerCurveModes,
                                             self.config.powerCurveMode)

        self.powerCurvePaddingMode = self.addOption(
            master, "Power Curve Padding Mode:",
            ["None", "Last Observed", "Max", "Rated"],
            self.config.powerCurvePaddingMode)

    def add_power_curve(self, master):

        self.addTitleRow(master, "Power Curve Bins:")
        self.powerCurveFirstBin = self.addEntry(
            master, "First Bin Centre:",
            validation.ValidateNonNegativeFloat(master),
            self.config.powerCurveFirstBin)
        self.powerCurveLastBin = self.addEntry(
            master, "Last Bin Centre:",
            validation.ValidateNonNegativeFloat(master),
            self.config.powerCurveLastBin)
        self.powerCurveBinSize = self.addEntry(
            master, "Bin Size:", validation.ValidatePositiveFloat(master),
            self.config.powerCurveBinSize)

    def add_datasets(self, master):

        self.dataset_grid_box = dataset.DatasetGridBox(
            master, self, self.row, self.inputColumn,
            self.config.datasets.clone())
        self.row += 1

        self.validate_datasets = validation.ValidateDatasets(
            master, self.dataset_grid_box)
        self.validations.append(self.validate_datasets)
        self.validate_datasets.messageLabel.grid(row=self.row,
                                                 sticky=tk.W,
                                                 column=self.messageColumn)

    def add_inner_range(self, master):

        self.innerRangeLowerTurbulence = self.addEntry(
            master, "Inner Range Lower Turbulence:",
            validation.ValidateNonNegativeFloat(master),
            self.config.innerRangeLowerTurbulence)
        self.innerRangeUpperTurbulence = self.addEntry(
            master, "Inner Range Upper Turbulence:",
            validation.ValidateNonNegativeFloat(master),
            self.config.innerRangeUpperTurbulence)
        self.innerRangeLowerShear = self.addEntry(
            master, "Inner Range Lower Shear:",
            validation.ValidatePositiveFloat(master),
            self.config.innerRangeLowerShear)
        self.innerRangeUpperShear = self.addEntry(
            master, "Inner Range Upper Shear:",
            validation.ValidatePositiveFloat(master),
            self.config.innerRangeUpperShear)

    def add_turbine(self, master):

        self.specifiedPowerCurve = self.addFileOpenEntry(
            master, "Specified Power Curve:",
            validation.ValidateSpecifiedPowerCurve(master,
                                                   self.powerCurveMode),
            self.config.specified_power_curve.absolute_path, self.filePath)

        self.addPowerCurveButton = tk.Button(master,
                                             text="New",
                                             command=self.NewPowerCurve,
                                             width=5,
                                             height=1)
        self.addPowerCurveButton.grid(row=(self.row - 2),
                                      sticky=tk.E + tk.N,
                                      column=self.secondButtonColumn)

        self.editPowerCurveButton = tk.Button(master,
                                              text="Edit",
                                              command=self.EditPowerCurve,
                                              width=5,
                                              height=1)
        self.editPowerCurveButton.grid(row=(self.row - 1),
                                       sticky=tk.E + tk.S,
                                       column=self.secondButtonColumn)

    def add_corrections(self, master):

        self.densityCorrectionActive = self.addCheckBox(
            master, "Density Correction Active",
            self.config.densityCorrectionActive)
        self.turbulenceCorrectionActive = self.addCheckBox(
            master, "Turbulence Correction Active",
            self.config.turbRenormActive)
        self.powerDeviationMatrixActive = self.addCheckBox(
            master, "PDM Correction Active",
            self.config.powerDeviationMatrixActive)

        self.specifiedPowerDeviationMatrix = self.addFileOpenEntry(
            master, "Specified PDM:",
            validation.ValidateSpecifiedPowerDeviationMatrix(
                master, self.powerDeviationMatrixActive),
            self.config.specified_power_deviation_matrix.absolute_path,
            self.filePath)

        self.productionByHeightActive = self.addCheckBox(
            master, "Production By Height Active",
            self.config.productionByHeightActive)

        self.web_service_active = self.addCheckBox(
            master, "Web Service Active", self.config.web_service_active)
        self.web_service_url = self.addEntry(master,
                                             "Web Service URL:",
                                             None,
                                             self.config.web_service_url,
                                             width=100)

        web_service_label = tk.Label(
            master,
            text=
            'Available substitutions are: <TurbulenceIntensity>, <NormalisedWindSpeed> & <RotorWindSpeedRatio>'
        )
        web_service_label.grid(row=self.row,
                               column=self.inputColumn,
                               columnspan=1,
                               sticky=tk.W)
        self.row += 1

        web_service_example_label = tk.Label(
            master,
            text=
            'e.g. http://www.power.com/<NormalisedWindSpeed>/<TurbulenceIntensity>'
        )
        web_service_example_label.grid(row=self.row,
                                       column=self.inputColumn,
                                       columnspan=1,
                                       sticky=tk.W)
        self.row += 1

    def add_rews(self, master):

        self.rewsCorrectionActive = self.addCheckBox(master, "REWS Active",
                                                     self.config.rewsActive)

        self.rewsVeer = self.addCheckBox(master, "REWS Veer",
                                         self.config.rewsVeer)
        self.rewsUpflow = self.addCheckBox(master, "REWS Upflow",
                                           self.config.rewsUpflow)
        self.rewsExponent = self.addEntry(
            master, "REWS Exponent:", validation.ValidatePositiveFloat(master),
            self.config.rewsExponent)

    def add_output_pdm(self, master):

        self.power_deviation_matrix_minimum_count = self.addEntry(
            master, "PDM Minimum Count:",
            validation.ValidateNonNegativeInteger(master),
            self.config.power_deviation_matrix_minimum_count)
        self.power_deviation_matrix_method = self.addOption(
            master, "PDM Method:",
            ["Average of Deviations", "Deviation of Averages"],
            self.config.power_deviation_matrix_method)

        self.addTitleRow(master, "Power Deviation Matrix Dimensions (Output):")
        self.power_deviation_matrix_grid_box = PowerDeviationMatrixGridBox(
            master, self, self.row, self.inputColumn)
        self.power_deviation_matrix_grid_box.add_items(
            self.config.calculated_power_deviation_matrix_dimensions)
        self.row += 1

        self.validate_pdm = validation.ValidatePDM(
            master, self.power_deviation_matrix_grid_box)
        self.validations.append(self.validate_datasets)
        self.validate_pdm.messageLabel.grid(row=self.row,
                                            sticky=tk.W,
                                            column=self.messageColumn)

        self.power_deviation_matrix_grid_box.onChange += self.validate_pdm.validate

    def add_advanced(self, master):

        self.interpolationMode = self.addOption(
            master, "Interpolation Mode:", ["Linear", "Cubic", "Marmander"],
            self.config.interpolationMode)

        self.negative_power_period_treatment = self.addOption(
            master, "Negative Power Period Treatment",
            self.config.get_power_treatment_options(),
            self.config.negative_power_period_treatment)
        self.negative_power_bin_average_treatment = self.addOption(
            master, "Negative Power Bin Average Treatment",
            self.config.get_power_treatment_options(),
            self.config.negative_power_bin_average_treatment)

        self.nominalWindSpeedDistribution = self.addFileOpenEntry(
            master, "Nominal Wind Speed Distribution:",
            validation.ValidateNominalWindSpeedDistribution(
                master, self.powerCurveMode),
            self.config.nominal_wind_speed_distribution.absolute_path,
            self.filePath)

    def addFormElements(self, master, path):

        nb = ttk.Notebook(master, height=400)
        nb.pressed_index = None

        general_tab = tk.Frame(nb)
        power_curve_tab = tk.Frame(nb)
        datasets_tab = tk.Frame(nb)
        inner_range_tab = tk.Frame(nb)
        turbine_tab = tk.Frame(nb)
        rews_tab = tk.Frame(nb)
        corrections_tab = tk.Frame(nb)
        output_pdm_tab = tk.Frame(nb)
        advanced_tab = tk.Frame(nb)

        nb.add(general_tab, text='General', padding=3)
        nb.add(power_curve_tab, text='Power Curve', padding=3)
        nb.add(datasets_tab, text='Datasets', padding=3)
        nb.add(turbine_tab, text='Turbine', padding=3)
        nb.add(rews_tab, text='REWS', padding=3)
        nb.add(corrections_tab, text='Corrections', padding=3)
        nb.add(inner_range_tab, text='Inner Range', padding=3)
        nb.add(output_pdm_tab, text='Output PDM', padding=3)
        nb.add(advanced_tab, text='Advanced', padding=3)

        nb.grid(row=self.row,
                sticky=tk.E + tk.W + tk.N + tk.S,
                column=self.titleColumn,
                columnspan=8)
        master.grid_rowconfigure(self.row, weight=1)
        self.row += 1

        self.add_general(general_tab, path)
        self.add_power_curve(power_curve_tab)
        self.add_datasets(datasets_tab)
        self.add_inner_range(inner_range_tab)
        self.add_turbine(turbine_tab)
        self.add_rews(rews_tab)
        self.add_corrections(corrections_tab)
        self.add_output_pdm(output_pdm_tab)
        self.add_advanced(advanced_tab)

    def EditPowerCurve(self):

        specifiedPowerCurve = self.specifiedPowerCurve.get()
        analysisPath = self.filePath.get()

        folder = os.path.dirname(os.path.abspath(analysisPath))
        path = os.path.join(folder, specifiedPowerCurve)

        if len(specifiedPowerCurve) > 0:

            try:
                config = PowerCurveConfiguration(path)
                power_curve.PowerCurveConfigurationDialog(
                    self, self.setSpecifiedPowerCurveFromPath, config)
            except Exception as e:
                ExceptionHandler.add(
                    e,
                    "ERROR loading config ({0})".format(specifiedPowerCurve))

    def NewPowerCurve(self):
        config = PowerCurveConfiguration()
        power_curve.PowerCurveConfigurationDialog(
            self, self.setSpecifiedPowerCurveFromPath, config)

    def setSpecifiedPowerCurve(self):
        preferences = Preferences.get()
        fileName = tkFileDialog.askopenfilename(
            parent=self.master,
            initialdir=preferences.power_curve_last_opened_dir(),
            defaultextension=".xml")
        self.setSpecifiedPowerCurveFromPath(fileName)

    def setSpecifiedPowerCurveFromPath(self, fileName):

        if len(fileName) > 0:

            try:
                preferences = Preferences.get()
                preferences.powerCurveLastOpened = fileName
                preferences.save()
            except Exception as e:
                ExceptionHandler.add(e, "Cannot save preferences")

            self.specifiedPowerCurve.set(fileName)

    def setConfigValues(self):

        self.config.powerCurveMinimumCount = int(
            self.powerCurveMinimumCount.get())

        self.config.negative_power_period_treatment = self.negative_power_period_treatment.get(
        )
        self.config.negative_power_bin_average_treatment = self.negative_power_bin_average_treatment.get(
        )

        self.config.interpolationMode = self.interpolationMode.get()
        self.config.powerCurveMode = self.powerCurveMode.get()
        self.config.powerCurvePaddingMode = self.powerCurvePaddingMode.get()
        self.config.nominal_wind_speed_distribution.absolute_path = self.nominalWindSpeedDistribution.get(
        )
        self.config.powerCurveFirstBin = self.powerCurveFirstBin.get()
        self.config.powerCurveLastBin = self.powerCurveLastBin.get()
        self.config.powerCurveBinSize = self.powerCurveBinSize.get()
        self.config.innerRangeLowerTurbulence = float(
            self.innerRangeLowerTurbulence.get())
        self.config.innerRangeUpperTurbulence = float(
            self.innerRangeUpperTurbulence.get())
        self.config.innerRangeLowerShear = float(
            self.innerRangeLowerShear.get())
        self.config.innerRangeUpperShear = float(
            self.innerRangeUpperShear.get())

        self.config.specified_power_curve.absolute_path = self.specifiedPowerCurve.get(
        )

        self.config.densityCorrectionActive = bool(
            self.densityCorrectionActive.get())
        self.config.turbRenormActive = bool(
            self.turbulenceCorrectionActive.get())
        self.config.productionByHeightActive = bool(
            self.productionByHeightActive.get())

        self.config.rewsActive = bool(self.rewsCorrectionActive.get())
        self.config.rewsVeer = bool(self.rewsVeer.get())
        self.config.rewsUpflow = bool(self.rewsUpflow.get())
        self.config.rewsExponent = float(self.rewsExponent.get())

        self.config.specified_power_deviation_matrix.absolute_path = self.specifiedPowerDeviationMatrix.get(
        )
        self.config.powerDeviationMatrixActive = bool(
            self.powerDeviationMatrixActive.get())

        self.dataset_grid_box.datasets_file_manager.set_base(self.config.path)
        self.config.datasets = self.dataset_grid_box.datasets_file_manager
        self.config.calculated_power_deviation_matrix_dimensions = self.power_deviation_matrix_grid_box.get_items(
        )

        self.config.power_deviation_matrix_minimum_count = int(
            self.power_deviation_matrix_minimum_count.get())
        self.config.power_deviation_matrix_method = self.power_deviation_matrix_method.get(
        )

        self.config.web_service_active = bool(self.web_service_active.get())
        self.config.web_service_url = self.web_service_url.get()
Exemplo n.º 4
0
class AnalysisConfigurationDialog(base_dialog.BaseConfigurationDialog):

    def getInitialFileName(self):
        return "Analysis"

    def add_general(self, master, path):

        self.powerCurveMinimumCount = self.addEntry(master, "Power Curve Minimum Count:", validation.ValidatePositiveInteger(master), self.config.powerCurveMinimumCount)
                
        powerCurveModes = ["Specified", "AllMeasured", "InnerMeasured", "OuterMeasured"]
        self.powerCurveMode = self.addOption(master, "Reference Power Curve Mode:", powerCurveModes, self.config.powerCurveMode)
        
        self.powerCurveExtrapolationMode = self.addOption(master, "Power Curve Extrapolation Mode:", ["None", "Last Observed", "Max", "Rated"], self.config.powerCurveExtrapolationMode)

    def add_power_curve(self, master):

        self.addTitleRow(master, "Power Curve Bins:")
        self.powerCurveFirstBin = self.addEntry(master, "First Bin Centre:", validation.ValidateNonNegativeFloat(master), self.config.powerCurveFirstBin)
        self.powerCurveLastBin = self.addEntry(master, "Last Bin Centre:", validation.ValidateNonNegativeFloat(master), self.config.powerCurveLastBin)
        self.powerCurveBinSize = self.addEntry(master, "Bin Size:", validation.ValidatePositiveFloat(master), self.config.powerCurveBinSize)
    
    def add_datasets(self, master):

        self.dataset_grid_box = dataset.DatasetGridBox(master, self, self.row, self.inputColumn, self.config.datasets.clone())
        self.row += 1
        
        self.validate_datasets = validation.ValidateDatasets(master, self.dataset_grid_box)
        self.validations.append(self.validate_datasets)
        self.validate_datasets.messageLabel.grid(row=self.row, sticky=tk.W, column=self.messageColumn)

    def add_inner_range(self, master):
        
        self.inner_range_dimensions_grid_box = InnerRangeDimensionsGridBox(master, self, self.row, self.inputColumn)
        self.inner_range_dimensions_grid_box.add_items(self.config.inner_range_dimensions)
        self.row += 1

    def add_turbine(self, master):
        
        self.specifiedPowerCurve = self.addFileOpenEntry(master, "Specified Power Curve:", validation.ValidateSpecifiedPowerCurve(master, self.powerCurveMode), self.config.specified_power_curve.absolute_path, self.filePath)

        self.addPowerCurveButton = tk.Button(master, text="New", command = self.NewPowerCurve, width=5, height=1)
        self.addPowerCurveButton.grid(row=(self.row-2), sticky=tk.E+tk.N, column=self.secondButtonColumn)
        
        self.editPowerCurveButton = tk.Button(master, text="Edit", command = self.EditPowerCurve, width=5, height=1)
        self.editPowerCurveButton.grid(row=(self.row-1), sticky=tk.E+tk.S, column=self.secondButtonColumn)

    def add_corrections(self, master):
                                        
        self.turbulenceCorrectionActive = self.addCheckBox(master,
                                                           "Turbulence Correction Active",
                                                           self.config.turbRenormActive)

        self.augment_turbulence_correction = self.addCheckBox(master,
                                                              "Augment Turbulence Correction",
                                                              self.config.augment_turbulence_correction)

        self.powerDeviationMatrixActive = self.addCheckBox(master, "PDM Correction Active", self.config.powerDeviationMatrixActive)               
        
        self.specifiedPowerDeviationMatrix = self.addFileOpenEntry(master, "Specified PDM:", validation.ValidateSpecifiedPowerDeviationMatrix(master, self.powerDeviationMatrixActive), self.config.specified_power_deviation_matrix.absolute_path, self.filePath)

        self.productionByHeightActive = self.addCheckBox(master, "Production By Height Active", self.config.productionByHeightActive)  

        self.web_service_active = self.addCheckBox(master, "Web Service Active", self.config.web_service_active)  
        self.web_service_url = self.addEntry(master, "Web Service URL:", None, self.config.web_service_url, width=100)

        web_service_label = tk.Label(master, text='Available substitutions are: <TurbulenceIntensity>, <NormalisedWindSpeed> & <RotorWindSpeedRatio>')        
        web_service_label.grid(row=self.row, column=self.inputColumn, columnspan=1,sticky=tk.W)
        self.row += 1
        
        web_service_example_label = tk.Label(master, text='e.g. http://www.power.com/<NormalisedWindSpeed>/<TurbulenceIntensity>')        
        web_service_example_label.grid(row=self.row, column=self.inputColumn, columnspan=1,sticky=tk.W)
        self.row += 1

    def add_density(self, master):
                                        
        self.densityCorrectionActive = self.addCheckBox(master, "Density Correction Active", self.config.densityCorrectionActive)

    def add_rews(self, master):
                                        
        self.rewsCorrectionActive = self.addCheckBox(master, "REWS Active", self.config.rewsActive)  

        self.rewsVeer = self.addCheckBox(master, "REWS Veer", self.config.rewsVeer)  
        self.rewsUpflow = self.addCheckBox(master, "REWS Upflow", self.config.rewsUpflow)  
        self.rewsExponent = self.addEntry(master, "REWS Exponent:", validation.ValidatePositiveFloat(master), self.config.rewsExponent)

    def add_output_pdm(self, master):

        self.power_deviation_matrix_minimum_count = self.addEntry(master, "PDM Minimum Count:", validation.ValidateNonNegativeInteger(master), self.config.power_deviation_matrix_minimum_count)
        self.power_deviation_matrix_method = self.addOption(master, "PDM Method:", ["Average of Deviations", "Deviation of Averages"], self.config.power_deviation_matrix_method)

        self.addTitleRow(master, "Power Deviation Matrix Dimensions (Output):")
        self.power_deviation_matrix_grid_box = PowerDeviationMatrixGridBox(master, self, self.row, self.inputColumn)
        self.power_deviation_matrix_grid_box.add_items(self.config.calculated_power_deviation_matrix_dimensions)
        self.row += 1

        self.validate_pdm = validation.ValidatePDM(master, self.power_deviation_matrix_grid_box)
        self.validations.append(self.validate_datasets)
        self.validate_pdm.messageLabel.grid(row=self.row, sticky=tk.W, column=self.messageColumn)

        self.power_deviation_matrix_grid_box.onChange += self.validate_pdm.validate

    def add_advanced(self, master):

        self.interpolationMode = self.addOption(master, "Interpolation Mode:", ["Linear", "Cubic Spline", "Cubic Hermite", "Marmander (Cubic Spline)", "Marmander (Cubic Hermite)"], self.config.interpolationMode)

        self.negative_power_period_treatment = self.addOption(master, "Negative Power Period Treatment", self.config.get_power_treatment_options(), self.config.negative_power_period_treatment)  
        self.negative_power_bin_average_treatment = self.addOption(master, "Negative Power Bin Average Treatment", self.config.get_power_treatment_options(), self.config.negative_power_bin_average_treatment)  
               
        self.nominalWindSpeedDistribution = self.addFileOpenEntry(master, "Nominal Wind Speed Distribution:", validation.ValidateNominalWindSpeedDistribution(master, self.powerCurveMode), self.config.nominal_wind_speed_distribution.absolute_path, self.filePath)

    def add_alternative_corrections(self, master):

        self.alternative_corrections_grid_box = AlternativeCorrectionGridBox(master, self, self.row, self.inputColumn)
        self.alternative_corrections_grid_box.add_items(self.config.alternative_corrections)
        self.row += 1

    def addFormElements(self, master, path):            

        nb = ttk.Notebook(master, height=400)
        nb.pressed_index = None
        
        general_tab = tk.Frame(nb)
        power_curve_tab = tk.Frame(nb)
        datasets_tab = tk.Frame(nb)
        inner_range_tab = tk.Frame(nb)
        density_tab = tk.Frame(nb)
        turbine_tab = tk.Frame(nb)
        rews_tab = tk.Frame(nb)
        corrections_tab = tk.Frame(nb)
        output_pdm_tab = tk.Frame(nb)
        advanced_tab = tk.Frame(nb)
        #alternative_corrections_tab = tk.Frame(nb)

        nb.add(general_tab, text='General', padding=3)
        nb.add(power_curve_tab, text='Power Curve', padding=3)
        nb.add(datasets_tab, text='Datasets', padding=3)
        nb.add(turbine_tab, text='Turbine', padding=3)
        nb.add(density_tab, text='Density', padding=3)
        nb.add(rews_tab, text='REWS', padding=3)
        nb.add(corrections_tab, text='Corrections', padding=3)
        nb.add(inner_range_tab, text='Inner Range', padding=3)
        nb.add(output_pdm_tab, text='Output PDM', padding=3)
        nb.add(advanced_tab, text='Advanced', padding=3)
        #nb.add(alternative_corrections_tab, text='Alternative Corrections', padding=3)

        nb.grid(row=self.row, sticky=tk.E+tk.W+tk.N+tk.S, column=self.titleColumn, columnspan=8)
        master.grid_rowconfigure(self.row, weight=1)
        self.row += 1
        
        self.add_general(general_tab, path)
        self.add_power_curve(power_curve_tab)
        self.add_datasets(datasets_tab)
        self.add_inner_range(inner_range_tab)
        self.add_density(density_tab)
        self.add_turbine(turbine_tab)
        self.add_rews(rews_tab)
        self.add_corrections(corrections_tab)     
        self.add_output_pdm(output_pdm_tab)                                                                                                            
        self.add_advanced(advanced_tab)
        #self.add_alternative_corrections(alternative_corrections_tab) 

    def EditPowerCurve(self):
            
        specifiedPowerCurve = self.specifiedPowerCurve.get()
        analysisPath = self.filePath.get()
        
        folder = os.path.dirname(os.path.abspath(analysisPath))
        path = os.path.join(folder, specifiedPowerCurve)
        
        if len(specifiedPowerCurve) > 0:
        
            try:
                config = PowerCurveConfiguration(path)
                power_curve.PowerCurveConfigurationDialog(self, self.setSpecifiedPowerCurveFromPath, config)
            except Exception as e:
                ExceptionHandler.add(e, "ERROR loading config ({0})".format(specifiedPowerCurve))
                    
    def NewPowerCurve(self):
        config = PowerCurveConfiguration()
        power_curve.PowerCurveConfigurationDialog(self, self.setSpecifiedPowerCurveFromPath, config)
                                                    
    def setSpecifiedPowerCurve(self):
        preferences = Preferences.get()
        fileName = tkFileDialog.askopenfilename(parent=self.master, initialdir=preferences.power_curve_last_opened_dir(), defaultextension=".xml")
        self.setSpecifiedPowerCurveFromPath(fileName)

    def setSpecifiedPowerCurveFromPath(self, fileName):
        
        if len(fileName) > 0:
            
            try:
                preferences = Preferences.get()
                preferences.powerCurveLastOpened = fileName
                preferences.save()
            except Exception as e:
                ExceptionHandler.add(e, "Cannot save preferences")

            self.specifiedPowerCurve.set(fileName)
            
    def setConfigValues(self):

        self.config.powerCurveMinimumCount = int(self.powerCurveMinimumCount.get())

        self.config.negative_power_period_treatment = self.negative_power_period_treatment.get()
        self.config.negative_power_bin_average_treatment = self.negative_power_bin_average_treatment.get()
        
        self.config.interpolationMode = self.interpolationMode.get()
        self.config.powerCurveMode = self.powerCurveMode.get()
        self.config.powerCurveExtrapolationMode = self.powerCurveExtrapolationMode.get()
        self.config.nominal_wind_speed_distribution.absolute_path = self.nominalWindSpeedDistribution.get()
        self.config.powerCurveFirstBin = self.powerCurveFirstBin.get()
        self.config.powerCurveLastBin = self.powerCurveLastBin.get()
        self.config.powerCurveBinSize = self.powerCurveBinSize.get()

        self.config.specified_power_curve.absolute_path = self.specifiedPowerCurve.get()

        self.config.densityCorrectionActive = bool(self.densityCorrectionActive.get())

        self.config.turbRenormActive = bool(self.turbulenceCorrectionActive.get())
        self.config.augment_turbulence_correction = bool(self.augment_turbulence_correction.get())

        self.config.productionByHeightActive = bool(self.productionByHeightActive.get())

        self.config.rewsActive = bool(self.rewsCorrectionActive.get())
        self.config.rewsVeer = bool(self.rewsVeer.get())
        self.config.rewsUpflow = bool(self.rewsUpflow.get())
        self.config.rewsExponent = float(self.rewsExponent.get())

        self.config.specified_power_deviation_matrix.absolute_path = self.specifiedPowerDeviationMatrix.get()
        self.config.powerDeviationMatrixActive = bool(self.powerDeviationMatrixActive.get())
        
        self.dataset_grid_box.datasets_file_manager.set_base(self.config.path)
        self.config.datasets = self.dataset_grid_box.datasets_file_manager
        self.config.calculated_power_deviation_matrix_dimensions = self.power_deviation_matrix_grid_box.get_items()
        self.config.inner_range_dimensions = self.inner_range_dimensions_grid_box.get_items()

        self.config.power_deviation_matrix_minimum_count = int(self.power_deviation_matrix_minimum_count.get())
        self.config.power_deviation_matrix_method = self.power_deviation_matrix_method.get()

        self.config.web_service_active = bool(self.web_service_active.get())
        self.config.web_service_url = self.web_service_url.get()