Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  Mehrere Fragen zum Ansteuern von Blöcken über VBA-Makro

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
  
TeamTec Hausmesse
Autor Thema:  Mehrere Fragen zum Ansteuern von Blöcken über VBA-Makro (687 mal gelesen)
Micha1985
Mitglied
Technischer Zeichner


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

Beiträge: 24
Registriert: 30.06.2021

Intel(R) XEON(R) CPU
E5-1620v4 @ 3.49Ghz
32 GB RAM
64-Bit
Windows 10
SolidWorks 2018/SP5.0
proALPHA6.2e00 / CA-Link V9.0

erstellt am: 24. Feb. 2022 14:28    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 Forengemeinde,

ich habe mir mal wieder eine harte Nuss vorgenommen, diesmal ein Makro das alle auf der Zeichnung vorhandenen Kantenbrüche und Oberflächenangaben sammeln und über beim  Schriftkopf eintragen soll. Für die Oberflächensymbole gibts sowas ja eigentlich schon im PowerWorks, aber ich hätte gern eine rundum-sorglos-Lösung geschaffen.
Die Oberflächensymbole sind auch nicht das größte Problem, eher die Kantenbrüche, für die wir Blöcke nutzen.
Momentan möchte ich das Makro noch nicht in seiner ganzen "Pracht" hier posten, da der Code noch recht wirr ist und noch viel fehlt. Wenn's denn mal fertig ist, kann ich es aber gern hier zur Verfügung stellen. 

Vorher gilt es allerdings noch ein paar Hürden zu nehmen, vielleicht könnt ihr mir dabei helfen!

Problem 1:
Ich füge einen Block (Kantenbruch) ein, anhand einer Vorlage über ".SketchManager.MakeSketchBlockFromFile", siehe unten. Der eingefügte Block enthält einen Bezugshinweistext für den Wert des Kantenbruchs, dieser Bezugshinweis ist als Attribut definiert.
Wie kann ich den gerade eben eingefügten Block gleich auswählen und dem Attribut den richtigen Wert zuweisen?

Problem 2:
Irgendwie komm ich mit dem Definieren des Einfügepunkts von Blöcken nicht ganz klar. In meinem Makro sieht das so aus:

Code:
Koordinaten(0) = PunktX '= Breite des aktiven Blattes minus 0.015
Koordinaten(1) = PunktKBY '= 0.105, da immer auf gleicher Höhe
Koordinaten(2) = 0
Set Einfügepunkt = swMathUtil.CreatePoint(Koordinaten)
Set BlockDefinition = SketchMgr.MakeSketchBlockFromFile(Einfügepunkt, "M:\Blöcke\Kantenbruch\Schriftkopf innen einfach.sldblk", False, 1, 0)

Allerdings fügt es mir die Blöcke immer weit rechts außerhalb des Blattes ein, zudem weit höher als die Y-Koordinate zulassen würde. Beim Einfügen eines Bezugshinweises bei denselben Koordinaten gibts keine Probleme, der landet an der richtigen Stelle. Woran kann das liegen?

Problem 3:
Die auf der Zeichnung eingetragenen Kantenbrüche werden in 3 Arrays gesammelt, das funktioniert über das Auslesen der Attribut-Werte auch ganz prima. Sieht dann folgendermaßen aus:
Auf der Test-Zeichnung vorhanden sind Kantenbrüche mit +0,05; -0,1; -0,2; -0,2; -0,1/-0,2; -0,1/-0,2; -0,1/-0,3; +1/+0,5

Das wird auch problemlos in die Arrays übertragen:

WerteEinzel:
(0) = +0,05
(1) = -0,1
(2) = -0,2
(3) = -0,2

WerteDoppeltOben:
(0) = -0,1
(1) = -0,1
(2) = -0,1
(3) = +1

WerteDoppeltUnten:
(0) = -0,2
(1) = -0,2
(2) = -0,3
(3) = +0,5

Ich möchte gern die doppelten Werte wegkürzen, damit keine Kantenbrüche doppelt eingetragen werden. Ich bin leider kein großer Experte was Arrays angeht... ließe es sich bewerkstelligen dass die doppelten Werte verschwinden, die Nummerierung der Array-Elemente aber erhalten bleibt?  Und wie könnte ich das bei den zwei Arrays für die zweiseitigen Kantenbrüche lösen, dass doppelte Werte nur gelöscht werden wenn der obere UND untere Wert mehrfach vorhanden ist?

Problem 4:
Momentan noch nicht so dringend, da ich mich erstmal mit dem Kantenbruch-Teil beschäftige, aber... gibt es eine Möglichkeit die Breite eines Oberflächensymbols auszulesen? Der Gedanke war, die Oberflächenzeichen dann genauso wie die Kantenbruch-Blöcke über Koordinaten über dem Schriftfeld einzufügen, nur sind die Symbole ja leider nicht immer gleich breit...


Freue mich schon auf euren Input und bedanke mich gleich mal im Voraus! 

Beste Grüße,
Michael

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

RBE
Mitglied
TechSupport; Bechtle PLM Deutschland GmbH


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

Beiträge: 291
Registriert: 11.02.2002

HP ZBook 17 G5
Core i9 2.9GHz
32GB RAM
Quadro P4200
Win11
SolidWorks2024 SP1

erstellt am: 24. Feb. 2022 16: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 Nur für Micha1985 10 Unities + Antwort hilfreich

Hi Michael,

zumindest zu 1) und 2) mal auf die Schnelle meine Ansätze:

1)
Wenn es diese Blockdefinition vorher noch nicht gab, dann erzeugst Du ja damit die erste Instanz. Also könntest Du ja von Deinem "BlockDefinition" mittels SketchBlockDefinition::GetInstances die Instanz(en) holen.
Gibt es die Blockdefinition hingegen schon, nimm doch ISketchManager::InsertSketchBlockInstance.

2)
Du musst beim Einfügen den Blatt-/Ansichtsmaßstab berücksichtigen.

------------------
Grüße, RBE
----------

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

Micha1985
Mitglied
Technischer Zeichner


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

Beiträge: 24
Registriert: 30.06.2021

Intel(R) XEON(R) CPU
E5-1620v4 @ 3.49Ghz
32 GB RAM
64-Bit
Windows 10
SolidWorks 2018/SP5.0
proALPHA6.2e00 / CA-Link V9.0

erstellt am: 25. Feb. 2022 08: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

Hi RBE,

allerbesten Dank für die schnelle Hilfe, hat auch wirklich geholfen! 

Zu 1)
Hast recht, das klappt. Die .GetInstances verwende ich weiter oben im Makro sogar schon, um zu prüfen welche Art von Kantenbrüchen in der Zeichnung vorhanden sind. Klassischer Fall von Brett vorm Kopf 

Zu 2)
Stimmt, daran hatt ich nicht gedacht dass Blöcke in Solid ja ansichts- und maßstabsabhängig sind. Habs jetzt so umgeschrieben dass vor dem Einfügen der Blöcke das Blatt ausgewählt und der Maßstab mit einkalkuliert wird, Die Blatteigenschaften liest es wegen der Blattbreite eh schon aus.

Mal sehen ob ich den Rest auch noch hinkriege. Wenn noch Ideen auftauchen, ich bin allem aufgeschlossen 

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

HenryV
Mitglied
Konstrukteur, Engineering


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

Beiträge: 813
Registriert: 18.05.2005

SolidWorks 2022 x64 SP5.0
Dell Precision 5820
Intel Xeon W-2125 4x4GHz
NVIDIA Quadro P2000 5GB
32GB RAM
2x Dell U2412M, 24" TFT
Windows 10 Enterprise x64 22H2
Microsoft 365 E5
Microsoft Visual Studio Enterprise 2022

erstellt am: 25. Feb. 2022 08:30    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 Nur für Micha1985 10 Unities + Antwort hilfreich

So hier nochmals, dafür hoffe ich richtig. (Ich habe den vorherigen Beitrag entfernt, weil der Code nicht für alle Fälle funktionierte.)
Zu 3:
Hier ein Code mit einer Klasse "Kantenbruch":

Klassenmodul "Kantenbruch"

Code:
Public WOben As String
Public WMitte As String
Public WUnten As String
Public Index As Integer

Modul "Modul1"
Code:

Dim KBS As Collection 'Kantenbruch

Sub Start()
   
    Set KBS = New Collection
    Fuellen
   
    Dim i As Integer
    Dim j As Integer
    Debug.Print "Vorher mit doppelte"
    For i = 1 To KBS.Count
        Debug.Print KBS.Item(i).Index & " Oben:  " & KBS.Item(i).WOben
        Debug.Print KBS.Item(i).Index & " Mitte: " & KBS.Item(i).WMitte
        Debug.Print KBS.Item(i).Index & " Unten: " & KBS.Item(i).WUnten
    Next
             
    'doppelte enternen
    For i = KBS.Count To 2 Step -1
        For j = i - 1 To 1 Step -1
        Debug.Print i & "; " & j
            If KBS.Item(i).WOben = KBS.Item(j).WOben And KBS.Item(i).WMitte = KBS.Item(j).WMitte And KBS.Item(i).WUnten = KBS.Item(j).WUnten Then
                KBS.Remove i
                Exit For
            End If
        Next
    Next
   
    Debug.Print "Nachher ohne doppelte"
    For i = 1 To KBS.Count
        Debug.Print KBS.Item(i).Index & " Oben:  " & KBS.Item(i).WOben
        Debug.Print KBS.Item(i).Index & " Mitte: " & KBS.Item(i).WMitte
        Debug.Print KBS.Item(i).Index & " Unten: " & KBS.Item(i).WUnten
    Next
End Sub

Sub Fuellen()

    Dim Num As Integer
    Num = Num + 1
   
    '+0,05
    Dim kb As New Kantenbruch
    kb.WMitte = "+0.05"
    kb.Index = Num
    KBS.Add kb
    Num = Num + 1
    '+0,1
    Set kb = New Kantenbruch
    kb.WMitte = "-0.1"
    kb.Index = Num
    KBS.Add kb
    Num = Num + 1
    '-0,2
    Set kb = New Kantenbruch
    kb.WMitte = "-0.2"
    kb.Index = Num
    KBS.Add kb
    Num = Num + 1
    '-0,2
    Set kb = New Kantenbruch
    kb.WMitte = "-0.2"
    kb.Index = Num
    KBS.Add kb
    Num = Num + 1
   
    '-0,1/-0,2
    Set kb = New Kantenbruch
    kb.WOben = "-0.1"
    kb.WUnten = "-0.2"
    kb.Index = Num
    KBS.Add kb
    Num = Num + 1
    '-0,1/-0,2
    Set kb = New Kantenbruch
    kb.WOben = "-0.1"
    kb.WUnten = "-0.2"
    kb.Index = Num
    KBS.Add kb
    Num = Num + 1
    '-0,1/-0,3
    Set kb = New Kantenbruch
    kb.WOben = "-0.1"
    kb.WUnten = "-0.3"
    kb.Index = Num
    KBS.Add kb
    Num = Num + 1
    '+1/+0,5
    Set kb = New Kantenbruch
    kb.WOben = "+1"
    kb.WUnten = "+0.5"
    kb.Index = Num
    KBS.Add kb
    Num = Num + 1

End Sub



zu 4:
Vielleicht hilft dir Uwe Thiemes SWFinish, da wird ja was ähnliches gemacht.
Bei Version 1.2 ist der Sourcecode dabei.
SolidWorks MakroMania - Tauschbörse - Makro 10

------------------
21 ist nur die halbe Antwort.

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

Micha1985
Mitglied
Technischer Zeichner


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

Beiträge: 24
Registriert: 30.06.2021

Intel(R) XEON(R) CPU
E5-1620v4 @ 3.49Ghz
32 GB RAM
64-Bit
Windows 10
SolidWorks 2018/SP5.0
proALPHA6.2e00 / CA-Link V9.0

erstellt am: 28. Feb. 2022 08:55    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

Hi HenryV,
sorry für die späte Antwortt, jetzt war ja erst mal Wochenende...

Zu 3:
Sieht sehr gut aus! Ich hab deinen Code noch etwas modifiziert und an meine Bedürfnisse angepasst (z.B. den Füllen-Teil auf einen Durchlauf durch die Blöcke-Instanzen auf der Zeichnung umgebaut), das klappt ganz ausgezeichnet so! Ganz nebenbei hat der Umbau der Kantenbruch-Sammlung von 3 Arrays auf eine Collection auch gleich 2 andere Probleme mit gelöst.
Vielen vielen Dank! 

Zu 4:
Guter Hinweis! Der Source-Code ist ja echt umfangreich, den werd ich mal zerfleddern sobald ich beim Oberflächen-Teil meines Makros angekommen bin.

Beste Grüße,
Michael

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

Micha1985
Mitglied
Technischer Zeichner


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

Beiträge: 24
Registriert: 30.06.2021

Intel(R) XEON(R) CPU
E5-1620v4 @ 3.49Ghz
32 GB RAM
64-Bit
Windows 10
SolidWorks 2018/SP5.0
proALPHA6.2e00 / CA-Link V9.0

erstellt am: 28. Feb. 2022 15: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

Der Kantenbruch-Teil des Makros funktioniert inzwischen richtig gut... aber ein Problem bereitet mir noch Kopfzerbrechen.
Die Kantenbruch-Blöcke werden immer in die gerade ausgewählte Ansicht eingefügt, und nicht auf das Blatt selber. Auch die Auswahl aufzuheben mit
Code:
.ClearSelection2 true

oder anfangs auf das Blatt zu wechseln
Code:
Set Ansicht = Zeichnung.GetFirstView
boolstatus = Zeichnung.ActivateView(Ansicht.GetName2)

helfen da scheinbar nicht.
Hat von euch vielleicht jemand eine Idee?

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

R3vo
Mitglied
staatl. gepr. Techniker, Konstrukteur


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

Beiträge: 107
Registriert: 03.11.2021

Programme:
CAD: SolidWorks 2021 SP5.1
PDM: SpeedyPDM 7.5
------------------------
CPU: i7 10700
GPU: Nvidia Quadro RTX4000
RAM: 64 Gbyte
Datenträger: SSD

erstellt am: 28. Feb. 2022 17:59    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 Nur für Micha1985 10 Unities + Antwort hilfreich

Liegt an der Position in der du die Blöcke einfügst eine Ansicht? Wenn ja, dann evtl. den Block erst woanders einfügen und dann verschieben?

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

Micha1985
Mitglied
Technischer Zeichner


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

Beiträge: 24
Registriert: 30.06.2021

Intel(R) XEON(R) CPU
E5-1620v4 @ 3.49Ghz
32 GB RAM
64-Bit
Windows 10
SolidWorks 2018/SP5.0
proALPHA6.2e00 / CA-Link V9.0

erstellt am: 01. Mrz. 2022 06:41    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

Hi R3vo,

an der Stelle kann eine Ansicht liegen, muss aber nicht. Die Makros werden immer der derzeit angewählten Ansicht zugeordnet, egal an welcher Position ich sie einfüge. Es reicht sogar schon wenn sich der Cursor über einer Ansicht befindet, und man dann das Makro z.B. über Tastenkürzel oder Mausgesten ausführt... ich dachte .ClearSelection2 hilft da was, aber offenbar nein  

[Diese Nachricht wurde von Micha1985 am 01. Mrz. 2022 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