| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Blockgrenzen ermitteln (1603 / mal gelesen)
|
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 18. Sep. 2019 13:10 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, ich möchte in der angehängten Datei für die Planrahmen die Koordinaten der rechten unteren Ecke und der rechten oberen Ecke ermitteln. Der Planrahmen ist ein dynamischer Block. Ich benötige die Koordinaten für die Bestimmung des Plotbereichs (Fenster) und das Einfügen des Plankopfes in einer rechten unteren Ecke per Lisp. Hat jemand eine Idee? ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 18. Sep. 2019 13:38 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Hallo Stefan, Möglichkeiten gibt es sicher einige. - Suche mal nach vla-GetBoundingBox - Du könntest die Daten des Rahmens auswerten, GC 10 liefert linke untere Ecke und irgendwo in den Daten steckt sicher die Blattgröße drin. Dann lässt sich das Gesuchte ausrechenen. - Wenn Du nichts weiter im Layout rumliegen hast, mal EXTMIN und EXTMAX auswerten, ggf. noch ein zoom Grenzen vorneweg schicken. Ist aber etwas ungenau in dne Kommastellen, aber wenn der Rahmen immer auf ganzen Koordinaten liegt, sicher durch Runden machbar. - Wenn keiner mit den Limiten rumgespielt hat, geht auch Auswertung von LIMMIN und LIMMAX HTH Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 18. Sep. 2019 13:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, danke für deinen Beitrag, aber das hilft mir nicht weiter, denn: 1. in den Layouts liegen zum Teil auch außerhalb der Planrahmens Zeichenobjekte. 2. die Seiteneinrichtung (Fensterkoordeinaten) möchte ich ja gerade aus den Koordinaten des Planrahmens (untere linke Ecke immer 0,0) ermitteln 3. Da der Planrahmen-Block dynamisch ist, hilft mir auch der GC 10 nicht weiter. ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 18. Sep. 2019 14:03 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 19. Sep. 2019 17:47 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von Meldin: Als nur mal so ein schuß ins blaue. mit vla-getboundingbox wirst du nicht weit kommen damußt du wohl an die Blockeinstellungen dran.
Aber natürlich funktioniert das mit : Code:
;;; ermittelt Umgrenzungsrechteck um einzelne Entity, Pickset oder Liste von Entities (defun getboundingbox (en / ll ur pl) (if (= 'PICKSET (type en)) (setq en (ss->list en))) (cond ((= 'ENAME (type en)) (setq en (vlax-ename->vla-object en)) (vla-GetBoundingBox en 'll 'ur) (setq ll (mapcar 'ff-fixit (vlax-safearray->list ll))) (setq ur (mapcar 'ff-fixit (vlax-safearray->list ur))) (list ll ur) ) ((= 'LIST (type en)) (setq pl (apply 'append (mapcar 'getboundingbox en))) (list (list (apply 'min (mapcar 'car pl)) (apply 'min (mapcar 'cadr pl))) (list (apply 'max (mapcar 'car pl)) (apply 'max (mapcar 'cadr pl))) ) ) ) ) ;;; wandelt PICKSET in Liste von Entities: (defun ss->list (sset / eset counter) (setq counter 0) (if (= 'PICKSET (type sset)) (repeat (sslength sset) (setq eset (cons (ssname sset counter) eset) counter (1+ counter) ) ) ) eset ) (defun ff-rtos (zahl modus genau / result olddimzin) (setq olddimzin (getvar "DIMZIN")) (setvar "DIMZIN" 8) (if (and (numberp zahl) (numberp modus) (numberp genau) ) (setq result (rtos zahl modus genau)) (setq result "") ) (setvar "DIMZIN" olddimzin) (if (and (= 'INT (type (read result))) (/= 0 genau) ) (setq result (strcat result ".0")) ) result ) (defun ff-fixit (weird) (read (ff-rtos weird 2 20)))
[Diese Nachricht wurde von archtools am 19. Sep. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 19. Sep. 2019 18:27 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 19. Sep. 2019 18:33 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von Meldin: Probiert hast du es auch? Also bei mir geht es nicht.
Hast Du formatierten MText im Insert? Das gibt teils heftige Abweichungen. Könnte sein, dass auch manche andere Objekte versagen. Ansonsten geht das bei mir und bei unseren Kunden. Dort werden damit automatisch XClip Objekte über andere gelegt. [Diese Nachricht wurde von archtools am 19. Sep. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 19. Sep. 2019 18:52 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Der beitragsersteller hat boch eine Zeichnung bereitgestellt mit der du testen kannst. Also teste mal mit deinem Code und verändere die größen und poste dann mal deine Ergebnisse. ------------------ Gruß Wolfgang 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: 19. Sep. 2019 18:57 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von Meldin: Der beitragsersteller hat boch eine Zeichnung bereitgestellt mit der du testen kannst. Also teste mal mit deinem Code und verändere die größen und poste dann mal deine Ergebnisse.
Das ist mir zu viel Aufwand. Nicht ich, sondern der Beitragsertseller sucht nach einer Lösung. Der kann meinen Code testen, denn genau dazu hab' ich den ins Netz gestellt. Wenn ich jetzt auch noch seine Aufgabe des Testens übernehmen soll, dann kostet das extra.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 19. Sep. 2019 19:10 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 19. Sep. 2019 20:34 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Hallo Stefan, ich verstehe zwar deinen Planrahmen nicht aber du wirst schon deine Gründe haben den mit Sichtbarkeiten aufzubauen. Dein Problem kannst du ganz einfach lösen wenn du mit vla-getdynamicblockproperties die Daten der Parameter ausliest und mit GC10 zusammen auswertest. Im Parameter "DIN-Format" steht das gewählte Blatt. Jetzt nur noch die entsprechenden Parameter für Höhe und Breite (mit cond) raussuchen und GC10 addieren ... fertig. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 23. Sep. 2019 11:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, erst mal Vielen Dank für eure Beiträge. mit dem Code von archtools komme ich nicht ganz klar. Wie lautet die Eingabe in der Befehlszeile, damit da was passiert? ------------------ Danke Stefan 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: 23. Sep. 2019 11:42 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von cadking: Hallo Leute, erst mal Vielen Dank für eure Beiträge. mit dem Code von archtools komme ich nicht ganz klar. Wie lautet die Eingabe in der Befehlszeile, damit da was passiert?
z.B.: (getboundingbox (car (entsel))) Du bist hier im Lisp-Forum. Du solltest Dir vielleicht minimale Lisp-Kenntnisse aneignen, um hier Fragen stellen und mitdiskutieren zu können. Fang mal an, es ist nicht schwer, und den meisten Leuten macht es richtig Spaß. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 23. Sep. 2019 16:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Archtools, in dem geposteten Planrahmen bekomme ich für das Layout A1Überlänge von deinem Code folgendes zurück: ((0.0 -8.43754e-14 0.0) (1211.0 1189.0 0.0)) Die Eckpunkte liegen aber auf: Befehl: '_id Punkt angeben: X = 0.0000 Y = 0.0000 Z = 0.0000 Befehl: '_id Punkt angeben: X = 1211.0000 Y = 594.0000 Z = 0.0000 Ich habe keine Ahnung woher dein Code die ((0.0 -8.43754e-14 0.0) (1211.0 1189.0 0.0)) bekommt. Wenn ich die Nachkommastellen auf 8 setze habe ich auch nur Nullen hinter dem Komma. Woraus soll die e-14 im Y-Wert des ersten Elements der Liste stammen? ------------------ Danke Stefan 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: 23. Sep. 2019 16:35 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von cadking: Hallo Archtools, in dem geposteten Planrahmen bekomme ich für das Layout A1Überlänge von deinem Code folgendes zurück: ((0.0 -8.43754e-14 0.0) (1211.0 1189.0 0.0)) Die Eckpunkte liegen aber auf: Befehl: '_id Punkt angeben: X = 0.0000 Y = 0.0000 Z = 0.0000 Befehl: '_id Punkt angeben: X = 1211.0000 Y = 594.0000 Z = 0.0000Ich habe keine Ahnung woher dein Code die ((0.0 -8.43754e-14 0.0) (1211.0 1189.0 0.0)) bekommt. Wenn ich die Nachkommastellen auf 8 setze habe ich auch nur Nullen hinter dem Komma. Woraus soll die e-14 im Y-Wert des ersten Elements der Liste stammen?
Die e-14 kommen daher, dass Rechner nur schlecht rechnen können. Die e-14 darfst Du als Null verstehen,und so versteht sie auch AutoCAD. Auffällig ist die Abweichung im Y-Wert des zweiten Punkts, wo es korrekt 594 sein sollten, mein Programm aber 1189 auswirft. Das ist ziemlich genau das Doppelte. Ist das nur Zufall, oder hat das eventuell mit einer Skalierung des dynamischen Blocks zu tun?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 24. Sep. 2019 09:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Archtools, der Block ist nicht skaliert. Er wird über Sichtbarkeitsparameter in der Höhe, und über Streckparameter in der Länge gesteuert. Ich habe den Block nicht erstellt. Er ist Bestandteil von Zeichnungen die ich bekomme und für die ich die Seiteneinrichtungen ändern muss (Plotstiltabelle, Plotbereich auf Fenster von Planrahmen, Drucker umstellen auf DWG To PDF...). Das sind etwa 400 Dateien mit mehreren Layouts. ------------------ Danke Stefan 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: 24. Sep. 2019 10:07 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von cadking: Hallo Archtools, der Block ist nicht skaliert. Er wird über Sichtbarkeitsparameter in der Höhe, und über Streckparameter in der Länge gesteuert. Ich habe den Block nicht erstellt. Er ist Bestandteil von Zeichnungen die ich bekomme und für die ich die Seiteneinrichtungen ändern muss (Plotstiltabelle, Plotbereich auf Fenster von Planrahmen, Drucker umstellen auf DWG To PDF...). Das sind etwa 400 Dateien mit mehreren Layouts.
Tja, dann musst Du selbst zusehen, woher der doppelt so hohe Y-Wert kommt. Mein kostenfreier Support endet hier. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 24. Sep. 2019 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Ich verweise mal nochmal hier drauf Zitat: Original erstellt von Andreas Kraus: ... Dein Problem kannst du ganz einfach lösen wenn du mit vla-getdynamicblockproperties die Daten der Parameter ausliest und mit GC10 zusammen auswertest. Im Parameter "DIN-Format" steht das gewählte Blatt. Jetzt nur noch die entsprechenden Parameter für Höhe und Breite (mit cond) raussuchen und GC10 addieren ... fertig.
Also hole Dir bei Lee Mac LM:getdynpropvalue mit:
Code:
(lm:getdynpropvalue (vlax-ename->vla-object (car (entsel))) "DIN-Format")
Bekommst Du das Format des Rahmens HTH Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 24. Sep. 2019 16:04 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Hallo Stefan, so ... jetzt ist es soweit. ICH HAB ES SOOOO SATT !!! Du probierst jetzt das hier mal aus, sonst weiß ich auch nicht weiter. Code:
;;; Rahmen wählen (if (setq obj_name (vlax-ename->vla-object (car (entsel)))) ;;; Parameter holen und in Liste wurschteln (if (setq prop_list (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-safearray->list (list (vlax-variant-value (vla-getdynamicblockproperties obj_name ) ) ) ) ) nil (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties obj_name ) ) ) ) ) (progn ;;; Eingestelltes Format aus Parameterliste suchen und Wert in Variable speichern (setq format (vlax-variant-value (vla-get-value (car (vl-remove-if-not '(lambda (prop) (= (vla-get-PropertyName prop) "DIN-Format") ) prop_list ) ) ) ) ) ;;; Blattformat auswerten und zugehörigen Längenparameter auswerten (cond ;;; hier jetzt erst mal nur für A0 quer, das muss dann für alle anderen Formate entsprechend kopiert und angepasst werden ((= format "DinA0 (Q)") (setq länge (vlax-variant-value (vla-get-value (car (vl-remove-if-not '(lambda (prop) (= (vla-get-PropertyName prop) "Länge A0") ) prop_list ) ) ) ) ) ;;; das ganze Zeug in eine Liste (setq bereich (list (setq p (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint obj_name) ) ) ) (mapcar '+ p (list länge 841 0)) ) ) ) (t (setq bereich "nicht in Liste")) ) ;;; und irgendwas damit machen (alert (vl-princ-to-string bereich)) ) ) )
Ich hab zwar vorwiegend mit VLisp gearbeitet aber da musst du halt mal durch.
------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 26. Sep. 2019 08:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, sorry dass ich erst jetzt ein Feedback gebe. Dein Code funktioniert einwandfrei. Ich habe die noch fehlenden Formate ergänzt. Jetzt muss ich nur noch herausfinden wie ich die Werte als Plotfenster verwende. Bisher habe ich den GC noch nicht gefunden wo die Ploteinstellungen drinstehen. ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 26. Sep. 2019 10:02 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Kurzer Tipp ... die Ploteinstellungen findest du im Layout-Objekt (setq layout (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)))) Und dann kannst/solltest du diese Sachen einstellen: (vla-put-configname layout configname) ; Plotername (vla-refreshplotdeviceinfo layout) ; neu einlesen (vla-put-paperunits layout paperunits) ; Zoll = 0 oder mm = 1 (vla-put-usestandardscale layout usestandardscale) ; Einpassen oder nicht (vla-put-canonicalmedianame layout canonicalmedianame) ; Name der Papiergeröße (vla-put-usestandardscale layout usestandardscale) (vla-put-plotrotation layout plotrotation) ; Plot drehen (vla-put-stylesheet layout stylesheet) ; Stifttabelle (vla-put-plotwithlineweights layout plotwithlineweights) (vla-put-scalelineweights layout ScaleLineweights) (vla-put-plotorigin layout plotorigin) (vla-put-plottype layout plottype) (vla-put-centerplot layout CenterPlot) (vla-put-plotviewportborders layout PlotViewportBorders) (vla-put-plotviewportsfirst layout PlotViewportsFirst) (vla-put-plotwithlineweights layout PlotWithLineweights) (vla-put-plotwithplotstyles layout PlotWithPlotStyles) (vla-put-scalelineweights layout ScaleLineweights) (vla-put-showplotstyles layout ShowPlotStyles) (vla-setcustomscale layout Numerator Denominator) Hab ich jetzt nur mal aus einer meiner Funktionen rauskopiert. Musst mal schauen ob du da alle brauchst. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 26. Sep. 2019 12:39 <-- editieren / zitieren --> Unities abgeben:
|