Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Problem mit SelectByPolygon

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
  
Von Digital Twins bis Hochleistungs-Computing: PNY präsentiert seine Zukunftstechnologien für die Industrie von morgen, eine Pressemitteilung
Autor Thema:  Problem mit SelectByPolygon (1911 mal gelesen)
pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 15. Sep. 2007 16: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


problemstellung.jpg

 
Hallo!

Ich habe ein Problem mit meinem Selection Set. Ich habe ein SelectionSet und möchte innerhalb eines Rechtecks alle Blöcke mit einem bestimmten Namen auswählen. Ich übergebe der Funktion alle möglichen Blocknamen und ein Array mit den Koordinaten. Innerhalb der Methode baue ich mir den geeigneten Filter zusammen (funktioniert, hab ich getestet) und zeichne anschließend ein Polygon zur Kontrolle, ob der Bereich in dem ich suche auch der richtige ist (siehe Grafik). Dazu habe ich folgenden Code implementiert:


Private Function getAllBlocksWithinFence(blocknames As Variant, points As Variant) As Collection
On Error GoTo ErrorHandler

  Dim ret As Collection
  Dim blockset As AcadSelectionSet
  Dim block As AcadBlockReference
  Dim mode As Integer
 
  Dim i As Integer, j As Integer
  j = 1
  ReDim FType(0 To (2 + UBound(blocknames) - LBound(blocknames))) As Integer
  ReDim FData(0 To (2 + UBound(blocknames) - LBound(blocknames))) As Variant

  FType(0) = -4
  FData(0) = "<OR"
  For i = LBound(blocknames) To UBound(blocknames)
    FType(j) = 2
    FData(j) = blocknames(i)
    j = j + 1
  Next i
  FType(j) = -4
  FData(j) = "OR>"
   
  ReDim pointsArray(0 To UBound(points)) As Double
  For i = 0 To UBound(points)
    pointsArray(i) = points(i)
  Next i
   
  mode = acSelectionSetFence
  Set ret = New Collection
  Set blockset = CreateSelectionSet("BLOCKSET")
  blockset.SelectByPolygon mode, pointsArray, FType, FData
 
  ThisDrawing.ModelSpace.AddPolyline (pointsArray)
 
  i = 0
  For Each block In blockset
    ret.Add block, "b" & i
    i = i + 1
  Next block
 
 
  Set getAllBlocksWithinFence = ret
  blockset.Delete
  Exit Function

ErrorHandler:
  blockset.Delete
  Debug.Print Error(Err)
  Err.Clear
  Set getAllBlocksWithinFence = ret
  On Error GoTo 0
End Function


Innerhalb des Bereichs (siehe Grafik) sind zwei Blöcke mit demselben Namen und in der Auswahl des SelectionSets ist aber nur einer (der obere) enthalten. Ich verstehe das nicht ganz. Ich habe es auch bereits mit mode:=acSelectionSetWindowPolygon und mode:=acSelectionSetCrossingPolygon  probiert, erhalte aber nicht das, wonach ist suche.

Kann mir bitte jemand helfen,

lg Peter

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

Carsten1210
Mitglied
staatl. geprüfter Holztechniker


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

Beiträge: 1360
Registriert: 24.07.2002

AutoCAD ACA 2024
Solidworks 2022 Sp5
Enterprise PDM 2022 Sp5
Pascam Woodworks
Visual Studio 2017 Pro
Windows 10 64Bit
Dell Precision 3660
Intel Core i9-12900K
32 GB Arbeitsspeicher
2x Dell U2415

erstellt am: 15. Sep. 2007 16:56    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 pistolpete1 10 Unities + Antwort hilfreich

Hi Peter,

Du solltest als erstes mal die Zaun-Auswahlfunktion:

Code:
  mode = acSelectionSetFence

gegen die Kreuzenfenster-Funktion tauschen:

Code:
  mode = acSelectionSetCrossingPolygon

Dann funktioniert dein Code.
Beim nächsten Mal wäre es nett, wenn due die Benötigten Funktionen (CreateSelectionSet) und eine kleine Sub mit den Paramtern zum Aufrufen deiner Funktion dazupackst. Dann braucht man nicht erst lange schauen, wie es funktionieren soll.

Gruß, Carsten

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

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 16. Sep. 2007 12:39    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

Hi Carsten,

ich habe es gerade mit "acSelectionSetCrossingPolygon" probiert, damit habe ich aber keinen der beiden Blöcke in der Auswahl. Mit dem oberen Code-Stück habe ich einen Block in der Auswahl und wenn ich den Filter weglasse habe ich sowohl bei "acSelectionSetCrossingPolygon" als auch bei "acSelectionSetFence" keinen Block mehr in der Auswahl!? Ich dachte ein Filter schränkt die Auswahl nur ein, wie ist das dann möglich, dass ohne Filter weniger Ergebnisse als mit Filter sind?

Wenn ich FType und FData ausgebe, erhalte ich folgende Werte:

-4    <OR
2    -80
2    -100
2    -125
2    -150
2    -175
2    -200
2    -225
2    -250
2    -275
2    -300
2    80-
2    100-
2    125-
2    150-
2    175-
2    200-
2    225-
2    250-
2    275-
2    300-
2    rechts
2    links
-4    OR>

Die gesuchten Blöcke heißen "-150".

Die Function CreateSelectionSet (stammt aus dem Forum):

Public Function CreateSelectionSet(Optional ssName As String = "SS") As AcadSelectionSet
  Dim objSelSet As AcadSelectionSet
  For Each objSelSet In ThisDrawing.SelectionSets
    If objSelSet.Name = ssName Then
      ThisDrawing.SelectionSets.Item(ssName).Delete
      Exit For
    End If
  Next
  Set objSelSet = ThisDrawing.SelectionSets.Add(ssName)
  Set CreateSelectionSet = objSelSet
End Function

Der Aufruf der Function:

....
  Dim flowingsigns As Collection
  Dim count As Integer
  Dim pointsArray As Variant
 
  pointsArray = getDrainDirectionFence(drain.angle, drain.StartPoint, drain.endpoint, FLOWING_DIRECTION_TOLERANCE)

  'directionmarks .... bezeichnungen der Blöcke (werden zuvor aus Datei gelesen - siehe Ausgabe von FData
  'pointsarray ....... Punkte werden von Funktion abhängig vom Winkel des Kanals berechnet
  '                    (siehe Grafik - gelbe z-förmige Polylinie)

  Set flowingsigns = getAllBlocksWithinFence(directionmarks, pointsArray)
....


Bitte um weitere Ideen für die Problemlösung,

Lg Peter

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

Carsten1210
Mitglied
staatl. geprüfter Holztechniker


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

Beiträge: 1360
Registriert: 24.07.2002

AutoCAD ACA 2024
Solidworks 2022 Sp5
Enterprise PDM 2022 Sp5
Pascam Woodworks
Visual Studio 2017 Pro
Windows 10 64Bit
Dell Precision 3660
Intel Core i9-12900K
32 GB Arbeitsspeicher
2x Dell U2415

erstellt am: 16. Sep. 2007 13: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 pistolpete1 10 Unities + Antwort hilfreich

Hi Peter,

Wenn ich deine Funktion wie folgt aufrufe:

Code:
Public Sub abc()
Dim blocknames(0 To 1) As Variant
Dim flowingsigns As Collection
Dim points(0 To 11) As Double
points(0) = 0
points(1) = 0
points(2) = 0
points(3) = 200
points(4) = 0
points(5) = 0
points(6) = 200
points(7) = 200
points(8) = 0
points(9) = 0
points(10) = 200
points(11) = 0
blocknames(0) = "abc"
blocknames(1) = "def"
Set flowingsigns = getAllBlocksWithinFence(blocknames, points)
End Sub

Dann bekomme ich bei der Zaun-Variante nur die Elemente mit der Blockbezeichnung in meinen Filter. Bei der Kreuzen-Fenster-Variante bekomme ich die Elemente, die innerhalb des Fensters liegen und die, die das Fenster kreuzen / berühren.
Bei den Selectionsets ist zu beachten, das nur Elemente, die auch auf dem Bildschirm sichtbar sind, mit ausgewählt werden. Könnte es daran liegen?! Dann solltest du vorher ein Zoom auf die benötigte Fläche / Koordinaten machen.

Gruß, Carsten

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

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 16. Sep. 2007 15:28    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 Carsten!

Danke du hast mir gleich doppelt geholfen 

1.) hatte ich nicht gewusst, dass immer nur der aktuelle Bildschirmausschnitt zur Auswahl herangezogen wird und deshalb nur einen Block im Fenster

2.) wusste ich nicht, dass die Reihenfolge der Punkte (points) entscheidend ist. Oben in meiner Grafik ist ein z-förmige Polylinie herausgekommen als ich die Punkte mit ThisDrawing.ModelSpace.AddPolyline (pointsArray) darstellen ließ. Als ich deinen Zoom-Tipp beachtet hatte, ging es noch immer nicht. Ich habe dann die Punkte so vertauscht, dass sie kein Z sondern ein Rechteck ergeben und jetzt geht es sowohl mit acSelectionSetWindowPolygon als auch mit acSelectionSetCrossingPolygon!!!

Wirklich super, danke!

AutoCAD-Hilfe:

"CrossingPolygon
Selects objects within and crossing an area defined by a polygon. Use Point1 to define the coordinates of the polygon. AutoCAD will close the last vector of the polygon. A polygon definition cannot cross itself."

Dass hätte ich erkennen müssen  .

Kannst du mir noch bitte sagen, wie ich den Winkel in dem sich der Block befindet rausbekomme. Ich habe da ja nur das Attribut InsertionPoint und kein Attribut Angle!?

Liebe Grüße Peter

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

CAD-Huebner
Ehrenmitglied V.I.P. h.c.
Verm.- Ing., ATC-Trainer



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

Beiträge: 9807
Registriert: 01.12.2003

AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil
Inventor AIP 4-11, 2008 -2022
Win 10

erstellt am: 16. Sep. 2007 15: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 pistolpete1 10 Unities + Antwort hilfreich

Der Drehwinkel der Blockeinfügung steht im
.Rotation Property der Blockreferenz

------------------
Mit freundlichem Gruß

Udo Hübner

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

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 16. Sep. 2007 16: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

Vielen Dank Udo!

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

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 15. Nov. 2007 19:58    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 Forum!

Ich versteh nicht, warum mein Filtersystem nicht funktioniert:

Code:

    Dim FType(1)  As Integer
    Dim FData(1) As Variant
    Dim mode As Integer
    FType(0) = 0: FData(0) = "Leader"  ' oder AcDbLeader
    mode = acSelectionSetCrossingPolygon
    Set lineset = CreateSelectionSet("LINESET")
    lineset.SelectByPolygon mode, pointsArray,FType, FData

 

In der Hilfe gibt es ein Beispiel, das auch einen Filter mit "0" und "Circle" verwendet, deshalb gehe ich davon aus, dass es mit "AcadLeader" ähnlich funktioniert.
Wenn ich den Filter so wie er da ist verwende, ist nichts in der Auswahl, wenn ich ihn nicht verwende sind verschiedene Objekte darin, auch die AcDbLeader, die ich eigentlich haben will.

Wie müsste der Filter richtig aussehen?

Lg Peter

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

Carsten1210
Mitglied
staatl. geprüfter Holztechniker


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

Beiträge: 1360
Registriert: 24.07.2002

AutoCAD ACA 2024
Solidworks 2022 Sp5
Enterprise PDM 2022 Sp5
Pascam Woodworks
Visual Studio 2017 Pro
Windows 10 64Bit
Dell Precision 3660
Intel Core i9-12900K
32 GB Arbeitsspeicher
2x Dell U2415

erstellt am: 15. Nov. 2007 20:10    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 pistolpete1 10 Unities + Antwort hilfreich

Hi Peter,

Liegt denn die Führungslinie komplett in dem Polygon, oder wird sie vom Polygon teilweise geschnitten?!

Poste doch mal den ganzen Code mit den Koordinaten des Polygons und eine Beispielzeichung, vielleicht lässt sich das Problem dann schneller einkreisen.

Gruß, Carsten

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

pistolpete1
Mitglied
Student


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

Beiträge: 102
Registriert: 06.01.2007

erstellt am: 15. Nov. 2007 20:31    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


Problemstellung.jpg

 
Hallo Carsten,
danke für deine schnelle Antwort!

Ausgehend vond ein gekreisten Schächten analysiere ich jedes Kanalstück (rote Linie), berechne ein Reckeck mit dem Abstand 0.3 (Seite a hat die Länge des Kanalstücks und Seite b ist 0.6 lang). Die Führungslinien kreuzen dieses Polygon.

Code:

Public Function getPolykotierungenForLine(line As AcadLine, ByRef kotierungen As Variant) As Boolean
On Error GoTo ErrorHandler
   
    Dim retval As Boolean
    Dim pointsArray As Variant
    Dim lineset As AcadSelectionSet
    Dim entry As AcadEntity
    Dim leader As AcadLeader
    Dim FType(1)  As Integer
    Dim FData(1) As Variant
    Dim mode As Integer
    Dim leaderCol As Collection
    Dim annotationObject As AcadObject
    Dim mtext As AcadMText
   
   
    retval = False

    'getDrainDirectionFence liefert die Koordinaten für das Polygon um die Linie herum
    'Methode habe ich bereits überprüft, sie funktioniert

    pointsArray = getDrainDirectionFence(line.angle, line.StartPoint, line.endpoint, 0.3)
   
    ' Filter verwende ich im MOment nicht, da er nicht funktioniert
    ' deshalb muss ich die Typen so überprüfen

    '  FType(0) = 0: FData(0) = "Leader"
   
    mode = acSelectionSetCrossingPolygon
    Set lineset = CreateSelectionSet("LINESET")
    lineset.SelectByPolygon mode, pointsArray
         
    Set leaderCol = New Collection
    For Each entry In lineset
      '  Schlechten Typvergleich bitte ignorieren, habe bereits einen Thread für
      '  korrekte Typüberprüfung eröffnet
        If StrComp(entry.ObjectName, "AcDbLeader") = 0 Then
            Set leader = entry
        '    leaderCol.Add leader
           
            Set annotationObject = leader.Annotation
            If annotationObject.ObjectName = "AcDbMText" Then
                retval = True
                Set mtext = annotationObject
            End If
        End If
    Next entry
   
       
    lineset.Clear
    getPolykotierungenForLine = retval
    Exit Function

ErrorHandler:
    Debug.Print "***************************************"
    Debug.Print "Error: " & Error(Err) & Chr(13) & "Function: getPolykotierungenForLine" & Chr(13) & "Description: " & Err.Description & Chr(13) & "Number: " & Err.Number & Chr(13) & "Source: " & Err.Source
    Debug.Print "***************************************"
    Err.Clear
    lineset.Clear
    getPolykotierungenForLine = False
    On Error GoTo 0
End Function



Im Anhang findest du einen Screenshot. Die Schächte sind eingekreist. Also ausgehend von diesen Schächten arbeite ich mich mit einer rekursiven Funktion bis zum Ende der Linien und lese die Werte der Führungslinien aus. (Derzeit funktioniert alles, aber ich würde gerne den Filter und eine korrekte Typüberprüfung einbauen).

Lg Peter

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)2025 CAD.de | Impressum | Datenschutz