Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Block mit Attributen laden

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:  Block mit Attributen laden (2874 mal gelesen)
Peter Schriebl
Mitglied
selbstständig


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

Beiträge: 13
Registriert: 16.10.2010

Windows XP
Autocad 2009
Visual Studio 2010 Express

erstellt am: 16. Okt. 2010 11:10    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 Forum,

Als Neuling bei vb.net habe ich folgendes Problem:
Bei Fehlen eines bestimmten Blockes wird in einem Sub-Unterprogramm ein neuer Block mit einem Attribut mit TAG="Kat" und Textstring="REK" erstellt. Das funktioniert soweit auch so.
Der Block kann inkl.Attribut "händisch" problemlos geladen werden.
Wenn ich den Block jedoch mittels vb-Code lade, funktioniert das zwar auch, jedoch ist dann kein Attribut mehr dabei !!

Hier die aufrufende Prozedur:
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput

Module Mod2_ReKanal
    Dim Winkel As Single
    Dim nSchuß As Short, RestL As Short
    Dim GesamtL As Integer
    Dim Blockname As String
    Dim Punkt2 As New Point3d
Sub Kanal(ByVal Punkt1, ByVal a, ByVal b, ByVal SL)
Dim Winkel As Single
    Dim nSchuß As Short, RestL As Short
    Dim GesamtL As Integer
    Dim Blockname As String
    Dim Punkt2 As New Point3d
    Sub Kanal(ByVal Punkt1, ByVal a, ByVal b, ByVal SL)
        Dim PunktCol2d As New Point2dCollection
    'Sub für Punktdefinition:
        Call ZweitPunkteingabe("2.Punkt", Punkt1, Punkt2)
        '1.Trans.:Hilfslinie für Block zeichnen und auswerten:
        Using acTrans As Transaction = ThisDrawingDB.TransactionManager.StartTransaction()
            acBT = acTrans.GetObject(ThisDrawingDB.BlockTableId, OpenMode.ForRead) '...BT der akt.Zng. zum Lesen öffnen.
            acBTR = acTrans.GetObject(acBT(BlockTableRecord.ModelSpace), OpenMode.ForWrite) '...BTR der akt.Zng.zum Schreiben öffnen.
            Dim HLinie As Line = New Line(Punkt1, Punkt2)
            HLinie.SetDatabaseDefaults()
            HLinie.LineWeight = LineWeight.ByLayer
            acBTR.AppendEntity(HLinie) '... die neue Linie an Blocktabellen-Record anhängen.
            Winkel = HLinie.Angle
            GesamtL = HLinie.Length
            nSchuß = Int(GesamtL / SL)
            RestL = GesamtL - nSchuß * SL
            HLinie.Erase()
            acTrans.AddNewlyCreatedDBObject(HLinie, True)
            acTrans.Commit()
        End Using
        Blockname = "Kanal" & Füllfarbe & "_" & a

        'wenn Block nicht in BT dann neu generieren:
        If Not acBT.Has(Blockname) Then
            PunktCol2d.Add(New Point2d(0, -a / 2))
            PunktCol2d.Add(New Point2d(1, -a / 2))
            PunktCol2d.Add(New Point2d(1, a / 2))
            PunktCol2d.Add(New Point2d(0, a / 2))
            Call Blockgenerator(PunktCol2d, Blockname)
        End If
        '2.Trans.:generierte Blockdef. als Blockreferenz einfügen:
        Using acTrans As Transaction = ThisDrawingDB.TransactionManager.StartTransaction()
            acBT = acTrans.GetObject(ThisDrawingDB.BlockTableId, OpenMode.ForRead) '...BT der akt.Zng. zum Lesen öffnen.
            acBTR = acTrans.GetObject(acBT(BlockTableRecord.ModelSpace), OpenMode.ForWrite) '...BTR der akt.Zng.zum Schreiben öffnen.
            Dim BlockRef As New BlockReference(Punkt1, acBT(Blockname))
            BlockRef.SetDatabaseDefaults()
            BlockRef.Rotation = Winkel
            BlockRef.ScaleFactors = New Scale3d(SL, 1, 1)
            'Attributreferenzen editieren:
            Dim AttCol As AttributeCollection = BlockRef.AttributeCollection
            Dim AttRef_Kat As AttributeReference
            AttRef_Kat = AttCol(0).GetObject(OpenMode.ForWrite)
            AttRef_Kat.TextString = "Mamaburli"
            acBTR.AppendEntity(BlockRef)
            acTrans.AddNewlyCreatedDBObject(BlockRef, True)
            acTrans.Commit()
        End Using
    End Sub

Zur Vervollständigung noch der "Blockgenerator":

Public Sub Blockgenerator(ByVal PunktCol2d, ByVal Blockname)
        Using acTrans As Transaction = ThisDrawingDB.TransactionManager.StartTransaction()
            Dim TextstyleID As ObjectId = ThisDrawingDB.Textstyle
            Dim Block As BlockTableRecord
            Dim BlockID As ObjectId
            Dim Punkt As Point2d
            Dim Index As Integer = 0
            acBT = acTrans.GetObject(ThisDrawingDB.BlockTableId, OpenMode.ForWrite)
            Block = New BlockTableRecord '...neuen BTR (=Block) generieren.
            Block.Name = Blockname
            BlockID = acBT.Add(Block) '...neuen Block zum BT hinzufügen.
            acTrans.AddNewlyCreatedDBObject(Block, True)
            'zuerst Blockelement Schraff erzeugen (damit Schraff unten liegt):
            Dim Schraff As Hatch = New Hatch
            Block.AppendEntity(Schraff)
            acTrans.AddNewlyCreatedDBObject(Schraff, True)
            Schraff.SetDatabaseDefaults()
            Schraff.SetHatchPattern(HatchPatternType.PreDefined, "solid")
            Schraff.ColorIndex = Füllfarbe
            'dann erst Blockelement LPoly erzeugen:
            Dim LPoly As Polyline = New Polyline
            LPoly.SetDatabaseDefaults()
            For Each Punkt In PunktCol2d
                LPoly.AddVertexAt(Index, Punkt, 0, 0, 0)
                Index = Index + 1
            Next
            LPoly.Closed = True
            Block.AppendEntity(LPoly)
            acTrans.AddNewlyCreatedDBObject(LPoly, True)
            'Umgrenzung von Schraff definieren:
            Dim ObjIdColl As ObjectIdCollection = New ObjectIdCollection
            ObjIdColl.Add(LPoly.ObjectId)
            Schraff.AppendLoop(HatchLoopTypes.Outermost, ObjIdColl) '...Umgrenzung von Schraff
            Schraff.EvaluateHatch(True)
            'Attribute definieren:
            Dim Att_Kat As AttributeDefinition = New AttributeDefinition(New Point3d(0, 0, 0), "REK", "Kat", "Kategorie", TextstyleID)
            Block.AppendEntity(Att_Kat)
            acTrans.AddNewlyCreatedDBObject(Att_Kat, True) : MsgBox(Att_Kat.TextString)
            acTrans.Commit()
        End Using
    End Sub

Was läuft da nur schief !?

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

CAD-Huebner
Ehrenmitglied V.I.P. h.c.
Verm.- Ing., ATC-Trainer



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

Beiträge: 9732
Registriert: 01.12.2003

AutoCAD 20xx, Civil 3D 201x, Inventor Prof 201x usw.

erstellt am: 16. Okt. 2010 11:54    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 Peter Schriebl 10 Unities + Antwort hilfreich

Ok, ohne jetzt den Quellcode zu verbessern hier die Erklärung für das Problem.

Blockreferenzen und Auttribute sind eigenständige Objekte und müssen separat angelegt werden.
Unterschiedliche Blockreferenzen derselben Blockdefinition können unterschiedliche (oder wie in deimem Fall keine) Attribute besitzen.
Selbst wenn die Block-Definition Attributsdefinitionen besitzt, werden aus diesen nicht automatisch Attribute erzeugt, wenn man eine Blockreferenz erzeugt. Das mach nur der _INSERT Befehl automatisch.

Die Vorgehensweise ist wie folgt:
Blockeinfügung mit Blockreferenzen unter VB.net

1. Erzeuge ein Blockrefrenz-Objekt
2. Füge diese dieses Blockreferenz-Objekt zu einem block table record (model space, paper space, oder anderer block) hinzu.
3. iteriere durch die referenzierte Blockdefinition und suche nach Attributdefinitionen (AttributeDefinition). Für jedes gefundene Attribut erzeuge dann ein neues Blockreferenz-Objekt, fülle es mit Attributdefinitionsdaten und hänge es dann an deine Blockreferenz (mit BlockReference.AttributeCollection.AppendAttribute(...)() Funktion).

Quick & Dirty könnte man es als Zweizeiler mit Sendcommand lösen
str = "_insert ..... "
app.ActiveDocument.SendCommand(str)

Ansonsten findest du hier auch eine passende Diskussion und Beispiele für deine Aufgabenstellung. http://ww3.cad.de/foren/ubb/Forum352/HTML/000314.shtml

------------------
Mit freundlichem Gruß

Udo Hübner
www.CAD-Huebner.de

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

Peter Schriebl
Mitglied
selbstständig


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

Beiträge: 13
Registriert: 16.10.2010

Windows XP
Autocad 2009
Visual Studio 2010 Express

erstellt am: 16. Okt. 2010 16: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

Herzlichen Dank für die schnelle Hilfe !

Das ist ja reichlich trickig. Ja, ja das gute alte VBA !

Aber:
Wie bekommt man am besten Zugriff auf ein ganz bestimmtes Attribut
das man ändern möchte ? Möglicherweise über die Item-Eigenschaft der
AttributCollection ?

Grüße Peter

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


Ex-Mitglied

erstellt am: 16. Okt. 2010 16:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

>> Wie bekommt man am besten Zugriff auf ein ganz bestimmtes Attribut

Die ObjectIDs der AttributeCollection scannen, mehr hilft da im Normalfall nicht.
Bist Du sicher, dass nicht durch andere Applikationen oder Tools die Reihenfolge der Attribute modifiziert wurde, dann kannst Du bei Massenänderungen Dir den Index des Attributs je Blockdefinition merken, dann kannst Du über .Item(index) hingreifen, aber das ist halt nicht sichergestellt (dass die Attributsreihenfolge immer gleich ist).

- alfred -

------------------
www.hollaus.at

Peter Schriebl
Mitglied
selbstständig


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

Beiträge: 13
Registriert: 16.10.2010

Windows XP
Autocad 2009
Visual Studio 2010 Express

erstellt am: 17. Okt. 2010 19:56    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 für den Tipp!
Ich bau die Attribut-Zugriffsabfrage gleich in die AppendAttribute Schleife ein
und frage die gewünschten TAG-Eigenschaften ab.

Grüße Peter

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