• Dieses Forum ist die maschinengenerierte Übersetzung von www.cad3d.it/forum1 - der italienischen Design-Community. Einige Begriffe sind nicht korrekt übersetzt.

Coordinate Viewport in LISP

  • Ersteller Ersteller Cristallo
  • Erstellt am Erstellt am

Cristallo

Guest
in einer Zeichnung habe ich mehrere Layouts
Ich bekomme die Liste durch (Setq Layouts (layoutlist))
Ich bestelle sie nach (Setq Layouts (acad_strlsort Layouts))

dann für jeden versuche ich die Info des Viewports zu bekommen (ich habe nur 1 für jedes Layout) - wir sagen, ich suche nach dem Viewport des Layouts 1002
(setq p (ssget "x" (cons 0 "viewport") (cons 410 "1002"))
(setq view0 (entget (Name p 0)))

Ich bekomme die Viewport-Entity-Liste auf diesem speziellen Layout und versuche herauszufinden, was die Extreme der Ansicht, aber ich kann nicht. Ich weiß, dass die Gruppe 10 das Zentrum der Ansicht ist, aber ich brauche Winkel (die Anzeigebox zu verstehen), um die Wesen der Ansichtskarte im Modell auswählen zu können.
Kann mir etwas Gurus sagen?
 
uno tra i metodi se la finestra è rettangolare:

selezionare das Fenster nel layout
(setq flay (vlax-ename->vla-object))

Trovare il Begrenzungsbox della finestra (p1 e p2)
(vla-getboundingbox flay 'p1* 'p2*)
(setq p1 (vlax-safearray->list p1*))
(setq p2 (vlax-safearray->list p2*))
(setq p1 (list (car p1) (cadr p1))
(setq p2 (list (car p2) (cadr p2))

trasforma le koordinate da layout a modello
(setq p1 (trans p1 3 2)
(setq p2 (trans p2 3 2))
 
Otopen
(vlax-get-property vlaobj "center")
(vlax-get-property vlaobj "width") larghezza
(vlax-get-property vlaobj "height") altezza
 
oder
wenn ent die Liste der Ansichtsstellen ist
(cdr (assoc 10 ent) Zentralpunkt
(cdr (assoc 40 ent) Breite
(cdr (assoc 41 ent) Höhe
 
erste Tests:
mit der Methode der Rpor, durch Bauch, Breite und Höhe Ich komme zu den gleichen identischen Koordinaten der Begrenzungsbox von gp, aber ich muss 3-4 Schritte tun, um dorthin zu gelangen, so bevorzugt ich die Lösung von gp viel sofortiger.

Das große Problem, das ich finde, ist die Trans.
1) gibt nur einen Wert zurück, wenn die aktuelle Anzeige auf dem Layout ist. wenn sie im Modell sind, gibt nil zurück.
2) gibt es eine Übersetzung zwischen den Punkten von trans und denen, die stattdessen richtig wären. Es ist eine reine Übersetzung, denn wenn ich eine Linie (im Modell) zwischen den beiden Punkten der Begrenzungsbox zeichnen, deckt die Linie perfekt die Größe des Fensters ab, aber einen Ton (die ich nicht verstehe, was gebunden ist).

Ich hänge sowohl das Fragment der beiden Kodizes (gp-Lösung - rpor-Lösung) als auch einen Extrakt der dwg-Datei an, damit ich meine Schwierigkeiten überprüfen kann.
Code:
 (Setq-Layoutlist)
(setq layouts (acad_strlsort layouts))
(setq ad (getvar "dwgprefix"))
(setq layfol (strcat ad "layouts"))
(vl-mkdir layfol)

(Setq Layoutnummer (Längenlayouts))
(setq count 0)
(setq layout (nth 0 layouts))
(setq vp (ssget "x" (list (cons 0 "viewport")(cons 410 layout)))
****************************************************************************************************************************************************************************************************************************************************************
(setq flay (vlax-ename->vla-object (ssname vp 0)))
(vla-getboundingbox flay 'p1* 'p2*)
(setq p1 (vlax-safearray->list p1*))
(setq p2 (vlax-safearray->list p2*))
(setq p3 (list (car p1) (cadr p1))
(setq p4 (list (car p2) (cadr p2))
(setq p5 (trans p3 3 2))
(Satz p6 (trans p4 3 2))
********* ****************************************************************************************************************************************************************************************************************************************************************
(setq oldosmode (getvar "osmode"))
(setvar "osmode" 0)
(Befehl "_line" p5 p6 ")

Code:
****************************************************************************************************************************************************************************************************************************************************************
(setq centro (vlax-safearray->list (vlax-variant-value)))
(setq larghezza (vlax-get-property flay "width"))
(setq altezza (vlax-get-property flay "height"))
(setq p01x (- (nth 0 centro)(/ larghezza) 2)
(setq p01y (- (nth 1 centro)(/ altezza 2)))
(setq p01 (Liste p01x p01y (nth 2 centro)))
****************************************************************************************************************************************************************************************************************************************************************
 

Anhänge

Code:
 (Setq-Layoutlist)
(setq layouts (acad_strlsort layouts))
(setq ad (getvar "dwgprefix"))
(setq layfol (strcat ad "layouts"))
(vl-mkdir layfol)

(Setq Layoutnummer (Längenlayouts))
(setq count 0)
(setq layout (nth 0 layouts))
(setq vp (ssget "x" (list (cons 0 "viewport")(cons 410 layout)))
(Setvar "Clayout" Layout) ;<==== rendi corrente il layout
****************************************************************************************************************************************************************************************************************************************************************
(setq flay (vlax-ename->vla-object (ssname vp 0)))
(vla-getboundingbox flay 'p1* 'p2*)
(setq p1 (vlax-safearray->list p1*))
(setq p2 (vlax-safearray->list p2*))
(setq p3 (list (car p1) (cadr p1))
(setq p4 (list (car p2) (cadr p2))
(setq p5 (trans p3 3 2))
(Satz p6 (trans p4 3 2))
********* ****************************************************************************************************************************************************************************************************************************************************************
(setvar "clayout" "model") ;<=== rendi corrente model
(setq oldosmode (getvar "osmode"))
(setvar "osmode" 0)
(Befehl "_line" p5 p6 ")
 
Zuletzt bearbeitet:
weil Code 3 auf die dcs des Papierraums verweist, wenn Sie nicht im Layout sind, können Sie die Koordinaten nicht berechnen.
Ich verstand dies, aber wenn ich ihn aus dem Papierraum umsetzen lasse, kehrt er mir Werte zurück, die nicht die genauen sind. Es gibt eine 950 Übersetzungseinheit (von beiden Punkten, identisch), als ob es etwas gab, das ich nicht identifizieren kann.
die genaue Lücke ist dies:
Delta x = 920.4609, Delta y = -258.0204, Delta z = 0,0000
 
Zuletzt bearbeitet:
in der Ansichtsliste gibt es die Unterliste (17 920.46 -258.024 30.4836), die Ihr Gerüst ist, fragen Sie mich nicht, warum ich nie passierte, die Werte zu den berechneten Koordinaten zusammenfassen und alles fixieren.
Kopieren / Einfügen von Ihrem dwg das Problem rekreiert, Erstellen einer neuen dwg, Pasting Ihr (nur Modell) und Einfügen des Viewport, das Problem verschwindet.
Ich werde es untersuchen.
Bye
 
Die Subliste 17 entspricht der .target-Eigenschaft des Viewport-Objekts.
x y z Summenwerte unabhängig von p5 und p6 Punkten.
 
Die Subliste 17 entspricht der .target-Eigenschaft des Viewport-Objekts.
x y z Summenwerte unabhängig von p5 und p6 Punkten.
perfekt.
Gruppe 17 ist der Wert der Zielgröße von Autocad. nur mit Hilfe von
Code:
(fun c:reset_target () (Befehl "_.dview" "" "_po" '(0 0 0 0 0) '(0 0 1) "_x")
in allen Fällen funktioniert Ihre Methode durch Hinzufügen von Koordinaten.
die Methode zur Summe unabhängig von den Koordinaten funktioniert sowieso, denn selbst wenn der Zielwert nicht gesetzt ist, scheint die Gruppe immer in der Ansichtsliste vorhanden zu sein.
 
Ich weiß nicht, ob ich helfen kann, denn ich beziehe mich auf einen Code, den ich vor langer Zeit geschrieben habe, es ist nicht lisp, aber ich weiß, dass ich meine Pointing-Probleme im dxf parser gelöst habe, indem ich den Gruppencode 71 betrachtete.
Wenn Sie es nicht finden, oder ich erinnere mich nicht gut, es ist null, die Ansicht ist keine Perspektive, so habe ich einfach die wp und tp auf der Erweiterung des Objekts.
Code:
 während s1$<>"endtab"
s$=dxff.readline:s1$=dxff.readline
wenn int(val(s$)=16 dann wpx=val(s1$)
wenn int(val(s$))=26 dann wpy=val(s1$)
wenn int(val(s$)=36 dann wpz=val(s1$)
wenn int(val(s$)=17 dann tpx=val(s1$)
wenn int(val(s$)=27 dann tpy=val(s1$)
wenn int(val(s$)=37 dann tpz=val(s1$)
wenn int(val(s$)=71 dann orto=val(s1$)
wir
 
Leute, ich zeige dir die Evolution.
durch Gewohnheit/Komfort Arbeit in einer einzigen Datei mit vielen Tabellen (die letzte hatte 46), Erstellen eines Layouts für jede Tabelle.
Dies liegt daran, dass ich, wenn gefragt, alle Zeichnungen durch Veröffentlichung, sehr schnell und weil, wenn ich einen Wechsel irgendwo machen, ist es viel einfacher, alle abhängigen Tabellen zu aktualisieren.
da einige Kunden nicht wollen eine Datei mit 46 Tabellen, aber 46 Dateien von 1 Tabelle, musste ich die Datei ihrer Bestandteile Layouts exportieren.
Layoutexport, exportieren das Layout, aber nur im Modellraum (Sie verlieren das Layout) und vor allem exportieren es mit dem im Layout gesetzten Display (wenn Sie im Layout "Representing print styles" eingerichtet haben, finden Sie das schwarze und weiße Modell.
und vor allem für einzelnes Layout.
Ich versuchte andere Lispe (Typ lxa), die ein Layout-Export-Mehrfach ist, aber leidet an den gleichen Problemen von Exportlayout (offensichtlich)
Ich versuchte Layoutstodwgs aber es tut ein Fall, ich repliziere das gesamte Modell, so eine 13mbyte Datei wurde mir 46 13mbyte Dateien

und dann schrieb ich es, mit Hilfe von gp (großer Meister) und rpor66 (anderes Tier der Lispe).
Es ist ein wenig grob, wenig Fehlerkontrolle, aber tun, was Sie brauchen
Exportieren Sie jedes Layout in eine separate Datei, wobei die einzigen im Layoutfenster und dem Layout selbst enthaltenen Einheiten, einschließlich der relevanten Einheiten im Papierraum, gehalten werden.

Code:
(defun reset_var()
(setq layouts nil ad nil layfol nil oldrgnmode nil layoutnumber nil count nil)
(setq vp nil flay nil p1 nil p2 nil p3 nil p4 nil p5 nil p6 nil p7 nil p8 nil)
(setq target_vp nil oldosmode nil todel nil count1 nil layname nil file_name nil)
(setq pspace_ent nil oldmaxvp nil old_thumb nil)
)


;;; exportieren alle Layouts in separaten Dateien in einem Unterordner "layouts"
;;; für jede Datei behalten Modelleinheit und Layout (mit relativer Papierraumeinheit)
;;; Layout muss einen einzigen Vieport, wenn Layout haben mehrere Ansichtspunkte, Probram Bruch.
;;; Tanks zu gp und rpor66 von cad3d.it zu lösen meine Dealock

(Defun c:layexport9 ()

(vl-load-com)


(setq oldmaxvp (getvar "maxactvp"))
(setq old_thumb (getvar "updatethumbnail"))
(setvar "clayout" "Modell")


(Setq-Layoutlist)
(setq layouts (acad_strlsort layouts))
(setq ad (getvar "dwgprefix"))
(setq layfol (strcat ad "layouts"))

(falls (findfile layfol)
(Prog.)
(alert "\n la verzeichnis di output e' gia' esistente)
\nla procedura potrebbe sovrascrivere Datei giã esistenti
e produrre risultati inaspettati.
\nil programma sara' terminato e tutte le variabili saranno azzerate")
(reset_var)
(quit)
)
)



(vl-mkdir layfol)
(setq oldrgnmode (getvar "regenmode"))
(setvar "regenmode" 0)

(Setq Layoutnummer (Längenlayouts))
(setq count 0)
(setq pspace_ent (ssget "x" ((67.1))))



(vorherige Layouts
(setvar "maxactvp" 2)
(setvar "updatethumbnail" 0)
(setq layout (nth count layouts))
(setq vp (ssget "x" (list (cons 0 "viewport")(cons 410 layout)))

(falls (>) 2)
(Prog.)
(setq vpnumerr (strcat "nel layou " layout " ci sono piu" di una viewport
\nil programma potrebbe fornire risultati inaspettati e sara' terminato.
\nricordarsi di eliminare la verzeichnis giã creata altrimenti la procedura fallirã nuovamente."))
(alert vpnumerr)
(reset_var)
(quit)
)
)

(setvar "clayout" Layout);;<------ Cambia il layout rendendo corrente quello in esame
************ *
(setq flay (vlax-ename->vla-object (ssname vp 0)))
(vla-getboundingbox flay 'p1* 'p2*)
(setq p1 (vlax-safearray->list p1*))
(setq p2 (vlax-safearray->list p2*))
(setq p3 (list (car p1) (cadr p1))
(setq p4 (list (car p2) (cadr p2))
(setq p5 (trans p1 3 2))
(Satz p6 (trans p2 3 2))

;; inizio suggerimento rpor
;; somma il valore di Target alle Koordinaten anzeigen
(sofern (Verzeichnis '17)
;;
(Prog.)
(setq target_vp (cdr (assoc '17 (entget))))
(setq p7 (list (+ (nth 0 p5)(nth 0 aim_vp))) (+ (nth 1 p5)(nth 1 target_vp)) 0.00 )
(setq p8 (list (+ (nth 0 p6)(nth 0 aim_vp))) (+ (nth 1 p6)(nth 1 target_vp)) 0.00 )
),
);

(setvar "clayout" "Modell")
********* ****************************************************************************************************************************************************************************************************************************************************************
(setq oldosmode (getvar "osmode"))
(setvar "osmode" 0)

(Befehl "_.select" "_crossing" p7 p8 "")

(Befehl "._undo" "_begin")
(Befehl "_erase" "_all" "_remove" "_previous" "_remove" pspace_ent ")

(setq count1 -1)

(Repeat Layoutnummer

(setq count1 (+ count1 1))
(setq layname (nth count1 layouts))
(falls (/= Layout des Vornamens) (Befehl "_layout" "_delete"));


;<-- Chiusura-Wiederholung

(Befehl "._undo" "_end")

(setq file_name (strcat layfol "\\" layout))
(Befehl "-purge" "_all" "" "_no")
(Befehl "-purge" "_all" "" "_no")
(setvar "maxactvp" oldmaxvp)
(setvar "updatethumbnail" old_thumb)

(Befehl "_saveas" "" file_name)
(Befehl "_undo" "_back" "_y")

(setvar "clayout" "Modell")

(Befehl "_erase" "_crossing" p7 p8 ")
(Befehl "-purge" "_all" "" "_no")

(Zentralzählung (+ Zählung 1))

... Chiusura foreach Layout

(setvar "regenmode" oldrgnmode)

;<------chiusura defun

(alert "\n estrae tutti i layout di un dwg in Datei separati in una sottocartella layouts del dwg.
\nfunziona con layout che abbiano una sola viewport, ed esporta, per ogni layout, sia la parte modello che il relativo layout con le entita' appartenenti al paper space di quel layout.
\n\nusare layexport9 per lanciare)
der einzige Teil, den ich noch lösen muss, ist, externe Referenzen (Xrif und Bilder) aus dem Ordner, in dem sie sich auf dem neuen Unterordner "layouts" befinden, physisch zu kopieren, so dass beim Öffnen der Dateien des einzelnen Layouts nicht die fehlende Referenzanmerkung ergibt.

Ich kann die xref dwg Liste von:
Code:
;;; codice zu schließen xref blocchi

(setq *acad-Objekt* (vlax-get-acad-Objekt)
(setq *active-doc* (vla-get-activedocument *acad-object*))
(setq *blocks* (vla-get-blocks *active-doc*))
(vlax-for n *Blocks*
(eq (vla-get-isxref n) :vlax-true)
(Progn)
(setq pippo (vla-get-path n))
(setq pippo (findfile pippo))
)
)
)

;;; codice zu schließen xref blocchi
und Bilddateinamen nach:
Code:
;;; Codice, um die xref immagini zu drücken
(defun imgfile)

(vl-catch-all-apply)
Lambda (
(setq acad_image_dict)
(vla-item)
(vla-get-Diktionäre
(vla-get-activedocument
(vlax-get-acad-object)
)
)
"acad_image_dict"
)
)
)
)
(setq lista (list))
(wenn acad_image_dict
(vlax-für Eintrag acad_image_dict
(setq img
(vl-princ-to-string)
(cdr)
(Verband 1)
(Zug)
(vlax-vla-object->ename entry)
)
)
)
)
)
)
Aber ich bin auf Autocad Shell-Operationen stecken geblieben. Ich habe sie seit 20 Jahren nicht benutzt.

Ein weiterer Schub der Meister?
 
Mittlerweile nehmen Sie diese Datei, die die Verwendung der synchronen/asynchronen Shell ermöglicht, können Sie sie auch bearbeiten, um den Xcopy-Befehl nur die Parameter filedacopy Dirdestination zu verwenden, um das Programm "rein" zu verwalten.
Wenn Sie Probleme haben, bin ich hier.
Bye
 

Anhänge

Statistik des Forums

Themen
58.521
Beiträge
499.056
Mitglieder
104.110
Neuestes Mitglied
ChristianR

Zurzeit aktive Besucher

Keine Mitglieder online.
Zurück
Oben