| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
Autor
|
Thema: LISP: get_selection in ANNO (3727 mal gelesen)
|
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 30. Nov. 2007 08:16 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich wollte eigentlich das Progrämmchen, das in diesem Thread http://ww3.cad.de/foren/ubb/Forum92/HTML/000395.shtml diskutiert wurde, verwirklichen. Aber ich scheitere schon daran, Texte, die mit einer bestimmten Info versehen sind, in einer Funktion zu sammeln. Irgendwie wende ich den Befehl get_selection falsch an. Hier ein Beispiel, das man aus der Eingabezeile aufrufen kann:
Code:
(defun st-check-is-prop-text (item) (pprint item) (if (find "ST-PART-PROP: " (sd-am-inq-info-attributes item) :test #'sd-string-match-pattern-p) :OK :filter ) )(defun st-mark-prop-texts (&rest args) (let (text-item textlist) (setf textlist (get_selection :focus_type *sd-anno-text-seltype* :select :by_sheet_docu_rest (sd-am-inq-curr-sheet) ; :check_function #'st-check-is-prop-text ) ) (pprint textlist) (dolist (text-item textlist) (sd-am-add-info-attributes (list "ST-PART-PROP-NOT-UPTODATE") text-item) ) ) )
Wie man sieht, habe ich auch die check-function ausgeschaltet, um diesen Einfluß auszuschalten.------------------ Gruß aus dem Salzkammergut Thomas Hollerweger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dieter Kotsch Mitglied
Beiträge: 311 Registriert: 10.08.2002
|
erstellt am: 30. Nov. 2007 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für holt
HI Die Textänderung kannst Du auch durch ein Makro realisieren. Über den Befehl sd-execute-annotatot-command :cmd kannst Du unter Einhaltung der aktuellen Randbedingungen einen selbst definierten Befehl im Annotation ausführen. Grüße Dieter ------------------ nichts ist unmöglich Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 03. Dez. 2007 06:03 <-- editieren / zitieren --> Unities abgeben:
Hallo Dieter, du hast recht, mit einem Makro tut man sich da leichter. Danke! Aber mich würde trotzdem interessieren, was ich bei get_selection falsch mache. ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dieter Kotsch Mitglied
Beiträge: 311 Registriert: 10.08.2002
|
erstellt am: 03. Dez. 2007 09:28 <-- editieren / zitieren --> Unities abgeben: Nur für holt
|
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 03. Dez. 2007 14:17 <-- editieren / zitieren --> Unities abgeben:
Hi, Zitat: Original erstellt von Dieter Kotsch: Aber ich vermute, Du mußt deine Selection in ein sd-call-cmds schachteln.
Wenn ich die Funktion direkt aus der Eingabezeile aufrufe, darf kein sd-call-cmds enthalten sein, sonst bekomme ich den Fehler "unzulässiger Aufruf einer Aktionsroutine". Baue ich sd-call-cmds ein und rufe die Funktion innerhalb des in Endausbau dafür vorgesehenen "DOCU-PRE-UPDATE-ALL-EVENT" auf, bekomme ich wie im Anfangsbeitrag NIL, also eine leere Liste geliefert. Was mach ich falsch? ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dieter Kotsch Mitglied
Beiträge: 311 Registriert: 10.08.2002
|
erstellt am: 03. Dez. 2007 16:48 <-- editieren / zitieren --> Unities abgeben: Nur für holt
|
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 03. Dez. 2007 22:43 <-- editieren / zitieren --> Unities abgeben: Nur für holt
Zitat: Original erstellt von holt: Baue ich sd-call-cmds ein und rufe die Funktion innerhalb des in Endausbau dafür vorgesehenen "DOCU-PRE-UPDATE-ALL-EVENT" auf, bekomme ich wie im Anfangsbeitrag NIL, also eine leere Liste geliefert.
Bau dir einen test dialog drum rum, dann kannst du es besser testen. Da Du alle der funktion st-mark-prop-texts überergebenen parameter nicht nutzt kannst du sie ja genz einfach aufrufen. Eine ganz 'bloede' test variante is folgender dialog
Code:
(oli::sd-defdialog 'test-my-call :dialog-control :sequential :ok-action '(my-package::st-mark-prop-texts))
und dann ein (test-my-call) auf der command line. Evtl musst du mal select tracen. Die Ausgabe koennte dann aber etwas laenglich aussehen.Testweise nimm mal st-check-is-prop-text wieder rein, lasse sie immer ein :OK zurückliefern und trace diese funktion. (natuerlich mit einem blatt mit nur 5 texten, damit Du den überblick in der Konsole nicht verlierst). Dann muessen zumindest mal 5 texte in der Deiner List stehen. ------------------ Seamonkey Firefox Thunderbird Seamonkey auf deutsch
[Diese Nachricht wurde von der_Wolfgang am 04. Dez. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 04. Dez. 2007 14:23 <-- editieren / zitieren --> Unities abgeben:
Hallo, ihr habt recht, innerhalb eines Dialogs funktioniert mein get_selection. Das heißt für mich: Ich muss im "DOCU-PRE-UPDATE-ALL-EVENT" einen Dialog aufrufen. Ist das richtig? ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 04. Dez. 2007 18:46 <-- editieren / zitieren --> Unities abgeben: Nur für holt
Zitat: Original erstellt von holt: Das heißt für mich: Ich muss im "DOCU-PRE-UPDATE-ALL-EVENT" einen Dialog aufrufen. Ist das richtig?
nein, eigentlich nicht. Dieser Event passiert ja irgendwo am ende , also innerhalb von AM_VIEW_UPDATE, aber eben nicht danach. Also bist du noch *in* einem dialog. tips zur Fehlersuche
1) Schreib in deine Funktion mal ein (pprint (list "in st-mark-prop-texts"(sd-call-action-active-p))) rein, das muesste doch immer ein T sein. so weit die Theorie 2) (trace st-mark-prop-texts am_view_update) an der veschachtelungstiefe des trace outputs in der Konsole siehst du wiederum wer wen aufruft und wann wer "zu ende" ist.... 3) wenn es ein sd-call-cmds problem waere, muesse dir die fehlermeldung "illegal call to action routine" (sinngemaess) entgegenschlagen. tut sie aber nicht. ----- gestellte Frage meinerseits, aber unbeantwortet: was liefert der trace von st-check-is-prop-text?
------------------ Seamonkey Firefox Thunderbird Seamonkey auf deutsch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 05. Dez. 2007 06:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, jetzt verstehe ich gar nichts mehr: zu 1) sd-call-action-active-p liefert NIL, wenn die Funktion von "DOCU-PRE-UPDATE-ALL-EVENT" aufgerufen wird. andererseits zu 2) zeigt die Verschachtelungstiefe eindeutig, dass meine Funktion innerhalb von AM_VIEW_UPDATE aufgerufen wird. siehe Anhang zu 3) der ungültige Aufruf einer Aktionsroutine kommt nicht, was eigentlich bedeuten sollte, dass 1) T liefert zu deiner früher gestellten Frage: der Trace der check_function liefert gar nichts, sieht so aus, als ob sie gar nicht gerufen würde??? Anbei mein gesamtes LISP-File. Um eine bessere Übersicht zu bekommen, habe ich die Registrierungen der anderen Funktionen derzeit aukommentiert. HILFE!!! ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger [Diese Nachricht wurde von holt am 05. Dez. 2007 editiert.] 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 05. Dez. 2007 22:31 <-- editieren / zitieren --> Unities abgeben: Nur für holt
Zitat: Original erstellt von holt: jetzt verstehe ich gar nichts mehr:
ok.. dann haben wir uns schon gesteigert... Zitat:
zu 1) sd-call-action-active-p liefert NIL zu 3) der ungültige Aufruf einer Aktionsroutine kommt nicht
Mann, bin ich bloed.. nein, korrigiere.. sind WIR bloed. ODer? <lautdenk> irgendwo am ende der :ok-action wird der Event gefeuert. Der macht nix anderes als funktionen aufzurufen. Und zwar die, die subscribiert sind. Das waere dann z.b. eben auch Deine. und wo in dieser kette ist nun das sd-call-cmds, das benoetigt wird um dem get_selection die sel-items zu entlocken??? Ebend. Hattest Du schon mal vor dem get_selection ein sd-call-cmds? ja, hattest du schon... </lautdenk> <leisedenk> hmmm </leisedenk> Zitat: der Trace der check_function liefert gar nichts, sieht so aus, als ob sie gar nicht gerufen würde???
das isch aber dummmmmmm ---------------------------- also einen OSD start ich heute nicht mehr .. aber noch was anderes: Code: (defun st-prop-type-string-to-keyword (prop-string) (unless (zerop (length prop-string)) (read-from-string (format nil ":~A" prop-string)) ))
Ob Du das erzeugte keyword noch testest, obe es eines von den vieren ist... aber st-get-prop-string laeuft eh ins leere wenn das keyword nicht passt.
Code: (sd-call-cmds (AM_TEXT_MODIFY :sel_list (get_selection :focus_type *sd-anno-text-seltype* :check_function #'(lambda (text-item) (if (find "ST-PART-PROP-NOT-UPTODATE" (sd-am-inq-info-attributes text-item) :test #'sd-string=) :ok :filter)) :select :docu_text :by_sheet_docu_rest (sd-am-inq-curr-sheet) ) :color 16711680)
ufff.. dieser Teil muss eigentlich schweinelangsam sein. Alleine im Titleblock befinden sich immer and die 50..60..70 texte. Wie fit bist Du mit Drafting macros?Und st-update-prop-texts ruft fuer alle texte 2 mal sd-am-inq-info-attributes auf und fuer alle die dann den filter passierten noch ein weiteres mal. ------------------- ich haette Angst das das etwas langsam wird so insgesamt. --------------------- und noch was, docu von get_selection: Zitat: :select {any valid SELECT parameters} **after all other options have been specified**, this option invokes the select subaction.
schiebe in st-mark-prop-texts mal den :select ans ende. Muss man den Satz so interpretieren das :select immer der letzte parameter sein MUSS?------------------ Seamonkey Firefox Thunderbird Seamonkey auf deutsch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 06. Dez. 2007 17:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, ich war nicht untätig und habe inzwischen an der Makrovariante gebastelt, um deine Bedenken bezüglich der Geschwindigkeit auszuräumen. Nicht dass mir einer vorwerfen könnte, ich lasse euch schuften und lege mich in der Zwischenzeit auf die faule Haut. Der erste und der letzte Teil funktionieren ja schon. Die Texte werden beim Aufruf des "DOCU-PRE-UPDATE-ALL-EVENT" markiert und bei "DOCU-POST-UPDATE-ALL-EVENT" werden alle Texte, die keinen Bezug haben auf rot geändert und die Infos gelöscht. Derzeit sind das aber noch alle Texte, die mit meiner Info versehen sind, weil der mittlere Teil noch nicht funktioniert. Da fällt mir ein Witz ein: Warum fangen wir bei einem Projekt immer in der Mitte an? Weil wir uns hinten und vorne nicht auskennen! Bei eben diesem Mittelteil kann ich mit Makrobefehlen nicht viel ausrichten. Grund:
- Erst muss ich mit ME10-Makros ermitteln, für welche Teile welche Eigenschaften berechnet werden sollen und das Ergebnis an Annotation zurückgeben
- dann berechnen
- dann den Text wieder mit ME10-Makros mit dem neuen Ergebnis überschreiben. Dazu müssen aber wieder die zugehörigen Texte gesucht werden.
Da müßte ich 2 mal ME10 rufen jedesmal eine Liste hin- und herschicken. Also hab ich die Lösung weiter in LISP versucht. Aber mein get_selection liefert immer noch keine Ergebnisse, selbst wenn ich das :select ans Ende setze UND die check-function auskommentiere. Wie gesagt, es sieht so aus, als ob die check-function nicht gerufen würde. Was mir bei der Suche in der Hilfe auch aufgefallen ist: Abschnitt Inquiring Data in SolidDesigner
Zitat: Selection The SolidDesigner Integration Kit allows the programmer to use the full power of SolidDesigner's selector programmatically. The tool for doing so is the "GET_SELECTION" interrupt action routine. It accepts all selector options and returns a list of the selected items. The following example returns all edges around a face (sd-call-cmds (GET_SELECTION :select :edge_3d :by_face a-face)) The "GET_SELECTION" command also accepts initial focus types as well as a check-function, that performs additional checks on selected items The following example selects all red faces in a the current part (sd-call-cmds (GET_SELECTION :focus-type *sd-face-seltype* :check-function is-red-face :select :all_3d))
1) get_selection ist eine Action-Routine und braucht ein sd-call-cmds 2) hier steht :focus-type und nicht :focus_type wie in der Hilfe zu get_selection P.S.: um Details, ob ich ein erzeugtes keyword noch teste, kümmere ich mich wenn der Code einmal läuft. [Optimismus]Nur nicht aufgeben.[/Optimismus] ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger [Diese Nachricht wurde von holt am 06. Dez. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 07. Dez. 2007 11:55 <-- editieren / zitieren --> Unities abgeben:
Hallo, gestern war ich schon so konfus, dass ich eine ziemlich schlechte Variante meines Makros beigelegt habe. Das ständige herumprobieren ... Und irgendwie habe ich es heute geschafft, dass mein get_selection funktioniert! Ich habe allerdings den größten Teil der Prüfungen in das nachfolgende dolist verlegt. Im Anhang die funktionierende Variante des Programms. Danke für Eure Hilfe! Ohne diese Anregungen hätte ich es wohl nie geschafft! Außerdem habe ich jetzt einiges über das Tracen von Funktionen gelernt. Wobei ich aber überzeugt bin, dass ich mein Ziel früher erreicht hätte, wenn es einen grafischen LISP-Debugger im OS-Modeling geben würde. Da kann ich gleich wieder Werbung für meinen diesbezüglichen Beitrag machen! http://ww3.cad.de/foren/ubb/Forum92/HTML/000379.shtml------------------ Gruß aus dem Salzkammergut Thomas Hollerweger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 Xenon 3.2GHz 24GB Ram nVidia Quadro 4000 OSDM 17M050 & 18.1 SWX 2008 PHOENIX V10
|
erstellt am: 07. Dez. 2007 16:33 <-- editieren / zitieren --> Unities abgeben: Nur für holt
|
noxx Mitglied Steuerzahler
Beiträge: 801 Registriert: 13.12.2004 OS: Win 7 Ultimate 64 bit SP1 Speicher: 30 GB RAM Grafik: nVidia Quadro 4000 Creo Modelling v17.0
|
erstellt am: 16. Jan. 2008 11:33 <-- editieren / zitieren --> Unities abgeben: Nur für holt
|
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 16. Jan. 2008 12:08 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von noxx: Funtioniert das ganze auch irgendwie mit Angaben zur Dicke bei Blechen?Würde gerne diese assoziativ auf die 2D Zeichnungen bekommen!
Indem du eine Seitenansicht machst, in der du die Blechdicke bemaßen kannst. Im Ernst: Bei aktiviertem Sheetmetal müßte es mit
Code:
(first (last (sd-call-cmds (SHA_INQUIRE_MATERIAL Teil))))
funktionieren.Quick and dirty und ungetestet! ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger [Diese Nachricht wurde von holt am 16. Jan. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Walter Geppert Moderator Frank und Frei
Beiträge: 2143 Registriert: 12.12.2000 Konstruktion von Sondermaschinen, Montageautomaten, Meß- und Prüfeinrichtungen, Vorrichtungen und Produktentwicklung mit Creo Elements/Direct Modeling 20.4, AdvancedDesign, Surfacing, Simulate, SolidPower, ModelManager auf HP ZBook 17 G4, Windows 10 Pro 64
|
erstellt am: 16. Jan. 2008 13:04 <-- editieren / zitieren --> Unities abgeben: Nur für holt
|