Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Blockeinfügewinkel

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



Sehen Sie sich das Profil von DrCNC an!   Senden Sie eine Private Message an DrCNC  Schreiben Sie einen Gästebucheintrag für DrCNC

Beiträge: 96
Registriert: 04.01.2011

erstellt am: 09. Feb. 2011 00:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Möchte mit VB.net den Einfügewinkel eines bestimmten Blockes abfragen.
Kann mir jemand helfen.
besten Dank im Voraus!
DrCNC

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 09. Feb. 2011 16:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von DrCNC an!   Senden Sie eine Private Message an DrCNC  Schreiben Sie einen Gästebucheintrag für DrCNC

Beiträge: 96
Registriert: 04.01.2011

erstellt am: 09. Feb. 2011 21:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von DrCNC an!   Senden Sie eine Private Message an DrCNC  Schreiben Sie einen Gästebucheintrag für DrCNC

Beiträge: 96
Registriert: 04.01.2011

erstellt am: 12. Feb. 2011 22:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von DrCNC an!   Senden Sie eine Private Message an DrCNC  Schreiben Sie einen Gästebucheintrag für DrCNC

Beiträge: 96
Registriert: 04.01.2011

erstellt am: 14. Feb. 2011 23:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von DrCNC an!   Senden Sie eine Private Message an DrCNC  Schreiben Sie einen Gästebucheintrag für DrCNC

Beiträge: 96
Registriert: 04.01.2011

erstellt am: 15. Feb. 2011 20:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,
Nachtrag:
Habe die Funktion für Block abgändert, sonst ist er von dir
http://ww3.cad.de/foren/ubb/Forum352/HTML/000407.shtml#000003
Habe in diesen Forum noch nie etwas verlinkt, hoffendlich funktioniert es.
mfg
Johann

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz