| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für PTC CREO |
| |
 | Windows Server 2025 - Was ist neu im Microsoft Server-Betriebssystem, eine Pressemitteilung
|
Autor
|
Thema: Lisp vs. Makro (2437 mal gelesen)
|
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003 MS: Windows 10 64bit OSD: 20.1 M020 ModelManager: 20.1 M020 NX 1899 TC 12.3
|
erstellt am: 18. Nov. 2015 12:36 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich würde mich jetzt mal als Programmieranfänger bezeichnen. Wobei mir die Makroprogrammierung in Drafting etwas vertrauter ist. Hätte mal ein paar grundlegenden Fragen. Kann man jeden Befehl im Drafting mit "(sd-execute-annotator-command :cmd...." auch im Annotation verwenden? Wann genau brauche ich den das "(sd-execute-annotator-command :cmd...."? Wenn ich im Drafting die beiden äusseren Punkte eines Rahmens auslesen möchte, geht das mit edit_part "Rahmen" inq_env 7 display (inq 101) display (inq 102) Wie würde sowas im Lisp aussehen oder das ich das im Annotation verwenden kann. Vielleicht kann mir jemand da mal helfen oder gibt es vielleicht etwas in deutsch wo man sich mal einlesen kann? ------------------ Gruß Peter 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: 18. Nov. 2015 14:00 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Du schon wieder, das hab ich kommen sehen Auf deutsch gibts leider nix zum IKit und auf englisch ist die Info auch eher mager, was ME10 in LISP so kann. Versteckt sich in der Hilfe unter "Dokumentation für fortgeschrittene Benutzer" im Kapitel "The ME Macro Programmer's Introduction to Lisp" Konkret brauchst du ein Makro so in der Art:
Code:
DEFINE IWG_frage_rahmen PARAMETER Uname LOCAL Cname LOCAL Br LOCAL Ho LOCAL Rstr LOCAL Lispstring INQ_ENV 7 LET Cname ('~'+(INQ 302)) EDIT_PART Uname INQ_ENV 7 LET Br (STR (ABS((X_OF (INQ 101))-(X_OF (INQ 102))))) LET Ho (STR (ABS((Y_OF (INQ 101))-(Y_OF (INQ 102))))) LET Rstr (Br+'_'+Ho) EDIT_PART Cname LET Lispstring (DOCU_CSTRING_TO_LSTRING Rstr) LET isopen (DOCU_OPEN_CONNECTION_TO_SD) LET done (DOCU_ADD_LINE_TO_SD Lispstring) LET isclosed (DOCU_CLOSE_CONNECTION_TO_SD) END_DEFINE
Das muss mit einem Befehl wie
Code:
(sd-execute-annotator-command :cmd (format nil "INPUT '~a/meinmakro.mac'" mein-me10-verzeichnis))
geladen sein In LISP geht das dann so:
Code:
(setf br_h (sd-execute-annotator-function :fnc (format nil "IWG_frage_rahmen ~a" rahmenname))) (setf breit (sd-read-from-string (first (sd-string-split br_h "_")))) (setf hoch (sd-read-from-string (second (sd-string-split br_h "_"))))
Man kann leider immer nur einen Wert aus ME10 "zurückholen", mehrere muss man vorher verketten und nachher wieder zerschnipseln wie oben gezeigt ME10-Code ist sehr gefährlich, weil man damit die von Annotation benutzte Teilestruktur beschädigen kann, also Obacht! ------------------ meine LISP-Makros sind auf osd.cad.de Disclaimer Grüße aus Wien
 Walter 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: 18. Nov. 2015 14:07 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Noch ein Nachtrag: Ich verwende bei solchen Operationen zum blattweisen Drucken oder Exportieren von Zeichnungen lieber das Blatt und den Blattnamen, die sind in jeder Zeichnung eindeutig und es gibt keine unliebsamen Überraschungen. Es darf nur nix aus den Rahmen rausstehen Den Blattnamen erhält man mit:
Code:
(setf shname (sd-am-sheet-struct-name shstruct))
------------------ meine LISP-Makros sind auf osd.cad.de Disclaimer Grüße aus Wien
 Walter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 18. Nov. 2015 14:36 <-- editieren / zitieren --> Unities abgeben:         
Hallo Walter, wieso bin ich nicht überrascht wieder von dir zu lesen...  Wenn ich das lese, glaube ich lasse ich das lieber mit dem programmieren.. Wie soll man denn da jemals durchsteigen. Jetzt hast du das ja mit Makro und Lisp gemacht. Rein auf Lisp-Basis kommt man da nicht dran? Weil du schreibst das ME10-Code sehr gefährlich ist. ------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PeterO Mitglied Admin
 
 Beiträge: 101 Registriert: 14.01.2003 Windows XP Modeling 15.50A Drafting 15.50A UI3 ModelManager 15.50A
|
erstellt am: 18. Nov. 2015 16:38 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Hallo Peter, so kann man die Eckpunkte in Annotation abfragen: (display (oli::sd-am-sheet-struct-corners (oli::sd-am-inq-sheet (oli::sd-am-inq-curr-sheet)))) Auszug aus dem IKIT SD-AM-SHEET-STRUCT [structure]
(sd-am-sheet-struct-p sd-am-sheet-struct) (sd-am-sheet-struct-name sd-am-sheet-struct) (sd-am-sheet-struct-frame sd-am-sheet-struct) (sd-am-sheet-struct-views sd-am-sheet-struct) (sd-am-sheet-struct-flats sd-am-sheet-struct) (sd-am-sheet-struct-sketches sd-am-sheet-struct) (sd-am-sheet-struct-scale sd-am-sheet-struct) (sd-am-sheet-struct-corners sd-am-sheet-struct) Description: Contains the data that can be inquired from a sheet. Slots: name {STRING} - The name of the sheet. frame {SEL_ITEM} - The sheet frame. views {LIST of SEL_ITEMs} - The list of views contained in the sheet. flats {LIST of SEL_ITEMs} - The list of flats contained in the sheet. sketches {LIST of SEL_ITEMs} - The list of sketches contained in the sheet. scale {LONG-FLOAT} - The sheet scale. corners {LIST of GPNT2D} - The lower left and upper right corner of all elements belonging to the frame of the sheet. See Also: SD-AM-INQ-SHEET [function] ------------------ Gruß, Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 03. Dez. 2015 07:58 <-- editieren / zitieren --> Unities abgeben:         
Hallo, würde das Thema Lisp und ME-Macro gerne noch mal aufnehmen. Ich habe ein Marco was einen vorhandenen Text in einen anderen tauscht. Im Drafting klappt das auch. Wenn ich das aber mit: (sd-execute-annotator-command :cmd (format nil "INPUT '~A/Drafting/Text_tauschen.m'" (oli::sd-sys-getenv "WERKZEUGKISTE"))) ins Annotation lade, und mit : (sd-execute-annotator-command :cmd (format nil "~a" "Txt_tauschen")) aufrufen möchte klappt das nicht. Ist es so das nicht alle Befehle dann verwendet werden können. Das Makro für den Text tauschen sieht so aus: DEFINE Txt_tauschen LOCAL tauschtxt LOCAL getauschttxt LOCAL Lesetxt LOCAL Zaeler LET Zaeler 0 (*LET tauschtxt '0300'*) READ STRING 'Text eingeben (mit Anfuehrungszeichen) der getauscht werden soll' tauschtxt READ STRING 'Text eingeben (mit Anfuehrungszeichen) in den getauscht werden soll' getauschttxt INQ_SELECTED_ELEM SELECT GLOBAL BLUE AND GLOBAL TEXTS ALL CONFIRM IF (INQ 14>0) LOOP EXIT_IF (INQ 14=0) LET Lesetxt (INQ 902) IF (LeseTxt = tauschtxt) LET Zaeler (Zaeler +1) CHANGE_TEXT getauschttxt GLOBAL POINTER (INQ 332) END END_IF INQ_NEXT_ELEM END_LOOP DISPLAY ('Text: "'+tauschtxt+'" in Zeichnung '+(STR Zaeler)+' mal getauscht') ELSE DISPLAY 'Kein Text in der Zeichnung getauscht' END_IF EDIT_PART TOP END_DEFINE ------------------ Gruß Peter 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: 03. Dez. 2015 08:20 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Zitat: Original erstellt von Greskamp:
Ist es so das nicht alle Befehle dann verwendet werden können.
Nein, alle Befehle, die eine Interaktion mit dem User benötigen, können nicht verwendet werden. Du brauchst einen Dialog im Annotation, der die Werte abfragt und dann als Parameter ans ME10-Makro übergibt ------------------ meine LISP-Makros sind auf osd.cad.de Disclaimer Grüße aus Wien
 Walter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 03. Dez. 2015 12:51 <-- editieren / zitieren --> Unities abgeben:         
Hallo Walter, kannst du mir sagen was dieses Makro überhaupt macht? DEFINE IWG_frage_rahmen
PARAMETER Uname LOCAL Cname LOCAL Br LOCAL Ho LOCAL Rstr LOCAL Lispstring INQ_ENV 7 LET Cname ('~'+(INQ 302)) EDIT_PART Uname INQ_ENV 7 LET Br (STR (ABS((X_OF (INQ 101))-(X_OF (INQ 102))))) LET Ho (STR (ABS((Y_OF (INQ 101))-(Y_OF (INQ 102))))) LET Rstr (Br+'_'+Ho) EDIT_PART Cname LET Lispstring (DOCU_CSTRING_TO_LSTRING Rstr) LET isopen (DOCU_OPEN_CONNECTION_TO_SD) LET done (DOCU_ADD_LINE_TO_SD Lispstring) LET isclosed (DOCU_CLOSE_CONNECTION_TO_SD) END_DEFINE Kann ich da auch noch ein "display" einfügen damit ich erkenne das es läuft? ------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 03. Dez. 2015 14:43 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
|
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 03. Dez. 2015 15:24 <-- editieren / zitieren --> Unities abgeben:         
|
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003 MS: Windows 10 64bit OSD: 20.1 M020 ModelManager: 20.1 M020 NX 1899 TC 12.3
|
erstellt am: 03. Dez. 2015 15:52 <-- editieren / zitieren --> Unities abgeben:         
|
Walter Geppert Moderator Frank und Frei
     

 Beiträge: 2166 Registriert: 12.12.2000
|
erstellt am: 03. Dez. 2015 22:28 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Noch mal ganz allgemein zu dem Thema: In den Tiefen der Hilfe zum IKit gibts ein Kapitel The ME Macro Programmer's Introduction to Lisp und im Reference Manual gibts eine Menge unter Concepts and Tutorials zum Thema Annotation. So richtig befriedigend find ichs immer noch nicht, aber schon wesentlich ausführlicher als in den Anfangszeiten. Besonderes Augenmerk möchte ich auf das Kapitel Modeling/Annotator Communication: Not to break Associativity lenken, man kann wirklich eine Menge falsch machen mit Makros, die die ME10-Teilestruktur angreifen oder ME10-INFOs modifizieren. Es ist fein, dass uns die Entwickler so tief ins System reinlassen, aber der Preis ist in Form von absoluter Sorgfalt zu entrichten! ------------------ meine LISP-Makros sind auf osd.cad.de Disclaimer Grüße aus Wien
 Walter 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: 03. Dez. 2015 22:30 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
|