Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Object ID's 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
Autor Thema:  Object ID's von Blockreferenzen (1608 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: 24. Feb. 2012 09:09    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, eine Frage an die Spezialisten.

Ich habe den Namen eines Blockes und möchte nun alle ObjectID's seiner Referenzen haben. So daß ich eine Referenz nach der anderen bearbeiten kann. Nun könnte ich alle Objekte in allen Layouts durchlaufen und prüfen, ob es sich um einen der gesuchten Blöcke handelt. Aber ich denke es gibt noch eine geschicktere Methode, an die gesuchten ID's zu kommen.

Gruß, Theo

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

CADmium
Ehrenmitglied V.I.P. h.c.
Maschinenbaukonstrukteur



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

Beiträge: 13508
Registriert: 30.11.2003

ACAD 2004DX Mechanical PP

erstellt am: 24. Feb. 2012 09:18    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

via Lisp kommt man über den GC330 der Blockdefinition auf das Block_Record Object, das nach dem GC102 (102 . "{BLKREFS") in den GC331 die Blockreferenzen speichert...

------------------
  - Thomas -          
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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: 24. Feb. 2012 09:18    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

Zitat:
Original erstellt von Theo37:
.... Ich habe den Namen eines Blockes und möchte nun alle ObjectID's seiner Referenzen haben. So daß ich eine Referenz nach der anderen bearbeiten kann. ...

Hallo Theo,

Du hast die Antwort schon (fast) selbst geschrieben:
Der BlockTableRecord hat die Methode: GetBlockReferenceIds
Damit bekommst du alle Referenzen.

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

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: 24. Feb. 2012 09:50    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

Danke euch Beiden,

an Thomas
funktioniert bestimmt sehr gut mit Lisp. ist aber nicht mehr so mein Ding. Obwohl mit Lisp manches ging was mit ARX nicht mehr geht.

an Holger
das wars was ich suchte. Ist sehr praktisch über die ObjectIDs.
man kommt wirklich sehr schnell von der blockdef. zu den Referenzen und auch umgekehrt.

gruß, Theo

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

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: 25. Feb. 2012 12: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

Hi Theo 37,

das Problem hatte ich auch schon mal. Man kann es so machen:
Das Progrämmchen dursucht die Blockdefinitionen nach einem
Block namens 'Punkt'. Ist der vorhanden wird in 'oc'
eine Liste mit den Blockreferenzen zurückgegeben. Da gibt es
weiter unten noch einen Thread von mir zu dem Thema.
Vieleicht hilft Dir das weiter.

bccad


Code:

Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim db As Database = HostApplicationServices.WorkingDatabase
Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead, False), BlockTable)
Dim oc As ObjectIdCollection = Nothing

Using tr As Transaction = doc.TransactionManager.StartTransaction
    For Each id As ObjectId In bt
        If (id.IsValid) AndAlso (Not id.IsErased) Then
            Dim btr As BlockTableRecord = DirectCast(tr.GetObject(id, OpenMode.ForRead, False), BlockTableRecord)
            If UCase(btr.Name) = "PUNKT" Then
              oc = btr.GetBlockReferenceIds(False, True)
              Exit For
            End If
        End If
    Next
    tr.Commit()
End Using


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

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

erstellt am: 27. Feb. 2012 08:50    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 Bccad,

Danke für das Codestück. Ich habs mal mit meiner Funktion verglichen.
Ein Unterschied ist in der Zeile:
            myBTR = acTrans.GetObject(myBT(Name), OpenMode.ForRead)
Ich hole mir den Blocktablerecord direkt über den Namen und durchlaufe keine Schleife. Ich denke das ist schneller. meine Funktion wird bei jedem Öffnen einer Zeichnung ausgeführt deswegen ist es mir wichtig daß es schnell abläuft. Auch wenn es dabei wahrscheinlich um Millisekunden geht. Gibt es da ein Problem was für die Schleife spricht das ich vielleicht nicht überlegt habe?
ein weitere Unterschied ist mir aufgefallen:
            selectBlocksbyname_neu = myBTR.GetBlockReferenceIds(True, False)
Hier setzt Du die zwei Booleans genau andersherum wie ich. Was haben die eigentlich für einen Sinn? Ich hab nirgendwo ne Erklärung gefunden was die bewirken.

Blieben noch die zwei ".close". Die kann ich auch weglassen?


Danke Theo

  Public Function selectBlocksbyname_neu(ByVal Name As String) As ObjectIdCollection
        Dim MyDB As Database
        Dim myBT As DatabaseServices.BlockTable
        Dim myBTR As DatabaseServices.BlockTableRecord
        MyDB = acDoc.Database
        Using acTrans As Transaction = MyDB.TransactionManager.StartTransaction()
            myBT = MyDB.BlockTableId.GetObject(DatabaseServices.OpenMode.ForRead)
            myBTR = acTrans.GetObject(myBT(Name), OpenMode.ForRead)
            selectBlocksbyname_neu = myBTR.GetBlockReferenceIds(True, False)
            myBT.Close()
            myBTR.Close()
        End Using
    End Function

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

ManfredPS
Mitglied



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

Beiträge: 118
Registriert: 23.08.2011

..

erstellt am: 27. Feb. 2012 09: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 Nur für Theo37 10 Unities + Antwort hilfreich

 
Zitat:
ich hole mir den Blocktablerecord direkt über den Namen
Mach ne neue DWG, erstelle darin eine Blockdefition "X", starte BEREINIG und mach den Block "X" wieder weg. Und jetzt verifizieren, was dein "über Name" bringt!
Du erhältst Zugriff auf den als gelöscht markierten BlockTableRecord. Und noch schlimmer, wenn du nach dem Bereinigen jetzt eine neue Blockdefinition "X" anlegst, dann hast du 2 Blockdefintionen mit dem gleichen Namen und es kann durchaus sein, dass du dann den gelöschten BTR bekommst (das gilt für alle von SymbolTableRecord abgeleiteten Klassen, also auch Layer, Linientyp, ...).
Zitat:
Blieben noch die zwei ".close". Die kann ich auch weglassen?
Was du nicht mit .Open öffnest, machst du bitte auch nicht mit .Close zu. Entweder Transaction oder keine Transaction, .Open/.Close gehören zur Methode "keine Transaction".
Zitat:
Hier setzt Du die zwei Booleans genau andersherum wie ich
Das hängt davon ab, ob du mit dynamischen Blöcken rechnen musst oder nicht, steht aber im ARX-Doc drin.

[Diese Nachricht wurde von ManfredPS am 27. Feb. 2012 editiert.]

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: 27. Feb. 2012 11:40    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 Manfred,

entschuldige wenn ich da unqualifizierte Fragen stelle.
Ich bin über VBA zu .Net gekommen. Und da war doch Manches einfacher.
Trotzdem glaube ich auch in den Managed-Objecten Fortschritte zu machen.(zumindest bemühe ich mich)

zu den bereinigten Blöcken:
Die Problematik habe ich erkannt. Hat bei mir wahrscheinlich nicht zu Problemen geführt, weil ich den Befehl immer direkt nach dem Öffnen einer Datei starte.

Zu den .close:
Ist klar, mach ich.

Zu GetBlockReferenceIds in der ARX-Doc:
hab ich gefunden. Soweit mein Englisch es zulässt auch verstanden.
Ich hab da immer ein bisschen probleme darin was zu finden.
Die Suchfunktion scheint in dem ObjectARX-Bereich nicht zu funktionieren. Wenn ich "GetBlockReferenceIds" als Suchwort eingebe, bekomme ich keine Treffer.Entweder ist das so, oder ich habs nicht richtig installiert.

Gruß, theo

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

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: 05. Mrz. 2012 20:15    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

Hi Theo37,

>> entschuldige wenn ich da unqualifizierte Fragen stelle. <<
Ich glaube es gibt keine unqualifizierten Fragen 

>> Ich bin über VBA zu .Net gekommen. Und da war doch Manches einfacher. <<
Wem sagst du das !!! Ist ein langer Weg zur Erleuchtung.

Also ManfredPS hat da völlig recht. Mit gelöschten Objekten musst du aufpassen.
Die können mehrfach da sein, deshalb Liste scannen und auf 'IsValid' und 'Not IsErased'
testen. Das sollte dann den richtigen rausfischen.
Die Geschwindigkeit dürfte sich erst bei riesigen Zeichnungen und/oder langsamen
Rechnern bemerkbar machen.

bccad

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