Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Platzbedarf (Kontur) von AutoCAD-Objekten

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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 (5072 mal gelesen)
axeld
Mitglied
Projektingenieur/CAD-Administrator


Sehen Sie sich das Profil von axeld an!   Senden Sie eine Private Message an axeld  Schreiben Sie einen Gästebucheintrag für axeld

Beiträge: 267
Registriert: 18.11.2002

erstellt am: 27. Feb. 2003 15:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von cad-lisp an!   Senden Sie eine Private Message an cad-lisp  Schreiben Sie einen Gästebucheintrag für cad-lisp

Beiträge: 12
Registriert: 13.02.2003

Windows XP Prof.
AutoCad 2000

erstellt am: 27. Feb. 2003 21:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von axeld an!   Senden Sie eine Private Message an axeld  Schreiben Sie einen Gästebucheintrag für axeld

Beiträge: 267
Registriert: 18.11.2002

erstellt am: 28. Feb. 2003 12:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Vielen Dank, die VL-Befehle muß ich mir wohl noch mal in einer ruhigen Stunde ansehen. Ich habe es gleich in mein Programm implementiert.

------------------
Axel

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Wilfried Nelkel
Mitglied
glaubt mir eh keiner


Sehen Sie sich das Profil von Wilfried Nelkel an!   Senden Sie eine Private Message an Wilfried Nelkel  Schreiben Sie einen Gästebucheintrag für Wilfried Nelkel

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich


cadde.zip.txt

 
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 03. Sep. 2004 11:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 03. Sep. 2004 11:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

Hi,
ja, würde mich auch mal interessieren.. Bei mir funzt das Ding einbahnfrei...

------------------
Ciao,
Marc

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 06. Sep. 2004 10:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von marc.scherer:
[..] Bei mir funzt das Ding einbahnfrei...

Was heißt denn "einbahnfrei"? Wie verwendest du's denn?

Achim Dabrunz

------------------

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

marc.scherer
Ehrenmitglied V.I.P. h.c.
CAD-Administrator



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 06. Sep. 2004 15:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

@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



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 08. Sep. 2004 14:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 09. Sep. 2004 08:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

: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



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 09. Sep. 2004 10:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 09. Sep. 2004 13:48    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

@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



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

Hi,
zu dem Thema vielleicht auch noch mal dies hier: http://www.industrie24.com/bbs/read.php?f=5&i=8299&t=8294
..

------------------
Ciao,
Marc

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 09. Sep. 2004 16:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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. IMOIn my opinion = Meiner Meinung nach 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



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 10. Sep. 2004 12:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für axeld 10 Unities + Antwort hilfreich


spline-bounding-boxes.zip

 
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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz