| | | 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
Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 24. Apr. 2009 11:55 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 24. Apr. 2009 13:47 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 25. Apr. 2009 14:53 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 27. Apr. 2009 11:31 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 27. Apr. 2009 11:35 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 27. Apr. 2009 19:06 <-- editieren / zitieren -->
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.
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 / zitieren --> Unities abgeben: Nur für Frank136
|
Frank136 Mitglied
Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 28. Apr. 2009 13:18 <-- editieren / zitieren --> Unities abgeben:
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.
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 / zitieren --> Unities abgeben: Nur für Frank136
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 = SchnittEnd 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
Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 04. Mai. 2009 09:54 <-- editieren / zitieren --> Unities abgeben:
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 >>)
|