Настораживает консольный вывод...
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Настораживает консольный вывод...

Настораживает консольный вывод...

Ответ
Поиск в этой теме
Непрочитано 11.06.2010, 18:32 #1
Настораживает консольный вывод...
hwd
 
C, C++, C#
 
С-Пб.
Регистрация: 07.10.2009
Сообщений: 2,762

На кнопке висит такая команда:
Код:
[Выделить все]
^C^Chwd.BackupFileSave;_ExplodeAllProxy _RemoveAllProxy _n _Audit _n _-purge _r * _n _-purge _b * _n;
При нажатии на кнопку, в окне консоли AutoCAD вижу такую информацию:

Цитата:
Command: hwd.BackupFileSave

Command: _ExplodeAllProxy
Удалено Proxy: 0 Новых объектов: 0
Command: _RemoveAllProxy
Первая метка объекта: <1>, последняя метка объекта: <6F>
Всего найдено proxy-объектов: 0. Из них proxy-примитивов: 0.
Очистить список масштабов? [Да/Нет] <Да>: _n
Всего удалено proxy-объектов: 0. Из них proxy-примитивов: 0.
Для проверки ошибок выполните команду _AUDIT
Command: _Audit
Fix any errors detected? [Yes/No] <N>: _n


Auditing Header


Auditing Tables


Auditing Entities Pass 1

Pass 1 100 objects audited
Auditing Entities Pass 2

Pass 2 100 objects audited
Auditing Blocks

1 Blocks audited

Total errors found 0 fixed 0

Erased 0 objects


Command: _-purge
Enter type of unused objects to purge
[Blocks/Dimstyles/LAyers/LTypes/MAterials/MUltileaderstyles/Plotstyles/SHapes/te
xtSTyles/Mlinestyles/Tablestyles/Visualstyles/Regapps/All]: _r Enter name(s) to
purge <*>: * Verify each name to be purged? [Yes/No] <Y>: _n
No unreferenced registered applications found.

Command: _-purge
Enter type of unused objects to purge
[Blocks/Dimstyles/LAyers/LTypes/MAterials/MUltileaderstyles/Plotstyles/SHapes/te
xtSTyles/Mlinestyles/Tablestyles/Visualstyles/Regapps/All]: _b Enter name(s) to
purge <*>: * Verify each name to be purged? [Yes/No] <Y>: _n

No unreferenced blocks found.

Command: _save Save drawing as <C:\Documents and Settings\andrey.bushman\Мои
документы\Drawing1.dwg>: C:\Documents and Settings\andrey.bushman\Мои
документы\Backup files\Drawing1_11-6-2010_18-18-51
Красным цветом помечено то, что относится к выводу команды hwd.BackupFileSave, но, как видим, он почему-то разделён (вклинился блок, который должен был идти после данной команды). В теле данной команды выполняется такой код:
Код:
[Выделить все]
...
acadDoc.SendCommand(string.Format("_save {0}\n", sb.ToString()));
...
полный код здесь.
Как видно из приведённого мною выше лога консоли, сначала вроде бы вызывается нужная команда (hwd.BackupFileSave), но после этого вдруг исполняется
Код:
[Выделить все]
_ExplodeAllProxy _RemoveAllProxy _n _Audit _n _-purge _r * _n _-purge _b * _n;
и только после этого на консоль выводится информация, относящаяся к ранее вызванной команде (hwd.BackupFileSave).
Такой лог сбивает с толку. Мне нужно сначала сделать "бэкап", а уж потом начинать чистку. Но по консольному выводу складывается впечатление, что сначала выполняется чистка, и её результат сохраняется в бэкап...

Последний раз редактировалось hwd, 13.12.2011 в 13:12. Причина: обновил ссылку на исходники
Просмотров: 4248
 
Непрочитано 12.06.2010, 12:21
#2
Sad Dog

Ищу работу
 
Регистрация: 12.06.2010
Сообщений: 35


1. SendCommand выполняется асинхронно, т.е. посылает выражение в командную строку и ставит в очередь. А в очереди уже стоит
Код:
[Выделить все]
_ExplodeAllProxy _RemoveAllProxy _n _Audit _n _-purge _r * _n _-purge _b * _n;
Я так себе это представляю, но могу ошибаться.
2. Если обратить взор в сторону Autodesk.AutoCAD.DatabaseServices.Database.SaveAs метода (три варианта на выбор), то можно задачу сохранения решить синхронно. Дополнительный плюс - во время выполнения не потребуется наличие в GAC сборки Autodesk.Autocad.Interop соответствующей версии.

Последний раз редактировалось Sad Dog, 12.06.2010 в 12:32.
Sad Dog вне форума  
 
Автор темы   Непрочитано 12.06.2010, 15:50
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Sad Dog Посмотреть сообщение
1. SendCommand выполняется асинхронно, т.е. посылает выражение в командную строку и ставит в очередь. А в очереди уже стоит
Код:
[Выделить все]
_ExplodeAllProxy _RemoveAllProxy _n _Audit _n _-purge _r * _n _-purge _b * _n;
Я так себе это представляю, но могу ошибаться.
2. Если обратить взор в сторону Autodesk.AutoCAD.DatabaseServices.Database.SaveAs метода (три варианта на выбор), то можно задачу сохранения решить синхронно. Дополнительный плюс - во время выполнения не потребуется наличие в GAC сборки Autodesk.Autocad.Interop соответствующей версии.
Я уже пробовал использовать экземплярные методы SaveAs объектов Database и AcadDocument, однако они делают не то что мне нужно. Эти методы создают копию текущего чертежа и открывают её, устанавливая активной. А мне нужно быстро создать копию активного чертежа, не выходя из сессии его работы и продолжая работать с ним же, а не с его копией, после выполнения команды сохранения.
hwd вне форума  
 
Непрочитано 12.06.2010, 17:38
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Мне нужно сначала сделать "бэкап", а уж потом начинать чистку. Но по консольному выводу складывается впечатление, что сначала выполняется чистка, и её результат сохраняется в бэкап...
А что мешает посмотреть в каком из файлов (в сохраненном бэкапе или в текущем) выполнялась чистка? Открыть бэкап, запустить чистку и посмотреть лог. Потом уже можно делать какие-то выводы.
Do$ вне форума  
 
Непрочитано 12.06.2010, 21:25
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Попробуй убрать CommandFlags.Session
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 13.06.2010, 19:28
#6
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Попробуй убрать CommandFlags.Session
Данный флаг назначен мною специально, чтобы команду можно было вызывать программно над всеми открытыми чертежами (перебирая их в цикле).
hwd вне форума  
 
Непрочитано 14.06.2010, 11:06
#7
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Сделал бы экспорт в DWG...
Profan вне форума  
 
Непрочитано 14.06.2010, 12:19
#8
Sad Dog

Ищу работу
 
Регистрация: 12.06.2010
Сообщений: 35


Как вариант, попробовать сначала клонировать нужную базу чертежа с помощью Autodesk.AutoCAD.DatabaseServices.Database.Wblock(),
создавая так называемую "внешнюю" базу данных (не представленную документом). А уже её сохранять с помощью Autodesk.AutoCAD.DatabaseServices.Database.SaveAs метода. Может в этом случае автокад не станет создавать под неё объект Document и делать его активным?
Может Александр Ривилис подскажет, как такую задачу правильно решить в чистом ObjectArx, чтобы можно было хоть как то сориентироваться.
Sad Dog вне форума  
 
Непрочитано 14.06.2010, 15:22
#9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Sad Dog Посмотреть сообщение
Может Александр Ривилис подскажет, как такую задачу правильно решить в чистом ObjectArx, чтобы можно было хоть как то сориентироваться.
Предложенный вариант имеет подводные камни. Когда база не является активной (текущей) при ее сохранении появляются "артефакты", которых hwd мне кажется хотелось бы избежать. А вот предложенный Profan вариант можно было бы попробовать.
Александр Ривилис вне форума  
 
Непрочитано 15.06.2010, 15:12
#10
Sad Dog

Ищу работу
 
Регистрация: 12.06.2010
Сообщений: 35


A что, если вместо асинхронной SendCommand() воспользоваться синхронной ObjectARX функцией acedCmd() через механизм P/Invoke, как описано по ссылке http://discussion.autodesk.com/threa...sageID=4858935 (см. пост от Tony Tanzillo).
Sad Dog вне форума  
 
Непрочитано 16.06.2010, 09:49
#11
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Sad Dog Посмотреть сообщение
A что, если вместо асинхронной SendCommand() воспользоваться синхронной ObjectARX функцией acedCmd() через механизм P/Invoke, как описано по ссылке http://discussion.autodesk.com/threa...sageID=4858935 (см. пост от Tony Tanzillo).
И этот вариант не пройдет, т.к. не работает в контексте приложения (CommandFlags.Session), а hwd не хочет от него отказываться.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 13.12.2011, 13:01
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


По поводу синхронности/асинхронности:
  1. Метод SendCommand работает синхронно, если CommandFlag == Session. В этом случае, прежде чем вносить изменение в Document, его в обязательном порядке необходимо предварительно заблокировать.
  2. Метод SendStringToExecute всегда работает асинхронно.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 13.12.2011 в 13:25.
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Настораживает консольный вывод...



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
какой вывод в техзаключении? Andrey1111 Обследование зданий и сооружений 16 12.06.2010 01:04
вывод из PDF в копировальном центре baaba Прочее. Программное обеспечение 6 28.05.2010 13:47
Автоматическое измерение углов и вывод размеров в определённом стиле lazut4ik Программирование 4 21.07.2009 22:21
Как сделать вывод из результатов лиры? Lexa85 Лира / Лира-САПР 15 28.05.2009 18:56
Вывод на печать с двух сторон ПЗ ,смет mvart Поиск литературы, чертежей, моделей и прочих материалов 2 25.03.2009 13:40