| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Objektzuweisung über Handle funzt nicht (2603 mal gelesen)
|
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 15. Dez. 2004 15:49 <-- editieren / zitieren --> Unities abgeben:
Habe mal wieder ein Problem mit Acad14 und VBA. Ich möchte mit dem Befehl Set Obj = ThisDrawing.HandleToObject("7e67") ein Objekt zuweisen, welches auch tatsächlich (hier "7e67") in meiner Zeichnung vorhanden ist, zuweisen. Doch leider wird nur Nothing zurück gegeben. Die Variable Obj ist als Object definiert, so, wie es in der Hilfe zum Befehl HandleToObject beschrieben ist. Der Sysntax lautet: RetVal = Objekt.HandleToObject(Referenz) wobei Referenz ein String sein muß. Im BeispielCode zu diesem Befehl ist aber Referenz ein Integer-Wert, was mich ein wenig stutzig macht. Einem Integer kann doch kein Hexadezimalwert zugewiesen werden. Ich stelle mir vor, das ich mit HandleToObject einer Variable vom Typ Object das Objekt mit diesem Handle zuweisen kann. Wieso gibt dann mein Code Nothing zurück? Liegt das wieder an meiner alten AutoCad-Version, oder habe ich einen Fehler im Code, den ich übersehe? Hat jemand einen Tip, was daran nicht richtig ist? Gruß Tomi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 15. Dez. 2004 16:28 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 15. Dez. 2004 16:31 <-- editieren / zitieren --> Unities abgeben:
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 15. Dez. 2004 16:33 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 16. Dez. 2004 02:01 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 16. Dez. 2004 10:46 <-- editieren / zitieren --> Unities abgeben:
@fuchsi Habe deinen Vorschlag ausprobiert. Wie ich erwartet habe hat das nicht funktioniert. Er knallt mir den Fehler 'Ungültige Referenz' entgegen. VBA will den Handle als String übergeben haben. Als Integer geht das nicht. @mapcar Was meinst du damit? Das ich mit gewalt versuche, ein Sting an einer Stelle einzusetzten, wo keiner hingehört? Mein Problem mit dem Verständnis ruht wohl eher daher, das ich mich an Vorgaben halte, die mir VBA zwingend vorschreibt. HandleToObject möchte einen String als Referenz haben, um ein Object zurück geben zu können. Daran kann nichts unverständliches sein. Wenn du mir jetzt sagen willst, das läge am Zahlenformat, dann frage ich mich, wieso die Beschreibung dieser Methode nicht richtig ist. Und wenn sie nicht richtig ist, was ist dann richtig? Gruß Tomi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 16. Dez. 2004 22:03 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
Tomi, es geht überhaupt nicht darum, dass die Handles keine Strings sein sollten - das sind sie mit Sicherheit! Mir ging es darum, dass man keine Literale verwenden sollte. In Lisp ist vieles geschützter, da werden z.B. Entity-Namen in der Form <Objektname: 7ef72070> zurückgegeben, und die Leerstelle nach dem Doppelpunkt verhindert wirkungsvoll jegliche Verwendung von Literalen im Code. Handles sind allerdings auch Lisp völlig ungeschützt. Schöner wäre ein geschützter Datentyp <Handle: 7e67> gewesen. Was ich meine, ist also folgendes: Lies Handles aus, speichere sie in Variablen, und ermittle daraus wieder das Zeichnungs-Objekt. Die Methoden .Handle und .HandleToObject sind dabei als Gegenteilsfunktionen zu sehen. Aber versuche niemals, in den Wert der Variablen 'hinenzuschauen' oder sogar etwas zu ändern. Dass ich in meinem Beispielcode mit Debug.Print mal einen Blick auf den Handle riskiere, kann man schon als grenzwertig betrachten. Die Entity-Handles haben viel Ähnlichkeit mit den Filehandles des OS: Da kommt doch auch keiner auf solche Ideen: Man holt sie, verwendet sie, und gibt sie wieder ab. Aber niemand will - aus gutem Grund - die Dingerchen sehen! Also: Keine Literale für solche Sachen, die einer dynamischen Vergabe unterliegen! Lass einfach mal diesen Code laufen bei dir: Steht da "wahr", ist auch in R14 die Welt in Ordung. Wenn da "Falsch" steht, dann existiert ein Problem. Das Wesentliche aber: In diesem Code gibt es keine Literale! Code:
Public Sub Example() Dim lineObj As AcadLine Dim startPoint(0 To 2) As Double Dim endPoint(0 To 2) As Double Dim handle As String Dim hObj As AcadLine With ThisDrawing startPoint(0) = 0#: startPoint(1) = 0#: startPoint(2) = 0# endPoint(0) = 1000#: endPoint(1) = 1000#: endPoint(2) = 0# Set lineObj = .ModelSpace.AddLine(startPoint, endPoint) ZoomAll handle = lineObj.handle 'Debug.Print handle Set hObj = .HandleToObject(handle) Debug.Print lineObj Is hObj End With End Sub
Mit R14 direkt testen kann ich's leider nicht. Gruß, Axel Strube-Zettler ------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 17. Dez. 2004 09:09 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
@mapcar ich glaube nicht, dass er den handle fix im Programmcode hinterlegen möchte die Zeile Set Obj = ThisDrawing.HandleToObject("7e67") sollte doch eher nur sein Problem verdeutlichen, dass sie Funktion HandleToObject in der 14 anscheinend nicht richtig funktioniert. Wo der Handle dann wirklich herkommt, z.B.: aus einer FM-Datenbank ist ja eigentlich egal (und da bin ich auch froh, dass der Handle nicht geschützt ist. Es ist doch leichter Strings in z.B.: Datenbanken abzulegen als z.B.: den Entitynamen (hätt ja auch keinen Sinn, wird ja beim Öffnen der Zeichnung neu vergeben)) ------------------ WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 17. Dez. 2004 09:14 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
@mapcar ich glaube nicht, dass er den handle fix im Programmcode hinterlegen möchte die Zeile Set Obj = ThisDrawing.HandleToObject("7e67") sollte doch eher nur sein Problem verdeutlichen, dass sie Funktion HandleToObject in der 14 anscheinend nicht richtig funktioniert. Wo der Handle dann wirklich herkommt, z.B.: aus einer FM-Datenbank ist ja eigentlich egal (und da bin ich auch froh, dass der Handle nicht geschützt ist. Es ist doch leichter Strings in z.B.: Datenbanken abzulegen als z.B.: den Entitynamen (hätt ja auch keinen Sinn, wird ja beim Öffnen der Zeichnung neu vergeben)) ------------------ WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 17. Dez. 2004 13:53 <-- editieren / zitieren --> Unities abgeben:
@mapcar Habe dein Beispiel ausprobiert und das Ergebnis ist WAHR. Was aber, wie fuchsi schreibt, nicht des Puddels Kern ist. Es ist tatsächlich so, daß ein Zusatzprogramm (hier ist es PitCad 4.2) in XDaten jeweils Handles zum nächstlogischen Objekt mit XDaten hinterlegt hat. Und genau diese Handle in XDaten-Form will ich auslesen und zum Objekt machen. Klingt kompliziert, aber so ist das nunmal. Zur Erläuterung, warum ich das anstrebe: Wir arbeiten mit unterschiedlichen Gewerken. Die Architektur ist meist in Meter gezeichnet und das Pit-Programm definiert die Maßeinheit Meter als XDaten in einer Blockreferenz. Die Architekturpläne werden als XRef unter die Gewerkpläne gelegt. Es kommt bei uns oft vor, das wir vom Gewerkplan aus direkt in den als XRef hinterlegten Architekturplan springen, da AutoCAD 14 nur jeweils eine Zeichnung in seiner Verwaltung aufnehmen kann. Da viele Zeichnungen sehr groß und Detailreich sind, möchte ich beim Laden der Architektur denselben Fensterausschnitt angezeigt bekommen, den ich in meinem Gewerkplan hatte. Das Problem hierbei waren die unterschiedlichen Maßeinheiten. Und die XDaten-Handles führen mich auf direktesten Weg zu der Stelle, wo die Maßeinheit hinterlegt ist. Ansonsten müßte ich jede Blockreferenz durchgehen und nach den typischen XDaten-Inhalte suchen, was, wie sich jeder vorstellen kann, bei großen Zeichnungen länger dauert. Wieso das Rad neu erfinden, wenn alle notwendigen Daten schon vorhanden sind. Was ich jetzt aber überhaupt nicht verstehe: Dein Programm funktioniert richtig. Aber wenn ich statt dem LineObjekt eine Blockreferenz definiere, was ja auch richtig ist, da das zu suchende Handle eine Blockreferenz ist, funktioniert es nicht. Es gibt kein Fehler. Auch wenn ich den Datentyp Variant zum definieren des HandleObjekts benutze, bekomme ich Nothing zurück. Ich glaube, ich wähle den längeren Weg und gehe halt alle BlockRefs durch. Immerhin erziehle ich das Endergebnis und das ist das wichtigste. Ist zwar nicht sauber progrmmiert aber es erfüllt seinen Zweck.
[Diese Nachricht wurde von TomiProg am 21. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 17. Dez. 2004 18:23 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
Na, irgendwas stimmt da doch einfach nicht. Der nachfolgende Code zeigt, dass das Ganze mit einem Insert (einer Blockreferenz) ganz genauso funktioniert wie mit einer Linie - es tät' mich auch sehr, sehr wundern, wenn das nicht so wäre bzw. wenn es in R14 anders sein sollte. Und dann habe ich noch ein bisschen gespielt, und zwar mit ein Paar Kommentarzeichen bei den Deklarationen: Hier ist InsertObj einfach nur als Object deklariert, nicht als AcadBlockReference. Wozu gibt's schließlich Late Binding? Die Variablen handle und hObj sind beide als Variant deklariert, da sträuben sich mir zwar die Nackenhaare, aber das Ganze funktioniert trotzdem einwandfrei! Also: Ich habe keine Ahnung, wo deine Fehler wirklich liegen - ich vermute nach wie vor, dass du einfach mit Literalen bzw. ungültigen Handles hantierst. Wer weiss schon, ob deine Handles in den Xdaten mit GC 1005 abgelegt sind - werden sie da als Strings mit GC 1002 gespeichert, ist die Katastrophe vorprogammiert, wenn Xrefs ins Spiel kommen (dann hat man nämlich Handles, die ins Leere laufen). Über die Fehler in deinem Code können wir hier uns aber nur äussern, wenn du den Code mal postest - bitte gestrafft! Gruß, Axel Strube-Zettler Code:
Public Sub test() Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double Dim circleObj As AcadCircle Dim centerPoint(0 To 2) As Double Dim radius As Double Dim insertObj As Object Dim handle ' As String Dim hObj As Variant ' As Object With ThisDrawing insertionPnt(0) = 0#: insertionPnt(1) = 0#: insertionPnt(2) = 0# Set blockObj = .Blocks.Add(insertionPnt, "TestBlock") centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0# radius = 100# Set circleObj = blockObj.AddCircle(centerPoint, radius) insertionPnt(0) = 50#: insertionPnt(1) = 50#: insertionPnt(2) = 0# Set insertObj = .ModelSpace.InsertBlock(insertionPnt, "TestBlock", 1#, 1#, 1#, 0) handle = insertObj.handle Debug.Print handle Set hObj = .HandleToObject(handle) Debug.Print insertObj Is hObj And Not hObj Is Nothing End With End Sub
------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 17. Dez. 2004 18:27 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 21. Dez. 2004 14:40 <-- editieren / zitieren --> Unities abgeben:
Na super. Jetzt wollte ich eine Datei anhängen mit einer meiner DWG-Zeichnungen wegen meinem Problem und was muß ich in der Hilfe erfahren, daß das aus Sicherheitsgründen nicht geht. Was für eine verar..... Dann kann man ja auch gleich die komplette Zeile 'Anhang' rausnehmen.... Udn wieso geht das bei anderen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 21. Dez. 2004 14:52 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 21. Dez. 2004 15:13 <-- editieren / zitieren --> Unities abgeben:
Wieso kann keiner mehr R14 einlesen? Das wäre mir neu. Aber hier erst mal der Code. Ich bezweifel aber, daß irgendjemand diesen Code zum laufen bekommt, ohne die dazugehörigen dwg-Datei. Und wieso steht dein Tip nicht so in der Hilfe-Anleitung? Da steht nix von 'Man muss der Dateiendung noch ein .txt anhängen, damit es funktioniert' Sub Handletest() Dim ObjType As Variant Dim UBlockObj As Object Dim xdataType As Variant Dim xdata As Variant Dim handle As String Dim hobj As Variant Debug.Print "=Beginn=======================================" On Error GoTo Ende For Each UBlockObj In ThisDrawing.Blocks("*MODEL_SPACE") ObjType = UBlockObj.EntityType If ObjType = acBlockReference Then UBlockObj.GetXData "PIT-CUP", xdataType, xdata Debug.Print "Momentaner Block: " & UBlockObj.handle If Not IsEmpty(xdata) Then handle = xdata(UBound(xdata)) 'Die nachfolgende Zeile funktioniert nicht wie erwartet Set hobj = ThisDrawing.HandleToObject(handle) Debug.Print "Nachfolgener Block: " & handle Debug.Print "hobj gesetzt?: " & Not hobj Is Nothing End If End If Next UBlockObj Ende: On Error GoTo 0 Debug.Print "=Ende=========================================" End Sub Nachtrag: Ich wollte nicht nur eine Dwg uploaden sondern eine ZIP mit txt-Datei und dwg-Datei. Geht das auch so mit Handle.zip.txt?
[Diese Nachricht wurde von TomiProg am 21. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 23. Dez. 2004 08:30 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
> Ich wollte nicht nur eine Dwg uploaden sondern eine ZIP mit > txt-Datei und dwg-Datei. Geht das auch so mit Handle.zip.txt? Ja, das geht mit jeder Datei. Es steht aber nicht in der Hilfe, weil das etwas zweischneidig ist: Einerseits braucht man das, um eben Zeichnungen austauschen zu können, andererseits werden hier auch Berge von irgendwelchen Powerpoint-Jokes hochgeladen, was eigentlich nicht im Sinne des Erfinders ist. Mit dem Lesen von R14 hast du natürlich Recht;-) Das Schreiben geht glaube ich nicht mehr. Lade die Zeichnung noch hoch, und dann kann man mal sehen, wo es hängt. Bei deinem Code wundert's mich ein wenig, dass xdataType völlig ignoriert wird - ist denn sichergestellt, dass der Handle, den du suchst, immer das letzte XDaten-Element ist? Und: spuckt denn xdataType(UBound(xdataType)) auch immer die Zahl 1005 aus? Gruß, Axel
------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 23. Dez. 2004 14:57 <-- editieren / zitieren --> Unities abgeben:
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 24. Dez. 2004 01:20 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil Inventor AIP 4-11, 2008 -2022 Win 10
|
erstellt am: 24. Dez. 2004 08:49 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 24. Dez. 2004 14:19 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
Hab mal einen kurzen Blick in die Testzeichnung geworfen: Da gibt es zwar ein Insert von "Testblock", aber an diesem Insert sind gar keine XDaten dran! Auch nicht an dem Kreis, aus dem die Blockdefinition besteht, und auch an der Blockdefinition nix. (entget(car(entsel)) '("*")) => ((-1 . <Objektname: 7ef71e20> ) (0 . "INSERT") (330 . <Objektname: 7ef71cc0> ) (5 . "DC") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "TESTBLOCK") (10 50.0 50.0 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0)(45 . 0.0) (210 0.0 0.0 1.0)) Da ist auch as schönste Programm machtlos;-) Gruß, Axel Strube-Zettler ------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|