Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Layer von DB zu DB kopieren

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:  Layer von DB zu DB kopieren (987 mal gelesen)
Theo37
Mitglied
Techniker


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

Beiträge: 423
Registriert: 08.10.2008

ACAD 2019
WIN 7 64bit
Intel Xenon CPU E5-1620 3.60GHz
16GB RAM

erstellt am: 26. Apr. 2012 17:23    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 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




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: 26. Apr. 2012 22:52    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 Theo37 10 Unities + Antwort hilfreich

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


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

Beiträge: 198
Registriert: 02.10.2007

ACA 2012 - English Win 7/x64

erstellt am: 27. Apr. 2012 14:25    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 Theo37 10 Unities + Antwort hilfreich

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


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

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 30. Apr. 2012 13:46    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,

das schau ich mir mal an. ich dachte ich kann die Layer einfach kopieren. aber das wäre wohl zu einfach gewesen.

Danke. Gruß, Theo

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

oscarr
Mitglied
CAD-Manager


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

Beiträge: 198
Registriert: 02.10.2007

ACA 2012 - English Win 7/x64

erstellt am: 30. Apr. 2012 14:02    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 Theo37 10 Unities + Antwort hilfreich

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


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

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 30. Apr. 2012 14: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

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

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