| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Problem mit Block insert (2119 mal gelesen)
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2019/2020 CAD+T 2020 HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 31. Okt. 2012 12:24 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen! Bin dabei mich in .Net einzuarbeiten und probier gerade einen Block mittels Einfügepunkt einzufügen. In VB.Net erscheinen keine Fehlermeldungen, .NET Framework 3.5 ist eingestellt. Ruf ich das Programm in AutoCAD auf, so kann ich noch den Einfügepunkt festlegen und dann bricht das Programm bzw. AutoCAD ab. (siehe auch Bildchen / Fehlermeldung)
Code:
Imports SystemImports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Windows Public Class MyCommand <CommandMethod("Blockinsert")> Public Sub MyCommand() Dim BlockFile As String BlockFile = "D:\Konstruktion\AutoCAD\Bloecke_Artikel\300\TBHäf-110°-0_D.dwg" Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim ed As Editor = acDoc.Editor Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() Try Dim acBlkTbl As BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) Dim acBlkTblRec As BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite) Dim PPResu As PromptPointResult Dim instPkt(2) As Double Dim PPOpt As PromptPointOptions = New PromptPointOptions("") PPOpt.Message = vbLf & "Einfügepunkt festlegen: " PPResu = ed.GetPoint(PPOpt) instPkt(0) = PPResu.Value.X : instPkt(1) = PPResu.Value.Y : instPkt(2) = PPResu.Value.Z Dim db As Database = New Database(False, False) db.ReadDwgFile(BlockFile, IO.FileShare.Read, True, "") Dim ArtikelBlock As ObjectId ArtikelBlock = acDoc.Database.Insert(BlockFile, db, False) Dim ArtikelBlockRef As BlockReference = New BlockReference(New Autodesk.AutoCAD.Geometry.Point3d(instPkt), ArtikelBlock) acBlkTblRec.AppendEntity(ArtikelBlockRef) acTrans.AddNewlyCreatedDBObject(ArtikelBlockRef, True) acTrans.Commit()
Catch Ex As Autodesk.AutoCAD.Runtime.Exception Application.ShowAlertDialog("The following exception was caught:" & _ vbLf & Ex.Message) Finally Application.ShowAlertDialog("End of command reached") End Try
End Using End Sub End Class
Kann mir jemand dabei Helfen, woran es liegt? Wie müßte der Code denn richtig lauten? Vielen Dank im Voraus.
------------------ Gruß Dirk 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: 02. Nov. 2012 09:10 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Hallo Dirk, meine Standard-Routine für diese Aufgabe sieht wie folgt aus. Musst du mal vergleichen.
Code:
// _Blockdatei = kompletter Pfad+Dateiname der einzufügenden Zeichnung // _BlockFileBaseName = Dateiname ohne Pfad ohne Dateierweiterung using (Database tempDb = new Database(false, true)) { try { tempDb.ReadDwgFile(_Blockdatei, System.IO.FileShare.Read, true, null); _db.Insert(_BlockFileBaseName, tempDb, false); _erg = true; } catch { } }
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 |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2019/2020 CAD+T 2020 HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 06. Nov. 2012 13:28 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger! Danke für die Info. Das Kernproblem waren jedoch einige fehlerhafte Blöcke. Nach dem ich diese mit "WHERST" geprüft und wieder hergestellt habe funktioniert es auch mit diesen Blöcken. Unter VBA habe ich solch ähnliche Fehlermeldungen mit On Error ... abfangen können, bevor AutoCAD abstürzte. Wie kann man solche Fehlermeldungen denn unter VB.Net abfangen? Könntest Du mir dazu einen Tipp geben. ------------------ Gruß Dirk 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: 06. Nov. 2012 17:18 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2019/2020 CAD+T 2020 HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 06. Nov. 2012 21:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger! Ich habs schon mal so probiert, jedoch ohne Erfolg:
Code:
'... '...weiter: Catch ex As Autodesk.AutoCAD.Runtime.Exception Dim result As DialogResult = MessageBox.Show _ (ex.Message, "Fehlermeldung", MessageBoxButtons.YesNo, _ MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) Select Case result Case Forms.DialogResult.Yes Exit Sub Case Forms.DialogResult.No GoTo weiter End Select Finally End Try
Könntest Du davon etwas ableiten? ------------------ Gruß Dirk 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: 06. Nov. 2012 23:31 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
... was soll ich davon ableiten? Versuch es doch einfach mal mit einer Division durch Null. 1/0 wirst du nicht direkt hinschreiben können, weil das der Compiler schon merkt. Du musst das also in Variablen packen, damit der Fehler auch tatsächlich ausgelöst wird und in den catch Bereich springt. 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 |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2019/2020 CAD+T 2020 HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 13. Nov. 2012 13:52 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen! Ich habe noch so meine Probleme mit dem BlockTable und BlockTableRecord. Es wäre schön, wenn mir da jemand auf die Sprünge helfen könnte. Einen Block von extern einzufügen funktioniert. Wenn ich aber nun einen Block direkt in der aktuellen Zeichnung erstelle und diesen über einen Einfügepunkt am Bildschirm einfügen möchte, funktioniert es nicht. Daher meine Frage, wo liegt hier der Fehler und was mus ich wie ändern? Code:
<CommandMethod("bt")> Public Sub BlockTest() Dim acDoc As Document = DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim ed As Editor = acDoc.Editor Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction Dim TBlesen As BlockTable = acCurDb.BlockTableId.GetObject(OpenMode.ForWrite) Dim TBschreiben As BlockTableRecord = acCurDb.BlockTableId.GetObject(OpenMode.ForWrite) If TBlesen.Has("CircleBlock2") = True Then MsgBox("Diesen Block gibt es bereits", MsgBoxStyle.Information) Exit Sub End If Dim myNewBlock As New BlockTableRecord myNewBlock.Name = "CircleBlock2" Dim myCircle As New Circle(Point3d.Origin, Vector3d.ZAxis, 1.5) myCircle.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.None, 10) Dim myCircle1 As New Circle(Point3d.Origin, Vector3d.ZAxis, 2.5) myCircle1.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.None, 50) Dim myCircle2 As New Circle(Point3d.Origin, Vector3d.ZAxis, 3.5) myCircle2.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.None, 9) Dim myCircle3 As New Circle(Point3d.Origin, Vector3d.ZAxis, 4.5) myCircle3.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.None, 140) myNewBlock.AppendEntity(myCircle) myNewBlock.AppendEntity(myCircle1) myNewBlock.AppendEntity(myCircle2) myNewBlock.AppendEntity(myCircle3) TBlesen.Add(myNewBlock) acTrans.AddNewlyCreatedDBObject(myNewBlock, True) '--Den Einfügepunkt am Bildschirm bestimmen--!! Dim PPResu As PromptPointResult Dim instPkt(2) As Double Dim PPOpt As PromptPointOptions = New PromptPointOptions("") PPOpt.Message = vbLf & "Einfügepunkt festlegen: " PPResu = ed.GetPoint(PPOpt) instPkt(0) = PPResu.Value.X : instPkt(1) = PPResu.Value.Y : instPkt(2) = PPResu.Value.Z '---------------------------------------------- ''--Einfügen des zuvor erzeugten Blocks--!! Dim myBlockRef As New BlockReference(New Point3d(instPkt), TBschreiben("CircleBlock2")) TBschreiben.AppendEntity(myBlockRef) acTrans.AddNewlyCreatedDBObject(TBschreiben, True) '----------------------------------------- acTrans.Commit() End Using End Sub
Vielen Dank im Voraus.
------------------ Gruß Dirk 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: 13. Nov. 2012 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Zitat: Original erstellt von Dirk.B:
Dim TBschreiben As BlockTableRecord = acCurDb.BlockTableId.GetObject(OpenMode.ForWrite) ... Dim myBlockRef As New BlockReference(New Point3d(instPkt), TBschreiben("CircleBlock2"))
TB-Schreiben ist vom Typ ein BlockTablerecord. Ich denke nicht, dass du über das Objekt die ObjectId des CircleBlock2 bekommst. Anmerkung: Deine Namensgebung der Variablen ist für das Lesen deines Beitrags nicht ideal. Warum öffnest due die BlockTable 2 mal? (einmal TBlesen und einmal bei TBschreiben) 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 |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|