| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: VBA-Selectionset an Acadbefehl übergeben; Wie ?? (3241 mal gelesen)
|
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 01. Okt. 2005 14:21 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, da ich mittels Forumssuche nix finden konnte, wende ich mich mit der Frage an euch: Wie kann ich ein in VBA erstelltes SelectionSet nach beendigung des Programmes an einen Autocad-Befehl übergeben ? Im Lisp geht das mittel !SSname nachem man mit (setq SSname (ssget)) diesem ein Selectionset zugeordnet hat. Aber offensichtlich gibt es hier Unterschiede zwischen einem Autocad bzw. Lisp Selectionset und einem VBA-Selectionset! Ich würde mich freuen, wenn mir jemand den Unterschied erklären kann, und einen Weg zeigt, wie ich mein Problem löse. Herzichen Dank schon mal Didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 06. Okt. 2005 12:49 <-- 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: 07. Okt. 2005 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
du könntest eventuell diesen Umstand ausnützen, dass ein in VBA erzeugter Auswahlsatz immer der letzte in der Auswahlsatzreihenfolge ist. z.B.: Dim ss As AcadSelectionSet Set ss = ThisDrawing.SelectionSets.Add("TEST") ss.SelectOnScreen ThisDrawing.SendCommand ("(setq ss (ssget ""_P""))" & Chr(13)) hier weise ich der LISP Variable ss einfach den VORIGEN Auswahlsatz zu den kannst du in autocad dann mit !ss verwenden oder gleich beim Befehl V für vorige eingeben. ------------------ Ing. Anton Fuchs 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: 07. Okt. 2005 12:44 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
noch eine Antwort in Lisp ausprogrammiert (vl-load-com) ; Autocad Objekt holen (setq AxAcad (vlax-get-acad-object)) ; aktuelle zeichnung holen (setq AxDrawing (vla-get-activedocument AxAcad)) ; Container Selectionssets holen (setq AxSelectionsets (vlax-get AxDrawing "SelectionSets")) ; den in VBA erstellten Selectionset mittels dessen Namen holen (setq AxSelectionset (vlax-invoke AxSelectionsets "ITEM" "TEST3")) ; einen leeren Lisp Auswahlsatz erstellen (setq LispSelectionset (ssadd) i1 0) ; eine Schleife über alle im Selectionsset enthaltenene Objekte (repeat (vlax-get AxSelectionset "COUNT") ; jedes einzelne Objekt im Auswahlsatz holen (setq AxObj (vlax-invoke AxSelectionset "ITEM" i1) i1 (1+ i1)) ; zu einem Lisp Entity machen und dem Lisp Auswahlsatz hinzufügen (setq LispSelectionset(ssadd (vlax-vla-object->ename AxObj) LispSelectionset)) ) jetzt haste einen normalen Lisp Auswahlsatz EDIT : in dieser Zeile war ein kleiner Fehler drin, (setq LispSelectionset(ssadd (vlax-vla-object->ename AxObj) LispSelectionset))
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC [Diese Nachricht wurde von fuchsi am 07. Okt. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 07. Okt. 2005 17:20 <-- editieren / zitieren --> Unities abgeben:
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 17. Okt. 2005 21:50 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Hallo Anton, Zitat: Original erstellt von fuchsi: .. (setq ss (ssget "_P")) .. [/B]
Mit dem obigen Codefragment weisst man den vorherigen Auswahlsatz einer Variablen zu. Wie geht das mit der aktuellen Auswahl ?? Stelli
------------------ Warum lisp'eln wenn's auch anders geht. 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: 18. Okt. 2005 09:46 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 18. Okt. 2005 09:54 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Hallo Anton, mit der vorhandenen Funktion wird das Selektionset einer abgeschlossenen Auswahl gespeichert. Da ich einige Selektionen immer wieder machen muss habe ich mit 3 Selektions auf Button gelegt. Klappt gut. Was noch schön wäre wenn die Selektion ala PickFirst gespeichert werden könnte. Also Benutzer klickt Elemente an (hat keine Funktion gewählt) und speichert diese Auswahl als Selektion. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. 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: 18. Okt. 2005 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Zitat: Original erstellt von Stelli1: Hallo Anton,mit der vorhandenen Funktion wird das Selektionset einer abgeschlossenen Auswahl gespeichert. Da ich einige Selektionen immer wieder machen muss habe ich mit 3 Selektions auf Button gelegt. Klappt gut. Was noch schön wäre wenn die Selektion ala PickFirst gespeichert werden könnte. Also Benutzer klickt Elemente an (hat keine Funktion gewählt) und speichert diese Auswahl als Selektion. Stelli
nun ja die PickFirst Elemente kriegst du einfach mit (setq ss (ssget)) als Variable abgespeichert. Allerdings , hat der User noch nichts ausgewählt, wird er zur Objektwahl aufgefordert. Wurden bereits Objekte gewählt, werden diese automatisch übernommen (ohne Benutzerauforderung)
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 18. Okt. 2005 10:06 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
|
Huebi Mitglied Vermessungsing.
Beiträge: 107 Registriert: 08.01.2004 Intel Core Duo E6750@2.66GHz NVIDIA GeForce 8600 GT AutoCAD 2004, 2007, 2008 AcadMAP 2004 und 2007 Civil 3D 2008 ADT 2009
|
erstellt am: 05. Dez. 2005 11:04 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Zitat: Original erstellt von fuchsi:
Dim ss As AcadSelectionSet Set ss = ThisDrawing.SelectionSets.Add("TEST") ss.SelectOnScreen ThisDrawing.SendCommand ("(setq ss (ssget ""_P""))" & Chr(13))hier weise ich der LISP Variable ss einfach den VORIGEN Auswahlsatz zu den kannst du in autocad dann mit !ss verwenden oder gleich beim Befehl V für vorige eingeben.
Hallo fuchsi! Das funktioniert wohl nur, wenn man das Selectionset mit "SelectOnScreen" oder div. erstellt hat. Wie macht man es, wenn man das SelectionSet innerhalb von VBA mit der AddItems-Methode generiert hat? Also folgendes: Ich erzeuge per VBA mehrere Elemente (in diesem Fall Texte) und möchte diese zusammen verschieben (via SendCommand). Leider funktioniert dann diese Art des Aufrufes nicht :-( Hat jemand ne bessere Idee? Gruß - Hübi ------------------ Schaun ma mal, dann seng ma scho.... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 Autocad 2018
|
erstellt am: 30. Mai. 2007 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Man kann beliebige Objekte wie folgt verschieben Global ssetg Sub test_move() Dim ent, Point1(0 To 2) As Double, point2(0 To 2) As Double Point1(0) = 0: Point1(1) = 0: Point1(2) = 0 'Punkt von point2(0) = 1: point2(1) = 1: point2(2) = 0 'bis Punkt verschieben 'Objekte selektieren Call InitSset For Each ent In ssetg ssetg.Move Point1, point2 Next ent End Sub Sub InitSset() On Error Resume Next ThisDrawing.SelectionSets.Item("ACAD_Temp").Delete Set ssetg = Nothing Set ssetg = ThisDrawing.SelectionSets.Add("ACAD_Temp") ssetg.SelectOnScreen End Sub
'Alle Texte in den Selectionset Texte schreiben Sub test_selectionset() Dim sset As AcadSelectionSet, ent Dim SsetArray() As AcadEntity, a Call Create_Sset("Texte") a = -1 For Each ent In ThisDrawing.ModelSpace If ent.Objectname = "AcDbText" Then a = a + 1 ReDim Preserve SsetArray(0 To a) Set SsetArray(a) = ent End If Next ent ssetg.AddItems SsetArray End Sub
'Selectionset erzeugen Sub Create_Sset(SsetName) On Error Resume Next ThisDrawing.SelectionSets.Item(SsetName).Delete Set ssetg = Nothing Set ssetg = ThisDrawing.SelectionSets.Add(SsetName) End Sub Hoffe ich konnte helfen! Mfg Chris
[Diese Nachricht wurde von c.schojer am 30. Mai. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |