| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Programmierstil - testen, überschreiben, Layer, Status (1754 mal gelesen)
|
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004
|
erstellt am: 17. Jun. 2006 14:43 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe eine - mehr oder weniger - grundsätzliche Frage. Zwar wurde hier im Forum und auch auf mapcars Seiten bereits über den Stil an sich diskutiert; allerdings habe ich zu einem speziellen Bereich noch kaum etwas Verwertbares gefunden. Vielleicht kann jemand ein paar Tips abgeben... Es geht, wie oben erwähnt, um eine Stilfrage oder auch "den guten Ton". Ein Beispiel sollte helfen: Ich habe eine Zeichung mit zwei Layern, "0" und "Test". Beide enthalten irgendwelche Objekte, der Einfachheit halber seien es Linien. Der Layer "Test" wird von mir (oder auch einem beliebigen user) gesperrt - warum auch immer - und eine kleine Lisp-Routine soll auf eben diesem - gesperrten - Layer "Test" eine weitere Linie zeichnen. Soweit keine allzu schwierige Aufgabenstellung. Meine kleine Lisp-Routine, die einen Strich malen soll, will auf den Layer "Test" zugreifen. Ist dieser gesperrt, so bricht die Routine ab. Ist auch gut so. Ist er nicht gesperrt, wird die Linie gezeichnet. Ebenfalls gut. An dieser Stelle sehe ich zwei Möglichkeiten: 1. Man kann mit dem Abbruch leben, der Nutzer muß den Layer manuell entsperren und die Routine erneut aufrufen (Eleganz?!). 2. Der Layer "Test" wird vor dem Zeichnen entsperrt, damit eben KEIN Abbruch erfolgt. Nun zur eigentlichen Frage und der Begründung dieses Postings im Lisp-Forum. Welche der folgenden Vorgehensweisen als Detail zu Punkt 2. würdet ihr empfehlen? a) Der Layer "Test" wird PAUSCHAL durch Lisp entsperrt, getaut, aktuell gesetzt oder was auch immer, OHNE vorher zu prüfen, ob es nötig ist; immerhin wäre es ja auch möglich, daß er bereits aktuell usw. ist, was bedeutet, das mein pauschales entsperren etc. in diesem Fall umsonst war. b) Der Status des Layer "Test" wird vorher geprüft, d.h. ich frage ab, ob gesperrt usw. und falls ja, dann entsperre etc. Wahrscheinlich die "sauberere" Lösung - welche aber für den Fall, daß der Layer nicht gesperrt war, ebenfalls unnötig war. Welche der beiden Varianten benötigt mehr Aufwand bzw. Rechenzeit (was heutzutage eine geringere Rolle spielt)? Gibt es hierfür ein allgemein gültiges Rezept? Und - zu guter letzt - was ist mit dem Stil? Nach meinem derzeitigen Wissensstand arbeite ich hauptsächlich mit "command ...". Dieses Beispiel läßt sich wohl auch auf andere Fälle anwenden. Ich danke euch für´s lesen und bin gespannt auf eure Antworten! Freddy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 17. Jun. 2006 16:17 <-- editieren / zitieren --> Unities abgeben: Nur für Paulchen
Hallo Freddy, wenn ich für ein Programmablauf einen Layer entsperren muß, dann würde ich dem Benutzer den Hinweis geben, das der Layer "sowieso" entsperrt wurde. Das Programm deswegen abbrechen, mit dem Hinweis "Das Programm konnte nicht fortgeführt werden, weil der Layer ...blala", würde ich nicht machen, weil es für den Benutzer nervig ist. Deine Frage zur Rechenzeit: die kannst Du IMHO wirklich vernachlässigen, denn in diesem Fall scheinen es ja sogar nur einzelne Abfragen zu sein (keine Liste mit 1000 Layer oder so) Und hier nochmal ein Beispiel, wie Du abfragen kannst, ob ein Layer gesperrt ist, und wie er in dem Falle entsperrt wird:
Code:
(defun layer_entsperren ( layer / liste) (setq liste (entget (tblobjname "LAYER" layer))) (if (=(logand (cdr (assoc 70 liste))4)4);;;wenn gesperrt (entmod(subst (cons 70 (-(cdr(assoc 70 liste))4)) (assoc 70 liste)liste))))
schönes Wochenende ------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004
|
erstellt am: 17. Jun. 2006 17:10 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, trotz Wochenende und schönem Wetter eine schnelle Antwort - besten Dank! Dein Hinweis mit Zitat: ...dann würde ich dem Benutzer den Hinweis geben, das der Layer "sowieso" entsperrt wurde...
ist durchaus hilfreich. Sollte natürlich nur dann auftauchen, wenn der Layer tatsächlich gesperrt war. Benutzer zu nerven, dürfte nicht das Ziel sein :-) Danke auch für die Codeschnipsel, werde sie mir bei Gelegenheit verinnerlichen. Sommerliche Grüße Freddy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 17. Jun. 2006 18:08 <-- editieren / zitieren --> Unities abgeben: Nur für Paulchen
Noch zur Ergänzung: Um eine Linie zu zeichnen,, braucht man den Layer nicht zu entsperren. Neuerzeugung auf gesperrten Layern ist ja erlaubt, nur ändern (und damit auch löschen) nicht. ------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 18. Jun. 2006 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für Paulchen
Zitat: Original erstellt von CAD-Huebner: Noch zur Ergänzung: Um eine Linie zu zeichnen,, braucht man den Layer nicht zu entsperren. Neuerzeugung auf gesperrten Layern ist ja erlaubt, nur ändern (und damit auch löschen) nicht.
..aber nur, wenn man mit Command arbeitet ... entmode und vla-put-layer stört der Layerstatus nicht. Deshalb auch zur Stilfrage .. setzte ich command ein , entmake oder ActivX ?
------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 18. Jun. 2006 13:40 <-- editieren / zitieren --> Unities abgeben: Nur für Paulchen
Zitat: ...und eine kleine Lisp-Routine soll auf eben diesem - gesperrten - Layer "Test" eine weitere Linie zeichnen.
Zitat: ... Deshalb auch zur Stilfrage .. setzte ich command ein , entmake oder ActivX ?
Völlig egal! Die Linienerzeugung funktioniert immer, egal ob Layer gesperrt oder ungesperrt, egal ob Command, entmake oder ActivX. ------------------ Mit freundlichem Gruß Udo Hübner 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: 18. Jun. 2006 13:59 <-- editieren / zitieren --> Unities abgeben: Nur für Paulchen
Hi, meine Meinung: Wenn ein Progger meint irgendwelche Sachen verstellen zu müssen, hat er auch die verdammte Pflicht nach Ablauf seiner Progs alles wieder zurückzustellen! ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 19. Jun. 2006 07:42 <-- editieren / zitieren --> Unities abgeben: Nur für Paulchen
Es ist m.E. die Frage, was das prog machen soll. Soll es diese veränderund (Linie malen) durchführen, oder nicht. Wenn es das soll, muss es das auch tun. Egal erstmal ob man dem User sagt, was nun alles passiert ist, und wieviel Layer entsperrt oder sonstwas wurden. Wichtig ist eben das, was Marcybäby schon sagte. wenn das Tool nur unter bestimmten Bedingungen ausführen darf, prüf eben diese erst ab und dann lass es arbeiten, wenn nicht, kannst du ja immernoch eine Meldung ausgeben, das dies oder das nicht so war wie es sollte. ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004
|
erstellt am: 19. Jun. 2006 13:03 <-- editieren / zitieren --> Unities abgeben:
Tach! Zunächst mal ein rießengroßes DANKESCHÖN an alle für die rege Beteiligung. Ich kann von der Arbeit aus nur sporadisch - z.B. in den Pausen - dabei bleiben :-( @Udo Hübner: Zitat: Um eine Linie zu zeichnen,, braucht man den Layer nicht zu entsperren. Neuerzeugung auf gesperrten Layern ist ja erlaubt, nur ändern (und damit auch löschen) nicht.
OK, OK, hast recht! "Zeichnen" steht hier beispielhaft... @Marc: Ich gebe Dir recht. So SOLLTE es sein! @CADwiesel: Zitat: ...wenn das Tool nur unter bestimmten Bedingungen ausführen darf, prüf eben diese erst ab und dann lass es arbeiten...
... ist eigentlich genau das, was ich zu hören erhofft hatte. An dieser Stelle sollte ich mich u.U. entschuldigen. Ich habe mich wohl oben nicht deutlich genug ausgedrückt :-( Das gesamte "Layer-sperren-Strich-malen-blabla" war als Beispiel gedacht. Ich versuch´s nochmal. Denkt bitte allgemeiner, globaler oder wie auch immer man das nennen mag. Was macht IHR? PRÜFT ihr ihr z.B. den Layerstatus, bevor was geändert wird? PRÜFT ihr z.B. die Sysvar PDSIZE oder schreibt ihr einfach Code: ... (setvar "PDSIZE" 35) ...
ohne Rücksicht auf Verluste? Ich möchte wissen, welches Vorgehen - welcher Stil? - sauberer, ordentlicher ist. Will eben vermeiden, mir Schlampereien anzueignen, die dann später - z.B. hier - wieder zerlegt werden :-) Nehmt es mir nicht krumm, vielleicht formuliere ich falsch oder mache mir zuviele Gedanken um Nebensächlichkeiten. Allerdings habe ich den Eindruck, daß sich nahezu alle an dem BEISPIEL "Layer" festgefahren haben. Trotzdem nochmals: Vielen, vielen Dank für die zahlreichen Tips und... Mahlzeit! Freddy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 19. Jun. 2006 13:25 <-- editieren / zitieren --> Unities abgeben: Nur für Paulchen
also meine Funktionen checken erst die übergebenen Parameter und machen erst dann was, wenn alles ok ist. Bsp davon solltest du einige im Forum finden können Die andere Herangehensweise ist, das die aufrufende Funktion für die Richtigkeit der Paramter verantwortlich ist. Das kann unter Umständen schneller sein. Dann gibts noch ne 3. , die sowas alles dem Errorhandling überläßt. Was ich aber noch für wichtig halte, ist die Trennung von Mach-was-Funktion und Userinterfacefunktion !!
------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." 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: 19. Jun. 2006 15:30 <-- editieren / zitieren --> Unities abgeben: Nur für Paulchen
|
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004
|
erstellt am: 20. Jun. 2006 12:24 <-- editieren / zitieren --> Unities abgeben:
Ich danke euch beiden, das hilft ein wenig. Weiß noch nicht so recht, für welche Variante ich mich entscheiden soll. Vermutlich ist die eigene Erfahrung da ein recht guter Lehrmeister. Den "Errorhandler" habe ich mir schon angesehen, ist mir aber (noch) ´ne Nummer zu heftig. Ich möchte ja gerne verstehen, was da passiert, anstatt nur stumpfsinnig zu kopieren, und das dauert wohl noch etwas... Freddy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|