| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Anzahl Auswahlsätze (850 mal gelesen)
|
FlorianP Mitglied Verm.-Ing
Beiträge: 44 Registriert: 04.12.2002 AutoCAD Map 2000i
|
erstellt am: 29. Sep. 2005 16:12 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich hab mir ein Programm gebastelt, bei dem einige Auswahlsätze nacheinander erstellt werden. Leider sind es für AutoCAD zuviel Auswahlsätze. Gibt es eine Möglichkeit einen Auswahlsatz freizugeben um Platz für einen neuen zu machen? Oder gibt es eine Systemvariable, wo man die Anzahl der Auswahlsätze erhöhen kann? Viele Grüße Florian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 Sie nannten ihn google.
|
erstellt am: 29. Sep. 2005 16:17 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Hi, könntest du bitte mal dein Anliegen konkretisieren !? Mit was kreierst du diese Auswahlsätze ? Und zuviele ? Das klingt jetzt etwas merkwürdig... Und wenn du auch noch verrätst für was du diese benötigst, dann gibts ja sogar vielleicht ein Work-Around (falls es wirklich zuviele sein sollten). ------------------ Grüsse Thomas [Diese Nachricht wurde von tunnelbauer am 29. Sep. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernhard GSD Mitglied
Beiträge: 482 Registriert: 29.08.2002 AutoCAD 2020(Deu); Windows 10 PRO x64(Deu)
|
erstellt am: 29. Sep. 2005 16:29 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
In Lisp-Programmen sollten Auswahlsätze immer in lokale Variablen gespeichert werden, die sind dann nur in der Funktion / in der Programm gültig, danach wird der Auswahlsatzspeicher freigegeben. Code:
(defun c:lispprg( / aws1 aws2 aws3 ....) ... )
------------------ Gruß aus Wien Bernhard [Diese Nachricht wurde von Bernhard GSD am 29. Sep. 2005 editiert.] [Diese Nachricht wurde von Bernhard GSD am 29. Sep. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cad-intensiv Mitglied CAD-Anbieter
Beiträge: 31 Registriert: 14.06.2005
|
erstellt am: 29. Sep. 2005 17:39 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Zitat: Original erstellt von FlorianP: Hallo,ich hab mir ein Programm gebastelt, bei dem einige Auswahlsätze nacheinander erstellt werden. Leider sind es für AutoCAD zuviel Auswahlsätze. Gibt es eine Möglichkeit einen Auswahlsatz freizugeben um Platz für einen neuen zu machen? Oder gibt es eine Systemvariable, wo man die Anzahl der Auswahlsätze erhöhen kann?
Ich würde hier ganz dringend empfehlen, die Auswahlsätze vor der Zuweisung an Variablen jeweils in Listen von Entity-Namen umzuwandeln. Dann kannst Du so viele "Auswahlsätze" haben wie Du willst, und v.a. gibt es dann keine unerwünschten Seiteneffekte mehr, die PICKSETs mit sich bringen (PICKSETs sind nur Zeiger auf einen Auswahlsatz, also ungefähr so etwas wie der Dateideskriptor, den man mit den Funktion (open <filename> ) erhält). Robert ------------------ Lisp-Seminare in Wien am 25. und 26. Sep 2005 und später in München, Frankfurt, Köln , Berlin ... -> Infos unter cad-intensiv@gmx.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 29. Sep. 2005 18:36 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Hi Florian, ui zuviele Auswahlsätze... Das hört sich interessant und nach systematischem Fehler an ;-). Poste doch mal Deinen Code, da werden wir bestimmt viele Vorschläge für Optimierungen haben... ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 29. Sep. 2005 18:41 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Zitat: Original erstellt von cad-intensiv: Ich würde hier ganz dringend empfehlen, die Auswahlsätze vor der Zuweisung an Variablen jeweils in Listen von Entity-Namen umzuwandeln
Mal aus Interesse: Hast Du schon mal untersucht wie sich das auf die Performance bei Massenverarbeitung auswirkt? Ist das Übertragen von Auswahlsätzen in Listen sehr rechenintensiv? Magst Du dem Florian eine solche Funktion auch als Beispiel hier posten? Ich glaube nicht, dass er so etwas mal eben aus dem Handgelenk schüttelt. ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cad-intensiv Mitglied CAD-Anbieter
Beiträge: 31 Registriert: 14.06.2005
|
erstellt am: 29. Sep. 2005 22:34 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Zitat: Original erstellt von marc.scherer: Mal aus Interesse: Hast Du schon mal untersucht wie sich das auf die Performance bei Massenverarbeitung auswirkt? Ist das Übertragen von Auswahlsätzen in Listen sehr rechenintensiv?Magst Du dem Florian eine solche Funktion auch als Beispiel hier posten? Ich glaube nicht, dass er so etwas mal eben aus dem Handgelenk schüttelt.
Auf die Performance wirkt sich das nicht spürbar aus, Du kannst es ja gerne mal selber testen. Vermutlich ergeben sich dadurch sogar eher Performancegewinne, denn man kann ja jetzt mit sehr effizienten Listenoperationen auf die Elemente in den Auswahlsätzen zugreifen - und zwar ohne sich darüber Gedanken machen zu müssen, ob man dabei die bekannten Seiteneffekte auslöst. Und wenn jemand nicht weiss, wie er aus einem Auswahlsatz mit drei Zeilen Lisp eine Liste der Entitynamen generiert, dann sollte er halt vielleicht doch eher erst mal einen Kurs belegen, anstatt sich hier zu einer Lösung durch zu betteln. Ich denke, dass das wirklich jeder hinkriegt, der auch nur elementare Lisp-Kenntnisse hat. Aber wenn Du selbst schon nachfragst, will ich mal ein wenig meine Handgelenke schütteln: Code:
(defun ss-to-el (ss / counter el) (repeat (sslength ss) (setq el (cons (ssname ss (counter+ 'counter 0)) el)) ) )
Damit doch noch etwas Lehrreiches für die Allgemeinheit rüber kommt, verwende ich hier für's Initialisieren auf Startwert und Hochzählen von Zählern eine einfache Hilfsfunktion (counter+ 'counter 0). Diese Funktion gibt's hier gratis dazu :-) Code:
(defun counter+ (var start) (if (not (eval var)) (set var start) (set var (1+ (eval var))) ) )
Robert ------------------ Lisp-Seminare in Wien am 25. und 26. Sep 2005 und später in München, Frankfurt, Köln , Berlin ... -> Infos unter cad-intensiv@gmx.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
FlorianP Mitglied Verm.-Ing
Beiträge: 44 Registriert: 04.12.2002 AutoCAD Map 2000i
|
erstellt am: 30. Sep. 2005 07:57 <-- editieren / zitieren --> Unities abgeben:
Hallo und guten Morgen euch allen, hey, das ist ja echt super klasse die vielen Antworten. Nun kurz zum ersten: Mein Programm soll Blöcke innerhalb eines Polygons finden. Das Polygon entspricht einem Raum und der Block ist ein Brandmelder. Ich will mit dem Programm herausfinden, in welchem RAum der Branmelder sitzt. Meine vorgehensweise: Ich erstell mir ein Auswahlsatz mit allen Raumpolygonen. Danach arbeite ich jedes einzelne Polygon durch und erstell wiederum ein Auswahlsatz wobei ich alle enthaltenen Brandmelder selektiere. D.h. ich erstell flür jeden Raum einen Auswahlsatz. Zu dem Vorschlag von Bernhard, hab ich gleich umgesetzt, hat jedoch nichts gebracht. Normalerweise mach ich schon alle Variablen zu lokalen Variablen, doch zum Programmieren hab ich sie immer global, da ich dann sie auch abfragen kann. Zu Roberts Idee kann ich noch nichts sagen, da ich es erst noch testen muss. Aber nochmals zu meinem Verständnis, ich erstell einen Auswahlsatz und weise die enthaltenen Objekte mit ihren Entitynamen einer Liste zu. Einen Auswahlsatz habe ich doch dann auch erstellt!? Nur nicht einer Variable zugewiesen. Im Anhang sende ich mal den Quellcode mit. Vielen, vielen Dank schon mal im voraus. Florian Oh, ich muss mal mein Profil umstellen, da wir neuerdings auf Map 3D 2005 gewechselt haben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 30. Sep. 2005 08:03 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
|
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 30. Sep. 2005 09:09 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Zitat: Original erstellt von cad-intensiv: Und wenn jemand nicht weiss, wie er aus einem Auswahlsatz mit drei Zeilen Lisp eine Liste der Entitynamen generiert, dann sollte er halt vielleicht doch eher erst mal einen Kurs belegen,...
lol, am besten belegt er den Kurs dann bei Dir? Zitat: Original erstellt von cad-intensiv: Ich denke, dass das wirklich jeder hinkriegt, der auch nur elementare Lisp-Kenntnisse hat.
ICH denke, da liegst Du falsch. Wenn jemand schon 'nen Programmier- Background hat sicherlich. Wenn das aber nicht der Fall ist, kommt man auf solche Winkelzüge gar nicht erst, geschweige denn fängt man an zu modularisieren. Ich kenn' das noch aus meiner Anfangszeit, wäre mir nie eingefallen so etwas... Wenn ich mir meinen alten Code so anschaue ist das alles extrem kompliziert gedacht und umständlich, so ist das halt' wenn man einfach so drauf los codet und nur einen Teil der internen Funktionen kennt / begreift. Finde ich aber klasse, das Du dem Kollegen noch 'ne vernünftige Sub nachgeschoben hast!
------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernhard GSD Mitglied
Beiträge: 482 Registriert: 29.08.2002 AutoCAD 2020(Deu); Windows 10 PRO x64(Deu)
|
erstellt am: 30. Sep. 2005 09:12 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Zitat: Original erstellt von FlorianP:
Normalerweise mach ich schon alle Variablen zu lokalen Variablen, doch zum Programmieren hab ich sie immer global, da ich dann sie auch abfragen kann.
Auch ich teste Programme global, die Produktionsversion ist dann aber lokal. Beim Testen ab und an mal eine neue Zeichnung anfangen oder ACAD neu starten. ------------------ Gruß aus Wien Bernhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 823 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 30. Sep. 2005 10:12 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Zitat: Original erstellt von FlorianP:
Einen Auswahlsatz habe ich doch dann auch erstellt!? Nur nicht einer Variable zugewiesen.
Ja, und das ist der Casus Knaxus. Wie ich schon sagte: diese Zeiger auf die PICKSETs sind ganz ähnlich wie die Zeiger auf offene Dateien, und aufgrund schlampiger und nie korrigierter Programmierung von AutoCAD kann man halt nur eine begrenzte Anzahl von Auswahlsätzen gleichzeitig "offen" halten. In dem Moment, in dem Du eine Variable mit einem Zeiger auf einen Auswahlsatz auf NIL setzt, wird dieser Auswahlsatz geschlossen. Damit Du die Sache etwas leichter verstehst, probier mal folgendes: (setq ss1 (ssget)) ; Auswahlsatz bilden -> <Selection set: 2> (sslength ss1) ; Wie viele Elemente sind drin (bei mir 5) -> 5 (setq ss-backup ss1) ; Backup von ss1 bilden -> <Selection set: 2> (ssdel (ssname ss1 0) ss1) ; aus dem Ausweahlsatz ss1 erstes Element entfernen, beachte, dass das Ergebnis nicht wieder an ss1 gebunden wird! (sslength ss1) ; wie viele Elemente sind in ss1? -> 4 ; und das, obwohl wir das Ergebnis von ssdel nicht in die Variable zurück geschrieben haben! (sslength ss-backup) -> 4 ; und sogar ss-backup hat jetzt vier nur noch Elemente, obwohl wir das ssdel doch auf ss1 angewendet haben und nicht auf ss-backup! Verständlich wird das, wenn man weiss, dass ein Pickset der Art <Selection set: 2> in AutoLISP eben nur ein Zeiger auf eine andere Struktur ist. Es gibt hier nur einen einzigen (!) Auswahlsatz, und der Zeiger darauf wird an zwei verschiedene Variablen gebunden. Das ssdel verändert den einen und einzigen Auswahlsatz in diesem Beispiel, und egal, ob ich mir diesen Auswahlsatz via ss1 oder via ss-backup ansehe: er ist immer derselbe. Jetzt sollte Dir klar sein, warum meine Lösung keine Probleme bereitet: es wird ja an keiner Stelle ein Auswahlsatz an eine Variable geunden. Ein Auswahlsatz wird erzeugt, es wird eine Liste daraus gemacht, und der Auswahlsatz wird ins Nirvana geschickt. Wenn Du für irgend welche (command ...) Aufrufe später wieder einen Auswahlsatz aus den Entity-Listen benötigst, dann musst Du also wieder einen neuen Auswahlsatz erzeugen. Das geht so: Code:
(defun el-to-ss (el / ss) (setq ss (ssadd)) (mapcar (function (lambda (en) (ssadd en ss))) el) ss )
Robert
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |