Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Programmverzögerung bei Objektauswahl

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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 (1338 mal gelesen)
cadplayer
Ehrenmitglied
CADniker


Sehen Sie sich das Profil von cadplayer an!   Senden Sie eine Private Message an cadplayer  Schreiben Sie einen Gästebucheintrag für cadplayer

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 09. Mai. 2017 20:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Autocad_RoadReport-master.zip

 

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 10. Mai. 2017 00:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für cadplayer 10 Unities + Antwort hilfreich

... 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


Sehen Sie sich das Profil von cadplayer an!   Senden Sie eine Private Message an cadplayer  Schreiben Sie einen Gästebucheintrag für cadplayer

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 10. Mai. 2017 07:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 10. Mai. 2017 19:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für cadplayer 10 Unities + Antwort hilfreich


COD-Autocad_RoadReport-master.zip

 
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


Sehen Sie sich das Profil von cadplayer an!   Senden Sie eine Private Message an cadplayer  Schreiben Sie einen Gästebucheintrag für cadplayer

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 10. Mai. 2017 19:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Super danke, bin gerade auf Urlaub und schaue es mir in einer Woche an.

------------------
Gruss Dirk
Blog

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Brischke
Moderator
CAD on demand GmbH




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 11. Mai. 2017 17:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für cadplayer 10 Unities + Antwort hilfreich


RoadReport.zip

 
... 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


Sehen Sie sich das Profil von cadplayer an!   Senden Sie eine Private Message an cadplayer  Schreiben Sie einen Gästebucheintrag für cadplayer

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 20. Mai. 2017 19:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 21. Mai. 2017 10:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für cadplayer 10 Unities + Antwort hilfreich

... 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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz