| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Zugriff auf Layer magaged (1537 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 02. Aug. 2011 16:53 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte aus einer nicht geöffneten Datei einige Layer auslesen. Wie kann ich managed auf die Layer zugreifen? Bisher hab ich mal geschrieben: Dim dbDoc As Autodesk.AutoCAD.DatabaseServices.Database dbDoc = New Database(False, True) dbDoc.ReadDwgFile(Filename, IO.FileShare.Read, True, "") Wie komme ich auf die Layer? ich müßte die Farben von ein paar vorhandenen Layern auslesen. Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 03. Aug. 2011 07:51 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
hallo! du musst dir von der Datenbank die Layertable holen und dann einfach durchlaufen. Funktioniert genauso wie wenn du in der geöffneten Zeichnung managed auf die Layer zugreifst. Beispiele gibt es hier schon wo. Bsp:
Code:
Dim myLT As DatabaseServices.LayerTable = Nothing Dim myLTR As DatabaseServices.LayerTableRecord = Nothing Dim myLTE As DatabaseServices.SymbolTableEnumerator = NothingmyLT = DEINEDB.LayerTableId.GetObject(OpenMode.ForRead) myLTE = myLT.GetEnumerator While myLTE.MoveNext myLTR = myLTE.Current.GetObject(OpenMode.ForRead, True, True) End While
lg [Diese Nachricht wurde von veydan am 03. Aug. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 03. Aug. 2011 08:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Veydan, das hilft mir schon mal viel. Wenn ich dein Beispiel richtig verstehe, dann gehst Du mit Movenext immer zum nächssten weiter. Könnte ich auch einen Layer direkt über den Layernamen ansprechen? Wie ürde das gehen? Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 03. Aug. 2011 09:41 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
ja du kannst prüfen ob die LT einen Layer hat mit Code: lt.Has(Layername)
und dann z.b das Layerobjekt holen mit Code: ltr = CType(tr.GetObject(lt.Item(Layername), OpenMode.ForWrite, True, True), LayerTableRecord)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 03. Aug. 2011 15:37 <-- editieren / zitieren --> Unities abgeben:
Hallo, jetzt hab ich nochmal ein ähnliches Problem. Komm ich auch irgendwie auf die Dictionaries und die XRecords einer nicht geöffneten Zeichnung? Enweder müßte ich die Werte auslesen, Oder ich würde das Dictionarie kpl. in die akt. Zeichnung kopieren. Was ist leichter Machbar? Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 04. Aug. 2011 08:14 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
das ist das gleiche Prinzip, die Datei mit ReadDwgFile einlesen in eine neue Datenbank, und dann suchst du dir einfach die Einträge wie wenn es die aktuelle wäre. Wie man die sucht, wurde glaube ich schon in dem Thread Text in DWG speichern beantwortet. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 04. Aug. 2011 15:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Veydan, ich komme von der AutoCad Seite her, deshalb tue ich mich mit den alten "COM-Objekten" leichter als mit den Managed-Objekten. Aber ohne die Datei zu öffnen, geht es nur managed. Egal, ich habs irgenwie hin gebastelt (abgeschrieben). Meine Lösung, falls sie jemand intresiert: Dim TrAct As DatabaseServices.Transaction = Nothing Dim DxfCode() As Short Dim DxfData() As Object Using acTrans As Transaction = dbDoc.TransactionManager.StartTransaction() Dim Dic As DBDictionary Dim Mydic As DBDictionary Dim MyXrecord As Xrecord Dim DXF As ResultBuffer Dic = acTrans.GetObject(dbDoc.NamedObjectsDictionaryId, OpenMode.ForRead) Mydic = acTrans.GetObject(Dic.GetAt("NEB-Bezeichnung"), OpenMode.ForRead) MyXrecord = acTrans.GetObject(Mydic.GetAt("Matrix"), OpenMode.ForRead) DXF = MyXrecord.Data Dim Myarray As Object Myarray = DXF.AsArray Dim i As Integer = 0 For Each itm As TypedValue In DXF ReDim Preserve DxfCode(i) ReDim Preserve DxfData(i) DxfCode(i) = itm.TypeCode DxfData(i) = itm.Value i = i + 1 Next Dic.Dispose() Mydic.Dispose() MyXrecord.Dispose() End Using Danke und Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |