Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Autodesk Productstream Professional
  Abfrage ob Schriftkopf vorhanden ist und Aktion

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
  
Die Ähnlichkeit zu Productstream Professional ist bemerkenswert. (GAIN Collaboration,PDM,PDM System,PLM,PLM System)
Autor Thema:  Abfrage ob Schriftkopf vorhanden ist und Aktion (1112 mal gelesen)
dr.emmet
Mitglied



Sehen Sie sich das Profil von dr.emmet an!   Senden Sie eine Private Message an dr.emmet  Schreiben Sie einen Gästebucheintrag für dr.emmet

Beiträge: 27
Registriert: 11.01.2005

Server: Win2k3, SQL, Exchange
Client: WinXP, Compass Productstream 2008

erstellt am: 03. Mrz. 2009 10:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

Ich habe hier eine kleine Sache, bei der ich nicht weiterkomme, da mir die Lisp-Kenntnisse fehlen. vielleicht kann ja jemand weiterhelfen ;-)

Bei Freigabe eines Konstruktionsdokumentes wird ein Job ausgelöst. Dieser Job aktualisiert das Compass Schriftfeld und löst einen PDF-Druck-Job aus. Das ist wunderbar.
Jetzt haben wir aber ProE-DWGs in Compass einzubinden, die dort nur noch freigegeben werden sollen, sonst nix.
Da die DWGs aus ProE weder Blöcke, noch Compass-Schriftrahmen haben, funktioniert das herkömmliche Druckprogramm nicht, weil die Variablen aus dem Schriftkopf nicht da sind.
Also muss ein Script her, welches prüft, ob ein compass Schriftrahmen da ist oder nicht.
Wenn nicht, soll das von uns neu gebastelte Script (proe-druck.lsp) ausgeführt werden, ansonnsten das bisherige (compass-druck.lsp).
Beim Druckbefehl an den Jobserver wird lediglich eine scr-Datei ausgeführt, die das eigentliche Druckprogramm mit "load....*.lsp" lädt und eine Variable "Druckername" übergibt. Nun denke ich, dass es sinvoll ist, hier eine Abfrage einzubauen, die entweder Load "proe" oder "load "compass" macht.
Ist so etwas möglich? Bin für jede hilfe dankbar.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

WolfgangE
Mitglied



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

Beiträge: 1006
Registriert: 29.01.2003

erstellt am: 03. Mrz. 2009 18:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für dr.emmet 10 Unities + Antwort hilfreich

Servus dr.emmet,

meine letzte Autolisp-Routine ist zwar schon eine Weile her, und mangels Autocad kann ich es auch nicht testen, aber ich denke, folgende Zeilen sollten eigentlich schon genügen (google sei Dank    )

;; Schriftfeld suchen
(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "NameDesSchriftfelds"))))

;; Prüfung, ob Schriftfeld gefunden wurde
(IF BlockFound  (COMMAND "load ....") ;;Anweisung, wenn Schriftfeld gefunden wurde
  (COMMAND "load ....") ;;Anweisung, wenn Schriftfeld NICHT gefunden wurde
) ;; End If

(SETQ BlockFound nil)

------------------
An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

dr.emmet
Mitglied



Sehen Sie sich das Profil von dr.emmet an!   Senden Sie eine Private Message an dr.emmet  Schreiben Sie einen Gästebucheintrag für dr.emmet

Beiträge: 27
Registriert: 11.01.2005

Server: Win2k3, SQL, Exchange
Client: WinXP, Compass Productstream 2008

erstellt am: 04. Mrz. 2009 12:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Vielen Dank. Das ist genau das, was ich gebraucht habe (*notier im kleinen Büchlein*)
Da aber im Ergebnisfall ein command und eine Parameterübergabe  ausgeführt werden müssen, ist hier die Frage, ob ich die Befehle einfach hintereinander schreiben kann, da es außer einem Absatz keine Trennung des wenn-dann Ereignisses gibt, wie z.b. bei basic ein "then".
Alternative wäre eine "if then goto, else goto"-Lösung.

Original: der "pdferzeugen.scr"
(load "S:/PSC2008/PLOT_ACAD.lsp")  -> Hier werden Plotter und Papierformate definiert, sowie Drehung und Papiergrößen geregelt
(plotter "PDF_XCHANGE")                     -> hier wird der aktuelle Drucker als Parameter übergeben.
_quit
j

neue scr-Datei:
(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMEN"))))
(IF BlockFound  (COMMAND "load "s:\easy2008\mitrahmen.lsp")               hier muss noch der Übergabeparameter hin
(COMMAND "load s:\easy2008\ohnerahmen.lsp")
) ;; End If                                                                                                   (gehören die Semikolons da hin?)
(SETQ BlockFound nil)
_quit
j

Wie baue ich die Parameterübergabe ein?
Die geschichte mit dem "ohnerahmen.lsp" habe ich schon geregelt.  Hier haben wir ein Lisp-Script, welches Werte aus der Geometrie ausliest und als Variablen zur Verfügung stellt, die in der letzten Zeile des codes mit einem "Command" einen Druckbefehl basteln. Funktioniert tipp-topp

Ende der Fahnenstange für mich.
(Sollte wohl doch noch einen Kurs machen)
Wie mache ich jetzt weiter?
Vielen Dank


[Diese Nachricht wurde von dr.emmet am 04. Mrz. 2009 editiert.]

[Diese Nachricht wurde von dr.emmet am 04. Mrz. 2009 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

WolfgangE
Mitglied



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

Beiträge: 1006
Registriert: 29.01.2003

erstellt am: 04. Mrz. 2009 14:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für dr.emmet 10 Unities + Antwort hilfreich

Servus dr.emmet,

die IF-Anweisung in Autolisp funktioniert tatsächlich ohne ein "then" oder Ähnliches. Die erste Zeile nach dem IF entspricht dem "then"-Teil, die zweite Zeile dem "else"-Teil. In dieser Form kannst du tatsächlich immer nur Anweisung pro Block verwenden.

Wenn du in einem der Blöcke mehrere Anweisungen benötigst, so musst du diese Anweisungen zusammenfassen. Dafür gibt's die Funktion (PROGN).
Schau dazu mal da rein: http://www.autolisp-tutorial.mapcar.net/verzweigungen2.html

Dein Skript müsste also in etwa so aussehen:
(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMEN"))))

(IF BlockFound
  (PROGN
    (COMMAND "load "s:\\easy2008\\mitrahmen.lsp")
    (COMMAND "load S:\\PSC2008\\PLOT_ACAD.lsp")
    (plotter "PDF_XCHANGE")
  ) ;; end progn
  (COMMAND "load s:\easy2008\ohnerahmen.lsp")
) ;; End If

(SETQ BlockFound nil)
_quit
j


Ich bin mir übrigens nicht mehr sicher, wie es mit den Backslashes bei Pfadangaben aussieht. Wenn ich mich recht erinnere, funktioniert ein einfaches "\" nicht, entweder doppelt "\\" oder stattdessen einen Schrägstrich "/".

Mit den Strichpunkten kannst in AutoLisp Kommentare schreiben. AutoLisp braucht z.B. am Ende der IF-Anweisung nur eine einfach Klammer, das wird dann schnell unübersichtlich, deshalb als Kommentar das "end if", das aber in der Funktionalität keinen Unterschied macht.

Noch ein Tipp: Die COMMAND-Anweisung übergibt jeden einzelnen Parameter an die Eingabezeile von AutoCad. Somit kannst du auch über die COMMAND-Anweisung mehrere Befehle ausführen lassen.
(COMMAND "Anweisung1" "Anweisung2" "Anweisung3" ....)

Ciao, WolfgangE

------------------
An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

dr.emmet
Mitglied



Sehen Sie sich das Profil von dr.emmet an!   Senden Sie eine Private Message an dr.emmet  Schreiben Sie einen Gästebucheintrag für dr.emmet

Beiträge: 27
Registriert: 11.01.2005

Server: Win2k3, SQL, Exchange
Client: WinXP, Compass Productstream 2008

erstellt am: 05. Mrz. 2009 11:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Super, vielen Dank. Das ist genau, was ich brauche.
mit der Command-Anweisung bin ich ein wenig vertraut, so endet unsere "mitrahmen.lsp" auf ein
(command "_-plot" "J" "Model" "PDF_XCHANGE" format "M",...usw.
Mein Problem ist jetzt noch, dass Acad die Befehle des von dir vorgeschlagenenen Scriptes wohl nicht interpretiert. es gibt folgende Ausgabe:

Befehl: (SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMEN"))))
nil
Befehl: (IF BlockFound
(_>   (PROGN
((_>     (COMMAND "load "S:/PSC2008/btl/PLOT_ACAD.lsp"")
((_>     (btlplt "PDF_XCHANGE")
((_>   ) ;; end progn
(_>   (COMMAND "load "S:/PSC2008/btl/rahmen.lsp"")
(_> ) ;; End If
load  Unbekannter Befehl "LOAD ". Drücken Sie F1-Taste für Hilfe.
Befehl:
Befehl: _HELP
Befehl: nil
Befehl: BEFEHLSZEILE

Vielleicht mein Fehler, oder?
Der Jobserver startet Autocad wie folgt:
"c:\Programme\AutoCAD_2008\acad.exe" "$TargetFile" /nologo /p ACAD2006 /b "S:/psc2008/BTL/pdferzeugen_proe.scr";
hierbei ist das Targetfile die betroffene Datei, und die scr-Datei das hier von dir genannte script.
Ich war davon ausgegangen, dass die scr-Datei auch ein lisp-script ist. Autocad kann das jedoch scheinbar nicht interpretieren.

Wo genau liegt der Unterschied zeischen der geladenen scr-Datei und der Lisp-Datei (Programmiersprache?)

Vielen Dank

Ach ja, und muss man nicht nach dem "Load" Command eine Art "goto Ende" einbauen, damit nach Ausführung des Befehls nicht doch noch der Rest vom Code ausgeführt wird?!? 

[Diese Nachricht wurde von dr.emmet am 05. Mrz. 2009 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

WolfgangE
Mitglied



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

Beiträge: 1006
Registriert: 29.01.2003

erstellt am: 05. Mrz. 2009 13:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für dr.emmet 10 Unities + Antwort hilfreich

Den genauen Unterschied zwischen SCR- und Lisp-Datei kann ich dir nicht erklären, aber es könnte schon sein, dass beim Aufruf der acad.exe nur eine SCR-Datei zum Laden angegeben werden kann. In unserem Fall müsste es sich aber ziemlich gleich bleiben, auch eine SCR-Datei arbeitet nur der Reihe nach die Befehle ab, die drin stehen, wenn ich mich recht erinnere.

Das Skript bringt den Fehler, dass es den Load-Befehl nicht kennt, da liegt der Fehler wohl auf meiner Seite. Ich denke schon, dass es auch mit dem COMMAND funktionieren müsste, aber da müssten dann wohl die Anführungszeichen korrekt gesetzt werden.
(COMMAND "load" "S:/PSC2008/btl/PLOT_ACAD.lsp")

Ansonsten ersetze die Zeile einfach durch folgende:
(load "S:/PSC2008/btl/PLOT_ACAD.lsp")

Dasselbe natürlich auch für die rahmen.lsp

Ob du nach dem LOAD noch ein GOTO oder Ähnliches benötigst hängst sehr vom Aufbau deiner Skripten ab. Fakt ist, wenn du eine LSP-Datei mit LOAD aufrufst, werden alle Anweisungen, die dort drinstehen, der Reihe nach ausgeführt.
Danach wird das Skript an der Stelle weitergeführt, an der das LOAD durchgeführt wurde.

In deinem Fall also:
Wenn der Block gefunden wird, wird die PLOT_ACAD.lsp geladen und alle Befehle in dieser Datei werden ausgeführt. Anschließend wird die Anweisung (btlplt "PDF_XCHANGE") ausgeführt, danach wird am Ende der IF-Anweisung weiter gemacht.

Hoffe geholfen zu haben. Ciao, WolfgangE

------------------
An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

dr.emmet
Mitglied



Sehen Sie sich das Profil von dr.emmet an!   Senden Sie eine Private Message an dr.emmet  Schreiben Sie einen Gästebucheintrag für dr.emmet

Beiträge: 27
Registriert: 11.01.2005

Server: Win2k3, SQL, Exchange
Client: WinXP, Compass Productstream 2008

erstellt am: 05. Mrz. 2009 15:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Und wieder ein Volltreffer, nach einigem Suchen und herumdocktoren habe ich aus dem Code folgendes gemacht:

(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMENA2"))))
(IF BlockFound
(PROGN
(load "S:/PSC2008/btl/PLOT_ACAD.lsp")
(btlplt "PDF_XCHANGE")
) ;; end progn
(load "S:/PSC2008/btl/rahmen.lsp")
) ;; End If
(SETQ BlockFound nil)
_quit
j

Jetzt werden pdfs erstellt, egal ob der gefragte Rahmen (hier RAHMENA2) vorhanden ist oder nicht.
verbleibt noch eine Frage.
Der Block heißt natürlich nur bei A2-Zeichnungen so, sonst anders (logisch). Kann man die Frage erweitern um weiter Formate?

Viele Grüße und nochmals vielen vielen Dank

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

WolfgangE
Mitglied



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

Beiträge: 1006
Registriert: 29.01.2003

erstellt am: 06. Mrz. 2009 11:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für dr.emmet 10 Unities + Antwort hilfreich

Das kommt wohl sehr darauf an, wo und wie du die Information, um welches Format es sich handelt, gespeichert ist. Wenn in PSP, lässt es sich über den Jobserver als Variable übergeben, ansonsten musst das Format in der Zeichnung irgendwo raussuchen.
Wenn in der Zeichnung, ist die Information direkt am Block selbst verankert oder möchtest ein Attribut dazu auslesen?

Ist die Information direkt im Block gespeichert, müsste man die SSGET-Anweisung um die entsprechenden DXF-Codes erweitern, möchtest du ein Attribut durchlesen, müsste man mit ENTNEXT die Attribute des Blockes in einer Schleife durchlaufen lassen, bis das richtige Attribut gefunden wurde, um dann dessen Wert auszulesen.

Ciao, WolfgangE

------------------
An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

dr.emmet
Mitglied



Sehen Sie sich das Profil von dr.emmet an!   Senden Sie eine Private Message an dr.emmet  Schreiben Sie einen Gästebucheintrag für dr.emmet

Beiträge: 27
Registriert: 11.01.2005

Server: Win2k3, SQL, Exchange
Client: WinXP, Compass Productstream 2008

erstellt am: 06. Mrz. 2009 12:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo und nochmals vielen Dank

die Information, welches Papierformat erstellt werden soll, wird ausschließlich aus dem Vorhandensein eines Blockes mit dem Namen "RAHMENpapierformat" abgeleitet.
Dies funktioniert einwandfrei, wenn ich den Block in der scr definiere und der Blockname in der Zerichnug enthalten ist. Ändere ich den Blocknamen in der Zeichnung, oder den Namen des Blockes ind er scr, geht das script den anderen ("then"-) Weg. Das ist perfekt gelöst.
Jetzt muss aber nicht nur das Vorhandesein eines Blockes geprpüft werden, sondern auch eine verschachtelte Abfrage nach dem Namen erfolgen.
Ich habe mal dieses hier konstruiert:

(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMENA0"))))
(IF BlockFound
(PROGN
(load "S:/PSC2008/btl/PLOT_ACAD.lsp")
(btlplt "PDF_XCHANGE")
) ;; end progn
     (SETQ BlockFound nil)
     (SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMENA1"))))
     (IF BlockFound
     (PROGN
     (load "S:/PSC2008/btl/PLOT_ACAD.lsp")
     (btlplt "PDF_XCHANGE")
     ) ;; end progn
     (load "S:/PSC2008/btl/rahmen.lsp")
     ) ;; End If
(load "S:/PSC2008/btl/rahmen.lsp")
) ;; End If
(SETQ BlockFound nil)
_quit
j

Leider nicht so ergiebig wie im guten alsten Basic. Das script wird nicht ausgeführt.

Als Alternative dachte ich an:
(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMENA0") (3 . "RAHMENA1") (4 . "RAHMENA4"))))

geht auch nicht.

Wie mache ich jetzt weiter?

(ein ahnungsloser LISP -er)     

[Diese Nachricht wurde von dr.emmet am 06. Mrz. 2009 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

dr.emmet
Mitglied



Sehen Sie sich das Profil von dr.emmet an!   Senden Sie eine Private Message an dr.emmet  Schreiben Sie einen Gästebucheintrag für dr.emmet

Beiträge: 27
Registriert: 11.01.2005

Server: Win2k3, SQL, Exchange
Client: WinXP, Compass Productstream 2008

erstellt am: 06. Mrz. 2009 13:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Wenn man in der Zeile

(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMENA1"))))

bei RAHMENA1 die Nummer des Formates durch ein Sternchen ersetzt

(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMENA*"))))

dann klappt es ohne weitere Schleifen oder Abfragen. Ich teste das noch.

[Diese Nachricht wurde von dr.emmet am 06. Mrz. 2009 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

WolfgangE
Mitglied



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

Beiträge: 1006
Registriert: 29.01.2003

erstellt am: 06. Mrz. 2009 21:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für dr.emmet 10 Unities + Antwort hilfreich

servus dr.emmet,

es ist tatsächlich so, dass die SSGET-Anweisung unter anderem mit Joker-Zeichen funktioniert. Zum Verständnis:
Eine ACad-Zeichung ist im Prinzip eine Datenbank, die verschiedenste Objekte enthält. Die Beschreibung der Objekte erfolgt über die sogenannten DXF-Codes. Die SSGET-Anweisung ist nichts anderes als eine Filter-Abfrage auf die Zeichnungsdatenbank (ähnlich einer SQL-Select-Anweisung mit Where-Bedingung auf die SQL-Datenbank).
In dieser speziellen Datenbank erfolgt der Filter über die DXF-Codes. Wir sagen, der Code 0 soll "INSERT" sein, und der Code 2 soll der Namen des Rahmens sein. Und dieser Name kann eben auch Wilcards enthalten. Mit der Anweisung
(SSGET "X" '((0 . "INSERT") (2 . "RAHMEN*")))
findest du eben alle Blöcke, deren Name mit "Rahmen" anfängt.

Aufpassen musst nur, wenn es mehrere Schriftfelder in der Zeichnung gibt, die mit "RAHMEN" anfangen, dann funktioniert unser bisheriges Skript nämlich nicht mehr. So lange nur genau 1 Schriftfeld gefunden wird, sollte das aber passen.

Dein Versuch der verschachtelten IF-Anweisung kann so nicht funktionieren, weil schon allein die ganzen Klammern nicht mehr stimmen. Ein "elseif" wie es in anderen Skript- und Programmiersprachen findest, gibt es genau in der Form nicht.
Dein Versuch lässt sich etwas einfacher gestalten, indem wir einfach eine OR-Abfrage verwenden:

(IF
  (OR
    (= BlockFound "RAHMENA0")
    (= BlockFound "RAHMENA2")
    (= BlockFound "RAHMENA3")
  );; end or
  (PROGN
    (load "S:/PSC2008/btl/PLOT_ACAD.lsp")
    (btlplt "PDF_XCHANGE")
  ) ;; end progn
  (load "S:/PSC2008/btl/rahmen.lsp")
) ;; End If

Das "elseif" bringst du am ehesten noch mit COND hin, hier ein Beispiel dazu: http://www.autolisp-tutorial.mapcar.net/verzweigungen3.html

Deine Alternative mit
(SETQ BlockFound (SSGET "X" '((0 . "INSERT") (2 . "RAHMENA0") (3 . "RAHMENA1") (4 . "RAHMENA4"))))
stimmt zwar von der Logik, wird aber so nicht funktionieren. Der 2er ist keine Aufzählung, sondern der zu Beginn erwähnte DXF-Code. Der 2er heißt, dass es sich bei der Angabe um den Namen handelt, und nicht beispielsweise um den Startpunkt oder den Layer des Objekts.
Allerdings kann die SSGET-Anweisung auch in dieser Hinsicht entsprechend angepasst werden:


(setq BlockFound
  (ssget "X" '(
    (0 . "INSERT")
    (-4 . "<OR")
      (2 . "RAHMENA0")
      (2 . "RAHMENA1")
      (2 . "RAHMENA2")
    (-4 . "OR>")
  )))

Damit findet die SSGET-Anweisung alle Blöcke, die entweder "RAHMENA0" oder "RAHMENA1" oder "RAHMENA2" heißen.

Ciao, WolfgangE

------------------
An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz