Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  PTC Creo Elements/Programmierung
  Änderung eines Lisps zum Verschieben von Teilen

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 Creo
  
Optimieren Sie Ihr Rechenzentrumsn, eine Pressemitteilung
Autor Thema:  Änderung eines Lisps zum Verschieben von Teilen (748 mal gelesen)
MC
Mitglied
Dipl.Ing. Maschinenbau, Konstrukteur


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

Beiträge: 644
Registriert: 20.10.2000

System:
DELL Precision 5770, 32GB RAM
nVidia RTX A2000
Win10 Enterprise 64bit
SOLIDWORKS 2022 Premium SP5.0
Creo Elements/Direct Modeling (x64) 19.0 M030

erstellt am: 14. Feb. 2011 13:49    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


teile-in-bgr-verschieben_V2.lsp.txt

 
Hallo zusammen,
ich benutze regelmäßig ein nettes Lisp zum Verschieben von Teilen in eine wählbare Zielbaugruppe (siehe Anhang).

Das funktioniert aber leider nur, wenn die gewählten Teile in einer Baugruppe stecken und nicht, wenn diese im Root liegen.

Ich vermute, dass u.A. Zeile 71 - dort speziell die Formatierung des Pfadnamens über format nil Probleme macht:

Code:
(sd-call-cmds (CHANGE_PA_OWNER :New_owner (sd-inq-obj-pathname zielbaugruppe) :Parts_assemblies (format nil "~a/~a" (sd-inq-obj-pathname aktuellbaugruppe) tmpname)

Trotz einer Lisp-Schulung vor 4 Wochen, stehe ich gerade etwas auf dem Schlauch, wie ich dieses Problem nun lösen kann.

Ich dachte z.B. an eine Abfrage, ob der Ursprungspfad NIL ist und wenn dem so ist, einfach in dieser Art den "/" hinter der ersten Tilde weg zu lassen:

Code:
(when (aktuellbaugruppe NIL)
(progn
(sd-call-cmds
(CHANGE_PA_OWNER :New_owner (sd-inq-obj-pathname zielbaugruppe) :Parts_assemblies (format nil "~a~a" (sd-inq-obj-pathname aktuellbaugruppe) tmpname) )
) ;end sd-call
) ;progn
) ; end wenn nil
;else
(sd-call-cmds
(CHANGE_PA_OWNER :New_owner (sd-inq-obj-pathname zielbaugruppe) :Parts_assemblies (format nil "~a/~a" (sd-inq-obj-pathname aktuellbaugruppe) tmpname) )
:failure (sd-display-error (format nil "Fehler beim Verschieben von Objekt: ~s in die Zielbaugruppe: ~s" (sd-inq-obj-pathname item) (sd-inq-obj-pathname zielbaugruppe)))
;end when
) ;end sd-call
) ; end when

Leider läuft das Programm in einen Fehler, der mir sagt "Lisp-Fehler: too many arguments".
Ich hatte es zuvor schon mit einer "Case"-Anweisung versucht, aber das klappte irgendwie auch nicht.

Wo (außer vor dem Bildschirm   ) sitzt denn hier das Problem?

Danke im Voraus!

Gruß, Michael

------------------
Das maximale Volumen subterraner Agrarprodukte steht in reziproker Relation zur mentalen Kapazität des Produzenten.

[Diese Nachricht wurde von MC am 14. Feb. 2011 editiert.]

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

Patrick Weber
Mitglied
Konstruktionstechniker, Admin


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

Beiträge: 659
Registriert: 20.11.2006

erstellt am: 14. Feb. 2011 14:17    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 MC 10 Unities + Antwort hilfreich

Mangels Zeit konnte ich nur ein Auge darauf werfen, aber schau dir mal deine konditionellen Abschnitte an (when-Bedingung).

1. Du übergibst 2 Argumente: aktuellbaugruppe UND NIL. Hier darf nur ein Rückgabewert aufgelöst werden: t oder nil. Ich nehme an, dass du diese eigentlich vergleichen willst, also (aktuellbaugruppe = NIL).

2. "When" hat keinen else-Zweig. Nutze stattdessen "if".

(if (aktuellbaugruppe = nil)
  (progn ...)
  else
  (progn ...)
)
oder
(if (not (aktuellbaugruppe))
  (progn ...)
  else
  (progn ...)
)

------------------
Grüße aus Sachsen
pw

Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht!

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

Walter Geppert
Moderator
Frank und Frei




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

Beiträge: 2166
Registriert: 12.12.2000

Konstruktion von Sondermaschinen, Montageautomaten, Meß- und Prüfeinrichtungen, Vorrichtungen und Produktentwicklung mit Creo Elements/Direct Modeling 20.6, AdvancedDesign, Surfacing, Simulate, SolidPower, ModelManager auf
HP ZBook Fury 16 G9, Windows 10 Pro 64

erstellt am: 14. Feb. 2011 14:23    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 MC 10 Unities + Antwort hilfreich

(when) verwendet man, um eine Bedingung abzufragen und darauf entsprechend etwas zu tun oder aber eben nicht
Bei so einer Entscheidung, wie du sie brauchst verwende (if) wo je nach Eintreten der Bedingung das eine oder andere ausgeführt wird.
Gibt es mehr als eine Bedingung, die einander ausschliessen, kann man auch (cond) verwenden.
Beispiele dafür siehe auch genau.lsp oder feder.lsp

------------------
meine LISP-Makros sind auf osd.cad.de
Disclaimer
Grüße aus Wien

Walter
DC4 Technisches Büro GmbH

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

der_Wolfgang
Moderator
Tastenhauer


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

Beiträge: 2296
Registriert: 3.20.

● PE60+80@home
● W10 Pro Build10.0.19045.5737
● Drafting V17~V20.7@job
● Modeling V17~V20.7@job
● Windchill 12.1.2.6@job
● UWGM Client 13.0.0.1@job
● Taschenrechner
● Stift+Zettel V8.42

erstellt am: 14. Feb. 2011 21:16    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 MC 10 Unities + Antwort hilfreich

erstmal werfe ich noch
Code:
(unless <bedingung>  tuwas)
in die Runde, damit die Moeglichkeiten von Abfragen von Bedingungen etwas vollständiger werden.

------------------
Seamonkey Firefox Thunderbird ● OSD Hilfeseite (de) / help page (en)NotePad++

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

der_Wolfgang
Moderator
Tastenhauer


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

Beiträge: 2296
Registriert: 3.20.

● PE60+80@home
● W10 Pro Build10.0.19045.5737
● Drafting V17~V20.7@job
● Modeling V17~V20.7@job
● Windchill 12.1.2.6@job
● UWGM Client 13.0.0.1@job
● Taschenrechner
● Stift+Zettel V8.42

erstellt am: 14. Feb. 2011 21: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 MC 10 Unities + Antwort hilfreich

Michael, zieh's etwas mehr auseinader, der Unterschied in Deinen then und else zweig ist ja verdammt gering.

Code:
(setq moveObj (if aktuellbaugruppe
                  (format nil "~a/" (sd-inq-obj-pathname aktuellbaugruppe))
                "")
(setq moveObj (format nil "~a~a" moveObj tmpname))

nur geschrieben, nicht getestet, andere Varianten sind möglich.

Auf alle Fälle kannst du den REST vom sd-call-cmds, incl. dem Failure Teil EINMAL schreiben und in beiden fällen nutzen. -> vermeide duplizierten code

Code:
(let ((moveObj ""))
.....
(when aktuellbaugruppe
  (setq moveObj (format nil "~a/" (sd-inq-obj-pathname aktuellbaugruppe))))
.....
(setq moveObj (format nil "~a~a" moveObj tmpname))
) ;; end let

------------------
Seamonkey Firefox Thunderbird ● OSD Hilfeseite (de) / help page (en)NotePad++

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)2025 CAD.de | Impressum | Datenschutz