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; }