Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Blockref_Event , Attribute geändert stürzt ab

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:  Blockref_Event , Attribute geändert stürzt ab (1998 mal gelesen)
Christian Blei
Mitglied



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

Beiträge: 124
Registriert: 23.06.2008

Thinkpad T60p, 4GB
XP,Autocad 2010, ProStructures V8i 2, VBA, VB.NET,

erstellt am: 30. Sep. 2009 13: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

Hallo zusammen,

ich habe innerhalb der acad.dvb ein Eventhandling für eine Blockreferenz. Wenn der Event ausgelöst wird stürzt das macro ab, wenn die Attributref.textstring gesetzt werden sollen.
Nach der Autcadhilfe müsste ich die Attrefs als Application interfaceobkjects setzten. Aber wie?

Alfred, herzliche Grüsse! aus Norwegen

Option Explicit

Public WithEvents ACADApp As AcadApplication
Public WithEvents Annotation As AcadBlockReference


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On Acadstart


Sub ACADStartup()


Set ACADApp = GetObject(, "AutoCAD.Application.17")

'SysVar
ThisDrawing.SetVariable "DEMANDLOAD", 2
ThisDrawing.SetVariable "PICKSTYLE", 0
ThisDrawing.SetVariable "Savetime", 3
ThisDrawing.SetVariable "UCSICON", 3


End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On EndOpenDrawing


Private Sub ACADApp_EndOpen(ByVal FileName As String)

   
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'get Annoptation in SS
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim AnSelectionset As AcadSelectionSet
Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant

Err.Clear
On Error Resume Next
Set AnSelectionset = ThisDrawing.SelectionSets.Item("Annotation")
If Err.Number <> 0 Then
Set AnSelectionset = ThisDrawing.SelectionSets.Add("Annotation")
End If
AnSelectionset.Clear

FTyp(0) = 0: FVal(0) = "INSERT"
FTyp(1) = 2: FVal(1) = "stamp_2"
Filter1 = FTyp: Filter2 = FVal
AnSelectionset.Select acSelectionSetAll, , , Filter1, Filter2


If AnSelectionset.Count = 0 Then
Exit Sub
End If

Set Annotation = AnSelectionset.Item(0)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'get Annoptation in SS
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
   
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On BeginClose drawing

Private Sub AcadDocument_BeginDocClose(cancel As Boolean)

add_Stampdata1 cancel


End Sub

Private Sub Annotation_Modified(ByVal pObject As AutoCAD.IAcadObject)

    Dim cancel As Boolean
    add_Stampdata1 cancel
         
End Sub


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'StampData
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


Sub add_Stampdata1(ByRef cancel As Boolean)

Dim Part1 As String
Dim Part2 As String
Dim Part3 As String

Dim AcSelectionset As AcadSelectionSet
Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant

Dim ksSelection As New Ks_ComSelection
Dim ksMPSelection As New Ks_ComSelection
Dim Result As Long
Dim isMainPart As Boolean
Dim Entity As AcadEntity

Dim I As Long
Dim K As Long
Dim L As Long
Dim M As Long
Dim N As Long

Dim ksGroup As New Ks_ComObjectGroup
Dim ksGroupProperty As New Ks_ComGroupProperty
Dim GroupPosnumberArray() As Variant
Dim TxtGroupPosnumberArray() As Variant

Dim Blockref As AcadBlockReference
Dim Attref As AcadAttributeReference
Dim varAttributes As Variant
Dim Textobj As AcadText
Dim TextArray As Variant

Dim TxtSelectionset As AcadSelectionSet
Dim F2Typ(0) As Integer, F2Val(0) As Variant
Dim F2Filter1, F2Filter2 As Variant

Dim isGroupPosnumber As Boolean
Dim isTxtGroupPosnumber As Boolean
Dim Att1, Att2, Att3 As String

cancel = False


'set die stamp attributes
Set Blockref = AcSelectionset.Item(0)
varAttributes = Blockref.GetAttributes
For K = 0 To UBound(varAttributes)
Set Attref = varAttributes(K)
    If Attref.TagString = "TEST1" Then
   
   
'Jetzt kommt der Crash''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
   
    Attref.TextString = "New1"
   
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
   
    ElseIf Attref.TagString = "TEST2" Then
    Attref.TextString = "New2"
    ElseIf Attref.TagString = "TEST3" Then
    Attref.TextString = "New3"
    End If
Next K

ThisDrawing.Save

End Sub


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

Christian Blei
Mitglied



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

Beiträge: 124
Registriert: 23.06.2008

Thinkpad T60p, 4GB
XP,Autocad 2010, ProStructures V8i 2, VBA, VB.NET,

erstellt am: 30. Sep. 2009 13:45    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

Sorry, da habe ich gerade einige Problem in meinem Code gesehen. Ich versuche das zu fixen, vieleicht klappt es dann. Also vorerst mal nicht kommentieren, ich möchte eure Zeit nicht verschwenden.

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


Ex-Mitglied

erstellt am: 30. Sep. 2009 13:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

nur durch überfliegen hätte ich mal folgendes gesehen:

Fehlermöglichkeit 1
>> 'set die stamp attributes
>> Set Blockref = AcSelectionset.Item(0)

In der Proc  'add_Stampdata1'  verwendest Du das Item(0) des SelectionSets, aber SelectionSet.Select wurde hier nicht durchgeführt, also gibt es aller Wahrscheinlichkeit nach kein Item. Aber: es scheint ja bei Dir Attribute zu finden (da der AttTagString ja vorkommt), also nehme ich hier an, dass Du einen Teil des Codes 'verschwiegen hast' oder ich falsch gelesen habe.

Und wenn Du schon oben den Annotation-Block mit WithEvents referenziert hast, dann brauchst Du das gar nicht mehr, denn Du kannst direkt auf dieses Objekt hingreifen und dessen Attribute umbauen.

Fehlermöglichkeit 2
Du läufst in eine Rekursion hinein, die nicht endet. Du hast einen Event gesetzt, der die BlockReference überwacht auf Änderungen und in einem solchen Fall die Sub 'add_Stampdata1' aufruft. In dieser Sub änderst Du und wenn mich nicht alles täuscht, wird die Änderung eines Attributs auch den Event für BlockReference-Änderung starten, und damit löst Du den Event immer wieder aus und der Event schickt Dich immer wieder in die Änderung.
In diesem Fall wirst Du das im Debugging so bemerken, dass er mal eine zeit-lang mit voller Prozessorleistung (zumindest eines Prozessorkerns) arbeitet, bevor er abfliegt.

Aber mit lesen ist's halt so eine Sache, da kann ich schon auch was überlesen haben. Probier mal obiges und lass wissen. 

- alfred -

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

Christian Blei
Mitglied



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

Beiträge: 124
Registriert: 23.06.2008

Thinkpad T60p, 4GB
XP,Autocad 2010, ProStructures V8i 2, VBA, VB.NET,

erstellt am: 30. Sep. 2009 15: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

Alfred,

du hast völlig recht. Das Ganze ist Auszug aus mehr Code. Deswegen gibt es auch das Selectionset. Bei AcadDocument_BeginDocClose läuft der code ohne Event. Die BlockRef hole ich mir dann über ein SelectionSet. Was aber gar nicht nötig ist, da ich sie ja bereits in AcadApp_EndOpen zugewiesen habe.

Beim Auslösen des Events kommt es dann zum crash mit folgender Fehlermeldung:

Internal Error; !dbattr.cpp@903: eWasNotifying

dabei CPU Ausnutzung 10%.

Ist das jetzt ein Loop? Dann müsste ich zum Verlassen einen Zähler einbauen, oder?

Gruss
Christian

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


Ex-Mitglied

erstellt am: 30. Sep. 2009 15:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

>> Internal Error; !dbattr.cpp@903: eWasNotifying

...steht für 'ich habe gerade einen Event ausgelöst' und in diesem mich zu ändern, ist kritisch. Damit schützt sich AutoCAD offensichtlich selbst davor, dass es in Endlos-Rekursionen hineinläuft.

Da wird wohl notwendig sein, dass Du Dein Workflow überdenkst. Z.B. ist es notwendig, dass Du die BlockReference mit 'WithEvents' deklarierst oder anders herum, im Eventhandler deaktivierst Du das EventHandling, indem Du am Anfang Deines Sub's  'Set Annotation = Nothing'  einbaust und am Ende Deiner Proc wieder aktivierst (obwohl das auch kritisch sein kann, während des EventHandlings die Referenzierung zum auslösenden Objekt zu ändern).

HTH, - alfred -

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

Christian Blei
Mitglied



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

Beiträge: 124
Registriert: 23.06.2008

Thinkpad T60p, 4GB
XP,Autocad 2010, ProStructures V8i 2, VBA, VB.NET,

erstellt am: 30. Sep. 2009 20:07    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 Christian Blei 10 Unities + Antwort hilfreich

Alfred,

ich habe das Gerade probiert. set Annotation=nothing im Eventhandler. Dann ist zwar die Objektvariable nicht mehr ggesetzt, das Objekt selbst ab er immer noch vor dem Schreiben geschützt.Der Code stürzt wieder beim Schreiben des Attributreftextes ab, mit der gleichen Fehlermeldung.
Ich hoffe, ich habe auch richtig verstanden was du wolltest. Heisst das jetzt, dass der Eventhandler generell auf das den Event auslösende Objekt nur Lesezugriff hat?

Als Anhang nochmal der Code.

Gruss,
Christian

Option Explicit

Public WithEvents ACADApp As AcadApplication
Public ksGlobalSettings As New Ks_ComGlobalSettings
Public ksApplication As New Ks_ComApplication
Public WithEvents Annotation As AcadBlockReference

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On Acadstart


Sub ACADStartup()

Dim ksGlobalSettings As New Ks_ComGlobalSettings

MsgBox "Start AutoCad"
Set ACADApp = GetObject(, "AutoCAD.Application.17")
ThisDrawing.SetVariable "DEMANDLOAD", 2
ThisDrawing.SetVariable "PICKSTYLE", 0
ThisDrawing.SetVariable "Savetime", 3
ThisDrawing.SetVariable "UCSICON", 3

'set Pickhelper
ksGlobalSettings.PickHelperSize = 3
ksGlobalSettings.PickHelperStatus = True
ksGlobalSettings.PickHelperColor = 80


End Sub

Private Sub ACADApp_EndSave(ByVal FileName As String)

Dim AcSelectionset As AcadSelectionSet
Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant

Err.Clear
On Error Resume Next
Set AcSelectionset = ThisDrawing.SelectionSets.Item("Annotation")
If Err.Number <> 0 Then
Set AcSelectionset = ThisDrawing.SelectionSets.Add("Annotation")
End If
AcSelectionset.Clear

FTyp(0) = 0: FVal(0) = "INSERT"
FTyp(1) = 2: FVal(1) = "stamp_2"
Filter1 = FTyp: Filter2 = FVal
AcSelectionset.Select acSelectionSetAll, , , Filter1, Filter2


If AcSelectionset.Count = 0 Then
Exit Sub
End If

Set Annotation = AcSelectionset.Item(0)


End Sub

Private Sub Annotation_Modified(ByVal pObject As AutoCAD.IAcadObject)

    MsgBox "You just modified an object with an ID of: " & pObject.ObjectID
    Set Annotation = Nothing
    add_Stampdata1
   
   
   
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' On NewDrawing
Private Sub ACADApp_NewDrawing()

    Dim ksGlobalSettings As New Ks_ComGlobalSettings
   
    MsgBox "A request to start a new drawing was just intercepted!"
    ThisDrawing.SetVariable "PICKSTYLE", 0
 

'set Pickhelper
ksGlobalSettings.PickHelperSize = 3
ksGlobalSettings.PickHelperStatus = True
ksGlobalSettings.PickHelperColor = 80
       
   


End Sub


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On EndOpenDrawing


Private Sub ACADApp_EndOpen(ByVal FileName As String)


Dim AcSelectionset As AcadSelectionSet
Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant


MsgBox FileName + " was opened"
ThisDrawing.SetVariable "PICKSTYLE", 0
ThisDrawing.SetVariable "UCSICON", 3

'set Pickhelper
ksGlobalSettings.PickHelperSize = 3
ksGlobalSettings.PickHelperStatus = True
ksGlobalSettings.PickHelperColor = 80
   
   

Err.Clear
On Error Resume Next
Set AcSelectionset = ThisDrawing.SelectionSets.Item("Annotation")
If Err.Number <> 0 Then
Set AcSelectionset = ThisDrawing.SelectionSets.Add("Annotation")
End If
AcSelectionset.Clear

FTyp(0) = 0: FVal(0) = "INSERT"
FTyp(1) = 2: FVal(1) = "stamp_2"
Filter1 = FTyp: Filter2 = FVal
AcSelectionset.Select acSelectionSetAll, , , Filter1, Filter2


If AcSelectionset.Count = 0 Then
Exit Sub
End If

Set Annotation = AcSelectionset.Item(0)


   
End Sub


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On Activation


Private Sub AcadDocument_activate()

'MsgBox "Hello"
ThisDrawing.SetVariable "UCSICON", 3


End Sub

'Die Stamp annotation modified

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On BeginClose drawing


Private Sub AcadDocument_BeginDocClose(Cancel As Boolean)


'check ScaleData
add_Scaledata


'Hide Pickhelper
ksGlobalSettings.PickHelperSize = 3
ksGlobalSettings.PickHelperStatus = False
ksGlobalSettings.PickHelperColor = 80
ThisDrawing.Regen acActiveViewport
MsgBox "Say GoodBye"


End Sub


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'ScaleData
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub add_Scaledata()

Dim Entity As AcadEntity
Dim CompareEntity As AcadEntity

Dim Handle As String
Dim CompareHandle As String

Dim Check As Boolean

Dim I As Long
Dim K As Long
Dim L As Long
Dim M As Long
Dim N As Long
Dim ksSelection As New Ks_ComSelection
Dim ksPickSelection As New Ks_ComSelection
Dim Result As Long

Dim AcSelectionset As AcadSelectionSet
Dim Layer As AcadLayer
Dim Prompt As String
Dim kwordList As String
Dim strEnter As String
Dim Posnumber As String
Dim visibility As Boolean
Dim GroupWeight As Double

Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant
Dim Point As Variant

Dim Blockref As AcadBlockReference
Dim Blockrefs(0) As Variant
Dim ksPoint As New Ks_ComPoint

Dim StartPt As Variant
Dim EndPt As Variant
Dim InsertPt As Variant

Dim Attref As AcadAttributeReference
Dim varAttributes As Variant
Dim Tag As String
Dim Part1, Part2 As String
Dim Textobj As AcadText
Dim DwgScale As String
Dim Titlefield As String


Err.Clear
On Error Resume Next
Set AcSelectionset = ThisDrawing.SelectionSets.Item("Scale")
If Err.Number <> 0 Then
Set AcSelectionset = ThisDrawing.SelectionSets.Add("Scale")
End If
AcSelectionset.Clear
FTyp(0) = 0: FVal(0) = "INSERT"
FTyp(1) = 2: FVal(1) = "NOIKRS-TITFLD"
Filter1 = FTyp: Filter2 = FVal
AcSelectionset.Select acSelectionSetAll, , , Filter1, Filter2
If AcSelectionset.Count = 0 Then
End
End If
                             
                             
                              '
DwgScale = ""
Titlefield = ""
ksSelection.Initialize
ksPickSelection.Initialize


Result = ksSelection.SelectAllObjects

If Result = 0 Then
Exit Sub
End If

For I = ksSelection.ObjectCount - 1 To 0 Step -1
Set Entity = ksSelection.GetObject(I)
M = 0
N = 0
If Entity.Objectname = "AcDbBlockReference" Then
Set Blockref = Entity

    If Blockref.Name = "NOIKRS-TITFLD" Then
    N = 1
    get_Scale DwgScale, ksSelection
   
    If DwgScale = "" Then
    MsgBox "there was no scale in the text"
    Exit Sub
    End If
   
    varAttributes = Blockref.GetAttributes
   
    For K = 0 To UBound(varAttributes)
    Set Attref = varAttributes(K)
   
    If Attref.TagString = "SCALE" Then
    Attref.TextString = "1:" + CStr(DwgScale)
    M = 1
    Exit For
    End If
       
    Next K

    If M = 1 Then
    Exit For
    End If
   
    End If
End If

Next I

If Not DwgScale = "" Then
MsgBox "Scale set to 1:" + CStr(DwgScale)
End If

If N = 0 Then
MsgBox "there is no titlefield in the drawing"
End If

End Sub


Sub get_Scale(ByRef DwgScale As String, ByRef ksSelection As Ks_ComSelection)


Dim Entity As AcadEntity
Dim CompareEntity As AcadEntity

Dim Handle As String
Dim CompareHandle As String

Dim Check As Boolean

Dim I As Long
Dim K As Long
Dim L As Long
Dim M As Long
Dim N As Long

Dim ksPickSelection As New Ks_ComSelection
Dim Result As Long

Dim AcSelectionset As AcadSelectionSet
Dim Layer As AcadLayer
Dim Prompt As String
Dim kwordList As String
Dim strEnter As String
Dim Posnumber As String
Dim visibility As Boolean
Dim GroupWeight As Double

Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant
Dim Point As Variant

Dim Blockref As AcadBlockReference
Dim Blockrefs(0) As Variant
Dim ksPoint As New Ks_ComPoint

Dim StartPt As Variant
Dim EndPt As Variant
Dim InsertPt As Variant

Dim Attref As AcadAttributeReference
Dim varAttributes As Variant
Dim Tag As String
Dim Part1, Part2 As String
Dim Textobj As AcadText

Dim Titlefield As String

For I = 0 To ksSelection.ObjectCount - 1
Set Entity = ksSelection.GetObject(I)
DwgScale = ""
M = 0

If Entity.Objectname = "AcDbText" Then
Set Textobj = Entity
DwgScale = Textobj.TextString

    If Left$(DwgScale, 5) = "Group" Then
        If Right$(DwgScale, 1) = ")" Then
       
        For K = Len(DwgScale) - 6 To 1 Step -1
        If Mid$(DwgScale, K, 5) = "(Sc1:" Then
        DwgScale = Mid$(DwgScale, K + 5, Len(DwgScale) - 1 - K - 4)
        M = 1
            For L = 1 To Len(DwgScale)
            If 48 > Asc(Mid$(DwgScale, L, 1)) Or 57 < Asc(Mid$(DwgScale, L, 1)) Then
            M = 0
            Exit For
            End If
            Next L
        End If
        Next K
       
        If M = 0 Then
        DwgScale = ""
        End If
       
        Else
        DwgScale = ""
        End If
    Else
    DwgScale = ""
    End If

End If

If M = 1 Then
Exit For
End If

Next I

Debug.Print DwgScale + vbCrLf

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

If DwgScale = "" Then
MsgBox "pick text to read scale from"
Set Entity = ksPickSelection.PickObject("", Result)

If Result = 0 Then
Exit Sub
End If


    If Entity.Objectname = "AcDbText" Then
    Set Textobj = Entity
    DwgScale = Textobj.TextString
    N = 0
     
    For K = Len(DwgScale) - 6 To 1 Step -1
    If Mid$(DwgScale, K, 5) = "(Sc1:" Then
               
        For L = K + 5 To Len(DwgScale)
        If Mid$(DwgScale, L, 1) = ")" Then
               
        DwgScale = Mid$(DwgScale, K + 5, L - 1 - K - 4)
                N = 1
               
                For M = 1 To Len(DwgScale)
                If 48 > Asc(Mid$(DwgScale, M, 1)) Or 57 < Asc(Mid$(DwgScale, M, 1)) Then
                N = 0
                Exit For
                End If
                Next M
               
        End If
        Next L
   
    End If
    Next K
           
    If N = 0 Then
    DwgScale = ""
    End If
   
    End If

End If

End Sub


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'ScaleData
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub add_Stampdata1()


Dim Entity As AcadEntity
Dim LastEntity As AcadEntity
Dim CompareEntity As AcadEntity

Dim Handle As String
Dim CompareHandle As String
Dim StringArray As Variant
Dim Check As Boolean

Dim I As Long
Dim K As Long
Dim L As Long
Dim M As Long
Dim N As Long

Dim ksSelection As New Ks_ComSelection
Dim ksMPSelection As New Ks_ComSelection
Dim Result As Long

Dim ksGroup As New Ks_ComObjectGroup
Dim ksGroupProperty As New Ks_ComGroupProperty
Dim ksLastGroupProperty As New Ks_ComGroupProperty
Dim GroupPosnumberArray() As Variant

Dim Layer As AcadLayer
Dim Prompt As String
Dim kwordList As String
Dim strEnter As String
Dim Posnumber As String
Dim visibility As Boolean
Dim GroupWeight As Double

Dim AcSelectionset As AcadSelectionSet
Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant
Dim Point As Variant

Dim Blockref As AcadBlockReference
Dim Blockrefs(0) As Variant
Dim ksPoint As New Ks_ComPoint

Dim StartPt As Variant
Dim EndPt As Variant
Dim InsertPt As Variant

Dim Attref As AcadAttributeReference
Dim varAttributes As Variant
Dim Tag As String
Dim Part1 As String
Dim Part2 As String
Dim Part3 As String
Dim Textobj As AcadText
Dim DwgScale As String
Dim Titlefield As String
Dim ksGlobalSettings As New Ks_ComGlobalSettings


DwgScale = ""
Titlefield = ""
Part1 = ""
Part2 = ""
Part3 = ""
N = 0
Check = True

Set Annotation = Nothing

Err.Clear
On Error Resume Next
Set AcSelectionset = ThisDrawing.SelectionSets.Item("DieStamp")
If Err.Number <> 0 Then
Set AcSelectionset = ThisDrawing.SelectionSets.Add("DieStamp")
End If
AcSelectionset.Clear
FTyp(0) = 0: FVal(0) = "INSERT"
FTyp(1) = 2: FVal(1) = "stamp_2"
Filter1 = FTyp: Filter2 = FVal
AcSelectionset.Select acSelectionSetAll, , , Filter1, Filter2
If AcSelectionset.Count = 0 Then
MsgBox "There is no die stamp in the drawing"
End
End If


get_Stampparts ThisDrawing.Name, Part1, Part2, Part3


'get groups
ksMPSelection.Initialize
ksSelection.Initialize
ksSelection.SetSelectionFilter kFilterAllSteel
ksSelection.SelectAllObjects

For I = 0 To ksSelection.ObjectCount - 1
Set Entity = ksSelection.GetObject(I)
ksGroupProperty.ReadFrom Entity

If ksGroupProperty.Count > 0 Then
    If ksGroupProperty.IsMainPart = True Then
        ksMPSelection.AddObject Entity
        If ksMPSelection.ObjectCount = 1 Then
        ReDim Preserve GroupPosnumberArray(0)
        GroupPosnumberArray(0) = ksGroupProperty.Posnumber
        Else
        ReDim Preserve GroupPosnumberArray(UBound(GroupPosnumberArray) + 1)
        GroupPosnumberArray(UBound(GroupPosnumberArray)) = ksGroupProperty.Posnumber
        End If
    End If
End If
Next I

For I = 1 To UBound(GroupPosnumberArray)
If Not GroupPosnumberArray(I - 1) = GroupPosnumberArray(I) Then
Check = False
MsgBox "GroupPosnumbers are not unambiguous"
End
End If
Next I

If Not CLng(Trim(Part2)) = CLng(GroupPosnumberArray(0)) Then
MsgBox "Groupposnumber and Drawingname do not match"
End
End If

Set Blockref = AcSelectionset.Item(0)
varAttributes = Blockref.GetAttributes
For K = 0 To UBound(varAttributes)
Set Attref = varAttributes(K)
If Attref.TagString = "TEST1" Then
Attref.TextString = Part1 & "-"
ElseIf Attref.TagString = "TEST2" Then
If Not Part3 = "" Then
Attref.TextString = Part2 & "-"
Else
Attref.TextString = Part2
End If
End If
Next K
   

'ksGlobalSettings.PickHelperStatus = True

End Sub

Sub get_Stampparts(ByRef Drawingname As String, ByRef Part1 As String, ByRef Part2 As String, ByRef Part3 As String)                    'ByRef Drawingname


Dim StringArray As Variant
Dim K As Long

If Left$(Drawingname, 1) = "(" Then
K = InStr(Drawingname, ")")
Drawingname = Right(Drawingname, Len(Drawingname) - K)
End If

' remove .dwg
Drawingname = Left(Drawingname, Len(Drawingname) - 4)

'split name into parts
StringArray = Split(Drawingname, "-")

'Check parts and assign
StringArray(0) = Trim(StringArray(0))
Err.Clear
On Error Resume Next
If CLng(Right(StringArray(0), Len(StringArray(0)) - 1)) Then
  If Err.Number <> 0 Then
  MsgBox "drawingname is not valid"
  End
  End If
 
  StringArray(1) = Trim(StringArray(1))
  If Not StringArray(1) = "D1108" Then
  MsgBox "drawingname is not valid"
  End
  End If
 
  StringArray(2) = Trim(StringArray(2))
  Err.Clear
  On Error Resume Next
  If CLng(StringArray(2)) Then
    If Err.Number <> 0 Then
    MsgBox "drawingname is not valid"
    End
    End If
   
    If Not Right(StringArray(2), 1) = "0" Then
    Part1 = StringArray(0)
    Part2 = StringArray(2)
    Else
    MsgBox "drawingname is not valid"
    End
    End If
  End If

End If


Debug.Print Part1 + vbCrLf + Part2 + vbCrLf


End Sub

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


Ex-Mitglied

erstellt am: 30. Sep. 2009 22:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Christian,

zu viel Module enthalten als dass ich dieses reproduziermar machen kann

siehe PM!

- alfred -

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

Christian Blei
Mitglied



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

Beiträge: 124
Registriert: 23.06.2008

Thinkpad T60p, 4GB
XP,Autocad 2010, ProStructures V8i 2, VBA, VB.NET,

erstellt am: 01. Okt. 2009 08:15    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 Christian Blei 10 Unities + Antwort hilfreich


V3202-D1108-02804.zip

 
Alfred, Sorry.

Was ich machen will: Ich habe in einem DrawingTemplate einen LEADER: Sobald ich diesen Leader anfasse, wird ein Revent ausgelöst, der Teile des Zeichnungsnames in die Attributreftexte des Leaders schreibt: Das den Event auslösende Objekt soll soll selbst durch den Eventhandler verändert werden. Die Frage ist, wie geht das? geht es überhaupt? (ich habe rumprobiert. Solange das Eventhandling nicht abgeschlossen ist, scheint es auch nach dem Setzen von set Annotation =nothing nur Lesezugang zu diesem Objekt zu geben.)

Gruss, Christian


Beispielzeichnung ist mit geladen


Bereinigter Code:

Option Explicit

Public WithEvents ACADApp As AcadApplication
Public WithEvents Annotation As AcadBlockReference


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On Acadstart


Sub ACADStartup()


Set ACADApp = GetObject(, "AutoCAD.Application.17")

End Sub


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' On EndOpenDrawing


Private Sub ACADApp_EndOpen(ByVal FileName As String)


Dim AcSelectionset As AcadSelectionSet
Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant


Err.Clear
On Error Resume Next
Set AcSelectionset = ThisDrawing.SelectionSets.Item("Annotation")
If Err.Number <> 0 Then
Set AcSelectionset = ThisDrawing.SelectionSets.Add("Annotation")
End If
AcSelectionset.Clear

FTyp(0) = 0: FVal(0) = "INSERT"
FTyp(1) = 2: FVal(1) = "stamp_2"
Filter1 = FTyp: Filter2 = FVal
AcSelectionset.Select acSelectionSetAll, , , Filter1, Filter2

If AcSelectionset.Count = 0 Then
Exit Sub
End If

Set Annotation = AcSelectionset.Item(0)

 
End Sub

Private Sub Annotation_Modified(ByVal pObject As AutoCAD.IAcadObject)


    Set Annotation = Nothing
    'Annotation.Update

    'add_Stampdata1
   
   
   
End Sub


Sub add_Stampdata1()


Dim Entity As AcadEntity
Dim LastEntity As AcadEntity
Dim CompareEntity As AcadEntity

Dim Handle As String
Dim CompareHandle As String
Dim StringArray As Variant
Dim Check As Boolean

Dim I As Long
Dim K As Long
Dim L As Long
Dim M As Long
Dim N As Long

Dim ksSelection As New Ks_ComSelection
Dim ksMPSelection As New Ks_ComSelection
Dim Result As Long

Dim ksGroup As New Ks_ComObjectGroup
Dim ksGroupProperty As New Ks_ComGroupProperty
Dim ksLastGroupProperty As New Ks_ComGroupProperty
Dim GroupPosnumberArray() As Variant

Dim Layer As AcadLayer
Dim Prompt As String
Dim kwordList As String
Dim strEnter As String
Dim Posnumber As String
Dim visibility As Boolean
Dim GroupWeight As Double

Dim AcSelectionset As AcadSelectionSet
Dim FTyp(1) As Integer, FVal(1) As Variant
Dim Filter1, Filter2 As Variant
Dim Point As Variant

Dim Blockref As AcadBlockReference
Dim Blockref2 As AcadBlockReference
Dim Blockrefs(0) As Variant
Dim ksPoint As New Ks_ComPoint

Dim StartPt As Variant
Dim EndPt As Variant
Dim InsertPt As Variant

Dim Attref As AcadAttributeReference
Dim varAttributes As Variant
Dim Tag As String
Dim Part1 As String
Dim Part2 As String
Dim Part3 As String
Dim Textobj As AcadText
Dim DwgScale As String
Dim Titlefield As String
Dim ksGlobalSettings As New Ks_ComGlobalSettings


DwgScale = ""
Titlefield = ""
Part1 = ""
Part2 = ""
Part3 = ""
N = 0
Check = True

Set Annotation = Nothing

Err.Clear
On Error Resume Next
Set AcSelectionset = ThisDrawing.SelectionSets.Item("DieStamp")
If Err.Number <> 0 Then
Set AcSelectionset = ThisDrawing.SelectionSets.Add("DieStamp")
End If
AcSelectionset.Clear
FTyp(0) = 0: FVal(0) = "INSERT"
FTyp(1) = 2: FVal(1) = "stamp_2"
Filter1 = FTyp: Filter2 = FVal
AcSelectionset.Select acSelectionSetAll, , , Filter1, Filter2
If AcSelectionset.Count = 0 Then
MsgBox "There is no die stamp in the drawing"
Exit Sub
End If


get_Stampparts ThisDrawing.Name, Part1, Part2, Part3


Set Blockref = AcSelectionset.Item(0)
varAttributes = Blockref.GetAttributes
For K = 0 To UBound(varAttributes)
Set Attref = varAttributes(K)
If Attref.TagString = "TEST1" Then


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Crash when trying to write to attref.textstring

Attref.TextString = Part1 & "-"

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


ElseIf Attref.TagString = "TEST2" Then
If Not Part3 = "" Then
Attref.TextString = Part2 & "-"
Else
Attref.TextString = Part2
End If
End If
Next K


End Sub

Sub get_Stampparts(ByRef Drawingname As String, ByRef Part1 As String, ByRef Part2 As String, ByRef Part3 As String)                    'ByRef Drawingname


Dim StringArray As Variant
Dim K As Long

If Left$(Drawingname, 1) = "(" Then
K = InStr(Drawingname, ")")
Drawingname = Right(Drawingname, Len(Drawingname) - K)
End If

' remove .dwg
Drawingname = Left(Drawingname, Len(Drawingname) - 4)

'split name into parts
StringArray = Split(Drawingname, "-")

'Check parts and assign
StringArray(0) = Trim(StringArray(0))
Err.Clear
On Error Resume Next
If CLng(Right(StringArray(0), Len(StringArray(0)) - 1)) Then
  If Err.Number <> 0 Then
  MsgBox "drawingname is not valid"
  End
  End If
 
  StringArray(1) = Trim(StringArray(1))
  If Not StringArray(1) = "D1108" Then
  MsgBox "drawingname is not valid"
  End
  End If
 
  StringArray(2) = Trim(StringArray(2))
  Err.Clear
  On Error Resume Next
  If CLng(StringArray(2)) Then
    If Err.Number <> 0 Then
    MsgBox "drawingname is not valid"
    End
    End If
   
    If Not Right(StringArray(2), 1) = "0" Then
    Part1 = StringArray(0)
    Part2 = StringArray(2)
    Else
    MsgBox "drawingname is not valid"
    End
    End If
  End If

End If


Debug.Print Part1 + vbCrLf + Part2 + vbCrLf


End Sub

 

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


Ex-Mitglied

erstellt am: 01. Okt. 2009 11:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Christian,

meine Vermutung am Anfang war wohl richtig, während das Objekt sich im Zustand des 'modifizierens' befindet, ist mit Modifikation in dessen EventHandler nix (siehe endlose Rekursion).

Dieses hätte ich mal als Ausweichmaßnahme, hier wird, wenn der Block modifiziert wird, ein EventHandler auf das AcadDocument.EndCommand gesetzt, damit ist die Modifikation des Blocks abgeschlossen und Du darfst die Attribute wieder ändern.

Lass mich wissen, wenn's nicht klar ist oder weitere Fragen bestehen. In diesem Fall musst Du einmal händisch das Init aufrufen und den Block selektieren. Dein Code war mir zu viel um es einfach durchzusteppen, aber jedenfalls gut, dass Du diesen so modifiziert hast, der Fehler hätte ja auch woi anders liegen können.

Code:
Private WithEvents pBlRef As AcadBlockReference
Private WithEvents pAcadDoc As AcadDocument

Public Sub init()
   'dient nur zur händischen Initialisierung
   Dim tPnt As Variant
   Dim tEnt As AcadEntity
   Call ThisDrawing.Utility.GetEntity(tEnt, tPnt)
   If (Not (tEnt Is Nothing)) Then
      If TypeOf tEnt Is AcadBlockReference Then
         Set pBlRef = tEnt
      End If
   End If
End Sub

Private Sub AcadDocument_EndCommand(ByVal CommandName As String)
   Set pAcadDoc = Nothing    'damit werden keine weiteren events mehr ausgeloest
  If (Not (pBlRef Is Nothing)) Then
      Dim tTempBlRef as AcadBlockReference
      Set tTempBlRef = pBlRef
      Set pBlRef = nothing    'damit wird nicht gleich wieder mit Events losgeschossen
      Dim tAtts As Variant
      tAtts = tTempBlRef .GetAttributes
      tAtts(0).TextString = Now()
      Set pBlRef = tTempBlRef  'und wieder für Events zugreifbar machen
   End If
End Sub

Private Sub pBlRef_Modified(ByVal pObject As IAcadObject)
   Set pAcadDoc = ThisDrawing 'damit wird ein Eventhandling gesetzt, dmit es nach der Bearbeitung des Blocks losgeht
End Sub


- alfred -

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

[Diese Nachricht wurde von a.n. am 01. Okt. 2009 editiert.]

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