Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Funktion verhält sich nicht gleich

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:  Funktion verhält sich nicht gleich (831 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: 09. Nov. 2009 21:57    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 miteinander!

Ich habe ein ziemlich merkwürdiges Problem mit der "SelectCrossingWindow(Point3d, Point3d, SelectionFilter)" Methode.

Sie wird in einer Funktion aufgerufen, mit der ich prüfen möchte, ob ein Rechteck (linke obere Ecke ist der erste Point3d Parameter, rechte untere Ecke ist der zweite Point3d Parameter) komplett innerhalb eines andren größeren Rechtecks liegt oder ob es Überschneidungen gibt.

In einer ersten Variante rufe ich die Funktion wie folgt auf:
"Per Hand" hole ich mir den ersten Point3d:

Code:

Dim myPPO As PromptPointOptions = New PromptPointOptions("Pick Point: ")
myPPR = myEd.GetPoint(myPPO)
p3d = myPPR.Value

Und berechne dann den zweiten Point3d wie folgt:
Z.B. (p3d.X + 5, p3d.Y - 5, 0)

Als SelectionFilter habe ich "LWPOLYLINE" (also die Außenlinie / das große Rechteck) auf dem bestimmten Layer.

Soweit erstmal alles klar - nun zur Anwendung:

Als ersten Point3d möchte ich "fast die linke obere Ecke" meines großen Rechtecks haben, d.h. X + 0.001, Y - 0.001
Diesen wähle ich bei der "PromptPointOptions" Abfrage.

Das funktioniert auch bestens und meine Funktion liefert, dass nichts innerhalb meines CrossingWindow ist oder sich damit schneidet, also das kleine Rechteck komplett innerhalb des großen Rechteck ist.

Im folgenden jetzt der "Fehler":
Nun habe ich das ganze etwas automatisiert und lasse mir die Eckpunkte meines großen Rechtecks auslesen. Dann nehme ich wieder die linke obere Ecke und schlage den kleinen Offset auf: X + 0.001, Y - 0.001

Mit diesem Punkt als ersten Point3d rufe ich nun wieder die selbe Funktion auf, berechne wieder den zweiten Point3d wie zuvor: (p3d.X + 5, p3d.Y - 5, 0) und nutze auch den selben SelectionFilter.

Also exakt die gleichen Werte, was ich auch beim Debuggen sehen konnte!

Aber nun gibt mir die Funktion zurück, dass etwas innerhalb des CrossingWindow liegt, was nicht der Fall ist! Wenn ich dann wieder auf den selben Punkt "per Hand" klicke, funktioniert es wieder und es liegt nichts innerhalb des CrossingWindow?!

Nach ewigem Rumprobieren bin ich nun ziemlich ratlos?!

>> Hier << habe ich folgendes gelesen: "The disadvantage is that it only works in the currently visible part of the screen."

Aber das ist bei mir ja der Fall?! Oder übersehe ich etwas?

Im späteren Verlauf klappt es nämlich auch und ein Einschnitt im großen Rechteck wird erkannt:


Vielleicht weiß ja jemand weiter! 

Grüße, 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: 09. Nov. 2009 22: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

Gerade bin ich noch ein kleines Stück weiter gekommen.

Bei einer Änderung des Offsets, welcher mein erster Point3d von der linken oberen Ecke entfernt ist, auf >= 0.03 funktioniert auch die "automatische Methode".
Aber warum es nicht klappt, wenn ich näher an der linken oberen Ecke des großen Rechtecks beginne, weiß ich nicht?!
Das geht dann wie gesagt nur mit dem "händischen Aufruf".

-------------------------

Noch eine andere Sache:

Meine ausgelesenen Koordinaten des großen Rechtecks habe ich auf 4 Nachkommastellen gerundet, eben die Genauigkeit, welche man auch in AutoCAD beim Zeichnen per Hand hinbekommt.

Wenn ich nun z.B. folgendes mache:

Code:
dblKoordinateX = dblKoordinateX - 0.03

Bekomme ich z.B. folgendes Ergebnis:

6.3744999999999994 = 6.4045 - 0.03

Warum nicht genau wieder auf 4 Nachkommastellen gerundet?

Naja, vielleicht wird der morgige Tag ja besser  .

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


Ex-Mitglied

erstellt am: 09. Nov. 2009 22:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

2 Vermutungen, aber Du hast schon indirekt einen Hinweis richtig aufgespürt:

'Selektion am Bildschirm ist immer heikel', da gibt's zum einen die voreingestellten Objektfänge, die eingestellte Größe der Pickbox, die Nähe zum Objekt und alles wird über den Haufen geschmissen bzw. läßt sich nicht mehr wirklich mit der händischen Selektion vergleichen.

Ich hätte mal auf die Toleranzangaben verzichtet, die Punkte des umgebenden Rechecks herangezogen, zu diesen soweit hingezoomt, dass es maximal am Bildschirm liegt (Zoom to Object), dann das SelectionSet mit den gleichen Koordinaten. Dann bekommst Du zwar das umgebende Element (i.d.R.) mit in die Selektion. Dann die gefundenen Elemente durchscannen und vergleichen, ob die ObjectID/der Handle gleich ist mit der umgebenden Poly (dieses Element zählt halt dann nicht).

Musst Du viele Element durchforsten und es sind nur Rechtecke, dann bau Dir einen Cache, in dem Du Element und seine Extents zwischenspeicherst und rechne selbst.

- alfred -

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

TobyRosenberg
Mitglied
Bauingenieur

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

Beiträge: 7
Registriert: 10.11.2009

erstellt am: 10. Nov. 2009 01: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 sebastian. 10 Unities + Antwort hilfreich

Probier es mal wenn "OSMODE" auf 0 gesetzt ist.

MfG

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: 10. Nov. 2009 14:29    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

Es klappt leider immer noch nicht so richtig.

Osmode auf null? Ich hab einfach mit F3 den Objektfang ausgestellt und dann mein .net Programm laufen lassen. Das hat aber nichts geändert.
Eine Auswahl von Hand mit minimalem Offset von der linken oberen Ecke des großen Rechtecks klappt ja auch (-> es wird nichts gewählt und "Nothing" zurückgegeben) und ich kann im Debugmodus sehen, dass er mit den "richtigen" Punkten rechnet. Stimmt alles, da wirklich nichts "im Weg" ist.


Folgendes habe ich nochmal probiert:

Mit den Koordinaten, mit welchen es händisch klappt (s.o.), funktioniert es automatisiert wieder nicht, obwohl es im Debugmodus wieder die selben sind!
Da wird etwas ausgewählt, obwohl gar nichts da ist.
Im Debugmodus kann ich dann sehen: promtselectionresult "Status: OK {5100}", "Value" ist vom Typ(?) "{Autodesk.AutoCAD.EditorInput.SelectionSetFullyMarshalled}" und Count steht auf 1.
Das ist das Ergebnis eines kleinen CrossingWindow, welches sich sozusagen mit 1mm Versatz an die linke obere Ecke des großen Rechtecks "anschmiegt", ohne dieses jemals zu schneiden.


Wenn ich jetzt den Startpunkt des CrossingWindow genau auf den Punkt der linken obereren Ecke des großen Rechtecks lege, wird auch etwas ausgewählt -> klar, jetzt schneidet das kleine CrossingWindow ja wirklich etwas, nämlich das große Rechteck.
Das promtselectionresult Ergebnis ist das gleiche wie oben.


Wenn der Versatz zum großen Rechteck groß genug ist, dann sehe ich im Debugmodus promptselectionresult "Status {-5001}" und Value "Nothing"...das müsste es aber auch schon bei kleinem Versatz sein?!

@ Alfred: Das mit von Hand rechnen. Damit meinst du wahrscheinlich: die einzelnen Kanten meines kleinen Blocks zu nehmen und damit zu prüfen, ob sie sich mit meinen Kanten des großen Rechtecks schneiden?
Was gibt es da für eine Methode?...die hoffentlich auch "sicher" funktioniert.

Danke schön und Grüße, Sebastian

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


Ex-Mitglied

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

Hi Sebastian,

>> die einzelnen Kanten meines kleinen Blocks zu nehmen und damit zu prüfen

Nicht unbedingt die Kanten. Wenn ich Deine Zeichnung/Screenshot oben ansehe (und die inneren Rechtecke alle Blöcke sind), dann würden mir 2 Dinge einfallen:

a) die Extents der Blöcke als zu berechnende Punkte (innerhalb/ausserhalb Auswahlfenster) prüfen

b) nur den Blockeinfügepunkt selbst

Wenn Du nämlich selbst rechnest, kannst Du Dich (hoffentlich  ) auf die Methode verlassen. Auf ein AutoCAD-Selectionset (mit Fenster oder kreuzend, also irgendwie mit Bildschirm) verlasse ich mich NIE.

- 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: 10. Nov. 2009 17:49    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 Alfred,

Zitat:
die Extents der Blöcke als zu berechnende Punkte (innerhalb/ausserhalb Auswahlfenster) prüfen

Das sagt mir leider nichts? Wie bekomme ich die Extents und was ist das überhaupt?


Ich habe in den letzten Minuten noch eine Änderung vorgenommen. Nämlich die "SelectCrossingWindow" Methode durch "SelectCrossingPolygon" ersetzt. Diese scheint sehr gut zu funktionieren!

Ansonsten prüfe ich, wie du auch geschrieben hast, den Einfügepunkt mit einer IsPointInside Methode (wie in einem der letzten Threads schon mal diskutiert) und danach eben, ob der ganze Block keine Schnittstellen mit der Außenlinie hat (durch "SelectCrossingPolygon"), was dann evtl. ersetzt werden könnte durch deine Methode mit den "Extents", wenn ich das richtig sehe?!

Danke wieder mal für die Hilfe und noch einen schönen Abend!

Sebastian

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


Ex-Mitglied

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

Hi Sebastian,

>> Wie bekomme ich die Extents und was ist das überhaupt?

Die Extents eines geometrischen Elements sind die minima-/maxima-Punkte der Ausdehnung des Objekts. Geometrisch könntest Du Dir vorstellen, Du musst einen orthogonal liegenden Quader so zeichnen, dass er das ganze Objekt umfasst ohne dabei zu groß zu werden. Beispiel:

Ein Kreis mit Mittelpunkt 0,0,0 und Radius 2 ==>
  ExtentsMin = -2,-2,0 (der linke untere Punkt)
  ExtentsMax = +2,+2,0 (der rechte obere Punkt)

Verfügbar ist das ganze über die Eigenschaft '.GeometricExtents' jedes geometrischen Objekts aus DatabaseServices-NameSpace

Codebeispiel:

Code:
Dim tPnt1 as Geometry.Point3D = new Geometry.Point3D(10,12,-3)
Dim tPnt2 as Geometry.Point3D = new Geometry.Point3D(-5,2,4)
Dim tLine as DatabaseServices.Line = new DatabaseServices.Line(tPnt1,tPnt2)

Dim tExtents as DatabaseServices.Extents3D = tLine.GeometricExtents


Aufzupassen bei der Eigenschaft ist aber bei Texten und Attributen, da läufts manchmal nicht sauber.

- 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: 11. Nov. 2009 11:08    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

Dann bin ich jetzt ja wieder etwas schlauer!

Danke für die Erklärung!

Du solltest mal ein Buch schreiben, bei dem Wissen  .

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

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


Ex-Mitglied

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

Hi Sebastian,

>> Du solltest mal ein Buch schreiben

Ich denk schon eine zeitlang darüber nach, wieviel Stück nimmst Du? 

Die sehr limitierte Anzahl an potentiellen Abnehmern (anders ausgedrückt die Zielgruppe) ist für mich nicht leicht zu erfassen. Eine Auflage mit 100Stk. macht mir niemand. 

- 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: 11. Nov. 2009 12: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

Ja, da hast du wahrscheinlich recht.

Andrerseits gibt es zu dem Thema halt wirklich nicht viel. Und wenn man auf dem Gebiet arbeiten will / muss, würde man um dein Buch nicht drum rum kommen  .

Wegen der Auflage: Vielleicht einfach selbst binden lassen und privat über amazon o.ä. verkaufen (bzw. als Ebook).

Nun ja, soweit erstmal.

Sebastian

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

TobyRosenberg
Mitglied
Bauingenieur

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

Beiträge: 7
Registriert: 10.11.2009

erstellt am: 12. Nov. 2009 23:06    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

Vielleicht habe ich mich etwas unverständlich ausgedrückt: zumindestens in einigen Versionen von AutoCAD "fängt" eine selection via window or crossing Punkte gemäss den Einstellungen der Systemvariable OSMODE. Und das passiert unabhängig davon, ob OFANG ein- oder ausgeschaltet ist, nicht aber, wenn OSMODE auf 0 gesetzt ist.

Ich kann mich leider nicht mehr daran erinnern, welche Version von AutoCAD es war, bei der ich Stunden damit verbraten habe, einem vermeintlichen Programmierfehler bei der Objektauswahl auf die Spur zu kommen, nur um festzustellen, daß es an OSMODE ungleich 0 lag.

Hoffentlich hilft das weiter.

MfG

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