| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Rechteck um Objekte (811 mal gelesen)
|
Jürgen333 Mitglied
Beiträge: 4 Registriert: 18.06.2008
|
erstellt am: 04. Mrz. 2010 18:42 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Ehrenmitglied V.I.P. h.c. Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 04. Mrz. 2010 18:50 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen333
|
Ex-Mitglied
|
erstellt am: 04. Mrz. 2010 18:54 <-- editieren / zitieren -->
Hi, ja, von den Objekten die GeometricExtents auslesen (ist eine Eigenschaft, die Du von jedem DatabaseServices.Entity auslesen kannst), die MinWerte und MaxWerte vergleichen und das ergibt die gesamte BoundingBox-Koordinaten, mit denen Du dann eine Polyline als Rechteck zeichnen kannst. Aufpassen muss man nur bei Attributen, da liefern diese Extents manchmal falsche Werte (Min-Punkt der Extents wird als 0,0,0 ausgegeben), in diesen Fällen greife ich dann, so das Element schon in der Datenbank eingetragen ist, auf die COM-Funktion getBoundingBox zurück. HTH, - alfred - ------------------ www.hollaus.at |
Jürgen333 Mitglied
Beiträge: 4 Registriert: 18.06.2008
|
erstellt am: 04. Mrz. 2010 19:07 <-- editieren / zitieren --> Unities abgeben:
|
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006 ACAD 13 bis 2012 Accurender4 IMOS 9 Rhinoceros 4&5beta Mastercam X5
|
erstellt am: 04. Mrz. 2010 20:37 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen333
Habe mal folgende Funktion geschrieben: Code:
Private Function GrenzPunkte(ByRef ObjectIDArray As ObjectId()) As Point3dCollection Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager Dim myT As Transaction = tm.StartTransaction() Dim id As ObjectId Dim ent As Entity Dim MinObjektP, MaxObjektP As Point3d Dim MinGrenzP(2), MaxGrenzP(2) As Double Dim ObjektNr As Integer Try For Each id In ObjectIDArray ObjektNr += 1 ent = CType(tm.GetObject(id, OpenMode.ForRead, True), Entity) MinObjektP = ent.GeometricExtents.MinPoint MaxObjektP = ent.GeometricExtents.MaxPoint If ObjektNr = 1 Then 'Grenzpunkte auf erstes Objekt einstellen MinGrenzP(0) = MinObjektP.X : MinGrenzP(1) = MinObjektP.Y : MinGrenzP(2) = MinObjektP.Z MaxGrenzP(0) = MaxObjektP.X : MaxGrenzP(1) = MaxObjektP.Y : MaxGrenzP(2) = MaxObjektP.Z Else If MinGrenzP(0) > MinObjektP.X Then MinGrenzP(0) = MinObjektP.X If MinGrenzP(1) > MinObjektP.Y Then MinGrenzP(1) = MinObjektP.Y If MinGrenzP(2) > MinObjektP.Z Then MinGrenzP(2) = MinObjektP.Z If MaxGrenzP(0) < MaxObjektP.X Then MaxGrenzP(0) = MaxObjektP.X If MaxGrenzP(1) < MaxObjektP.Y Then MaxGrenzP(1) = MaxObjektP.Y If MaxGrenzP(2) < MaxObjektP.Z Then MaxGrenzP(2) = MaxObjektP.Z End If Next id Finally myT.Dispose() End Try Dim P3dColl As New Point3dCollection P3dColl.Add(New Point3d(MinGrenzP(0), MinGrenzP(1), MinGrenzP(2))) '>>>Minimaler Grenzpunkt P3dColl.Add(New Point3d(MaxGrenzP(0), MaxGrenzP(1), MaxGrenzP(2))) '>>>Maximaler Grenzpunkt Return P3dColl End Function
------------------ Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2010 20:59 <-- editieren / zitieren -->
Hi Markus, hast Du, da Du trennst in einzelne Double-Werte für Vergleich, schon mal die Performance mit diesem hier verglichen? Code: Dim tEnt As DatabaseServices.Entity = CType(tm.GetObject(ObjectIDArray(0), OpenMode.ForRead, True), Entity) 'Extents des ersten Elements anlegen Dim tExtents As DatabaseServices.Extents3d = tEnt.GeometricExtents For Each id In ObjectIDArray tEnt = CType(tm.GetObject(id, OpenMode.ForRead, True), Entity) tExtents.AddExtents(tEnt.GeometricExtents) Next id
- alfred - ------------------ www.hollaus.at |
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 04. Mrz. 2010 21:15 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen333
Nein, habe ich noch nicht. Kann man die Grenzpunkte dann aus tExtents abrufen? Wenn ja, wäre dein Code natürlich deutlich schlanker. Habe mir auch irgendwie schon gedacht, dass du das noch besser hinbekommst, als ich Aber aus Geschwindigkeitsgründen muss ich meine Funktion jetzt nicht ändern: Auf einem 2 Jahre alten Laptop schafft meine Funktion 10000 Kreise in unter einer Sekunde. ------------------ Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2010 21:53 <-- editieren / zitieren -->
Hi, >> Kann man die Grenzpunkte dann aus tExtents abrufen? Die durch .Add hinzugefügten Extents sind nicht eine Ansammlung wie eine Collection, sondern eine Funktion, die genau Deinen Vergleich intern durchführt und den .MinPoint und .MaxPoint bei bedarf korrigiert. Wenn Du damit die resultierenden Gesamt-Min/Max-Punkte meinst, dann natürlich ja, so wie auch Du mit .MinPoint und .MaxPoint. >> dass du das noch besser hinbekommst, als ich
Das war nicht Sinn meines Beitrags, unbedingt darauf hinzuweisen, dass es besseren oder schlechteren Code gibt. Mein Interesse war ernst, ich hab's noch nie gemessen und wollte ernst nachfragen, ob Du es ev. schon verglichen hast. - alfred -
------------------ www.hollaus.at |
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 04. Mrz. 2010 23:18 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen333
Hi Alfred, hab die Funktionen mal beide mit 100.000 Kreisen getestet: Dein Code: 2.2499856 Sekunden Mein Code: 3.3595470 Sekunden Dein Codebeispiel ist also rund 33% schneller und schafft obendrein noch mehr Übersicht. Die Anspielung von mir war übrigens nicht böse gemeint. Ich lese jeden Beitrag in dem Object-ARX Forum (kommt ja nicht so oft etwas dazu) und habe dabei von deinen Beiträgen schon viel gelernt. Jetzt bin ich wieder ein bischen schlauer. Danke für den Tip. ------------------ Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2010 23:24 <-- editieren / zitieren -->
Hi Markus, Oh vielen Dank für's ausprobieren, bin ich auch wieder schlauer, 10Us4You - alfred - ------------------ www.hollaus.at |