Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  Bezugshinweis per Makro einfügen und Pfeil positionieren

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 SOLIDWORKS
  
eDrawings - Ein Viewer für alle Fälle
Autor Thema:  Bezugshinweis per Makro einfügen und Pfeil positionieren (706 / mal gelesen)
mechanikuss
Mitglied
Konstruktion Anlagen+Werkzeug+Maschinen


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

Beiträge: 97
Registriert: 04.06.2002

MS-Windows 10 Pro
MS-Office Pro Plus 2019
DS-Solidworks 2019 Pro

erstellt am: 20. Okt. 2020 15:26    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 liebe Gemeinde,

Ich möchte in einer Zeichnung per Makro einen Bezugshinweis mit Führungslinie und Pfeil so einfügen, dass die Pfeilspitze exakt auf dem Einfügepunkt der selektierten Blockinstanz liegt und der Text dann zur freien Platzierung am Gummiband hängt.

Hintergrund-Info: Ich lese mit dem Makro ein Attribut aus der selektierten Blockinstanz aus und möchte den Inhalt individuell platzieren.

Das Makro funktionert soweit, allerdings werden die Pfeile immer nur auf den Punkt gelegt, den ich bei der Block-Auswahl im Zeichenbereich angeklickt habe. Und der liegt meistens weit daneben.

Kann jemand helfen?

Hier der Code:
_________________________________________________________

Sub make_Block_POS()
    'Variablendefinition
    Dim swDraw          As Object
   
    Dim swDocNamePath   As String
    Dim swDocNameCut    As String
    Dim swDocName       As String
   
    Dim SwSketchMgr     As Object
    Dim swBlockDef      As Object
    Dim swBlockInst     As Object
    Dim vBlockDef       As Variant
    Dim vBlockInst      As Variant
    Dim swAttArr        As Variant
    Dim swAtt           As Object
    Dim t               As Integer
   
    Dim drwScale        As Double
    Dim posArrowX       As Double
    Dim posArrowY       As Double
    Dim posBaloonX      As Double
    Dim posBaloonY      As Double
   
    Dim myNote          As Object
    Dim myAnnotation    As Object
    Dim myPoint         As Object
    Dim myTextFormat    As Object
    Dim swBlockInstName    As String
    Dim myPos           As String
   
    Dim params          As Variant
    Dim FilterOn        As Long
    Dim firstRun        As Boolean
       
    'Initialisierung
    Set swApp = Application.SldWorks
    Set swDoc = swApp.ActiveDoc
    Set swModel = swApp.ActiveDoc
    Set swDraw = swDoc
    Set swSelMgr = swDoc.SelectionManager
   
    'Prüfen, ob Soliworks Datei geöffnet
    If swDraw Is Nothing Then
        MsgBox "No file loaded!", vbOKOnly, "Fehler"
        Exit Sub
    End If

    'Prüfen, ob Datei eine ist Zeichnung
    If swDraw.GetType <> 3 Then
        MsgBox "No Drawing loaded!", vbOKOnly, "Fehler"
        Exit Sub
    End If

    'Prüfen ob Zeichnung gespeichert wurde
    If (swApp.ActiveDoc.GetPathName = "") Then
        MsgBox ("Please save your document first!")
        Exit Sub
    End If
   
    'Dateiname ohne Endung aus Pfad heraustrennen
    swDocNamePath = swApp.ActiveDoc.GetPathName
    swDocNameCut = Left(swDocNamePath, Len(swDocNamePath) - 7)
    swDocName = Mid$(swDocNameCut, InStrRev(swDocNameCut, "\") + 1)

    'Start Skizzenmanager
    Set SwSketchMgr = swDoc.SketchManager
    vBlockDef = SwSketchMgr.GetSketchBlockDefinitions

    'Nur Wenn Blöcke vorhanden
    If Not IsEmpty(vBlockDef) Then
   
    'Flag für ersten Durchlauf
    firstRun = True

WaitLoop:

    firstRun = True 'Immer True, bis bessere Lösung gefunden wurde

    'Aktuelle Auswahlfilter merken und zurücksetzen
    FilterOn = swApp.GetApplySelectionFilter
    params = swApp.GetSelectionFilters
    swApp.SetSelectionFilters params, False
   
    'Block-Filter aktivieren
    swApp.SetSelectionFilter 114, True        'swSelSUBSKETCHINST = 114
   
    '+++++++++++++++++++ Warten auf Block-Auswahl +++++++++++++++++++++++++++++++++
    If (swSelMgr.GetSelectedObjectCount2(-1) <> 1) Or (swSelMgr.GetSelectedObjectType3(1, -1) <> 114) Then
       
        'Diese MessageBox nur beim ersten Durchgang anzeigen
        If firstRun = True Then
            nUserCancel = MsgBox("Select BLOCK or CANCEL to exit", vbOKCancel)
            If nUserCancel = vbCancel Then
                'Set previous selection filters
                swApp.SetSelectionFilters (params), True
                swApp.SetApplySelectionFilter FilterOn
                Exit Sub
            End If
        End If
       
        swDoc.ClearSelection2 True
   
        While (swSelMgr.GetSelectedObjectCount <> 1) Or (swSelMgr.GetSelectedObjectType3(1, -1) <> 114)
            If swSelMgr.GetSelectedObjectCount = 1 And swSelMgr.GetSelectedObjectType3(1, -1) <> 114 Then
                'falsche Auswahl
                nUserCancel = MsgBox("Select BLOCK or CANCEL to exit", vbOKCancel)
                If nUserCancel = vbCancel Then
                   'Set previous selection filters
                    swApp.SetSelectionFilters (params), True
                    swApp.SetApplySelectionFilter FilterOn
                    Exit Sub
                End If
               
                swDoc.ClearSelection2 True
            Else
                'richtige Auswahl
                DoEvents
            End If
        Wend
    End If
      
    'Set previous selection filters
    swApp.SetSelectionFilters (params), True
    swApp.SetApplySelectionFilter FilterOn
   
    '+++++++++++++++++++ Auswahl ist erfolgt +++++++++++++++++++++++++++++++++
   
    'Name der selektierten Block-Instanz holen
    Set swSelMgr = swDoc.SelectionManager
    Set swBlockInst = swSelMgr.GetSelectedObject6(1, 0)
   
    swBlockInstName = swBlockInst.Name
    Debug.Print "2. Ausgewählte Block-Instanz: " & swBlockInstName
   
    'Position der Block instance
    Set insPt = swBlockInst.InstancePosition
    vInstPt = insPt.ArrayData
    strInsPoint = "InsertPoint: x=" + CStr(vInstPt(0) * 1000) + " , y=" + CStr(vInstPt(1) * 1000) + " , z = " + CStr(vInstPt(2) * 1000)
    Debug.Print "6. " & strInsPoint
               
    'Attribut "POS" suchen und auslesen
    swAttArr = swBlockInst.GetAttributes
   
    If Not IsEmpty(swAttArr) Then
        For t = 0 To UBound(swAttArr)
            Set swAtt = swAttArr(t)
       
            If swAtt.TagName = "POS" Then
                myPos = swAtt.GetText
                Debug.Print "    Attribut Name: " & swAtt.TagName
                Debug.Print "    Attribut Wert: " & swAtt.GetText
            End If
        Next t
End If
   
    'Einfügekoordinaten festlegen
    drwScale = 1
   
    posBaloonX = CStr(vInstPt(0)) / drwScale - 0.01
    posBaloonY = CStr(vInstPt(1)) / drwScale + 0.01
   
    posArrowX = CStr(vInstPt(0))
    posArrowY = CStr(vInstPt(1))
   
    '+++++++++++++++++++ Note einfügen +++++++++++++++++++++++++++++++++
    Set myNote = swModel.InsertNote(myPos)
    If Not myNote Is Nothing Then
        myNote.LockPosition = False
        myNote.Angle = 0
        boolstatus = myNote.SetBalloon(1, 0)
        Set myAnnotation = myNote.GetAnnotation()
        If Not myAnnotation Is Nothing Then
            longstatus = myAnnotation.SetLeader3(True, 0, True, False, False, False)
            boolstatus = myAnnotation.SetPosition(posBaloonX, posBaloonY, 0)
            boolstatus = myAnnotation.SetTextFormat(0, True, myTextFormat)
        End If
    End If
    swModel.ClearSelection2 True
    swModel.WindowRedraw
   
    End If
   
    'Routine wiederholen, bis Benutzer-Abbruch
    firstRun = False
    GoTo WaitLoop
   
End Sub


------------------
Lieber Gruß vom mechanikuss

[Diese Nachricht wurde von mechanikuss am 20. Okt. 2020 editiert.]

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)2024 CAD.de | Impressum | Datenschutz