Jump to content

gmd

Mitglieder
  • Gesamte Inhalte

    509
  • Benutzer seit

  • Letzter Besuch

4 User folgen diesem Benutzer

Letzte Besucher des Profils

4223 Profilaufrufe
  1. Neo, danke, wie sieht das mit den return werten aus, ich nehme an die kommen als json zurueck und in der reihenfolge der kommandos, correct ? Werde das ausprobieren. Ich bin nicht mehr weit davon entfernt die blockstrukturen automatisch zu erkennen und alle benoetigten steuereinrichtungen automatisch zu plazieren. Werde weiter berichten, koennte ein plugin daraus werden. Auslesen des gleisplans mit allen informationen und zeichnen des plans in rund 30 sekunden, da sind noch einige einzelaufrufe drin. Habe noch keine zeiten fuer die plazierung von signalen und kontakten. Ich muss noch scripte bauen fuer die objektverknuepfungen. Aber alles in allem geht es vorran. Habe auch schon mit ueber 10,000 gleisen getestet, welches der ausloeser war zu optimieren wo ich konnte. Das beispiel oben hat 750 gleiselemente, ist also vergleichsweise klein. Sagen wir mal eine rohanlage mit 2000 gleiselementen mit allen signalen und kontakten zu versehen und die signifikanten gleise alle mit blockkennungen versehen in unter 3 minuten, das waere so mein naechstes ziel. Gruss Gmd
  2. Neo, Ich bleibe mal bei diesem thread mit den rueckmeldungen bezueglich der neuen schnittstelle. Ein ganz wesentliches problem, abgesehen von einzelnen funktionen, ist die performance beim anlysieren von gleisplaenen und orgnisieren groesserer objektmengen, bedingt durch die abwesenheit der kommandogruppen. Ich kann natuerlich alle kommandos einzeln schicken, es funktioniert grundsaetzlich, aber der unterschied ist faktor 100 in der laufzeit. Ich habe limits festgestellt in der anzahl der kommandos pro gruppe abhaengig vom typ des kommandos und habe empirisch zuverlaessige werte ermittelt. Zum beispiel um fuer 500 objekte die koordinaten zu lesen brauche ich im gruppenmodus 103ms, transformationen lese ich in batches von 200, ebenenfalls um die 100ms. Das sind zeiten, die ich mit einzelkommandos niemals erreiche. Und das wird sich auch auf die steuerung auswirken, wenn eine entsprechende anzahl von operationen auszufuehren ist. Derzeit werde ich nur diejenigen funktionen umstellen die nicht zeitkritisch sind und die neue schnittstelle lediglich fuer scripte verwenden. Auch die verarbeitung von events ist durch das Json format langsamer geworden, wir reden hier zwar nur um wenige milisekunden, aber das addiert sich natuerlich bei tausenden von events. Meine app laeuft jetzt multicore und ich versuche zu optimieren wo ich kann. Eine weitere funktion, die ich vermisse, ist lesen objektypen, also die moeglichkeit alle gleise zu lesen und nicht nur uber die selektion. Die alte schnittstelle sendet zwar viele objekte die nicht typ 1 sind auch wenn ich nur nach typ 1 frage, und hat auch fehler bei denen falsche typen zurueckgegeben werden, aber das filtern ist immer noch schneller als bei einer gesamtselektion, da die anzahl der gleise in der regel deutlich geringer ist als die anzahl der nicht gleise. Es stellt sich halt die frage, wie du die verwendung der schnittstelle in zukunft wirklich siehst. Fuer mich ist die alte schnittstelle in vieler hinsicht einfach besser, und wie erwaehnt, das senden von scripten ist eine gute sache. Ich sehe die neue schnittstelle nicht wirklich als realzeitsteuerung fuer groessere anlagen. Die voraussetzung dafuer sind einfach kommandogruppen. Du wirst moeglicherweise auf die verwendung von scripten hinweisen, die zur laufzeit als eine art kommandogruppe verwendet werden koennen, und ich werde auch ausprobieren wo da die grenzen sind, fuer die kontruktionsphase ist die alte schnittstelle jedenfalls noch nicht ersetzbar. Du koenntest zum beispiel {"jsonrpc": "2.0", "method": "editor.getEntityContentID", "params": {"_class": "entity", "name": "BD_W3-E"}, "params": {"_class": "entity", "name": "BD-AG-B07"}, "id": 1} verarbeiten, wie bei gruppierung usw. Das kommando wird nicht zurueckgewiesen, liefert aber nur eine guid, was ja nicht ueberrascht, wenn man den namen der funktion betrachtet. In summe, mit alter und neuer schnittstelle habe ich alle funktionen, die ich fuer meine app brauche. Ich erwarte auch nicht dass du wegen mir funktionen einbaust, die nicht deinem langfrisitigen konzept entsprechen, aber wie schon gesagt, es kommt letztlich darauf an wozu die schnittstelle gut sein soll. Jedefalls bin ich dankbar, dass du die alte schnittstelle nicht gleich ersetzt hast, sondern dass ich beide parallel nutzen kann in der V9. Gruss Gmd
  3. Es hat mich einfach mal interessiert ob ich vielleicht rocrail format benutzen kann um meine gleisplaene zu speichern, habe allerdings festgestellt dass das nicht viel bringt. Rocrail hat einen grundsaetzlichen designfehler in der datenstruktur und zwar sind layout und controllinformationen vermischt . Ich koennte einen gleisplan vom MBS exportieren und in Rocrail einlesen, aber ohne jeglichen weitern informationen und dabei gewinnt man nicht wirklich viel. Layout muss reduziert werden, bloecke definiert usw. . Man muesste fahrstrasseninformationen aus dem Mbs in rocrail kontrollstrukturen umwandeln und da fragt man sich dann warum .. Mbs ist wesentlich flexibler und hat ein GBS und Rocrail hat einfach eine andere zielsetzung und ursprung und meiner meinung nach ist es einfach voellig veraltet und ein undurchsichtiges sammelsurium von funktionen geworden im laufe der zeit. Jedenfalls sieht das fuer mich so aus, und was mich am meisten stoert ist dass es so wenig intuitiv ist. Man kann nicht viel sinnvolles tun ohne dokumentation zu lesen, und das stoert mich nun mal unendlich. Sorry for the rant.. Gruss Gmd
  4. Neo, du hast mich mal gefragt was mir an der neuen schnittstelle fehlt und ich war noch nicht vollstaendig im bilde. Das bin ich zwar immer noch nicht , aber zumindest kann ich jetzt eine funktion nennen die mir in der neuen schnittstelle fehlt. 303;name;0;1 also extended geometrie mit allen segmenten aus der alten schnittstelle. Warum ? : wenn man ein Katalogkleis mit dem editor verbiegt und verlaengert, verkuerzt, etc. dann kann man das nicht erkennen. Ich kann keine flexibel verlegten gleise erkennen (selbe guid wie original, und auch nicht anders gekennzeichnet). Das ist fatal fuer meine blockerkennung und auch die plazierung von steuerobjekten, da kein durchgaengiger gleisplan errechnet werden kann. Damit wuerde mein konzept so wie die schnittstelle jetzt ausgelegt ist nicht mehr funktionieren, da luecken im gleisplan entstehen oder jegliche abweichung vom standardgleis vermieden wird, und das ist theorie. Weiterhin, und das ist halt eine schoenheitssache und nicht existentiell, waere es schoen bei erzeuge objekt auch eine variation angeben zu koennen. Mein programm kennt alle variationen und wenn du diese funktion implementierst, mache ich ein plugin mit dem man variationen eines modells zur auswahl auf dem board positionieren kann und nicht einzeln durchgehen muss. Wenn man natuerlich nocht die anzahl von variationen abfragen kann waere das noch besser. Gruss gmd
  5. Das ist nun wirklich elegant, very nice. Gruss Gmd
  6. Was mir noch dazu einfaellt ist, dass Neo ein feature einbauen koennte mit dem man die manuelle bedienung von weichen, signalen etc unterbinden kann, fuer einzelne objekte, gruppen, schlagworte oder alle eines typs (entweder Guid oder sammelbegriff wie Signale,Weichen etc. Damit kann man dann ungewuenschte oder zufaellige eingriffe verhindern. Ist im grunde das was auch meine steuerung tut. gruss Gmd
  7. Was ich tue sollte Neo ueberhaupt nicht beeinflussen in seiner entwicklungsrichtung, zumindest fuer einige zeit. Was ich tue ist "einfach" ein riesiges plugin und eine experimentelle entwicklung. Weder wird es die kosten des MBS erhoehen noch verringern. Wenn durch dies entwicklung und die diskussionen ideen entstehen die unmittelbar fuer das Mbs nuetzlich sind, kann und wird Neo diese aufgreifen und umsetzen. Wird am ende meine vision wahr, wird das werbung fuer das MBS sein und ein modul welches kostenfrei von jedem verwendet werden kann, falls es jemals dazu kommt das ganze installierbar zu machen und mit weniger resourcen auszukommen als bisher. Fuer jetzt ist das ein versuch und wer moechte kann daran teilnehmen, die source ist offen. Ich hoffe ich habe das verstaendlich formuliert. Gruss Gmd
  8. Wicked, hatte ich noch nicht wirklich bewusst gesehen. Das spart coding .. muss ich mal weiter drueber nachdenken. Danke Gmd
  9. ich sehe da keine endloschleife und das von meinem logger ueber die neue schnittstelle gruss Gmd
  10. "Nur eigenen Code ist aktiviert." Die Option "Just My Code" (Nur eigenen Code debuggen) ist in Visual Studio aktiviert. Dadurch werden externe Bibliotheken wie Newtonsoft.Json ignoriert, und man kann nicht hineinspringen. Das is nur eine warnung dass du das nicht debuggen kannst, wird aber die funktion nicht beeinflussen. Du kannst die source laden zum debuggen, brauchst du aber nicht wirklich, das VS auf decompiled falls noetig. Tools - Options -> Debugging deselect Enable Just My Code warning is ticked, deswegen bekommst du die meldung. Gruss Gmd PS: wir koennen gerne per email oder auch whatsapp communizieren wenn du willst, kein problem, dann belasten wir das forum nicht mit diesen dingen
  11. Ich kann dir auch mal die source files schicken, wenn das einfacher ist. Gruss Gmd in meinem logger sieht man die umlaute encoded, und wenn sie dann umgewandelt sind Ich kann die events zerlegen und in eine freundlcihere darstellung umwandeln und die entities extrahieren und filtern usw. Wenn du interesse hast schicke ich dir das gerne .. sollte sich leicht transferieren lassen gruss Gmd
  12. Das ist noch wichtig fuer die deserialisation Das sind meine custom classes die du im obigen code verwendet siehst namespace NLua_Integration.Json_Classes { [JsonConverter(typeof(JsonRpcMessageConverter))] public class JsonRpcMessage { [JsonProperty("jsonrpc")] public string JsonRpc { get; set; } = "2.0"; [JsonProperty("method")] public string Method { get; set; } [JsonProperty("params")] public string Params { get; set; } // Lua script or other parameters [JsonProperty("id")] public int Id { get; set; } } public class JsonRpcResponse { [JsonProperty("jsonrpc")] public string JsonRpc { get; set; } [JsonProperty("result")] public object Result { get; set; } // Success result [JsonProperty("error")] public JsonRpcError Error { get; set; } // Error details [JsonProperty("id")] public int? Id { get; set; } // Nullable to handle 'null' in the response } public class JsonRpcError { [JsonProperty("code")] public int Code { get; set; } [JsonProperty("message")] public string Message { get; set; } [JsonProperty("data")] public object Data { get; set; } // Optional additional data } } public class JsonRpcMessageConverter : JsonConverter<JsonRpcMessage> { public override void WriteJson(JsonWriter writer, JsonRpcMessage value, JsonSerializer serializer) { writer.WriteStartObject(); // Write jsonrpc writer.WritePropertyName("jsonrpc"); writer.WriteValue(value.JsonRpc); // Write method writer.WritePropertyName("method"); writer.WriteValue(value.Method); // Write params (ensure no extra escaping) writer.WritePropertyName("params"); writer.WriteValue(value.Params); // Ensure proper escaping for the Lua script // Write id writer.WritePropertyName("id"); writer.WriteValue(value.Id); writer.WriteEndObject(); } public override JsonRpcMessage ReadJson(JsonReader reader, Type objectType, JsonRpcMessage existingValue, bool hasExistingValue, JsonSerializer serializer) { // Implement if deserialization is needed throw new NotImplementedException(); } }
  13. Mein response string Name Value Type responseJson "{\"jsonrpc\":\"2.0\",\"result\":[{\"_class\":\"entity\",\"name\":\"Qu\\u00E4s\\u00DFter\"}],\"id\":1}" string genau wie bei dir, das ist das rohformat und ich mache das var response = JsonConvert.DeserializeObject<JsonRpcResponse>(responseJson); if (response != null) { if (response.Error != null) { ResultMessage = $"Error: {response.Error.Message} (Code: {response.Error.Code})\nRaw Response:\n{responseJson}"; } else if (response.Result == null) { ResultMessage = $"Script executed successfully with no return value.\nRaw Response:\n{responseJson}"; } else { ResultMessage = $"Response: {response.Result}\nRaw Response:\n{responseJson}"; } } else { ResultMessage = $"Failed to parse server response.\nRaw Response:\n{responseJson}"; } $"{response.Result}" gibt den richtigen string mit umlauten gruss Gmd Edit: Bevor du fragst welche Library - using Newtonsoft.Json;
  14. Probier einfach mal Latin1 statt UTF8, just for fun Gruss Gmd
  15. alte schnittstelle .. als selektion eingelesen und hier ueber die neue das ist mit meiner app gemacht .. muss ich genauer untersuchen was bei dir daneben gehen koennte aber erst morgen gruss Gmd
×
×
  • Neu erstellen...