Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  verbotene Zone erkennen

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:  verbotene Zone erkennen (1808 mal gelesen)
Frank136
Mitglied



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

Beiträge: 45
Registriert: 06.04.2009

P4 WinXP Acad2004,2005,2008 Office2003

erstellt am: 24. Apr. 2009 11:55    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 zusammen ,
bei meinen ersten VBA-Tests bin ich auf folgende Herausforderung gestoßen:

Ich möchte in einer Acad-Zeichnung eine Fläche (Polygon) erstellen, in der ich später mittels VBA verschiedene Blöcke einfügen möchte. Wie kann ich das abfragen, ob ich mich mit meinem Einfügepunkt gerade in der erlaubten Zone befinde oder ob ich in der verbotenen Zone bin.

Danke für Eure Hilfe

gruß  Frank

------------------
Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen...

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


Ex-Mitglied

erstellt am: 24. Apr. 2009 13:04    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

es gibt (abhängig von Deiner AutoCAD-Version  ==> bitte Systeminfo ausfüllen ) ein AutoCAD-Objekt MPolygon, diese verfügt über eine Eigenschaft 'PointIsInside' (genauer Wortlaut jetzt leider nicht bei der Hand).

D.h. entweder Du zeichnest gleich ein MPolygon (statt der Polylinie) oder Du erzeugst Dir eine temporär während Deiner Funktion und löscht diese am Ende wieder.

- alfred -

------------------
www.hollaus.at

Frank136
Mitglied



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

Beiträge: 45
Registriert: 06.04.2009

P4 WinXP Acad2004,2005,2008 Office2003

erstellt am: 24. Apr. 2009 13:47    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 Alfed,

danke für die schnelle Antwort, werde ich mal ausprobieren übers Wochenende.
Hab jetzt auch meine Systeminfo drin.

gruß  Frank

------------------
Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen...

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

Frank136
Mitglied



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

Beiträge: 45
Registriert: 06.04.2009

P4 WinXP Acad2004,2005,2008 Office2003

erstellt am: 25. Apr. 2009 14:53    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,
ich sollte meine Frage vielleicht noch etwas genauer stellen:
Die Fläche die ich habe kann ein Rechteck, ein Quatrat, ein Trapez oder ein Vieleck sein.(Ich hatte Polygon als Vieleck angesehen)
Gibt es eine Möglickkeit, diese Fläche zu erkennen und evtl mit besagter PointIsInside-Eigenschaft zu schauen, ob eine koordinate innerhalb dieser Fläche liegt? 
Meine Überlegung wäre, mit der GetPoint-Funktion die Eckpunkte auszulesen, um die Fläche zu erkennen. Mehr fällt mir grad nicht ein

Danke für Hilfe

gruß  Frank

------------------
Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen...

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


Ex-Mitglied

erstellt am: 25. Apr. 2009 15:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

das mit 'Vieleck' hätte ich genauso gesehen, darum hab ich auch angenommen, dass Du eine Polylinie als geometrisches AutoCAD-Element hast, um das Vieleck darzustellen.

Darum aus der Polylinie ein MPolygon machen, das hat dann die Funktion isPointInside ==> und jetzt gleich ein NO dazu, denn ich habe jetzt erst gesehen, dass diese Funktion offensichtlich nur in dotNET, nicht aber in VBA verfügbar ist.

Alternative Methoden zur Erkennung, ob ein Punkt innen oder aussen liegt, sind dann rein geometrischer Natur:

a) Strahlenmethode: von Deinem Punkt zeichnest Du einen Strahl in eine beliebige Richtung, dann wird getestet, wieviele Schnittpunkte der Strahl mit der Polylinie hat. Ist die Anzahl der Schnittpunkte 0 oder eine gerade Zahl, dann liegt der Punkt ausserhalb, ist die Anzahl eine ungerade Zahl, dann liegt der Punkt innen.
VORSICHT: schneidet der Strahl in der Nähe eines Polylinienstützpunktes, dann kann es zum Fehler kommen, dass 2 statt nur ein Schnittpunkt in diesem Bereich retourniert wird; anderes Problem könnte sein, dass Deine Polylinien übereinanderliegende Segmente hat, dann stimmt das Ergebnis auch nicht mehr

b) Winkelmethode: man rechnet den Winkel zwischen Deinem Punkt und Stützpunkt i und i+1 und summiert diese Winkel dann, ergibt die Summe ein durch 2*PI teilbares Ergebnis, dann liegt der Punkt innen, im anderen Fall aussen.
VORSICHT, dies funktioniert nur bei Polylinien, deren Segemente gerade Verbindungen sind (also keine Bögen enthalten, keine gerundete/kurven-angeglichene Version und auch keine Splines)

- alfred -

------------------
www.hollaus.at

Frank136
Mitglied



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

Beiträge: 45
Registriert: 06.04.2009

P4 WinXP Acad2004,2005,2008 Office2003

erstellt am: 27. Apr. 2009 11: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


Testfläche.JPG

 
Hallo und alles Gute für die neue Woche,

ich hab mal ein wenig drüber nachgedacht, welchen der zwei Vorschläge ich nehmen soll:

zu Punkt a): das mit dem Strahl sollte ich hinbekommen, aber wie kann ich die Anzahl der Schnittpunkte abfragen?

zu Punkt b): ich kann mir noch nicht genau vorstellen, wie das gehen soll. Würde die Methode auch für den Bereich funktionieren, in dem das rote Kästchen liegt?(siehe Anhang)
Wie würde ich bei dieser Methode den Winkel berechnen?

Oder gibt es vielleicht noch eine ganz andere Möglichkeit, zB. dass ich die Fläche schraffiere oder mit nem Nmaen versehe und das dann abfrage?

gruß Frank

------------------
Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen...

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

Frank136
Mitglied



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

Beiträge: 45
Registriert: 06.04.2009

P4 WinXP Acad2004,2005,2008 Office2003

erstellt am: 27. Apr. 2009 11:35    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


Testflaeche.JPG

 
Hi,
nächster Versuch etwas hochzuladen 

gruß Frank

------------------
Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen...

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


Ex-Mitglied

erstellt am: 27. Apr. 2009 19:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Frank,

zu a)

Code:
  Dim tPLine As AcadLWPolyline
  Dim tRay As AcadRay
  Dim tIntPnts As Variant
  '...Objekte zuweisen...
  tIntPnts = tPLine.IntersectWith(tRay, acExtendNone)


zu b) du misst den Winkel zwischen den Vektoren: V1 = Deinem Testpunkt (ich vermute mal das ist das rote Kästchen, ich nenne diesen ab jetzt TP) und Polylinien-Stützpunkt1 und V2=TP zu Polylinien-Stützpunkt2, den Winkel merkst Du Dir, dann Winkel zwischen V3=TP zu Polylinien-Stützpunkt3 und V2, ...und so weiter, diese Winkel sind zusammenzuzählen.

- alfred -

------------------
www.hollaus.at

Stelli1
Moderator
Verm.-Ing.


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

Beiträge: 1521
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 27. Apr. 2009 19: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 Frank136 10 Unities + Antwort hilfreich

Hallo Frank,

hier ist fast schon die Lösung.
In der Version musst du noch einige Fälle (senkrechte/waagerechte Begrenzung)abfangen und schon läuft es.

Wilfried Stelberg


------------------
Warum lisp'eln wenn's auch anders geht. 
www.ib-stelberg.de

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

Frank136
Mitglied



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

Beiträge: 45
Registriert: 06.04.2009

P4 WinXP Acad2004,2005,2008 Office2003

erstellt am: 28. Apr. 2009 13:18    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 zusammen,

ich werd mich mit den Tipps mal an die Arbeit machen. Wenn es was Neues gibt melde ich mich.

schon mal Danke für die Hilfe!

gruß Frank

------------------
Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen...

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

Stelli1
Moderator
Verm.-Ing.


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

Beiträge: 1521
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 28. Apr. 2009 22:02    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 Frank136 10 Unities + Antwort hilfreich

Hallo Frank,

hab gesehen das in der DVB noch die alte Variante drin ist.
Hier der Code der neuen der auch reibungslos läuft

Code:
Function CheckInside(Rechtswert As Double, Hochwert As Double, Umringspunkte() As Punkttyp) As Boolean
    Dim dyi As Double
    Dim dy2 As Double
    Dim Schnitt As Boolean
    Dim i As Long
    Dim dxi As Double
    Dim dx2 As Double
    Dim yi As Double
   
    ''''
    ' Rückgabe:
    '
    ' -1 Punkt liegt innen
    '  0 Punkt liegt aussen
               
   
    For i = 1 To Punktanzahl - 1
        ' Prüfen ob Punkt höher liegt als niedrigster Punkt der Linie
        If Hochwert > Min(Umringspunkte(i).Hochwert, Umringspunkte(i + 1).Hochwert) Then
            ' Prüfen ob Punkt tiefer liegt als höchster Punkt der Linie
            If Hochwert <= Max(Umringspunkte(i).Hochwert, Umringspunkte(i + 1).Hochwert) Then
                ' Prüfen ob Punkt links vom Punkt rechtsoben der Linie liegt sonst kein Schnitt möglich
                If Rechtswert <= Max(Umringspunkte(i).Rechtswert, Umringspunkte(i + 1).Rechtswert) Then
                    ' Prüfen ob Sonderfall waagerechte
                    If Umringspunkte(i).Hochwert <> Umringspunkte(i + 1).Hochwert Then
                        ' Deltawerte der Dreiecke
                        dx2 = Umringspunkte(i + 1).Hochwert - Umringspunkte(i).Hochwert
                        dxi = Hochwert - Umringspunkte(i).Hochwert
                        dy2 = Umringspunkte(i + 1).Rechtswert - Umringspunkte(i).Rechtswert
                        dyi = Rechtswert - Umringspunkte(i).Rechtswert
                        ' Fiktiven punkt auf der Linie rechnen
                        yi = dy2 * dxi / dx2
                        yi = Umringspunkte(i).Rechtswert + yi
                        ' Liegt der Fiktive Punkt rechts vom Prüfpunkt dann ist innerhalb
                        If yi >= Rechtswert Then
                          Schnitt = Schnitt Xor True
                        End If
                    End If
                End If
            End If
        End If
    Next i
   
    CheckInside = Schnitt

End Function

Function Min(Wert1 As Double, Wert2 As Double) As Double
    If Wert1 < Wert2 Then
        Min = Wert1
    Else
        Min = Wert2
    End If
End Function
Function Max(Wert1 As Double, Wert2 As Double) As Double
    If Wert1 > Wert2 Then
        Max = Wert1
    Else
        Max = Wert2
    End If
End Function



Wilfried Stelberg

------------------
Warum lisp'eln wenn's auch anders geht.
www.ib-stelberg.de

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

Frank136
Mitglied



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

Beiträge: 45
Registriert: 06.04.2009

P4 WinXP Acad2004,2005,2008 Office2003

erstellt am: 04. Mai. 2009 09: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

Hallo zusammen,

mittlerweile läuft das Programm bei mir, wenn auch mit einer kleinen Änderung:
Ich habe zur Übergabe der Stützpunktkoordinaten ein zweidimensionales Array verwendet, aber natürlich kann man den Vorschlag von Wilfried ohne Probleme auch so verwenden.

Nochmals vielen Dank für die Hilfe!!!

gruß Frank

------------------
Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen...

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