Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Probleme mit Wblock und SelectionSet

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:  Probleme mit Wblock und SelectionSet (1534 mal gelesen)
Gemuetsmensch
Mitglied



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

Beiträge: 18
Registriert: 04.08.2010

BricsCAD 9

erstellt am: 16. Sep. 2010 13:17    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!

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, Koordinatenursprung

On 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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 18
Registriert: 04.08.2010

BricsCAD 9

erstellt am: 16. Sep. 2010 14:25    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,

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

noch eine Variante: mach oben gleich das Select in ein SelectionSet statt GetEntity.

- alfred -

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

Gemuetsmensch
Mitglied



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

Beiträge: 18
Registriert: 04.08.2010

BricsCAD 9

erstellt am: 16. Sep. 2010 14:47    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,

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 18
Registriert: 04.08.2010

BricsCAD 9

erstellt am: 16. Sep. 2010 18:32    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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 18
Registriert: 04.08.2010

BricsCAD 9

erstellt am: 16. Sep. 2010 19:49    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!

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 18
Registriert: 04.08.2010

BricsCAD 9

erstellt am: 16. Sep. 2010 21:13    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

Guten Abend,

ja, jetzt begreif' ich auch diese Vorgehensweise, prima.

Nochmals Dank und tschüß

Udo

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

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