| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blockreferenzen und deren Attribute (4051 mal gelesen)
|
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 27. Dez. 2011 22:36 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bin gerade dabei, ein kleines Interface für AUTOCAD mittels ObjectARX und C# zu erstellen. Es soll bestimmte Blöcke in die Zeichnung einfügen und Blockreferenzen davon erstellen und bearbeiten. Die Blöcke beinhalten verschiedene Textattribute, wobei nur zwei davon sichtbar sind. Meine erste Frage wäre, ob es eine Eigenschaft der Attributreferenzen gibt, die das Attribut nur in der Zeichnung als unsichtbar markiert? Wenn ich die Option "visible" auf "true" setze, dann wird das jeweilige Attribut in der Zeichnung unsichtbar, und kann auch im Attribut-Editor vom AUTOCAD nicht mehr gesehen werden. Und mein zweites Problem: Ich habe eine Funktion integriert, die es ermöglicht, dass alle Positionen der sichtbaren Attribute bestimmter Blöcke um einen festgelegten Wert verschoben werden. Dies funktioniert bei manchen Blöcke gut und bei anderen verändert sich die Position nicht. Ich kann aber auch keine Fehlermeldung oder ähnliches abfangen. Die Blöcke unterscheiden sich auch lediglich in der Anordnung der sichtbaren Attribute. Ansonsten sind sämtliche Eigenschaften gleich. Wie kann es dann sein, dass ich bei den Blockreferenzen des einen Blockes die Attributpositionen verändern kann, und bei den anderen nicht?? Ich habe auch schon mehrere Eigenschaften der Attributreferenzen verglichen und konnte keine Unterschiede feststellen. Die Eigenschaft "lockposition" steht auf "false"! Gibt es eventuell eine Möglichkeit, die Eigenschaften des einen Blockes auf den anderen zu übertragen, oder könnte es an einer Eigenschaft der Blöcke bzw. Blockreferenzen liegen? Ich bin echt am verzweifeln und hoffe, dass mir hier vielleicht einer weiterhelfen kann! Vielen Dank im Voraus! grüße ------------------ Robert Menger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2014 Plateia, Canalis Visual Basic
|
erstellt am: 27. Dez. 2011 23:25 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Zunächst mal: Herzlich Willkommen im Forum Zu Deiner ersten Frage: Schau Dir mal die Eigenschaft Invisible an Allerdings gibt es da noch viel mehr Abhängigkeiten bei den Attributen. Den zweiten Teil habe ich nicht so ganz verstanden, was Du machen möchtest (Absätze würden das Lesen auch vereinfachen) und was Du schon gemacht hast (Codesegmente wären hilfreich). Vielfach liegt es schon an der Unterscheidung von Block und Blockreferenz oder einfacher / dynamischer Block. Je nach Zielsetzung.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 01. Jan. 2012 18:17 <-- editieren / zitieren --> Unities abgeben:
Hallo KlaK, erstmal natürlich ein frohes neues Jahr! Vielen Dank für deine Antwort. Du hast natürlich recht, mein Eintrag war sehr chaotisch. Ich versuch es mal mit etwas mehr Struktur . Kannst du mir sagen, was die Eigenschaft "visible" von "invisible" bei den Attributreferenzen unterscheidet? Zu meinem anderen Problem. Ich habe zwei verschiedene Typen von Blöcken in meinen Zeichnungen. Beide sind bis auf die Anordnung zweier Textattribute identisch. Nun habe ich in meiner Zeichnung von beiden Blöcken mehrere Blockreferenzen, die ich mit meinem Interface bearbeiten möchte. Ich habe jetzt eine Funktion geschrieben, die die sichtbaren Textattribute der Blockreferenzen alle um einen festgelegten Wert verschiebt. Code: public void MoveAttribute(string attribute, double x, double y, double z) { AttributeReference attrRef; Transaction tr = this.StartTrans(); Point3d choords = new Point3d(); try { foreach (ObjectId id in blR.AttributeCollection) { attrRef = tr.GetObject(id, OpenMode.ForRead) as AttributeReference; if (attrRef.Tag == attribute) { try { //doc.Editor.WriteMessage("\n KKS: "+attrRef.TextString+" verifiable: "); attrRef.UpgradeOpen(); Point3d oc = attrRef.Position; choords = new Point3d(oc.X + x, oc.Y + y, oc.Z + z); attrRef.Position = choords; attrRef.DowngradeOpen(); //doc.Editor.WriteMessage("\n Neue Position: "+attrRef.Position); }catch(Autodesk.AutoCAD.Runtime.Exception e){ doc.Editor.WriteMessage("\n Fehler: "+e.Message); } } } } catch (Autodesk.AutoCAD.Runtime.Exception e) { doc.Editor.WriteMessage("\n" + e.Message); } finally { this.StopTrans(tr); } }
Diese Funktion funktioniert leider nur bei der einen Art der Blöcke. Bei den Blockreferenzen des anderen Blockes kann ich die Position der Attribute nicht verändern. Wie gesagt, die Blöcke bzw. Blockreferenzen unterscheiden sich in Ihren Eigenschaften nicht (zumindest sollten sie das...). Welche Eigenschaft der Blöcke, Blockreferenzen oder Attribute könnte das Setzen der Position verhindern ( die Positionen der Attributreferenzen sind nicht gesperrt)??Gibt es eine Möglichkeit alle Eigenschaften eines Blockes auf einen anderen zu übertragen? Ich glaube, mein Problem ist recht schwierig zu erklären, ich hoffe, es war diesmal etwas verständlicher und über einen Lösungsweg wäre ich sehr dankbar! grüße robert
------------------ Robert Menger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 04. Jan. 2012 09:14 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Zitat: Original erstellt von Boortsneggor: ... Kannst du mir sagen, was die Eigenschaft "visible" von "invisible" bei den Attributreferenzen unterscheidet? ...
Hallo Robert, Alle Entities haben die Eigenschaft Visible - Damit kann man zum Beispiel die Zeichnungsobjekte unabhängig der Layersteuerung Ein- bzw. Ausblenden. Diese Eigenschaft steht dem Anwender nicht (auch nicht im Eigenschaftenfenster) zur Verfügung. Die Attribute haben die Eigenschaft Invisible - Diese ist gleichzusetzen mit den Attributeigenschaften Rückwärts oder Auf dem Kopf. Man kann also ein Attribut so einstellen, dass es nicht angezeigt wird. Diese Eigenschaft steht dem Anwender zur Verfügung. Klar soweit? 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 |
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 04. Jan. 2012 14:31 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 04. Jan. 2012 15:10 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Auch dieses Problem wurde oben schon knapp angesprochen, da du dich in der Objektstruktur aber nicht bis ins Details auskennst und wir nicht sehen können was du siehst .. kann man sehr schlecht helfen Poste eine Beispiel DWG mit einer Blockreferenz bei der es nicht funktioniert, wenn noch eine andere Blockreferenz dabei ist mit der es klappt wäre dies auch nicht schlimm. (Beschreiben was wir in der DWG sehen sollten wäre dazu auch noch nett) Cad.de-Upload => *.DWG in *.txt umbenennen da 'DWG' hier kein zulässiges Upload-Format ist. Oder irgendwo anders hoch laden und hier verlinken geht natürlich auch. Auch nicht schlecht zu erfahren wäre sicher wie du das "verschieben" realisiert hast Gebe mehr Infos und dir wird sicher weiter geholfen ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) [Diese Nachricht wurde von cadffm am 04. Jan. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2014 Plateia, Canalis Visual Basic
|
erstellt am: 04. Jan. 2012 16:15 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Holger, vielen Dank für die Erklärung. Habe zur Zeit noch Urlaub und nicht alle Unterlagen parat. @Boortsneggor: Wie cadffm schon schrieb, ein paar Informationen fehlen noch, z.B. wie Du die Objekt-ID (Handle) holst. Ein oft begangener Fehler ist, dass über Attribut(I) darauf zugegriffen wird und nicht erst kontrolliert wird, ob der TagString mit dem gewünschten Wert übereinstimmt (aber vielleicht ist das in C# identisch mit Deinem attrRef.Tag . In Deinem Code findet man z.B. keinen Hinweis auf die Definition und Zuweisung von blR.AttributeCollection (Public?) Sollte es bis dahin nicht schon gelöst sein, nächste Woche mehr ...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 04. Jan. 2012 17:23 <-- editieren / zitieren --> Unities abgeben:
Ich muss vielleicht noch etwas über meine Rahmenbedingungen erklären. Ich habe teilweise Zeichnungen, die die "UR-Blöcke" und diverse Blockreferenzen davon bereits enthalten. Um zu den BlockReferenzen weitere Attribute hinzuzufügen, habe ich in den dwg-Files der ursprünglichen Blöcke die Attribute eingebaut um diese neuen Blöcke mit identischem Namen in die Zeichnungen einzufügen. Dann kann ich jeder BlockReferenzen meine neuen Attribute zuweisen. Das funktioniert soweit alles auch prima. Nun möchte ich ebenso die Position mancher Attribute setzen, und das funktioniert aus irgendwelchen Gründen nur bei BlockReferenzen des einen Blockes. Da muss beim ersten Einfügen der Blöcke irgendwas verändert wurden sein. Ich habe nun rausgefunden, dass meine Funktion einwandfrei funktioniert, wenn ich die Blockreferenzen mit meinen neu eingesetzten Blöcken synchronisiere (ATTSYNC bzw. BATTMAN). Das Problem ist bei der ganzen Sache, dass die sichtbaren Attribute der BlockReferenzen Textformatierungen haben, die vom ursprünglichen Block abweichen können, die aber nicht verändert werden sollen. Bei der Synchronisation passiert leider genau das. Jetzt habe ich entweder die Möglichkeit, die veränderte Option zu finden um ohne SyncAtt auszukommen, oder irgendwie die Textformatierungen der BlockReferenzen zu übertragen. Noch etwas zu meinem Code. Ich habe mir eine Klasse speziell für meine Blöcke geschrieben, der ich eine BlockReference übergebe. Diese übernimmt das ganze Attribute-Handling. In einer anderen Klasse filtere ich mir die richtigen Blöcke aus der BlockTable raus, installiere meine AdamBlock-Klasse und übergebe die bLr. Hier mal das Beispiel für die Positionsgeschichte: Code: using (tr) { try { bT = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; bTr = tr.GetObject(bT[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId id in bTr) { DBObject dbo = tr.GetObject(id, OpenMode.ForRead) as DBObject; bLr = dbo as BlockReference; if (zz && ez && horz) { if (bLr != null && bLr.Name.Contains("ADAM")) { AdamBlock block = new AdamBlock(bLr); block.MoveAttribute("ZEILE_1", x, y, z); block.MoveAttribute("ZEILE_2", x, y, z); }
Die einzelnen Attribute kann ich mittels Tag der AttributeReference-Class rausfiltern. Soweit sollte auch alles sauber sein. Vielleicht kann man mein Problem jetzt noch ein bisschen besser nachvollziehen. Das Wichtigste sind die sichtbaren Attribute, die für das Auge unverändert bleiben müssen! Vielen Dank schon mal für eure Hilfe! grüße robert ------------------ Robert Menger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 04. Jan. 2012 17:39 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Hallo Robert, hast du das AUTOCAD-Magazin abonniert? Falls dem so ist, kannst du dich wahrscheinlich auf das nächste Heft freuen. Es ist geplant, dass nun auch .Net-Tools (inkl. Quellcode) veröffentlicht werden, und nicht nur wie bisher Lisp-Programme. Das erste Tool ist dann ein C#.Net-Programm, mit welchem Attribute hinzugefügt werden, ohne dass hinterher das Attsync erforderlich ist, um eben die Nebeneffekte dieses Befehls zu umgehen. Da mit der Veröffentlichung die Rechte an den Verlag übergehen, kann ich hier nicht den Code posten. 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 |
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 04. Jan. 2012 19:26 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, danke für den Tip. Die Zeitung habe ich nicht abonniert. Die Sache mit dem Hinzufügen eines Attributes ohne attsync habe ich bereits gelöst. Es geht lediglich um die restlichen Eigenschaften bzw. die Textformate und Positionen der sichtbaren Attribute... grüße robert ------------------ Robert Menger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 05. Jan. 2012 09:55 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
|
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 05. Jan. 2012 13:20 <-- editieren / zitieren --> Unities abgeben:
Du hast recht, vielleicht hilft das. Ich habe jetzt mal den alten Block, so wie er in den Zeichnungen bereits vorhanden sein sollte und meinen neuen Block als dwg-File drangehangen. Wie gesagt, die Blöcke sollten bis auf ein Attribut identisch sein, sind es aber scheinbar nicht, wo liegt der Unterschied??? Zu deiner "wilden Vermutung": Ich habe in meinem Interface schon mehrere Funktionen, die die BlockReferenzen bearbeiten. Die Funktionieren auch alle. Hier noch mal verbal der Weg, wie ich an meine BlockReferenzen komme: 1.BlockTableRecord aus der BlockTable im Modelspace holen 2.BlockTableRecord mit Schleife durchlaufen und jedes enthaltene Objekt als DBObject holen 3.DBObject auf BlockReferenz fasten 4.Abfrage ob BlockReferenz leer (wenn es sich nicht um eine BlockReferenz handelt) und ob der Name der BlockReferenz "ADAM" enthält -> Wenn das zutrifft, habe ich meine BlockReferenzen... Das ist nach meinen Recherchen ein gängiger Weg, aber ich lasse mich auch gern eines besseren belehren ... Wie bekomme ich denn eigentlich Zugriff auf meine Ur-Blöcke? Vielen Dank für eure Hilfe! grüße robert
------------------ Robert Menger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 05. Jan. 2012 14:18 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Ok, auch wenn das weder ein Block noch eine Blockreferenz war im Anhang, hier vermutlich die "Lösung" : Du mußt dich mit dem Aufbau von Textobjekten befassen, dein Programm versagt sicher immer bei den Attributen welche zB. RECHTS ausgerichtet sind, bei LINKS ausgerichteten wird es hingegen funktionieren, richtig ? - prüfe das mal bitte ! (wobei auch diese Eigenschaft sich bei altem und neuem Block zum Teil unterscheidet) Soo, nun habe ich auch noch mal in der Hilfe nachgeschaut ob ich ein Wort finde mit dem du vielleicht was anfangen kannst und hoffe es ist dieses hier: object.TextAlignmentPoint (immer genutzt wenn ein Textobjekt NICHT Ausrichtung LINKS hat)
(sorry, ich kenne mich mit .net und vba 0.01 aus - mir sind nur die DXF-Gruppencodes geläufig. Hoffe die Vokabel bringt dich jetzt weiter ) ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 05. Jan. 2012 14:18 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Zitat: Original erstellt von Boortsneggor: ...Hier noch mal verbal der Weg, wie ich an meine BlockReferenzen komme:1.BlockTableRecord aus der BlockTable im Modelspace holen 2.BlockTableRecord mit Schleife durchlaufen und jedes enthaltene Objekt als DBObject holen 3.DBObject auf BlockReferenz fasten 4.Abfrage ob BlockReferenz leer (wenn es sich nicht um eine BlockReferenz handelt) und ob der Name der BlockReferenz "ADAM" enthält -> Wenn das zutrifft, habe ich meine BlockReferenzen... ...
ähmm - das geht aber auch einfacher: Du kannst doch die Referenzen direkt beim BlockTableRecord abfragen. Code:
public static ObjectIdCollection GetBlockReferences(BlockTable _bt, Transaction _tr, String _Name) { ObjectIdCollection _result = null; BlockTableRecord _btr = null; try { _btr = (BlockTableRecord)_tr.GetObject(_bt[_Name], OpenMode.ForRead); _result = _btr.GetBlockReferenceIds(true, false); _btr.Close(); } catch { } return _result; }
Wie du den Code anwendest, ist dir sicher klar. (Die Zeichnung habe ich mir noch nicht angesehen).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 |
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 06. Jan. 2012 16:04 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, deine Vermutung hat sich bestätigt! Ich muss vorher abfragen, ob es sich um eine Standard-Links-Ausrichtung oder um eine abweichende Textausrichtung handelt.
Code: attrRef.IsDefaultAlignment
Bei abweichenden Textausrichtung kann ich die Position mit
Code: attrRef.AlingmentPoint
verändern. Das sich die Blöcke in der Ausrichtung unterscheiden wusste ich ja, aber ich hätte nie vermutet, dass das was mit der Positionsmanipulation zu tun haben könnte! ;) Zitat: Du mußt dich mit dem Aufbau von Textobjekten befassen
Da ich, denke ich mal, noch mehr mit meinen Textattributen anstellen muss, hättest du vielleicht nen Tipp, wo ich dahingehend gute Informationen herbekomme? Ich glaube Literatur zu diesem Thema ist recht rar. Zitat: Ok, auch wenn das weder ein Block noch eine Blockreferenz war im Anhang
Noch eine kleine Anmerkung zu deine "Spitze" am Anfang. Ich finde so etwas verwirrt immer ein wenig, wenn man es nicht sofort aufklärt. Die dwg-files waren lediglich die Dateien, die ich als quasi "UR-Blöcke" in die Zeichnungen einfüge. Davon werden dann die Blockreferenzen abgeleitet. Soweit mein Wissensstand. Wenn ich da etwas falsch verstanden habe, würde ich mich freuen, wenn du mich aufklären würdest.Aber nichts desto trotz habe ich dank deiner Hilfe mein Problem gelöst! Vielen Dank dafür! @Holger: Wann erscheint das AUTOCAR Magazin denn immer? grüße robert ------------------ Robert Menger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 06. Jan. 2012 16:20 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|