| |  | 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

 Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 11. Jul. 2011 13:00 <-- editieren / zitieren --> Unities abgeben:         
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 / zitieren -->
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

 Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 11. Jul. 2011 14:04 <-- editieren / zitieren --> Unities abgeben:         
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 / zitieren -->
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 >>)
 |