| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
Autor
|
Thema: STEP-Export (4018 / mal gelesen)
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 21. Feb. 2018 10:40 <-- editieren / zitieren --> Unities abgeben:
Guten Tag, vielleicht findet sich jemand der mich in Sachen STEP-Export etwas aufschlauen möchte. Folgendes Szenario: Eine Baugruppe soll im stp-Format aus Modeling Exportiert werden. Das klappt ja soweit auch Problemlos. Nun ist es aber so dass beim Export wohl die Teilenamen beschnitten und z.T. nicht übernommen werden. Beim Export mit der Option "Direkt" klappt das überhaupt nicht (...aber hier haben wir keine Probleme mit großen Baugruppen). Beim Export mit der Option "Granite" werden zwar die Teilenamen auch abgeschnitten, aber immerhin 1:1 übernommen bevor sie dann beschnitten werden (...klappt mit großen Baugruppen nicht immer). Fragen: Gibt es eine Einstellung wo das Beschneiden der Teilenamen unterdrückt? Gibt es eine Einstellung um das übernehmen der Teilnamen zu erzwingen?
Hintergrund: Ich Durchsuche mittels eines LISP die komplette Struktur einer Baugruppe und setzte anhand der Oberflächen- oder Werkstoffattribute (...wenn das nicht greift wird die Dichte, Teilefarbe, Teilebenennung ausgewertet) ein PRÄFIX welches dann in Keyshot über eine Materialvorlage anhand des Teilenamens (...aus dem STEP) die Materialen zuweist. ------------------ ...viele Grüße Stephan Jetzt mit (unfertigem) LISP (...vielleicht interessiert sich ja jemand dafür) [Diese Nachricht wurde von StephanWörz am 21. Feb. 2018 editiert.] [Diese Nachricht wurde von StephanWörz am 21. Feb. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lix b Mitglied Konstrukteur, CAD-Admin
Beiträge: 279 Registriert: 03.10.2014 Creo Elements / Direct Modeling 20.2.1.0 Creo Elements / Direct Model Manager 20.2.1.0 Creo 5.0.2.0 Simulate <P>Notepad++ Win 10
|
erstellt am: 21. Feb. 2018 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Hallo Stephan, ich habe das eben mal getestet. Wenn ich eine BG als STP exportiere und wieder importiere wird der komplette Instanzname beibehalten, teilweise 50 und mehr Zeichen. Getestet mit der v19 M020 mittels STP Export "direkt". Generell interessiere ich mich sehr für dein Problem, weil ich Ähnliches vorgehabt habe, aber leider zur Zeit mangels freier Kapazität das Thema Keyshot "noch" auf Eis legen muss. ------------------ Viele Grüße Felix Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 21. Feb. 2018 14:22 <-- editieren / zitieren --> Unities abgeben:
|
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 21. Feb. 2018 14:22 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Hier STEPped der Bär, ach ne, der Stephan. kleine Hinweise unabhängig von dem Namens Problem:
in CheckReserverdFaceColors:
Code: (equal (sd-inq-face-color FaceToCheck) (gpnt3d 0.0 0.0 0.50196081399917603 ))
Hatten wird erst kuerzlich, Vergleich von floating-point-number auf equal: Du faehrst ein hohes Risiko das das so klappt. Ersetze hier equal durch die IKIT Funktion SD-VEC-EQUAL-P ein (let (thisFaceColor (sd-inq-face-color FaceToCheck)) .. . taete der Performance gut, denn u.U. erfragst du die Farbe 14 mal. EINmal reicht in AssignMaterialToSurface: der 42-fache (if... ) schreit nach einer (cond .. ition.
Ich taete die Funktion eher get-MaterialPrefix-by-Surface nennen, die den prefix zurueckliefert. Und NICHT eine globale Variable setzen! in AssignMaterialToMaterial: der 23-fache (if... ) schreit nach einer (cond .. ition.
Ich taete die Funktion eher get-MaterialPrefix-by-Material nennen, die den prefix zurueckliefert. Und NICHT eine globale Variable setzen! CheckDensity dito (sd-vec-equal-p) AssignMaterialToPartColor dito (sd-vec-equal-p) AssignMaterialToPartName -> eine hybsche CONDition hast du da! Aber auch hier: lieber ne Funktion mit Rueckgabewert AssignMaterialToAssyName -> eine hybsche CONDition hast du da! Aber auch hier: lieber ne Funktion mit Rueckgabewert
TIP: mach mal (testweise) nen pprint um die cond-kunstruktion. ----------------------- PS: ich habe zuerst 4096 TABS durch blanks ersetzt, dann fand ich es lesbarer.
------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 21. Feb. 2018 15:09 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Hallo Stephan, anbei mal eine Variante der Funktion AssignMaterialToPartName wobei Daten und Funktionalitaet getrennt sind. Die Daten sind in einer variable ausgelagert. Das ist eine einfache String-String-Liste. Der eigentliche LISP code reduziert sich dann auf wenige Zeilen Code: (defun get-Material-by-PartNamePattern (Teil) (let ((Teilename (sd-inq-obj-basename Teil))) (dolist (a-mat-PNP *material-by-partname*) (when (sd-string-match-pattern-p (car a-mat-PNP) Teilename) (return (cadr a-mat-PNP))) ) "NONE" ;; absolute fallback fallback :-D );;let )
a) die Daten sind einfacher zu pflegen b) wenn Du nun "ploetzlich" case-insitive chechen sollst, brauchst Du nur EINE Zeile anpassen. Statt dem fallback "NONE" haette ich eher NIL genommen. Dann waere der FolgeSchritt einfacher:
Code: (setq Prefix (get-Material-by-PartNamePattern Teil)) (unless Prefix (setq Prefix (get-Material-by- ....)))
oder ganz elegant (by fallback = NIL): Code: (setq Prefix (or (get-Material-by-PartNamePattern Teil) (get-Material-by-SurfaceName Oberflache) (get-Material-by-DingsBums ebendas)))
Nur eine kleine Anregung. (code untested) ------------------ Fehler im LispCode korrigiert (siehe auch hier) ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● [Diese Nachricht wurde von der_Wolfgang am 05. Mrz. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 21. Feb. 2018 15:13 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, vielen Dank fürs Korrekturlesen :-) Ich werde versuchen Deine Tipps umzusetzen. Ich trau mich kaum das zu sagen , aber das Code: (let (...))
hat sich mir noch nicht erschlossen Alle lets in meinem Code sind gestohlen.
Zitat: PS: ich habe zuerst 4096 TABS durch blanks ersetzt, dann fand ich es lesbarer
In meinem Notepad++ sah's astrein aus... ------------------ ...viele Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lix b Mitglied Konstrukteur, CAD-Admin
Beiträge: 279 Registriert: 03.10.2014 Creo Elements / Direct Modeling 20.2.1.0 Creo Elements / Direct Model Manager 20.2.1.0 Creo 5.0.2.0 Simulate <P>Notepad++ Win 10
|
erstellt am: 21. Feb. 2018 15:46 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 21. Feb. 2018 18:32 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: Ich trau mich kaum das zu sagen , aber das Code: (let (...))
hat sich mir noch nicht erschlossen
ohhh Ohhh , OHHHHH Das klingt nach 'Nachsitzen'. Hmmm, sieht alles kompliziert aus fuer dich/euch, gehe ich mal davon aus. ============================ Ganz grob: globale Variablen sind erstmal BAEH! :( solange man sie nicht gezielt einsetzt. in einem sd-defdialog weisst Du wie man eine lokale dialog variable definierst Code: (sd-defdialog ... :variables ..... (myhelper :initial-value 42) (prefix :initial-value "None") (INeedHelp) ...
wie macht man das in einer Funktion? Mit einem LET im einfachen Fall hat LET 2 Argumente (zwei "lisp formen") 1) eine Liste von variablen, jene sind nur innerhalb des let-blocks gueltig(!!!) 2) einen Block von Anweisungen, das ist ungefaehr das was wir meistens in einem (progn...) kapseln In der Variablen liste stehen entweder einfache variablen, dessen Wert man dann spaeter setzt / liest. Oder man kann diesen variablen gleich einen Initialwert mitgeben. Die unschoene Variante:
Code: (defun unschoen () (progn (setq INeedHelp (is-help-needed "Stephan")) ;; we create a global variable and set its value (setq myhelper 42) ; we create a global variable and set its value (setq prefix "None") ; we create a global variable and set its value (mach-anderes-zeugs :radeldidum) (when INeedhelp (pprint myhelper) (display prefix) ) ;; end when ) ;; progn ) ;; end defun
Wir zeugen hier 3 global Variablen die von ueberall aus gelesen und(!) veraendert werden koennen. -> Kontrollverlust plus u.U. Verwirrungspotential Wir nutzen ein LET und schaffen uns eine Art Box in der die Variablen gueltig sind, und zwar NUR dort:
Code: (defun schonGut () (let (INeedHelp myhelper prefix) ;; list of local variables (setq INeedHelp (is-help-needed "Stephan")) (setq myhelper 42) ;; set initial value (setq prefix "None") (mach-anderes-zeugs :radeldidum) (when INeedhelp (pprint myhelper) (display prefix) ) ;; end when ) ;; let ) ;; end defun
So gross war die Aenderung gar nicht! Und jetzt mal mit Initialisierung
Code: (defun schonBesser () (let (INeedHelp ;; without initial value (myhelper 42) ;; with initial value (prefix "None") ) ;; end local variable list (setq INeedHelp (is-help-needed "Stephan")) (mach-anderes-zeugs :radeldidum) (when INeedhelp (pprint myhelper) (display prefix) ) ;; end when ) ;; let ) ;; end defun
Mehr oder weniger ist das jeweils erste setq in's let-initial mit hinein gerutscht. Aber dieser Inital-value.. das kann auch ein (komplexer) Funktionsaufruf sein:
Code: (defun naPrima () (let ((INeedHelp (is-help-needed "Stephan")) ;; with initial value (myhelper 42) ;; with initial value (prefix "None") ) (mach-anderes-zeugs :radeldidum) (when INeedhelp (pprint myhelper) (display prefix) ) ;; end when ) ;; let ) ;; end defun
Ich hoffe ich habe ein wenig erleuchtet. Ich muss mir dieses Posting mal bookmarken. Habe da so eine Idee. ;) ------------------------------------- ein LET kann man ueberall gut verwenden
Code: (when (is-help-needed "MiBr") (let ((listener "MiBr") (mode :extended)) (pprint "lisp lernen") (pprint "forum lesen") ;(sd-display-help listener mode) ))
LISP code anbei, damit es in Eurem NOTEPAD+++ bunt wird, und ihr mit einfachem Beispiel spielen koennt. ============================================== nur am Rande:
Zitat: In meinem Notepad++ sah's astrein aus...
Das glaube ich dir, haengt halt sehr davon ab, was Du als TAB Groesse eingestellt hast. Bei mir sind es 8 blanks. ------------------ EDIT Unterschiede in LispCode Schnipseln hervorgehoben /EDIT ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● [Diese Nachricht wurde von der_Wolfgang am 05. Mrz. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 22. Feb. 2018 17:34 <-- editieren / zitieren --> Unities abgeben:
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 02. Mrz. 2018 17:58 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen! Nun habe ich mal einige Anregungen aufgegriffen und umgesetzt! Zitat: Ersetze hier equal durch die IKIT Funktion SD-VEC-EQUAL-P
>>> erledigt
Zitat: ein (let (thisFaceColor (sd-inq-face-color FaceToCheck)) .. . taete der Performance gut, denn u.U. erfragst du die Farbe 14 mal. EINmal reicht
>>> erledigt
Zitat: Die Daten sind in einer Variable ausgelagert. Das ist eine einfache String-String-Liste.
>>> z.T. erledigt Zitat: Statt dem fallback "NONE" haette ich eher NIL genommen.
>>> erledigt Frage: Die Funktion in der Stringlist.lsp oder doch lieber im Hauptcode definieren???
Ansonsten gehe ich jetzt einen etwas anderen Weg. Ich kralle mir die Objekte der 1. Ebene (sd-inq-obj-children) unterscheide zwischen Part & Bgr. und verarzte entsprechend. Ich habe noch versucht das Ganze zu vereinfachen. Läuft inzwischen recht flott... Für weitere Anregungen bin ich natürlich offen... Und noch eine allgemeine Frage: Ich finde es besser Funktionsnamen mit "_" zu trennen anstatt mit "-". Das hat den Vorteil dass ich mit einem Doppelklick den ganzen String markieren kann und sofort das weitere Vorkommen des Strings im Code gehighlighted bekomme. So springe schnell durch den Code... Ist das gegen irgendwelche Festlegungen? ...oder gibt es Gründe für den Bindestrich die ich noch nicht erkannt habe?? Leider muss ich auch noch was arbeiten. Das geht hier nur schleppend weiter. Ich halt Euch aber auf dem Laufenden... ...wünsche ein schöööönes Wochenende.
------------------ ...viele Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 02. Mrz. 2018 23:24 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: Nun habe ich mal einige Anregungen aufgegriffen und umgesetzt!
Prima. Um diese Un/Uhrzeit beantworte ich allerdings nur noch die einfachen Dinge. Zitat: Frage: Die Funktion in der Stringlist.lsp oder doch lieber im Hauptcode definieren???
Ich wuerde nur diese Listen in die eine LSP Datei machen. Dann kannst du die Datei auch mal getrost einem unbedarften Mitarbeiter in die Hand geben und sagen: "Klopf da mal noch die verbleibenden 142 Pattern rein" und dein Code ist sicher. Code: ;; load corresponding data from same directory (load (format nil "~A/SD_PrepareForRendering_StringLists" (directory-namestring *load-truename*)))
siehe auch da.
Zitat: Ansonsten gehe ich jetzt einen etwas anderen Weg. Ich kralle mir die Objekte der 1. Ebene (sd-inq-obj-children) unterscheide zwischen Part & Bgr. und verarzte entsprechend.
Und diese Abarbeitung mit Hilfe deine Rekursion ist komisch IMHO. Du waehlst doch als "Quelle" ein Assembly aus. Also muesste der Einstieg (so wie du es jetzt programmier hast) in die Abarbeitung ein Code: :Ok-action '(progn ;;Optionen verarbeiten ;;... (ProcessAssy Quelle) );end progn / ok-action
sein.. Warum benutzt fuer die oberste Ebene eine andere Verarbeitung als fuer jede darunter liegende Ebene? ;) <- color reduced smilie!
Zitat: Ich finde es besser Funktionsnamen mit "_" zu trennen anstatt mit "-". Das hat den Vorteil dass ich mit einem Doppelklick den ganzen String markieren kann und sofort das weitere Vorkommen des Strings im Code gehighlighted bekomme.
Das ist eher Betriebsinterne Konvention wie du das haelst. Ich glaube ich habe damals das "-" zum Teil der Worte gemacht im Notepad++ und dem CoCreate-Lisp-Highlighter. Bischen Konvention war auch das Namen/Keywords von ActionRoutinen/Dialogen eher mit"_" ausgestattet werden (also das was etwas mehr nach 'aussen' geht,z.b.Recorder file) und der 'normale' Lisp code dann die"-" nimmt, also auch die defuns. Wichtiger ist das Du fuer Dich /in Deiner Firma es einheitlich ist. Guts Nächtle ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 05. Mrz. 2018 14:23 <-- editieren / zitieren --> Unities abgeben:
OK..., Danke, ich werde auch diese Anregungen einarbeiten und die fehlenden LETs noch hinzufügen! Nun habe ich aber eine Frage zu folgendem CodeSchnipsel: Code: (defun get-MaterialPrefix-by-MaterialPattern (Material) (dolist (a-mat-PNP *material-by-material*) ;car = 1. Element einer Liste cadr = alles außer 1. Element einer Liste (when (sd-string-match-pattern-p (car a-mat-PNP) Material (cadr a-mat-PNP)) ;;THEN (return (cadr a-mat-PNP)) ;;ELSE (return nil) ;; absolute fallback fallback :-D );;when );;dolist );;get-MaterialPrefix-by-MaterialPattern
hier ist doch eigentlich 1 Parameter zuviel drin??? Code: (sd-string-match-pattern-p (car a-mat-PNP) Material (cadr a-mat-PNP))
Ich verstehe das Ganze nicht?? Ich interpretiere das so: Ist das "Pattern" (car a-mat-PNP) in dem String Material drin?. ...was bringt das (cadr a-mat-PNP)??? ------------------ ...viele Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lix b Mitglied Konstrukteur, CAD-Admin
Beiträge: 279 Registriert: 03.10.2014 Creo Elements / Direct Modeling 20.2.1.0 Creo Elements / Direct Model Manager 20.2.1.0 Creo 5.0.2.0 Simulate <P>Notepad++ Win 10
|
erstellt am: 05. Mrz. 2018 14:34 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Hallo Stephan, für mein Verständnis ist der 3. Parameter überflüssig und wird einfach ignoriert. Aber deine Beschreibung für cadr ist falsch cadr = (car (cdr x)) => also das 2. Element einer Liste, oder? ------------------ Viele Grüße Felix [Diese Nachricht wurde von lix b am 05. Mrz. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 05. Mrz. 2018 15:34 <-- editieren / zitieren --> Unities abgeben:
|
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 05. Mrz. 2018 18:13 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: ...da hast Du recht! Danke für den Hinweis!
Dein Kommentar im (bisherigen) Lisp file ist falsch: "alles außer 1. Element einer Liste". Hatte ich vorgestern nicht mehr geschrieben. Code: (car x) ≡ (first x)...
Beim 1. und 2. Element einer Liste nutze ich gerne car bzw. cadr. Weil, das laesst sich halt schneller schreiben. Wenn ich mehr brauche, schwenke ich dann zu (nth 0 ..) (nth 1 ..) (nth 2 ..) (nth 3 ..) etc. ueber, weil das dann wieder einheitlicher aussieht. Vielleicht magst Du 'nth' in deinem hybschen CodeSchnipsel eins drueber noch hinzufuegen. "alles außer 1. Element einer Liste" waere uebrigens (rest a-list). ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 05. Mrz. 2018 18:22 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 06. Mrz. 2018 10:54 <-- editieren / zitieren --> Unities abgeben:
Hallo! Nun habe ich wieder Probleme mir dem LET. Wie mache ich das richtig?? Code: ;; Funktion zum wählen aller Teile rekursiv in Baugruppe (defun SelectAllParts (Assy) (setq Teile (sd-call-cmds (get_selection :focus_type *sd-part-seltype* :allow_face_part :allow_wire_part :select :recursive :in_assembly Assy))) );;SelectAllParts
Folgendes habe ich versucht: Code: ;; Funktion zum wählen aller Teile rekursiv in Baugruppe (defun SelectAllParts (Assy) (let ((Teile (sd-call-cmds (get_selection :focus_type *sd-part-seltype* :allow_face_part :allow_wire_part :select :recursive :in_assembly Assy))))) );;SelectAllParts
...da liefert mir die Funktion aber immer NIL zurück??? ------------------ ...viele Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lix b Mitglied Konstrukteur, CAD-Admin
Beiträge: 279 Registriert: 03.10.2014 Creo Elements / Direct Modeling 20.2.1.0 Creo Elements / Direct Model Manager 20.2.1.0 Creo 5.0.2.0 Simulate <P>Notepad++ Win 10
|
erstellt am: 06. Mrz. 2018 11:19 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Hi! In der 1. Version schreibst du durch deine Funktion ja das Ergebnis in die globale Variable "Teile" und kannst es somit im Nachhinein jederzeit abrufen. Wenn du das Ganze in ein LET verschachtelst, existiert die Variable "Teile" ja nur bis zum Ende der Ausführung, d.h. dir fehlt der Rückgabewert der Funktion Code: (return Teile)
Die LET-Funktion selbst hast du richtig definiert. Das kannst die Funktion selbst auch leicht überprüfen Code: (defun SelectAllParts (Assy) (let ((Teile (sd-call-cmds (get_selection :focus_type *sd-part-seltype* :allow_face_part :allow_wire_part :select :recursive :in_assembly Assy)))) (when Teile (display "Teile hat Inhalt durch LET bekommen")) ) );;SelectAllParts
------------------ Viele Grüße Felix [Diese Nachricht wurde von lix b am 06. Mrz. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 06. Mrz. 2018 17:57 <-- editieren / zitieren --> Unities abgeben:
|
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 06. Mrz. 2018 18:16 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: Viiielen Dank für den Schubs in die richtige Richtung.
Felix hat Dir ja schon den richtigen Schubser gegeben. Prima. Anmerkung: (setq ... ) selbst hat einen Rueckgabewert! DESWEGEN hat es in deiner obigen let-losen Variante funktioniert, denn der Rueckgabewert des letzten Statements in einer Funktion wird zum Rueckgabewert der Funktion selbst. Gereicht haette schon die VariablenLISTe des let, den setq haettest Du auch beibehalten koennen. Code: (defun SelectAllParts (Assy) (let (Teile) (setq Teile (sd-call-cmds (get_selection :focus_type *sd-part-seltype* :allow_face_part :allow_wire_part :select :recursive :in_assembly Assy))) ) );;SelectAllParts
Diese recht einfache Code Anderung mit der Einfuegung des LET ist bei bestehndem Code die einfachere/sicherere Variante, erfuellt aber eben doch den Wunsch/die Regel 'keine globale Variablen erzeugen'. In diesem Fall waere aber auch eine andere (sehr kurze) let-lose Variante sauber gewesen:
Code: (defun SelectAllParts (Assy) (sd-call-cmds (get_selection :focus_type *sd-part-seltype* :allow_face_part :allow_wire_part :select :recursive :in_assembly Assy)) );;SelectAllParts
------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 07. Mrz. 2018 07:06 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von der_Wolfgang: ... denn der Rueckgabewert des letzten Statements in einer Funktion wird zum Rueckgabewert der Funktion selbst.
Das ist mal eine Aussage die sogar ich auf Anhieb verstehe Die let-lose Variante gefällt mir sehr gut! Wieder nicht umsonst aufgestanden , wieder was gelernt Vielen Dank für Eure Unterstützung!
------------------ ...viele Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 22. Jan. 2019 14:44 <-- editieren / zitieren --> Unities abgeben:
Hallo, jetzt noch mal eine Frage zu diesem Projekt: In der Funktion Rename benenne ich Teile/Baugruppen um
Code: (sd-call-cmds (change_name_pa :Part_asmb Objekt :name (format nil "~A~A" NewName Postfix)))
Nun bekomme ich immer wieder mal diese Fehlermeldung: Nach klicken auf OK geht's aber munter weiter. Hat jemand einen Tipp wie diese Meldung abfangen oder vermeiden kann?
------------------ ...viele Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MiBr Mitglied Konstrukteur
Beiträge: 508 Registriert: 30.06.2015 HP Z440 Workstation 64GB Modeling 20.1.2.0 (x64) Drafting 20.1.2.0 (64x) klas. UI Modell Manager 20.1.2.0 Ansys Workbeanch 19R3 Mechanical Pro
|
erstellt am: 23. Jan. 2019 06:57 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 23. Jan. 2019 10:02 <-- editieren / zitieren --> Unities abgeben:
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 23. Jan. 2019 10:30 <-- editieren / zitieren --> Unities abgeben:
Zur Info! Code: (sd-call-cmds (change_name_pa :Part_asmb Objekt :name (format nil "~A~A" NewName Postfix)))
habe ich geändert in Code: (sd-call-cmds (change_name_pa :Part_asmb Objekt :name (format nil "~A~A" (sd-gen-obj-basename :Part :Parent (sd-inq-parent-obj objekt) :Prefix NewName) Postfix)))
...nun sind keine Fehlermeldungen mehr erschienen!
------------------ ...viele Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 25. Jan. 2019 16:39 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Das ist ein schöner Fall um mal die :failure Funktionalität von SD-CALL-CMDS zu nutzen Code: (sd-call-cmds (change_name_pa :Part_asmb Objekt :name (format nil "~A~A" NewName Postfix)) :failure (progn ;; upss... (pprint (sd-inq-error-obj :all)) ;; und was war falsch? (pprint "second try") (change-name-pa-with-another-generated-new-name-which-is-unique) ) :success (pprint "Alles roger, eijjj!! :thumbs-UP") )
In den allermeisten Fällen gehen wir davon aus das sd-call-cmds sauber und ohne Probleme durchläuft. Wie so oft beim Programmerieren ist auch hier der Anteil an Code, der sich um den Fehlerfall kümmert größer und aufwendiger, als der im "alles-gut"-Fall. ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 25. Jan. 2019 17:02 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, herzlichen Dank für den CodeSchnipsel! ...werde ich mal in der Art verwenden. Die SUCCESS-Meldung lass ich aber bei Strukturen mit mehreren 1000 Teilen mal weg. Wünsche Dir und allen Mitlesern ein schönes Wochenende ------------------ ...viele Grüße Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |