| |
| 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 (1609 mal gelesen)
|
Theo37 Mitglied Techniker
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 / zitieren --> Unities abgeben:
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
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 24. Feb. 2012 09:18 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 24. Feb. 2012 09:18 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
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
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 24. Feb. 2012 09:50 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 25. Feb. 2012 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
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 = NothingUsing 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
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 / zitieren --> Unities abgeben:
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
Beiträge: 118 Registriert: 23.08.2011 ..
|
erstellt am: 27. Feb. 2012 09:46 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
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
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 27. Feb. 2012 11:40 <-- editieren / zitieren --> Unities abgeben:
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 |
| Zerspanungsmechaniker (m/w/d) Yacht-/Schiffbauteilproduktion & -reparatur | In über 145 Jahren Firmengeschichte hat sich viel verändert, unser Wertekompass und unsere Leidenschaft für den Schiffbau jedoch nicht. Seit vier Generationen bleiben wir ? auch bei teils stürmischer See - als Familienunternehmen konstant auf Kurs und sorgen mit Teamwork, Qualität und Innovation für exzellenten Yachtbau auf höchstem Niveau. An unseren Standorten Bremen, Hamburg und Rendsburg sorgen ... | Anzeige ansehen | Mechaniker |
|
bccad Mitglied
Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 05. Mrz. 2012 20:15 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
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 |