איך ללמוד מאקרו לסולידוורקס - VBA? חלק ראשון

אז איך מתחילים?

כמו בהליכה, הצעד הראשון תלוי בנקודה שבה אתם עומדים. אם עכשיו אתם כבר עם תיק על הגב (יש לכם פעולה שאתם רוצים ליישם במאקרו) וצריכים הנחיה איפה המקום הבא להניח בו את כף הרגל, אתם בנקודת הפתיחה הטובה ביותר לבלוג באופן כללי ולפוסט הזה ספציפית.


אם אתם לא בנקודה הזאת, אבל רוצים להגיע אליה - אמצו לעצמכם שיטת חשיבה שתוביל אתכם אליה. קו המיתאר של שיטת החשיבה הוא משפט המפתח:

איך עושים את זה יותר טוב?


אתם כבר יושבים על הסוליד הרבה שעות ביום, תשאלו את עצמכם "איך עושים את זה יותר טוב?" על כמה שיותר קליקים שאתם עושים בעכבר. יתכן שיקח לכם זמן מה להגיע לנקודת הפתיחה אבל כדאי לאמץ את שיטת המחשבה הזאת כי היא תייצר לכם יום יום מעניין יותר.


ועכשיו, יש לכם פעולה שאתם רוצים ליישם במאקרו.


הרימו את הרגל - הניחו אותה בתשובה המתאימה:


define solidworks macro for part, assembly or drawing?
Part, Assembly or drawing

תרשים הזרימה נבנה באמצעות app.diagrams.net


בדוגמת הקוד שכאן כתוב קוד לעבודה בסביבת קובץ שרטוט.


אם הקוד יתחיל לעבוד כשהסרטוט פתוח, אלו השורות שיש לכתוב בקוד במקום הטקסט שנמצא בו:



Dim swApp         As SldWorks.SldWorks
Dim swModel       As SldWorks.ModelDoc2
Dim swDraw        As DrawingDoc

בשורות אלו הגדרנו שלושה משתנים ראשונים (איך מגדירים משתנים בVBA?)

ולאחר מכן יש לכתוב שורות אלו:



Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
    If swModel.GetType <> swDocDRAWING Then 
    MsgBox "Only Allowed on Drawings" ' Define message
Exit Sub ' Exit this program
End If
Set swDraw = swModel

אם צריך לבחור את הקובץ מתוך תיקייה, המשיכו לפוסט הזה בנושא שימוש בממשק אקספלורר לבחירת קבצים


מה כתבנו כאן?


נתחיל מהשורה השלישית בקוד, Set swModel = swApp.ActiveDoc, שבה קבענו את ערך המשתנה swModel להיות שווה לקובץ הפתוח, בלי לדעת איזה סוג קובץ פתוח - שרטוט, חלק או הרכבה.


בשורה הבאה נשתמש בביטוי IF שמטרתו לבדוק אפשרויות שונות שמתקיימות ולבחור מתוכן את זו שאיתה נרצה להתקדם.

מה האפשרויות? - swModel.GetType בקישור תוכלו לראות:


אלו הם סוגי הקבצים השונים (תחת הכותרת MEMBER) שיתכן ופתוחים כעת בסוליד, ועלינו לוודא שהקוד יופעל על הקובץ שאליו הוא מותאם (מותאם = מאופיין, נסביר בהמשך)


איך מוודאים? כותבים תנאי - אם (IF) סוג הקובץ הפתוח הוא לא ("<>") swDocDRAWING ( = קובץ שרטוט) - המשתמש יראה הודעה שמסבירה לו שהקוד מיועד לשימוש רק בקובץ שרטוט. אם סוג הקובץ הפתוח הוא כן swDocDRAWING - תמשיך פעולת הקוד.

If swModel.GetType <> swDocDRAWING Then

אם הקוד שלך מיועד לעבודה עם קובץ הרכבה, צריך להחליף את הביטוי ל - swDocASSEMBLY

אם הקוד שלך מיועד לעבודה עם קובץ חלק, צריך להחליף את הביטוי ל - ______? השלימו את התשובה בתגובות לפוסט!


בשורות הבאות המטרה היא לייצר אינטרקציה עם המשתמש כדי שבמקרה שהוא לא עובד עם סוג הקובץ המתאים, נספק לו את המידע הזה באמצעות הקוד כך שיבין איפה הטעות שלו. את המידע נספק באמצעות MsgBox . היכנסו לקישור ללמוד את הפקודה יותר לעומק, פקודה זו היא פקודה פנימית לשפה VBA והיא פקודה נפוצה בשפות תכנות בתצורות שונות עם מהות דומה.


בשורה הבאה נגדיר שאם הקובץ הפתוח הוא לא swDocDRAWING - אז Exit Sub - צא מפקודת המאקרו.

לאחר מכן - סיים את שלב התנאי - End If - בדקנו את התנאי, וקבענו מה קורה אם התנאי מתממש (Then).


עכשיו נגדיר את המשתנה swModel להיות swDraw ונקבל גישה לתכונות פנימיות של קובץ שרטוט. (מבטים, מידות ועוד)


אם נעבוד על קובץ הרכבה, יש להחליף את סוג המשתנה:


Dim swDraw        As DrawingDoc

להיות:

Dim swAssembly    As AssemblyDoc

ובקובץ חלק:

Dim swPart       As PartDoc

עכשיו כשאני בתוך סביבת הקובץ הרצוי אני רוצה לבצע פעולה - הכנסת מבט איזומטרי. איך אני מחפש מה צריך לכתוב בהמשך הקוד?


נתחיל מלהגיע לאיזור הפקודה:


שימו לב לשורה המודגשת - אני לוקח את הביטוי ומשנה את המילים שלו כדי להתאים למה שאני רוצה למצוא - "DRAG ISOMETRIC VIEW INTO DRAWING SHEET SOLIDWORKS API" - אלו מילות החיפוש שלי בגוגל.


מה משותף לכל הכותרות? המילה "EXAMPLE" ולאחריה סוגריים (ובתוכם שפת התכנות).

אני בוחר בVBA ולא בC#, גם לא ב VB.NET ומחפש את הכותרת שמתארת פעולה דומה ככל שיש לפעולה שאני מחפש לממש.


בתוך הקישור, העתקתי לכאן את החלק בקוד שרלוונטי מבחינתי למימוש הפקודה. איך אני יודע שהוא הרלוונטי?

חיפשתי בתוך שורות הקוד את השורות שבהן מופיע swDrawing עם נקודה וביטוי לאחריה. כל ביטוי כזה ( מודגש בשורות)

משמעותו שיטת עבודה שזמינה מתוך המשתנה המסויים שאיתו אני עובד, כמו בשורה השנייה כאן -


מוגדר שהמשתנה vViewNames יהיה מסוג VARIANT - סוג שיודע לקבל יותר מביטוי משתנה אחד, וכאן אני רוצה שיקלוט את שמות המבטים מתוך האפשרויות לגרירה לשרטוט - swDrawing.GetDrawingPaletteViewNames


מתוך כל המבטים אני רוצה למשוך מבט אחד ועלי למצוא את שמו כדי להזין אותו בפונקציה הבאה:


Set swView = swDrawing.DropDrawingViewFromPalette2(strViewName, dWidth / 5#, dHeight / 5#, 0#)


ניתן לראות בשורה 1 בפסקה השנייה את התנאי IF שאנחנו כבר מכירים, וכאן מטרתו להגדיר שאם המשתנה vViewNames

איננו (Not) ללא ערכים = IsEmpty, אז תבצע חישוב שממנו יתקבל מספר המבטים הקיימים.


ובהמשך לחישוב, בצע בדיקה מהו שם המבט עד שתגיע למבט ששמו "ISOMETRIC" על ידי שימוש בלופ (סיבוב) מסוג FOR EACH: (תפסו ראש חזק ותמשיכו איתי!!!)

קח את המשתנה vViewName, שיקבל את ערכו של vViewNames הראשון. vViewNames הוא משתנה שמכיל עכשיו את שמות כל המבטים הקיימים עבור השרטוט, לפי סדר רץ - מבט מספר 1,2 וכו',


ולכן vViewName יהיה בעל ערך של שם אחד משמות המבטים.

Debug.Print strViewName

תדפיס את שמו של המבט בסיבוב הנוכחי

ועכשיו, אם מתקיים התנאי ששם המבט הוא ISOMETRIC -


If (strViewName = "*Isometric") Then

קבע את ערכו של המשתנה swView להיות המבט האיזומטרי על ידי זה שתביא אותו לתוך השרטוט באמצעות השיטה DropDrawingViewFromPalette2. ליחצו על הקישור להבין מהם המשתנים שהשיטה מקבלת.

Set swView = swDraw.DropDrawingViewFromPalette2(strViewName, 2 / 3#, 1 / 2#, 0#)

אם הערך של strViewName הוא לא Isometric, תמשיך בלופ FOR EACH עד שהוא יגמר בכך שיאותר הערך Isometric.

Next vViewName

ועכשיו לסיום - הקוד במלואו ברצף.

Option Explicit
Dim swApp           As SldWorks.SldWorks
Dim swModel         As SldWorks.ModelDoc2
Dim swDraw          As SldWorks.DrawingDoc
Dim swView          As SldWorks.View
Dim vViewNames      As Variant
Dim vViewName       As Variant
Dim strViewName     As String
Dim lNumViews       As Long

Sub main()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

    If swModel.GetType <> swDocDRAWING Then
       MsgBox "Only Allowed on Drawings"
Exit Sub ' Exit this program
End If

Set swDraw = swModel
   lNumViews = 0
    vViewNames = swDraw.GetDrawingPaletteViewNames
    If (Not (IsEmpty(vViewNames))) Then
        lNumViews = (UBound(vViewNames) - LBound(vViewNames) + 1)
        Debug.Print "Number of views on palette = " & lNumViews
        For Each vViewName In vViewNames
            strViewName = vViewName
            Debug.Print strViewName
            If (strViewName = "*Isometric") Then
                Set swView = swDraw.DropDrawingViewFromPalette2(strViewName, 2 / 3#, 1 / 2#, 0#)
            End If
        Next vViewName
    End If
End Sub