| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: reactor in lisp (1230 mal gelesen)
|
zech Mitglied
Beiträge: 92 Registriert: 09.11.2004 Autocad Architecture 2022, 2024, 2025 Civil3D 2023, Revit 2023
|
erstellt am: 12. Mai. 2011 13:39 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe ein Problem mit de reactoren. Ich weiß nicht genau welchen ich benutzen muss oder ob es überhaut geht. (im Moment nehme ich den command reactor mit vlr-commandEnded) Ich habe in der Zeichnung viele verschiedene Blöcke und möchte den reactor nur aktivieren wenn es ein Block ist dessen Name mit "P_" anfängt. Ich klicke also einen Block an mit der linken Maustaste, greife ihn und verschiebe ihn. Jetzt möchte z.B.: den Layer ändern, bekomme ich hin, aber dies macht der reactor für alles was ich verschiebe (Linien, Schraffuren, Blöcke mit anderen Namen). Der Reactor muss aber gucken ob es ein Block mit dem Namen "P_****" ist. Nur dann soll der Layer oder irgendeine andere Eigenschaft geändert werden. Ich hoffe jeamd hat da eine Idee. Vielen Dank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 12. Mai. 2011 19:25 <-- editieren / zitieren --> Unities abgeben: Nur für zech
Hallo Zech, wenn der Reactor schon soweit funktioniert, dann brauchst Du doch nur noch ein IF mit reinzubauen: Angenommen der der betroffenen Block ist in der Variablen "OBJ" gespeichert: (if (and (=(cdr(assoc 0(entget OBJ)))"INSERT") (wcmatch (cdr(assoc 2 (entget OBJ)))"P_*")) (progn (DannMachLayerUsw... ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zech Mitglied
Beiträge: 92 Registriert: 09.11.2004 Autocad Architecture 2022, 2024, 2025 Civil3D 2023, Revit 2023
|
erstellt am: 13. Mai. 2011 06:22 <-- editieren / zitieren --> Unities abgeben:
Hallo joern, ja das ist ja mein Problem. Wie ordne ich dem gepickten Objekt eine Variable zu? Es läuft ja kein Lisp-Programm ab. Ich klicke einfach ein Objekt an. Dann gehe ich an den Griffpunkt und verschiebe es. "vlr-commandended" greift jetzt, die callback-Funktion wird aufgerufen. Im "callback" gibt es ein "cond" auf "GRIP_STRETCH". Dieser Pfad im "cond" wird dann auch ausgeführt. Hier habe ich aber im Moment nur ein "princ" eingebaut um zu sehen ob die "callback-Funktion" und das "cond" funktionieren. Hier müsste ich jetzt aber irgendwie an das verschobene Objekt (an die Referenz) rankommen, nur da weiß ich nicht wie. Danke nochmal
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 13. Mai. 2011 07:42 <-- editieren / zitieren --> Unities abgeben: Nur für zech
|
zech Mitglied
Beiträge: 92 Registriert: 09.11.2004 Autocad Architecture 2022, 2024, 2025 Civil3D 2023, Revit 2023
|
erstellt am: 13. Mai. 2011 08:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Cadmium, habe ich schon dran gedacht. Ist aber so, das dem object-reactor vorher alle Objekte bekannt sein müssen. Man muss also ein oder mehrere Objekte dem reactor in einer Liste zuordnen (sog. owner). Mal abgesehen von einem bestimmten Block, wie oben beschrieben. Ich möchte die Referenz des Objektes haben welches ich anklicke und verschiebe, das ist eigentlich alles, alles andere ist dann ein Kinderspiel. Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkl-cad Mitglied Technischer Zeichner
Beiträge: 378 Registriert: 23.07.2003 ACAD 2002 Express Tools 1-9 Architektural Desktop Windows XP Server Windows 2003 3 GHz Rechner 1 GB RAM 80 GB Festplatte ATI FireGL V3100 2 17" Flachbildschirme
|
erstellt am: 13. Mai. 2011 13:16 <-- editieren / zitieren --> Unities abgeben: Nur für zech
Nur mal so ins blaue getippt. Was ist wenn du den Befehl zum Eigenschaften ändern neu definierst und dann nach der Wahl der Objekte diese prüfen läßt und nur dann wenn alles OK ist den Befehl aufrufst. Sollen denn alle anderen Objekte nicht zu ändern sein können? ------------------ Martin Viele Grüße aus dem schönen Münsterland! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 14. Mai. 2011 19:53 <-- editieren / zitieren --> Unities abgeben: Nur für zech
Zitat: Original erstellt von zech: Hallo Cadmium, habe ich schon dran gedacht. Ist aber so, das dem object-reactor vorher alle Objekte bekannt sein müssen. Man muss also ein oder mehrere Objekte dem reactor in einer Liste zuordnen (sog. owner). Mal abgesehen von einem bestimmten Block, wie oben beschrieben. Ich möchte die Referenz des Objektes haben welches ich anklicke und verschiebe, das ist eigentlich alles, alles andere ist dann ein Kinderspiel.Danke
Dein Problem ist kein exotisches, sondern ein ganz und gar alltägliches im Umgang mit Reaktoren. Das Problem ist, dass Du einen Objektreaktor bräuchtest, dass aber eine vom Objektreaktor ausgelöste Funktion das den Reaktor auslösende Objekt nicht verändern darf. Das geht logischerweise nur mit einer Kombination von Objekt- und Editor-Reaktor. Wenn Du alle Blockreferenzen überwachen willst, deren Namen mit "P-" beginnen, dann musst Du unmittelbar beim Öffnen der Zeichnung alle solchen Blockreferenzen und danach auch alle neu eingefügten Blöcke zu "Ownern" des Objektreaktors machen. Die Objektreaktorfunktion aber macht gar nix, außer dass sie alle Objekte, die den Reaktor auslösen, in einer globalen Liste sammelt. Der Editor-Reaktor braucht jetzt nur nach dem Beenden der relevanten Befehle nachzusehen, welche Objekte in der globalen Liste stehen, und er kann diese dann nach Bedarf bearbeiten. Am Schluss setzt der Editor-Reaktor die globale Liste der veränderten Objekte wieder auf NIL, und gut isses. Für Deine Anwendung kommen halt noch ein paar kleine Überwachungsfunktionen dazu. Beispielsweise kann ein Block umbenannt werden - wenn er danach nicht mehr mit "P-" anfängt, dann musst Du alle seine Referenzen als Owner des Objektreaktors löschen, fängt der Name jetzt mit "P-" an, dann musst Du alle Referenzen nun hinzunehmen. [Diese Nachricht wurde von archtools am 14. Mai. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zech Mitglied
Beiträge: 92 Registriert: 09.11.2004 Autocad Architecture 2022, 2024, 2025 Civil3D 2023, Revit 2023
|
erstellt am: 16. Mai. 2011 06:35 <-- editieren / zitieren --> Unities abgeben:
Erstmal allen die geantwortet haben, Vielen Dank. Die Lösung mit dem Objektreactor ist mir dann doch zu aufwändig. Aber in Anlehnung an diese Frage eine Ergänzung. Jetzt ganz ohne Reactor. Ich habe ein Objekt markiert durch klicken der linken Maustaste. Danach starte ich ein Lispprogramm. Ist es mir möglich in diesem Programm durch eine entsprechende Funktion festzustellen welches Objekt markiert ist. Eine Möglichkeit muss es doch geben, da bei der Markierung sich ja auch sofort das Eigenschaftenfenster aktualisiert und mir das Objekt anzeigt. Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 16. Mai. 2011 07:23 <-- editieren / zitieren --> Unities abgeben: Nur für zech
|
zech Mitglied
Beiträge: 92 Registriert: 09.11.2004 Autocad Architecture 2022, 2024, 2025 Civil3D 2023, Revit 2023
|
erstellt am: 16. Mai. 2011 07:45 <-- editieren / zitieren --> Unities abgeben:
Ich denke das war ein guter Hinweis. Ich habe allerdings "ssgetfirst" benutzt. Damit klappt es. Ich selektiere ein Objekt in der Zeichnung und ein nachträglich aufgerufenes Lispprogramm kann mit "ssgetfirst" das selektierte Objekt weiterverarbeiten. Danke, ich denke der Fall ist gelöst. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 16. Mai. 2011 08:06 <-- editieren / zitieren --> Unities abgeben: Nur für zech
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 16. Mai. 2011 12:32 <-- editieren / zitieren --> Unities abgeben: Nur für zech
vlr-modified Reaktoren sind ziemlich böse, wenn im Reaktor das Reaktor-aufrufende Objekt geändert wird. Frühere versionen von Autocad sind dabei gnadenlos abgestürtzt, da die im Reaktor aufgerufenen 'Änderung sofort wieder den Reaktor aufgerufen hat. Neuere versionen verweigern mittlerweile jedliche Änderung im Reaktor. Darum sind im Command-willStart (end) Reaktor auch kein (command "....) erlaubt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zech Mitglied
Beiträge: 92 Registriert: 09.11.2004 Autocad Architecture 2022, 2024, 2025 Civil3D 2023, Revit 2023
|
erstellt am: 16. Mai. 2011 12:47 <-- editieren / zitieren --> Unities abgeben:
Das ist jetzt mein Ergebnis und es funktioniert sehr gut, ohne Absturz oder Ähnlichem. (vlr-command-reactor nil '( (:vlr-commandEnded . cmd-end-action))) In der Prozedur "cmd-end-action" wird die Argumentenliste nach "GRIP_STRETCH" durchsucht, wenn ok dann wird mit "ssgetfirst" das Objekt identifziert und wenn das Objekt ein Block ist mit dem Namen "P_*" dann wird es geändert. Dank an alle die hier gepostet haben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |