It is a long-established fact that a reader will be distracted by the readable content of a page when looking at its layout.

Contacts
INNOVERA BLOG / API

Get entity type with SOLIDWORKS Macro 

Μιχάλης Λάζος |11/12/2024

Στο παρόν άρθρο, θα εξετάσουμε τη διαδικασία δημιουργίας μιας μακροεντολής στο API του SOLIDWORKS, με σκοπό την αναγνώριση των οντοτήτων που επιλέγει ο χρήστης σε ένα μοντέλο. Συγκεκριμένα, θα αναλύσουμε πώς μπορούμε να αξιοποιήσουμε τις μακροεντολές για την απόκτηση πληροφοριών σχετικά με τις ιδιότητες του μοντέλου, απλά μέσω της επιλογής των οντοτήτων από το γραφικό περιβάλλον.

Αρχικά, θα παρουσιάσουμε έναν απλό κώδικα που θα θέσει τις βάσεις για την κατανόηση της λογικής του αλγορίθμου. Στη συνέχεια, θα προχωρήσουμε σε εμπλουτισμό του κώδικα για να ανακτήσουμε πληροφορίες σχετικά με τα χαρακτηριστικά του μοντέλου με μεγαλύτερη ακρίβεια και πληρότητα.

				
					Sub main()

    ' Get file access
    Dim swApp       As SldWorks.SldWorks
    Dim swModel     As ModelDoc2
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    ' Get access to selected items
    Dim swSelMgr    As SelectionMgr
    Set swSelMgr = swModel.SelectionManager
    
    ' Loop through selected entities
    Dim i As Integer
    For i = 1 To swSelMgr.GetSelectedObjectCount
    
        ' Get access to first selected object
        Dim swSelType   As Long
        swSelType = swSelMgr.GetSelectedObjectType3(i, -1)
        
        'Return to emidiate window the type of the selection
        Debug.Print "Type: " & GetEntityType(swSelType)
        
    Next i
    
End Sub

' Function to return the type of the entity as a string
Function GetEntityType(type1 As Long) As String
    Select Case type1
        Case swSelectType_e.swSelFACES
            GetEntityType = "Face"
        Case swSelectType_e.swSelEDGES
            GetEntityType = "Edge"
        Case swSelectType_e.swSelVERTICES
            GetEntityType = "Vertex"
        Case swSelectType_e.swSelSKETCHES
            GetEntityType = "Sketch"
        Case swSelectType_e.swSelSOLIDBODIES
            GetEntityType = "Body"
        Case swSelectType_e.swSelCOMPONENTS
            GetEntityType = "Component"
        Case Else
            GetEntityType = "Unknown"
    End Select
End Function
				
			

Στόχος μας είναι να προσφέρουμε μια ολοκληρωμένη καθοδήγηση για τη σύνταξη μακροεντολών που θα ενισχύσουν την παραγωγικότητα και την αυτοματοποίηση κατά την εργασία με το SOLIDWORKS.

1ο Βήμα:
Πρόσβαση στο μοντέλο

Το πρώτο τμήμα του κώδικα δημιουργεί μια σύνδεση μεταξύ του λογισμικού και του ανοιχτού αρχείου. Μέσω αυτής της σύνδεσης, η μεταβλητή swModel παρέχει πρόσβαση στο μοντέλο, επιτρέποντας στον κώδικα να ανακτά και να διαχειρίζεται τις ιδιότητές του.

				
					    ' Get file access
    Dim swApp       As SldWorks.SldWorks
    Dim swModel     As ModelDoc2
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
				
			

2ο Βήμα:
Πρόσβαση στα επιλεγμένα χαρακτηριστικά

Στο επόμενο βήμα, δημιουργούμε μια σύνδεση μεταξύ του κώδικα και των επιλεγμένων αντικειμένων ή χαρακτηριστικών του ενεργού αρχείου (swModel). Η σύνδεση αυτή επιτυγχάνεται μέσω της εντολής SelectionManager. Με αυτόν τον τρόπο, η μεταβλητή swSelMgr αποθηκεύει τις πληροφορίες όλων των αντικειμένων που έχουν επιλεγεί από τον χρήστη στο γραφικό περιβάλλον.

				
					    ' Get access to selected items
    Dim swSelMgr    As SelectionMgr
    Set swSelMgr = swModel.SelectionManager
				
			

3ο Βήμα:
Αναγνώριση του Τύπου του Επιλεγμένου Αντικειμένου

Στο επόμενο στάδιο, αντλούμε πληροφορίες για το είδος των οντοτήτων που έχουν επιλεγεί. Χρησιμοποιώντας την εντολή GetSelectedObjectType3, αποκτούμε πρόσβαση στα αντικείμενα που περιέχει η μεταβλητή swSelMgr. Έτσι, μπορούμε να ανακτήσουμε τον τύπο κάθε επιλεγμένης οντότητας.

				
					        ' Get access to first selected object
        Dim swSelType   As Long
        swSelType = swSelMgr.GetSelectedObjectType3(1, -1)
				
			

4ο Βήμα:
Επιστροφή του Τύπου της Επιλογής στον Χρήστη

Σε αυτό το βήμα, χρησιμοποιούμε τη συνάρτηση GetEntityType για να μετατρέψουμε την αριθμητική αναφορά της μεταβλητής swSelType σε ένα κατανοητό μήνυμα, διευκολύνοντας την ερμηνεία των δεδομένων.

Συγκεκριμένα, η μεταβλητή swSelType απέκτησε μια αριθμητική τιμή τύπου Long. Σύμφωνα με το εγχειρίδιο του API του SOLIDWORKS, η εντολή GetSelectedObjectType3 επιστρέφει έναν μοναδικό κωδικό για κάθε τύπο αντικειμένου που μπορεί να επιλεγεί από τον χρήστη. Αυτός ο κωδικός μετατρέπεται μέσω της συνάρτησης GetEntityType, όπως φαίνεται παρακάτω:

				
					        'Return to emidiate window the type of the selection
        Debug.Print "Type: " & GetEntityType(swSelType)
				
			

Κάθε μία από τις περιπτώσεις (cases) αντιστοιχεί σε έναν ακέραιο αριθμό που προσδιορίζει το ID για κάθε πιθανό τύπο οντότητας. Η χρήση της μορφής swSelectType_e καθιστά τον κώδικα πιο ευανάγνωστο και κατανοητό.

				
					' Function to return the type of the entity as a string
Function GetEntityType(type1 As Long) As String
    Select Case type1
        Case swSelectType_e.swSelFACES
            GetEntityType = "Face"
        Case swSelectType_e.swSelEDGES
            GetEntityType = "Edge"
        Case swSelectType_e.swSelVERTICES
            GetEntityType = "Vertex"
        Case swSelectType_e.swSelSKETCHES
            GetEntityType = "Sketch"
        Case swSelectType_e.swSelSOLIDBODIES
            GetEntityType = "Body"
        Case swSelectType_e.swSelCOMPONENTS
            GetEntityType = "Component"
        Case Else
            GetEntityType = "Unknown"
    End Select
End Function
				
			
Με αυτό, το πρώτο στάδιο της μακροεντολής ολοκληρώνεται.
 

Περιορισμοί και Ανάγκη για Αναγνώριση Πολλαπλών Επιλογών

Όπως φαίνεται στο παράθυρο Immediate, ο αλγόριθμος λειτουργεί σωστά και αναγνωρίζει τον τύπο κάθε επιλεγμένης οντότητας στο μοντέλο.

Ωστόσο, ο αλγόριθμος παρουσιάζει περιορισμούς όταν πρόκειται για την αναγνώριση πολλαπλών επιλεγμένων αντικειμένων ταυτόχρονα. Στην τρέχουσα μορφή του, δεν μπορεί να επιστρέψει τον τύπο για κάθε μία από τις πολλαπλές επιλογές.

Type: Face
Type: Edge
Type: Vertex
Previous slide
Next slide

Ανατρέχοντας στο API Help για την εντολή GetSelectedObjectType3, παρατηρούμε ότι για να λειτουργήσει σωστά απαιτούνται δύο δεδομένα εισόδου: το Index και το Mark. Στον κώδικά μας, αυτά τα δεδομένα αντιστοιχούν στα δύο αριθμητικά ορίσματα που περιλαμβάνονται στις παρενθέσεις της εντολής.

				
					' Get access to first selected object
        Dim swSelType   As Long
        swSelType = swSelMgr.GetSelectedObjectType3(1, -1)
				
			
				
					' Get access to first selected object
        Dim swSelType   As Long
        swSelType = swSelMgr.GetSelectedObjectType3(2, -1)
				
			
				
					' Get access to first selected object
        Dim swSelType   As Long
        swSelType = swSelMgr.GetSelectedObjectType3(3, -1)
				
			

Για τον δικό μας κώδικα, θα επικεντρωθούμε στην τιμή Index, ενώ η τιμή Mark θα παραμείνει στην προεπιλεγμένη τιμή της, δηλαδή -1.

Πρακτικά, η μεταβλητή Index καθορίζει ποιο αντικείμενο από τα επιλεγμένα θα χρησιμοποιήσει ο κώδικας. Για παράδειγμα, εάν επιλέξω με τη σειρά μια επιφάνεια, μια ακμή και μια κορυφή με το ποντίκι μου, για να χρησιμοποιηθεί ως αντικείμενο η πρώτη επιλογή (δηλαδή η επιφάνεια), το Index θα πρέπει να είναι 1.

Αν κάποιος ήθελε να χρησιμοποιήσει τη δεύτερη επιλογή (την ακμή), το Index θα πρέπει να είναι 2. Για την τρίτη επιλογή (την κορυφή), το Index θα πρέπει να είναι 3, και ούτω καθεξής.

Για να έχουμε πρόσβαση σε πολλαπλές επιλογές, πρέπει να βρούμε έναν τρόπο ώστε η τιμή του Index να προσαρμόζεται ανάλογα με τον μέγιστο αριθμό επιλογών. Αυτό επιτυγχάνεται τοποθετώντας την εντολή μέσα σε μία επανάληψη (loop) τύπου for, η οποία θα ξεκινά με αρχική τιμή το 1 (που αντιστοιχεί στην πρώτη επιλογή του χρήστη) και θα χρησιμοποιεί την εντολή swSelMgr.GetSelectedObjectCount ως άνω όριο. Αυτή η εντολή επιστρέφει τον αριθμό των επιλεγμένων αντικειμένων από το γραφικό περιβάλλον.

Με βάση αυτή τη λογική, ο κώδικας θα έχει την εξής μορφή:

				
					    ' Loop through selected entities
    Dim i As Integer
    For i = 1 To swSelMgr.GetSelectedObjectCount
    
        ' Get access to first selected object
        Dim swSelType   As Long
        swSelType = swSelMgr.GetSelectedObjectType3(i, -1)
        
        'Return to emidiate window the type of the selection
        Debug.Print "Type: " & GetEntityType(swSelType)
        
    Next i
				
			

Με αυτόν τον τρόπο, καταφέραμε να επιλέξουμε πολλαπλά χαρακτηριστικά, και η μακροεντολή εντοπίζει σωστά τον τύπο κάθε επιλεγμένης οντότητας. Στο επόμενο άρθρο, θα εξετάσουμε πώς μπορούμε να επεκτείνουμε τον αλγόριθμο για να αντλήσουμε περισσότερα χαρακτηριστικά από το μοντέλο, καθώς και να εξάγουμε ένα απλό αναφορά (report) για αυτά.

Για εκείνους που επιθυμούν να εμβαθύνουν περισσότερο, το σεμινάριο SOLIDWORKS API της INNOVERA αποτελεί μια εξαιρετική ευκαιρία. Μέσω αυτού του σεμιναρίου, θα αποκτήσετε τις απαραίτητες γνώσεις για να αξιοποιήσετε πλήρως το δυναμικό του API και να επιτύχετε ακόμα μεγαλύτερη απόδοση στις σχεδιαστικές σας διαδικασίες.

Είμαστε εδώ για να σας υποστηρίξουμε σε κάθε βήμα του ταξιδιού σας προς την αυτοματοποίηση και την εξερεύνηση του SOLIDWORKS API. Επιτρέψτε μας να σας καθοδηγήσουμε στην επίτευξη των σχεδιαστικών σας στόχων, με μεγαλύτερη αποτελεσματικότητα και δημιουργικότητα.

1300x557_1

About the Author

Ο Μιχάλης Λάζος είναι Μηχανολόγος μηχανικός με σπουδές στο Πανεπιστήμιο Δυτικής Μακεδονίας με ειδικότητα στις τεχνολογίες CAD/CAE για τον σχεδιασμό και αξιολόγηση μηχανολογικών προϊόντων. Ως Design Automation Specialist μπορεί να παρέχει στους συνεργάτες της INNOVATION ERA δυνατότητες αυτοματοποίησης σχεδιασμού σε περιβάλλον SOLIDWORKS, εκμηδενίζοντας τους χρόνους σχεδιασμού. Επιπλέον δεξιότητες αποτελούν οι γνώσεις πάνω στο Additive manufacturing, ενώ παράλληλα ως κάτοχος πιστοποιήσεων για Simulation στο SOLIDWORKS προσφέρει υπηρεσίες CAE πάνω σε αναλύσεις αντοχής κατασκευών αλλά και ρευστοδυναμικής για προβλήματα της βιομηχανίας.

ΑΝΑΖΗΤΗΣΤΕ ΠΕΡΙΣΣΟΤΕΡΑ

Share: