Kwotowanie w makrze

Chciałbym zrobić bardzo proste makro z linią z jego oceną:

Nagrywam, a następnie, gdy uruchamiam makro, zatrzymuje się ono na wymiarze, w którym ruchome okno prosi mnie o wpisanie wartości; Chciałbym, aby ocena 50 ustaliła się sama. Ale nawet gdy wprowadzam wartość, program przechodzi do debugowania, ponieważ czeka, aż będzie mógł umieścić wymiar 50, który został już ustawiony.

Czy ktoś wie, jak przystąpić do automatycznego wymiarowania szkicu?

1 polubienie

Witam

Musisz dezaktywować opcję wprowadzania wymiaru

1 polubienie

W kodzie należy dodać na początku: boolstatus = swApp.SetUserPreferenceToggle(swInputDimValOnCreate, False), a następnie na końcu kodu boolstatus = swApp.SetUserPreferenceToggle(swInputDimValOnCreate, True)
 

1 polubienie

@Cyril.f

Próbuję, ale pojawia się komunikat o błędzie:

Musielibyśmy wykonać dwa lub trzy sprawdzenia, z jednej strony swapp jest zadeklarowany jako Sldworks.Sldworks (może rozwiązać problem, a nie jest zadeklarowany jako obiekt).

W takim razie, czy w referencjach nie brakuje odniesień?

1 polubienie

Tak, swapp jest zadeklarowany jako SldWorks.sldworks

Suszę, czy mógłbyś umieścić cały kod, wstawiając go z opcją wstawienia kodu z forum, abym mógł go odzyskać do zobaczenia.

W przeciwnym razie należy przynajmniej zaewidencjonować odwołania (Narzędzia> odwołania), jeśli włączone są następujące odwołania:

Biblioteka typów rozszerzalności Solidworks 201X

Biblioteka typów Sldworks 201X

Biblioteka typów stałych Solidworks 201X

Biblioteka typów poleceń Solidworks 201X

Ze swojej strony jestem na 2016 roku i nie ma problemów.

Przepraszamy, oto początkowy kod:

Dim swApp jako SldWorks.SldWorks
Przyciemnij część jako SldWorks.ModelDoc2
Dim boolstatus As Boolean
Dim skSegment As Object
Przyciemnij myDisplayDim Jako obiekt
Przyciemnij myDimension jako obiekt

Sub main()

    Ustaw swApp = Application.SldWorks
    Ustaw część = swApp.ActiveDoc
    
    Part.SketchManager.InsertSketch Prawda
    boolstatus = Part.Extension.SelectByID2("Plan twarzy", "PŁASZCZYZNA", -6.71223122593068E-02, 0.049524099883856, 0, Fałsz, 0, Nic, 0)
       
    Ustaw skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, 0.052237, 0#, 0#)
    Part.ClearSelection2 Prawda
    boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 3.01706029555596E-02, 3.7613240418119E-04, 0, False, 0, Nic, 0)
    
    Ustaw myDisplayDim = Part.AddDimension2(2.91675832110764E-02, -1.54214285714286E-02, 0)
    Part.ClearSelection2 Prawda
    
    Ustaw myDimension = Part.Parameter("D1@Esquisse1")
    myDimension.SystemValue = 0,05
    Part.ClearSelection2 Prawda
    Part.SketchManager.InsertSketch Prawda
    
Koniec subwoofera

Jest w SolidWorks 2016

Oto referencje:

Oto drugi edytowany kod:

Dim swApp jako SldWorks.SldWorks
Przyciemnij część jako SldWorks.ModelDoc2
Dim boolstatus As Boolean
Dim skSegment As Object
Przyciemnij myDisplayDim Jako obiekt
Przyciemnij myDimension jako obiekt

Sub main()

    Ustaw swApp = Application.SldWorks
    Ustaw część = swApp.ActiveDoc
    
    boolstatus = swApp.SetUserPreferenceToggle(swInputDimValOnCreate, False)
    
    Part.SketchManager.InsertSketch Prawda
    boolstatus = Part.Extension.SelectByID2("Plan twarzy", "PŁASZCZYZNA", -6.71223122593068E-02, 0.049524099883856, 0, Fałsz, 0, Nic, 0)
    
    
    
    Ustaw skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, 0.052237, 0#, 0#)
    
    boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 3.01706029555596E-02, 3.7613240418119E-04, 0, False, 0, Nic, 0)
    
    Ustaw myDisplayDim = Part.AddDimension2(2.91675832110764E-02, -1.54214285714286E-02, 0)
    
    
    Ustaw myDimension = Part.Parameter("D1@Esquisse1")
    myDimension.SystemValue = 0,05
    
    Part.SketchManager.InsertSketch Prawda
    
    boolstatus = swApp.SetUserPreferenceToggle(swInputDimValOnCreate, Prawda)
    
Koniec subwoofera

 

Witam

Zamień "Dim swApp As SldWorks.SldWorks" na "Dim swApp As Object", to powinno zadziałać.

Pozdrowienia

1 polubienie

A także, bądź ostrożny, gdy dotkniesz parametrów SW, lepiej jest odczytać wartość parametru i, jeśli musisz go zmodyfikować na potrzeby zabiegu, przywrócić go do stanu początkowego po zakończeniu zabiegu:

Dim value As Boolean
value = swApp.GetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate)
    
If value = True Then
  boolstatus = swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate, False)
End If

###### Là tu mets ton traitement #######

boolstatus = swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate, value)

 

Pozdrowienia

3 polubienia

Rzeczywiście, d.roger, nie sprecyzowałem, ponieważ jego sw miał wejść do kursów.

W każdym razie, ustawienie na False, a następnie True działa nawet wtedy, gdy opcja jest już zaznaczona lub odznaczona (celowo uprościłem).

W przypadku swApp jako obiektu, próbowałem z obydwoma (sldworks.sldworks i object) w 2016 roku działa dla mnie. Zaletą drugiego jest to, że ma autouzupełnianie przy wprowadzaniu kodu i przegląd tego, czego oczekuje każde wywołanie funkcji, bez konieczności trzymania pomocy cały czas otwartej ;)

Edycja: Wreszcie działa z Object, z SldWorks.SldWorks generuje błąd kompilacji, wydaje mi się, że wczoraj trzymał typ Object w pamięci.

1 polubienie

Nie ma sposobu, aby nie wprowadzić wymiaru, po prostu za pomocą argumentu funkcji, zamiast cofnąć, a następnie przywrócić ogólne parametry...??

 

Uwaga: jeśli plik zawiera już szkic, ten utworzony przez makro nie będzie miał charakteru "sketch1", ale będzie miał inny numer... (??)

1 polubienie

@ Olivier42 : Witam, nie można użyć argumentu, ponieważ jest to parametr ogólny. O ile mi wiadomo, w interfejsach API nie ma nic, co pozwalałoby na zastąpienie tych parametrów za pomocą argumentu.

Jest to potwierdzone przez pomoc API oprogramowania: Przed wywołaniem tej metody możesz wywołać ISldWorks::SetUserPreferenceToggle z swUserPreferenceToggle_e.swInputDimValOnCreate , aby pominąć okno dialogowe, które pozwala użytkownikowi na wpisanie wartości wymiaru. 

1 polubienie

Witam

Ogólna idea polega na tym, aby wykonać kompletne szkice zwymiarowane za pomocą programowania, a następnie oczywiście umieścić na nich funkcje głośności. Ważne jest jednak, aby na szkicu były boki. Stąd test z pojedynczą linią i jego szanse.

Za jakiś czas wypróbuję modyfikacje.

Dziękuję za pomoc!

Nadal nie.

Oto nowy kod

Dim swApp As Object
Przyciemnij część jako obiekt

Dim boolstatus As Boolean
Wartość przyciemniona Jako wartość logiczna

Sub main()

Ustaw swApp = Application.SldWorks
Ustaw część = swApp.ActiveDoc

wartość = swApp.GetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate)
    Jeśli wartość = Prawda, to
      boolstatus = swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate, False)
    Zakończ jeżeli:

boolstatus = Part.Extension.SelectByID2("Płaszczyzna twarzy", "PŁASZCZYZNA", 0, 0, 0, Fałsz, 0, Nic, 0)
Part.SketchManager.InsertSketch Prawda
Dim skSegment As Object
Ustaw skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, 0.051925, 0#, 0#)
boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 1.97416243507319E-02, -1.20689440993789E-03, 0, False, 0, Nic, 0)
Przyciemnij myDisplayDim Jako obiekt
Ustaw myDisplayDim = Part.AddDimension2(2.59101957793034E-02, -1.59578260869565E-02, 0)
Przyciemnij myDimension jako obiekt
Ustaw myDimension = Part.Parameter("D1@Esquisse1")
myDimension.SystemValue = 0,05
Part.SketchManager.InsertSketch Prawda

boolstatus = swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate, wartość)

Koniec subwoofera

Utknie w tym samym miejscu

Oto komunikat o błędzie: