| | | 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
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 / zitieren --> Unities abgeben:
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
Beiträge: 9732 Registriert: 01.12.2003 AutoCAD 20xx, Civil 3D 201x, Inventor Prof 201x usw.
|
erstellt am: 28. Okt. 2009 18:32 <-- editieren / zitieren --> Unities abgeben: Nur für sebastian.
|
sebastian. Mitglied
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 / zitieren --> Unities abgeben:
|
CADmium Ehrenmitglied V.I.P. h.c. Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 28. Okt. 2009 19:13 <-- editieren / zitieren --> Unities abgeben: Nur für sebastian.
|
Ex-Mitglied
|
erstellt am: 28. Okt. 2009 19:47 <-- editieren / zitieren -->
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
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 / zitieren --> Unities abgeben:
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
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 29. Okt. 2009 12:30 <-- editieren / zitieren --> Unities abgeben: Nur für sebastian.
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 / zitieren -->
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
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 / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 30. Okt. 2009 07:59 <-- editieren / zitieren --> Unities abgeben: Nur für sebastian.
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
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 / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben:
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 >>)
|