This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Running Hammer with WaterObjects.NET

Hello There,

I am using WaterObjects.NET to automate Hammer for sensitivity and calibration purpose. I can open the project, get/set pipe parameters, but get stuck in running Hammer engine.

My questions are:
1 Is it possible to run epanet (as show in RunEpaNet(...)) with only Hammer license? We only have Hammer license.
2 I have to call the project.Save(property); to save my edits, eg pipe diameter and wave speed, is my way of generating ProjectProperty correct?
3 When i come toline hammerEngine.Run(domainDataSet.ScenarioManager.Elements()); I always get error NullReference. After I call SetUnitReference(project.NumericPresentationManager), the NullReference error was gone, but get another error msg (please note I can see the scenarios running window): "The process cannot access the file 'C:\\Users\\hshen\\AppData\\Local\\Temp\\Bentley\\HAMMER\\test PRV.wtg.6.$$$_1_1.hof' because it is being used by another process."

Thanks for the help,

Hailiang

Here are my codes:

private const string VERSION = "08.11.05.61";

        public Form1()
        {
            InitializeComponent();
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            //RunEpaNet();

            #region Open a wtg project

            IProjectApplicationModel aprojectApplicationModel = (IProjectApplicationModel)new Haestad.Toronto.Application.TorontoApplicationModel(LicensePlatformType.Standalone, VERSION, new string[] { });

            Haestad.Toronto.Application.TorontoParentFormModel parentFormModel = new Haestad.Toronto.Application.TorontoParentFormModel(aprojectApplicationModel);
            Haestad.Toronto.Application.TorontoParentFormUIModel parentFormUIModel = new Haestad.Toronto.Application.TorontoParentFormUIModel(parentFormModel);
            parentFormUIModel.InitializeOnStartUp();

            // opem hammer project
            bool sucess = parentFormUIModel.OpenFileWithSpecifiedExtension(txtInput.Text, false);
            if (sucess)
            {
                Haestad.Toronto.Application.TorontoProject project = parentFormModel.CurrentProject as Haestad.Toronto.Application.TorontoProject;
                Haestad.HAMMER.TransientResultsViewer.Domain.TransientResultsProjectContext projectContext = new Haestad.HAMMER.TransientResultsViewer.Domain.TransientResultsProjectContext(
                    project.ProjectManager, project.TransientResultsViewerProfileElementManager, project.TransientResultsViewerTimeHistoryElementManager, project.TransientResultsViewerNodeHistoryElementManager);

                Haestad.Framework.Application.ProjectProperties property = Haestad.Framework.Application.ProjectProperties.DefaultNominalProjectPath(txtInput.Text);
               
                Haestad.Domain.ModelingObjects.Water.IdahoDomainDataSet domainDataSet = project.IdahoDomainDataSet;
                this.RunScenarios(project);

                project.Save(property);
            }

            #endregion
        }

        private void RunEpaNet(string inp = @"C:\Program Files (x86)\EPANET2\Examples\Net3.inp")
        {
            // using Haestad.Calculations.Pressure.NumericalEngine.EngineAdapter will not work for the license limit.
            Haestad.Calculations.Pressure.NumericalEngine.EngineAdapter adapter = new Haestad.Calculations.Pressure.NumericalEngine.EngineAdapter();
            adapter.SetLicensingInfo(this.RetrieveLicense());
            adapter.Open(inp, "", "");
            adapter.OpenHydraulicEngine();
            adapter.InitializeHydraulicEngine(true);
        }

        private void RunScenarios(Haestad.Toronto.Application.TorontoProject project)
        {
            try
            {
                // run all scenarios at first
                Haestad.Domain.ModelingObjects.Water.IdahoDomainDataSet domainDataSet = project.IdahoDomainDataSet;
                Haestad.Calculations.Hammer.Domain.HammerNumericalEngine hammerEngine =
                    (Haestad.Calculations.Hammer.Domain.HammerNumericalEngine)domainDataSet.NumericalEngine(Haestad.Domain.StandardCalculationOptionFieldName.HammerNumericalEngine);

                //Haestad.Calculations.Hammer.Domain.HammerNumericalEngine hammerEngine = new Haestad.Calculations.Hammer.Domain.HammerNumericalEngine(domainDataSet, Haestad.Domain.StandardCalculationOptionFieldName.HammerNumericalEngine);

                hammerEngine.SetUnitReference(project.NumericPresentationManager);
                hammerEngine.SetLicensingInfo(this.RetrieveLicense());
                hammerEngine.ComputeInitialConditionsSetting = Haestad.Calculations.Hammer.Domain.ComputeInitialConditionSetting.AlwaysCompute;

                Haestad.Domain.ModelingElementCollection modelingElementCollection = new Haestad.Domain.ModelingElementCollection();
                modelingElementCollection.Add(domainDataSet.ScenarioManager.Element(1));
                if (!hammerEngine.IsRunning(1))
                {
                    hammerEngine.Run(modelingElementCollection);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private Haestad.Support.Support.HmIDCollection GetScenarioIds(Haestad.Domain.ModelingObjects.Water.IdahoDomainDataSet domainDataSet)
        {
            return domainDataSet.ScenarioManager.ElementIDs();
        }

        private Haestad.LicensingFacade.License RetrieveLicense()
        {
            // is relevant to an engine, not specific to a project. A project may require multiple licenses, eg hammer requires both epanet and hammer
            ProductRelease release = new ProductRelease(ProductId.Bentley_HAMMER, VERSION);
            Haestad.LicensingFacade.License license = Haestad.LicensingFacade.License.Default(release);
            license.StartDesktop(true);
            return license;
        }