Перейти к публикации

Игнорирование ошибки шрифтов при работе с файлами чере API


nikolay_shishmarev

Рекомендованные сообщения

Добрый день всем.

Столкнулся с проблемой при обработке файлов SLDDRW через API SolidWorks из сторонней программы, связанную с тем что в чертежах используются шрифты, не установленные на машине на которой обрабатываются файлы. Вариант установить - не вариант, т.к. количество файлов прогоняемых через алгоритм огромный. Оценить на начальном этапе все шрифты которые используются в файлах и не установлены на текущей машине - нет возможности. Нужно каким то образом для файлов в которых при открытии возникает диалог с предложением использовать наиболее подходящие из установленных, выбирать это значение автоматически.

 

			ModelDoc2 swModel;
            LogMessage("Открываем файл SW {0}.", OutputLevel.Trace, file_name);
            string file_path = Path.GetTempPath() + file_name;
            //ms.Position = 0;
            using (FileStream file_Primary = new FileStream(file_path, FileMode.Create, FileAccess.Write))
            {
                ms.CopyTo(file_Primary);
                if (ms.Length != file_Primary.Length)
                {
                    LogMessage("Длины стримов не совпадают {0} и {1}", OutputLevel.Error, ms.Length, file_Primary.Length);
                    throw new NotificationException("Поток был передан не корректно");
                }
            }
            ObjectSW objectSW = new ObjectSW(ms, file_name, date);
            if (!SWIsRun)
                SWIsRun = OpenSWR();
            int warnings = 0;
            int errors = 0;
            if (file_name.Substring(file_name.LastIndexOf('.')).ToLower() == ".sldprt")
                swModel = (ModelDoc2)swApp.OpenDoc6(file_path,
                    (int)swDocumentTypes_e.swDocPART,
                    (int)swOpenDocOptions_e.swOpenDocOptions_Silent,
                    "",
                    ref errors,
                    ref warnings);
            else if (file_name.Substring(file_name.LastIndexOf('.')).ToLower() == ".sldasm")
                swModel = (ModelDoc2)swApp.OpenDoc6(file_path,
                    (int)swDocumentTypes_e.swDocASSEMBLY,
                    (int)swOpenDocOptions_e.swOpenDocOptions_Silent,
                    "",
                    ref errors,
                    ref warnings);
            else if (file_name.Substring(file_name.LastIndexOf('.')).ToLower() == ".slddrw")
                swModel = (ModelDoc2)swApp.OpenDoc6(file_path,
                    (int)swDocumentTypes_e.swDocDRAWING,
                    (int)swOpenDocOptions_e.swOpenDocOptions_Silent,
                    "",
                    ref errors,
                    ref warnings);
            else throw new Exception("Формат файла SW не распознан");

            if (swModel == null)
                throw new NotificationException("Объект SW почему то пустой.");

            objectSW.ModelDoc = swModel;
            if (swModel.GetType() == (int)swDocumentTypes_e.swDocASSEMBLY || swModel.GetType() == (int)swDocumentTypes_e.swDocPART)
            {
                TreeControlItem tcitem = swModel.FeatureManager.GetFeatureTreeRootItem2((int)swFeatMgrPane_e.swFeatMgrPaneBottom);
                objectSW.IsNotEmpty = recursiveTree(tcitem);
            }
            else
            {
                swModel.Extension.SelectAll();
                SelectionMgr selectMngr = (SelectionMgr)swModel.SelectionManager;
                int count = selectMngr.GetSelectedObjectCount2(-1);
                objectSW.IsNotEmpty = count != 0;
            }

P.S.: извиняюсь если с оформлением темы накосячил, пробовал искать подобную проблему и по этому форуму и в принципе в инете, ни чего не нашел =(

Ссылка на сообщение
Поделиться на других сайтах


UnPinned posts
8 часов назад, nikolay_shishmarev сказал:

извиняюсь если с оформлением темы накосячил,

Так по API есть отдельная и уже довольно большая тема - там и надо было спрашивать

Ссылка на сообщение
Поделиться на других сайтах
14 часов назад, Plumber сказал:

Так по API есть отдельная и уже довольно большая тема - там и надо было спрашивать

С удовольствием перенесу в ту тему, если подскажете как. Я ошибся при создании темы, а как перенести не знаю. Вообще первый раз пишу на форумах, до этого не приходилось.

Ссылка на сообщение
Поделиться на других сайтах
23 часа назад, nikolay_shishmarev сказал:

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

Как вариант заменять штрифты самостоятельно, макрос SetFontsTNR (не заменяет шрифты в блоках, но при желании/необходимости можете дописать макрос): https://kelnyproject.ucoz.ru/load/2-1-0-10

 

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

С удовольствием перенесу в ту тему, если подскажете как.

Только что к админам/модераторам постучаться, но думаю сойдёт и так (правило не нарушает, каждый волен использовать имеющуюся тему или создать свою).

Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, Kelny сказал:

Как вариант заменять штрифты самостоятельно, макрос SetFontsTNR (не заменяет шрифты в блоках, но при желании/необходимости можете дописать макрос): https://kelnyproject.ucoz.ru/load/2-1-0-10

 

Только что к админам/модераторам постучаться, но думаю сойдёт и так (правило не нарушает, каждый волен использовать имеющуюся тему или создать свою).

макрос переделывает шрифты уже в открытом файле, а у меня Солид "зависает" на строке с методом

swModel = (ModelDoc2)swApp.OpenDoc6(file_path,
                    (int)swDocumentTypes_e.swDocDRAWING,
                    (int)swOpenDocOptions_e.swOpenDocOptions_Silent,
                    "",
                    ref errors,
                    ref warnings);

Мне именно нужно отловить событие с ошибкой при открытии файла. Скрин приложить к сожалению не могу, рабочий интернет не позволяет =(

Ссылка на сообщение
Поделиться на других сайтах
1 hour ago, nikolay_shishmarev said:

нужно отловить событие с ошибкой при открытии файла

А если сначала открыть проблемный файл в солиде и при запросе недостающего шрифта выбрать "не показывать больше", а потом попробовать запустить макро

Ссылка на сообщение
Поделиться на других сайтах
18 часов назад, SWX сказал:

А если сначала открыть проблемный файл в солиде и при запросе недостающего шрифта выбрать "не показывать больше", а потом попробовать запустить макро

функция "не показывать больше" работает с текущей сессией. при выполнении сценария стороннего, который в API солида заглядывает открывается своя сессия и свой поток данных, поэтому эта схема не очень рабочая. Я конечно попробую перехватить открытую сессию солида и в ней выполнять сценарий, но вряд ли получится. свои особенности есть..

Ссылка на сообщение
Поделиться на других сайтах
53 minutes ago, nikolay_shishmarev said:

функция "не показывать больше" работает с текущей сессией

этот выбор сохраняется в свойствах солида на вкладке скрытых сообщений, в апи что-то есть

System Options > Messages/Errors/Warnings - 2022 - SOLIDWORKS API Help

Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, SWX сказал:

этот выбор сохраняется в свойствах солида на вкладке скрытых сообщений, в апи что-то есть

System Options > Messages/Errors/Warnings - 2022 - SOLIDWORKS API Help

о, а вот это интересно. Гляну, спасибо за наводку. отпишусь если получится что то с этим сделать.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...