| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Layer von DB zu DB kopieren (1072 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 26. Apr. 2012 17:23 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, ich möchte Layer von einer geschloßenen DWG in die aktuelle DWG kopieren. Dazu habe ich mal den Code unten geschrieben. Leider bekomme ich in der Zeile mit dem Copyfrom immer die Fehlermeldung "Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben." was kann ich machen? kann ich die Using Transaction verschachteln? Danke für jeden Tip. Gruß, Theo Private Sub PasteButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PasteButton.Click Dim dbDoc As Autodesk.AutoCAD.DatabaseServices.Database Dim Filename As String = "D:\Lisp\Layerzwischen.dwg" Dim MyLayertable As DatabaseServices.LayerTable = Nothing Dim Mylayer As LayerTableRecord Dim Mynewlayer As LayerTableRecord Dim LayerListe(0) As LayerTableRecord Dim Layerzähler As SymbolTableEnumerator Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim MyDB As Database Dim i As Integer MyDB = acDoc.Database dbDoc = New Database(False, True) Try dbDoc.ReadDwgFile(Filename, IO.FileShare.ReadWrite, True, "") Catch MsgBox("Layerzwischen.dwg konnte nicht geöffnet werden") End Try Using acTrans As Transaction = dbDoc.TransactionManager.StartTransaction() MyLayertable = acTrans.GetObject(dbDoc.LayerTableId, _ OpenMode.ForRead) Layerzähler = MyLayertable.GetEnumerator While Layerzähler.MoveNext ReDim Preserve LayerListe(LayerListe.Length) LayerListe(LayerListe.Length - 1) = Layerzähler.Current.GetObject(OpenMode.ForRead) End While End Using dbDoc.Dispose() Using acTrans As Transaction = acDoc.Database.TransactionManager.StartTransaction() MyLayertable = MyDB.LayerTableId.GetObject(OpenMode.ForWrite) For i = 1 To LayerListe.Length - 1 Mynewlayer = New LayerTableRecord Mynewlayer.CopyFrom(LayerListe(i)) '' hier passiert der Fehler MyLayertable.Add(Mynewlayer) acTrans.AddNewlyCreatedDBObject(Mynewlayer, True) Next i acTrans.Commit() End Using MyLayertable.Dispose()
End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 26. Apr. 2012 22:52 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
... Der Ansatz via CopyFrom functioniert nicht Zeichnungsübergreifend. Für diesen Zweck gibt es extra Objekte und Methoden. Ich habe allerdings auf meinem Handy kein VS drauf daher kann ich dir ketzt nur ein Stichwort zur Suche nennen: WblockCloneObjects Grüße! Holger ------------------ Holger Brischke 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 |
oscarr Mitglied CAD-Manager
Beiträge: 198 Registriert: 02.10.2007 ACA 2012 - English Win 7/x64
|
erstellt am: 27. Apr. 2012 14:25 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Hallo, ich mache das immer so: thisDB ist die Ziel Datei mysrcDB ist die externe Datei Code:
Private Shared Sub CopyLayerFrom(ByVal LayerName As String) Try Dim thisDb As AcadDb.Database = AcadDb.HostApplicationServices.WorkingDatabase Using docLock As DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument Using tr As AcadDb.Transaction = mySrcDb.TransactionManager.StartTransaction Dim lt As AcadDb.LayerTable = tr.GetObject(mySrcDb.LayerTableId, AcadDb.OpenMode.ForRead, False) If lt.Has(LayerName) Then Dim ltr As AcadDb.LayerTableRecord = tr.GetObject(lt(LayerName), AcadDb.OpenMode.ForRead) If Not ltr.IsErased Then Using thisTr As AcadDb.Transaction = thisDb.TransactionManager.StartTransaction Dim thisLt As AcadDb.LayerTable = thisTr.GetObject(thisDb.LayerTableId, AcadDb.OpenMode.ForWrite) Dim map As New AcadDb.IdMapping() Dim objIDs As AcadDb.ObjectIdCollection = New AcadDb.ObjectIdCollection objIDs.Add(ltr.ObjectId) thisDb.WblockCloneObjects(objIDs, thisLt.ObjectId, map, AcadDb.DuplicateRecordCloning.Replace, False) thisTr.Commit() Dim ExistingLayerId As AcadDb.ObjectId ExistingLayerId = thisLt.Item(LayerName) thisDb.Clayer = ExistingLayerId End Using tr.Commit() End If End If End Using End Using Catch ex As Autodesk.AutoCAD.Runtime.Exception myDestEd.WriteMessage(ControlChars.CrLf & "Error {0} Copy layer from other document" & ControlChars.CrLf, ex) myDestEd.WriteMessage(ex.StackTrace) End Try End Sub
LG Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 30. Apr. 2012 13:46 <-- editieren / zitieren --> Unities abgeben:
|
oscarr Mitglied CAD-Manager
Beiträge: 198 Registriert: 02.10.2007 ACA 2012 - English Win 7/x64
|
erstellt am: 30. Apr. 2012 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Naja, kann man ja. Einfach sind halt ein paar transactions (verschachteln geht problemlos), ein try ... catch, eine Sichheitsfrage (If Not ltr.IsErased Then) - nicht wirklich nötig aber sicherer und schon wird einfach kopiert mittels: WblockCloneObjects LG Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 30. Apr. 2012 14:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, jetzt läufts. Das Verschachteln ist ja nicht weiter schlimm, ich dachte nur es wäre ohne übersichtlicher. Aber so läuft es gut. und mit DuplicateRecordClon... hab ich sogar Einfluß darauf was mit doppelten geschehen soll. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |