| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blockeinfügewinkel (1096 mal gelesen)
|
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 09. Feb. 2011 00:53 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 09. Feb. 2011 16:07 <-- editieren / zitieren -->
Hi, die Blockreference hat eine Eigenschaft '.Rotation', das ist der Einfügewinkel in Radiant, bezogen auf 0-Richtung = Osten und Drehrichtung gegen Uhrzeigersinn. - alfred - ------------------ www.hollaus.at |
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 09. Feb. 2011 21:02 <-- editieren / zitieren --> Unities abgeben:
Hallo, Habe volgenden Code probiert. Public Sub BlockWinkel() On Error Resume Next Dim Pickedpoint As Object Dim Winkel As Double Dim Bref As AcadBlockReference Pickedpoint = Nothing With ThisDrawing.Utility .GetEntity(Bref, Pickedpoint, vbCrLf & "bitte Block wählen") If Bref.Name = "Unterkante" Then Winkel = Grad(Bref.Rotation) MsgBox("der Winkel beträgt: " & vbCrLf & vbCrLf & " " & Format(Winkel, "#0.0"), MsgBoxStyle.OkOnly, "Winkel") End If End With End Sub Ich möchte nicht den Block mit der Maus wählen, er soll automatisch von der Zeichnung ausgelesen werden. Ausserdem wenn die Bedingung bei if nicht Wahr ist, wird trotzdem die MsgBox angezeigt (aber mit falschen Winkel) Grad ist die Umrechnung von Bogenmaß auf Grad - das funktioniert übrigens. besten Dank im Voraus mfg DrCNC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Feb. 2011 16:55 <-- editieren / zitieren -->
Hi, da kommen wir nur weiter, wenn Du auch die Zeichnung herzeigen könntest, denn sonst weiss niemand, wieso Du meinst, dass der falsche Winkel angezeigt wird, wir wissen ja nichtmal, wie der Block eingesetzt ist und wieso Du meinst, die Anzeige wäre falsch. Dass das Statement If Bref.Name = "Unterkante" Then zulässt, dass trotzdem die MsgBox kommt, kann nur daran liegen, dass Du oben 'On Error Resume Next' gesetzt hast, beim 'If ...' dann ein Fehler zustandekommt, dann springt der Code in der Fortführung halt dort hinein. Wie kann das passieren: Bei der Abfrage '.GetEntity(...' wurde keine BlockReference gezeigt, damit liefert die Evaluierung von Bref.Name eine Exception. Nur mal als Vermutung. In dotNET ist für Fehlerbehandlung
Code: Try ... Catch ... End Try
vorzuziehen, das 'On Error Resume Next' gleich mal in die Schublade unter 'Vergangenheitsbewältigung' abgelegen. Die Umgewöhnung brauchst es zwar, ist aber um ein Vielfaches besser. HTH, - alfred - ------------------ www.hollaus.at |
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 12. Feb. 2011 22:29 <-- editieren / zitieren --> Unities abgeben:
Guten Abend! Besten Dank für die Anregung und habe den Code wie folgt abgeändert. Public Sub BlockWinkel() Dim Pickedpoint As Object Dim Winkel As Double Dim Bref As AcadBlockReference Pickedpoint = Nothing Try With ThisDrawing.Utility .GetEntity(Bref, Pickedpoint, vbCrLf & "bitte Block wählen") If Bref.Name = "Unten" Then Winkel = Grad(Bref.Rotation) MsgBox("der Winkel beträgt: " & vbCrLf & vbCrLf & " " & Format(Winkel, "#0.0"), MsgBoxStyle.OkOnly, "Winkel") Else MsgBox("Der Block heißt nicht >>> Unten <<<.") End If End With Catch MsgBox("keinen Block gewählt") End Try End Sub Funkioniert bestens, aber ich möchte nicht mit der Maus den Block wählen, sondern es soll automatisch der Block mit den bestimmten Namen gewählt werden. Die Zeichnung ist eine ganz normale, in diesem Fall mit dem Block "Unten". Dieser Block ist nur ein Hinweispfeil. Die Fehlerbehandlung mit Try.. Catch.. End Try habe ich auch jetzt einigermaßen kapiert. Funktioniert eigendlich ganz Super. Besten Dank noch einmal mfg Johann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Feb. 2011 22:35 <-- editieren / zitieren -->
Hi, >> ich möchte nicht mit der Maus den Block wählen, sondern es soll automatisch der Block >> mit den bestimmten Namen gewählt werden Dann musst Du zuerst ein SelectionSet machen, mit Filter auf Objekttyp=BlockReference und Blocknamen="Unten". Nachfolgend entscheiden, ob das SelectionSet welche gefunden hat und wenn ja, dann die Items im SelectionSet durchlaufen. Der Block namens 'Unten' könnte ja mehrfach in der Zeichnung eingesetzt sein. Beispiel für SelectionSet z.B. >>>hier<<<, sind aber auch viele andere zu finden. - alfred - ------------------ www.hollaus.at |
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 14. Feb. 2011 23:31 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred! Besten Dank für deine Hilfe, dieser Code funktioniert bereits. Public Function BlockWinkel(ByVal Blockname) Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim TrAct As DatabaseServices.Transaction = Nothing Dim tAcadDoc As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() Dim acLyrTbl As BlockTable acLyrTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) If Not acLyrTbl.Has(Blockname) Then MsgBox("Es gibt keinen Block mit den Namen:" & vbCrLf & Blockname) Else Dim tSelSet As EditorInput.SelectionSet = getObjectsOnBlock(tAcadDoc.Editor, TrAct, Blockname) If tSelSet IsNot Nothing Then For I = 1 To tSelSet.Count Dim myBRef As DatabaseServices.BlockReference myBRef = tSelSet(I - 1).ObjectId.GetObject(DatabaseServices.OpenMode.ForRead) MsgBox("Es gibt einen Block mit den Namen " & myBRef.Name) MsgBox("Einfügewinkel: " & Grad(myBRef.Rotation)) BlockWinkel = Grad(myBRef.Rotation) Next MsgBox("Es gibt: " & tSelSet.Count & "Block (Blöcke)" & vbCrLf & "mit den Namen " & Blockname) Else MsgBox("Es gibt keinen Block mit den Namen:" & vbCrLf & Blockname) End If End If End Using End Function getObjectsOnBlock ist eine Funktion von dir mfg Johann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 14. Feb. 2011 23:57 <-- editieren / zitieren -->
Hi, Vorsicht! Dieser Code:
Code: tSelSet(I - 1).ObjectId.GetObject(DatabaseServices.OpenMode.ForRead)
öffnet ein Objekt zum Lesezugriff ohne TransAction, also eigentlich mit einer Methode, die AutoCAD zwar zulässt, aber ein Relikt aus der Vergangenheit ist. Solange Du es nur zum Lesen so öffnest, ist es noch halbwegs OK. Aber ich warne vor dieser Methode, wenn Du ja doch eine TransAction eröffnet hast, das endet irgendwann in 'System Exception' und die findest Du dann im fortgeschrittenen Zustand Deiner App so gut nie wieder. Also bitte die TransAction nutzen zum Öffnen eines Lese- oder Schreibzugriffs auf ein Datenbankelement. >> getObjectsOnBlock ist eine Funktion von dir
Interessant, aber von mir zumindest so nicht genannt. Für Nachlesende wäre vorteilhaft, mit einen Link dorthin zu verweisen. (Dann können diese auch Dein Beispiel als Vorlage nutzen) Schönen Abend, - alfred - ------------------ www.hollaus.at |
DrCNC Mitglied
Beiträge: 96 Registriert: 04.01.2011
|
erstellt am: 15. Feb. 2011 20:03 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|