Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Block einfügen mit Attributen

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 einfügen mit Attributen (1482 mal gelesen)
Dirk.B
Mitglied
Tischler / Leiter Arbeitsvorbereitung


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

Beiträge: 534
Registriert: 25.11.2003

AutoCAD 2019/2020
CAD+T 2020
HP ZBook 15 G4, 64-bit,
WIN 10 Pro

erstellt am: 20. Dez. 2012 09:31    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


Attribute_00.jpg


Attribute_01.jpg

 
Hallo zusammen!

Bin dabei mich mit Blöcken und deren Attribute auseinanderzusetzen.
Einen Blockerzeugen dem ich Attribute zuordne funktioniert.
(Dieses ist nur ein Test - Code.)
Den Block kann ich auch über .Net einfügen, nur werden dann die Attribute nicht übernommen bzw. angezeigt.
Füge ich den Block über den Befehl "einfügen" (Dialogbox) ein, so
werden die Attribute angezeigt.

Was muß ich da wie ändern, damit dieses auch über .Net funktioniert.

Code:

Public Class Class1

    <CommandMethod("AddEmptyBlockDefinition")>
    Public Sub AddEmptyBlockDefinition()
        Dim myDB As Database = HostApplicationServices.WorkingDatabase
        Using mytrans As Transaction = myDB.TransactionManager.StartTransaction
            Dim myBlockTable As BlockTable = myDB.BlockTableId.GetObject(OpenMode.ForWrite)
            '--Abfrage ob der Blockbereits vorhanden ist??
            If myBlockTable.Has("CircleBlock") = True Then
                MsgBox("Bitte den Block CircleBlock löschen", MsgBoxStyle.Information)
                Exit Sub
            End If
            Dim myNewBlock As New BlockTableRecord
            myNewBlock.Name = "CircleBlock"
            'BlockName = "CircleBlock"
            Dim myCircle As New Circle(Point3d.Origin, Vector3d.ZAxis, 5)
            myNewBlock.AppendEntity(myCircle)
            myBlockTable.Add(myNewBlock)
            mytrans.AddNewlyCreatedDBObject(myNewBlock, True)

            Dim STK_STUECK, STK_FLAENGE, STK_FBREITE, STK_FDICKE, STK_BEST_TEXT, MATGRUPPE_ID, STK_END_TERMIN, STK_ADR_ID, STK_PD_NUM As New AttributeDefinition
            Dim myAttRef As New AttributeReference

            With STK_STUECK
                .Prompt = "Stückzahl eingeben:"
                .Tag = "STK_STUECK"
                .TextString = "1"
                .Position = New Point3d(0, -5, 0)
                .Justify = AttachmentPoint.BaseLeft
                .Height = 2.5
                .ColorIndex = 1
                '.Preset = True

            End With
            myNewBlock.AppendEntity(STK_STUECK)
            mytrans.AddNewlyCreatedDBObject(STK_STUECK, True)

            With STK_FLAENGE
                .Prompt = "Länge eingeben:"
                .Tag = "STK_FLAENGE"
                .TextString = "1000"
                .Position = New Point3d(0, -10, 0)
                .Justify = AttachmentPoint.BaseLeft
                .Height = 2.5
                .ColorIndex = 1
                '.Preset = True

            End With
            myNewBlock.AppendEntity(STK_FLAENGE)
            mytrans.AddNewlyCreatedDBObject(STK_FLAENGE, True)


            mytrans.Commit()
        End Using
    End Sub

    Public Function AddEntity(ByVal DatabaseIn As Database, ByVal EntityToAdd As Entity, ByVal BlockName As String) As ObjectId
        Using myTrans As Transaction = DatabaseIn.TransactionManager.StartTransaction
            Dim myBlockTable As BlockTable = DatabaseIn.BlockTableId.GetObject(OpenMode.ForWrite)
            Dim myBlockTableRecord As BlockTableRecord = Nothing
            If myBlockTable.Has(BlockName) = True Then
                myBlockTableRecord = myBlockTable(BlockName).GetObject(OpenMode.ForWrite)
            Else
                myBlockTableRecord = New BlockTableRecord
                myBlockTableRecord.Name = BlockName
                myBlockTable.Add(myBlockTableRecord)
                myTrans.AddNewlyCreatedDBObject(myBlockTableRecord, True)
            End If
            myBlockTableRecord.AppendEntity(EntityToAdd)
            myTrans.AddNewlyCreatedDBObject(EntityToAdd, True)
            myTrans.Commit()
            Return EntityToAdd.Id
        End Using

    End Function

    <CommandMethod("InsertBlock")>
    Public Sub InsertBlock()
        Dim acDoc As Document = DocumentManager.MdiActiveDocument
        Dim ed As Editor = acDoc.Editor
        Dim myDB As Database = HostApplicationServices.WorkingDatabase

        Using mytrans As Transaction = myDB.TransactionManager.StartTransaction
            Dim myBlockTable As BlockTable = myDB.BlockTableId.GetObject(OpenMode.ForRead)

            Dim PPResu As PromptPointResult
            Dim instPkt As New Point3d
            Dim PPOpt As PromptPointOptions = New PromptPointOptions("")

            PPOpt.Message = vbLf & "Einfügepunkt festlegen: "
            PPResu = ed.GetPoint(PPOpt)
            instPkt = PPResu.Value

            Dim myBlockRef As New BlockReference(instPkt, myBlockTable("CircleBlock"))
            AddEntity(myDB, myBlockRef, BlockTableRecord.ModelSpace)
            mytrans.Commit()
        End Using
    End Sub

    Public Function InsertBlock(ByVal DatabaseIn As Database, _
                                ByVal BTRToAddTo As String, _
                                ByVal InsPt As Point3d, _
                                ByVal BlockName As String, _
                                ByVal XScale As Double, _
                                ByVal YScale As Double, _
                                ByVal ZScale As Double) As ObjectId
        Using myTrans As Transaction = DatabaseIn.TransactionManager.StartTransaction
            Dim myBlockTable As BlockTable = DatabaseIn.BlockTableId.GetObject(OpenMode.ForRead)
            If myBlockTable.Has(BlockName) = False Then
                Return Nothing
            End If

            If myBlockTable.Has(BTRToAddTo) = False Then
                Return Nothing
            End If

            Dim myBlockDef As BlockTableRecord = myBlockTable(BlockName).GetObject(OpenMode.ForRead)

            Dim myBlockTableRecord As BlockTableRecord = myBlockTable(BTRToAddTo).GetObject(OpenMode.ForWrite)

            Dim myBlockRef As New BlockReference(InsPt, myBlockDef.Id)

            myBlockRef.ScaleFactors = New Scale3d(XScale, YScale, ZScale)

            myBlockTableRecord.AppendEntity(myBlockRef)

            myTrans.AddNewlyCreatedDBObject(myBlockRef, True)

            Dim myAttColl As AttributeCollection = myBlockRef.AttributeCollection

            For Each myEntID As ObjectId In myBlockDef
                Dim myEnt As Entity = myEntID.GetObject(OpenMode.ForRead)
                If TypeOf myEnt Is AttributeDefinition Then
                    Dim myAttDef As AttributeDefinition = myEnt
                    Dim myAttRef As New AttributeReference
                    myAttRef.SetAttributeFromBlock(myAttDef, myBlockRef.BlockTransform)
                    myAttColl.AppendAttribute(myAttRef)
                    myTrans.AddNewlyCreatedDBObject(myAttDef, True)
                End If
            Next
            myTrans.Commit()
            Return myBlockRef.Id
        End Using

    End Function


End Class


Es wäre schön, wenn mir da jemand weiterhelfen könnte und evtl.
ein Beispiel dazu hätte.


------------------
Gruß

Dirk

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: 01. Jan. 2013 20:26    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 Dirk.B 10 Unities + Antwort hilfreich

Hi Dirk,

der Code stammt aus einem Projekt von mir in dem Blöcke eingefügt
und die Attribute augefüllt werden.
Man muss die Attribute der Blockdefinition lesen und der Blockreferenz
anhängen. Sonst bleibt die Referenz ohne Attribute.
Ich habe alles unwesentliche aus dem Code rausgeschmissen. Müsste also gut erkennbar
sein wie es funktioniert.
Ich hoffe das hilft dir erst mal weiter.

Mfg Bernd

Code:

Private Sub Insert_Block()
  Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  Dim db As Database = doc.Database

  Dim name As String = "Punkt"

  Using tr As Transaction = db.TransactionManager.StartTransaction()
  Try
    Dim btr As BlockTableRecord = CType(tr.GetObject(doc.Database.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
    Dim bt As BlockTable = CType(doc.Database.BlockTableId.GetObject(OpenMode.ForRead), BlockTable)
    Dim blockDef As BlockTableRecord = CType(tr.GetObject(bt(name), OpenMode.ForRead), BlockTableRecord)
    Dim pos As New Point3d(0, 0, 0)
    Dim br As BlockReference = New BlockReference(pos, bt(name))
    btr.AppendEntity(br)
    br.ScaleFactors = New Scale3d(1, 1, 1)
    tr.AddNewlyCreatedDBObject(br, True)
    For Each oid As ObjectId In blockDef
        Dim dbo As DBObject = oid.GetObject(OpenMode.ForRead)
        If (TypeOf dbo Is AttributeDefinition) Then
          Dim adef As AttributeDefinition = CType(dbo, AttributeDefinition)
          Dim aref As AttributeReference = New AttributeReference
          aref.SetAttributeFromBlock(adef, br.BlockTransform)
          Select Case UCase(aref.Tag)
            Case "PUNKTNUMMER"
              aref.TextString = "Beispielnummer"
            Case "CODIERUNG"
              aref.TextString = "Beispielcodierung"
          End Select
          br.AttributeCollection.AppendAttribute(aref)
          tr.AddNewlyCreatedDBObject(aref, True)
        End If
    Next
    tr.Commit()
  Catch
    MsgBox("Fehler im Modul Punkte")
  End Try
  End Using
End Sub


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

Dirk.B
Mitglied
Tischler / Leiter Arbeitsvorbereitung


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

Beiträge: 534
Registriert: 25.11.2003

AutoCAD 2019/2020
CAD+T 2020
HP ZBook 15 G4, 64-bit,
WIN 10 Pro

erstellt am: 02. Jan. 2013 21:34    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


Wert_01.jpg

 
Hallo Bernd!
Hallo Forum!

Danke für die Info.

Ich habe nun so gelöst.
Der Block mit den Attributen ist ja bereits in der Zeichnung vorhanden. Beim einfügen des Blocks in den Modelbereich wurden die Attribute jedoch nicht mit übernommen.
Dieses habe ich beim googlen gefunden und es funktioniert prima.

Code:

'--Attribute übernehmen--!!
For Each AttID As ObjectId In acBlkDef
Dim ent As Entity = DirectCast(actrans.GetObject(AttID, OpenMode.ForWrite), Entity)
If TypeOf ent Is AttributeDefinition Then
Dim AttDef As AttributeDefinition = DirectCast(ent, AttributeDefinition)
Dim AttRef As New AttributeReference()
AttRef.SetAttributeFromBlock(AttDef, acBlkRef.BlockTransform)
Dim id As ObjectId = acBlkRef.AttributeCollection.AppendAttribute(AttRef)
actrans.AddNewlyCreatedDBObject(AttRef, True)
End If
Next

Nun ein neues Problem.
Wie kann ich die einzelnen Attributeswerte z. B. Wert1 (STK_STUECK) an eine TextBox in einer UserForm übergeben?

Code:

Dim AttVal As List(Of String)
Dim myAttColl As AttributeCollection = myBRef.AttributeCollection
For i As Integer = 1 To myAttColl.Count
If i <= AttVal.Count Then
Dim myAttRef As AttributeReference = myAttColl(i - 1).GetObject(OpenMode.ForWrite)
myAttRef.TextString = AttVal(i - 1)
End If
Next
MsgBox("Anzahl der Attribute =  " & myAttColl.Count)

Es wäre super,wenn mir da mal wieder jemand auf die Sprünge helfen könnte.

------------------
Gruß

Dirk

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: 03. Jan. 2013 08:04    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 Dirk.B 10 Unities + Antwort hilfreich

Hi,

na einfach eine Textbox auf deinem UserForm definieren
und dann mit der Methode .text die Box ausfüllen

Bernd

Code:

Dim AttVal As List(Of String)
Dim myAttColl As AttributeCollection = myBRef.AttributeCollection
For i As Integer = 1 To myAttColl.Count
    If i <= AttVal.Count Then
      Dim myAttRef As AttributeReference = myAttColl(i - 1).GetObject(OpenMode.ForWrite)
      myAttRef.TextString = AttVal(i - 1)
     
     
     
      Textbox1.Text = AttVal(i - 1)
             
     
     
    End If
Next
MsgBox("Anzahl der Attribute =  " & myAttColl.Count)



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