| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Probleme mit Wblock und SelectionSet (1534 mal gelesen)
|
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 16. Sep. 2010 13:17 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich habe aus vielen Zeichnungen je ein Element als Block abzuspeichern und wollte das weitestgehend automatisieren. Ich wähle den Einfügepunkt, dann das Objekt (meist eine Polylinie), welches dann mit dem Einfügepunkt auf den Koordinatenursprung verschoben wird (wegen wblock). Doch wie füge ich dieses Objekt einem SelectionSet zu, was für wblock notwendig ist?? Bekomme immer nur Fehlermeldungen. Hier mein Ansatz:
Code: Sub Test_Objekt_als_Block_speichern() Dim anObj As Object Dim varPunkt As Variant Dim Pfad as String, Blockname as String Dim Koordinatenursprung(0 To 2) As Double Koordinatenursprung(0) = 0: Koordinatenursprung(1) = 0: Koordinatenursprung(2) = 0 varPunkt = ThisDrawing.Utility.GetPoint(, "Einfügepunkt wählen: ") ThisDrawing.Utility.GetEntity anObj, pt, "Markiere das gewünschte Objekt: " anObj.Move varPunkt, KoordinatenursprungOn Error Resume Next Set ssetObj = ThisDrawing.SelectionSets("BlockTest") If Err.Number <> 0 Then Set ssetObj = ThisDrawing.SelectionSets.Add("BlockTest") End If On Error GoTo 0 ssetObj.Clear ReDim objsInModelSpace(0) As AcadEntity Set objsInModelSpace(0) = anObj ssetObj.AddItems objsInModelSpace 'anObj Pfad = "g:\Test\" Blockname = "Test.dwg" ThisDrawing.Wblock Pfad & Blockname, ssetObj End Sub
Kann mir bitte jemand helfen?Viele Grüße der Gemütsmensch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 16. Sep. 2010 13:58 <-- editieren / zitieren -->
Hi, ausser den Meldungen, dass ein paar Variable nicht deklariert sind, kommt bei mir keine Meldung, sondern der Block wird erstellt und gespeichert. Also würd ich an Deiner Stelle mal Option Explicit einfügen, die Zeile mit On Error Resume Next rausnehmen und laufen lassen. - alfred - ------------------ www.hollaus.at |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 16. Sep. 2010 14:25 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, Vielen Dank, daß Du Dich schon wieder einmal meiner Fragen annimmst. Aber ich ahne schon wieder ein BricsCAD- Problem, denn auch wenn ich alles fein säuberlich deklariere (ist ssetObj As Object OK?) und das On Error Resume Next herausnehme, erscheint bei der Zeile
Code: ssetObj.AddItems objsInModelSpace
die Fehlermeldung "Invalid procedure call or argument (Error 5)" Dabei habe ich doch ein Array übergeben, wenn auch nur mit einem Element. ReDim objsInModelSpace(1) statt ReDim objsInModelSpace(0) bringt auch nichts. Bin wieder mal ratlos.Gibt es vielleicht eine Ersatzlösung, neudeutsch workaround? Gruß Udo
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 16. Sep. 2010 14:31 <-- editieren / zitieren -->
Hi, wenn Du an das SelectionSet in Bricscad kein Objekt anfügen kannst (zumindest nicht so, wie es in AutoCAD geht), dann hast Du ja zumindest den Handle in der Hand. Probier daher, das SelectionSet mit Filter zu machen und dort den Handle als Filterkriterium (hoffe, dass Handle als Filterkriterium geht, da bin ich nicht sicher). HTH, - alfred - ------------------ www.hollaus.at |
Ex-Mitglied
|
erstellt am: 16. Sep. 2010 14:44 <-- editieren / zitieren -->
Hi, noch eine Variante: mach oben gleich das Select in ein SelectionSet statt GetEntity. - alfred - ------------------ www.hollaus.at |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 16. Sep. 2010 14:47 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, nachdem ich das wblock- Beispiel, das ich hier im Forum gefunden habe, problemlos habe laufen lassen können, ist mir aufgefallen, daß ich das ssetObj als AcadSelectionSet deklarieren mußte und siehe da, das Problem saß wieder mal vor dem PC... Herzlichen Dank für's Ausprobieren und die Hinweise und weiterhin alles Gute! Nur zur Weiterbildung, was ist der "Handle"? Beste Grüße Udo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 16. Sep. 2010 14:49 <-- editieren / zitieren -->
Hi, >> Nur zur Weiterbildung, was ist der "Handle"? Eine ID, die jedes Objekt in der Zeichnungsdatenbank hat (in LISP und VBA hexadezimal geführt). Du kannst auch in Deinem Code mal gucken: Debug.Print(anObj.Handle) - alfred - ------------------ www.hollaus.at |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 16. Sep. 2010 18:32 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, wieder was gelernt, wenn auch noch nicht ganz begriffen ;-). Als letzte Frage, dann hör ich wirklich auf: Kann ich Objekte immer via Handle ansprechen? Die Hilfe hat nur ein Beispiel parat, wie ich mir die Handles anzeigen lassen kann, ich habe aber ein wenig im Netz gesucht und bin auf HandleToObject gestoßen. Müßte ich meine Objektzuweisung zum Selectionset dann so formulieren:
Code: Dim HandleName As String HandleName = anObj.Handle ... Set objsInModelSpace(0) = ThisDrawing.HandleToObject(HandleName) ssetObj.AddItems objsInModelSpace
Übrigens, das On Error Resume Next kann ich nicht weglassen, sonst bringt die nächste Zeile oft die Fehlermeldung: Class doesn't support Automation or does not support expected interface Was der folgende Konstrukt mit SelectionSets und SelectionSets.Add eigentlich macht, ist mir unklar, hab ich nur abgeschrieben, aber er ist scheinbar notwendig. Also nochmals vielen Dank und schöne Grüße Udo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 16. Sep. 2010 18:39 <-- editieren / zitieren -->
Hi, >> Kann ich Objekte immer via Handle ansprechen?Ja, und zwar genau so, wie Du es auch schon gezeigt hast mit .HandleToObject >> Müßte ich meine Objektzuweisung zum Selectionset dann so formulieren:
Beides ist möglich, dieses Beispiel hier wie auch das oben (das ja mittlerweile bei Dir schon läuft). Grundsätzlich aber zur Funktion .HandleToObject ==> das löst einen Suchvorgang durch die Datenbank aus, kostet sicher mehr Zeit als direkt das Objekt anObj zu übergeben, wenn Du ja schon die Referenz auf das Objekt selbst in der Hand hast. >> Übrigens, das On Error Resume Next kann ich nicht weglassen
Ist mir schon klar, es gehört gezielt gesetzt und behandelt. Nur wenn der Code nicht tut, wie Du es brauchst, dann hilft es Dir eben nicht, wenn es aktiv ist ==> und Du daher beim debuggen nicht dort angehalten wirst, wo der Fehler ist. >> sonst bringt die nächste Zeile oft die Fehlermeldung: >> Class doesn't support Automation or does not support expected interface
Da steh ich jetzt ein wenig auf der Leitung, von welcher 'nächsten Zeile' Du jetzt sprichst. - alfred - ------------------ www.hollaus.at |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 16. Sep. 2010 19:49 <-- editieren / zitieren --> Unities abgeben:
Hallo! Es ist wirklich ausgesprochen nett, wie hilfreich Du alles erklärst, Dankeschön! >>> sonst bringt die nächste Zeile oft die Fehlermeldung: >>> Class doesn't support Automation or does not support expected interface >Da steh ich jetzt ein wenig auf der Leitung, von welcher 'nächsten Zeile' Du jetzt sprichst. Entschuldige bitte, habe ich zu lasch formuliert. Die Zeile nach On Error Resume Next: Set ssetObj = ThisDrawing.SelectionSets("BlockTest") bringt dann obige Fehlermeldung. Gruß Udo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 16. Sep. 2010 20:13 <-- editieren / zitieren -->
Hi, diese Fehlermeldung kann nur dann zustandekommen, wenn ein SelectionSet namens 'BlockTest' in der aktuellen AutoCAD-Sitzung (Bricscad-Sitzung) noch nicht existiert (der Befehl will ja ein bestehendes SelectionSet aus der Liste der SelectionSets haben). Im Debug-Fall, nimmt man das halt raus, wo nur möglich oder, wie von Dir schon eingebaut, das Statement On Error Goto 0 ==> damit wird die Fehlerbehandlung wieder dem Debuger zurückvererbt und er meldet, wenn ihm was nicht passt. - alfred - ------------------ www.hollaus.at |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 16. Sep. 2010 21:13 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|