| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: ansichtsfenster koordianten (3076 mal gelesen)
|
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 17. Feb. 2003 10:02 <-- editieren / zitieren --> Unities abgeben:
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 17. Feb. 2003 11:16 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Da gibt es zwei Möglichkeiten: Mit ActiveX kann man über Document.ActiveLayout an das derzeit aktive Ansichtsfenster rankommen - wenn es nicht aktiv ist, geht es über Document.Viewports.Item. Die Variable TILEMODE muss 0 sein. Über Viewport.LowerLeftCorner und Viewport.UpperRightCorner kann man's dann auslesen. Etwas nifteliger ist Standard-Lisp: Über (entget <mansfen> )) kommst du an die Daten. Die Koordinaten der Ecken sind nicht gespeichert, sondern der Mittelpunkt (GC10) und Breite (GC 40) sowie die Höhe (GC 41). Die Ecken musst du dann ausrechnen. Hinweis: Manche Daten eines Viewports sind nicht als normale DXF-GCs gespeichert, sondern werden als XData von AutoCAD verwaltet. Um die Ecken auszurechnen, reicht aber der normale Teil. In den Modellbereich kannst du in beiden Fällen mit (trans <pt> 2 0) umrechnen. Gruss, Axel ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 17. Feb. 2003 12:06 <-- editieren / zitieren --> Unities abgeben:
Hi Axel! Danke für die schnelle Antwort! Bist Du sicher, daß man mit trans von layout nach modell transformieren kann?. Funkt. der Befehl nicht immer nur innerhalb der Bereiche. Man kann das Ansichtsfenster im layout doch auch verschieben, die Koordinate im modell müsste aber immer noch gleich sein. (Transformationsparameter wurden nicht geändert!!) Ciao Georg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 17. Feb. 2003 12:12 <-- editieren / zitieren --> Unities abgeben:
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 17. Feb. 2003 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Ich bin mir ziemlich sicher, weil ich schon mehrere Programme geschrieben habe, die Geometrie deckungsgleich vom Papier- in den Modellbereich verschieben/kopieren und umgekehrt. Solange keine BKS in den Mansfens vorliegen, geht das mit den erwähnten Operationen. Trans funktioniert da auf jeden Fall! Ätzend wird es nur, wenn BKS, DVIEW usw. ins Spiel kommen. Da muss man sich dann durch die EEDs quälen, die - soweit ich weiss - nirgends dokumentiert sind (ausser in dem Buch 'Maximizing AutoLisp', wenn ich mich richtig erinnere). Die ActiveX-Methode vereinheitlicht das wenigstens alles, allerdings ist da zu befürchten, dass wieder zwei, drei Sachen vergessen wurden wie immer. Bei den ActiveX-Methoden sind ja fast immer nur 95% implementiert, und der Rest fehlt einfach. Das merkt man dann meistens erst, wenn man fast fertig ist:-( ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 17. Feb. 2003 15:28 <-- editieren / zitieren --> Unities abgeben:
Hallo Axel! Im Anhang befindet sich eine lisp und dwg. Bei Punktwahl im layoutbereich erhalte ich als Ergebnis der Transformation immer die layout-Koordinate zurück. Was läuft da falsch?? Ciao Georg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 18. Feb. 2003 09:48 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Georg, ein paar Korrekturen: vla-get-LowerLeftCorner und --UpperRightCorner sind nicht für PViewport, sondern für Model-Vports definiert. Es geht also in beiden Fällen um Zentrum, Höhe, Breite. Und es ist (trans 3 2), kleine Verwechslung;-) Diese Lisp-Routine macht dir einen 'Durchschlag' des aktiven Mansfens im Modellbereich (aber nur, wenn kein BKS usw. -- es wird nichts geprüft!): (defun vrect( / doc vport model c h w p pts) (vl-load-com) (setq vport (vla-get-ActivePViewport (setq doc (vla-get-ActiveDocument(vlax-get-acad-object)) ) ) ) (setq model(vla-get-ModelSpace doc)) (setq c (vlax-safearray->list(vlax-variant-value(vla-get-Center vport))) h (vla-get-height vport) w (vla-get-width vport) ) (setq pts (mapcar (function(lambda(pt / )(vlax-3d-point(trans pt 3 2)))) (list (setq p(list(-(car c)(/ w 2.0))(+(cadr c)(/ h 2.0))0)) (setq p(list(+(car p)w)(cadr p)0)) (setq p(list(car p)(-(cadr p)h)0)) (setq p(list(-(car p)w)(cadr p)0)) ) ) ) (mapcar (function(lambda(start end / )(vla-AddLine model start end))) pts (cons(last pts)pts) ) ) Dein Bsp. kann ich mir frühestens heute abend ansehen. ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 19. Feb. 2003 14:14 <-- editieren / zitieren --> Unities abgeben:
Hi Axel! Bei Reini Urban habe ich folgende lisp gefunden. Wie schon vermutet und von Dir auch angesprochen befinden sich die Transformations-parameter im EED-Bereich des viewports. Bis zu ca. 5 Vorkommastellen funktioniert das ganze ohne Probleme. Ab 6-7 Vorkommastellen wird das Ergebnis jedoch sehr unscharf. (arbeite hauptsächlich mit Gauss-Krüger-Koordinaten, 7 Vorkommast. siehe auch Anhang) Kennst Du das Probl.? Wie kann ich die Genauigkeit in diesem Bereich erhöhen? (DEFUN C:ele () ; (defun #VPT_BOX ( $view / ; Ename of viewport v_eed ; Viewport entity list including EED v_psw ; Paper space width v_psh ; height v_msw ; Model space width v_msh ; height v_msxp ; view centre x point v_msyp ; y point v_ang ; twist angle v_xy1 ; left bottom point v_xy2 ; right bottom point v_xy3 ; right top point v_xy4 ; left top point v_scale ; scale #ent_gc ; Local function ) (defun #ENT_GC ( $gc $list ) ; Return group code from list (cdr (assoc $gc $list)) ; | );end defun #ENT_GC ; | (defun #TRG_ROT ( $point ; 2D point ; Rotate point $angle / ; Angle in radians ; | x y ; x & y of $point ; | ca sa ; cos/sin of $angle; | ) ; | (setq x (car $point) ; | y (cadr $point) ; | ca (cos $angle) ; | sa (sin $angle) ; | ) ; | (list (- (* x ca) (* y sa)) ; | (+ (* x sa) (* y ca)) ; | ) ; | );end defun #TRG_ROT ; | ; **** MAIN BODY **** (if (and (= 'ENAME (type $view)) ; if Ename passed and... (setq v_eed (entget $view '("ACAD"))) ; .. got entity list and... (= "VIEWPORT" (#ent_gc 0 v_eed)) ; .. is viewport ) ; | (progn ; | (setq v_psw (#ent_gc 40 v_eed) ; | paper space width v_psh (#ent_gc 41 v_eed) ; | paper space height v_eed (cdar (#ent_gc -3 v_eed)) ; | extended entity data v_eed (member ; | discard EED before twist angle (assoc 1040 v_eed) v_eed ; | | ) ; | | v_ang (#ent_gc 1040 v_eed) ; | 1st gc 1040 (twist angle) v_eed (cdr v_eed) ; | remainder of eed v_msh (#ent_gc 1040 v_eed) ; | 2nd gc 1040 (view height) v_eed (cdr v_eed) ; | remainder of eed v_msxp (#ent_gc 1040 v_eed) ; | 3rd gc 1040 (view x point) v_eed (cdr v_eed) ; | remainder of eed v_msyp (#ent_gc 1040 v_eed) ; | 4th gc 1040 (view y point) v_scale (/ v_psh v_msh) ; | scale v_msw (/ v_psw v_scale) ; | ms width v_xy1 (list (- v_msxp (/ v_msw 2.0)) ; | ms left border and ... (- v_msyp (/ v_msh 2.0)) ; | bottom border ) ; | ) ; | (setq v_ang (- (* 2.0 pi) v_ang) ; | v_xy1 (#trg_rot v_xy1 v_ang) ; | 1st point v_xy2 (polar v_xy1 v_ang v_msw) ; | 2nd point v_ang (+ v_ang (/ pi 2.0)) ; | turn 90 deg v_xy3 (polar v_xy2 v_ang v_msh) ; | 3rd point v_ang (+ v_ang (/ pi 2.0)) ; | turn 90 deg v_xy4 (polar v_xy3 v_ang v_msw) ; | 4th point ) ; | (PRINC v_msxp) (TERPRI) (PRINC v_msyp) (TERPRI) (list v_xy1 v_xy2 v_xy3 v_xy4) ; | corner points );end progn ; | );end if ; end if );end defun #VPT_BOX ; (SETQ element (CAR (ENTSEL "Bitte viewport wählen: "))) (PRINC element) (TERPRI) (SETQ punkte (#VPT_BOX element)) ) Gruß Georg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|