| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Probleme mit align (1810 mal gelesen)
|
Mci Mitglied Konstrukteur
Beiträge: 15 Registriert: 28.02.2006 Acad 2004, Windows 2000 Professional, Service Pack 4
|
erstellt am: 28. Feb. 2006 18:47 <-- editieren / zitieren --> Unities abgeben:
Hallo, bin neu im Forum und auch Lisp-Anfänger. Ich schreibe gerade an einer Routine, in der ich den nicht nativen Befehl align verwende und habe damit 2 Probleme: 1) Ich rufe align folgendermaßen auf, da es sich um einen nicht nativen Befehl handelt: (c:align ...) Das funktioniert auch wunderbar, jedoch nur unter einer Bedingung: Der Befehl align muß vor dem ersten Aufruf meiner Routine mindestens einmal aus Autocad heraus aufgerufen werden. Weiß jemand, wie man das ändern kann und woran das liegt? 2) Der Aufruf (c:align ...) unterbricht ganz offensichtlich meine Absicht, meine Routine als ganzes Rückgängig machen zu können. Dies versuche ich durch (command "_undo" "b") am Anfang meiner Routine und (command "_undo" "e") am Ende meiner Routine zu erreichen. Daß es an (c:align ...) liegt, kann ich daran feststellen, daß die Routine ohne diesen Aufruf sauber komplett rückgängig zu machen ist. 3) Ich überlege, das Problem dadurch zu behandeln, eine eigene align-Routine zu schreiben und als Unterfunktion einzufügen. Oder kennt jemand den Code?
------------------ tom 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: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 28. Feb. 2006 19:24 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
Hallo MCI und herzlich Willkommen im WBF. Offentsichtlich hat der Lisp-Routine Align nichts mit dem nativen AutoCAD Befehl AUSRICHTEN/_ALIGN zu tun. Kannst du eine Quellenangabe und die Funktion der Routine align hier mal angeben? Die Funktion C:ALIGN wird in einer *.FAS, *.VLX oder *.LSP Datei definiert und vermutlich erst beim ersten Aufruf geladen (AUTOLOAD). Suche mal alle LISP-Quelltexte nach DEFUN C:ALIGN durch, evt. wirst du fündig. Ohne mehr Infos kann man keine weiteren Tipps geben (außer Allgemeintipps). Noch ein Allgemeintipp: Fülle bitte deine Systemangaben aus. ------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
scj Mitglied
Beiträge: 555 Registriert: 09.08.2001
|
erstellt am: 28. Feb. 2006 19:26 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
|
Mci Mitglied Konstrukteur
Beiträge: 15 Registriert: 28.02.2006 Acad 2004, Windows 2000 Professional, Service Pack 4
|
erstellt am: 01. Mrz. 2006 08:33 <-- editieren / zitieren --> Unities abgeben:
Hallo Udo, doch, ich meine den Autocad-Befehl Ausrichten oder _align. So weit ich weiß ist der aber nicht "nativ", soll heißen, er läßt sich z.B. nicht sauber mit (command "_align" ...) aufrufen. ------------------ tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mci Mitglied Konstrukteur
Beiträge: 15 Registriert: 28.02.2006 Acad 2004, Windows 2000 Professional, Service Pack 4
|
erstellt am: 01. Mrz. 2006 08:49 <-- editieren / zitieren --> Unities abgeben:
Hallo scj, Dein xalign habe ich gerade ausprobiert. Das Ausrichten klappt gut, einige Punkte entstehen leider. Werde die Funktion für mich etwas verändern, wenn ich demnächst etwas Zeit habe. Vielen Dank. Vielleicht kennt aber ja doch jemand die Lösung für eingangs beschriebene 2 Probleme. ------------------ Gruß, Tom 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: 01. Mrz. 2006 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
Hallo Mci, bitte erläutere diesen Satz nochmal. Zitat: 1) Ich rufe align folgendermaßen auf, da es sich um einen nicht nativen Befehl handelt: (c:align ...) Das funktioniert...
Woher rufst Du auf? In der Acad-Befehlszeile? Dann kannst Du Dir die Klammern und das "c:" sparen, Du müßtest also nur "align" eingeben. Vermutlich - ich bitte um Korrektur - rufst Du allerdings aus Lisp heraus auf. Dann kann ich nur auf den Beitrag von CAD-Huebner verweisen. Es wäre durchaus denkbar, daß der Aufruf aus AutoCAD heraus erstmal die Routine lädt und sie dann ausführt. In Deinem Fall (Aufruf aus Lisp) ist die Routine u.U. noch gar nicht geladen. Das vorherige Laden läßt sich durchaus in Lisp einbauen - benutze mal die Hilfe zu "load". Zu 2.: Poste doch mal Deinen Code. Hinweis zur Fehlerbehandlung: http://ww3.cad.de/foren/ubb/Forum145/HTML/000435.shtml#000044 Sehr gut, für mich als Anfänger nicht gerade einfach; da haben sich die Mitglieder echt Mühe gegeben. Zumindest sollte man wissen, daß es sowas gibt - rein informativ :-) Zu 3.: Warte lieber mal, was hier noch so kommt, man muß das Rad ja nicht neu erfinden... Frohes Schaffen wünscht Freddy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangGutke Mitglied Konstrukteur
Beiträge: 109 Registriert: 28.09.2004 AutoCAD 2002 AutoCAD 2006 ObjectDCL 2.02
|
erstellt am: 01. Mrz. 2006 16:12 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
Hallo, um den "align" Befehl nutzen zu können, ohne ihn vorher einmal per Hand zu starten, solltest du wie folgt vorgehen: Lade die "geom3d.arx" mit der acad.lsp so: (if (not (member "geom3d.arx" (arx)))(arxload "geom3d.arx")) Danach die Funktion so verwenden: (align BlockNeu BlockNeu-EP_OR Block1-EP_UR BlockNeu-EP_OL Block1-EP_UL BlockNeu-EP_UL Block1-EP_OL "" "3d") Gruß Wolfgang ------------------ LISP = Lots of Insane Stupid Parantheses Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mci Mitglied Konstrukteur
Beiträge: 15 Registriert: 28.02.2006 Acad 2004, Windows 2000 Professional, Service Pack 4
|
erstellt am: 02. Mrz. 2006 20:07 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Anregungen. Ich habe nun als Anfänger so viel zu überlegen, daß ich mich wohl eine ganze Weile damit beschäftigen werde. zu 1) Das mit dem (if (not (member "geom3d.arx" (arx)))(arxload "geom3d.arx")) werde ich mal ausprobieren, hört sich gut an. zu 2) Offensichtlich bricht _align mein (command "_undo" "b") mit einem eigenen (command "_undo" "b") ab, denn wie ich von Axel nun gelernt habe aus dem o.g. Link, der sich mit einem allgemeinen Error-Handler beschäftigt (von dem ich ansonsten noch null Durchblick habe): "Ich habe das aber erstmal zum Anlass genommen, gleich ein weiteres Problem zu lösen, das damit zusammenhängt: Bei einem verschachtelten Aufruf mit Undo-Flag lassen sich die Undo-Gruppen nicht nahtlos aneinandersetzen, da zwischen den Undogruppen jeweils der Programmaufruf als Einzelbefehl gespeichert wird. Die Undo-Schachtelung sieht also z.B. bei 3 Errorhandlern so aus, dass man 5 Undos braucht, um wieder in den Urzustand zu kommen. An diesem Problem bastele ich schon seit langem, finde aber keine Lösung. Ich habe aber die Sache jetzt so umgestrickt, dass (bei eingeschaltetem Undo-Flag) auch ein Fehler im 5. verschachtelten Programm alles auf den Zustand vor dem Start des 1. Programms zurücksetzt." Das heist für mich: Jede Routine die _align aufruft kann nicht als ganzes Rückgängig gemacht werden durch die _undo beginn/end-Variante, weil _align seinerseits _undo beginn/end aufruft. Kann mir jemand das bestätigen? Einzige Alternative: Eigene Ausrichtenfunktion schreiben? An Paulchen: _align rufe ich aus Lisp heraus aus. Die genaue Definition für nicht-native ACAD-Befehle kenne ich nicht. Aber es handelt sich dabei offensichtlich um in Lisp geschriebene Zusatzfunktionen für Autocad wie _rotate3d, _align etc. Mußt mal im Forum suchen. Diese lassen sich merkwürdigerweise durchaus mit (command...) aus Lisp aufrufen. Ruft man sie jedoch auf diese Weise mehrfach auf, z.B. in einer Schleife, dann führen sie zu Fehlern. In meinem Fall verwendete ich (command "_align" ...) in einer while-Schleife. Nach immer genau dem vierten Aufruf erschien folgende ACAD-Meldung: "Befehle können nicht tiefer als vier verschachtelt werden." Danach: Autocad-Absturz. In einem anderen Beitrag hier im Forum klagte jemand über genau diese Fehlermeldung. Vielleicht kann das jemand näher erklären???? ------------------ Gruß, Tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mci Mitglied Konstrukteur
Beiträge: 15 Registriert: 28.02.2006 Acad 2004, Windows 2000 Professional, Service Pack 4
|
erstellt am: 02. Mrz. 2006 20:24 <-- editieren / zitieren --> Unities abgeben:
noch mal zu 2) Ich habe im letzten Beitrag versehentlich das falsche Zitat von Axel reinkopiert. Sorry. Zur _undo Problematik hat er geäußert: "1. Ich habe mich von dem bisherigen Undo-Konzept verabschiedet. UNDO BEGIN und UNDO END kennen nun mal leider keine Verschachtelung, d.h. jedes BEGIN schließt automatisch eine noch offene Gruppe ab. Das lässt sich leider überhaupt nicht austricksen. Neues Modell: Nur noch die oberste (erste) Instanz des Errorhandlers erzeugt eine UNDO-Gruppe, alle weiteren nicht. Und nach dem Motto 'der letzte macht das Licht aus' schließt auch die erste Instanz die Gruppe zum Schluss ab. Auch bei neunzehnfach verschachteltem Handling gibt es also nur ein BEGIN/END." aus: http://ww3.cad.de/foren/ubb/Forum145/HTML/000435.shtml#000044 ------------------ Gruß, Tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangGutke Mitglied Konstrukteur
Beiträge: 109 Registriert: 28.09.2004 AutoCAD 2002 AutoCAD 2006 ObjectDCL 2.02
|
erstellt am: 03. Mrz. 2006 09:37 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
>> Nach immer genau dem vierten Aufruf erschien folgende ACAD-Meldung: "Befehle können nicht tiefer als vier verschachtelt werden." Danach: Autocad-Absturz. In einem anderen Beitrag hier im Forum klagte jemand über genau diese Fehlermeldung. Vielleicht kann das jemand näher erklären???? << Dies Problem rührt vom (command "align" ...) her!!!! Habe es auch gehabt. Verwende mal mein Beispiel mit dem Aufruf von (align ...), dann klappt es auch mit dem Nachbarn. VG Wolfgang ------------------ LISP = Lots of Insane Stupid Parantheses Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangGutke Mitglied Konstrukteur
Beiträge: 109 Registriert: 28.09.2004 AutoCAD 2002 AutoCAD 2006 ObjectDCL 2.02
|
erstellt am: 03. Mrz. 2006 09:39 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
Noch ne Idee zu deinem UNDO: Schau dir mal die Sache mit den UNDO - Markierung ... - Rückgängig an. Hiermit kannst du ganze Bearbeitungsfolgen auf einmal zurück setzen. VG Wolfgang ------------------ LISP = Lots of Insane Stupid Parantheses Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadadr Mitglied Leiter CAD
Beiträge: 2 Registriert: 12.10.2005 W2kSP4 ACADR14 ACAD2002 DELL INSPIRON 8100
|
erstellt am: 03. Mrz. 2006 11:01 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
Hi Tom, diese Lispfunktion ist in der erweiterten ARX - GEOM3D von ACAD definiert, und standardmäßig nicht geladen! (arxload "GEOM3D") lädt diese Funktionalität und damit steht dann auch die Funktion c:align zur Verfügung. TIP: bei solchen Funktionen über APPLOAD vor dem Standard Aufruf die geladenen ARX Dateien prüfen und dann nochmal nach dem Aufrufen des Befehls. Dann kriegt man schon raus was da automatisch dazugeladen wurde. Karsten Das war mein erster Beitrag zu CAD.DE! Die Quelle stammt von MAPCAR - dem ich viel KnowHow im Lisp verdanke!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mci Mitglied Konstrukteur
Beiträge: 15 Registriert: 28.02.2006 Acad 2004, Windows 2000 Professional, Service Pack 4
|
erstellt am: 03. Mrz. 2006 16:37 <-- editieren / zitieren --> Unities abgeben:
Das mit (if (not (member "geom3d.arx" (arx)))(arxload "geom3d.arx")) klappt einwandfrei. Dein _align so verwenden verstehe ich nicht: (align BlockNeu BlockNeu-EP_OR Block1-EP_UR BlockNeu-EP_OL Block1-EP_UL BlockNeu-EP_UL Block1-EP_OL "" "3d") Ich rufe align folgendermaßen auf und es funktioniert ganz normal: (c:align ss p1 '(0 0 0) p2 '(1 0 0) p3 '(0 1 0)) Das Problem mit dem undo bleibt. Mit undo Markierung läßt es sich vielleicht beheben, aber: Ein unbedarfter Benutzer der Routine möchte vielleicht ganz normal mit z + Eingabe seine Schritte rückgängig machen. Und das geht eben nicht. Mit undo Markierung müßte ich am Ende wohl zumindest eine Abfrage starten, damit der Nutzer dann entscheiden kann. Eine eigene align-Unterfunktion scheint wohl doch das beste zu sein (s. weiter oben xalign) ------------------ Gruß, Tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangGutke Mitglied Konstrukteur
Beiträge: 109 Registriert: 28.09.2004 AutoCAD 2002 AutoCAD 2006 ObjectDCL 2.02
|
erstellt am: 03. Mrz. 2006 19:21 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
Hi, schaue dir doch mal die Hilfe der Entwicklerumgebung in AutoCAD an. Dort findest du auch die Anleitung zum Ausrichten im 2D Raum. Das Ausrichten im 3D kannst du auf mein Beispiel zurückgreifen. Mein Beispiel (align BlockNeu BlockNeu-EP_OR Block1-EP_UR BlockNeu-EP_OL Block1-EP_UL BlockNeu-EP_UL Block1-EP_OL "" "3d") ist wie folgt zu verstehen: BlockNeu ist der Block, der Ausgerichtet werden soll BlockNeu-EP_OR, BlockNeu-EP_OL und BlockNeu-EP_UL sind die Punkte, die Ausgerichtet werden sollen Block1_EP-UR ... sind die Punkte, an der BlockNeu ausgerichtet werden soll. Ich hoffe, es wird jetzt klarer. Alle anderen Versuche mit z.b (command "align" ...) hab ich schon durch - es hat nicht funktioniert. Mit meiner Version geht es einwandfrei. VG Wolfgang ------------------ LISP = Lots of Insane Stupid Parantheses Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangGutke Mitglied Konstrukteur
Beiträge: 109 Registriert: 28.09.2004 AutoCAD 2002 AutoCAD 2006 ObjectDCL 2.02
|
erstellt am: 04. Mrz. 2006 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für Mci
|