Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  IsPointInside

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:  IsPointInside (2120 mal gelesen)
sebastian.
Mitglied



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

Beiträge: 90
Registriert: 03.09.2009

Windows XP Prof. SP3
AutoCAD 2010
Visual Studio 2008 / 2010 Prof.

erstellt am: 28. Okt. 2009 17:14    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!

a.n. hat in >> diesem << Beitrag vom Konvertieren einer Polyline in ein MPolygon geschrieben.
Ich stehe vor dem selben Problem und würde gerne wissen, wie ich das Konvertieren hinbekomme (gerne auch nur temporär innerhalb meiner Transaction), um dann die IsPointInside Methode aufzurufen.

Allerdings hatte ich diese Methode über die Suche in der ObjectARX Managed Class Reference des ObjectARX-Kits nicht gefunden?!
Auch gibt es nur ein PolygonMesh...ist das das MPolygon?

Grüße, Sebastian

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: 9732
Registriert: 01.12.2003

AutoCAD 20xx, Civil 3D 201x, Inventor Prof 201x usw.

erstellt am: 28. Okt. 2009 18:32    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 sebastian. 10 Unities + Antwort hilfreich

Ich bin mir fast sicher, dass das MPOLYGON Objekt nur in der API von AutoCAD MAP beschrieben ist, da es eigentlich kein Objekt aus "AutoCAD Pur" ist.

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

Udo Hübner
www.CAD-Huebner.de

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

sebastian.
Mitglied



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

Beiträge: 90
Registriert: 03.09.2009

Windows XP Prof. SP3
AutoCAD 2010
Visual Studio 2008 / 2010 Prof.

erstellt am: 28. Okt. 2009 18: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

Gibt es denn dann eine ähnliche Funktion, welche mir eine solche "IsPointInside" Abfrage zur Verfügung stellt?

Viele Grüße, Sebastian

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

CADmium
Ehrenmitglied V.I.P. h.c.
Maschinenbaukonstrukteur



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

Beiträge: 13508
Registriert: 30.11.2003

ACAD 2004DX Mechanical PP

erstellt am: 28. Okt. 2009 19:13    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 sebastian. 10 Unities + Antwort hilfreich

naja .. zur Not mußt du dir so eine Funktion programmieren .. hier  die Mathematik dazu

------------------
  - 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: 28. Okt. 2009 19:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

Du musst in den Verweisen aus dem AutoCAD-Verzeichnis die Datei 'AcMPolygonMGD.dll' hinzufügen, dann funkt's mal und Du hast die MPoly-Assembly mit dabei.

Udo hat insofern recht, als diese Assembly früher mal Map3D und Civil3D vorbehalten war, mittlerweile (ich glaube seit AutoCAD 2008, bin da aber nicht sicher) ist diese Bestandteil des 'normalen' AutoCAD's.

Vorsicht bei 2010, zumindest wenn Du kein ServicePack installiert hast, bekommst Du beim Create eines neuen MPolygons einen Abflug.

Vorsicht2: verwendest Du diese Funktion bei langen engen Polygonen, also z.B. sowas wie eine Strasse (lang, gekrümmt im Kurvenbereich, aber eben im Verhältnis zur Länge sehr schmal), dann kann es schon mal passieren, dass Dir ein Punkt als innenliegend retourniert wird, der es aber nicht ist, zumindest bei AutoCAD2009 (weiß nicht mehr welches ServicePack) mit 2010 hab ich mir mein eigenes MPolygnon geschrieben und bin daher darauf nicht mehr angewiesen.

HTH, - alfred -

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

sebastian.
Mitglied



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

Beiträge: 90
Registriert: 03.09.2009

Windows XP Prof. SP3
AutoCAD 2010
Visual Studio 2008 / 2010 Prof.

erstellt am: 29. Okt. 2009 12: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

Hallo miteinander!

Danke für die Antworten. Hört sich ja nicht so "einfach" an.

Ich hab das mit dem MPolygon mal versucht, hätte hierzu aber 3 Fragen:

1) Wie konvertiere ich meine Polylinie in ein MPolygon?
Es gibt die Funktion

Code:
FromAcadObject
, welche mir eine ObjectId liefert, aber kein MPolygon Objekt, oder sehe ich da etwas falsch und es ist einfach nicht die passende Funktion?

2) In einem der sehr wenigen >> Google Ergebnisse << zu

Code:
IsPointInsideMPolygon
ist oftmals von einer
Code:
AppendLoopFromBoundary
Methode zu lesen. Diese hat auch einen Parameter "excludeCrossing". Weiß jemand, was es damit auf sich hat?

Wie so oft sind ja die ganzen Übergabeparameter, sowohl für

Code:
IsPointInsideMPolygon
als auch für
Code:
AppendLoopFromBoundary
in der Intellisense "Hilfe" nicht dokumentiert.

3) Bei genauerem Überlegen, wäre es für meine Aufgabe sogar optimal, wenn es eine Methode à la "IsBlockReferenceInside-Mpolygon/-Polyline" geben würde oder jemand schonmal vor einem ähnlichen Problem stand und Codeschnipsel als Anhaltspunkte hätte. Denn wie das nachfolgende Bild zeigt, würde mir eine Überprüfung der Eckpunkte z.B. nichts bringen. Die Blockreferenz liegt trotzdem teilweise außerhalb meiner Begrenzungslinie.

Vielleicht weiß ja jemand weiter!

Danke schön schon mal, Grüße, Sebastian

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

CADmium
Ehrenmitglied V.I.P. h.c.
Maschinenbaukonstrukteur



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

Beiträge: 13508
Registriert: 30.11.2003

ACAD 2004DX Mechanical PP

erstellt am: 29. Okt. 2009 12:30    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 sebastian. 10 Unities + Antwort hilfreich

naja ... ich mach dann ein polygonales Auswahlfenster und guck dann, ob das betrachtete Objekt zum Auswahlsatz gehört..... In Lisp wäre das mit (ssget "_wp" ..) keine so schwere übung

------------------
  - 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: 29. Okt. 2009 12:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

Code:
Public Shared Function getMPolyFromEnt(ByRef Ent As Polyline) As MPolygon
Dim tRetVal As MPolygon = Nothing
Try
  Dim tMPoly As MPolygon = New MPolygon()
  tMPoly.AppendLoopFromBoundary(Ent, True, 0.0001)

  If tMPoly IsNot Nothing Then
      If tMPoly.Area < 0 Then
        'dann drehen wir die umlaufrichtung mal um und sehen nach, ob's damit positiv wird
        tMPoly.Dispose() : tMPoly = Nothing
        Dim tPLine As DatabaseServices.Polyline = ISHAcPLine.revertLwPoly(Ent)
        tMPoly = New DatabaseServices.MPolygon()
        tMPoly.AppendLoopFromBoundary(tPLine, False, 0.0001)
        tPLine.Dispose() : tPLine = Nothing
      End If
      tRetVal = tMPoly
  Else
      tMPoly.Dispose()
  End If
Catch ex As Exception
  'fehlerausgabe
End Try
Return tRetVal
End Function



>> excludeCrossing

Normalerweise ist ein MPolygon eine Fläche, bestehend aus einer Umgrenzung und optional Inseln. Hast Du aber z.B. eine Polylinie, die zuvor nicht gis-technisch bereinigt ist (also mehrere Vertizes an der gleichen Position, oder sowas wie ein Achter, wo Vertizes der Umgrenzung sich mitten drin berühren), dann wird das zum Problem, wenn Du excludeCrossing auf TRUE stehen hast, dann wird Dir in solchen Fällen das Objekt nicht gebildet und eine Exception ausgelöst. Stellst Du es auf FALSE, dann duldest Du (und das MPolygon-Objekt) solche Unsauberkeiten.


>> wäre es für meine Aufgabe sogar optimal, wenn es eine Methode à la
>> "IsBlockReferenceInside-Mpolygon/-Polyline"

ja, schon, für Dich. Ich brauch's momentan nicht.    Bedeutet wohl selbst schreiben! Methode von CADmium wäre eine Variante, wenn Du die Geometrie am Bildschirm im sichtbaren Bereich hast (also die Zeichnung muss im Editor geladen sein) und dann Abfragen von Spezialfällen (Eckpunkt Deines Blocks oder Linie Deines Blocks liegt genau an der Grenze).
Andere Variante Block im Speicher zerlegen, Einzel-Elemente prüfen, ob diese z.B. Schnittpunkt mit Outline finden, ... Viele Wege führen nach Rom, auf diesem hier liegen halt ein paar Steine zum Wegräumen. 

- alfred -

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

sebastian.
Mitglied



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

Beiträge: 90
Registriert: 03.09.2009

Windows XP Prof. SP3
AutoCAD 2010
Visual Studio 2008 / 2010 Prof.

erstellt am: 29. Okt. 2009 13:52    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,

alles klar, dann werd ich mir da selbst etwas schreiben!

Zitat:
tMPoly.AppendLoopFromBoundary(Ent, True, 0.0001)

erstellt mir also aus meiner Polylinie ein MPolygon!
Was gibt die Toleranz 0.0001 an?

Zitat:
ISHAcPLine

Was ist das für eine Klasse, welche mir die
Code:
.revertLwPoly(Ent)
Methode zur Verfügung stellt?

@CADmium: 

Zitat:
Methode von CADmium wäre eine Variante, wenn Du die Geometrie am Bildschirm im sichtbaren Bereich hast

Leider habe ich deine Vorgehensweise noch nicht so ganz verstanden. Vielleicht könntest du es noch etwas genauer erläutern. Würde mir sehr helfen!

Zitat:
Block im Speicher zerlegen

Meine Blockreferenz hat eine Methode
Code:
.Explode(EntitySet as DBObjectCollection)

War das gemeint? Was wäre hier mein EntitySet und wie greife ich dann auf meine einzelnen zerlegten Block Polylinien zu, denn die Methode hat ja keinen Rückgabewert, also "wo liegen" meine Linien dann?

Danke für die Hilfe, Sebastian

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


Ex-Mitglied

erstellt am: 29. Okt. 2009 14:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Sebastian,

>> Was gibt die Toleranz 0.0001 an

Aus der Hilfe (arxdoc.chm):
Input tolerance distance to determine if the boundary crosses another boundary in the AcDbMPolygon


>> ISHAcPLine.revertLwPoly(Ent)
>> Was ist das für eine Klasse, welche mir die Methode zur Verfügung stellt?

meine eigene, sorry, dass ich die hier angeführt habe. Sollte aber eigentlich nur dem Verständnis der ganzen Funktion dienen.


>> .Explode(EntitySet as DBObjectCollection)
>> War das gemeint? Was wäre hier mein EntitySet und wie greife ich
>> dann auf meine einzelnen zerlegten Block Polylinien

Ja, das hätte ich gemeint. Wenn die BlockReference explodiert wird, dann stellt Dir die Explode-Methode die resultierenden Elemente in die DBObjectCollection hinein. Du kannst diese dann normal mit einer Schleife durcharbeiten und bekommst alsp alle Elemente in der Form geliefert, also würdest Du im AutoCAD 'ursprung' sagen.

- alfred -

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 30. Okt. 2009 07:59    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 sebastian. 10 Unities + Antwort hilfreich

Hallo,

solche Funktionen braucht man immer mal. Für Konturen ohne Bögen! habe ich mir mal die folgende Funktion geschrieben:

Code:

//double[] x = X-Koordinaten des Polygons
//double[] y = Y-Koordinaten des Polygons (passend zu den X-Koordinaten)
//pointX , pointY = Punkt der geprüft wird
//return: True/False
public static bool isPointInsidePolygon(double[] x, double[] y,
                                                    double pointX, double pointY)
        {
            bool isInside = false;
            int nPoints = x.Length;

            int j = 0;
            for (int i = 0; i < nPoints; i++)
            {
                j++;
                if (j == nPoints) j = 0;

                if (y[i] < pointY && y[j] >= pointY | | y[j] < pointY && y[i] >= pointY)
                {
                    if (x[i] + (pointY - y[i]) / (y[j] - y[i]) * (x[j] - x[i]) < pointX)
                    {
                        isInside = !isInside;
                    }
                }
            }

            return isInside;
        }



Grüße Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.

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

sebastian.
Mitglied



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

Beiträge: 90
Registriert: 03.09.2009

Windows XP Prof. SP3
AutoCAD 2010
Visual Studio 2008 / 2010 Prof.

erstellt am: 02. Nov. 2009 20: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

Guten Abend zusammen,

Zitat:
solche Funktionen braucht man immer mal

Genau, deshalb hat es mich auch gewundert, dass es soetwas für einfache Polylinien nicht schon von Autodesk selbst gibt...

Ich habe die Funktion von Holger sowie die von Stelli1 aus dem bereits zitierten Beitrag in VB.net implementiert und zuvor schon mal auf dem Papier durchgespielt.

Beide laufen wunderbar und brauchen für z.B. 100000 Berechnungen auch nur wenige Millisekunden.
Falls später jemand eine ähnliche Funktion sucht, kann ich die von Holger empfehlen, da sie sogar gut doppelt so schnell ist wie die aus dem andren Beitrag.

Nochmals vielen Dank an Holger und natürlich auch an alle andren! Das hat mir doch einiges an Zeit erspart!

Grüße und einen schönen Abend, Sebastian

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

sebastian.
Mitglied



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

Beiträge: 90
Registriert: 03.09.2009

Windows XP Prof. SP3
AutoCAD 2010
Visual Studio 2008 / 2010 Prof.

erstellt am: 02. Nov. 2009 20:30    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

Ach ja. Den Hinweis von Alfred kann ich bestätigen:

Zitat:
Vorsicht bei 2010, zumindest wenn Du kein ServicePack installiert hast, bekommst Du beim Create eines neuen MPolygons einen Abflug.

Ich habe danach diese Variante nicht mehr weiter verfolgt...

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