Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Dynamische Blöcke

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:  Dynamische Blöcke (1740 mal gelesen)
Boehri
Mitglied



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

Beiträge: 80
Registriert: 07.04.2008

erstellt am: 29. Mrz. 2011 08: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

Hallo zusammen,

dynamische Blöcke werden ja in der Zeichnung mit einem "Dummy"-Namen ( zB: *U5) gespeichert, obwohl in den Eigenschaften der richtige Name steht.
Das ist doch so, oder?
Wenn ich nun per Code den Orginal-Block zum kopieren auswähle kriegt er ja immer diesen Dummy-Namen mit. Ich habe schon versucht diese Dummy-Namen auszufiltern aber dann filtere ich auch die Orginale weg, weil sie ja auch diese Dummy-Namen haben. Gibt es eine Möglichkeit an die Orginal-Namen ranzukommen?

Code:
Dim acBlkTbl As BlockTable
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
                Dim nCnt As Integer = 0
                'For Each acobjectID As ObjectId In acBlkTbl
                Dim acBlkTblRec As BlockTableRecord = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
                                      OpenMode.ForRead)

                Dim acBref As BlockReference

                'Filterkriterien für Blockreferenzen setzen
                Dim acTypValAr(1) As TypedValue
                acTypValAr.SetValue(New TypedValue(DxfCode.Start, "INSERT"), 0) ' Blockfreferenzen
                acTypValAr.SetValue(New TypedValue(DxfCode.ExtendedDataRegAppName, "AJO"), 1) 'Extented Datas die zuvor beim Einfügen erzeugt wurden

                'Filterkriterien dem Filter zuweisen
                Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
                Dim acSSPrompt As PromptSelectionResult

                'Alle Objekte der Zeichnung gemäß Filterkriterien wählen
                acSSPrompt = acDoc.Editor.SelectAll(acSelFtr)
                blockSS = acSSPrompt.Value

                'Einfügepunkt der Legende
                Dim pntInsert As Point3d = pPtRes.Value '

                'Alle Blöcke durchlaufen
                Dim acssObj As SelectedObject
                If Not IsDBNull(blockSS) And Not blockSS Is Nothing Then
                    For Each acssObj In blockSS
                        '' Open the selected object for read
                        Dim acEnt As Entity = acTrans.GetObject(acssObj.ObjectId, _
                                                                OpenMode.ForRead)
                        acBref = acEnt

                        'kopierte Blöcke ignorieren
                        If Not acBref.Name Like "*U*" Then '------------Hier versuche ich den Filter zu setzen


                            'Falls dynamischer Block, Extended Data zuweisen
                            If acBref.IsDynamicBlock Then

                                Dim pc As DynamicBlockReferencePropertyCollection = acBref.DynamicBlockReferencePropertyCollection
                                Dim prop As DynamicBlockReferenceProperty
                                Dim rb As ResultBuffer = acEnt.XData

                                'Blockname zuweisen
                                strBlockname = rb(1).Value()

                                'Sichbarkeitstatus zuweisen
                                blnBlocktext = True
                                For Each prop In pc
                                    If prop.PropertyName Like "Sichtbarkeit*" Then
                                        strSichtbarkeitsstatus = prop.Value
                                        strBlockText = strSichtbarkeitsstatus
                                        blnBlocktext = False
                                    End If
                                Next
                                If blnBlocktext = True Then
                                    strBlockText = strBlockname
                                    strSichtbarkeitsstatus = Nothing
                                End If

                            Else
                                'Falls kein dynamischer Block
                                strBlockname = acBref.Name
                                strBlockText = acBref.Name
                            End If

                            Dim vRot As Vector3d = pntInsert.GetVectorTo(New Point3d(pntInsert.X + 5, pntInsert.Y, 0))

                            'Abfrage ob die Blockrefernz schon in der Legende vorhanden
                            If Not arrDublikat.Contains(strBlockname & "-" & strSichtbarkeitsstatus) Then

                                'Sub aufrufen und Block einfügen
                                hzInsertBlockMSWithAttributes(New Point3d(pntInsert.X, pntInsert.Y - (y_offset * m_nCnt), 0), strBlockname, My.Settings.Blockskalierung, "LEG-ARMA", Nothing, "", 3, WiB(0), vRot, strSichtbarkeitsstatus)

                                'Text für Block positionieren
                                AddtextwithLayer(acDoc, acCurDb, New Point3d(pntInsert.X, pntInsert.Y - (y_offset * m_nCnt), 0), strBlockText, 25, 5)
                                strDublikat = strBlockname & "-" & strSichtbarkeitsstatus
                                arrDublikat.Add(strDublikat)
                                m_nCnt = m_nCnt + 1
                            End If

                        End If
                    Next
                End If


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


Ex-Mitglied

erstellt am: 29. Mrz. 2011 08:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

die unnamed Blöcke entstehen eigentlich nicht beim Kopieren, selbst wenn Du nur eine Blockreferenz einfügst und diese z.B. durch Sichtbarkeitsparameter oder durch Parametergriffe modifizierst, dann ist auch schon diese einzige Blockreferenz ein unnamed-Block(ref).

Also gibt es keine 'originale Blockreferenz'.

Damit zu den Methoden, mit denen Du prüfen kannst:

  BlRef.IsDynamicBlock

Gibt Dir von einer Blockreferenz zurück, ob es überhaupt ein dynamischer Block ist.


Und ist sie das, dann hast Du über

  BlRef.DynamicBlockTableRecord

Zugriff auf die 'originale' Blockdefinition und damit auf den 'originalen Blocknamen'

HTH, - alfred -

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

oscarr
Mitglied
CAD-Manager


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

Beiträge: 198
Registriert: 02.10.2007

ACA 2012 - English Win 7/x64

erstellt am: 29. Mrz. 2011 09:46    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 Boehri 10 Unities + Antwort hilfreich

Hallo,

wenn Du nur den "richtigen" Namen benötigst musst Du die Blockrefernce reseten. Dann hat trägt die Blockreference wieder den richtigen Namen.

Code:

    Shared Function GetRealName(ByVal blockref As BlockReference) As String
        Dim myTransMan As DatabaseServices.TransactionManager = Application.DocumentManager.MdiActiveDocument.TransactionManager
        Dim myTrans As Transaction = myTransMan.StartTransaction
        blockref.UpgradeOpen()
        blockref.ResetBlock()
        Dim Blockname As String = String.Empty
        Blockname = blockref.Name
        myTrans.Dispose()
        myTransMan.Dispose()
        Return Blockname
    End Function

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

Boehri
Mitglied



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

Beiträge: 80
Registriert: 07.04.2008

erstellt am: 29. Mrz. 2011 11:01    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 euch beiden,

der Tipp mit

Code:
    blockref.ResetBlock()


hat mir die Lösung gebracht.

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


Ex-Mitglied

erstellt am: 29. Mrz. 2011 11:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

nur zur Vorsicht (keine Kritik!) 

>> wenn Du nur den "richtigen" Namen benötigst
>> blockref.ResetBlock

Ändert Deine Geometrie. Wenn es wirklich nur darum geht, den Namen zu bekommen, ist obiges (ohne Geometriemodifikation) imho erträglicher, vor allem bei großen Datenmengen.

- alfred -

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

Boehri
Mitglied



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

Beiträge: 80
Registriert: 07.04.2008

erstellt am: 29. Mrz. 2011 11:29    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 Alfred,

ich habe von oscarr nur die beiden Zeilen

Code:
bref.UpgradeOpen()
bref.ResetBlock()

in meinen Code eingefügt
Code:
Dim pPtRes As PromptPointResult
                            Dim pPtOpts As PromptPointOptions = New PromptPointOptions("")
                            pPtOpts.Message = vbLf & "Einfügepunkt wählen: "
                            pPtRes = acDoc.Editor.GetPoint(pPtOpts)
                            Dim ptInsert As Point3d = pPtRes.Value

                            '' Exit if the user presses ESC or cancels the command
                            If pPtRes.Status = PromptStatus.Cancel Then Exit Sub

                            bref.UpgradeOpen()
                            bref.ResetBlock()

                            Dim acBrefClone As BlockReference = bref.Clone
                            Dim acvecDist As Vector3d = bref.Position.GetVectorTo(ptInsert)

                            acBrefClone.TransformBy(Matrix3d.Displacement(acvecDist))

                            '+++++++++++++Block ausrichten
                            Dim pntAnfang As Point3d
                            Dim pntEnde As Point3d
                            'Wenn Linie
                            If Line IsNot Nothing Then
                                pntAnfang = Line.StartPoint
                                pntEnde = Line.EndPoint
                            End If

                            'Wenn Polyline
                            If PLine IsNot Nothing Then
                                For i As Long = 0 To PLine.NumberOfVertices - 2 ' 2 bei nicht geschlossenen Polylinien
                                    If (PLine.GetLineSegmentAt(i).IsOn(ptInsert)) Then
                                        pntAnfang = PLine.GetLineSegmentAt(i).StartPoint
                                        pntEnde = PLine.GetLineSegmentAt(i).EndPoint
                                    End If
                                Next
                            End If

                            'Winkel ausrechnen
                            Dim winkel As Double = pntAnfang.GetVectorTo(pntEnde).AngleOnPlane(New Plane)

                            'Objekt drehen
                            Dim curUCSMatrix As Matrix3d = acDoc.Editor.CurrentUserCoordinateSystem
                            Dim curUCS As CoordinateSystem3d = curUCSMatrix.CoordinateSystem3d

                            Dim winkelorig As Double = bref.Rotation
                            winkel = winkel - winkelorig
                            acBrefClone.TransformBy(Matrix3d.Rotation(winkel, curUCS.Zaxis, ptInsert))

                            '+++++++++++++Block ausrichten


Sorry ich bin noch ein Newbie, aber mache ich hiermit was kaputt?

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


Ex-Mitglied

erstellt am: 29. Mrz. 2011 11:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

wenn Dein 'bref' zuvor durch Aktionsgriffe oder Ansichtssteuerung verstellt war, dann ist dieser nach Deinem Codedurchlauf zurückgestellt.

- alfred -

PS: .UpgradeOpen ist mit Vorsicht zu genießen, arbeite besser mit TransActions (um das Objekt zur Modifikation zu öffnen), da kannst Du mit TrAct.Commit explizit bestimmen, was los ist.

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

oscarr
Mitglied
CAD-Manager


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

Beiträge: 198
Registriert: 02.10.2007

ACA 2012 - English Win 7/x64

erstellt am: 29. Mrz. 2011 13:30    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 Boehri 10 Unities + Antwort hilfreich

Deshalb habe ich es ja in eine separates Sub einschliesslich eigener Transaction gepackt und eben kein myTrans.Commit damit mir der Block nicht kaputt geht.

Das: blockref.ResetBlock() funktioniert aber nur mit dem vorherigen: blockref.UpgradeOpen()

Oder gibt es einen anderen Weg?

LG
Holger
       

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


Ex-Mitglied

erstellt am: 29. Mrz. 2011 13:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

ob das .ResetBlock nur mit .UpgradeOpen funkt, konnte ich jetzt nicht probieren (sorry!).

Nur allgemein zum .UpgradeOpen: Du magst recht haben, wenn Du nur mit einer TransAction arbeitest.

IMHO nimmt sich .UpgradeOpen die TopTransAction bzw. öffnet eine solche bei Bedarf.

Du gibst ja in der Funktion dem Objekt 'blockref' nicht mit, in welchem TransAction-Set es zu behalten ist, und .UpgradeOpen sucht auch nicht, ob Du jetzt gerade eine dritte oder vierte TransAction in der Sub/Func deklariert hast. Dann ist bei verschachtelten TransActions Schluss mit lustig.

Oder verhält sich das bei Dir anders und ich bin nur unwissend, weil ich mich vor .UpgradeOpen einfach nur hüte? 

- alfred -

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

Boehri
Mitglied



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

Beiträge: 80
Registriert: 07.04.2008

erstellt am: 29. Mrz. 2011 14: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

Hallo,

nur zur Info!
Bei meinem obigen Code funktioniert das ResetBlock() auch ohne UpgradeOpen.

Gruß Boehri

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


Ex-Mitglied

erstellt am: 29. Mrz. 2011 15:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

>> Bei meinem obigen Code funktioniert das ResetBlock() auch ohne UpgradeOpen

Dann ist Deine Blockreferenz bereits 'zum Schreiben geöffnet'. Nur das konnte von uns niemand sehen. 

- alfred -

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

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