| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Block verschieben (673 mal gelesen)
|
bccad Mitglied
Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 03. Apr. 2017 14:30 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte in einer Zeichnung einen Block verschieben. Wenn ich folgenden Code ausführe:
Code: Dim br As BlockReference = CType(tr.GetObject(oid, OpenMode.ForWrite), BlockReference) br.Position = newpoint
wird nur der Einfügepunkt geändert. Der Rest des Blockes (hier ein Text) rührt sich nicht vom Fleck. Was muss ich tun damit der ganze Block verschoben wird ? Mfg Bernd
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: 03. Apr. 2017 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für bccad
|
bccad Mitglied
Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 03. Apr. 2017 14:37 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, ja, du hast recht. Es ein Attribut. Aber das ist doch Bestandteil des Blockes. Wieso muss ich den separat verschieben ? Hast du ein Codesnippit wo man sehen kann wie es gemacht wird ? Bernd 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: 03. Apr. 2017 15:14 <-- editieren / zitieren --> Unities abgeben: Nur für bccad
Hallo Bernd, Attribute haben keine Verbindung zum Block(der Blockdefinition). Linien Texte und Kreise sind nur einmal in der Blockdefinition vorhanden und an den Stellen der Blockreferenzen werden diese Geometrieobjekte (bei mehreren Blockreferenzen des Block entsprechend mehrfach) visualisiert, Attribute jedoch hängen "verknüpft" an einer Blockreferenz an. Da es kein .Net spezifisches Thema ist kann ich auch mal allgemeine Infos zum Aufbau verlinken: Konzept Blöcke: http://ww3.cad.de/foren/ubb/Forum54/HTML/013223.shtml
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD 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: 03. Apr. 2017 15:21 <-- editieren / zitieren --> Unities abgeben: Nur für bccad
... du musst die AttributeCollection durchlaufen und dann jedes darin enthaltene Attribut neu positionieren. AttributReferenzen werden beim Einfügen eines Blocks aus den in der Blockdefinition enthaltenen AttributDefinitionen abgeleitet und als eigenständige Objekte geführt. Nur so ist es möglich, dass diesen Textelementen auch von der Blockdefinition abweichende Textinhalte zugewiesen werden können. Da aber eine Attributreferenz eben noch weitere Eigenschaften besitzt, sind auch diese separat (losgelöst von der Blockdefinition) manipulierbar. Du solltest dich mit dem Aufbau einer Zeichnungsdatenbank beschäftigen. In der VBA-Hilfe ist ein grafisches Objektmodell enthalten, das solltest du dir mal anschauen. 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 |
bccad Mitglied
Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 04. Apr. 2017 11:43 <-- editieren / zitieren --> Unities abgeben:
Zitat: ... du musst die AttributeCollection durchlaufen und dann jedes darin enthaltene Attribut neu positionieren.
Hallo Holger, das ist es. Nach dem ich mir die Attributecollection angesehen habe hat es Click gemacht. Falls es mal jemand gebrauchen kann hier meine Lösung: Die Attributecollection enthält die ObjectIDs der einzelnen Attribute. Man muss sich das Object über die ObjectID holen und dann die Position jedes Attributes neu setzten. Wenn die Attribute einen Offset zu dem Referenzpunkt des Blockes haben muss der extra ermittelt und mit der Neupunktkoordinate verrechnet werden.
Code: Dim br As BlockReference = CType(tr.GetObject(oid, OpenMode.ForWrite), BlockReference) br.Position = newpoint For Each attoid As ObjectId In br.AttributeCollection If (attoid.IsValid) AndAlso (Not attoid.IsErased) Then Dim dbo As DBObject = attoid.GetObject(OpenMode.ForWrite) If (TypeOf dbo Is AttributeReference) Then Dim aref As AttributeReference = CType(dbo, AttributeReference) aref.Position = newpoint End If Next
Vielen Dank für eure schnelle Hilfe. Bernd 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. Apr. 2017 11:47 <-- editieren / zitieren --> Unities abgeben: Nur für bccad
Zitat: Original erstellt von bccad:
... Wenn die Attribute einen Offset zu dem Referenzpunkt des Blockes haben muss der extra ermittelt und mit der Neupunktkoordinate verrechnet werden. ...
Arbeite doch mit einer Transformationsmatrix, dann kannst du das Objekt, egal ob Block- oder Attributreference mit .TransformBy() verschieben, ohne die aktuelle Lage des Objekts zu kennen. 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 |
bccad Mitglied
Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 04. Apr. 2017 14:39 <-- editieren / zitieren --> Unities abgeben:
Zitat: Arbeite doch mit einer Transformationsmatrix, dann kannst du das Objekt, egal ob Block- oder Attributreference mit .TransformBy() verschieben, ohne die aktuelle Lage des Objekts zu kennen.
Ja, das sollte ich wirklich mal tun. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |