| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Fortlaufende Numerierung von Blöcken klappt nicht immer. (956 mal gelesen)
|
ReinhardK Mitglied

 Beiträge: 12 Registriert: 12.04.2021
|
erstellt am: 12. Apr. 2021 15:30 <-- editieren / zitieren --> Unities abgeben:         
Hallo, Ich habe mir vor ca. 20 Jahren ein Messgerät gebaut und lese die Daten vom Gerät über die serielle Schnittstelle in Autocad 2002 ein. Im Gerät habe ich 9 Messplätze forgesehen und die kann ich einzeln abrufen. Im Normalfall werden die Aufmaße in Blöcken mit aufsteigender Numerierung gespeichert und das klappt fast immer. Leider eben nur fast. Manchmal habe ich dann einem Block mit der Nummer 1 und der nächste hat die Nummer 4 und ähnlich. Letzten habe ich das Pech gehabt, das einzelne Aufmaße zu einem Block zusammengefasst wurden, ein einziges Desaster! Mir ist das bisher nicht aufgefallen, weil ich eigentlich immer nur 1- 3 Meßßplätze brauche, da waren es wesentlich mehr. Das sind die Zeilen aus dem Programm, wo ich überprüfe, wieviele Blöcke sich in der Zeichnung befinden und wo die nächsthöhere freie Zahl vergeben wird: Dim MessBlock As AcadBlock, EinfP_Block(0 To 2) As Double, BlockAnz As Long BlockAnz = ThisDrawing.Blocks.Count EinfP_Block(0) = 0#: EinfP_Block(1) = 0#: EinfP_Block(2) = 0# Set MessBlock = ThisDrawing.Blocks.Add(EinfP_Block, LTrim(Str(BlockAnz + 1))) Prinzipiell funktioniert es, aber warum nicht immer? Kann da jemand das Problem erkennen, oder hat jemand einen Vorschlag, wie man das besser lösen kann? Vielen Dank! Gruß Reinhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin

 Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 13. Apr. 2021 11:07 <-- editieren / zitieren --> Unities abgeben:          Nur für ReinhardK
Hallo Reinhard, Willkommen im Forum Erstaunlich dass Dir das erst nach 20 Jahren auffällt Bitte lese Dir mal die FAQ: Blöcke und FAQ: Blöcke: Objekteigenschaften und deren Auswirkungen in Blöcken durch, vielleicht wird Dir dann einiges klarer. Ein Block mit der Nummer 1 kann eigentlich gar nicht erzeugt werden, das würde bedeuten Du hättest alle Layouts und den Modellbereich aus der Zeichnung gelöscht. Hast Du denn eine Fehlerabfrageroutine integriert? Vermutlich nein bzw. Du übergehst Fehlermeldungen mit einem "On Error Resume Next" Dadurch kann es natürlich passieren dass ein nötiger neuer Block nicht erzeugt wird und der bestehende verändert wird. Aber dazu bräuchten wir den kompletten Code. Grüße Klaus [Edit]Interessant wäre auch noch wie Du die Blöcke in die Zeichnung einfügst. Evtl. wäre es ja eine Möglichkeit nur einen neuen Block zu erzeugen und die Messwerte durch unterschiedliche BlockReferenzen in die Zeichnung einzutragen. [Diese Nachricht wurde von KlaK am 13. Apr. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ReinhardK Mitglied

 Beiträge: 12 Registriert: 12.04.2021
|
erstellt am: 13. Apr. 2021 21:48 <-- editieren / zitieren --> Unities abgeben:         
Hallo KlaK, vielen Dank für die nette Begrüßung!
Zitat: Erstaunlich dass Dir das erst nach 20 Jahren auffällt
In dieser Richtung gab es eigentlich nie ein Problem und ich Nutze das Gerät ständig. Zitat: Bitte lese Dir mal die FAQ : Blöcke und FAQ : Blöcke: Objekteigenschaften und deren Auswirkungen in Blöcken durch, vielleicht wird Dir dann einiges klarer.
Guter Tip, ich muß da nur wieder reinkommen, habe ewig nichts mit VBA gemacht. Zitat: Hast Du denn eine Fehlerabfrageroutine integriert? Vermutlich nein bzw. Du übergehst Fehlermeldungen mit einem "On Error Resume Next" Dadurch kann es natürlich passieren dass ein nötiger neuer Block nicht erzeugt wird und der bestehende verändert wird. Aber dazu bräuchten wir den kompletten Code.
Ich muß mich da wieder einarbeiten, das Programm wollte ich eigentlich anfügen, ist aber irgendwie verlorengegangen, kommt gleich nach. Ich habe mal zwei Screenshots gemacht, da worden die Blöcke wirklich von 1 ab numeriert. Das ist aber die Ausname, sonst beginnt es immer bei 4 und wenn ich mir die Anzahl der voerhandenen Blöcke anzeigen lasse, dann sind es immer 3, die ich aber nicht sehe. Ich würde es jetzt so machen, das ich prüfe, ob zB. Block 4 voehanden ist und wenn ja, die 5 prüfen usw. also die nächst freie Zahl vergebe. Wie der Block heißt, ist mir ansonsten völlig egal. Ich melde mich gleich noch mal und reiche das Programm nach. Vielen Dank für deine Antwort! Wie fügt man hier Dateien an, hochgeladen habe ich die Bilder? Schade, wenn das mit den Dateien anfügen ein Intelligenztest ist, dann bin ich leider gescheitert. Im File Manager kann ich sie lediglich löschen. Gruß Reinhard [Diese Nachricht wurde von ReinhardK am 13. Apr. 2021 editiert.] [Diese Nachricht wurde von ReinhardK am 13. Apr. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ReinhardK Mitglied

 Beiträge: 12 Registriert: 12.04.2021
|
erstellt am: 14. Apr. 2021 09:09 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich hab wirklich keine Möglichkeit die Dateien anzufügen, das Hochladen klappt. Unter Linux und mit Chromium erscheint danach ein leeres Fenster, unter Firefox bekomme ich eine Bestätigung. Die Dateien sind hochgeladen, ich könnte sie löschen aber eine Möglichkeit zum Anfügen sehe ich nicht. Gruß Reinhard Edit:
Unter Firefox klappt es doch, jetzt sind sie da!
[Diese Nachricht wurde von ReinhardK am 14. Apr. 2021 editiert.] 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: 14. Apr. 2021 09:24 <-- editieren / zitieren --> Unities abgeben:          Nur für ReinhardK
Deine Screenshots sind nutzlos, hoffentlich ist es auch nicht die Antwort. Die könnten einfach zeigen: In einer Datei gibt es Block 1-9 in der anderen Variante gibt es mind. Block 1-14 Mehr zeigt es nicht, kein Hinweis auf "fehlende" Blöcke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ReinhardK Mitglied

 Beiträge: 12 Registriert: 12.04.2021
|
erstellt am: 14. Apr. 2021 09:35 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von cadffm: Deine Screenshots sind nutzlos, hoffentlich ist es auch nicht die Antwort. Die könnten einfach zeigen: In einer Datei gibt es Block 1-9 in der anderen Variante gibt es mind. Block 1-14Mehr zeigt es nicht, kein Hinweis auf "fehlende" Blöcke
Hallo cadffm, ich wollte damit nur zeigen, das wirklich ein Block mit der Nummer 1 erstellt wird, siehe Antwort von KlaK. Zwischendurch fehlen da auch immer ein paar Nummern, das kommt da wirklich nicht zum Ausdruck. Gruß Reinhard [Diese Nachricht wurde von ReinhardK am 14. Apr. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin

 Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 14. Apr. 2021 12:37 <-- editieren / zitieren --> Unities abgeben:          Nur für ReinhardK
Hallo Reinhard, Beinhalten denn die Blöcke mit dem Nummern 1, 2 oder 3 auch Deine Messwerte (Punkt mit Linie)? Das Modul Zeichnen ist ja nur ein Teil eines größeren Programmes, ich würde da wirklich genauer nachsehen und den Fehlerabfang nachverfolgen (oder ausschalten), hatte da schon die merkwürdigsten Ergebnisse wenn das nicht gepasst hat. Ich habe inzwischen meine Standardroutine:
Code:
Sub neu() ' DimensionierungenOn Error GoTo Err_Handler ' Programmcode Exit Sub ' beendet den Programmteil Err_Handler: MsgBox "Fehler: " & Err.Number & vbCrLf & Err.Description Stop Resume Next
End Sub
Natürlich ist ein "On Error Resume Next" manchmal sinnvoll, dann muß aber der mögliche Fehler direkt behandelt werden und anschließend wieder auf den allgemeinen Err_Handler zurückgestellt. Noch ein kleiner Hinweis (kann aber auch gewollt sein): Du hast zweimal die gleiche Abfrage ( If s_Zugkraft > 99000000 Then ) somit wird das Layerflag = "S_Punkte" immer überschrieben
Korr_Biegebalken und Raumpunkt sind vermutlich andere Programmmodule Ansonsten fällt mir hier nichts auf warum Blöcke mit Nummer 1 erzeugt werden könnten (außer sie waren schon in der Zeichnung) Zitat: Letzten habe ich das Pech gehabt, das einzelne Aufmaße zu einem Block zusammengefasst wurden, ein einziges Desaster! Mir ist das bisher nicht aufgefallen, weil ich eigentlich immer nur 1- 3 Meßplätze brauche, da waren es wesentlich mehr.
Die Meßplätze werden ja woanders geöffnet (DateiNr scheint global zu sein), evtl. ist dort ein Fehler? Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ReinhardK Mitglied

 Beiträge: 12 Registriert: 12.04.2021
|
erstellt am: 14. Apr. 2021 22:02 <-- editieren / zitieren --> Unities abgeben:         
Hallo KlaK Zitat: Original erstellt von KlaK: [B]Hallo Reinhard,Beinhalten denn die Blöcke mit dem Nummern 1, 2 oder 3 auch Deine Messwerte (Punkt mit Linie)?
Nein, die sind leer, bei allen anderen Zeichnungen geht es auch immer erst bei 4 los. Zitat: Das Modul Zeichnen ist ja nur ein Teil eines größeren Programmes, ich würde da wirklich genauer nachsehen und den Fehlerabfang nachverfolgen (oder ausschalten), hatte da schon die merkwürdigsten Ergebnisse wenn das nicht gepasst hat. Ich habe inzwischen meine Standardroutine:
Guter Tip, ich sitze gerade dran und versuche wieder reinzukommen.
Zitat: Noch ein kleiner Hinweis (kann aber auch gewollt sein): Du hast zweimal die gleiche Abfrage ( If s_Zugkraft > 99000000 Then ) somit wird das Layerflag = "S_Punkte" immer überschrieben
Das ist so gewollt. Ich benutze die Variable "Zugkraft" zusätzlich zur farblichen Kennzeichnung der Punkte. Auf der Senderseite wird da entweder nichts, oder 100000000 oder 200000000 aufaddiert. Das habe ich erst Jahre später dazu programmiert, wollte aber nicht zuviel ändern. Zitat: Korr_Biegebalken und Raumpunkt sind vermutlich andere Programmmodule
Genau. Zitat: Ansonsten fällt mir hier nichts auf warum Blöcke mit Nummer 1 erzeugt werden könnten (außer sie waren schon in der Zeichnung) Zitat:Letzten habe ich das Pech gehabt, das einzelne Aufmaße zu einem Block zusammengefasst wurden, ein einziges Desaster! Mir ist das bisher nicht aufgefallen, weil ich eigentlich immer nur 1- 3 Meßplätze brauche, da waren es wesentlich mehr. Die Meßplätze werden ja woanders geöffnet (DateiNr scheint global zu sein), evtl. ist dort ein Fehler?
Die Blöcke 1-3 habe ich wirklich nur in einer Datei entdeckt, wer weiß, was das war. Wie ich geschrieben hatte, ich versuche es jetzt so:
Zitat: Ich würde es jetzt so machen, das ich prüfe, ob zB. Block 4 voehanden ist und wenn ja, die 5 prüfen usw. also die nächst freie Zahl vergebe. Wie der Block heißt, ist mir ansonsten völlig egal. Ich melde mich gleich noch mal und reiche das Programm nach.
Gruß Reinhard
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin

 Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 15. Apr. 2021 10:24 <-- editieren / zitieren --> Unities abgeben:          Nur für ReinhardK
Zitat: Original erstellt von ReinhardK: Hallo KlaK Zitat:Ansonsten fällt mir hier nichts auf warum Blöcke mit Nummer 1 erzeugt werden könnten (außer sie waren schon in der Zeichnung) Zitat:Letzten habe ich das Pech gehabt, das einzelne Aufmaße zu einem Block zusammengefasst wurden, ein einziges Desaster! Mir ist das bisher nicht aufgefallen, weil ich eigentlich immer nur 1- 3 Meßplätze brauche, da waren es wesentlich mehr. Die Meßplätze werden ja woanders geöffnet (DateiNr scheint global zu sein), evtl. ist dort ein Fehler? Die Blöcke 1-3 habe ich wirklich nur in einer Datei entdeckt, wer weiß, was das war. Wie ich geschrieben hatte, ich versuche es jetzt so: Zitat:Ich würde es jetzt so machen, das ich prüfe, ob zB. Block 4 voehanden ist und wenn ja, die 5 prüfen usw. also die nächst freie Zahl vergebe. Wie der Block heißt, ist mir ansonsten völlig egal. Ich melde mich gleich noch mal und reiche das Programm nach. Gruß Reinhard
Diese Vorgehensweise hat natürlich auch ihre Tücken, Du hattest ja schon geschrieben dass Blöcke 1-5 vorhanden waren, dann eine Lücke und dann wieder Blöcke 10-15. Wenn so etwas vermieden werden soll, könnte man sich einen Blocknamen erzeugen der Datum, Uhrzeit und Nummer der Messung enthält, das dürfte dann auf alle Fälle eindeutig sein oder eine Funktion die den neuen Namen prüft. Beispiel für Datum:
Code: MB_Name = "M-" & Format(Date, "YYYYMMDD") & Format(Time, "hhmm")
Wenn Du diesen Namen noch um die Nummer der Messung erweiterst (irgendwo öffnest Du ja die neue Schnittstelle => DateiNr) ist dieser doch eindeutig. Grüße Klaus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ReinhardK Mitglied

 Beiträge: 12 Registriert: 12.04.2021
|
erstellt am: 15. Apr. 2021 13:26 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von KlaK:
Diese Vorgehensweise hat natürlich auch ihre Tücken, Du hattest ja schon geschrieben dass Blöcke 1-5 vorhanden waren, dann eine Lücke und dann wieder Blöcke 10-15. Wenn so etwas vermieden werden soll, könnte man sich einen Blocknamen erzeugen der Datum, Uhrzeit und Nummer der Messung enthält, das dürfte dann auf alle Fälle eindeutig sein oder eine Funktion die den neuen Namen prüft.
Hallo Klak, das hatte ich ja weter oben geschrieben, ich möchte prüfen, ob die Zahl vorhanden ist wenn ja die Zahl erhöhen, bis was frei ist.
Zitat:
Ich würde es jetzt so machen, das ich prüfe, ob zB. Block 4 voehanden ist und wenn ja, die 5 prüfen usw. also die nächst freie Zahl vergebe.
Funktioniert leider nicht so, wie ich möchte. Blocknummer = 5 Blockname_vergeben = False On Error Resume Next While Blockname_vergeben = False Set tBlDef = ThisDrawing.Blocks.Item(LTrim(Str(Blocknummer))) If (tBlDef Is Nothing) Then MsgBox "Block nicht vorhanden" EinfP_Block(0) = 0#: EinfP_Block(1) = 0#: EinfP_Block(2) = 0# Set MessBlock = ThisDrawing.Blocks.Add(EinfP_Block, LTrim(Str(Blocknummer))) Blockname_vergeben = True Else MsgBox "Bin schon da!" Blocknummer = Blocknummer + 1 End If Wend Beim ersten Durchlauf verhält sich das Programm wie erwartet, tBlDef ist Nothing und der Block wird erzeugt. Beim zweiten Durchlauf erkennt das Programm das der Block existiert und nach Else wird die Blocknummer erhöht. Trotzdem nimmt das Programm an, das der Block existiert und erhöht pausenlos die Blocknummer. Also tBlDef wird nicht mehr Nothing, obwohl nur ein Block mit der Nummer 5 existiert. Kurze Frage zum Forum: Kann man in einem Thema für einen User nur einmal Unities abgeben? Gruß Reinhard
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin

 Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 15. Apr. 2021 14:43 <-- editieren / zitieren --> Unities abgeben:          Nur für ReinhardK
Hallo Reinhard, Ja die Tücken der Programmierung Warum ist das so? Ich habe Dir ja schon geschrieben benutze eine Fehlerabfangroutine, z.B. so: Set tBlDef = ThisDrawing.Blocks.Item(LTrim(Str(Blocknummer))) If Err Then Debug.Print Err.Number, Err.Description Stop Resume Next End If Dann bekommst Du den Hinweis : -2145386476 Schlüssel nicht gefunden Logisch, denn es gibt ja den Item("6") nicht. Beim ersten Mal klappt das, tBlDef war nothing, beim zweiten Mal klappt das nicht mehr denn Du hast tBlDef bereits item("5") zugewiesen. Jetzt hast Du zwei Möglichkeiten: - Du ergänzt Deinen Code: Else Blocknummer = Blocknummer + 1 Set tBlDef = Nothing End If - Oder Du baust alles um:
Code:
Sub main()Dim EinfP_Block(0 To 2) As Double Dim Messblock As AcadBlock Blocknummer = 5 ' Blockname_vergeben = False ' On Error Resume Next While Blocktest(Trim(Str(Blocknummer))) = False Blocknummer = Blocknummer + 1 Wend EinfP_Block(0) = 0#: EinfP_Block(1) = 0#: EinfP_Block(2) = 0# Set Messblock = ThisDrawing.Blocks.Add(EinfP_Block, LTrim(Str(Blocknummer))) End Sub Function Blocktest(Nr As String) As Boolean
Dim bFrei As Boolean ' Dim block As AcadBlock bFrei = True For Each block In ThisDrawing.Blocks If block.Name = Nr Then bFrei = False Exit For End If Next block Blocktest = bFrei End Function
Variante 1 mit der (gewollten) Fehlererzeugung ist natürlich wegen der deutlich geringeren Schleifendurchläufe schneller. Dennoch würde ich nach der Zuweisung die Fehlerbehandlung wieder abschalten ( On Error goto 0 ) oder eben eine allg. Behandlung wie oben beschrieben einführen.
Zitat: Kurze Frage zum Forum: Kann man in einem Thema für einen User nur einmal Unities abgeben?
Nein, man kann auch mehr, allerdings jede Punktzahl nur einmal, also max. 55  Grüße Klaus
[Diese Nachricht wurde von KlaK am 15. Apr. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ReinhardK Mitglied

 Beiträge: 12 Registriert: 12.04.2021
|
erstellt am: 15. Apr. 2021 19:15 <-- editieren / zitieren --> Unities abgeben:         
Hallo Klaus, ganz herzlichen Dank, jetzt funktioniert alles! Zitat:
Beim ersten Mal klappt das, tBlDef war nothing, beim zweiten Mal klappt das nicht mehr denn Du hast tBlDef bereits item("5") zugewiesen. Jetzt hast Du zwei Möglichkeiten:- Du ergänzt Deinen Code: Else Blocknummer = Blocknummer + 1 Set tBlDef = Nothing End If
Hat sofort geklappt. Zitat: Dennoch würde ich nach der Zuweisung die Fehlerbehandlung wieder abschalten ( On Error goto 0 ) oder eben eine allg. Behandlung wie oben beschrieben einführen.
Hab ich gemacht. Mit der Fehlerbehandlung und allgemein mit VBA werde ich mich am Wochenende beschäftigen. Ich dachte das brauch ich nicht mehr, aber wie man sieht... Jetzt muß ich das Gerät erst mal wieder einsatzfähig machen, denn da gibt es noch ein anderes Problem. Auf jeden Fall wird das Problem mit den verhunzten Blöcken nicht mehr auftreten. Viele Grüße Reinhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |