Jump to content

Открытие файла и запуск макроса из командной строки


Recommended Posts

Krusnik

Добрый день, уважаемые форумчане.

 

Может кто-нибудь сталкивался с запуском макросов из командной строки?

 

Хочу сделать автоматическое сохранение чертежей в pdf на pdm-сервере. Как кто-то кладёт файл чертежа нужно запустить SW, открыть этот файл и сохранить в PDF.

Думал приделать к этому делу макрос SaveAsPDF, но не получается его запустить.

 

Команда ниже просто открывает файл и всё.

"C:\Program Files\SOLIDWORKS 2019\SolidWorks\SLDWORKS.exe" "путь файла" /m "D:\Soft\SaveAsPDF\SaveAsPDF.swp"

 

Link to post
Share on other sites


UnPinned posts
Kelny
2 часа назад, Krusnik сказал:

Думал приделать к этому делу макрос SaveAsPDF, но не получается его запустить.

Что бы исключить сбои с приложением PDFCreator (если речь об этом макросе), неплохо бы подправить модуль SaveAsPDF_run:

Цитата

Sub main()
Dim Process As Object
        For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
                If Process.Caption Like "PDFCreator.exe" Then
                        Process.Terminate
                        Exit For
                End If
        Next

        
SaveAsPDF.Show '(vbModeless)

End Sub

Далее вероятно подумать как запусить файл и макрос из скрипта (самое итресное, что пример из ссылки запускает и работает с Excel, но не работает с Solidworks - возможно какие-то ограничения Windows не дают):

Цитата

Suppose your filename is test.vbs.

Commandline>test.vbs "book1.xlsx" "2nd Argument".

 VBScripts Arguments collection gives you access over argument passed in commandline.

Remember if path contain space enlose path in double quote.

Ниже то что в файле test.vbs:




dim XL
dim WB

dim args
dim arg

set args=wscript.arguments

set XL=createobject("Excel.Application")
xl.visible=1
set WB=XL.Workbooks.Open(args(0))
Wb.worksheets(1).Range("A1").value=args(1)

https://social.msdn.microsoft.com/Forums/office/en-US/6124691b-a5ce-4fc0-a648-e85b4a32f77a/excel-vba-to-read-command-line-parameters-and-copy-in-a-cell?forum=exceldev

 

 

и вот тут рассуждения по теме (не разбирался что к чему):

https://www.cyberforum.ru/vbscript-wsh/thread1435759.html

 

Edited by Kelny
  • Нравится 1
Link to post
Share on other sites
Kelny

Как вариант наверно можно так, назначить горячую клавишу запуску макроса Инструменты-Макрос-Выполнить... (например, Ctrl+P), тогда можно запустить программу с документом чертежа, а потом через действия эмуляции клавиатуры запустить макрос, тогда файл скрипта test.vbs будет содержать:

Цитата

Option Explicit
Dim WshShell, oExec
dim swApp

dim args
set args=wscript.arguments

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe "+ args(0))
WScript.Sleep 15000
WshShell.SendKeys("^P")
WshShell.SendKeys(args(1))
WshShell.SendKeys("{Enter}")

Задержку в 15 секунд (WScript.Sleep 15000) при желании можно попробовать уменьшить/увеличить.

 

Далее в командной строке:

Цитата

Concole>"c:\путь_скрипта\test.vbs" "c:\путь_файла\Чертёж.SLDDRW" "C:\путь_макроса\SaveAsPDFcreator.swp"

 

 

План Б, просто создаём приложение, которое откроет программу с выбранным файлом, запускает макрос, собирает информацию/ошибки о созданных файлах и завершает работу программы.

Edited by Kelny
  • Нравится 1
Link to post
Share on other sites
Krusnik
16 часов назад, Kelny сказал:

Что бы исключить сбои с приложением PDFCreator (если речь об этом макросе), неплохо бы подправить модуль SaveAsPDF_run:

У меня он поправлен. С вашей же подачи кстати )))

Вот так

Скрытый текст

Public Sub TestPrinter()
If InStr(GetAllPrinters(0), "PDFCreator") > 0 Then
    MPrint = -1
Else
    MPrint = 0
End If
End Sub

 

15 часов назад, Kelny сказал:

Как вариант наверно можно так, назначить горячую клавишу запуску макроса Инструменты-Макрос-Выполнить... (например, Ctrl+P), тогда можно запустить программу с документом чертежа, а потом через действия эмуляции клавиатуры запустить макрос, тогда файл скрипта test.vbs будет содержать:

 

Фокус не удался.

script.jpg

 

Насчет плана Б легко сказать... У меня вчера было 2 часа мозгового штурма, чтобы написать скрипт в dispatch'е, который из строки "чертеж.slddrw" убирает ".slddrw" и дописывает туда ".pdf"

 

Есть пара дефолтных  скриптов от Dassoult Systemes:

Один сохраняет в dxf. По крайней мере должен сохранять.

Второй может сохранять во много разных форматов, плюс куча настроек.

 

Но первый написан так, что даже прочитать проблема.

А из второго нужно выкинуть лишнее, плюс понять как и какие опции выставить.

Link to post
Share on other sites
Krusnik
17 часов назад, Kelny сказал:

самое итресное, что пример из ссылки запускает и работает с Excel, но не работает с Solidworks - возможно какие-то ограничения Windows не дают

Покопался по офф. форуму.

Нашёл такой ответ:

 

You cannot run a SWP macro from command line. You would need a standalone that calls SolidWorks, then runs a specified macro.

 

Так что дело не в Windows.

 

Походу нужно переходить к плану Б.

Link to post
Share on other sites
Kelny
1 час назад, Krusnik сказал:

Фокус не удался.

В консоли пишете путь к файлам в кавычках? Без кавычек разделение пробелами получается как отдельные аргументы, а не строка целиком. Ошибка говорит, что в 9 строке не правильный адрес к файлу.

Посмотрите, что программа прочитала в аргументах WshShell.echo args(0), например:

Цитата

set args=wscript.arguments

WshShell.echo args(0)

WshShell.echo args(1)

Скопируйте путь из конслоли и попробуйте его открыть/запустить.

 

Скрипт по сути запрашивает форму запуска макроса через комбинацию клавиш, потом впечатывает в тектовое поле окна запуска макроса путь из консоли (второй аргумент - args(1) ) и эмулирует нажатие на клавиатуре ENTER.

Если программа не успевает открыть окно запуска макроса, то можно добавить паузу между строк, например:

Цитата

WScript.Sleep 15000
WshShell.SendKeys("^P")

WScript.Sleep 15000
WshShell.SendKeys(args(1))

WScript.Sleep 15000
WshShell.SendKeys("{Enter}")

Или для начала убрать из скрипта WshShell.SendKeys("{Enter}") и посмотреть, что скрипт вписывает в текстовое поле окна запуска макроса.

1 час назад, Krusnik сказал:

У меня вчера было 2 часа мозгового штурма, чтобы написать скрипт в dispatch'е, который из строки "чертеж.slddrw" убирает ".slddrw" и дописывает туда ".pdf"

Нужно было действовать без убирания, а в одно действие ЗАМЕНИТЬ, в VBA это обычно Replace (строка, что_ищем, чем_заменяем), то есть нжуно найти ".slddrw" и заменить на ".pdf".

Edited by Kelny
Link to post
Share on other sites
Kelny

@Krusnik есть ещё один вариант, через консоль копировать файл в определённую папку или в эту папку класть ссылки на файлы требующие конвертации (например файл .ТХТ), а макросе прописать открытие файла(ов) из папки/тектового документа с последующим открытием файлов и запуском макроса.

Тогда в консоли будет запуск только базового макроса без открытия файла, а открытие файла уже будет базовым макросом и запуск макроса преобразования можно из базового макроса.

Link to post
Share on other sites
Krusnik
1 час назад, Kelny сказал:

В консоли пишете путь к файлам в кавычках?

Да. Попробовал на всякий случай ещё раз. Результат тот же.

 

1 час назад, Kelny сказал:

Посмотрите, что программа прочитала в аргументах WshShell.echo args(0), например:

Я же не программист... Куда это нужно вставлять? В скрипт?

 

1 час назад, Kelny сказал:

Скопируйте путь из конслоли и попробуйте его открыть/запустить.

Какой путь, путь от чего? Или WshShell.Echo должно выдать путь?

 

1 час назад, Kelny сказал:

Скрипт по сути запрашивает форму запуска макроса через комбинацию клавиш, потом впечатывает в тектовое поле окна запуска макроса путь из консоли (второй аргумент - args(1) ) и эмулирует нажатие на клавиатуре ENTER.

Если программа не успевает открыть окно запуска макроса, то можно добавить паузу между строк, например:

Или для начала убрать из скрипта WshShell.SendKeys("{Enter}") и посмотреть, что скрипт вписывает в текстовое поле окна запуска макроса.

Это я понимаю, но скрипт просто не стартует. Ввожу в консоль всё в кавычках > Enter > ну и окошко, которое на скриншоте.

Ни SW не запустился, ни чертёж не открылся, вообще ничего.

 

1 час назад, Kelny сказал:

Нужно было действовать без убирания, а в одно действие ЗАМЕНИТЬ, в VBA это обычно Replace (строка, что_ищем, чем_заменяем), то есть нжуно найти ".slddrw" и заменить на ".pdf".

Ммммм. Это же dispatch. Не VBA. Отдельный геморойчик со своим скудным набором, встоенный в SWE PDM. Там такие трюки не работают.

https://help.solidworks.com/2019/russian/EnterprisePDM/Admin/c_dispatch_overview.htm

1 час назад, Kelny сказал:

@Krusnik есть ещё один вариант, через консоль копировать файл в определённую папку или в эту папку класть ссылки на файлы требующие конвертации (например файл .ТХТ), а макросе прописать открытие файла(ов) из папки/тектового документа с последующим открытием файлов и запуском макроса.

Тогда в консоли будет запуск только базового макроса без открытия файла, а открытие файла уже будет базовым макросом и запуск макроса преобразования можно из базового макроса.

Ну нет. В SWE PDM как только файл где-то создаётся (даже TXT) то сразу сервер делает тьму операций: создать массив данных, записать в них кучу информации (обозначение, наименование, автор и т.д.), потом прогнать файл по потоку работы, там разные условия (если - то и т.д.), всякие права доступа, рассылки сообщений...

Плюс он эти файлы вечно хранит. Даже если пользователь удалил файл, даже если это админ, сервер всё сохраняет. Там со временем будет адова туча текстовых файлов.

 

Нам однажды техподдержка одного CAD предлагала вместо передачи данных (обозначение, наименование и т.п.) непосредственно из файла на сервер создавать рядом ini файл, в котороый пользователи должны записывать эти данные, а сервер бы потом забирал. :hang2:

Link to post
Share on other sites
Kelny
10 часов назад, Krusnik сказал:

Я же не программист... Куда это нужно вставлять? В скрипт?

Сам любитель, но выше написал же:

12 часов назад, Kelny сказал:

...

set args=wscript.arguments

WshShell.echo args(0)

WshShell.echo args(1)

...

 

10 часов назад, Krusnik сказал:

Это я понимаю, но скрипт просто не стартует. Ввожу в консоль всё в кавычках > Enter > ну и окошко, которое на скриншоте.

Ни SW не запустился, ни чертёж не открылся, вообще ничего.

Откусываем лишнее от скрипта и пробуем ещё раз, например, только запуск (скрипт покажет аргументы в появляющихся окнах, потом попытается запустить программу, для начала можно и вовсе остановиться на показе аргументов удалив всё остальное) и ещё вероятно стоит добавить кавычек:

Цитата

Option Explicit
Dim WshShell, oExec
dim swApp

dim args
set args=wscript.arguments

WshShell.echo args(0)

WshShell.echo args(1)

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("""C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe""")

Если получилось, меняем последнюю строчку, что бы с программой ещё и файл чертежа открыл (путь прописанный в "args(0)" - первом аргументе после скрипта),

Цитата

...

Set oExec = WshShell.Exec("""C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe"" "+ """"+args(0)+"""")

...

В конце концов вместо args(#) вписать те самые пути, что бы разобраться будет ли работать - после того как заработает уже использовать аргументы из консольной строки и возможно добавить кавычек (пара двойных ковычек, это одинарная ковычка в тексте между крайних кавычек текстовой строки), например (путь макроса вводиться в текстовое поле окна запуска макроса и там кавычки в текстовой строке не нужны, поэтому пар двойных кавычек там нет, в отличии от того что передаётся в консоль):

Цитата

...

Set oExec = WshShell.Exec("""C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe"" "+ """c:\путь_файла\Чертёж.SLDDRW""")
WScript.Sleep 15000
WshShell.SendKeys("^P")
WshShell.SendKeys("C:\путь_макроса\SaveAsPDFcreator.swp")
WshShell.SendKeys("{Enter}")

 

10 часов назад, Krusnik сказал:

Какой путь, путь от чего? Или WshShell.Echo должно выдать путь?

Путь который вы вписываете для чертежа: откройте solidworks вручную, Файл-Открыть... и вставить скопированное из консоли.

Аналогично для макроса, только теперь выбираете Инструменты-Макросы-Запустить макрос.

WshShell.Echo "тут текст или переменная: " + args(0) - покажет окошко Windows  с текстом и в приведённом примере текст первого параметра в консоли.

 

 

Edited by Kelny
  • Нравится 1
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.




  • Сообщения

    • soklakov
      10^18 частиц. Да, мощнее имеющихся.
    • Golem
      Спасибо большое, я с таким не сталкивался.
    • VOleg
      Я бы сказал "Странный вопрос". За 40+ лет ни разу на чертеж детали не ставил номера позиций т.к. ни разу не нужно было. Но вот последние несколько лет люди начали спрашивать... Видимо на производство пришли "новые люди"... Вот, помогаю, как могу. Еще надо на листах металла на складе писать на какие детали куплен этот металл... И на трубы, что ли? А на сверлах писать какие отверстия нужно будет просверлить...
    • NGM
      Смотрю стандарт, и понимаю - сколько человек его прочтёт, столько трактовок и будет. Сплошные абстрактные формулировки; целый раздел про аттестацию, начинающийся с того, что она "не носит обязательный характер"... Зато, если буквально читать требования к специалисту к нормоконтролю - какой-то терминатор получается: и национальную систему стандартизации знает (всю!), и опыт по разработке КД/ТД имеет, и английским языком владеет. Вот для чего нужны такие ГОСТ-ы?! Заготовка для локального СТО, не более.  
    • NGM
      В идеальном мире розовых единорогов блюющих радугой подпись "Т. контр" в чертеже должен ставить технолог, который будет разрабатывать техпроцесс на проектируемое изделие. На практике я такого не встречал никогда. Предприятиям, где такое практикуется - моё заочное уважение. @Фарита, расслабьтесь. Лучшее, что Вы можете сделать у себя - организовать собственную группу конструкторов, которые будут: а) перечерчивать полученную КД под требования вашего производства, б) выносить мозги разработчику бесконечными ПИ. Поверьте, так работает абсолютное большинство предприятий промышленности - почти везде есть подразделения "конструкторского сопровождения производства", по факту являющиеся живыми примерами того, что ни ЕСКД, ни ЕСТД не работают и никогда не работали (во всяком случае, первое слово из обеих абревиатур).
    • vad0000
      Только одна клавиша не работает?
    • Fedor
      А может попробовать решить задачу  конструкторской оптимизации, то есть минимизировать величину расхождения с экспериментом... 
    • Metal_Cutter
      Это легко лечится, нужно отключить все Join-Up.
    • wake163
    • nicomed
      ИМХО, до разговора о самой таре как раз и надо определяться: в каком виде будет транспортировка ( собранном частично или подетально) предельные размеры и масса упакованной единицы надо ли сортировка по типам деталей (фасад, стенка) при фасовке (для автоматизации, соответственно, должны быть прописаны свойства в деталях) во что будет упаковываться, есть ли какие наработки по изготовлению тары ( тут я "плаваю" ибо такое не делал никогда ) ....если есть мысли что еще надо - дополняйте..   а потом уже только можно что-то продумывать, по каким размерам сортировать, по каким наименованиям ну и т.д.
×
×
  • Create New...