| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Linie zeichnen (1133 mal gelesen)
|
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 05. Dez. 2008 14:59 <-- editieren / zitieren --> Unities abgeben:
Hi, ich bin langsam am Verzweifeln. Ich lasse den Benutzer Objekte auswählen, das können Blöcke, Polylinien, u.s.w. sein. Diese löse ich dann so lange auf, bis die Objekte nur mehr Linien sind --> myObject.Explode(newOjectsCreated) Das funktioniert auch. Da ich aber gesehen habe, dass die Objekte in der Zeichnung selbst nicht aufgelöst werden wollte ich die bestehenden Objekte löschen und dann die Linien nachzeichnen. Für das Zeichnen der Linien habe ich folgende Funktion geschrieben:
Code:
Public Structure entityList Dim id As Long Dim entity As Object Dim groupName As String Dim startPoint As Point3d Dim endPoint As Point3d End Structure'Zeichnet alle Linie die in der Entitliste gespeichert sind Public Sub drawLines(ByVal linesToDraw() As entityList) Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager 'start a transaction Dim ta As Transaction = tm.StartTransaction() Dim bt As BlockTable = tm.GetObject(db.BlockTableId, OpenMode.ForRead, False) Dim btr As BlockTableRecord = tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False) Dim myLine As Line Dim myLineID As ObjectId Try For i As Long = 0 To linesToDraw.Length - 1 MsgBox("Startpunkt der Linie:" & vbNewLine & linesToDraw(i).startPoint.X & vbNewLine & linesToDraw(i).startPoint.Y _ & vbNewLine & linesToDraw(i).startPoint.Z & vbNewLine & vbNewLine & linesToDraw(i).endPoint.X & vbNewLine _ & linesToDraw(i).endPoint.Y & vbNewLine & linesToDraw(i).endPoint.Z) myLine = New Line(linesToDraw(i).startPoint, linesToDraw(i).endPoint) myLineID = btr.AppendEntity(myLine) tm.AddNewlyCreatedDBObject(myLine, True)
Next ta.Commit() Catch ex As Exception MsgBox("Fehler: " + ex.Message) Finally ta.Dispose() End Try End Sub
Um sicher zu gehen, dass in meiner Liste auch gültige Werte drinnen sind, habe ich die mal mit einer MsgBox ausgeben lassen. Und da stehen in der Tat gültige Werte drinnen. Mein Problem: Ich kriege keine Fehlermeldung aber die Linien werden trotzdem nicht gezeichnet. Was mache ich da falsch? ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Dez. 2008 15:13 <-- editieren / zitieren -->
Hi Benny, die Linien müssen nicht nur in die Datenbank geschrieben werden (was mit tm.Commit bestätigt wird), sondern die Linien müssen auch wissen, wohin sie gehören, z.B. ModelSpace!!! - alfred - |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 05. Dez. 2008 15:39 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 05. Dez. 2008 15:54 <-- editieren / zitieren -->
Hi, sorry vielmals, die Zeile habe ich im wahrsten Sinne des Wortes 'überflogen', da hast Du natürlich recht. Dann sehe ich aber in Deinem Codeschnippsel keinen (offensichtlichen) Fehler. Nur eine Situation würde ich vermeiden, auch in Hinblick auf geschachtelte TransActions (vielleicht ist es das auch schon): Du verwendest manchmal tm (TransActionManager) und manchmal ta (TransAction), ich brauche den TransActionManager nur zum Starten einer TransAction, dann nie wieder, alles andere läuft dann mit dieser TransAction. Also hätte ich wie folgt getauscht (tm ==> ta): Code: Dim ta As Transaction = tm.StartTransaction() Dim bt As BlockTable = ta.GetObject(db.BlockTableId, OpenMode.ForRead, False) Dim btr As BlockTableRecord = ta.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False) Dim myLine As Line Dim myLineID As ObjectId Try For i As Long = 0 To linesToDraw.Length - 1 MsgBox("Startpunkt der Linie:" & vbNewLine & linesToDraw(i).startPoint.X & vbNewLine & linesToDraw(i).startPoint.Y _ & vbNewLine & linesToDraw(i).startPoint.Z & vbNewLine & vbNewLine & linesToDraw(i).endPoint.X & vbNewLine _ & linesToDraw(i).endPoint.Y & vbNewLine & linesToDraw(i).endPoint.Z) myLine = New Line(linesToDraw(i).startPoint, linesToDraw(i).endPoint) myLineID = btr.AppendEntity(myLine) ta.AddNewlyCreatedDBObject(myLine, True)
Next ta.Commit() Catch ex As Exception MsgBox("Fehler: " + ex.Message) Finally ta.Dispose() End Try
- alfred -
[Diese Nachricht wurde von a.n. am 05. Dez. 2008 editiert.] |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 05. Dez. 2008 16:20 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, hat leider auch keinen Unterschied ausgemacht. Das allerkomischste, wenn ich das mal so nenne darf, an der Sache ist folgendes: Ich lasse mir mittels der MsgBox die Koordinaten auch ausgeben um sicher zu stellen dass da auch was vernünftiges drinnen ist. Und da sehe ich, wie die Linien gezeichnet werden. Nur sobald ich bei der letzten MsgBox OK klicke ist alles wieder weg... Sehr kurios... ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Dez. 2008 16:38 <-- editieren / zitieren -->
Hi Benny, wenn Du nach dem Vorgang mal alle Layer taust/einschaltest, allen Elementen Farbe 'vonLayer' gibst, sind diese auch nicht sichtbar? - alfred - |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 05. Dez. 2008 17:04 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|