| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: 90 Grad rotieren (2319 mal gelesen)
|
archstudent Mitglied
Beiträge: 29 Registriert: 06.02.2005
|
erstellt am: 24. Aug. 2005 13:59 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich möchte das Arbeitstempo mit Autocad etwas verbessern. Statt dem normalen drehen soll z.B. Drehen um 90 Grad mit dem Tastenkürzel Str + L (bzw R) funktionieren. Jetzt wollte ich mir ein Button machen und diesen mit einem vlisp verknüpfen. Allerdings klappt das mit dem lisp noch nicht so (soll mein erster Code werden... ;-)) ;;; Function C:rotate90 = Programm (defun C:rotate90 ()
; objekt wählen, aus Schwerpunkt rotationsachse wählen ; rotieren um 90 Grad
Command: (command "_rotate" P1 P2 "") ) (princ)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Wie bekomme ich den Schwerpunkt eines beliebigen Objekts? Wie kann ich den Winkel von z.B. 90 Grad am Besten reinbasteln?
Danke! Dominik
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 24. Aug. 2005 14:16 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
normales rotieren: (command "_rotate" pause "" pause "90") und (command "_rotate" pause "" pause "-90") .. und wo ist der "Schwerpunkt" z.B. einer Polylinie .. Lnienschwerpunkt,Flächenschwerpunkt usw... das ist auch etwas mehr Rechnerei ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." 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: 24. Aug. 2005 16:00 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
Hallo Dominik Also wenn das dein erster Code werden soll hast du dir zu viel vorgenommen. Die Aufgabenstellung hört sich zwar einfach an, ist sie aber nicht. Das ist zwar bei Objekten wie Kreise oder Linien zu bewerkstelligen, aber bei andern komplexeren Objekten, oder mehreren unterschidelichen eine irre Arbeit (soll heißen nicht zu machen). Zudem ist auch fraglich ob man die Objekte immer um den Schwerpunkt drehen möchte. Für den Anfang ist die Lösung von Thomas genau das Richtige. ------------------ Martin Viele Grüße aus dem schönen Münsterland! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archstudent Mitglied
Beiträge: 29 Registriert: 06.02.2005
|
erstellt am: 24. Aug. 2005 17:09 <-- editieren / zitieren --> Unities abgeben:
Gerne ein bischen mehr! ;-) Hab' mich zuvor schon mit VBA beschäftigt, nun wollte ich mal n' bischen lispeln. ...es muß ja nicht genau der Schwerpunkt aller Objekte sein. Wenn ich allerdings den Nullpunkt angebe, kann es sein, daß ich erst einmal mit suchen beschäftigt bin. Es reicht vielleicht schon die Auswahlstelle oder so.
Wie bekomme ich es hin, daß ich auch mehrere Objekte auf einmal wählen kann? ;;; Function C:rotate90 = Programm (defun C:rotate90 ()
; objekt wählen, aus Schwerpunkt rotationsachse wählen ; rotieren um 90 Grad Command: (command "_rotate" pause "" pause "90") ) (princ)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 24. Aug. 2005 17:29 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
Zitat: Original erstellt von archstudent: Wie bekomme ich es hin, daß ich auch mehrere Objekte auf einmal wählen kann?
Code:
(princ "\nLos jetzt, wählen!: ") (setq sget (ssget))
Wenn Du dann was gewählt hast, erhälst Du ein Selection Set. Weitere Vearbeitung siehe VLisp-Hilfe: ssname, sslength, repeat, while ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archstudent Mitglied
Beiträge: 29 Registriert: 06.02.2005
|
erstellt am: 24. Aug. 2005 19:16 <-- editieren / zitieren --> Unities abgeben:
Danke Marc, funktioniert so weit alles. Wie kann man die Anzahl der Klicks aber noch reduzieren, z.B. das nach dem Kreuzen keine Bestätigung erforderlich ist und daß das Selectionset nicht vor dem rotieren und der Auswahl des Basispunktes zusätzlich aktiviert werden muß? ;;; Function C:Abdichtung = Programm (defun C:rotate90 ()
; objekt wählen, aus Schwerpunkt rotationsachse wählen
(princ "\nLos jetzt, wählen!: ") (setq alles (ssget))
; rotieren um 90 Grad Command: (command "_rotate" pause "" pause "90") )
(princ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 24. Aug. 2005 19:59 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
1. Was ist das was du da gepostet hast ? (oder ist dir da Code in die Signatur gerutscht ?) 2. Was funktioniert alles ? Poste mal was du hast - denn ohne deinen Code zu sehen können wir nicht sagen was geändert gehört. Das was du da gepostet hast kann nicht funktionieren... 3. Wie soll AutoCAD wissen, dass du keine weiteren Objekte wählen willst wenn du dies nicht explizit bestätigst ? 4. Das mit dem Basispunkt ist dasselbe wie bei Punkt 2. (wir brauchen den Code um zu wissen was korregiert gehört) ------------------ Grüsse Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 24. Aug. 2005 21:44 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
Zitat: Original erstellt von archstudent: Ich möchte das Arbeitstempo mit Autocad etwas verbessern...
..lassen ? Wenn mein Eindruck täuschen soll, dann arbeite dich z.B. mit Mapcar'S Seiten oder der Online-Hilfe im VLIDE etwas in die Lisp-Thematik ein und dann geht's konkret weiter. Wie soll das funktionieren , wenn dir hier was von vla-get-Boundingbox, mapcar und anderen Sachen erzählt wird und das Elementare fehlt ? P.S.Die Foren-Suchfunktion sollte zu den Stichworten auch schon etwas finden. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archstudent Mitglied
Beiträge: 29 Registriert: 06.02.2005
|
erstellt am: 24. Aug. 2005 22:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas! Es geht lediglich darum, durch ein Tastenkürzel selektierte Objekte um 90 Grad zu drehen, statt den nette Drehen-Button anzuklicken, das Objekt zu wählen, zu bestätigen, den Winkel von 90 Grad einzutippen und dann nochmal zu bestätigen..... Dat muß mit ner lächerlichen Zeile Lisp funktionieren!!! Funktioniert auch soweit, nachdem man ein BD-Button damit gefütter und ein Tastenkürzel vergeben hat. Autocad dürfte wohl eines der besten CAD-Programme sein,im Vergleich zu Vectorworks ist es aber im Bereich Arbeitstempo "nackt" schlichtweg lahm. Aber da kann man ja nachhelfen! Trotzdem danke für den Link! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 24. Aug. 2005 23:00 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
ok .. wenn's schon um Selektierte Elemente geht : (if (or(setq AUSWAHL(ssget "_I")) (setq AUSWAHL(ssget)) ) (command "_rotate" AUSWAHL "" pause "90") ) P.S. kann man auch in eine Zeile schreiben ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 24. Aug. 2005 23:19 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
Hallo archstudent, Ich denke du brauchst erst einmal einen Fahrplan, und dann kannst du dich mit einzelnen Details beschäftigen. In jedem deiner Beiträge kam bisher immer auch ein neuer Wunsch zur Funktionalität heraus .. wäre das alles von Beginn an bekannt gewesen, hätten die Lösungsvorschläge sicher auch anders ausgesehen. Wenn ich das alles richtig interpretiere, dann wählst du irgendwie irgendwelche Zeichnungselemente aus, mit einem KreuzenFenster - ok. Dieser Vorgang gehört mit in das Lisp, nur dann kannst du auf einfachem Wege den Drehpunkt bestimmen und den zusätzlichen Klick zum Beenden der Objektwahl sparen. du musst also wie folgt vorgehen: (setq p1(getpoint ..);erste Fensterecke (setq p2(getcorner p1 ..);zweite Fensterecke (setq aws(ssget "_C" p1 ..);Kreuzen-Auswahl, evtl, auch noch eine Filterliste? (setq dpt (list (/(+ (car p1)(car p2))2.0)(/(+ (cadr p1)(cadr p2))2.0)));Das ist die Mitte des Kreuzen-Fensters Nun hast du alles, was du brauchst: aws=Elemente als Auswahlsatz dpt=Drehpunkt (command "_rotate" aws "" dpt 90.0) Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Autodesk User Group Central Europe Individuelle Lösungen von Heute auf Morgen. AUGCE Manager Deutschland Jackpot on demand - Wir eröffnen den Spätsommer mit einer Verlosung!
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: 25. Aug. 2005 07:57 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
Hallo ich glaube ich weiß nun was Dominik genau will. Die Lösung von Holger ist zwar schon richtig. Dominik möchte aber als Auswahlsatz die schon markierten Objekte benutzen (Objekt vor Befehl)? So: ? (defun C:rotate90 () (setq AWS (ssget)) (princ "\nDrehpunkt: ") (command "_rotate" aws "" pause 90.0) (princ) ) So schon besser? Aber deine Wünsche gehen zu weit :-) Wie soll ACAD ohne Bestätigung wissen wann man alle Objekte gewählt hat? Einzelauswahl geht. (Variable pickadd) Wie soll ermittelt werden um welchen Punkt die Objekte gedreht werden sollen. Ermittlung eines Schwerpunktes ist zu schwer, siehe oben. Das mach bei einzelnen Objekten ja eher gehen, bei Blöcken wirds schon wieder schwer. Sollen die um den Basispunkt gedreht werden? Und Polylinien? Man könnte dann höchstens einen Filter einbauen der solche Objekte ausfiltert. Ein Programm das von allen verschiednen Objekten den Scherpunkt ermittelt mach ich aber nicht (Hab dafür momentan keine Zeit)
OK, hab gerade gesehen das Thomas das schon vorgeschlagen hat. Dann vergessen wir mein gelispel da oben wieder. ------------------ Martin Viele Grüße aus dem schönen Münsterland!
[Diese Nachricht wurde von mkl-cad am 25. Aug. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 25. Aug. 2005 12:39 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
Hallo Dominik! ich hatte hier mal die Funktion get-bounding-box eingestellt. Mit einer kleinen Änderung kriegt man damit auch so eine Art "Schwerpunkt". In Wirklichkeit ist das die Mitte des umschreibenden Rechtecks, aber bei den meisten Grundobjekten damit auch der "Schwerkunkt", bzw. die "Mitte" des Objekts. Hier der geänderte Code: Code: (defun get-bounding-box-center (ename / vlaname minb maxb) (vl-load-com) (setq vlaname (vlax-ename->vla-object ename)) (vla-GetBoundingBox vlaname 'minb 'maxb) (setq minb (vlax-safearray->list minb)) (setq maxb (vlax-safearray->list maxb)) (list (/ (+ (car minb) (car maxb)) 2) (/ (+ (cadr minb) (cadr maxb)) 2) (/ (+ (last minb) (last maxb)) 2)) )
Einschränkung: geht nur mit einem Objekt. Der Dreh wäre dann mit Code: (command "_rotate" (setq dummy (car (entsel))) "" (get-bounding-box-center dummy) 90)
zu bewerkstelligen.Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 25. Aug. 2005 12:53 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
Zitat: Original erstellt von wronzky: Einschränkung: geht nur mit einem Objekt
wie man es auf mehrere anwedet kannst du z.B:hieraus entnehmen ...
------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archstudent Mitglied
Beiträge: 29 Registriert: 06.02.2005
|
erstellt am: 25. Aug. 2005 20:46 <-- editieren / zitieren --> Unities abgeben:
Hey, danke für die vielen Lösungen!!! ich hab' mir jetzt was zusammengebastelt: (defun C:r90 ( / AUSWAHL INDEX elem xmin xmax MINX MAXX MINY MAXY) (vl-load-com) (if(or(and(setq AUSWAHL (ssget "I"))(>(sslength AUSWAHL) 0)) (and(setq AUSWAHL (ssget)) (>(sslength AUSWAHL) 0)) ) (progn (setvar "Pickfirst" 1) (command "_ucs" "_W") (setq INDEX -1) (repeat (sslength AUSWAHL) (setq ELEM(ssname AUSWAHL(setq INDEX (1+ INDEX)))) (vla-getboundingbox (vlax-ename->vla-object elem) 'xmin 'xmax ) (if (= INDEX 0) (progn (setq MINX (car (vlax-safearray->list xmin))) (setq MINY (cadr(vlax-safearray->list xmin))) (setq MAXX (car (vlax-safearray->list xmax))) (setq MAXY (cadr(vlax-safearray->list xmax))) ) (progn (if (<(car (vlax-safearray->list xmin)) MINX)(setq MINX (car (vlax-safearray->list xmin)))) (if (<(cadr(vlax-safearray->list xmin)) MINY)(setq MINY (cadr(vlax-safearray->list xmin)))) (if (>(car (vlax-safearray->list xmax)) MAXX)(setq MAXX (car (vlax-safearray->list xmax)))) (if (>(cadr(vlax-safearray->list xmax)) MAXY)(setq MAXY (cadr(vlax-safearray->list xmax)))) ) ) )
(setq minb (list MINX MINY)) (setq maxb (list MAXX MAXY)) (command "_rotate" AUSWAHL "" (list (/ (+ (car minb) (car maxb)) 2) (/ (+ (cadr minb) (cadr maxb)) 2) (/ (+ (last minb) (last maxb)) 2)) 90.0) (command "_ucs" "_V") ) ) ) ...funktioniert super! *ggg*
Wenn jetzt nur noch das(/die) gedrehte(n) Objekt(e) selektiert blieben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 25. Aug. 2005 20:52 <-- editieren / zitieren --> Unities abgeben: Nur für archstudent
|
archstudent Mitglied
Beiträge: 29 Registriert: 06.02.2005
|
erstellt am: 25. Aug. 2005 21:17 <-- editieren / zitieren --> Unities abgeben:
Genial! Autocad geht so langsam richtig ab... :-))))))))))) Der fertige Code: (defun C:r90 ( / AUSWAHL INDEX elem xmin xmax MINX MAXX MINY MAXY) (vl-load-com) (if(or(and(setq AUSWAHL (ssget "I"))(>(sslength AUSWAHL) 0)) (and(setq AUSWAHL (ssget)) (>(sslength AUSWAHL) 0)) ) (progn (setvar "Pickfirst" 1) (command "_ucs" "_W") (setq INDEX -1) (repeat (sslength AUSWAHL) (setq ELEM(ssname AUSWAHL(setq INDEX (1+ INDEX)))) (vla-getboundingbox (vlax-ename->vla-object elem) 'xmin 'xmax ) (if (= INDEX 0) (progn (setq MINX (car (vlax-safearray->list xmin))) (setq MINY (cadr(vlax-safearray->list xmin))) (setq MAXX (car (vlax-safearray->list xmax))) (setq MAXY (cadr(vlax-safearray->list xmax))) ) (progn (if (<(car (vlax-safearray->list xmin)) MINX)(setq MINX (car (vlax-safearray->list xmin)))) (if (<(cadr(vlax-safearray->list xmin)) MINY)(setq MINY (cadr(vlax-safearray->list xmin)))) (if (>(car (vlax-safearray->list xmax)) MAXX)(setq MAXX (car (vlax-safearray->list xmax)))) (if (>(cadr(vlax-safearray->list xmax)) MAXY)(setq MAXY (cadr(vlax-safearray->list xmax)))) ) ) ) (setq minb (list MINX MINY)) (setq maxb (list MAXX MAXY)) (command "_rotate" AUSWAHL "" (list (/ (+ (car minb) (car maxb)) 2) (/ (+ (cadr minb) (cadr maxb)) 2) (/ (+ (last minb) (last maxb)) 2)) 90.0) (command "_ucs" "_V") (sssetfirst AUSWAHL AUSWAHL) ) ) ) Danke an alle!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |