| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Anwendung langsam (1162 mal gelesen)
|
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 04. Jul. 2014 17:48 <-- editieren / zitieren --> Unities abgeben:
Hallo, Haber schon längerem eine Anwendung in VB.net geschrieben und lief auch sehr gut. Aber mit ACad 2015 merke ich eine erhebliche Verlangsamung der Anwendung. Was für einen Grund kann dies haben. Danke Johann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 04. Jul. 2014 19:07 <-- editieren / zitieren --> Unities abgeben: Nur für DrCNC
Du könntest ja schon selbst mal nachsehen in welchem Part es lahmt und dann hier angeben. Welche Vorgänge werden abgearbeitet? Die Info 2013-2015 ist schon arg allgemein. Hast du die Möglichkeit 2013 noch zu testen oder steht das nicht mehr zur Verfügung? ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 05. Jul. 2014 12:14 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich habe mir das nocheinmal näher angeschaut. Es kommen häufig Abfragen auf die geöffnete ACad Datei mit den beiden Funktionen. Code:
Public Function LayerAbfrage(ByVal LayerName As String) Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim TrAct As DatabaseServices.Transaction = Nothing Dim tAcadDoc As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() Dim acLyrTbl As LayerTable acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead) If Not acLyrTbl.Has(LayerName) Then LayerAbfrage = 0 Else Dim tSelSet As EditorInput.SelectionSet = getObjectsOnLayer(tAcadDoc.Editor, TrAct, LayerName) If tSelSet IsNot Nothing Then LayerAbfrage = 1 Else LayerAbfrage = 0 End If End If End Using End Function Public Function Blockabfrage(ByVal strBlockName As String) Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim TrAct As DatabaseServices.Transaction = Nothing Dim tAcadDoc As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() Dim acLyrTbl As BlockTable acLyrTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) If Not acLyrTbl.Has(strBlockName) Then Blockabfrage = 0 Else Dim tSelSet As EditorInput.SelectionSet = getObjectsOnBlock(tAcadDoc.Editor, TrAct, strBlockName) If tSelSet IsNot Nothing Then Blockabfrage = 1 Else Blockabfrage = 0 End If End If End Using End Function
Alles andere ist eigentlich nur Textlesen und Textschreiben in einer bestimmten Reihenfolge (für eine CNC-Maschine). Bis ACad 2013 ca. 8 sec., bei Acad 2015 15 sec. Danke mfg Johann
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 06. Jul. 2014 23:12 <-- editieren / zitieren --> Unities abgeben: Nur für DrCNC
Wäre jetzt interessant zu wissen, was sich hinter " getObjectsOnLayer" und " getObjectsOnBlock" verbirgt bzw. wozu diese Abläufe notwendig sind. Wozu werden Objekte auf Layer und Objekte "auf"(?) Block gebraucht. Und wenn dieses mit SelectionSets gebaut wird, dann können Geschwindigkeitsunterschiede vielleicht sogar mit Zoom-Ausschnitt und/oder mit der Graphikhardware und -treibern zu tun haben. Mit dem Code hier kann ich mal nicht erkennen, was unterschiedlich sein sollte, aber eben auch nicht probieren, ob es bei mir auch Unterschiede in der Performance zeigen würde. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 07. Jul. 2014 10:04 <-- editieren / zitieren --> Unities abgeben:
|
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 07. Jul. 2014 14:52 <-- editieren / zitieren --> Unities abgeben: Nur für DrCNC
Zitat: Mit diesen beiden Funktionen werden nur Layer bzw. Blöcke mit einen bestimmten Namen gesucht. Wenn diese dan vorhanden sind ...
Versteh ich leider nicht, wozu dann ein SelectionSet notwenig wird, wenn gesucht werden soll, ob ein Layer existiert. Probier mal einen Performance-Vergleich ohne SelectionSet-Bildung. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlovac Mitglied
Beiträge: 54 Registriert: 12.09.2013 AutoCAD Mechanical 2012-2015 Windows 7 Enterprise X64 Visual Studio 2010/2013 Intel Xeon W3680 Nvidia Quadro 2000 16 GB RAM
|
erstellt am: 08. Jul. 2014 08:40 <-- editieren / zitieren --> Unities abgeben: Nur für DrCNC
|
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 08. Jul. 2014 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für DrCNC
Zitat: wenn es darum geht alle Objekte eines bestimmten Layers abzufragen
Dann hoffe ich nicht, dass man eine Schleife durch alle Layer macht und bei jedem Layer ein neues SelectionSet. Das wäre gähnend langsam. Dann alle Objekte auf einmal selektieren und deren Layer ansehen/zählen. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 08. Jul. 2014 14:35 <-- editieren / zitieren --> Unities abgeben:
Hallo, Habe die beiden Funktionen umgeändert; Code:
Public Function Blockabfrage(ByVal strBlockName As String) Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim TrAct As DatabaseServices.Transaction = Nothing Dim tAcadDoc As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() Dim acLyrTbl As BlockTable acLyrTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) If Not acLyrTbl.Has(strBlockName) Then Blockabfrage = 0 Else ' Dim tSelSet As EditorInput.SelectionSet = getObjectsOnBlock(tAcadDoc.Editor, TrAct, strBlockName) 'If tSelSet IsNot Nothing Then Blockabfrage = 1 'Else 'Blockabfrage = 0 'End If End If End Using End Function
Funktioniert auch 1 sec. Geschwindigkeitssteigerung, muss die Geschwindigkeitseinbuße noch suchen. mfg Johann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |