| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Doppelklick auf Attributref (1454 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 18. Nov. 2010 09:17 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, ich habe mir ein kleines Program (VB2008, Basic) geschrieben, mit dem ich unseren Firmen-Plankopf als Block in die Zeichnung einfüge. Dann gibt es ein Windowsforms mit dem ich die ganzen Eintragungen in den Plankopf als Attributte in den Block speichere. Funktioniert wunderbar. Dank Jig (Danke nochmal an Alfred) jetzt sogar mit Vorschau. Jetzt wäre es aber noch gut wenn bei einem Doppelklick des Users auf den Plankopf nicht der normale Attributseditor aufginge sondern wieder mein Windosforms von vorhin. Das wäre gut, weil im Plankopf nicht alle Eingaben frei wählbar sein sollen. Wenn der User einen anderen Block mit Attributen wählt, dann soll natürlich weiterhin der normale Attributseditor aufgehen und das gewählte Attribut anzeigen. An dieser Aufgabe bin ich schon in VBA gescheitert. Gibt es in VB.NET eine saubere Lösung? Ich kenn mich in ACAD ganz gut aus. Meine Programier-Kentnisse sind eher gering. Bin für jeden Lösungsvorschlag dankbar. Gruß, Theo
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 18. Nov. 2010 09:36 <-- editieren / zitieren -->
Hi, folgende Variante fällt mir ein: a) in der CUI die Doppelklickaktion umbauen auf einen eigenen Befehl b) im eigenen Befehl prüfen, ob es der 'berüchtigte' Block ist, der doppel-geklickt wurde, dann eigenes Programm, sonst _EATTEDIT per SendCommand starten HTH, - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 18. Nov. 2010 10:11 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, das ist genau meine Vorgehensweise. klappt auch. Hat aber einen großen Nachteil. Wenn ich dann _eattedit mit sendcommand starte, dann wird diesem zwar automatisch der geklickte Block übergeben. Aber nicht der Punkt, bzw. das Attribut. So daß _eattedit dann einfach mit dem ersten Attribut des Blocks startet, was bei vielen Attributen leicht zu Fehlern führt. Ich müsste es irgendwie schaffen auch das geklickte Attribut an _eattedit zu übergeben. Unten ein paar Programzeilen dazu: Sub Blockdoppelklick () . . . Entity = ThisDrawing.PickfirstSelectionSet.Item(0) Entity.GetXData("", xtypeOut, xdataOut) If xdataOut(0) <> "TheosBezeichnung" Then ThisDrawing.SendCommand("_eattedit") Exit Sub End If . . . Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 18. Nov. 2010 10:43 <-- editieren / zitieren -->
Hi, kurz in LISP die Vorgehensweise (weil's weniger Zeilen sind), wie _EATTEDIT bedient werden kann, damit das richtige Attribut im Dialog aktiviert ist: Befehl: (setq myATT (nentsel)) ==> da zeigst Du mal ein Attribut Deines Blocks dann: Befehl: _EATTEDIT Wählen Sie einen Block: !myATT Rückschluß daraus: übergibst Du dem Befehlsaufruf das Attributsobjekt, dann bekommst Du das richtige Attribut. Probiers mal. In dotNET musst Du jetzt 'nur noch' herausfinden, welches Attribut des Blocks unter dem zuletzt geklickten Punkt liegt. - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 18. Nov. 2010 11:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, da hab ich schon viel darüber nach gedacht. Aber _eattedit fragt nach gar keinem Attribut, wenn vorher schon ein Block ausgewählt war. Da vor pickfirst ausschalten und danach wieder ein? Oder Pickfirst-Auswahlsatz löschen, geht das? Wie krieg ich den zuletzt geklickten Punkt heraus? Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 18. Nov. 2010 11:33 <-- editieren / zitieren -->
Hi, >> Wie krieg ich den zuletzt geklickten Punkt heraus? ich fürchte, Du musst Dir aus der aktuellen Cursorposition den Punkt ausrechnen. Es gäbe zwar die Variable LASTPOINT, die stellt aber nicht den Punkt des Doppelklicks, sondern den letzten Konstruktionspunkt dar. Pickfistselection vorher kübeln wird notwendig sein, sonst verlangt der Befehl _EATTEDIT keine Objektwahl mehr. - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 18. Nov. 2010 14:23 <-- editieren / zitieren --> Unities abgeben:
"ich fürchte, Du musst Dir aus der aktuellen Cursorposition den Punkt ausrechnen." Hallo Alfred, kannst Du mir dabei helfen. ich finde da keinen Ansatz der irgendwie erfolg versprechend wäre. Gruß, Theo
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 18. Nov. 2010 15:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, ein ganz anderer Ansatz des Problemes wäre der Code unten. Damit funktioniert es. Könntest Du mir das bitte nach VB.Net übersetzen. Dort ist es leider nicht so einfach wie in VBA. Thisdrawing Private Sub AcadDocument_BeginDoubleClick(ByVal PickPoint As Variant) ThisDrawing.SetVariable "LastPoint", PickPoint End Sub Mein anderer Code würde dann lauten:
<Autodesk.AutoCAD.Runtime.CommandMethod("Blockdoppelklick", Autodesk.AutoCAD.Runtime.CommandFlags.UsePickSet)> _ Public Sub Blockdoppelklick() Dim Point As Object Dim Pointcommand As String Dim xtypeOut As Object Dim xdataOut As Object Dim Entity As AcadEntity Dim Attris As Object On Error Resume Next Entity = ThisDrawing.PickfirstSelectionSet.Item(0) Entity.GetXData("", xtypeOut, xdataOut) If xdataOut(0) <> "HermannsBezeichnung" Then ThisDrawing.PickfirstSelectionSet.Clear() ThisDrawing.SendCommand("_eattedit ") Point = ThisDrawing.GetVariable("LastPoint") Pointcommand = Point(0).ToString & "," & Point(1).ToString & "," & Point(2).ToString ThisDrawing.SendCommand(Pointcommand & " ") Exit Sub End If Baseblock = Entity . . . Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 19. Nov. 2010 10:25 <-- editieren / zitieren -->
Hi, ich bin nicht überzeugt, dass es gut ist, wenn jeder Doppelklick von Deiner App abgefangen wird. Die Variable umsetzen ist zwar nicht AutoCAD-konform (ist die nicht eigentlich ReadOnly?), aber wenn es geht. Das Schreiben eines Document-bezogenen Eventhandlers geht nicht so in 2min, da brauchst Du das Handling aller Documents.XXX dazu (öffnen, schließen, aktivieren, minimieren, ...). Es gibt eben kein 'ThisDrawing'-Objekt, das immer die Events aus der aktuellen DWG holt (egal, welche DWG gerade aktuell ist bzw. gemacht wurde). Hoffe, am Wochenende. - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 19. Nov. 2010 11:52 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, Lastpoint zu überschreiben ist sicher keine so gute Idee. Was könnte ich sonst verwenden um den Punkt zu retten? ThisDrawing.SummaryInfo.SetCustomByKey("Klickunkt", PunktalsString) Würde auch gehen. Wäre echt gut wenn Du am WE Zeit für eine kurze Erklärung finden würdest. Ich hätte gern alles auf VB.Net, weil ja VBA bald nicht mehr unterstützt wird. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Nov. 2010 00:33 <-- editieren / zitieren -->
Hi, Zeit ist momentan nicht, mit Kommentar im Code ist jetzt einfach nicht. Es würde ohne Kommentar wohl nicht gut gehen, Du solltest ja verstehen, wie Du mein Beispiel in Deinen Code einbaust. Wenn Du es selbst probieren willst: hauptsächliche Hürde ist der Ersatz des im VBA gültigen 'ThisDrawing'-Objekts, das im Gegensatz zu ARX/dotNET immer das gerade aktuelle DWG zeigt bzw. daran gebundene Events auch nach Wechsel/Öffen/Aktivieren eines DWG's eben immer auf das DWG im Vordergrund wirkt. Du findest aber Beispiele für Eventhandling, grad rausgesucht, im ObjectARX-Kit unter samples\dotNet\EventsWatcher HTH, - alfred - ------------------ www.hollaus.at |
Ex-Mitglied
|
erstellt am: 23. Nov. 2010 22:01 <-- editieren / zitieren -->
Hi, so, anbei ein kleines Projekt, das Beispiel für Applikations-Events und ThisDrawing-Ersatz (plus -events) zeigt. - alfred - PS: ich mach das hier freiwillig, kostenlosen Code wünschen ist OK, 'Erinnerung' per PM hilft da nicht, wenn sich's nicht ausgeht, dann geht sich's nicht aus! PPS: Du solltest Dir aber auch für Dein Projekt Gedanken machen, was passiert, wenn ein Anwender nicht mit Doppelklick die Attribute bearbeitet, sondern einfach durch Änderung der Attribute im Eigenschaftsfenster. Da kommt dann kein DoubleClick. ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 24. Nov. 2010 09:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, meinen Respekt für das was Du kannst und was Du hier kostenlos machst. Ich weiß das durchaus zu schätzen. Danke für Dein Projekt, schau ich mir jetzt gleich mal an. Das mit der rechten Maustaste ist wirklich ein Problem. Wenn man z.B. den Befehl einfach mit der rechten Maustaste wiederholt dann geht der ganz normale Attributseditor auf. Ich denke ich kann nicht alle Möglichkeiten abfangen. Ich will meine Leute hier auch nicht zu sehr bevormunden, sondern nur Hilfen geben "das Richtige" einzugeben. Und der Doppelklick ist schon mal ein guter Anfang. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|