Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD ObjectARX und .NET
  Einfügen von Blockreferenzen

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
  
PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
Autor Thema:  Einfügen von Blockreferenzen (1716 mal gelesen)
bccad
Mitglied



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

Beiträge: 57
Registriert: 02.11.2009

erstellt am: 11. Jul. 2011 13:00    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 noch am umsteigen auf vb.net und hänge hier irgendwie fest.
Ich will aus einem Listview mit Koordinaten die entsprechenden Blöcke einfügen.
Das Array codierung enthält den passenden Blocknamen und das entsprechende Layer für die Blockreferenz.
Wenn ich das laufen lasse wird der erste Block eingefügt, aber beim zweiten aus der Liste stürzt Autocad
an der Zeile >> currentWorkspace.AppendEntity(blockRef) << mit einem internen Fehler ab.
Im Debugger kann ich sehen das der Blockname und das Layer korrekt übergeben werden.
Eine ähnliche Routine, die immer den gleichen Block einfügt funktioniert. Wenn die Blockdefinition jedesmal
wechselt klappt es nicht. Blöcke und Layer sind in der Zeichnung alle vorhanden.
Was geht hier schief 

bccad


Code:

    Sub SetBlock()
        Dim scaleX As Double = 0.2, scaleY As Double = 0.2, scaleZ As Double = 0, i As Integer
        Dim tAcadDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
        Using trans As Transaction = tAcadDoc.TransactionManager.StartTransaction
            Dim currentWorkspace As BlockTableRecord = CType(trans.GetObject(tAcadDoc.Database.CurrentSpaceId,        OpenMode.ForWrite), BlockTableRecord)
            Dim blockTable As BlockTable = CType(tAcadDoc.Database.BlockTableId.GetObject(OpenMode.ForRead), BlockTable)
            Try
                For Each item As ListViewItem In lv.Items
                    If item.Checked = True Then
                        i = getcode(item.SubItems(6).Text)
                        If i > 0 Then
                            Dim pos As New Point3d(Val(item.SubItems(3).Text), Val(item.SubItems(4).Text), 0)
                            Dim blockRef As BlockReference = New BlockReference(pos, blockTable(codierung(i).b))
                            blockRef.ScaleFactors = New Scale3d(scaleX, scaleY, scaleZ)
                            blockRef.Layer = codierung(i).l
                            currentWorkspace.AppendEntity(blockRef)
                            trans.AddNewlyCreatedDBObject(blockRef, True)
                            trans.Commit()
                        End If
                    End If
                Next
            Catch ex As Exception
                MsgBox(ex.Message)
                Exit Sub
            End Try
        End Using
    End Sub

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


Ex-Mitglied

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

Hi,

Du startest vor der Schleife eine TransAction

In der Schleife fügst Du beim ersten Durchlauf eine BlockReference ein und mit der Zeile:
trans.Commit
schliesst Du die TransAction ab, daraus folgt, dass beim zweiten Durchlauf keine aktive TransAction mehr vorhanden ist (die ist ja schon abgeschlossen).

Also verschiebe das .Commit auf 'nach der Schleife' (jedoch vor End Using  ) und gut ist.

- alfred -

BTW: Ein Exit Sub innerhalb einer geöffneten Transaction kann zu extremen Schwierigkeiten führen, lass das bitte (in eigenem Interesse  ), sonst fängst Du zwar einen Einfügefehler ab, aber entscheidest Dich dann im Catch-Block, das TransAction-Objekt nicht ordnungsgemäß zu schliessen, sondern gleich zu 'End Sub' zu gehen.

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

bccad
Mitglied



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

Beiträge: 57
Registriert: 02.11.2009

erstellt am: 11. Jul. 2011 14:04    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 Alfred,

vielen Dank für deine schnelle Hilfe.

>> Also verschiebe das .Commit auf 'nach der Schleife' (jedoch vor End Using  ) und gut ist.

ah ja, und ich dachte das .Commit gehört zum Einfügen der einzelnen Elemente und End Using schliest das ganze.
Jetzt funktioniert es jedenfalls. Was ich aber seltsam finde ist die Tatsache das der Debugger die Exception nicht
abfangen kann und ACAD richtig abschmiert.
Das mit dem exit sub in catch ist natürlich Stuss, das schmeiss ich da raus.

- bccad -

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


Ex-Mitglied

erstellt am: 11. Jul. 2011 14:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

>> Was ich aber seltsam finde ist die Tatsache das der Debugger die Exception nicht
>> abfangen kann und ACAD richtig abschmiert.

Gerade hier (nach TransAction.Commit) bewegst Du Dich hart an der Grenze zwischen Managed und Unmanaged Code und da kannst Du nicht mehr alles im Debugger auseinandernehmen.
Du kannst noch im Visual-Studio probieren, unter Debuggen ==> Ausnahmen ==> alle Hakerl (in der linken der beiden Hakerl-Spalten) zu aktivieren. Du wirst voraussichtlich mehr Fehler sehen, aber helfen wird's nicht, weil der Code fpr Dich nicht änderbar ist (ausser natürlich das Hakerl bei 'Common Language Runtime Exceptions').

- alfred -

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

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)2025 CAD.de | Impressum | Datenschutz