| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Script aus Lisp mit Command aufrufen (2288 mal gelesen)
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 11. Sep. 2007 10:02 <-- editieren / zitieren --> Unities abgeben:
Ich möchte in einem Lisp ein Script starten: Code: (command "script" "d:\\layname.scr")
Lasse ich das Script von Hand aus laufen oder kopiere den genannten Befehl in die Befehlszeile, läuft es gut.Es geht aber nicht im Lisp und das Lisp läuft einfach drüber, und nach Studium der Online-Hilfe finde ich im Kapitel "command": Zitat: If the SCRIPT command is used with the command function, it should be the last function call in the AutoLISP routine.
Nun habe ich die Script-Commands in eine Unterroutine verpackt; diese hat nur die Scriptcommands - daher sind sie auch die "letzten Befehle" - und wird von der Hauptroutine aus gestartet.Es geht aber trotzdem nicht, und auch die Befehlsvariante vl-cmdf verhält sich gleich. Was tun?? Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) 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 ich hab eh keine Probleme damit...
|
erstellt am: 11. Sep. 2007 10:25 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 11. Sep. 2007 10:31 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von tunnelbauer: ...Wieviele Scripts versuchst du aufzurufen? Eines? Oder mehrere?
Eigentlich zwei; die könnte ich aber notfalls in eines zusammenfassen. Es wird aber auch das erste nicht gestartet. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) 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 ich hab eh keine Probleme damit...
|
erstellt am: 11. Sep. 2007 10:39 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 11. Sep. 2007 10:53 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Soweit ich mich noch erinnern kann, werden SCripte, die über Command aus Lisp gestartet werden, erst ganz zum Schluss nach Beendigung der Lisproutinen angestossen, wobei eineige nachfolgende (also nach (command "Script" ..) LispBefehle diese Ausführung jedoch unterbinden. Ein Einbinden in einer Subroutine bringt hier gar nichts, das der Aufruf innerhalb der Subrotuine vielelicht der letzte Aufruf ist, jedoch nicht im ganzen Lisp-Ablauf. An und für sich fällt mir aber keine sinnvolle Anwendung von LISP und SCRIPTen zusammen ein. Die Stärke von Scripten sind eigentlich hauptsächlich in der zeichnungsübergreifenden Bearbeitung zu suchen. Hier hättest Du soweiso das Problem, dass dein Lisp sich vertschüssen würde, wenn die zeichnung gewechselt wird. (Lisp läuft im Namespace der Zeichnung, und nicht Zeichnungsübergreifend)
Jetzt erkläre mir mal, was Du machen möchtest, und wir suchen einen komplett anderen Lösungsweg. Denn alles was Du mit SCRIPTEN innerhalb einer Zeichnungs machen kannst, kannst Du auch mit LISP alleine !
[EDIT] umgekehrt ist es natürlich was ganz anderes. Ein Script, dass eine bestimmte Anzahl von Zeichnungen abarbeitet, und in jeder zeichnung ein Lisp ausführt. Aber Scripte aus Lisp starten halte ich für sinnlos.
[Diese Nachricht wurde von fuchsi am 11. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 11. Sep. 2007 11:11 <-- editieren / zitieren --> Unities abgeben:
@tunnelbauer: Ja, die Unterroutine wird aufgerufen. Sie besteht aus .. alert "anfang" .. command script1 .. .. command script2 .. .. alert "ende".. Die Alerts kommen, sonst nichts (auch keine Fehlermneldungen.) @fuchsi: es hängt auch damit zusammen: http://ww3.cad.de/foren/ubb/Forum145/HTML/002125.shtml Ich möchte in vielen Zeichnungen - diverse Layer umbenennen (A->test; müller->meier) - diverse Layer verschieben (laymrg): X->testx; Y->meier, .. Da in jeder Zeichnung verschiedene Layer sind, muss ich mit "if" arbeiten: if layer A, umbenennen in Test if layer X, verschiebe auf testx Nun kann ich - Laymrg nicht direkt mit Lisp ansprechen - rename nur mit Lisp ansprechen, wenn ich die Layernamen direkt als Name übergebe und nicht als !Variable Daher habe ich den Ausweg gesucht, im Lisp ein Script (bzw. zwei) zu erzeugen und dann abzuarbeiten. Die Erzeugung geht, der händische Ablauf des SAcripts ebenfalls - aber wie gesagt: der Scriptstart in Lisp geht nicht. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 11. Sep. 2007 11:34 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von Peter2: Nun kann ich - Laymrg nicht direkt mit Lisp ansprechen - rename nur mit Lisp ansprechen, wenn ich die Layernamen direkt als Name übergebe und nicht als !Variable[/B]
Laymrg kenne ich nicht, ich verwende keine Expresstools. Rename : warum soll man denn rename nicht per lisp verwenden können ? (setq AltLayer "Layer1") (setq NeuLayer "Layer2") (command "._rename" "_layer" altLayer neuLayer) Funktioniert Doch tatelos ! ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 11. Sep. 2007 11:54 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
auch für Laymrg läßt sich ein Lisp finden, oder rate mal, wie ich das programmieren konnte... ------------------ - 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 |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 11. Sep. 2007 12:13 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von fuchsi: ..(command "._rename" "_layer" altLayer neuLayer)Funktioniert Doch tatelos !
Jetzt bin ich etwas irritiert, weil bei mir gab es immer die Meldung "Layer altlayer ist nicht vorhanden." Nun geht es aber .. Zitat: Original erstellt von CADmium: auch für Laymrg läßt sich ein Lisp finden, oder rate mal, wie ich das programmieren konnte...
Sicher gut und mit gewissem Aufwand. Zur Frage Script aus Lisp werde ich aber nicht viel schlauer daraus ... Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 11. Sep. 2007 12:39 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Also , da in ACAD 2006 das eine C : Lisp Funktion ist, und die Eingaben mittels entsel abgefragt werden , geht es wohl nur über den Umweg mittels dem AxtiveX-efehl Command ein SendCommand abzusetzten ! Achtung : ist für meine englischen expresstools !!!! (vlax-invoke (vlax-get (vlax-get-acad-object) "ActiveDocument") "SendCommand" (strcat "LayMrg" (chr 13) "T" (chr 13) "Layer1" (chr 13) (chr 13) "T" (chr 13) "Layer2" (chr 13) "YES" (chr 13))) ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 11. Sep. 2007 12:48 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von Peter2: Zur Frage Script aus Lisp werde ich aber nicht viel schlauer daraus ...
SCRIPT aus LISP wird nix! anbei mal ein Scripttaugliches LAYMRG .. der Aufruf (LAYMRG+ '("AM_1" "AM_2") "0") verschiebt alle Objekte von Layer "AM_1" und "AM_2" auf Layer "0" ------------------ - 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 |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 11. Sep. 2007 14:18 <-- editieren / zitieren --> Unities abgeben:
Herzlichen Dank an beide. Zitat: Original erstellt von CADmium: SCRIPT aus LISP wird nix!
Schade ... Zitat: Original erstellt von CADmium: ...anbei mal ein Scripttaugliches LAYMRG ..
Besten Dank. Mein Kurztest zeigt, dass es mit Übergabe von Strings klappt, dass er aber anscheinend Variablen nicht auswerten kann: Rückgabe nil, keine Meldung, keine Änderung
Zitat: Original erstellt von fuchsi: ..Achtung : ist für meine englischen expresstools !!!!...
In der deutschen Version muss man "T" durch "E" und "YES" mit "ja" ersetzen, und es werden auch Variable akzeptiert: Code: (vlax-invoke (vlax-get (vlax-get-acad-object) "ActiveDocument") "SendCommand" (strcat "LayMrg" (chr 13) "e" (chr 13) altlayer (chr 13) (chr 13) "e" (chr 13) neulayer (chr 13) "JA" (chr 13)))
Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 11. Sep. 2007 14:51 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von Peter2: Herzlichen Dank an beide. Mein Kurztest zeigt, dass es mit Übergabe von Strings klappt, dass er aber anscheinend Variablen nicht auswerten kann: Rückgabe nil, keine Meldung, keine Änderung
naja .. Meldungen hab ich mir verkniffen .. aber das mit den Variablen kann ich nicht nachvollziehen.. Das erste Argument muß eine Liste mit Layernamen(Strings) sein, nicht existierender Layer werden aussortiert, das 2. muß ein existierender Layername sein. (das Anlegen hab ich mir auch verkniffen, ebenso wie _undo und _regen)...
------------------ - 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 |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 11. Sep. 2007 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von Peter2: Besten Dank. Mein Kurztest zeigt, dass es mit Übergabe von Strings klappt, dass er aber anscheinend Variablen nicht auswerten kann: Rückgabe nil, keine Meldung, keine Änderung
Zitat:
(LAYMRG+ '("AM_1" "AM_2") "0")
ein gerne gemachter Fehler :
(setq AltLayer "IrgendEinAlterLayer") (setq NeuLayer "IrgendEinNeuerLayer") (LAYMRG+ '(AltLayer) NeuLayer) kann nicht gehen, in quotierten Listen werden Variabeln nicht evaluiert, sondern als Symbol übergeben -> (LAYMRG+ (LIST AltLayer) NeuLayer)
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 11. Sep. 2007 16:29 <-- editieren / zitieren --> Unities abgeben:
So, jetzt habe ich die Probleme umgedreht: Zitat: Original erstellt von fuchsi: ...(LAYMRG+ (LIST AltLayer) NeuLayer)...
Dafür, wie ich ich mit Listen arbeite, sollte mir das nicht passieren. Sorry und danke. Das scheint nun zu laufen. Umgekehrt gibt es nun bei deinem "invoke" Mystisches. Folgender Programmaufbau:
Code: (setq layerliste (list (list "alt1" "neu1") (list "alt2" "neu2") )) (foreach paar layerliste (progn (setq altlayer (car paar) neulayer (cadr paar)) (princ (strcat "\nUntersuche " altlayer " / " neulayer "...")) (if (tblsearch "layer" altlayer) (progn (vlax-invoke (vlax-get (vlax-get-acad-object) "ActiveDocument") "SendCommand" (strcat "LayMrg" (chr 13) "e" (chr 13) altlayer (chr 13) (chr 13) "e" (chr 13) neulayer (chr 13) "JA" (chr 13) )) ) ) ) )
Eigentlich sollte damit - immer die Meldung von princ kommen und sofort - bei gefundenen Layern die jeweilige Umwandlung erfolgen.Im Befehlszeilenprotokoll aber - laufen alle princ-Meldungen durch - dann kommt ein Block Konvertierungsmeldungen. Wenn man den Code per Copy&Paste arbeiten lässt, dann geht es dennoch. Wenn man ihn als Lisp laufen lässt, dann verfängt er sich in einer Art Schleife, startet Laymrg+ mit unklaren Namen nochmals und öffnet noch dazu das Eigenschaftenfenster. Dann bleibt er stehen und hat gar nichts gemacht ... Irgendwie schmeckt ihm das invoke doch nicht ganz ... Ich werde nun die VLX von Thomas weiter verfolgen. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 11. Sep. 2007 16:37 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Anscheinend verhält sich die ActiveX Methode SendCommand aufgerufen aus Lisp doch ein wenig anders als ind er VBA Umgebung. In der VBA-Umgebung (Thisdrawing.Sendcommand ..) wird das ganze sofort ausgeführt, inder LISP-Umgebung wird anscheinend die einzelnen SendCommands erst abgearbeitet, wenn LISP komplett beendet ist. Das erklärt auch, warum zuerst die ganzen Princ kommen, und dann die Meldungen des Laymrg. Die komischen Sachen wie Propertyeditor usw. erkläre ich mir eher daher, dass aus irgeneinem Grund, die Abfrage des Laymrg nicht passen (z.B.: Ziellayer existiert nicht) und das e (für Eingabe) dann als befehl interpretiert wird ! ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 11. Sep. 2007 16:39 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von fuchsi: ...und das e (für Eingabe) dann als befehl interpretiert wird !
Ja - wahrscheinlich. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 05. Jun. 2008 12:24 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CADmium: ...der Aufruf (LAYMRG+ '("AM_1" "AM_2") "0") verschiebt alle Objekte von Layer "AM_1" und "AM_2" auf Layer "0"..
Da habe ich jetzt leider gewisse Hoppalas bemerkt: Layer 0 wird vom "normalen laymrg" nicht als Ausgangslayer akzeptiert, von laymrg+ aber schon. Wählt man als Startlayer einen, der gar keine Elemente hat, passsiert im "normalen" korrekterweise nichts.Bei Laymrg+ wird aber in beiden Fällen irgendwas (vor allem Attribute in Inserts) auf Irgendwas verschoben (ev. aktueller Layer?). Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |