Mnożenie makr

Witam
Potrzebowałbym twoich umiejętności VBA.

Mam już makro, które tworzy właściwość niestandardową o nazwie WEIGHT i używa wartości solidworks "SW-Mass".

Chciałbym, aby w tym makrze została utworzona niestandardowa właściwość SURFACE ELEMENT, a jej wartość była wynikiem pomnożenia "SW-Mass" przez określony WSPÓŁCZYNNIK liczbowy.

Ale trochę utknąłem z moim kiepskim poziomem VBA... Czy ktoś może mi pomóc?

Witam

Po prostu pobierz wartość, przekonwertuj ją na liczbę, a następnie pomnóż. Przekonwertuj wynik na tekst i umieść go we właściwości niestandardowej

1 polubienie

Witam
Jeśli wersja jest nowsza niż 21, możliwe jest użycie typu "równanie" bezpośrednio w "właściwości menedżera", w przeciwnym razie zadeklaruj go w "menedżerze równań", a następnie utwórz link do właściwości, która zostanie zaktualizowana automatycznie

1 polubienie

Bardzo dziękuję @Cyril_f i @Lynkoa15, ale przy moim nędznym poziomie w ogóle nie wiem, jak się do tego zabrać.
Czy masz mały przykład kodu, dzięki któremu mogę go dostosować do mojego makra? :sweat_smile:

Witam

Zasadniczo wyglądałoby to tak:

Dim swApp               As SldWorks.SldWorks
Dim swModel             As SldWorks.ModelDoc2
Dim swModelDocExt       As ModelDocExtension
Dim swCustProp          As CustomPropertyManager
Dim sMasse              As String
Dim sValout             As String
Dim sVal                As String

Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swModelDocExt = swModel.Extension
Set swCustProp = swModelDocExt.CustomPropertyManager("Défaut") 'Si la propriété est dans l'onglet personnaliser, laisser vide en remplaçant "Défaut" par ""
bRet = swCustProp.Get6("Masse", False, sValout, sMasse, False, False) 'Récupération de la propriété de masse, changer le nom de la propriété en fonction de votre modèle
sVal = CStr(CDec(sMasse) * 3) 'Conversion du texte en valeur décimale, multiplication x 3 et conversion en donné de type texte
bRet = swCustProp.Set2("Ra", sVal) 'Renseignement de la propriété Ra avec la valeur convertie en texte
End Sub


3 polubienia

Dzięki @Cyril_f , zacznę od tego :+1:

@Cyril_f , skopiowałem/wkleiłem linie i zmodyfikowałem to, co trzeba było zmienić, ale makro zawiesza się na linii sVal:


Zajrzałem do składni ale nie widzę nic nienormalnego. Miałem stosunek z liczbą dziesiętną, więc testowałem ze stosunkiem 2, ale makro nadal się zawiesza.
Czy masz pojęcie o problemie?
Dziękuję

Witam
Co to jest komunikat o błędzie i z której wersji oprogramowania korzystasz?

2 polubienia

Witam @Cyril_f
Oto komunikat o błędzie:
image
I jestem na Solidworks 2022 SP05

Nie mam tego problemu, możliwość wysłania mi pliku testowego z właściwościami do sprawdzenia?

1 polubienie

Ok, oto część, którą przetestowałem, a także makro:
TEST SŁUPA SZEŚCIOKĄTNEGO. SLDPRT (567.1 KB)
00-MASA-POWIERZCHNIA.swp (36 KB)

Nie ma problemu z mojej strony, niezależnie od wartości współczynnika (musisz postawić kropkę jako przecinek).
Może sprawdź w odwołaniach do projektu makra:
image
W przeciwnym razie może wystąpić subtelność po stronie ustawień regionalnych stacji i separatora dziesiętnego.

2 polubienia

@Cyril_f
Oto moje referencje do makr:

A oto moje parametry regionalne^tres:

Spróbuj zastąpić przecinek kropką.

2 polubienia

Witam @Cyril_f
Makro działa tylko wtedy, gdy utworzę właściwość SURFACE PIECE w F8.
Jeśli pole nie zostanie utworzone, nic się nie stanie.
Szukałem sposobu na automatyczne utworzenie pola, ale utknąłem.

Oto, co próbowałem majstrować bez powodzenia:

Opcja jawna

Dim swApp jako SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelDocExt As ModelDocExtension
Dim swCustProp As CustomPropertyManager
Słońce sMass jako ciąg
Dim sValout As String
Dim sVal As String
Dim bRet As String

Sub main()

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

Set swCustProp = swModelDocExt.CustomPropertyManager(" PC ") 'Jeśli właściwość znajduje się na karcie dostosowywania, pozostaw to pole puste, zastępując ' PC ' przez '  '

bRet = swCustProp.Get6'  , False, sValout, sMasse, False, False) 'Pobieranie właściwości mass, zmiana nazwy właściwości w celu dopasowania do Twojego modelu

sVal = CStr(CDec(sMass) * 2) 'Konwertuj tekst na wartość dziesiętną, pomnóż x RATIO i przekonwertuj na dane tekstowe

'bRet = swCustProp.Set2(" ELEMENT POWIERZCHNI ", sVal) 'Wypełnij właściwość SURFACE ELEMENT wartością przekształconą w tekst

bRet = swModel.AddCustomInfo3(" PC ", " ELEMENT POWIERZCHNI ", val)

Koniec subwoofera

Próbowałem z tą komendą, ale myślę, że coś jest nie tak:
bRet = swModel.AddCustomInfo3(" PC ", " ELEMENT POWIERZCHNI ", val)

Czy masz pomysł, aby to poprawić?

Zamiast:
'bRet = swCustProp.Set2("ELEMENT POWIERZCHNI", sVal)

Umieść coś takiego:
bRet = swCustPropMgr.Add3(" ELEMENT POWIERZCHNI ", swCustomInfoType_e.swCustomInfoDate, sVal, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)

Wydaje mi się, że ustawienie jest wtedy, gdy właściwość już istnieje.

Zobacz ten link:
https://help.solidworks.com/2020/English/api/sldworksapi/Add_and_Get_Custom_Properties_Example_VB.htm?verRedirect=1

Lub bardziej kompletne:

2 polubienia

Zgadza się.
Jeśli właściwość nie istnieje, musisz ją utworzyć, jeśli istnieje, zdarza się również, że SW nie może zapisać (zdarzyło mi się to na starych plikach) i w takim przypadku musisz usunąć i ponownie utworzyć właściwość.

2 polubienia

Odpowiadam sobie, jest to naprawione za pomocą Add3, który pozwala na nadpisanie, jeśli właściwość już istnieje.
Czyli zasadniczo:

swCustProp.Add3("SURFACE PIECE", 30, sVal, 1)
2 polubienia

Witam, dziękuję za odpowiedzi.
Makro 00-MASS-SURFACE działa dobrze. Czy wiesz jednak, jak mieć tylko 3 miejsca po przecinku dla wartości obszaru?
00-MASA-POWIERZCHNIA.swp (45.5 KB)

I chciałbym zintegrować to makro z makro 00-MACRO HEXA poniżej:
00-MAKRO HEXA.swp (63.5 KB)

Testowałem, ale po uruchomieniu makra pojawia się ten błąd:
image

Debug daje mi to:

Czy wiesz, jak to naprawić?

Dziękuję

Witam

W przypadku błędu prawdopodobnie jest to zmienna swCustProp.Get6, która jest pusta, więc albo właściwość nie istnieje, albo występuje problem z deklaracją zmiennej.
Aby ograniczyć do 3 miejsc po przecinku, musisz użyć funkcji "Format":

    sVal = CStr(Format(CDec(sMasse) * 0.0556, "0.000"))

2 polubienia