| |  | 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
  
 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 / zitieren --> Unities abgeben:         
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
  
 Beiträge: 659 Registriert: 20.11.2006
|
erstellt am: 14. Feb. 2011 14:17 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
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
     

 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 / zitieren --> Unities abgeben:          Nur für MC
|
der_Wolfgang Moderator Tastenhauer
     
 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 / zitieren --> Unities abgeben:          Nur für MC
|
der_Wolfgang Moderator Tastenhauer
     
 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 / zitieren --> Unities abgeben:          Nur für MC
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 >>)
 |