Hi,I am trying to execute "Find shortest path" query from WaterObjects.net. So I need to pass Start Node and Stop Node as query parameters to ExecuteDrawingQuery
I am not sure about exact meaning of the arguments which need to be passed to QueryParametr. I tried doing something as follows,
Dim QueryParameters(2) As QueryParameter QueryParameters(0) = New QueryParameter("Start Node", "1", Type.GetType("String"), Haestad.Support.Units.Unit.None, Nothing, Nothing, Nothing) QueryParameters(0).Value = "T-1" QueryParameters(1) = New QueryParameter("Stop Node", "2", Type.GetType("String"), Haestad.Support.Units.Unit.None, Nothing, Nothing, Nothing) QueryParameters(1).Value = "J-690"
Though ExecuteDrawingQuery statement executes without throwing any error, it fetches 0 IDs. How do I define the QueryParameter array?
Thanks
Hi Devashri,
There is no real significance for the typeCategory and descriptionKey use in your case. These are used in the user interface. When you run the query directly in WaterGEMS there is a dialog that opens which prompts you to select the start and end points. These properties are used in that user interface.
I am not sure why the query is returning no IDs. This is one of the reasons why I requested Jesse ask you for the model and possibly the source code if you are willing.
The query will always return pipeIds and nodeids in order. What you can do to "split" them is to loop thru the ids and determine the DomainElementTypeID and then determine if the manager's shape is Polyline (which will mean pipe). Everything else would be considered a node.
Here is an example code snippet.
HmIDCollection ids = RunQuery(); HmIDCollection pipeIDs = new HmIDCollection(); HmIDCollection nodeIDs = new HmIDCollection(); for (int i = 0; i < ids.Count; ++i) { int domainElementTypeID = DomainDataSet.DomainElementTypeID(ids[i]); IDomainElementManager domainElementManager = DomainDataSet.DomainElementManager(domainElementTypeID); DomainElementShapeType elementShapeType = domainElementManager.DomainElementType().DomainElementShapeType(); if (elementShapeType == DomainElementShapeType.Polyline) pipeIDs.Add(ids[i]); else nodeIDs.Add(ids[i]); }
I hope this helps. Feel free to ask any additional questions.
Kris
Hi Kris,
As suggested by you and Jesse, I have uploaded the model and the source code through Bentley secure file upload. Currently, In the code I have hard coded the start and stop node values as constants. And these are changed several times during trials. The file I uploaded may not have correct values, because at one point I also tried with random values to check if it throws any exception. But the query returns 0 IDs even with the correct values.
Thanks for the help regarding separating links and nodes. But I will be able to implement it only when the execute query starts working.
Thanks again.
The model and source helped quite a bit. Thank you for providing them.
The fix is simple. In your code, you use this:
Dim QueryParameters(2) As QueryParameter
Now, on the surface this may seem correct. But with VB.Net, this actually creates an array with a length of 3, not 2. This is because in VB.Net you can use an array starting at index 0 or 1.
Change the code to be:
Dim QueryParameters(1) As QueryParameter
The query will then run and return results. The logic inside the code on our end checks the length of the parameters provided. If it is not equal to 2, it returns an empty HmIDCollection. No exception is ever thrown.
I've verified locally that this change works.
Let me know if you have any other questions or problems.
p.s. I suggest moving to C#. This will avoid issues like this going forward. C# is less verbose and just as easy to learn as VB.net. I was a VBer myself for a very long time and was hesitant to switch. But in the end it is all about syntax - and behaviors like this with arrays.
Answer Verified By: Devashri Karve
Thank you so much for your prompt response, it is working fine now. I wish if WO.NET can just return a simple warning message such as "Wrong number of parameters" along with an empty HmIDCollection, in such situations :)
I will definitely follow your suggestion of using C#. Actually I have developed Modified Hazen-Williams tool in C# only.
Please tell me how to execute predefined query DrawingQuery.FindAdjacentStartNodes (and other Find__ type queries and PathToNearest____ type queries) which needs an already selected element when we run it in WaterGEMS. How to select an element in WO.NET or do we need to pass the element id as query parameter? (If so, what is the name of this parameter in each of the queries?). Even if selecting an element is not needed to execute these queries, it will be interesting to know, how element/elements is/are selected in WO.NET?
You had asked me for any new sample ideas, but it is my humble request that if Bentley can make the programming guide more extensive over time, it will really help to make the tool development faster. The problem is not about asking a stupid question, but it is really frustrating when one has to struggle for help, post the doubt on forum and then because of the difference in time zones, wait for the response. As a software developer, you can understand that it hampers the entire thought process. Please don't get me wrong. I really appreciative prompt help from your side.
Thanks & Regards
Kris Culin, Can you please help me on this issue?