Не срабатывает SendCommand

Автор Тема: Не срабатывает SendCommand  (Прочитано 14033 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Не срабатывает SendCommand
« : 25-08-2015, 11:02:18 »
Уважаемые форумчане, у кого-то было такое, что команда переключения с пространства модели на лист не срабатывала?

Код - Visual Basic [Выбрать]
  1. SendCommand ("_CTAB" & vbCr & "Лист1" & vbCr)
  2. 'или
  3. SendCommand ("_TILEMODE" & vbCr & "0" & vbCr)
  4. 'или
  5. SendCommand ("_LAYOUT" & vbCr & "_SET" & vbCr & "Лист1" & vbCr)
  6. 'или
  7. ActiveSpace=acPaperSpace

Ни одна из этих команд не срабатывает! Бывало ли когда-то такое?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #1 : 25-08-2015, 12:35:57 »
1) Только эти не срабатывают или другие тоже?
2) Нет ли в момент запуска этих команд активной (запущенной) команды?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Не срабатывает SendCommand
« Ответ #2 : 25-08-2015, 12:50:56 »
Железно нету!

Елы-палы: "_zoom" & vbCr & "_e" & vbCr тоже не сработал!
Сработал, когда вся процедура завершилась.
« Последнее редактирование: 25-08-2015, 13:32:41 от Пашин Евгений »

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Не срабатывает SendCommand
« Ответ #3 : 25-08-2015, 13:31:06 »
Код - vb.net [Выбрать]
  1.  
  2. Imports Autodesk.AutoCAD.Runtime
  3. Imports Autodesk.AutoCAD.Interop
  4. .....
  5.  
  6.         <CommandMethod("alllayoutshow")> _
  7.         Public Sub alllayoutshow()
  8.             Dim acApp As AcadApplication
  9.             acApp = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication
  10.             Dim acDoc As AcadDocument
  11.             acDoc = acApp.ActiveDocument
  12.  
  13.             Dim p1(2) As Double
  14.             Dim p2(2) As Double
  15.  
  16.             For Each LT In acDoc.Layouts
  17.                 If InStr(LT.Name, "LT") <> 0 Then
  18.                     LT.delete()
  19.                 End If
  20.             Next
  21.  
  22.             Dim i As Long
  23.  
  24.             p1(0) = 0 : p1(1) = 0 : p1(2) = 0
  25.             p2(0) = 297 : p2(1) = 210 : p2(2) = 0
  26.  
  27.             For i = 1 To 10
  28.                 acDoc.Layouts.Add("LT" & i)
  29.                 acDoc.SendCommand("_ctab" & vbCr & "LT" & i & vbCr)
  30.                 acDoc.ActiveLayout.Block.AddLine(p1, p2)
  31.                 acDoc.SendCommand("_zoom" & vbCr & "_e" & vbCr)
  32.                 MsgBox("Лист LT" & i & " активен!")
  33.             Next i
  34.  
  35.         End Sub

Не работает! Все линии отрисовал в пространстве модели!



А эта штука работает! Каждая линия на своем листе!
Код - Visual Basic [Выбрать]
  1. Public Sub alllayoutshow()
  2.             Dim acApp As AcadApplication
  3.             Set acApp = Application
  4.             Dim acDoc As AcadDocument
  5.             Set acDoc = acApp.ActiveDocument
  6.  
  7.             Dim p1(2) As Double
  8.             Dim p2(2) As Double
  9.             Dim LT As Object
  10.  
  11.             For Each LT In acDoc.Layouts
  12.                 If InStr(LT.Name, "LT") <> 0 Then
  13.                     LT.Delete
  14.                 End If
  15.             Next
  16.  
  17.             Dim i As Long
  18.  
  19.             p1(0) = 0: p1(1) = 0: p1(2) = 0
  20.             p2(0) = 297: p2(1) = 210: p2(2) = 0
  21.  
  22.             For i = 1 To 10
  23.                 acDoc.Layouts.Add ("LT" & i)
  24.                 acDoc.SendCommand ("_ctab" & vbCr & "LT" & i & vbCr)
  25.                 acDoc.ActiveLayout.Block.AddLine p1, p2
  26.                 acDoc.SendCommand ("_zoom" & vbCr & "_e" & vbCr)
  27.                 MsgBox ("Лист LT" & i & " активен!")
  28.             Next i
  29.  
  30.         End Sub

Почему не работает в VB.NET, а пишу в VBA AutoCAD, тоже самое - РАБОТАЕТ?!


Не срабатывает SendCommand, причем все команды _ctab и _zoom! Срабатывает только на последнем листе!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #4 : 25-08-2015, 13:37:15 »
Ты пытаешься писать в VBA или в VB.NET? Если в VB.NET, то почему тема создана в этом разделе? Каким образом я (или кто-нибудь другой) должен догадаться, что речь идёт о VB.NET?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #5 : 25-08-2015, 13:38:42 »
Почему не работает в VB.NET, а пишу в VBA AutoCAD, тоже самое - РАБОТАЕТ?!
Потому что в VBA SendCommand работает синхронно, а в VB.NET в большинстве случаев ассинхронно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Не срабатывает SendCommand
« Ответ #6 : 25-08-2015, 13:50:34 »
Ох вот оно что... Блин, а мне не жить не быть надо передать синхронно!

Ты пытаешься писать в VBA или в VB.NET? Если в VB.NET, то почему тема создана в этом разделе? Каким образом я (или кто-нибудь другой) должен догадаться, что речь идёт о VB.NET?

Я привел пример, того, что один и тот же код, отрабатывается по-разному. Извиняюсь за сей конфуз. Надо на NET писать, но так как времени в обрез, а NET освоение еще в проекте, то думаю, у меня нет иного выхода как писать что-то похожее на VBA, но под NET! Помогите разобраться как запустить команду через командную строку СИНХРОННО...

Немножко подкорректировал VB.NET код, чтобы не путались однополчане... Может я правда РАЗДЕЛ не верный указал.

Отмечено как Решение Пашин Евгений 25-08-2015, 14:24:07

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #7 : 25-08-2015, 13:58:15 »
Попробуй вместо:
Код - vb.net [Выбрать]
  1. <CommandMethod("alllayoutshow")> _
написать:
Код - vb.net [Выбрать]
  1. <CommandMethod("alllayoutshow",  CommandFlags.Session)> _
Не уверен, но шансы есть. Если не получится, то у тебя только один вариант - полностью переписать код на .NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Не срабатывает SendCommand
« Ответ #8 : 25-08-2015, 14:00:43 »
О, как раз то, что на страницах сайта Андрея Бушмана я обнаружил

SendCommand или SendStringToExecute?
дата публикации: 13.12.2011
SendCommand

Метод Autodesk.AutoCAD.Interop.AcadDocument.SendCommand работает синхронно, если флаг CommandFlag == Session. В этом случае, прежде чем вносить изменение в Autodesk.AutoCAD.ApplicationServices.Document, его в обязательном порядке необходимо предварительно заблокировать.
SendStringToExecute

Метод Autodesk.AutoCAD.ApplicationServices.Document.SendStringToExecute всегда работает асинхронно.


Сейчас попробую!!!




Не уверен, но шансы есть. Если не получится, то у тебя только один вариант - полностью переписать код на .NET

Хорошо бы! Если только меня не уволят раньше времени за просрок задачи!

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Не срабатывает SendCommand
« Ответ #9 : 25-08-2015, 14:03:54 »
Код - vb.net [Выбрать]
  1. <CommandMethod("alllayoutshow",  CommandFlags.Session)> _

Есть где-нибудь описание всех флагов, на что они влияют и как они работают?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #10 : 25-08-2015, 14:05:09 »
Есть где-нибудь описание всех флагов, на что они влияют и как они работают?
http://help.autodesk.com/view/ACD/2015/ENU/?guid=GUID-F77E8FE0-8034-4704-93BD-F717608F8223
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Не срабатывает SendCommand
« Ответ #11 : 25-08-2015, 14:07:55 »
Ну что ж!

Код - vb.net [Выбрать]
  1. <CommandMethod("alllayoutshow",  CommandFlags.Session)> _

Код отреагировал, переключение произошло на первый LT1, но линии теперь (все 10 штук) отрисовались на листе LT1!

По-моему решение где-то рядом! Уверен! Попробую посмотреть про флаги информацию.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #12 : 25-08-2015, 14:10:32 »
Посмотри что у тебя печатается в командной строке. Для это установи системную переменную CMDECHO в 1
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #13 : 25-08-2015, 14:17:07 »
acDoc.Layouts.Add ("LT" & i) возвращает Layout. Ты можешь для добавления на него отрезка использовать его, а не .ActiveLayout
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Не срабатывает SendCommand
« Ответ #14 : 25-08-2015, 14:22:33 »
Александр, Вы просто не представляете какой я дундук! Я запускал оказывается все это время не ту команду )))))

А главное Вам я показал правильный код:
Код - vb.net [Выбрать]
  1. ...
  2.             For i = 1 To 10
  3.                 acDoc.Layouts.Add("LT" & i)
  4.                 acDoc.SendCommand("_ctab" & vbCr & "LT" & i & vbCr)
  5.                 acApp.Update()
  6.                 acDoc.ActiveLayout.Block.AddLine(p1, p2)
  7.                 acDoc.SendCommand("_zoom" & vbCr & "_e" & vbCr)
  8.                 MsgBox("Лист LT" & i & " активен!")
  9.             Next i
  10. ...
  11.  


а запускал вот этот код )))) Ну не дундук ли я после этого?
Код - vb.net [Выбрать]
  1. ...
  2.             For i = 1 To 10
  3.                 acDoc.Layouts.Add("LT" & i)
  4.                 acDoc.SendCommand("_ctab" & vbCr & "LT" & i & vbCr)
  5.                 acApp.Update()
  6.                 acDoc.ActiveLayout.Block.AddLine(p1, p2)
  7.                 'acDoc.SendCommand("_zoom" & vbCr & "_e" & vbCr)       ' Нужно было раскомментировать эту строку
  8.                 acDoc.SendCommand("_zoom" & vbCr & "_w" & vbCr)       ' На этой то строке все повисало ))))
  9.                 MsgBox("Лист LT" & i & " активен!")
  10.             Next i
  11. ...
  12.  





ВСЕ ЗАРАБОТАЛО!

Решение:

Код - vb.net [Выбрать]
  1. <CommandMethod("alllayoutshow", CommandFlags.Session)> _


СПАСИБО!!!