| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY präsentiert die PRO Elite™ High Endurance microSD-Flash-Speicherkarten für Videoüberwachung und kontinuierliche Aufzeichnung, eine Pressemitteilung
|
Autor
|
Thema: Blöcke nach Position suchen (2527 mal gelesen)
|
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 25. Mrz. 2009 19:19 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich wollte per "select" alle Blöcke an einer Position suchen. Aber irgendwie funktioniert das nicht, hab auch nichts im Internet oder hier im Forum gefunden(Vielleicht hab ich auch einfach die falschen Schlüsselworte verwendet). Ich denke das ganze scheitert bei mir am Zusammenbauen des Filter.
Code:
dim x as double x = 10 dim y as double y = 5 dim z as double z = 0' Filter für die Auswahl Dim filterType(2) As Integer Dim filterData(2) As Variant ' <Elementtyp = "Insert" für Block und den x-Wert (DXF-Gruppencode 10 ist Einfügepunkt)> filterType(0) = 0 filterData(0) = "INSERT" filterType(1) = -4 filterData(1) = "=" filterType(2) = 10 filterData(2) = x ' Durchführen der Suche selectionSet.Select acSelectionSetAll, , , filterType, filterData
Ich hab mich jetzt erstmal nur auf den x-wert beschränkt aber das haut schon nicht hin. Vielleicht kann mir ja jemand weiterhelfen, evtl. sogar mit y und z. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 25. Mrz. 2009 19:41 <-- editieren / zitieren --> Unities abgeben:          Nur für Gloem
|
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 25. Mrz. 2009 20:13 <-- editieren / zitieren --> Unities abgeben:         
SelectAtPoint iefert glaub ich immer nur ein Ergebnis kann das sein? Die Funktion liefert mir jedenfalls keinen Block wenn darüber ne Linie liegt. Nehm ich die Linie weg bekomm ich einen Block als Rückgabewert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 25. Mrz. 2009 20:28 <-- editieren / zitieren --> Unities abgeben:          Nur für Gloem
|
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 25. Mrz. 2009 20:50 <-- editieren / zitieren --> Unities abgeben:         
|
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 25. Mrz. 2009 21:28 <-- editieren / zitieren --> Unities abgeben:          Nur für Gloem
|
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 08:42 <-- editieren / zitieren -->
Hi, Vorsicht bei SelectBefehlen, die was mit Bildschirm-Inhalt zu tun haben, denn wenn das gewünschte Objekt ausserhalb des sichtbaren Bereichs ist, geht schon mal relativ wenig. Ebenfalls Vorsicht, der Zoom-Ausschnitt kann hier auch schon mal eine große Rolle spielen, denn weit heraus (weit weg) gezoomt und Die Anzahl der Elemente, die AutoCAD z.B. bei SelectCrossing erwischt, steigt Und dann wären dann auch noch die Koordinaten mit vielen, vielen Dezimalstellen, d.h. es gobt Situationen, da fügst Du eine BlockReferenz auf 10,10 ein, modifizierst den Block (skalieren, drehen, ...) und wenn Du dann bis zur letzten Dezimalstelle den Einfügepunkt abfragst, dann kann schon mal sowas wie 10.00000000456 vorkommen. ==> und damit läufst Du schon mal in Gefahr, dass ES (Dein AutoCAD) bei Punktangaben gar nix findet. Vorschlag (zumindest würde ich es so machen): a) ein SelectionSet über alle Blockreferenzen (nehme mal an, auch Filterung auf Modellbereich) b) durchscannen und dabei Toleranz verwenden Code: if abs(BlRef.InsertionPoint(0) - MeinSuchPunkt(0)) < Tolerance then if abs(BlRef.InsertionPoint(1) - MeinSuchPunkt(1)) < Tolerance then
HTH, - alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 26. Mrz. 2009 11:10 <-- editieren / zitieren --> Unities abgeben:         
An das mit der Toleranz habe ich auch schon gedacht. Wenn ich aber prüfen will wieviele Blöcke an der Stelle liegen muss ich erst das komplette SelektionSet durchlaufen. Vielleicht erläutere ich erst noch einmal was ich genau machen möchte:
Es soll eine kleine Anwendung geschrieben werden die so ähnlich wie die Abstandsberechnung von AutoCad funktioniert. Die Anzeige soll neben den Abständen aber auch noch eine Punktnummer anzeigen falls ein Punkt mit einer Punktnummer ausgewählt wurde. Da die Punkte(Endpunkte, Einfügepunkte, Zentren, ...) aber in AutoCAD ja dumme Punkte sind, werden viele der Punkte bei uns durch Blöcke mit Attributen dargestellt, die unter anderem eine Punktnummer enthalten. Wird jetzt ein Punkt durch den Benutzer ausgewählt, soll mit der Select-Anweisung überprüft werden, ob und wieviele Blöcke dort liegen. Sprich Rückgabewerte als String wären: - .count = 0 => " " - .count > 1 => " Nicht eindeutig " - .count = 1 => Wert des Punktnummerattributes des Blockes Am schönsten wäre natürlich wenn es mit einer Toleranz gehen würde, aber das sollte doch auch mit dem Filter der Select-Funktion machbar sein. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 11:22 <-- editieren / zitieren -->
wieviele zu scannende Blockreferenzen gibt es denn im Modellbereich (durchschnittlich und zu erwartender Maximalwert)? - alfred - ------------------ www.hollaus.at |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 26. Mrz. 2009 11:23 <-- editieren / zitieren --> Unities abgeben:          Nur für Gloem
|
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 11:53 <-- editieren / zitieren -->
Hi, nochmals mein Hinweis: vorsicht vor den SelectMethoden! Ich veranschauliche das mit folgendem Beispiel: Ein Block mit Inhalt ein Kreis (in der Blockdefinition Radius 1), eingefügt bei Koordinate 10,10 folgender Code dazu:
Code: Public Sub mySelect() Dim tSSet As AcadSelectionSet On Error Resume Next Set tSSet = ThisDrawing.SelectionSets.Add("pSSet") If tSSet Is Nothing Then Set tSSet = ThisDrawing.SelectionSets.Item("pSSet") tSSet.Clear Dim tPntArr(11) As Double tPntArr(0) = 9.5: tPntArr(1) = 9.5: tPntArr(2) = 0 tPntArr(3) = 10.5: tPntArr(4) = 9.5: tPntArr(5) = 0 tPntArr(6) = 10.5: tPntArr(7) = 10.5: tPntArr(8) = 0 tPntArr(9) = 9.5: tPntArr(10) = 10.5: tPntArr(11) = 0 tSSet.SelectByPolygon acSelectionSetCrossingPolygon, tPntArr Debug.Print tSSet.Count On Error GoTo 0 End Sub
und jetzt gibt es folgende Ergebnisse: a) obwohl der Einfügepunkt auf 10,10 liegt, und der Code rund um 10,10 sucht, findet er gar nix, weil keine Geometrie an dieser Stelle ist, der Kreis in der Blockdefinition geht ja rund um meine Select-Fenster-Punkte rundherum b) skaliere ich den Block z.B. mit 0.1, sodass auch der Kreis innerhalb meine Select-Punkte liegt, dann: b1) wenn die Geometrie am Bildschirm sichtbar ist, findet er hin und gibt mir die BlockRef ins SelectionSet b2) mit pan verschiebe ich jetzt den sichtbaren Ausschnitt soweit, dass der Block nicht mehr sichtbar ist (halt ein bisschen mehr pan machen, im Randbereich geht's noch), dann bekomme ich als Resultat ein leeres SelectionSet Ich hoffe, dass es zumindest soweit als Info dient, dass da einiges schief gehen kann!! - alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 26. Mrz. 2009 20:04 <-- editieren / zitieren --> Unities abgeben:         
@Alfred: Es können sagen wir mal bis zu maximal 10.000 Blöcke in einer Zeichnung sein. Wie würdest du den nach einem Block suchen wenn man der select-Funktion nicht trauen kann. @Stelli: Gar nicht mal so dumm. Warum umständlich mit den Filtern ein Rechteck basteln wenn es dafür doch extra ne Funktion gibt. Irgendwie muss ich das überlesen haben Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 20:42 <-- editieren / zitieren -->
Hi, Zitat: Es können sagen wir mal bis zu maximal 10.000 Blöcke in einer Zeichnung sein. Wie würdest du den nach einem Block suchen
so wie zuerst dargestellt, zuerst alle BlockRef selektieren und dann durchscannen mit Vergleich InsertionPoint zu gesuchter Koordinate (+/- Toleranz). Abhängig von der Gesamtgröße der Zeichnung darf das nie mehr als 1sec dauern, wobei der längste Vorgang darin sicher das SelectionSet.Select mit AutoCAD ist. - alfred - PS: ich hab einen kleinen Versuch gemacht, 10000 Blöcke erzeugt, dann suchen lassen, es war nicht wirklich messbar. Code als Beispiel: Code: Public Sub test() Dim tSSet As AcadSelectionSet Set tSSet = ThisDrawing.SelectionSets.Add("AA8") Dim tDxfCodes(0) As Integer: tDxfCodes(0) = 0 Dim tDxfValues(0) As Variant: tDxfValues(0) = "INSERT" tSSet.Select acSelectionSetAll, , , tDxfCodes, tDxfValues Debug.Print Format(Now(), "hhmmss") Dim tCol As Collection: Set tCol = New Collection Dim tBlRef As AcadBlockReference Dim tSearchPntMinX As Double: tSearchPntMinX = 999.9 Dim tSearchPntMinY As Double: tSearchPntMinY = 499.9 Dim tSearchPntMaxX As Double: tSearchPntMaxX = 1000.1 Dim tSearchPntMaxY As Double: tSearchPntMaxY = 500.1 For Each tBlRef In tSSet Dim tPnt As Variant tPnt = tBlRef.InsertionPoint If tPnt(0) > tSearchPntMinX Then If tPnt(1) > tSearchPntMinY Then If tPnt(0) < tSearchPntMaxX Then If tPnt(1) < tSearchPntMaxY Then Call tCol.Add(tBlRef) End If End If End If End If Next Debug.Print Format(Now(), "hhmmss") Debug.Print tCol.Count End Sub
------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 26. Mrz. 2009 20:47 <-- editieren / zitieren --> Unities abgeben:         
|
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 20:51 <-- editieren / zitieren -->
ich habe beim Select auch kein 'SelectCrossing' oder 'SelectWindow' oder irgend eine Art von geometrischem Filter!! Ich hoffe mich nicht falsch ausgedrückt zu haben, 'Select' funkt schon, nur in Verbindung mit positionsbestimmenden Filterangaben liefern z.T. Schrott. - alfred - ------------------ www.hollaus.at |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13530 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 26. Mrz. 2009 20:52 <-- editieren / zitieren --> Unities abgeben:          Nur für Gloem
du kannst auch alle items des Layouts durchlaufen, testen, ob es sich um eine Blockref handelt und die Einfügepunktkoordinaten mit dem vorgegebenen Wert vergleichen ... ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 20:55 <-- editieren / zitieren -->
Hi Thomas, Zitat: testen, ob es sich um eine Blockref handelt
was ist Deine Erfahrung mit 'auf Objekttyp prüfen'? Sowohl 'if TypeOf Ent is AcadBlockReference' als auch 'Ent.ObjectName' sind von der Performance schon langsamer als ein SelectionSet oder hast eine schnelle Methode? [EDIT]wobei sich diese Frage auf VB/VBA bezieht, mit .NET geb ich Dir zweifellos recht [/EDIT]
- alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 26. Mrz. 2009 editiert.] |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13530 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 26. Mrz. 2009 20:59 <-- editieren / zitieren --> Unities abgeben:          Nur für Gloem
ich mach kein vba  ... und ob ein ssget oder ein layoutscan .... hängt bei mir immer vom Einsatzzweck ab. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 26. Mrz. 2009 21:44 <-- editieren / zitieren --> Unities abgeben:         
|
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 29. Mrz. 2009 14:59 <-- editieren / zitieren --> Unities abgeben:         
Hab nochmal ne andere Frage und da die auch mit dem Select zusammenhängt schreib ich das einfach mal hier rein: Ist es möglich bei einem select nur den Modelbereich zu durchsuchen? Mit einem .thisdrawing.modelspace.item und dann überprüfen ob es sich um einen Block handelt würde es prinzipell gehen aber in meinem Fall gerade nicht, da ich dann doch einigen umbauen müsste. Am liebsten wäre mir ein Filter oder eine Methode oder Eigenschaft der Blockreferenz die mir sagt ob er im Modelbereich oder in einem Layout liegt Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Mrz. 2009 15:04 <-- editieren / zitieren -->
Hi, Code: if SelSet.Item(x).OwnerID = ThisDrawing.ModelSpace.ObjectID then 'dann ist das Element x im modellbereich
und für den Filter wäre da der DXFCode 410 verantwortlich - alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
 
 Beiträge: 181 Registriert: 07.12.2007 Diverses PCs mit Windows 10/11 auf Basis von Intel-Prozessoren (i5-i9) Quadro oder Gaming-Grafikkarten AutoCAD normal, Map, Civil in den Varianten 2020-2025
|
erstellt am: 29. Mrz. 2009 15:52 <-- editieren / zitieren --> Unities abgeben:         
|
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin

 Beiträge: 2855 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2025 Plateia, Canalis Visual Basic
|
erstellt am: 29. Mrz. 2009 18:17 <-- editieren / zitieren --> Unities abgeben:          Nur für Gloem
Vielleicht noch zur Ergänzung zu Alfreds Code: Zitat: Dim tSSet As AcadSelectionSet Set tSSet = ThisDrawing.SelectionSets.Add("AA8") Dim tDxfCodes(0) As Integer: tDxfCodes(0) = 0 Dim tDxfValues(0) As Variant: tDxfValues(0) = "INSERT" tSSet.Select acSelectionSetAll, , , tDxfCodes, tDxfValues
könnte man auch so machen: Code: Dim tSSet As AcadSelectionSet Set tSSet = ThisDrawing.SelectionSets.Add("AA8") Dim tDxfCodes(1) As Integer Dim tDxfValues(1) As Variant tDxfCodes(0) = 0 tDxfValues(0) = "INSERT" tDxfCodes(1) = 67 'Filter ob Modell oder Layout tDxfValues(1) = 0 'Modell (0) / Layout (1) tSSet.Select acSelectionSetAll, , , tDxfCodes, tDxfValues
Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |