Re: VBA vs LISP

> Alexander
Они приходят не в бешенство - а пытаются поклонников басиков направить на путь истинный! Раскрыть им глаза, так сказать!

Re: VBA vs LISP

ShaggyDoc пишет:

Например, из VBA можно вызвать функцию из обычной DLL (не COM)

... а из Лиспа можно выполнить VBA-макрос ф-ей (vl-vbarun ...) ;)
А данные Бейсик Лиспу передаст через User Dictionary, или ещё как-то (см. мой постинг > Maxim T (2004-06-26 14:10:18) в ветке https://www.caduser.ru/forum/topic10765.html и всю ветку https://www.caduser.ru/forum/topic7916.html).
То есть и это "преимущество" Бейсика - бито :)

Re: VBA vs LISP

> Maxim T
Поклонникам Бейсика:
Приятно видеть энтузиаста, это честно, без иронии. Я, например, прочитал и задумался, a являюсь ли я поклонником языка Visual Basic? Поклонником, безусловно, нет, но предпочитаю его. Почему? Вот мнение  оппонента:
[Re:] Который против басиков (2004-06-24
...вообщем все это дело вкуса, привычек и предпочтений,
Согласен.Ну а кроме привычек ...? Почему-то никто не сказал, что  VB - это современный язык, а AutoLisp архаичен (при всей его мощи и красоте), что VB адекватен иерархической объектной модели AutoCAD'а, а попытки расширить AutoLisp в этом направлении выглядят, воля ваша, неуклюже, как одежда с чужого плеча. В основе этой неуклюжести, вероятно, лежит неудачная попытка совместить два несовместимых стиля или подхода в программировании - процедурный и функциональный.
По большому счету, иерархическая объектная модель AutoCAD'а
является методологической основой прогаммирования под AutoCAD - что в VB, что в ObjectARX, что в LISP'е.В итоге, прогаммы на VB(VBA) выглядят стройнее и прозрачнее, чем на
LISP'е.Они понятнее, их легче разрабатывать - разве это не преимущество?!

Re: VBA vs LISP

Leonid пишет:

В итоге, прогаммы на VB(VBA) выглядят стройнее и прозрачнее, чем на LISP'е. Они понятнее, их легче разрабатывать...

Понятнее и легче их разрабатывать для тех кто в лиспе не разбирается и не пытается разобраться! А басик - он как был 20 лет назад примитивным так и остается не смотря на то что его наворотили!

Re: VBA vs LISP

Недавно столкнулся вот с каким недостатком Lispa который меня просто убил - лисп не позволяет работать интерактивно в разных документах. Конечно виноват в этом не лисп, а фирма autodesk которая не знаю по каким причинам ввела ограничения по работе в многодокументном режиме. Тоже самое касается DCL, вызова функций из DLL и др. Видимо autodesk не хочет давать нам в руки мощный инструмент. Ау  ShaggyDoc как думаеш. Но несмотря на это уходить из лиспа не собираюсь, нравится он мне как древняя Leica фотографу.

Re: VBA vs LISP

> Который против басиков
вот ты и попался. VB ты не знаеш, иначе бы не говорил

А басик - он как был 20 лет назад примитивным так и остается

Re: VBA vs LISP

> Alexander
писал на басике лет 10 назад, как освоил си - забыл, что такое басик.... для школьников он хорош, чтоб не отпугнуть малышей от мира компутеров!

Re: VBA vs LISP

> Который против басиков
И мы можем увидеть ваши работы?

Re: VBA vs LISP

> Alexander
я не занимаюсь пока просветительской деятельностью и сайта у меня нет пока. Звучит забавно - правда?

Re: VBA vs LISP

Maxim T пишет:

То есть и это "преимущество" Бейсика - бито

Не надо передергивать. Обращение к DLL и, соответственно, к WinAPI это действительно преимущество VBA.

Который против басиков пишет:

писал на басике лет 10 назад

Нельзя сравнивать Basic тех времен (даже лучшие варианты TurboBasic или QuickBasic) с современными. В этом

> Alexander
прав.  VB.NET стал настолько хорош, что его даже "Дельфины" признают, но сами VB-шники (традиционные) пугаются.

как освоил си - забыл

Ну, некорректно владельцу КАМАЗа спорить с обладателем ЗАЗ

Alexander пишет:

Видимо autodesk не хочет давать нам в руки мощный инструмент

Совершенно верно. Фирма дает то, чтобы думали, что и "мы это можем". Мощный инструмент есть - ObjectARX, но это для избранных, да еще и сговор с Microsoft - для каждой версии Автокада прикупайте новую версию Visual Studio.
Удивительно, но меня вынудили вроде как зашищать VBA! Давайте корректней - если есть достоинства, то их не замалчивать.

Re: VBA vs LISP

> ShaggyDoc
я так понимаю что Камаз - это лисп а ЗАЗ это басик?

Re: VBA vs LISP

Примечания к тексту:

...VB адекватен иерархической объектной модели AutoCAD'а...

IMHO, здесь перемена причины и следствия: на самом деле, когда к AutoCADу "присоединили" еще и BASIC, тогда Autodeskи и иерархическую объектную модель для него соорудили (ежели ему без нее нельзя).

...VB - это современный язык, а AutoLisp архаичен...

Да, действительно, как ни странно, LISP - ровесник Fortranа (про который уже все забыли, а тоже говорили "язык современный"), так что остается дождаться, когда время современности BASICа просто пройдет. А LISP не архаичен, а неимперативен.

Re: VBA vs LISP

> VH
Не думаю,что перепутал причины и следствия. Объектная модель AutoCAD в современном понимании  была разработана при создании библиотек ObjectARX, а начиная с 15-й версии ядро AutoCAD (как вам, наверняка, известно) написано на С++ в ObjectARX.Т.е. AutoCAD по всем признакам является объектно-ориентированной системой. Что касается объектной модели AutoCAD для VB(VBA), то она представляет собой программный интерфейс обеспечивающий доступ процедурам VB к возможностям и средствам этого самого ядра.
И в силу такой связи она (объектная модель AutoCAD для VB
(VBA)) базируется на АКАД-овской структуре и отражает ее.
    Но не это главное.Даже если ...когда к AutoCADу "присоединили" еще и BASIC, тогда Autodeskи и иерархическую объектную модель для него соорудили (ежели ему без нее нельзя) то это не умаляет заслуги Autodesk'ов
в деле помощи программистам-прикладникам. Потому что без объектной модели, действительно, никак нельзя.
P.S. Вы и вправду полагаете, что "архаичный" это ругательство?

Re: VBA vs LISP

Как-то пытался объяснять человеку, чем отличается ручная стирка от стирки машинкой-автоматом, в плане сило-затрат. Так и не смог. Спустя год - купил он ее. Теперь и объяснять ничего не надо.

Re: VBA vs LISP

Да, помогите человеку на Lisp форуме: "Подскажите пожалуйста, как отфильтровать примитив с точно известным значением расширенных данных, используя команду ssget "X"?"
На VBA это делается с пол-....

Re: VBA vs LISP

> 3dcad
этот вопрос уже обсуждался на форуме

(setq cod (getstring "Код объекта: "))
(setq ss (ssget "X" (list (list -3 (list "TOPOCOD" (cons 1000 cod))) )))

где "TOPOCOD" - название РД, cod - значение расширенных данных, НО работает только с полилиниями и штриховкой.
Подскажите,плз, как это сделать на VBA?

Re: VBA vs LISP

'Пример, как взять расширенные данные у любого примитива
    Dim xdataOut As Variant
    Dim xtypeOut As Variant
    Dim ret_obj As AcadObject
    Dim pick_pt As Variant
    ThisDrawing.Utility.GetEntity ret_obj, pick_pt, "Укажите примитив: "
    ret_obj.GetXData "", xtypeOut, xdataOut
' Далее, следует проанализировать значение переменных  xtypeOut и xdataOut
'-----------------------------------------------------------------

Re: VBA vs LISP

> 3dcad
ух, тебя счас знатоки лиспа умоют.
И по делу...
______________
Удачи.

Re: VBA vs LISP

Прошло 5 часов. Полет нормальный, kos!

Re: VBA vs LISP

> 3dcad
На лиспе это будет так:

(cdr (assoc -3 (entget (car (entsel)) '("my_app1" "my_app2" "my_app3"))))

вернёт что-то вроде:
(("my_app1" (1040 . 1.0) (1040 . 4.77059e+006)) ("my_app1" (1040 . 1.01367e+006)) ("my_app3" (1040 . 1.01)))
Список загруженных приложений можно получить, вызывая подряд (tblnext "APPID"), пока не вернёт nil. Первый раз надо вызывать(tblnext "APPID" T). Ну, конечно, совсем р-а-з-ж-ё-в-а-н-н-о: (cdr (assoc 2 (tblnext "APPID" t)))
Это, имхо, полная энциклопедия по извлечению расширенных данных с помощью Автолиспа:). Кстати, все примеры работоспособны, начиная с 10-й версии включительно (если кто помнит такую).
Справедливости ради следует сказать, что расширенные данные похоронены Автодеском в угоду МС. И поэтому (только поэтому) их нельзя использовать в функциях обработки реакторов.

Re: VBA vs LISP

для Maximа T
Как говорил Буратино: "Врете, Вы, все".
Проверил этот Lisp-код - данные не дает.
Могу выслать dwg-файл - проверите сами.
А, вот на VBA работает как часики.
Ну и совсем не понятно, что значит: "расширенные данные похоронены Автодеском" ?.

Re: VBA vs LISP

(cdr (assoc -3 (entget (car (entsel)) ([b]list[/b] "my_app1" "my_app2" "my_app3"))))

Если для всех приложений

(cdr (assoc -3 (entget (car (entsel "\nА примитивчик?")) (list "*"))))

Re: VBA vs LISP

КО ВСЕМ.
Хорошо, объясните, пожалуйста, мне - лисперу, весьма плохо знающему VBA - как сделать такую весчь.
Надо на уровне модуля задекларировать целую константу maxCount (ну это просто:), а потом в цикле по i от 0 до maxCount-1 проинициализировать некий глобальный массив строками вида: PrefixConst + Str(i) + SuffixConst. Сделать это надо только один раз, при загрузке DVB-шника.
А вот это фиг! At module level, you can use only comments and declarative statements. ИМХО, это значит, что я должен внутри каждой процедуры, где используется этот массив, каждый раз проверять его (функцией isEmpty, если не ошибаюсь), и при необходимости - инициализировать. Немного через зад (в смысле быстродействия), или я не прав ???
Я уже не говорю, что на Лиспе я при желании могу наделать maxCount переменных (правда, всегда только глобальных) с именами var0, var1 ... прямо во время исполнения, если мне это понадобится, и сделать это в любом месте кода, где вздумается.
И вдогонку: Procedures can't be nested within other procedures. Занавес.

Re: VBA vs LISP

Не уверен, что правильно понял. Задача: при первом запуске АКАДа инициализировать некий массив и в процессе дальнейшей работы получать его из разных процедур (функций). Если у Вас один выполняемый проект, то без вопросов.
Итак есть автоматически загружаемый проект myProect.dvb.
1. В модуле ThisDrawing этого проекта
а). Декларируем переменную уровня модуля

Dim myArr As Variant.

б). Пишем процедуру для инициализации массива.

Sub qqq()
Dim tempArr() As String
Dim i As Long, maxCount as Long
maxCount = 100
For i = 0 To maxCount - 1
    ReDim Preserve tempArr(0 To i) As String
    tempArr(i) = "Ля-ля-ля Жу-жу-жу: " & i
Next
myArr = tempArr
End Sub

в). Пишем процедуру для получения этого самого массива.

Property Get GetMyArr() As Variant
GetMyArr = myArr
End Property

г). В файле acad.lsp прописываем

(command "_.-vbarun" "Диск:\Папка\myProect.dvb!ThisDrawing.qqq")

или если путь Диск:\Папка включен в поддержку путей

(command "_.-vbarun" "myProect.dvb!ThisDrawing.qqq")

д). Из любой процедуры (функции) данного проекта получаем нужный массив

Dim myArr As Variant
myArr = ThisDrawing.GetMyArr

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

Re: VBA vs LISP

Из своего опыта работы в Visual Lisp и в VBA могу сказать что почти не было затруднений Visual Lisp-> Объектная модель ACAD(разве что из-за недостатка техописания, кстати кто-нибудь может посодействовать получить доступ к ADN, а также хотелось бы ознакомиться с Object Modeler Framework для ADT), но не все можно "достать" из VBA и приходиться опускаться до AutoLisp c entget и dxf code.
Насчет быстродействия, отзовитесь у кого есть опыт работы с SharpLisp, я сам использую пока только ObjectDCL, очеть рекомендую.