| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Kann man Objekte temporär auf dem Zeichnungsbildschirm anzeigen (1882 mal gelesen)
|
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 19. Jul. 2010 22:42 <-- editieren / zitieren --> Unities abgeben:
Hallo liebes Forum, ich möchte mit VB.Net Objekte erstellen, die nur auf dem Zeichnungsbildschirm angezeigt werden und nicht in die Datenbank gespeichert werden. So wie z.B. daß BKS-Symbol oder Hilfspunkte von AutoCAD. Am liebsten auch noch Transparent und beim Zoomen sollen sie mitgezoomt werden. Ist sowas überhaupt möglich? Kann man sowas mit GDI+ zeichnen? Gibts im AutoCAD dafür einen extra Zeichenbereich in dem man solche Objekte zeichnen kann? Hab keine Ahnung wo ich da ansetzen soll. Bin für jeden Rat dankbar. Gruß Werner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 19. Jul. 2010 23:01 <-- editieren / zitieren -->
Hi, ja geht, aber ein wenig Vorsicht! Mit/ab 2010 gibt es die Möglichkeit, sich in das 'Regenerieren' von Geometrieobjekten einzumischen, genannt 'Overruling'. Eine kleine Einführung findest Du z.B. >>>hier<<<. Wieso 'Vorsicht' ==> das funktioniert nur dort, wo Deine Applikation geladen ist, die Darstellung läßt sich nicht im DWG transportieren (aber das scheinst Du ja zu wollen ). Lass uns wissen, wenn obiger Link nicht ausreichend ist, dann aber bitte mit konkreteren Info's. Den Bildschirm über GDI(plus) zu überschreiben macht imho die Aufgabe nur deutlich schwieriger, da Du jeden PAN, jeden ZOOM, jedes Ansichtsfenster in Layouts etc überwachen musst. - alfred - ------------------ www.hollaus.at |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 20. Jul. 2010 07:09 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
Hallo Werner, Alfred hat bereits die Lösung geschrieben. Aber was man vorher auch wissen sollte: Die Objekte sind eben wirklich nur am Bildschirm dargestellt. Objektfang kann auf diese nicht angewandt werden. Es ist also mehr als eine zusätzliche Bildschirm-Information zu verstehen. Ich habe dies in einem Fall bereits genutzt, wo gerade das ein enormer Nachteil war. Ansonsten ist das eine tolle Sache, weil man ohne eigene Objektdefinition die Objekte anders darstellen kann. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 20. Jul. 2010 22:01 <-- editieren / zitieren --> Unities abgeben:
Hallo ihr zwei, danke für die tollen Infos! Ich hab mit dem Overrule-Dingsbums ein wenig rumgespielt. Und hab mal was zusammengeschrieben (sh. code). Nach dem Laden mit Command: testrect aktivieren. Hier wird ein rotes Rechteck 50x50 generiert sobald man eine Linie zeichnet. Dieses Rechteck ist damit auch mit der Linie untrennbar verbunden. Ich möchte aber ein Rechteck erzeugen das nicht mit einem AutoCAD-Objekt verbunden ist. Es soll eine einfache Markierungsfläche sein die nur visuell auf dem Bildschirm angezeigt wird und nicht in Die DB gespeichert wird. Es soll während eines Programmablaufs vorübergehend angezeigt werden und danach wieder verschwinden. Außerdem soll es nicht selectiert werden können oder andere Objekte überlagern so daß diese nicht gefangen werden können. Ich komme nicht dahinter wie das gehen könnte.
Code: Imports System Imports Autodesk.AutoCAD Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.GraphicsInterfacePublic Class RectDrawOverrule : Inherits DrawableOverrule Public Overrides Function WorldDraw(ByVal drawable As Drawable, ByVal wd As WorldDraw) As Boolean Try Dim pts As New Point3dCollection pts.Add(New Point3d(50, 50, 0)) pts.Add(New Point3d(100, 50, 0)) pts.Add(New Point3d(100, 100, 0)) pts.Add(New Point3d(50, 100, 0)) Dim oldFillType As GraphicsInterface.FillType = wd.SubEntityTraits.FillType wd.SubEntityTraits.FillType = GraphicsInterface.FillType.FillAlways Dim oldColor As Short = wd.SubEntityTraits.Color wd.SubEntityTraits.Color = 1 wd.Geometry.Polygon(pts) wd.SubEntityTraits.FillType = oldFillType wd.SubEntityTraits.Color = oldColor Catch ex As Autodesk.AutoCAD.Runtime.Exception WriteLine(ex.ErrorStatus.ToString) End Try Return MyBase.WorldDraw(drawable, wd) End Function End Class Public Class RectDrawScreen Private Shared mRectDrawOverrule As RectDrawOverrule
<CommandMethod("testrect")> _ Public Sub Test() mRectDrawOverrule = New RectDrawOverrule Overrule.AddOverrule(RXObject.GetClass(GetType(Line)), mRectDrawOverrule, False) Overrule.Overruling = True End Sub End Class
Gruß Werner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 21. Jul. 2010 09:41 <-- editieren / zitieren -->
Hi Werner, >> Es soll eine einfache Markierungsfläche sein die >> nur visuell auf dem Bildschirm angezeigt wird und nicht in Die DB >> gespeichert wird. Es soll während eines Programmablaufs >> vorübergehend angezeigt werden und danach wieder verschwinden. >> Außerdem soll es nicht selectiert werden können oder andere >> Objekte überlagern so daß diese nicht gefangen werden können. Ohne Eintrag in die DB hätte ich wirklich nur mehr GDI gesehen, aber ich glaube nicht, dass der Eintrag in die DB stört, denn Du kannst diesen Eintrag ja wieder aus der DB löschen, wenn Dein Programmteil abgelaufen ist (im schlimmsten Fall SAVE abfangen und dann vorher löschen). Du mußt das ja auch nicht an eine Linie hängen, mach in der DB einen AutoCAD-Punkt und lass Dir dort eine rote Fläche herumzeichnen, dann brauchst Du nur mehr den Punkt löschen. Aber ich muß zugeben, auf die schnelle würde mir mal ohne ARX nicht einfallen, wie ich den Fangpunkt auf den AutoCAD-Punkt verhindern könnte. Für die Verhinderung der Selektion sollte es möglich sein, dass Du den Editor überwachst (auf Selektionsereignisse) und wenn der Punkt selektiert werden sollte, dann diesen Punkt rausnehmen. Irgendwann hatte ich ähnliches mal, ist nur schon länger her. Letzter kritischer Punkt ist natürlich 'Überlagerung', wenn Du aber den Punkt über Darstellungsreihenfolge 'nach hinten' schickst, dann hast Du auch damit kein Problem mehr (Vorsicht nur, wenn gefüllte Schraffuren in Deiner Zeichnung vorhanden sind). Waren ein paar Ansätze, hoffentlich nützlich. - alfred - ------------------ www.hollaus.at |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 21. Jul. 2010 11:46 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
Zitat: Original erstellt von Wene71: ... Ich möchte aber ein Rechteck erzeugen das nicht mit einem AutoCAD-Objekt verbunden ist.Es soll eine einfache Markierungsfläche sein die nur visuell auf dem Bildschirm angezeigt wird und nicht in Die DB gespeichert wird. Es soll während eines Programmablaufs vorübergehend angezeigt werden und danach wieder verschwinden. Außerdem soll es nicht selectiert werden können oder andere Objekte überlagern so daß diese nicht gefangen werden können. ...
Hallo Werner, du willst es während des Programmablaufs temporär angezeigt bekommen. Wenn die Anzeige während eines GetXXX-Befehls erscheinen soll, dann schau die mal die JIG-Geschichten an. Damit kannst du eben solche Objekte wie beim Overruling anzeigen lassen .. die sind dann eben auch nicht mit irgendwelchen DB-Objekten verbunden. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 21. Jul. 2010 12:04 <-- editieren / zitieren -->
Hi Holger, >> ... JIG-Geschichten ... Gute Idee, die verwendete ich immer nur während Mausaktivitäten, um laufende aktualisierte Voransichten zu erhalten. Das ohne laufenden Befehl wird imho eine Aufgabe, aber die Idee ist super! - alfred - ------------------ www.hollaus.at |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 21. Jul. 2010 12:37 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
... ja mit den Teilen kann man spannende Geschichten realisieren. Ich nutze das zum Bsp beim Einfügen von Blöcken und der gleichzeitigen Anzeige der Abstände zu bestimmten Polylinien. Anderes Beispiel: Anzeige der Aktionsradien bei bestimmten Bauteilen .. da wird dann eben temporär ein Kreis angezeigt. Ich finde das Overruling und das JIGging sind die besten Neuerungen in den letzten Releases .. weil man nun endlich ohne eigene Objekt-Definitionen so tun kann, als seien es eigene Objekte. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 21. Jul. 2010 14:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Ihr, das Overruling war mir bis jetzt noch unbekannt. Werde mich mal näher damit auseinander setzen, was in dieser API alles drin steckt. Ich denke man kann damit tolle Sachen zaubern. Naja GDI schließe ich für meine Aufgabe mal aus, ich glaube das würde im Bezug auf Zoom, Pan usw. sehr 'Hackelig' werden. An das Jig-Objekt hab ich auch schon gedacht! Mit den Jig-Objekten füge ich immer meine Blöcke ein und lasse sie beim Einfügen am Cursor kleben bzw. rotieren. Da muß ich überlegen und probieren ob meine Aufgabe mit Jig lösbar ist. Meine Aufgabe mit dem Rechteck habe ich auch schon mit normalen ACAD-Objekten versucht z.B. Schraffur als Solid. Vorübergehend speicher ich dies dann in die DB und kill sie später wieder. Das hat alles funktioniert, nur der Hacken war, weil ich dieses Rechteck Transparent haben will. Dabei muß ich immer die Systemvariable abfragen ob die Objekttransparenzanzeige ein oder aus ist, und ggf. einschalten. Das benötigt viel Zeit und macht mein Programm langsam. Wäre beim Jiggen wohl das gleiche Übel. Andere dumme Frage! Im Befehl WAHL bekommt man ja bei der Auswahl ein grünes bzw. blaues transparentes Fenster. Gibts dieses Fenster vielleicht irgendwo als Klasse wo man darauf zugreifen kann...? Genau so ein Fenster stell ich mir vor. Nur daß es länger auf dem Bildschirm verweilt als nur bei einer Auswahl. Gruß Werner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 21. Jul. 2010 14:51 <-- editieren / zitieren -->
Hi, >> ein grünes bzw. blaues transparentes Fenster. Gibts dieses Fenster >> vielleicht irgendwo als Klasse wo man darauf zugreifen kann...? Mir nicht bekannt, dass Du auf dieses so Zugriff hättest, dass Du das selbst 'malend' verwenden könntest. Bzgl. der Schraffur und Transparenz: wenn die Flächen klein sind, dann könntest Du auch den Schraffurtyp 'DOT' nehmen und die Punktdichte der Größe Deines Quadrats anpassen, so hat man früher Transparenz vorgegaukelt. - alfred - ------------------ www.hollaus.at |
oscarr Mitglied CAD-Manager
Beiträge: 198 Registriert: 02.10.2007 ACA 2012 - English Win 7/x64
|
erstellt am: 21. Jul. 2010 15:30 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
Hallo zusammen, ich habe neulich gerade was gebastelt: Beitrag Das malt eine farbig fläche auf den schirm, die Koordinaten kommen aber aus ACAD. die Fläche bleibt bis zum nächsten _regen stehen, es ist nicht in der DB, hängt ein keinem Object, ist aber GDI, da man aber die Punkt easy umrechenen kann lässt es sich vielleicht auch mit zoom etc. händeln. Man müsste das dann abfangen und die grafik neu zeichnen. LG Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 21. Jul. 2010 21:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, 1000 Dank für Deinen Hinweis! Deinen Tread hatte ich schon mal gelesen. Aber hab ihn einfach nicht mehr gefunden. Hab Dein Beispiel mal ausprobiert. Es funktioniert ganz gut und entspricht auch meinen Vorstellungen. Das Rechteck blitzt bei meinem Test aber nur kurz auf und terminierte sich gleich wieder. Dies läßt sich bestimmt beheben! Gut Zoom und Pan kann man über Ereignisse abfangen und das Rechteck neu berechnen. Aber ich vermute mal, daß wenn während das Rechteck angezeigt wird und AutoCAD minimiert wird, das Rechteck immer noch auf dem Bildschirm ist. Das könnte man auch abfangen und verwalten. Aber irgendwie gefällt mir so was nicht. Werde aber trotzdem auch über diese Variante nachdenken. Gruß Werner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|