| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Programmverzögerung bei Objektauswahl (1337 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 09. Mai. 2017 20:59 <-- editieren / zitieren --> Unities abgeben:
Hallo! über diesen Dialog habe ich die Möglichkeit Autocad objekte zu wählen und mir deren Eigenschaften in einer Datentabelle anzeigen zu lassen. Da es durchaus mehrere tausend Objekte sein können, die gewählt werden, kommt es zu Programmverzögerungen. Gibt es eine Möglichkeit das zu umgehen z.B. mit asynchroner Programmierung (ich habe damit wenig Erfahrung) ? Den Programcode könnt ihr in der zip anschauen: Zum starten mit netload: RoadReport.dll wählen und Befehl xx eingeben, dann wird der Dialog wie oben angezeigt. ------------------ Gruss Dirk Blog
[Diese Nachricht wurde von cadplayer am 09. Mai. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 10. Mai. 2017 00:27 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... habe mir den Code nur im Browser angesehen, aber da ist mir aufgefallen, dass du Linq nicht anwendest. Die konsequente Anwendung von anonymen Linq-Funktionen beschleunigt das extrem. Ein Bsp aus meinem aktuellen Projekt: Datenbank auslesen und Objektmodell daraus aufbauen, ca 250.000 Datensätze in ca 10 Tabellen: Mit For ... each: >7min Unter anderem mit *.Any reduziert auf ca 15 sec Wenn du 'nur' von ein paar 1000 Objekten sprichst, dann sollte das ohne nennenswerte Verzögerungen durchrennen. Das Aufbauen der Datatable kannst du dir sparen, wenn du auf WPF/XAML wechselst. Das würde die Anzeige des Ergebnis weiter beschleunigen. Du erstellst dir eine Klasse, in der die Spalten der DataTable als Eigenschaften vorhanden sind. Die Polylines nimmst du als Parameter im Konstruktor und füllst die Eigenschaften. Alle diese so erstellten Objekte sammelst du in einer List<Object> und bindest diese Liste an ein DataGrid. Für die Anzeige der Daten sind das 2 Zeilen Code, nur wenn's schön sein soll, wird's mehr. Ich kann's dir wirklich nur empfehlen: Erstelle dir eigene Klassen, in die die AUTOCAD-Entities einmalig auswertest, und dann ausschließlich mit DataBinding und WPF arbeitest. In diesem Grundgerüst konsequent mit Linq arbeiten und du hast eine ordentliche Performance. Das parallele / asynchrone Ausführen mache ich auch, aber es ist immer nur sehr gut durchdacht einzusetzen, da der Objektzugriff womöglich gesperrt oder noch das Objekt beim Zugriff keine aktuellen Daten hat. Dafür bedarf es auch bei kleinen Anwendungsfällen immer einem Konzept, sonst debuggt man sich die Finger wund bei der Fehlersuche. Noch ein Hinweis: anonyme Linq-Funktionen lassen sich erst mit VS2015 gut debuggen. Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 10. Mai. 2017 07:11 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger! Danke für deine schnelle Rückmeldung, kannst du mir ein Beispiel geben, wo es sinnvoll ist Linq einzusetzen.
Zitat: Du erstellst dir eine Klasse, in der die Spalten der DataTable als Eigenschaften vorhanden sind. Die Polylines nimmst du als Parameter im Konstruktor und füllst die Eigenschaften. Alle diese so erstellten Objekte sammelst du in einer List<Object> und bindest diese Liste an ein DataGrid.
In meinem Code kannst du vielleicht die Klasse angeben, die besser mit Linq verarbeitet werden kann. Ich vermute, dass die Klasse cSelection verbesserungswürdig ist ? Ist nicht das Problem für die Verzögerung, dass die Datensätze nicht schnell genung in die Datentabelle übertragen werden ? Erzeugt werden sie doch schnell genug oder? Ja mit WPF/XAML sollte ich mich schleunigst beschäftigen, dazu bin ich leider noch nicht gekommen (aus Zeitgründen - vielleicht ist der Einstieg gar nicht so schwer?) ------------------ Gruss Dirk Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 10. Mai. 2017 19:20 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: ... kannst du mir ein Beispiel geben, wo es sinnvoll ist Linq einzusetzen. ...
Beispiel ist anbei, ich habe mal im Ansatz meine Art zu strukturieren (auf die Schnelle) eingebaut. (deinen alten Befehl habe ich verändert aber nicht getestet, da ich dann die Panel-Lösung für sinnvoller erachtet habe. Also nicht dein Projekt mit meinem ersetzen!!! Du hast jetzt einen neuen Befehl: mReport der öffnet ein Panel ohne Daten. Die Daten kannst du dann via Aktualisieren-Button einfügen. per Doppelklick auf die markierte Zeile Zoomt wird auf das Objekt gezoomt. Zitat: Original erstellt von cadplayer: ... Ja mit WPF/XAML sollte ich mich schleunigst beschäftigen, dazu bin ich leider noch nicht gekommen (aus Zeitgründen - vielleicht ist der Einstieg gar nicht so schwer?)
Ich will dir deine Hoffnungen nicht nehmen, meiner Meinung nach ist der Einstieg nicht so leicht. Voraussetzung ist allerdings, dass Denken in Objekten konsequent auch im Code umzusetzen. In dem Code-Beispiel müsste man, wenn man es denn bis in's Letzte durchzieht, auch die Events (Refresh und Doppelclick) variabel halten. Dann kannst du diesen einfachen Dialog für alles mögliche verwenden. Du bindest einfach den DataContext an die Objektliste (im Beispiel: Datas) und der Tabellenaufbau passt sich dynamisch an, je nachdem, was man eben für Daten bindet. Zum Verständnis: Das originale AutoCAD-Eigenschaftenfenster arbeitet genau so, Bei Kreisen werden andere Eigenschaften angezeigt als bei Linien - Ein Dialog, in dem nur die Anzeigelogik festgelegt ist, den Inhalt bringen die Objekte mit. Fazit: auch Steuerelemente können als Bibliothek abgespeichert und immer wieder verwendet werden. Vielleicht alles ein wenig viel ... aber es lohnt sich, die Zeit zu investieren. <EDIT> Habe die Anzeige des Typen nicht eingebaut. Soll das rein, dann im Data-Object die Eigenschaft public string Typ { get; set; } einfügen. und im Constructor die Zeile (unter oder über Layer=... Typ = _ent.GetType().Name; ergänzen. </Edit> Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 10. Mai. 2017 19:58 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 11. Mai. 2017 17:07 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... anbei eine neue Projektversion, in der ich die Struktur von meiner Standardstruktur abgeleitet habe. Hier nur mit Abstrichen zum Inhalt bzw. Umfang. Es kann sein, dass dir beim Anschauen/Nachvollziehen die sehr kleinteilige Struktur und wirr und daher eben auch unnötig erscheint. Ist es in Teilen auch, aber nur, wenn man ein einziges Projekt hat. Hat man mehrere Projekte, dann kann man dieses Projekt (natürlich um die tatsächlichen FunktionsInhalte bereinigt) hernehmen/kopieren und mit Suchen&Ersetzen den Namespace ändern, die Projekteigenschaften entsprechend anpassen und schon kann man sich direkt der eigentlichen Aufgabe zuwenden. Die Dateien in den Projektordnern "_AssemblyInfo" und "_Extensions" habe ich bei mir auch nicht fest in das Projekt eingebunden sondern nur verlinkt, so dass Routinen, die ich immer wieder benötige automatisch in allen alten und auch neuen Projekten, die auf o.g. Weise entstehen, vorhanden sind. Der Funktionsbibliotheksgedanke wird auf diesem Weg der Projektstrukturierung sehr leicht umsetzbar. Mit eigenen DLL-Funktionsbibliotheken, was der saubere Weg wäre, kann man in AutoCAD nicht arbeiten. Weil die AutoCAD-DLLs nicht signiert sind können die darauf basierten Funktionsbibliotheken ebenfalls nicht signiert werden. Die Signatur ist allerdings notwendig, wenn man eigene Bibliotheken im GAC (Global Assembly Cache) registrieren wollte. Im GAC ist das vorhalten verschiedener Versionsstände möglich, die logischerweise entstehen, wenn man seine eigenen Standard-Routinen erweitert. Blöd, aber nicht zu ändern. Egal, es ist wie es ist. Mit der Beispiel-Struktur kann man nahezu wie in Lisp gleich losprogrammieren, ohne den Overhead-Aufwand, der sonst immer notwendig wäre. So denn, dir nun viel Spaß beim Erfassen und Begreifen! Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 20. Mai. 2017 19:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger! Danke für deine Umsetzung - der Aufbau wie du die Daten in eine generische Liste lädst ist ungefähr gleich ausgearbeitet, wie in meinem Ansatz. Wonach ich in deinem Code noch suche, wie die ausgelesenen Daten an das Panel übergeben werden. Ist das vielleicht der Kern, warum dein Code schnelle Daten auswirft als meiner ? Ansonsten super gemacht, danke ich habe durchaus viele andere Kniffe bei dir entdeckt. Ich vermute hier findet bei deinem Code eine schnellere übertragung der Daten statt
Code: static void CurrentControl_OnRefreshClick(object sender, Report.RefreshClickEventArgs e) { CurrentControl.DataContext = new Objects.Datas(); }
Sind das vielleicht die Vorzüge von WPF anwendungen ? Schau mal ich habe meinen Code in Version1 und deinen in Version2 auf github gelegt Github ------------------ Gruss Dirk Blog
[Diese Nachricht wurde von cadplayer am 20. Mai. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 21. Mai. 2017 10:18 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... stimmt. Das ist aber ein Zusammenspiel aus der xaml-Datei und dem, was man in den DataContext "schickt". Der DataContext wird in der xaml mit {Binding ...} angesprochen. Im xaml legt man nur die Anzeigelogik fest. Über die Datenbindung, Binding, wird dann erst bestimmt, was angezeigt wird. Dazu bindet man das Steuerelement an ein Objekt. Das kann sonstwie gestaltet sein, da man beim Binding innerhalb der xaml auch auf bestimmte Eigenschaften des Objekts, welches an das Steuerelement gebunden ist, zugreifen kann. Dieses, vollständig objekterientierte, Vorgehen, macht den Code extrem kurz, flexibel und eben auch extrem schnell. Das wirklich geniale an dieser Art der Programmierung ist allerdings, dass man sich um Anzeige der Änerungen eines gebundenen Objekts selbst nicht kümmern muss, da diese wpf-seitig automatisch getriggert werden und im Dialog immer aktuell angezeigt werden. Das ganze zu durchschauen, und zu wissen, welche Objekte man wofür verwendet, ist am Anfang sehr schwierig, da gehen Stunden und Tage drauf, bis man das wirklich verstanden hat. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|