Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Kleinst mögliche Regionen

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:  Kleinst mögliche Regionen (618 mal gelesen)
BillFrankShepard91
Mitglied
Student


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

Beiträge: 15
Registriert: 18.10.2013

Hardware:
Acer TimlineX 4830TG Notebook<P>Software:
AutoCad 2014 (Studentenversion); Visual Studio Express 2012;

erstellt am: 30. Okt. 2013 00: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

Guten Abend,

Ich habe eine Zeichnung, in der viele Linien unterschiedliche große Vielecke bilden.
Mit den Linien, die jeweils ein Vieleck bilden, erzeuge ich eine Region mit der "CreateFromCuves"-Methode der "Region"-Klasse.
Von allen erzeugeten Regionen, möchte ich die Regionen herausfiltern, welche sich aus zwei oder mehreren kleinsten möglichen Regionen "sozusagen" zusammensetzen.

Ist das so überhaupt umsetzbar? Anbei der Code.

Grüße Bill

Code:

Option Strict On

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry

Public Class Class7
    <CommandMethod("ErstelleRegionen")> _
    Public Sub ErstelleRegionen()

        Dim acDocEd As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
        Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database

        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Try


                Dim acBlkTbl As BlockTable
                acBlkTbl = CType(acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead), BlockTable)

                Dim acTypValAr(1) As TypedValue
                acTypValAr.SetValue(New TypedValue(DxfCode.Start, "LINE"), 0)
                acTypValAr.SetValue(New TypedValue(DxfCode.LayerName, "GEB_HAUPT"), 1)
                Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)

                Dim acSSPromt As PromptSelectionResult
                acSSPromt = acDocEd.SelectAll(acSelFtr)

                Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
                Dim acSSet As SelectionSet

                If acSSPromt.Status = PromptStatus.OK Then

                    acSSet = acSSPromt.Value
                    acObjIdColl = New ObjectIdCollection(acSSet.GetObjectIds)

                End If

                Dim acBlkTblRec As BlockTableRecord
                acBlkTblRec = CType(acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)

                Dim acDBObjColl As DBObjectCollection = New DBObjectCollection()

                For Each acObjId1 In acObjIdColl

                    If Not IsDBNull(acObjId1) Then

                        Dim acCurLine As Line = CType(acTrans.GetObject(CType(acObjId1, ObjectId), OpenMode.ForWrite), Line)

                        If Not IsDBNull(acCurLine) Then

                            acDBObjColl.Add(acCurLine)

                        End If

                    End If
                Next

                Dim myRegionColl As DBObjectCollection = New DBObjectCollection()

                myRegionColl = Region.CreateFromCurves(acDBObjColl)

                Dim i As Integer
                For i = 0 To myRegionColl.Count - 1
                    Dim acRegion As Region = CType(myRegionColl(i), Region)

                    acBlkTblRec.AppendEntity(acRegion)

                    acTrans.AddNewlyCreatedDBObject(acRegion, True)
                Next i

                acTrans.Commit()

            Catch ex As Exception

                Application.ShowAlertDialog("Folgender Fehler ist aufgetreten:" & vbLf & ex.Message)

            Finally

                acTrans.Dispose()

            End Try
        End Using
    End Sub
End Class



[Diese Nachricht wurde von BillFrankShepard91 am 30. Okt. 2013 editiert.]

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

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. 2013 05:24    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 BillFrankShepard91 10 Unities + Antwort hilfreich

Hallo Bill,

ich verstehe die Frage nicht ganz. Wenn du Regionen aus Linien, die Vielecke darstellen, bildest, dann ist theoretisch (bzw. so wie ich ein Vieleck definiere) immer eine einzelne Region ohne Inseln zu erwarten.
Du kannst aber mal das große Ganze beschreiben, dann kann ich beurteilen, ob der Ansatz, den du verfolgst so ideal gewählt ist. Womöglich kommt man mit der Erstellung von Umgrenzungen weiter?

Grüße!
Holger

------------------
Holger Brischke
Freier C#.NET-Workshop Ende Oktober geplant. Bei Interesse bitte melden!
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.


defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!


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

BillFrankShepard91
Mitglied
Student


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

Beiträge: 15
Registriert: 18.10.2013

Hardware:
Acer TimlineX 4830TG Notebook<P>Software:
AutoCad 2014 (Studentenversion); Visual Studio Express 2012;

erstellt am: 30. Okt. 2013 07: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

Hallo Holger, 

Ich habe eine Karte in Form einer DWG-Datei. In dieser Karte sind Gebäude eingezeichnet, allerdings sind die Gebäude nur mit Linien gezeichnet. Einige dieser Gebäude berühren sich an einer Linie.
Erstelle ich nun Regionen aus all diesen Linien tritt Folgendes auf:

Beispiel Doppelhaus:
Es werden nicht nur die einzelnen Doppelhaushälften als Regionen, sondernd auch das gesamte Doppelhaus als Region erstellt.
Ich möchte aber nun lediglich die beiden Doppelhaushälften und nicht das gesamte Doppelhaus als Regionen in meiner Zeichnung haben.

Anschließend hatte ich vor alle erstellten Regionen zu schraffieren.

Ich hoffe mein Problem halbwegs verständlich dargestellt zu haben.

Grüße Billw

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

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. 2013 08:15    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 BillFrankShepard91 10 Unities + Antwort hilfreich

... und wenn du die Flächen der erstellten Regionen vergleichst .. die Größte wäre dann die Äußere.

Grüße!
Holger

------------------
Holger Brischke
Freier C#.NET-Workshop Ende Oktober geplant. Bei Interesse bitte melden!
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.


defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!


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

BillFrankShepard91
Mitglied
Student


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

Beiträge: 15
Registriert: 18.10.2013

Hardware:
Acer TimlineX 4830TG Notebook<P>Software:
AutoCad 2014 (Studentenversion); Visual Studio Express 2012;

erstellt am: 02. Nov. 2013 12: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

Hallo Holger,
Danke für diesen Tipp! Es funktioniert jetzt, dass so gut wie alle "größten" Flächen herausgefiltert werden.
Ich erstelle eine Arraylist, in der ich alle möglichen Flächen Kombinationen erstelle. So gehe ich sicher, dass die "kleinsten" Flächen nicht vorhanden sind. Anschließend frage ich ab, ob die Fläche meiner jeweilige Region in der Arraylist vorhanden ist. Ist sie das nicht, wird mit ihr weiter gearbeitet.

Trotzdem wird noch immer eine einzelne, (immer die gleiche) "größte" Region erstellt, wieso weiß ich aber nicht...! ;-) Was aber nichts macht, denn die kann ich Problemlos per Hand rauslöschen.


Code:

Code:

Option Strict On

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry

Public Class Class7
    <CommandMethod("ErstelleRegionen")> _
    Public Sub ErstelleRegionen()

        Dim acDocEd As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
        Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database

        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Try


                Dim acBlkTbl As BlockTable
                acBlkTbl = CType(acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead), BlockTable)

                Dim acTypValAr(1) As TypedValue
                acTypValAr.SetValue(New TypedValue(DxfCode.Start, "LINE"), 0)
                acTypValAr.SetValue(New TypedValue(DxfCode.LayerName, "GEB_HAUPT"), 1)
                Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)

                Dim acSSPromt As PromptSelectionResult
                acSSPromt = acDocEd.SelectAll(acSelFtr)

                Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
                Dim acSSet As SelectionSet

                If acSSPromt.Status = PromptStatus.OK Then

                    acSSet = acSSPromt.Value
                    acObjIdColl = New ObjectIdCollection(acSSet.GetObjectIds)

                End If

                Dim acBlkTblRec As BlockTableRecord
                acBlkTblRec = CType(acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)

                Dim acDBObjColl As DBObjectCollection = New DBObjectCollection()

                For Each acObjId1 In acObjIdColl

                    If Not IsDBNull(acObjId1) Then

                        Dim acCurLine As Line = CType(acTrans.GetObject(CType(acObjId1, ObjectId), OpenMode.ForWrite), Line)

                        If Not IsDBNull(acCurLine) Then

                            acDBObjColl.Add(acCurLine)

                        End If

                    End If
                Next

                Dim myRegionColl As DBObjectCollection = New DBObjectCollection()
                Dim areaList As ArrayList = New ArrayList()
                myRegionColl = Region.CreateFromCurves(acDBObjColl)

                ' Erstellen aller theoretisch größtmöglichen Flächen.

                Dim m, n As Integer
                For m = 0 To myRegionColl.Count - 1
                    For n = 0 To myRegionColl.Count - 1

                        Dim acRegion1 As Region = CType(myRegionColl(m), Region)
                        Dim acRegion2 As Region = CType(myRegionColl(n), Region)

                        areaList.Add(acRegion1.Area + acRegion2.Area)

                    Next
                Next

                ' Filtern der Flächen. Wenn Fläche nicht enthalten, dann wird sie gezeichnet!

                Dim j As Integer
                For j = 0 To myRegionColl.Count - 1

                    Dim acRegion As Region = CType(myRegionColl(j), Region)
                    If areaList.Contains(acRegion.Area) = False Then

                        acBlkTblRec.AppendEntity(acRegion)

                        acTrans.AddNewlyCreatedDBObject(acRegion, True)

                    End If
                Next

                acTrans.Commit()

            Catch ex As Exception

                Application.ShowAlertDialog("Folgender Fehler ist aufgetreten:" & vbLf & ex.Message)

            Finally

                acTrans.Dispose()

            End Try
        End Using
    End Sub
End Class


Grüße Bill

[Diese Nachricht wurde von BillFrankShepard91 am 02. Nov. 2013 editiert.]

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