| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für PTC CREO |
| |
 | MAIT erhält den Abas Partner Performance Award 2025, eine Pressemitteilung
|
Autor
|
Thema: Lisp zum Verschieben von Teilen mit Namen-Generierung? (2033 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. Jun. 2005 08:27 <-- editieren / zitieren --> Unities abgeben:         
Guten Morgen allerseits, ich versuche gerade eine Programm zu schreiben, das mir alle Teile, die einen gewissen Namen haben, in eine zu wählende Baugruppe verschiebt. Durch ein paar Beispiele von anderen bin ich schon auf dem halben Weg, aber es fehlt mir jetzt eine Abfrage, ob der Teilename schon in der Zielbaugruppe existiert. Ist das der Fall, bekommt das Teil den Namen T1 etc. In diesem Fall möchte ich den originalen Namen mit einem Zähler am Ende erweitern, der dann immer weiter hoch gezählt wird. Hintergrund ist, daß wir Verschraubungen (z.B. Schraube, Scheibe, Mutter) über Cadenas erstellen und für diese Verschraubungen immer Baugruppen angelegt werden, die uns im Zusammenspiel mit dem Modelmanager dann beim Erstellen der Stücklisten Probleme machen, da wir dann für jede Verschraubung eine extra Stückliste erstellen müßten, was ja Unsinn ist. Also möchte ich alle Teile, und nur die Teile nicht die einzelnen Baugruppen, die z.B. "Cadenas" in ihrem Namen haben in eine eigene Baugruppe verschieben. Weiterhin haben diese Teile einer Verschraubungs-Baugruppe immer den gleichen Namen, also immer Schraube, Scheibe, Mutter ohne Zähler hinten dran und es handelt sich dann in der Regel um Exemplare, wenn von einer Verschraubung mehrere auf ein Mal erstellt wurden. Mit dem angehängten Programm werden die gefundenen Teile zwar verschoben, aber es wird leider der Name T1.... bei doppelt vorhandenen vergeben. Wie kann ich denn eine Abfrage mit Zähler-Generierung dort am besten einbauen? Ich hoffe, es ist klar geworden, worum es geht und es gibt jemanden, der mir helfen kann. Mein Lisp ist hier etwas zu dünn. Vielen Dank schonmal, Michael ------------------ Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (A. Einstein) [Diese Nachricht wurde von MC am 14. Jun. 2005 editiert.] 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
|
erstellt am: 14. Jun. 2005 09:22 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
Code: (sd-gen-obj-basename type :parent parent :prefix prefix)Description: Generates a unique object basename which may be used as child name of a new object in parent. If prefix is not given, the name will be generated using the defaults which correspond to type. Parameters: type {KEYWORD} used to determine the default prefix of the object name if prefix is set to nil. One of the following keywords is allowed: * :part * :assembly * :container * :workplane * :wpset * :view-set * :docuplane-set * :coordinate-system :parent {SEL_ITEM or STRING ["/" or nil]} If this parameter is omitted and type is one of :part, :assembly, :container, :workplane or :wpset, this parameter defaults to "/". If type is set to :layout this parameter must be set to either a part or assembly string or sel_item. In all other cases this parameter may be either an object sel_item or the full path to an object as string (e.g. "/a1/p1"). :prefix {STRING} Overwrites the system default prefixes for the different object types. This string must be a valid SolidDesigner object name (part). Note: Prefix strings starting with a "/" are not allowed. If you want to generate a whole new pathname and not only the basename use in addition to this function the function sd-pathlist-to-pathname. Return Value: basename {STRING} - the system generated string nil - if something failed
------------------ meine LISP-Makros sind auf Heikos Hilfeseite Grüße aus Wien Walter DC4 Technisches Büro GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rmcc1980 Mitglied Ingenieur
 
 Beiträge: 358 Registriert: 06.06.2003 Drafting 18.1 Modeling 18.1 MM Win7 64
|
erstellt am: 15. Jun. 2005 08:19 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
|
MC Mitglied Dipl.Ing. Maschinenbau, Konstrukteur
  
 Beiträge: 644 Registriert: 20.10.2000
|
erstellt am: 20. Jul. 2005 07:05 <-- editieren / zitieren --> Unities abgeben:         
Hallo Lisp-Kenner, ich habe jetzt mal mit dieser Thematik auseinandergesetzt, diverse Lisp-Seiten gelesen, alte Programme auseinandergepflückt, aber ich stehe immer noch vorm Berg ... Mit (sd-gen-obj-basename type : parent parent : prefix prefix) habe ich zwar rumprobiert, aber so wirklich klappt das nicht. Mir ist auch nicht klar, ob das mit dem "mapc" überhaupt funktioniert, geschweige denn, was das überhaupt so genau macht. Wäre denn jemand in der Lage mir da nochmal etwas mehr Starthilfe zu geben? Ich brauche "nur" noch den Teil, der mir die vorhandenen Dubletten rausfiltert und die Zähler vergibt. Vielen Dank an alle Helfer, Michael ------------------ Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (A. Einstein) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RainerH Mitglied Techn. Ang. (Konstruktion)
  
 Beiträge: 736 Registriert: 22.01.2003 OSDM 14.00A OSDD 14.50 MM 14.00A Windows-XP Pro x64 Edition -------------------------- HP xw6400 Intel Xeon 3.00 GHz 4.00 GB RAM ATI FireGL V7200
|
erstellt am: 20. Jul. 2005 15:24 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
@Michael Habe dein Lsip mal angepasst - muesste eigentlich nun funktionieren: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Beschreibung: Verschiebt Teile/Baugruppen, die eine Bestimmte Suchvorgabe erfüllen ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (in-package :custom) (use-package :oli) (sd-defdialog 'Teile_verschieben :dialog-title "Teile verschieben" :toolbox-button t :variables '(("Ausgangs - Angaben") (objekte ;;:value-type :part-assembly :selection (*sd-assembly-seltype* *sd-part-seltype*) :title "Teil(e)/Bgr." :initial-value nil :modifies nil :multiple-items t :prompt-text "Teil(e)/Baugruppe(n) zum verschieben angeben." :show-select-menu t :incremental-selection t ) (suchmuster :value-type :string :proposals '("*.*" "a" "b" "c" "d" ) :auto-add-proposal t :proposals-order :new-input-at-top :title "Suchmuster" :prompt-text "Suchmuster incl. Platzhalter * ? [0-9] ... eingeben. (Gross- und Kleinschreibung beachten)" ) ("Ziel - Angaben") (zielbaugruppe :value-type :assembly :title "Ziel-Bgr." :initial-value nil :prompt-text "Zielbaugruppe angeben." ) ) :local-functions '((verschieben (item) (let (objektname_mit_zaehler stueckzaehler aktuellbaugruppe objektname objektname_mit_zaehler tmpname) (progn (when (sd-string-match-pattern-p suchmuster (sd-inq-obj-basename item)) (progn (setf objektname_mit_zaehler nil) (setf stueckzaehler 0) (setf aktuellbaugruppe (sd-inq-parent-obj item)) (setf objektname (sd-inq-obj-basename item)) (setf objektname_mit_zaehler (sd-inq-obj-basename item)) (loop ;; Pruefen, ob ein solches Objekt in der Zielbaugruppe vorhanden ist (if (sd-pathname-to-obj (format nil "~a/~a" (sd-inq-obj-pathname zielbaugruppe) objektname_mit_zaehler)) (progn ;; Wenn bereits vorhanden, dann Stueckzaehler erhoehen und neuen Objektnamen generieren (setf stueckzaehler (+ stueckzaehler 1)) (setf objektname_mit_zaehler (format nil "~a.~a" objektname stueckzaehler)) ) (progn ;; Wenn noch kein Objekt in der Zielbaugruppe vorhanden, dann das Objekt zum verschieben in einen "tmpname" umbenennen (setf tmpname (format nil "tmp__~a" objektname_mit_zaehler)) (sd-call-cmds (change_name_pa :part_asmb item :name tmpname) :failure (sd-display-error (format nil "Fehler beim Umbenennen in den temporaeren Objektnamen: ~s" tmpname)) ) ;; "tmpname"-Objekt in die Zielbaugruppe verschieben (sd-call-cmds (CHANGE_PA_OWNER :parts_assemblies (format nil "~a/~a" (sd-inq-obj-pathname aktuellbaugruppe) tmpname) :new_owner (sd-inq-obj-pathname zielbaugruppe)) :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))) ) ;; "tmpname"-Objekt in der Zielbaugruppe in den generierten Namen aendern (sd-call-cmds (change_name_pa :part_asmb (format nil "~a/~a" (sd-inq-obj-pathname zielbaugruppe) tmpname) :name objektname_mit_zaehler) :failure (sd-display-error (format nil "Fehler beim Umbenennen in den generierten Objektnamen: ~a" objektname_mit_zaehler)) ) (return) ;; Ausstieg ) ) ) ) ) ) ) ) ) :ok-action '(mapc #'verschieben objekte) ) HTH Gruss RainerH. [EDIT-1] Keine Ahnung, warum die Einrueckungen hier nicht ankommen ... [EDIT-2] Komischerweise funktioniert es nach dem editieren ... [EDIT-3] Funktion LISP korrigiert [Diese Nachricht wurde von RainerH am 20. Jul. 2005 editiert.] [Diese Nachricht wurde von RainerH am 20. Jul. 2005 editiert.] [Diese Nachricht wurde von RainerH am 21. Jul. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MC Mitglied Dipl.Ing. Maschinenbau, Konstrukteur
  
 Beiträge: 644 Registriert: 20.10.2000
|
erstellt am: 21. Jul. 2005 08:11 <-- editieren / zitieren --> Unities abgeben:         
Hallo Rainer! Also vorab will ich mich erstmal bei Dir für Deine Arbeit bedanken. Das war ja superschnell und richtig aufwendig. Danke!! Vor allem die Geschichte mit dem "proposals" etc. kannte ich noch nicht und kann ich bestimmt sehr gut mal woanders wieder gebrauchen. Ich muß aber nochmal rumnerven, da es leider nicht ganz oder nicht immer das macht, was ich benötige. Ich habe mal 3 Bilder angehängt, damit Du siehst wie die Ausgangssituation ist, und was ich vorhatte. Ich glaube, das es nur ein kleines Problem ist, aber bin mir nicht sicher. Das Programm scheint den Zähler irgendwie nicht zu setzen, wenn gleichnamige Teile vorhanden sind und konnte mit vorangegangener Fehlermeldung (siehe Bild) den "tmp__"-Namen nicht wieder zurückumbenennen. Kannst Du mir sagen, woran das liegen könnte? Vielen Dank im Voraus, Michael ------------------ Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (A. Einstein) [Diese Nachricht wurde von MC am 21. Jul. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RainerH Mitglied Techn. Ang. (Konstruktion)
  
 Beiträge: 736 Registriert: 22.01.2003 OSDM 14.00A OSDD 14.50 MM 14.00A Windows-XP Pro x64 Edition -------------------------- HP xw6400 Intel Xeon 3.00 GHz 4.00 GB RAM ATI FireGL V7200
|
erstellt am: 21. Jul. 2005 08:24 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
|
MC Mitglied Dipl.Ing. Maschinenbau, Konstrukteur
  
 Beiträge: 644 Registriert: 20.10.2000
|
erstellt am: 21. Jul. 2005 08:28 <-- editieren / zitieren --> Unities abgeben:         
|
RainerH Mitglied Techn. Ang. (Konstruktion)
  
 Beiträge: 736 Registriert: 22.01.2003 OSDM 14.00A OSDD 14.50 MM 14.00A Windows-XP Pro x64 Edition -------------------------- HP xw6400 Intel Xeon 3.00 GHz 4.00 GB RAM ATI FireGL V7200
|
erstellt am: 21. Jul. 2005 09:47 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
@Michael Ich habe den Fehler gefunden ! (Habe bei der Zielbaugruppen-Abfrage ein SEL_ITEM mit Teilenamen kombiniert ...) Das gepostete LISP habe ich dazu editiert ! Bitte probier es nochmals aus ... Gruss RainerH. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MC Mitglied Dipl.Ing. Maschinenbau, Konstrukteur
  
 Beiträge: 644 Registriert: 20.10.2000
|
erstellt am: 21. Jul. 2005 10:12 <-- editieren / zitieren --> Unities abgeben:         
Weltklasse!!! Vielen Dank, das ist genau das, was ich gesucht habe und es funktioniert wunderbar! Mal noch am Rande eine Frage an den Lisp-Profi: Mit diesem Programm werden wir, wie oben beschrieben, diverse Schraubverbindungen, die Cadenas generiert hat, in eine Zielbaugruppe verschieben. Diese einzelnen Schraubverbindungsteile (z.B. Schraube, Scheibe, Mutter etc.) haben dann einen Namen, den wir evtl. ändern müssen. Du hast ja in dem Programm die Teile schon temporär umbenannt, wenn ich das richtig verstanden habe. Ich habe mal einen Befehl gesehen, mit dem man Teile so umbennen kann, das immer ein bestimmter Teil des Namens abgeschnitten wird, bzw. stehen bleibt. Kennst Du den Befehl? Ich finde ihn nicht wieder. Vielleicht kann ich den noch irgendwo einbauen. Was ich auch noch einbauen muß, ist eine Funktion, die die leeren Baugruppen löscht. Wie das geht, habe ich glaube ich auch schonmal im Forum gelesen. Grüße aus Braunschweig, Michael ------------------ Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (A. Einstein) [Diese Nachricht wurde von MC am 21. Jul. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RainerH Mitglied Techn. Ang. (Konstruktion)
  
 Beiträge: 736 Registriert: 22.01.2003 OSDM 14.00A OSDD 14.50 MM 14.00A Windows-XP Pro x64 Edition -------------------------- HP xw6400 Intel Xeon 3.00 GHz 4.00 GB RAM ATI FireGL V7200
|
erstellt am: 21. Jul. 2005 10:39 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
@Michael Freut mich, dass es nun funktioniert ! 1.) Lisp-Profi bin ich keiner ! (mach es nur so nebenbei als ... aber trotzdem Danke fuer die Blumen) 2.) Schau dir anstelle von CADENAS mal SolidPower von Techsoft an 3.) Zum abschneiden/ausschneiden des Teilenamen kannst du folgende Befehle verwenden : "sd-string-match-pattern-p" "sd-string-replace" oder auch: (subseq "Teststring" 1 5) => "ests" SUBSEQ Sequenz Start &optional Ende Diese Funktion liefert als Wert den Abschnitt von Sequenz, der durch Start (inklusive) und Ende (exklusiv) begrenzt wird. HTH Gruss RainerH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MC Mitglied Dipl.Ing. Maschinenbau, Konstrukteur
  
 Beiträge: 644 Registriert: 20.10.2000
|
erstellt am: 21. Jul. 2005 10:58 <-- editieren / zitieren --> Unities abgeben:         
Hallo Rainer, zu1: Ehre, wem Ehre gebührt zu2: Daran habe ich auch schon gedacht, mal sehen was die nächsten Jahre so bringen. zu3: Die Befehle muß ich mal ausprobieren. Zur Zeit bin ich schon sehr glücklich mit der aktuellen Version (never touch a working system) Gruß, Michael ------------------ Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (A. Einstein) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RainerH Mitglied Techn. Ang. (Konstruktion)
  
 Beiträge: 736 Registriert: 22.01.2003 OSDM 14.00A OSDD 14.50 MM 14.00A Windows-XP Pro x64 Edition -------------------------- HP xw6400 Intel Xeon 3.00 GHz 4.00 GB RAM ATI FireGL V7200
|
erstellt am: 21. Jul. 2005 11:00 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
|
MC Mitglied Dipl.Ing. Maschinenbau, Konstrukteur
  
 Beiträge: 644 Registriert: 20.10.2000
|
erstellt am: 21. Jul. 2005 11:09 <-- editieren / zitieren --> Unities abgeben:         
Zitat:
Gilt das auch fuer LISP-Programme ?? (wenn man sich die funktionierenden vorher sichert)
Natürlich nicht wirklich, aber ich werde das Programm auch für meine Kollegen hier bereitstellen und bin froh, wenn ich da erstmal den Durchblick durch das aktuelle habe. Jede nicht wirlich funktionierende Änderung wird dann für mich zu Mehrarbeit führen. Wenn ich mal wieder mehr Zeit für Versuche habe, muß ich das aber mal probieren. Gruß, Michael ------------------ Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (A. Einstein) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RainerH Mitglied Techn. Ang. (Konstruktion)
  
 Beiträge: 736 Registriert: 22.01.2003 OSDM 14.00A OSDD 14.50 MM 14.00A Windows-XP Pro x64 Edition -------------------------- HP xw6400 Intel Xeon 3.00 GHz 4.00 GB RAM ATI FireGL V7200
|
erstellt am: 21. Jul. 2005 11:10 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
|
RainerH Mitglied Techn. Ang. (Konstruktion)
  
 Beiträge: 736 Registriert: 22.01.2003 OSDM 14.00A OSDD 14.50 MM 14.00A Windows-XP Pro x64 Edition -------------------------- HP xw6400 Intel Xeon 3.00 GHz 4.00 GB RAM ATI FireGL V7200
|
erstellt am: 21. Jul. 2005 13:34 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
@Michael Etwas hab ich noch fuer dich: Mit dem Einbau dieser Funktion kannst du noch die Auswahl der zu verschiebenden Objekte vorher auflisten lassen: einfach bei den :local-functions nach (suchmuster... ) einfuegen (objekte_listen :title "Auswahl auflisten" :toggle-type :wide-toggle :push-action (progn (when (and objekte suchmuster ) (progn (display "----------------------------------------------------------------------------") (display (format nil "Objekte, welche nach Suchmuster: ~s verschoben werden:" suchmuster)) (display "----------------------------------------------------------------------------") (dolist (objekt objekte) (progn (when (sd-string-match-pattern-p suchmuster (sd-inq-obj-basename objekt)) (display (sd-inq-obj-basename objekt)) ) ) ) (display "----------------------------------------------------------------------------") ) ) ) ) Vielleicht kannst du es ja gebrauchen... HTH Gruss RainerH. [Diese Nachricht wurde von RainerH am 21. Jul. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MC Mitglied Dipl.Ing. Maschinenbau, Konstrukteur
  
 Beiträge: 644 Registriert: 20.10.2000
|
erstellt am: 21. Jul. 2005 14:19 <-- editieren / zitieren --> Unities abgeben:         
Hi Rainer, wiedermal sehr nett von Dir. Doch, das konnte ich noch gut gebrauchen und klappt auch bestens! Ich habe es unter bei den :variables eingefügt, ich denke das hast Du auch gemeint, oder? Nur falls noch jemand anders mal versuchen möchte. Danke nochmals! Gruß, Michael p.s.: Leider kann ich nicht mehr als 10 unities vergeben, auch wenn ich schon mindestens 50 hätte geben wollen  ------------------ Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (A. Einstein) [Diese Nachricht wurde von MC am 21. Jul. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RainerH Mitglied Techn. Ang. (Konstruktion)
  
 Beiträge: 736 Registriert: 22.01.2003 OSDM 14.00A OSDD 14.50 MM 14.00A Windows-XP Pro x64 Edition -------------------------- HP xw6400 Intel Xeon 3.00 GHz 4.00 GB RAM ATI FireGL V7200
|
erstellt am: 21. Jul. 2005 14:26 <-- editieren / zitieren --> Unities abgeben:          Nur für MC
|