Тема: SendCommand или альтернатива???

Из макроса вызываю через sendcommand LISP-функцию
проблема в том, что функция выполняется некоторое время, а управление сразу возвращается в макрос. Как сделать так, чтобы управление из LISP передавалось только по окончании работы LISP-функции

Re: SendCommand или альтернатива???

В свое время тоже думал, как проделать такой фокус, но ничего не нашел и не придумал. По-видимому, на уровне VB(VBA) это невозможно. Методом SendCommand порождаешь новый процесс, которым не управляешь. То есть, управление не
"возвращается в макрос", оно из него не уходит.
В итоге, стараюсь использовать SendCommand как можно меньше и, желательно, в конце макроса.
С другой стороны, можно организовать паузу в выполнении кода. Если это поможет...

 Sub vPause()
    Dim PauseTime As Single
    Dim Start As Single
    Dim Finish As Single
 'пауза в 1 сек.
    PauseTime = 1
    Start = Timer
    Do While (Timer < Start + PauseTime)
        DoEvents
    Loop
End Sub

Re: SendCommand или альтернатива???

Пауза мне кажется не лучшй выход(ее значение может не всегда хватить)
Может сделать в лиспе возврат какого нибудь значения что все ОК, а в VB(VBA) после запуска команды ждать ответа. За одно можно и выполнение работы LISP-функции проверить

Re: SendCommand или альтернатива???

По идее можно поробовать использовать системные переменные типа UserS*, поскольку они все рано не хранятся в чертеже (насколько я помню). Так что в VBA прочитать и обнулить значение UserS, в лиспе устанавливать. В VBA по ходу проверять на измененность UserS. Только у меня сильное подозрение, что можно достаточно легко обойтись и без SendCommand...

Re: SendCommand или альтернатива???

Кулик Алексей aka kpblc Только у меня сильное подозрение, что можно достаточно легко обойтись и без SendCommand...

если не сложно, подскажите, как обойтись без SendCommand?
функцию из Лиспа на VBA перевести не получается, возникает ошибка
код VBA на Лисп переносить не очень хочется, но похоже к этому все идет
результат работы функции - SelectionSet по определенным параметрам (критичен DXF код 38, он в VBA не работает)
попробовал оба варианта, предложенных Solik и LeonidSN, к сожалению, не работают
Возможно, LISP запускается даже не отдельным потоком, а ждет окончания работы макроса (такое сложилось впечатление)

Re: SendCommand или альтернатива???

Как сделать так, чтобы управление из LISP передавалось только по окончании работы LISP-функции НЕ знаю прокатит ли это с лиспом или нет но на VBA с SendCommand проделывал такое. Сейчас дезинсталировал VB так что по памяти раскажу. Суть там была в том чтоб создать ошибку а On Erorr направит нашу прогу в нужное русло.

Re: SendCommand или альтернатива???

> Владимир
[rus] Poprobuj otslezhivat' v cikle znachenie sistemnoj peremennojj
[/rus]
CMDACTIVE
[rus]Po idee posle zavershenija tvoego lispa ona dolzhna obnulit'sja
[/rus]

Re: SendCommand или альтернатива???

> Владимир
Я так понял, что это продолжение темы https://www.caduser.ru/forum/topic33503.html
Тут кроме как использовать удаление объектов, что показал Fatty, я придумать тоже ничего не могу. Выбранные объекты могут быть не в текущем пространстве, так что как бы то ни было: пускай получен лиспом SelectionSet. Но подсветить его, например, нельзя. Надо все примитивы (точнее, их хендлы) куда-то засовывать, а потом считывать. В общем, не гуд - что в лоб, что по лбу.
ИМХО, естественно.

Re: SendCommand или альтернатива???

> Solik

> Кулик Алексей aka kpblc

> Gogi
По-моему, это все более или менее усовершенствованные варианты "менопаузы"...
Если уж тут, как зорко рассмотрел > Кулик Алексей aka kpblc (2007-02-27 12:51:39), идет продолжение предыдущей темы, и там критичным оказалось время перебора примитивов, то можно попробовать улучшить цикл, исключив из него переопределения динамического массива:

ReDim remObjects(oSset.Count) As AcadLWPolyline
On Error Resume Next
    i = 0
     For Each oEnt In oSset
          If oEnt.Elevation <> dblElev Then
              Set remObjects(i) = oEnt
              i = i + 1
          End If
    Next
    'удаляем пустые элементы массива один раз!
    [b]ReDim Preserve remObjects(i - 1)[/b]
    oSset.RemoveItems remObjects

Re: SendCommand или альтернатива???

Что такое VBA я не знаю, но попробуйте обработку событий
BeginLisp, EndLisp, BeginCommand, EndCommand

Re: SendCommand или альтернатива???

спасибо всем откликнувшимся
переписал на лиспе, работает
проблема в скорости работы в VBA была не в переопределении массива, а в работе метода IntersectWith
задача стояла найти пересекающиеся линии
алгоритм - тупой перебор цикл в цикле
потом оптимизировал, на небольших количествах работала приемлимо, на приличных доходило до часов
дальше выяснился критерий, по которому можно набирать в selset для проверки не все линии, а с диапазоном Elevation. Как оказалось, в VBA сделать так не получается (по крайней мере у меня не получилось). Очень жаль, VBA для меня удобнее

Re: SendCommand или альтернатива???

> Владимир
проблема в скорости работы в VBA была не в переопределении массива
Тем не менее, НИКОГДА не включайте это переопределение в цикл.
И еще, самое трудное, - постарайтесь формулировать проблему по-конкретнее.

> ShaggyDoc
Что такое VBA я не знаю...
Никто этого не знает, но те которые ЭТИМ пользуются, с грустью и разочарованием убеждаются, что вышеназванные методы работают ненадежно. Более того, эти энтузиасты слышали, что и применение реакторов в т.н. "Расширенном LISP'е" довольно проблематично. А последняя надежа и опора всех Автокадовских программистов-прикладников - ObjectARX тоже требует каких-то дополнительных усилий по выявлению и осознанию надежных методов работы с реакторами... Все это выглядит, по моему скромному мнению, как общая проблема программирования под AutoCAD.