| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: C#.net Objekte als gewählt markieren (2307 mal gelesen)
|
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. Mai. 2009 15:13 <-- editieren / zitieren --> Unities abgeben:
Ich möchte mir mit C#.NET einen eigenen Filterbefehl schreiben (um z.B.: Objekte in der Zeichnung nicht nach layer, farbe usw. sondern nach EED-Inhalten zu markieren) In etwas so: markiere mir alle Blöcke, die in den EEDs den Lieferanten 'XYZ' und die Bestellserie 'ZYX' haben. Danach soll der Benutzer mit Standard Autocad Befehlen (Schieben, Löschen was auch immer) diese Selektion verwenden können. Wie halt der klassische Filterbefehl Wie ich die Objekte suche, und die EEDs auslese, ist bekannt. (auchd er EED AUfbau ist natürlich bekannt) Nur wie markiere ich diese für eine Objektwahl? In Lisp wäre das wohl (sssetfirst) 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. Mai. 2009 16:27 <-- 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. Mai. 2009 17:54 <-- editieren / zitieren --> Unities abgeben:
So nun bin schon weiter Code: [CommandMethod("ASW", CommandFlags.NoPaperSpace | CommandFlags.Transparent)] public void ASW() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; PromptSelectionResult selset = ed.SelectAll(); ed.SetImpliedSelection( selset.Value); }
Ich weiss, der Codeschnipsel ist absolut brutal ohne irgendwelchen Fehlerabfragen, aber es geht nur ums Prinzip.
Der Befehl ASW selektiert nun einfach alles in der zeichnung, soweit so gut. Aber wie funktioniert es, wenn der Befehl Transparent innerhalb eines anderen Autocadbefehls aufgerufen wird. Wie übergeb ich die Selection an den vorher aufgerufenen Befehl Ich denke ich muss irgendwie abfragen, ob ich Transparent aufgerufen wurde, und dann die Selection zurückgeben ?? 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: 30. Jun. 2009 15:35 <-- editieren / zitieren --> Unities abgeben:
Da ich jetzt nach einer kurzen Pause, wieder mein Projekt "kaufmännischer Auswahldialog" aufgenommen und auch fertiggestellt habe. Hier mein Lösung Ich verwende einfach keine CommandMethod, sondern eine Lispausdruck Code: [CommandMethod("C:ASW1",CommandFlags.Defun)] public SelectionSet ArtikelAuswahl1(ResultBuffer args) { frmAuswahl tFormular = new frmAuswahl(); tFormular.ShowDialog(); ObjectId[] tObjectIdArray = Formular.iSelecetedObjects.ToArray(); Editor.SetImpliedSelection(tObjectIdArray); SelectionSet tSelSet = SelectionSet.FromObjectIds(tObjectIdArray); return tSelSet; }
Das hat den Vorteil, dass der Befehl C:ASW einerseits als Konsolenbefehl,m aber auch andererseits als Transparenter Befehl funktioniert. Dabei wird auch beim Setzten des ImpliedSelection auch keine Ausnahme verursacht.
Anbei ein Scrrenshot. Mit meinem Auswahldialog kann man nun Büromöbel je nach kaufmännischen Daten und eingeplanter Abteilung (hier Ordner genannt) selektieren. [Diese Nachricht wurde von fuchsi am 30. Jun. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 30. Jun. 2009 15:46 <-- editieren / zitieren -->
Hi, lerne ich jetzt gerade was oder ist's nur ein gedanklicher Fehler? Wenn Du eine Lisp-Funktion deklarierst, ist da die Deklaration nicht Code: [LispFunction("C:ASW1")] public SelectionSet ArtikelAuswahl1(ResultBuffer args)
statt ...CommandMethod...? In jedem Fall aber Üs fürs selbst herausfinden und dann bereitstellen! Danke Heisst das auch, dass Du im Lisp jetzt das Implied-SelectionSet wirklich während des transparenten Aufrufs verändern kannst? Da bist Du aber mächtig tief eingedrungen, Hochachtung! - alfred - ------------------ www.hollaus.at |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 30. Jun. 2009 15:56 <-- editieren / zitieren --> Unities abgeben:
Code: [CommandMethod("C:ASW1",CommandFlags.Defun)] public SelectionSet ArtikelAuswahl1(ResultBuffer args)
Code: [LispFunction("C:ASW1")] public SelectionSet ArtikelAuswahl1(ResultBuffer args)
Dürfte wohl das selbe sein. Ich bin nur darauf gestossen, da ich in meiner Verzweiflung alle Commandflags durchprobiert habe. Der Vorteil der Methode SetImliedSelection ist, dass diese Methode sauschnell ist. Bei einer Zeichnung mit 1500 Möbel dauert diese Methode ca. 1 Sekunde, um diese 1500 Möbel auszuwählen. Die Methode, die wir per PM disskutiert haben Call tAcadDocCOM.SendCommand("(ssadd (handent """ & Hex(tObjID.Handle.Value) & """))" & vbCr) dauert dagegen in der selben Zeichnung ca. 15-20Sekunden. [Diese Nachricht wurde von fuchsi am 30. Jun. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 30. Jun. 2009 16:04 <-- editieren / zitieren -->
Großartig, dann hab ich nur einen Schritt zu wenig weit gedacht. Einen Weg über Lisp hätten wir ja schon gehabt, nur dass ich eben nicht jedes Element einzeln mit SendCommand gewählt hätte , aber dass grundsätzlich das ImpliedSelectionSet sich über eine definierte LispFunktion modifizieren läßt und dieses auch in der laufenden Funktion dann als 'selektiert wahrnimmt', das ist schon brauchbar. THX for the info, - alfred - ------------------ www.hollaus.at |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 30. Jun. 2009 16:09 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von a.n.: , aber dass grundsätzlich das ImpliedSelectionSet sich über eine definierte LispFunktion modifizieren läßt und dieses auch in der laufenden Funktion dann als 'selektiert wahrnimmt', das ist schon brauchbar.
Vorsicht. Das ImpliedSelectionSet kann man zwar in der laufenden Funktion setzten, es wird jedoch erst beim Verlassen der Funktion grafisch dargestellt. Ich habe mir damit geholfen, dass ich während der Funktion, die Elemnte lediglich Highlighte/Unhighlighte, und erst am Funktionsschluss den ImpliedSelectionSet setzte. In einem transparenten Befehl geht auch das nicht (ImpliedSelectionSet ), in einem transparenten Lisp jedoch sehr wohl.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |