Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Überschneidungen feststellen

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:  Überschneidungen feststellen (2300 mal gelesen)
Brennivin
Mitglied


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

Beiträge: 3
Registriert: 06.05.2004

erstellt am: 06. Mai. 2004 16:58    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 habe folgendes  Problem:
ich habe eine Linie gezeichnet und mehrere Rechtecke, die auf dieser Linie liegen. Dies habe ich zu einem Block gemacht. Es können mehrere dieser Blöcke eingefügt werden. Nun möchte ich feststellen, ob sich irgendwelche dieser Blöcke überlagern.
Ich habe
Dim ref1 As AcadBlockReference
    Dim ref2 As AcadBlockReference
    For I = 0 To ThisDrawing.Blocks.Count - 1
        Set ref1 = ThisDrawing.Blocks.Item(I) '*Hier Fehler "Type mismatch"
        For J = 0 To ThisDrawing.Blocks.Count - 1
            Set ref2 = ThisDrawing.Blocks.Item(J)
           
            Dim intPoints As Variant
                       
            intPoints = ref1.IntersectWith(ref2, acExtendNone)
            If intPoints <> 0 Then
                MsgBox "Überschneidung!", vbExclamation
               
            End If
        Next
    Next
versucht, gibt aber Fehlermeldung beim Sternchen.

Wer kann mir bitte helfen?

Gruss
Brennivin

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Die Phönizier haben das Geld erfunden - aber warum so wenig?
(Johann Nepomuk Nestroy)

erstellt am: 07. Mai. 2004 13:48    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 Brennivin 10 Unities + Antwort hilfreich

Hi Brennivin,

der alte Fehler, so wie's ausssieht: Du verwechselst Blöcke und Blockreferenzen. Blöcke kann man definieren, aber niemals einfügen - das sind INSERTs, die man einfügt. Mit den Zeilen

Dim ref1 As AcadBlockReference
Set ref1 = ThisDrawing.Blocks.Item(I)

machst du genau diesen Fehler: du willst eine Blockdefinition einer Variablen zuweisen, die vom Typ INSERT (AcadBlockReference) ist. Das geht nicht! Die Fehlermeldung ist daher völlig korrekt!

Dein Programm sollte in der Zeichnung auf Überschneidungen testen, aber nicht in der Blocktabelle! ThisDrawing.Blocks ist für dein Problem völlig irrelevant.

Schau mal in diesen Thread rein, da habe ich eine sehr detaillierte Zusammenstellung zur Terminologie von Inserts und Blöcken gebracht: http://ww3.cad.de/foren/ubb/Forum259/HTML/000210.shtml

Gruß, Axel

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

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...

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

Brennivin
Mitglied


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

Beiträge: 3
Registriert: 06.05.2004

erstellt am: 07. Mai. 2004 17:41    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


Untitled-1.gif

 
Hallo,
erst einmal herzlichen Dank an mapcar.
Du hast den Knoten gelöst:

        Dim intType(0) As Integer
        Dim varData(0) As Variant
        Dim colSelSets As AcadSelectionSets
        Dim selSet As AcadSelectionSet
       
        Set colSelSets = ThisDrawing.SelectionSets
         
          For Each sSet In colSelSets
              If sSet.Name = "Zugauswahl" Then
                  sSet.Delete
                  Exit For
              End If
          Next
       
        intType(0) = 0
        varData(0) = "INSERT"
       
        Set sSet = colSelSets.Add("Blabla")
       
        sSet.Select acSelectionSetAll, , , intType, varData
                   
          For intCnt = 0 To sSet.Count - 1
              If TypeOf sSet.Item(intCnt) Is AcadBlockReference Then
                Set objBlkRef = sSet.Item(intCnt)
              End If
              For intCnt2 = intCnt + 1 To sSet.Count - 1
                    If TypeOf sSet.Item(intCnt2) Is AcadBlockReference Then
                        Set objBlkRef2 = sSet.Item(intCnt2)
                        MsgBox objBlkRef.Name + ", " + objBlkRef2.Name
                   
                    End If
                    intPoints = objBlkRef2.IntersectWith(objBlkRef, acExtendNone)
              Next intCnt2
          Next intCnt
           
           
            sSet.Delete
                       
           
            If UBound(intPoints) > 0 Then
                MsgBox "Überschneidung!", vbExclamation
               
            End If

Nun aber das nächste Problem:
wenn ich die Funktion ausführe, und die eingefügten Blockreferenzen (;-)) sich in der Zeichnung nicht überschneiden, findet ACAD trotzdem einen Schnittpunkt. Das Problem tritt aber nur dann auf, wenn die Blöcke sich in senkrechter Richtung irgendwie über- oder untereinander stehen; wie gesagt, sie berühren sich nicht. Also in der beigefügten Zeichnung:
Objekt 1 und Objekt 2 ergeben bei der Überprüfung Schnittpunkte
Objekt 1 und Objekt 3 ergeben keinen Schnittpunkt
Objekt 2 und Objekt 3 ergeben keinen Schnittpunkt

Vor allem die erste Zeile bereitet mir Kopfzerbrechen, da ja augenscheinlich kein Schnittpunkt zu sehen ist.

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Die Phönizier haben das Geld erfunden - aber warum so wenig?
(Johann Nepomuk Nestroy)

erstellt am: 07. Mai. 2004 21: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 Brennivin 10 Unities + Antwort hilfreich

Keine Ahnung, wie IntersectWith bei Inserts arbeitet, das hatte ich noch nie... Auf den ersten Blick sieht es so aus, als würde nur das Umgebungsrechteck getestet. Zeichne doch mal den/die gefundenen Punkte ein, damit man sieht, wo sie liegen.

Wenn meine Vermutung zutrifft, musst du noch alle Sub-Entities gegeneinander testen (jeder gegen jeden), um evtl. Schnittpunkte zu verifizieren. Da, wo dein bisheriger Ansatz nichts findet, gibt's auch nichts, was noch nachgetestet werden müsste.

Gruß, Axel

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

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Die Phönizier haben das Geld erfunden - aber warum so wenig?
(Johann Nepomuk Nestroy)

erstellt am: 07. Mai. 2004 22:42    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 Brennivin 10 Unities + Antwort hilfreich

Mir kam eben noch eine Idee: Habe spaßeshalber mal einen Block gemacht, der nur zwei Punkte enthält (lower left und upper right des Umgebungsrechtecks). Da kann eigentlich kein Schnittpunkt entstehen, wenn nicht zwei Referenzen deckungsgleich eingefügt werden. Es ist genau so, wie ich vermutet habe: Es wird nur das Umgebungsrechteck getestet, du musst also nach dem KO-Prinzip alle Unterentities testen.

Noch ein Hinweis zu deinem Code: Wäre nett, wenn du Option Explicit / Option Base verwenden und angeben würdest und alle Variablen sauber deklarierst. Eine Variable, die intPoints heißt, aber ein Variant-Array ist, macht das Lesen nicht gerade einfach.

Gruß, Axel

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

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...

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

Brennivin
Mitglied


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

Beiträge: 3
Registriert: 06.05.2004

erstellt am: 08. Mai. 2004 09:40    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 mapcar,
das intPoints ist in dieser Hinsicht natürlich verwirrend. Das liegt aber daran, das mit intPoints hier nicht eine Variable vom Typ int gemeint ist. Vielmehr bezieht sich das int auf intersection. intpoints sollte also ausgeschrieben intersectionpoints heißen.

Ich werde dann mal versuchen, die einzelnen Entitäten in den Blockreferenzen zu testen.

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