| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Platzbedarf (Kontur) von AutoCAD-Objekten (5119 mal gelesen)
|
axeld Mitglied Projektingenieur/CAD-Administrator
Beiträge: 267 Registriert: 18.11.2002
|
erstellt am: 27. Feb. 2003 15:06 <-- editieren / zitieren --> Unities abgeben:
Hallo an die Lisp-Spezialisten, gibt es vielleicht schon ein Lisp-Programm, mit dem man von AutoCAD-Objekten den Platzbedarf errechnen kann. Ich würde gerne einige Symbole in eine große Zeichnung einfügen. Dazu brauche ich die Größe der Symbole, um den Skalierfaktor einzustellen. Die Symbole sollen in ein Raster eingefügt werden.
------------------ Axel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cad-lisp Mitglied Holztechniker
Beiträge: 12 Registriert: 13.02.2003 Windows XP Prof. AutoCad 2000
|
erstellt am: 27. Feb. 2003 21:25 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Hallo Axel, die Größe kannst du mit der Funktion vla-getboundingbox ermitteln. Hier ein keines Beispiel. (defun c:ufr ( / ELE LL P0 P1 UR ) ;Funktion gibt Punkte für umfassendes Rechteck zurück (vl-load-com) (setq ele(entsel "\nBitte Element wählen:")) (vla-getboundingbox (vlax-ename->vla-object (car ele)) 'll 'ur) (setq p0 (vlax-safearray->list ll));Punkt links unten (setq p1 (vlax-safearray->list ur));Punkt rechts oben (list p0 p1) ) hoffe es hilft dir weiter Gruß cad-lisp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
axeld Mitglied Projektingenieur/CAD-Administrator
Beiträge: 267 Registriert: 18.11.2002
|
erstellt am: 28. Feb. 2003 12:20 <-- editieren / zitieren --> Unities abgeben:
|
Wilfried Nelkel Mitglied glaubt mir eh keiner
Beiträge: 804 Registriert: 15.03.2001 AutoCAD/ADT/ACA 2002 - 2023, Hardware: HP Z620 Workstation, 2 x Xeon E5-2690 v2@3.00GHz, 96 GB RAM, NVIDIA Quadro RTX 4000, Windows 10-64bit ..... ATC-Trainer
|
erstellt am: 03. Sep. 2004 00:19 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Hallo, das Programm ist ansich nicht schlecht. Nur hab ich bei Objektwahl eines Blockes (rechteckiger Zeichnungsrahmen) das Problem, daß die obere rechte Koordinate falsch berechnet wird. Frag mich nicht wieso, aber es ist immer der gleiche Rechenfehler :-) Abstand vom rechten oberen Eck: + 32,22 ZE Deltax= 32,02; Deltay = 3,51 Wieso ist das so. Im Layoutbereich funktionier das Tool wunderbar. Irgendwie hatte ich Probleme mit dem Upload. Der Anhang ist eine gezippte DWG-Datei mit der Dateiendung TXT. *lööööl* :-) Vielleicht weiß jemand rat.
Würd mich über Antworten freuen Willi
------------------ Schöne Grüsse Wilfried Nelkel
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 03. Sep. 2004 10:56 <-- editieren / zitieren -->
Zitat: Original erstellt von Wilfried Nelkel: das Programm ist ansich nicht schlecht. Nur hab ich bei Objektwahl eines Blockes (rechteckiger Zeichnungsrahmen) das Problem, daß die obere rechte Koordinate falsch berechnet wird.
vla-getboundingbox funktioniert nicht richtig - eigentlich ist es kaum zu verwenden. Eine zuverlässig arbeitende Funktion kenne ich nicht. Tom Berger ------------------
|
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 03. Sep. 2004 11:11 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Tag zusammen. Zwar habe ich auch keine pragmatische Idee, wie dieses Problem zu umgehen ist, möchte aber auf einen gern übersehenen Umstand hinweisen: Die Methode GetBoundingBox ermittelt die 2 Eckpunkte eines umschließenden Rechtecks - nicht die des optimalen. Daher kann nur sicher angenommen werden, dass die Geometrie vollständig innerhalb des Rechtecks liegt, was ja schon 'ne ganze Menge ist, nicht aber, dass es anliegt, wie ein Latex-Anzug. Achim Dabrunz ------------------
[Diese Nachricht wurde von Dabrunz am 03. Sep. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 03. Sep. 2004 11:19 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Tag Tom. Zitat: vla-getboundingbox funktioniert nicht richtig [..]
Frage: Kennst du ein Beispiel, wo die GetBoundingBox kein umhüllendes Rechteck liefert? Da käme ich aber ganz gut ins Schwitzen .. Achim
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 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: 03. Sep. 2004 12:05 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
|
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 06. Sep. 2004 10:44 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
|
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 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: 06. Sep. 2004 11:01 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
na so: Code:
(defun MS:GETBOUNDINGBOX (ENAME / LL UR) (vla-getboundingbox (->VLA-OBJECT ENAME) 'LL 'UR) (mapcar 'vlax-safearray->list (list LL UR)) ) ;_ end of defun (defun MS:BOUNDINGBOX (ENAME / vlaObj minp ang minr maxr arrDoubles) (setq vlaObj (vla-Copy (->VLA-OBJECT ENAME))) (vla-GetBoundingBox vlaObj 'minp 'maxp) (setq minp (vlax-safearray->list minp) ang (MS:GET-ANGLE-FROM-OBJ vlaObj)) (vla-rotate vlaObj (vlax-3d-point minp) (* -1.0 ang)) (vla-GetBoundingBox vlaObj 'minr 'maxr) (setq minr (vlax-safearray->list minr) maxr (vlax-safearray->list maxr)) ;_(vla-erase vlaObj) (vlax-release-object vlaObj) (vlax-safearray-fill (setq arrDoubles (vlax-make-safearray vlax-vbdouble (cons 0 7))) (list (car minr) (cadr minr) (car minr) (cadr maxr) (car maxr) (cadr maxr) (car maxr) (cadr minr) ) ;_ end of list ) ;_ end of vlax-safearray-fill (setq vlaObj (vla-AddLightWeightPolyline (GET-CSPACE) (vlax-make-variant arrDoubles) ) ;_ end of vla-AddLightWeightPolyline ) ;_ end of setq (vla-put-closed vlaObj :vlax-true) (vla-rotate vlaObj (vlax-3d-point minp) ang) vlaObj )
.. ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 06. Sep. 2004 11:29 <-- editieren / zitieren -->
Zitat: Original erstellt von Dabrunz: Tag Tom. Frage: Kennst du ein Beispiel, wo die GetBoundingBox kein umhüllendes Rechteck liefert? Da käme ich aber ganz gut ins Schwitzen ..
Hallo Achim, formatierter MTEXT funktioniert nicht. Beispielsweise MTEXT mit diesem Inhalt: {2,35\A1\H0.7x\S25;} Für meine Applikation ArchDIM ist das ziemlich blöde, weil ich gerne prüfen würde, ob ein Maßtext innerhalb der Maßhilfslinien Platz hat oder nicht. Bisher habe ich noch keine Methode gefunden, die dieses Problem lösen würde. Gruß Tom Berger
------------------
|
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 06. Sep. 2004 15:21 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
@Marc: Gut - ich muss zugeben, da war ich äußerst unpräzise in meiner Fragestellung. Was ich eigendlich fragen wollte: Für welchen (Einsatz-)Zweck oder mit welcher Intention verwendest du diese Funktion? Und selbst das ist duch Toms Beispiel Geschichte. @Tom: Danke, auch wenn ich das bisher nicht für möglich hielt - ich ging bisher tatsächlich davon aus, dass zumindest "umschließend" gewährleistet ist - belegt es eindeutig einen Bug in der Implementierung. -> Die Funktion ist unbrauchbar! Achim Dabrunz ------------------ [Diese Nachricht wurde von Dabrunz am 06. Sep. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 08. Sep. 2004 14:00 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Für einen (zugegebenermaßen) recht eingeschränkten Sonderfall, der zumindest die Probleme von Willi lösen sollte, möchte ich hier mal einen Lösungsansatz anbieten und zur Diskussion stellen: _______________________________________ I Voraussetzungen: (a) der zu untersuchende Block enthält an für die Kontur relevanter Geometrie nur Linien und LW-Polylinien ohne Bogen-Segmente (b) im Block enthaltene Text tragende Elemnente, seien es (M)Texte oder Attribut-Definitionen oder was auch immer, spielen für die Konturfindung keine Rolle, weil sie ausschließlich im "Innern" der Block-Geometrie angezeigt werden sollen (c) Drehwinkel werden ignoriert, weil die Inserts nur mit einem Einfügewinkel 0 eingefügt werden (d) die Blockgeometrie, wie auch die Inserts an sich verwenden keine vom WKS abweichenden Objekt-Koordinaten-Systeme (e) Linienstärken werden grundsätzlich nicht berücksichtigt _______________________________________ II Lösungs-Ansatz: (a) Wir besorgen uns vom Insert-Entity <insert> die <skalierung>, den <einfuege-punkt> und den <block-name>. (b) Mit Hilfe von <block-name> können wir dessen <insbase> (den bei der Block-Erzeugung vergebenen Basispunkt) und Zugang zur im Block enthalten Geometrie erhalten, über die wir mit der Funktion block-foreachSubEnt iterieren, um alle relevanten <endpunkte> aufzulisten. Bemerkung: Eine Verschiebunng um <insbase> ist wichtig, damit wir die <skalierung> anwenden können. Das vertagen wir aber nach hinten, denn die Reihenfolge dieser Operationen ist mal egal, wenn es um die Ermittlung der Extrem-Punkte des umschließenden Rechtecks geht. Die gewinnen wir lieber erstmal aus den "Rohdaten" der Block-Geometrie und transformieren erst später, um einiges an Rechen-Operationen einzusparen. (c) Aus der Liste der <endpunkte> holen wir uns nun die jeweils kleinsten (bzw. größten) X- und Y-Koordinaten der Punkte (die Z-Koordinate fällt sozusagen als "Nebenprodukt" mit ab), die ja die linke untere (bzw. rechte obere) Ecke des umschließenden Rechtecks beschreiben: <extrem-punkte>. (d) Zum Abschluss brauchen wir die <extrem-punkte> nur noch zu transformieren, damit das durch sie beschriebene Rechteck auch über dem <insert> zu liegen kommt. Diese Transformation besteht aus folgenden 3 Schritten: (i) Verschiebung um -<insbase>, damit die Punkte <extrem-punkte> als "Verschiebung" zum Koordinaten-Ursprung aufefasst werden können; (ii) <skalierung>; (iii) Verschiebung um <einfuege-punkt>, damit die Punkte relativ zum <insert> zu liegen kommen. _______________________________________ III Code: Mit ein paar SETQs mehr als nötig, weil's so (vielleicht) klarer zu verstehen ist. Code:
;****************************************** (defun :get-BoundingBox-light (insert / einfuege-punkt skalierung block-name insbase endpunkte extrem-punkte ) ;**** Initialisierung **** (setq insert (entget insert) einfuege-punkt(cdr(assoc 10 insert)) skalierung (list(cdr(assoc 41 insert)) (cdr(assoc 42 insert)) (cdr(assoc 43 insert)) ) block-name (cdr(assoc 2 insert)) insbase (cdr(assoc 10 (tblsearch"BLOCK"block-name))) ) ;** Block-Geometrie iterieren: (block-foreachSubEnt '(lambda (entity) (setq entity (entget entity)) ;** nur Linien und LW-Polylinien zulassen: (if (member (strcase(cdr(assoc 0 entity)))'("LINE""LWPOLYLINE")) (setq endpunkte (cons (mapcar'cdr;** GruppenCode entfernen (vl-remove-if-not;** nur in GC 10 und 11 finden sich Eck-Punkte '(lambda(x)(member (car x)'(10 11))) entity ) ) endpunkte ) ) ) ) block-name ) ;** <endpunkte> ist jetzt eine Liste von Punkt-Listen, deshalb wird ;** sie "eingedampft": (setq endpunkte(apply'append endpunkte)) ;** <extrem-punkte> als Liste (ul or): (setq extrem-punkte (list (:apply-transpose'min endpunkte) (:apply-transpose'max endpunkte) ) ) ;** Rückgabe: (mapcar '(lambda(x) (:v+;** Verschiebung auf den <einfuege-punkt> einfuege-punkt (mapcar'*;** skalierung skalierung (:v- x insbase);** Verschiebung relativ zum Ursprung ) ) ) extrem-punkte ) ) ;****************************************** (defun block-foreachSubEnt (func blockName) (setq func (eval func)) ((lambda(subEntity) (while subEntity (func subEntity) (setq subEntity(entnext subEntity)) ) ) (cdr(assoc -2(tblsearch"BLOCK" blockName))) ) ) ;****************************************** (defun :apply-transpose (func listOfLists) (apply'mapcar (cons func listOfLists) ) ) ;****************************************** (defun :v+ (x y)(mapcar'+ x y)) ;****************************************** (defun :v- (x y)(mapcar'- x y))
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 09. Sep. 2004 08:27 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
:hmm habe ich das jetzt richtig Verstanden? Getboundingbox arbeitet mit Formatiertem MText nicht einwandfrei? Folglicherweise ist noch keinem ein Fehler mit 'normalen' Elementen aufgefallen. @Achim Wieso baust du ein komplett neues Tool, was aber die Schwäche von Getboundingbox nicht behebt? vielleicht sollte man einfach nur der von Getboundingbox zurückgegebene 'Rechteck' mit evtl. vorkommenden MTexten prüfen? ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 09. Sep. 2004 10:24 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Zitat: :hmm habe ich das jetzt richtig Verstanden? Getboundingbox arbeitet mit Formatiertem MText nicht einwandfrei?Folglicherweise ist noch keinem ein Fehler mit 'normalen' Elementen aufgefallen.
Hast du wohl nicht richtig verstanden: Wenn es zumindest einen Fall gibt, durch den sich nachweisen lässt, dass die durch GetBoundingBox ermittelten Ecken kein umschließendes Rechteck bestimmen, dann deutet das erst einmal auf einen Fehler in der Implementierung hin, der nicht (ausreichend) dokumentiert ist. Als Konsequenz habe ich also eine Funktion zur Verfügung, aus deren Dokumentation ich keine wichtigen Hinweise auf Implementations-Lücken gewinnen kann. Folglich ist's ein Vabanquespiel die Funktion weiter einzusetzen, denn es kann ja noch so ein Fall auftreten - es muss ihn nur jemand finden .. Wie's so ist, dass in den Fällen, die dir bisher unterkamen alles glatt lief hat keine hinreichende Beweiskraft, denn alle hast du wohl kaum (wie natürlich auch jede andere von uns nicht) durchprobieren können und der Quellcode steht zur Korrektheits-Analyse ebenfalls nicht zur Verfügung. Was aber ein unwiderlegbares Argument bleibt ist ein Beispiel für tatsächliches fehlerhaftes Verhalten. Ein Befürworter der Korrektheit müsste nun stichhaltig belegen können, dass die beschrieben Fehlerklasse einzigartig ist. Das steht aber aus! Allerdings will ich auch eine Lanze für den weiteren Einsatz der Funktion brechen: In vielen Fällen dürfte ein Programm, das fast immer richtig arbeitet den Inhouse-Ansprüchen genügen, weil der Aufwand für eine korrekte Lösung des Problems mehr Kosten verursachen als gelegendlich auftauchende Unsinns-Zeichnungen, die dann in der Qualitäts-Sicherung auffallen und von Hand korrigiert werden müssen. Es bleibt eine Kosten-Nutzen-Abwägung wie bein Einsatz von Viren-Scannern: Was ist langfristig teurer: Systeme bei Virenbefall aus der Datensicherung zu restaurieren und die zugehörigen ad-hoc-Maßnahmen einzuleiten oder eine möglicht vollständige Prävention, die dauerhaft gewartet werden und Unternehmens-weit geschult werden muss? Zitat:
Wieso baust du ein komplett neues Tool, was aber die Schwäche von Getboundingbox nicht behebt?vielleicht sollte man einfach nur der von Getboundingbox zurückgegebene 'Rechteck' mit evtl. vorkommenden MTexten prüfen?
Am Beispiel von Wilfried Nelkel weiter oben kann man ganz gut nachvollziehen, dass GetBoundingBox durchaus nicht die "optimale" BoundingBox ermittelt (auch unter der Annahme, dass bei solcher Geometrie zumindest ein umschließendes Rechteck ermittelt wird). Das ist mir Motivation genug, ein Werkzeug anzudenken, mit dem sich diese Eigenart auschließen lässt. Wie du siehst, behebt es sehr wohl Schwächen von GetBoundingBox. Achim DAbrunz ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 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: 09. Sep. 2004 13:29 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Hi, hat sich mal einer die Mühe gemacht das Beispiel von Wilfried Nelkel anzugucken? Bounding Box liefert bei seinem Rahmen die KORREKTEN Daten!!! Das Problem bei Wilfrieds Block sind die ausgeschalteten Objekte (DXF Code 60) innerhalb des Blocks... ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 09. Sep. 2004 13:48 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
@Marc, nein, habe ich nicht, muss man ja auch erst einmal drauf kommen. @All Da ich aber meine Lösung nun schon fertig habe, poste ich meinen Ansatz dennoch: 1) Insert kopieren 2) Kopie explodieren 3) von den Elementen (außer den Texten) einzeln mit dem üblichen GETBOUNDINGBOX dei Koordinaten ermitteln. 4) Element löschen 5) Aus Koordinaten min/max ermitteln 6) Punktliste aus den Koordinaten basteln -ferdich- Einzige Vorbedingung, die Layer sollten alle entsperrt sein.
Code:
(defun hb:getboundingboxINSERT (ent / pts minpts maxpts lastent erg) (setq lastent (entlast)) (if (and ent (= 'ENAME (type ent)) (= "INSERT" (cdr (assoc 0 (entget ent)))) ) ;_ ende von and (progn (setq pts (copy_explode_getboundingbox ent) minpts (mapcar 'car pts) maxpts (mapcar 'cadr pts) ) ;_ ende von setq (setq erg(list (list (apply 'min (mapcar 'car minpts)) (apply 'min (mapcar 'cadr minpts)) ) ;_ ende von list (list (apply 'max (mapcar 'car maxpts)) (apply 'max (mapcar 'cadr maxpts)) ) ;_ ende von list )) ;_ ende von list ) ;_ ende von progn ) ;_ ende von if (while (setq lastent (entnext lastent)) (entdel lastent) ) erg ) ;_ ende von defun (defun copy_explode_getboundingbox (ent / erg) (setq ents (vla-Explode (vla-copy (if (= (type ent) 'ENAME) (vlax-ename->vla-object ent) ent ) ;_ ende von if ) ;_ ende von vla-copy ) ;_ ende von vla-Explode erg (apply 'append (mapcar '(lambda (E / erg) (cond ((wcmatch (strcase (vla-get-ObjectName E)) "*BLOCK*") (setq erg (copy_explode_getboundingbox E)) ) ((not (wcmatch (strcase (vla-get-ObjectName E)) "*TEXT*,*ATTRIB*" ) ;_ ende von wcmatch ) ;_ ende von not (setq erg (list (getboundingbox E))) ) ) ;_ ende von cond (vla-delete E) erg ) ;_ ende von lambda (vlax-safearray->list (vlax-variant-value ents)) ) ;_ ende von mapcar ) ;_ ende von apply ) ;_ ende von setq ;(vla-delete del_insert) ;erg ) ;_ ende von defun (defun getboundingbox (ent1 / minpt maxpt) (if (= (type ent1) 'ENAME) (setq ent1 (vlax-ename->vla-object ent1)) ) ;_ ende von if (vl-load-com) (vlax-invoke-method ent1 'GetBoundingBox 'minpt 'maxpt ) ;_ ende von vlax-invoke-method (list (vlax-safearray->list minpt) (vlax-safearray->list maxpt) ) ;_ ende von list ) ;_ ende von defun ;;Beispiel (foreach PT (hb:getboundingboxINSERT (car (entsel))) (command "_.POINT" PT) )
Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 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: 09. Sep. 2004 14:00 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
|
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 09. Sep. 2004 16:54 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Zitat:
hat sich mal einer die Mühe gemacht das Beispiel von Wilfried Nelkel anzugucken?
Ja. Zitat:
Bounding Box liefert bei seinem Rahmen die KORREKTEN Daten!!!
So tief hab' ich aber nicht reingeschaut .. Zitat:
Das Problem bei Wilfrieds Block sind die ausgeschalteten Objekte (DXF Code 60) innerhalb des Blocks...
Gut gesehen! Ich hab's nicht bemerkt. Ändert aber nix an der Kernaussage, wenn auch meine Routine wenig zur Beserung beiträgt .. Andere Beispiele gefällig: (1) Zeichne einen Spline und bestimme die BoundingBox (2) pedit -> fit klappt auch nicht mit der ganz knappen Bounding-Box @Willi: Wie hast du denn ein passendes Umgrenzungs-Rechteck im Layout zustande bekommen? Wirst doch wohl nicht das MAnsFen an Stelle des Inserts gewählt haben? Achim Dabrunz ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 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: 09. Sep. 2004 17:26 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Hi, wer sagt denn, daß die Methode getboundingbox die SICHTBARE Umgrenzung zurückliefert? Ich denke mal sie liefert immer die Umgrenzung aller Daten, die für das Objekt vorliegen... Und bei Splines und "gefitteten" Polylinien scheinen hierzu auch die "Kurven-Berechnungspunkte" zu gehören... Sacht jedenfalls "mein" Vermessungs-Ing. ------------------ Ciao, Marc
[Diese Nachricht wurde von marc.scherer am 09. Sep. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Sep. 2004 17:45 <-- editieren / zitieren -->
Zitat: Original erstellt von marc.scherer: Hi, wer sagt denn, daß die Funktion getboundingbox die SICHTBARE Umgrenzung zurückliefert? Ich denke mal sie liefert immer die Umgrenzung aller Daten, die für das Objekt vorliegen... Und bei Splines und "gefitteten" Polylinien scheinen hierzu auch die "Kurven-Berechnungspunkte" zu gehören... Sacht jedenfalls "mein" Vermessungs-Ing.
Nun, das ist sicher eine Frage der Definiton, und die wird man hier nach Bedürfnis festlegen. IMO sind die gewichteten Stützpunkte von Splines für die allermeisten Leute absolut uninteressant, die die BoudingBox eines Objekts haben wollen. Autodesk hat es sich hier halt allzu leicht gemacht, anstatt logisch-geometrisch vor zu gehen. Gruß Tom Berger ------------------
|
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 10. Sep. 2004 12:42 <-- editieren / zitieren --> Unities abgeben: Nur für axeld
Ich habe, um der Kontroll- und Anpassungs-Punkt-Diskusion bei Spline-Objekten etwas Würze zu verleihen, einmal eine übersichtliche Beispielzeichung erzeugt und das mit getBoundingBox ermittelte Umgrenzungs-Rechteck in Relation zu dem gestellt, das bei direkter Einbeziehung der Kontroll-Punkte de Splines (GC 10) entsteht. Daraus lässt sich ganz sicher ableiten, dass diese Punkte nur indirekt ein die Berechnung von getBoundingBox eingehen. Wie allerdings, kann ich so ohne weiteres nicht sagen. Was die MTexte angeht, so ist die Lage noch schlimmer als gedacht: Nicht nur bei Sonder-Formate, sondern vielmehr bei allen MTexte wird eine insofern falsche BoundingBox angegeben, dass einzig das beim Anlegen des MTextes aufgezogene Rechteck die Breiten-Information zu liefern scheint - auch hierzu gibts ein Beispiel in der Zeichnung. Was also tun? Nachdem mein Ansatz eindeutig zu kurzsichtig ist, kann davon nur das Grund-Konzept bleiben: Itereation über Container und Koordinaten-Transformation. Holger liefert einen weiteren Baustein, der bei einigen Problem-Entities erstaunliche Resultate hervorruft (wobei ich mir allerdings noch nicht schlüssig bin, ob's auch schon für Inserts Anwendung finden sollte): Object.Explode() liefert bei einigen der Problemfälle (z.B. MTexten -> {Texte} oder angepassten Polylinien -> {Bögen}) recht handliche Objekte zurück, über die wieder per Iteration eine "bessere" BoundingBox zu gewinnen ist. Bleiben (zumindest) 2 Fragen: (1) Was machen wir mit unsichtbaren Entities? (ich würde für ignorieren stimmen, denn damit kann ich bei Konstruieren eh' nix anfangen) (2) Was gibt's außer Splines noch an (flachen) Objekten, denen nicht beizukommen ist und was für Möglichkeiten bleiben uns hier? Achim Dabrunz ------------------ [Diese Nachricht wurde von Dabrunz am 10. Sep. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |