| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Einfügen externer Blöcke in die Zeichnung (1701 mal gelesen)
|
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 20. Jun. 2015 14:00 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe folgendes Problem. Ich möchte den Nutzer über ein Formular einen Block auswählen lassen, der dann geladen werden soll. Der Aufruf/Beginn meines Programms erfolgt in der myCommands-Klasse so: [CommandMethod("CreateGroups")] static public void CreateGroups() { FormWoFlV myForm1 = new FormWoFlV(); myForm1.Show(); } Es gibt also nur den Einstiegspunkt und die Weiterleitung zum Formular (Formularklasse). In der Formularklasse wird dann folgendes gemacht: Database TempDB = new Database(false, true); Transaction acTrans = db.TransactionManager.StartTransaction(); using (acTrans) { BlockTable acBlockTable = (BlockTable)acTrans.GetObject(db.BlockTableId, OpenMode.ForRead); if (!acBlockTable.Has(blockName) && (System.IO.File.Exists(acPfad_RaumName))) { using (TempDB) { TempDB.ReadDwgFile(acPfad_RaumName, System.IO.FileShare.Read, true, ""); db.Insert(blockName, TempDB, true); MessageBox.Show(acBlockTable.Has(blockName) + " " + blockName + " geladen."); } } } acTrans.Dispose(); Das Einfügen erfolgt nicht direkt in die aktuelle Datenbank, sondern erst in eine temporäre Datenbank. Das Problem ist, dass mein Programm beim Insert-Befehl abbricht. Wenn ich diesen Code nicht "extern" in einer Formularklasse habe, sondern "direkt" nach dem Aufruf "CreateGroups" aufrufe (mit statischen Werten), funktioniert alles. Warum funktioniert es nicht aus der Formularklasse heraus? Gruß Andreas
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 20. Jun. 2015 21:35 <-- editieren / zitieren --> Unities abgeben: Nur für AndreasM2000
Zitat: Das Problem ist, dass mein Programm beim Insert-Befehl abbricht
Was bedeutet "bricht ab" genau? Gibt es im Code eine Exception (wenn ja welche) oder wird es einfach nicht ausgeführt und der Code macht so, also wäre alles ok? oder ...? Oftmals, wenn eine direkte Ausführung eines Codes innerhalb einer Command-Definition läuft, der Aufruf aber von einem Form (daher ohne Command) scheitert, wäre das dass aktuelle Document gelockt werden müsste. Es käme dann aber eine entsprechende Exception (eLockViolation), ob das bei Deinem Code zutreffen könnte oder nicht, kann ich nicht sagen, denn es steht in dem Codeschnippsel keine Info über die verwendete Variable "Db", weder wie diese deklariert noch referenziert wurde. Ein wenig mehr Info würde helfen (eben was genau wo passier). ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 21. Jun. 2015 00:05 <-- editieren / zitieren --> Unities abgeben:
ja, es bricht genau mit der genannten Exception (eLockViolation) ab. Die Variable db ist so definiert: Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Was bedeutet, das dass aktuelle Document gelockt werden müsste? Was muss ich dazu machen? Gruß Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 21. Jun. 2015 00:23 <-- editieren / zitieren --> Unities abgeben: Nur für AndreasM2000
dim tDocLock as ApplicationServices.DocumentLock tDocLock = doc.LockDocument '...then create your transaction and run the code '...your code '...after transaction is disposed: tDocLock.Dispose tDocLock = nothing (kann auch mit using/end using verwendet werden) ------------------
[Diese Nachricht wurde von Ingenieur Studio HOLLAUS am 21. Jun. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 21. Jun. 2015 11:04 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 21. Jun. 2015 11:07 <-- editieren / zitieren --> Unities abgeben: Nur für AndreasM2000
Hallo Andreas, neben dem, was Ingenieur Studio HOLLAUS bereits geschrieben hat, möchte ich noch eine Empfehlung los werden: Du solltest den Befehlsaufruf, die Benutzereingaben und die Arbeitsfunktionen trennen. Dann ist der Code modular, den du in den verschiedenen Ableitungen wieder verwenden kannst. Einen Befehlsaufruf kann es mit/ohne Dialog geben, als Lisp-Funktion mit direkter Parameterübergabe geben und/oder auch als Batchfunktion geben, die dann auf viele Zeichnungen angewandt werden kann. Je nachdem, wie nun die eigentliche Funktion gestartet wird, sind Benutzereingaben möglich, im Scriptbetrieb nur in der Befehlszeile oder im Normalaufruf eben im Dialog, beim Aufruf mittels Lisp-Funktion überhaupt nicht erforderlich. In allen Fällen kann aber die gleiche Arbeitsfunktion ausgeführt werden. Noch ein weiterer Hinweis: Die Dialoge solltest du im AutoCAD-Context aufrufen: Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(FRM); Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 21. Jun. 2015 12:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, ja, die Trennung habe ich auch vor bzw. auch schon angelegt in 3 Klassen. Der Programmnutzer soll üblicherweise das Programm in einer Folge von Aufrufen benutzen. Die Eingabe von Informationen und Einstellungen im Formular soll nur am Anfang und bei Bedarf erfolgen, also nicht immer notwendig sein. Dazu sollen die einmal gemachten Eingaben im Formular erhalten bleiben, indem das Formular ausgeblendet, aber aktiv bleibt und nicht jedesmal gestartet wird. Gibt es einen expliziten Vorteil, wenn .ShowModalDialog(FRM) benutzt wird? Ob ich das Formular Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(myForm1); myForm1.ShowDialog(); oder myForm1.Show(); aufrufe, sieht es für mich erstmal immer gleich aus. Gruß Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 21. Jun. 2015 12:56 <-- editieren / zitieren --> Unities abgeben: Nur für AndreasM2000
|
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 21. Jun. 2015 13:35 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 21. Jun. 2015 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für AndreasM2000
Zitat: Original erstellt von AndreasM2000: ... Dazu sollen die einmal gemachten Eingaben im Formular erhalten bleiben, indem das Formular ausgeblendet, aber aktiv bleibt und nicht jedesmal gestartet wird. ...
Für derlei Geschichten solltest du das Thema Binding anschauen. Wir kombinieren das mit WPF(XAML)-Dialogen. Das Laden und Anzeigen eines Dialoges ist ja kein zeitintensiver Akt. Erstell dir eine Klasse, die die Daten des Dialogs als Eigenschaften enthält. Via Binding, kannst du die Steuerelemente des Formulars mit den Eigenschaften dieser Klasse verknüpfen. Änderungen der Benutzereingaben werden dann auch direkt in der aktuellen Instanz der Klasse gespeichert. Dafür musst du nur den Datakontext auf die Klasseninstanz setzen, den Rest erledigt dann das Framework (nahezu vollständig). Mit dieser Technologie kannst du den Dialog innerhalb einer AutoCAD--Sitzung wiederholt aufrufen, und er zeigt immer die letzten Eingaben an (vorausgesetzt die Klasseninstanz ist als static deklariert, so dass die nach dem Befehlsdurchlauf erhalten bleibt). Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 24. Jun. 2015 07:37 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, vielen Dank für den Hinweis. Habe das auch mal probiert. Eine WPF-Anwendung mit Datenbindung habe ich auch schon zum Laufen gebracht. Jetzt muss ich noch AutoCAD dazu bringen das ganze anzuzeigen. Dazu habe ich ein neues Klassenbibliotheks-Programm angelegt, um später die dll über netload starten zu können. Dann habe ich die Autodesk Verweise gesetzt und ein Usercontrol-XAML Objekt erzeugt und eine Klasse, die die Datenbindung auswertet. Erstmal alles so wie in meiner lauffähigen WPF-Applikation. Jetzt will ich den WPF-Content mit Hilfe eines AutoCAD-Befehls Aufrufes [CommandMethod("Test")] starten. Weiß aber dann nicht wie. Geht das überhaupt so oder muss ich mich mit den Ribbons "anfreunden"? Gruß Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 24. Jun. 2015 08:37 <-- editieren / zitieren --> Unities abgeben: Nur für AndreasM2000
Hallo Andreas, Ribbons haben damit nichts zu tun. Entweder du möchtest das permanent angezeigt haben, dann ist ein Panel das Mittel der Wahl oder du willst einfach den Dialog beim Befehlsaufruf anzeigen und wieder schließen, dann ist ein kleiner Umweg über Windows.Forms notwendig. Ich gehe davon aus, dass du ein WPF-UserControl hast --> ucWPF Als Dialog: 1. Form erstellen 2. Form ein ElementHost-Control hinzufügen 3. Form Constructor so ändern, dass du das ucWP als Aufrufparameter übergeben kannst 4. Im Form Constructor dem ElementHost-öControl das ucWPF als Child-Eigenschaft setzen Das Form kannst du wie oben beschrieben anzeigen. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 25. Jun. 2015 07:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, Erstmal vielen Dank!! Es ist genau der Weg... Ein Problem habe ich immer noch. Beim CommandMethod-Aufruf will er jetzt auch das ucWPF- Objekt haben, dass er dann aber nicht kennt. Wie kann ich es bekannt machen? Wie muss ich die Übergabe richtig machen? Sonst scheint alles zu funktionieren. Ich habe das ElementHost-Objekt mit einem direkt im Konstruktor erzeugten WPF-Objekt beim Aufruf der Form schon gesehen... Gruss Andreas namespace ClassLibrary1 { public partial class Form1 : Form { public Form1(UserControl1 ucWPF) { InitializeComponent(); System.Windows.Forms.Integration.ElementHost en = new System.Windows.Forms.Integration.ElementHost(); en.Width = 200; en.Height = 200; this.Controls.Add(en); en.Child = ucWPF; } private void Form1_Load(object sender, EventArgs e) { } } public class class2 { [CommandMethod("test")] public void test() { Form1 myForm = new Form1(ucWPF); //hier kennt er nicht das Objekt ucWPF myForm.Show(); } } } Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 25. Jun. 2015 07:32 <-- editieren / zitieren --> Unities abgeben: Nur für AndreasM2000
|
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 26. Jun. 2015 05:53 <-- editieren / zitieren --> Unities abgeben:
|