Архитектору и проектировщику|Тепло- и звукоизоляция URSA.RU
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > VBA vs LISP

VBA vs LISP

Ответ
Поиск в этой теме
Непрочитано 06.02.2007, 15:50 #1
VBA vs LISP
Kosenko Sasha
 
Kiev
Регистрация: 10.01.2007
Сообщений: 12

Доброго времени суток.
Уважаемые программеры в чем состоит разница между VBA и Лиспом. Что для чего используется, простенькие проги как то поиск текста и его замена, вывод окошка для чего то или управления чем то я делаю в VBA, а для чего ЛИСП и как в нем программировать не знаю.
И еще подскажите литературу в которой можно прочитать о командах VBA, в англ не сильно.
Ну, и на всякий случай ссылку литературу по ЛИСПу скинте.
Заранее все благодарен.
Просмотров: 12118
 
Непрочитано 06.02.2007, 16:13
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,760


http://www.cad.dp.ua/
http://www.arcada.com.ua/forum/viewtopic.php?t=522
Это для начала
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.02.2007, 18:28
#3
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Да на самом деле все можно средствами VBA решить. Особенно, если речь идет о связи с другими приложениями, типа Word, Excel и пр. Я вот LISP не знаю совсем. Это, конечно, не плюс, но пока обходился. В VBA, насколько я понимаю, гораздо легче создавать формы. Да и сам язык понятнее, привычнее. Чтобы работать в LISP'e, нужно мозги иначе повернуть, из-за чего мы с ним и не сдружились. Некогда в такие глубины буриться, программирование для меня - хобби, а работа не ждет.
den001 вне форума  
 
Непрочитано 09.02.2007, 02:38
#4
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
  • Скорость. Приложения ActiveX работают быстрее программ AutoLISP.
    Простота в использовании. Язык и среда разработки VBA легки в освоении и использовании. Установка VBA производится вместе с AutoCAD.
    Взаимодействие с приложениями Windows. ActiveX и VBA разработаны для использования в приложениях Windows и предоставляют прекрасные возможности для организации взаимодействия и обмена данными между различными приложениями.
    Быстрота разработки. Благодаря быстроте проектирования интерфейса приложений с помощью VBA, данная среда может служить прекрасным средством для создания приложений-прототипов, даже если окончательная реализация планируется на другом языке программирования.
    Распространенность. Во всем мире миллионы программистов пользуются языком Visual Basic. Наличие AutoCAD ActiveX/VBA дает возможность выполнять адаптацию AutoCAD и разрабатывать под него приложения программистам, уже владеющим языком Visual Basic 6 или собирающимся его изучать.
и поработав на VB под автокадом можно плавно перейти на VB.NET - а там уже можно вполне серьезные приложения писать)
Димас вне форума  
 
Непрочитано 09.02.2007, 02:47
#5
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


да, и еще)
считаю лисп тупиковой ветвью для изучения - насколько знаю на лиспе можно писать программы только для ACad платформы
на бейсике же мы ни к какой платформе не привязаны - можно писать любые программы, не только для Autocad

если не прав - поправьте))
Димас вне форума  
 
Непрочитано 09.02.2007, 08:25
#6
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


Два примера.

1. Пусть prg - список типа cmd1, cmd2, .... Этот список условно назовем программой пользователя, а cmd1 и т.д. - функции, определенные программистом.
Надо выполнить эту пользовательскую программу

LISP:
(foreach cmd_ prg (cmd_))

VBA:
for each cmd_ in prg
if cmd_="cmd1" then
call cmd1
exit for
end if
if cmd_="cmd2" then
call cmd2
exit for
end if
next cmd_

Чем больше программист создает функций, тем лучше :-)

2. Косвенная адресация переменных.

LISP:
(setq a 'b) - переменная а является ссылкой на переменную b
Любое изменение b автоматически приведет к изменению a
Для работы с объектами тоже подходит.

VBA:
set a {объект} - аналогично, но только с объектами, не с числами

Вообще я много работаю с VBA в MS Office. Но после этих двух примеров в AutoCAD`e пишу в основном на LISP. Если честно, я в этот язык просто влюбился :-).
Ax3 вне форума  
 
Непрочитано 09.02.2007, 08:36
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,760


Очередная религиозная война - "что лучше - VB, VC, Delphi, AutoLISP, gcc?"
Хоть лично и считаю подобные споры достаточно беспредметными, все же выскажусь.
"поработав на VB под автокадом" - звучит круто. Только, как бы это сказать... В общем, попробуй выполнить VB-код на машинах с отключенной поддержкой VB 5-й версии (обрати внимание, я пока говорю про VB, а не про VBA). Поддержка VBA может быть отключена в процессе установки AutoCAD'a; на AutoCAD LT VBA не поддерживается никакими силами (в отличие от lisp / arx); для корректной работы с AutoCAD как с СОМ-сервером из-под VB надо по логике использовать позднее связывание, что череповато боком - в зависимости от версии может отличаться подход (даже если забыть про быстродействие подобного подхода).
Мне не всегда удавалось в VB выполнить конструкцию Select Case, сравнивающую разные значения разных параметров, типа:
Код:
[Выделить все]
Select Case
  Case Var1 = 1
  ' Do smth
  Case Var2 = 15
  ' Do smth2
  Case InStr(CStr(Var16),"'") <> 0
  ' Do smth3
End Select
В лиспе же это выполняется "на ура".
Попробуй на VB прописать командный реактор, или реактор на двойной клик, или объектный реактор - у меня не получилось (хотя, если честно, я особо и не старался).
Или вот еще задачка: попробуй на VB (или VBA, не важно) создать или переопределить размерный стиль, с учетом "подстилей" - то есть для AlignedDimention и RotatedDimention один стиль, для Radial и Diametr - другой ну и так далее. Именно стиль, а не свойства конкретного размера!
Использование .NET тоже не фонтан - поддерживается только в версиях от 2005 и выше, а lisp практически одинаков в любом варианте.
Лично я пришел к следующей схеме: диалоги, использующие "красивости", засовываю в dll (VB6), классы которой и вызываю из-под лиспа.
P.S. На Basic'e, хочешь ты того или нет, а все равно привязан к Windows . Хочешь свободы - переходи на С++
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.02.2007, 08:54
#8
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Оставьте споры о том, какой язык лучше тем, кто не умеет писать ни на одном... :roll: 8)
Alaspher вне форума  
 
Непрочитано 09.02.2007, 09:05
#9
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc
"поработав на VB под автокадом" - звучит круто. Только, как бы это сказать...
ни каким образом не хотел сказать что я "гуру", наоборот, считаю свои познания очень слабыми, и все же мне этого хватает))
и вот именно - что "поработав", написал программку и можно сказать что забыл)
Цитата:
Сообщение от Кулик Алексей aka kpblc
..Поддержка VBA может быть отключена в процессе установки AutoCAD'a..
может, но при покупке моей программы - это оговоаривается и включается)
Цитата:
Сообщение от Кулик Алексей aka kpblc
...Или вот еще задачка: попробуй...
а мне вот нужно сейчас с directx работать, что тут лисп сможет сделать?
Цитата:
Сообщение от Кулик Алексей aka kpblc
P.S. На Basic'e, хочешь ты того или нет, а все равно привязан к Windows ;). Хочешь свободы - переходи на С++ :lol:
свободы в пределах windows платформы лично мне хватит)
согласен что лисп для автокада может чем-то быть лучше, но если не хочешь как программист зацикливаться на одном (на автокаде) - то все-таки лучше учить не лисп

приемущества VB я написал в посте #4 - остальное все - оприделяется привычкой и знанием языка)

может тему стоит закрыть? чтоб флейма и прочих войн не было?
Димас вне форума  
 
Непрочитано 09.02.2007, 09:13
#10
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


и еще)
в догонку

имеем некую программу написанную на лиспе, работает с большими объемами данных и работает медленно, порой очень медленно
руки так и чешутся переписать ее на vb))

вот еще один "+" VB

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

конечно все зависит от оптимизации кода, но если на лиспе прийдется сидеть тратить время на оптимизацию кода, то вполне вероятно что в vb не тратя время на оптимизацию (то есть за меньшее время) будет написана программа с таким же быстродейстивем, а при оптимизации кода (то есть потратив столько же времени что и лисп программист), получится пограмма работающая быстрее

немного путанно получилось)
Димас вне форума  
 
Непрочитано 09.02.2007, 09:17
#11
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Совсем недавно приходила мысль, столько споров уже было, с какой стороны бутерброд маслом мазать, а про Lisp и VBA не было. Сглазил, видать.
У Lisp'a есть один очень серьезный, все перечеркивающий минус - я его не знаю, а учить некогда Да и острой необходимости нет, в VBA еще много где можно покопаться.
den001 вне форума  
 
Непрочитано 14.02.2007, 19:03 Re: VBA vs LISP
#12
ynopum


 
Регистрация: 26.03.2006
Сообщений: 20


в LISP-e >R15 - т.е. т.нар. VisualLISP в версиях выше R14-ая -можно изпользовать ActiveX комманд, аналогичные с VBA.

Интересно то, что я установил что не во всех случаях ActiveX быстрее с еквивалентным LISP. Так например обращение и изменение сложных обектов (щриховки, полилинии, конечно регионы - там очень ограничено все) - Activex быстрее. А например для создания обектов как линии, и 2DSOLID - простый лисп быстрее. Ето очень странно.. но кажется все дела очень недоделанные из строны аутодеска - и так и будет в будуще.


Ну на тему:
По моему для нормального человека - нужен только Basic. (VBA). Если нужно сделать не больше 10 программ в жизни - ето вариант без алтернатив.

Если нужно чувствовать удовольствие - ЛИСП нет алтернативой. Есть конечно и ЛИСП для создания ЕХЕ-шников, которые конечно ничего общего с Аутокаду нет, но и не интересно для форуме. Каждый, кто может сравнить ЛИСП с "нормальный алгоритмический язык" - скажет что удовольствие из ЛИСПа несровнимо.

Для нормальному человеку - VBA.
Для сумасшедшые профи-программисты - LISP (для гимнастики мышления, и конечно удоволствие, которое она приносить)
ynopum вне форума  
 
Непрочитано 14.02.2007, 23:28
#13
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


Насчет удовольствия - полностью поддерживаю. И не только я.
Лично общался, правда, только с двумя программистами на LISP, но оба в голос подтвердили: что ни говори, а писать на нем приятно.
При всем уважении к VBA - мое отношение к нему не выходит за рамки, так сказать, официального.
P.S. Гм, толочь воду в ступе тоже бывает забавно...
Ax3 вне форума  
 
Непрочитано 15.02.2007, 06:49
#14
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,787


Автокад 2008 + Lisp
Форева
Пхож будут лисповские проги работать по быстрее, ну эт конечно вопрос к КрЫсу
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 15.02.2007, 08:31
#15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,760


> DEM: Судя по информации от Autodesk'a, VBA может работать медленнее в 2008 по сравнению с 2006 или 2007 версиями.
> остальным спорщикам: попробуйте на VBA накатать аналог этих лиспов (достаточно простые, кстати, прожки):
Код:
[Выделить все]
(defun c:teach1 (/ pt_start pt_corner)
  (if
    (and (setq pt_start (getpoint "\nНачальная точка прямоугольника <Выход> : "))
         (setq pt_corner (getcorner pt_start
                                    "\nКонечная точка прямоугольника <Выход> : "
                                    ) ;_ end of getcorner
               ) ;_ end of setq
         ) ;_ end of and
     (progn
       (mapcar '(lambda (x)
                  (entmakex (list (cons 0 "CIRCLE")
                                  (cons 8 "CIRCLES")
                                  (cons 10 x)
                                  (cons 40 2.5)
                                  ) ;_ end of list
                            ) ;_ end of entmakex
                  (mapcar
                    '(lambda (y)
                       (entmakex (list (cons 0 "LINE")
                                       (cons 8 "LINES")
                                       (cons 10 (car y))
                                       (cons 11 (cadr y))
                                       ) ;_ end of list
                                 ) ;_ end of entmakex
                       ) ;_ end of lambda
                    (list (list (polar x 0. 2.5) (polar x pi 2.5))
                          (list (polar x (/ pi 2) 2.5) (polar x (* 1.5 pi) 2.5))
                          ) ;_ end of list
                    ) ;_ end of mapcar
                  ) ;_ end of lambda
               (list pt_start
                     (list (car pt_start) (cadr pt_corner))
                     pt_corner
                     (list (car pt_corner) (cadr pt_start))
                     (mapcar '(lambda (a b) (/ (+ a b) 2.)) pt_start pt_corner)
                     ) ;_ end of list
               ) ;_ end of mapcar
       ) ;_ end of progn
     ) ;_ end of if
  ) ;_ end of defun
и (вчера сделал, на коленке):
Код:
[Выделить все]
(defun c:temp (/ file_name file_handle *error* str pt_start)
  (defun *error* (msg)
    (vl-catch-all-apply '(lambda () (close file_handle)))
    (princ msg)
    (princ)
    ) ;_ end of defun
  (if (and (setq file_name (getfiled "Укажите файл с текстом " "/" "*" 2))
           (findfile file_name)
           (setq pt_start (getpoint "\nНачальная точка построений <Выход> : "))
           ) ;_ end of and
    (progn
      (if (= 0
             (setq text_height
                    (cdr (assoc
                           40
                           (entget (tblobjname "style" (getvar "textstyle")))
                           ) ;_ end of assoc
                         ) ;_ end of cdr
                   ) ;_ end of setq
             ) ;_ end of =
        (setq text_height
               (cond
                 ((getdist (strcat "\nУкажите высоту текста <"
                                   (rtos (getvar "textsize") 2)
                                   "> : "
                                   ) ;_ end of strcat
                           ) ;_ end of getdist
                  )
                 (t (getvar "textsize"))
                 ) ;_ end of cond
              ) ;_ end of setq

        ) ;_ end of if
      (setq file_handle (open file_name "r"))
      (while (setq str (read-line file_handle))
        (entmakex (list (cons 0 "TEXT")
                        (cons 100 "AcDbEntity")
                        (cons 100 "AcDbText")
                        (cons 10 pt_start)
                        (cons 40 text_height)
                        (cons 1 str)
                        ) ;_ end of list
                  ) ;_ end of entmakex
        (setq pt_start (list (car pt_start)
                             (- (cadr pt_start) text_height (getvar "dimgap"))
                             ) ;_ end of list
              ) ;_ end of setq
        ) ;_ end of while
      (close file_handle)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Хотя бы одну - и посмотрите на длину кода. Специально первый вариант усложнил немного На цельных 2 строчки.
---
ActiveX-подход необходим при работе с другим файлом (через ObjectDBX-интерфейс, например; или если файл открыт в этой же сессии AutoCAD'a); он практически незаменим при работе со словарями, записанными на примитив; он очень удобен при работе "внутрь" блока. Но попробуйте через activex (или VBA, что то же самое в принципе), например, добавить атрибут в конкретное вхождение блока, как это сделано у Alaspher'a. Ведь фига с два получится!
---
Добавлено:
Чего-то я упустил, что на посты Димаса не ответил. Прошу прощения, пытаюсь исправиться
Цитата:
и еще)
в догонку

имеем некую программу написанную на лиспе, работает с большими объемами данных и работает медленно, порой очень медленно
руки так и чешутся переписать ее на vb))
Никакой язык не исправит кривой алгоритм. Есть, конечно, в AutoLISP'e некоторые ограничения, но не думаю, что у тебя там идет вычисление факториала 32
Приложи задачку полностью - может, чего и придумается.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.02.2007, 09:48
#16
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


а в чем фишка то? скопировал кусок с хелпа.. чуть поправил, сам писать чет не могу в конце рабочего дня) так что извиняюсь за корявый код)
Код:
[Выделить все]
    Dim returnPnt As Variant
    Dim basePnt As Variant
    Dim circleObj As AcadCircle
    Dim center(0 To 2) As Double
    Dim radius As Double
    Dim numberOfRows As Long
    Dim numberOfColumns As Long
    Dim numberOfLevels As Long
    Dim distanceBwtnRows As Double
    Dim distanceBwtnColumns As Double
    Dim distanceBwtnLevels As Double
    Dim retObj As Variant
    
UserForm1.Hide'на всякий вдруг кто в форму запихает
    
    basePnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
    returnPnt = ThisDrawing.Utility.GetCorner(basePnt, "Enter Other corner: ")
    center(0) = basePnt(0) + (returnPnt(0) - basePnt(0)) / 2: center(1) = basePnt(1) + (returnPnt(1) - basePnt(1)) / 2: center(2) = basePnt(2) - returnPnt(2)
    radius = 2
    Set circleObj = ThisDrawing.ModelSpace.AddCircle(basePnt, radius)

        distanceBwtnColumns = returnPnt(0) - basePnt(0): distanceBwtnRows = returnPnt(1) - basePnt(1)
    
    retObj = circleObj.ArrayRectangular(2, 2, 1, distanceBwtnRows, distanceBwtnColumns, 1)
    Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius)

UserForm1.Show
линии доделывать влом - но алгоритм такой же рисую и размножаю как array
to kpblc
эт беспредметный спор - "а слабо на бейсике сделать как на лиспе")
считаю бейсик лучше только потому что программировать на нем можно и на других платформах - соответственно больше возможностей для применения
и можно ссылочку на инф-ю о более медленной работе VBA?
имею в виду версию для 32 автокада)
в крайнем случае очень легко перейти на VB.NET
быстродействие даже в 64 битной автокаде 2008 останется таким же
то бишь быстрее лиспа)
Димас вне форума  
 
Непрочитано 15.02.2007, 10:02
#17
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


to kpblc
добавление как-то пропустил)
см личку
Димас вне форума  
 
Непрочитано 02.03.2007, 22:46
#18
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Не очень хотелось эту тему из недр выволакивать, но тем не менее.

К вопросу о быстродействии.
Мне постоянно приходится воевать со всякими идиотскими слоями, планы приходят от архитекторов, преобразованные из Архикада. Был тут у нас объект весьма внушительных размеров. Соответственно, в чертеже слоев около сотни, и блоков несколько тысяч. Экспрессовская комадна laydel при удалении порядка 20 слоев повисла на ПОЛЧАСА. Не знаю, может там алгоритм кривой, но с досады написанный аналог на VBA с аналогичной работой справился за 15 СЕКУНД! Однако, разница. :shock:
den001 вне форума  
 
Непрочитано 03.03.2007, 11:23
#19
Spy

3d, проектирование диспетчеризации инженерных систем, автоматизация
 
Регистрация: 27.02.2007
Ростов-на-Дону
Сообщений: 136
<phrase 1= Отправить сообщение для Spy с помощью Skype™


Лисп проигрывает при 3-х мерном моделировании. (тем более если автокад не голый!). И на лиспе интерфейс для проектировщика не сделаешь!
Spy вне форума  
 
Непрочитано 05.03.2007, 09:29
#20
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,760


> den001: В экспрессах написаны универсальные проги. Учитывающие тьму параметров. Естественно, что код, написанный для конкретной ситуации, будет быстрее и проще. Например, надо назначить текстовый стиль. Ты понимаешь, что у тебя в данном чертеже только тексты и больше ничего. Поэтому пишется нечто наподобие (алгоритм описываю словам): выбрать все тексты и в цикле каждому установить новый стиль. Для универсального решения потребуется:
1. Разморозить и разблокировать все слои
2. Выбрать тексты, многострочные тексты, атрибуты, размеры и вхождения блоков с непостоянными атрибутами; исключить внешние ссылки из набора.
3. Назначить новый текстовый стиль примитиву. Возможно, потребуется дополнительно вычислять коэффициент изменения ширины для сохранения занимаемого текстом места. Для многострочных текстов придется дополнительно устанавливать ключ \W. Для однострочных и атрибутов - устанавливать выравнивание в Fit, что автоматически приводит к пересчету InsertionPoint и TextAlignmetnPoint.
4. Почистить файл от текстовых стилей.
5. Восстановить состояние слоев.
А какая, казалось бы, простая задачка...
В твоем конкретном случае я бы выбрал блоки, имеющие только одно вхождение и разбил бы их; потом почистить файл (и так либо несколько раз, либо до тех пор, пока не получится, что блоков-то с одним вхождением и нет); потом пройтись по всем описаниям блоков и установить цвет, тип и вес линии ByBlock; опять очистка. При выполнении таких действий я б постарался не забывать про атрибуты (хотя их при импорте из ArchiCAD'a почти никогда не бывает )
> Spy: Эт проблема не лиспа, а тех, кто пишет arx-дополнения для работы с 3Д. Там зачастую у создаваемых примитивов попросту нет dxf-представления. Только объектная модель. Но разве это препятствие? Междумордие, кстати, сделать можно - надо просто капитально голову поломать. Что лично мне делать постоянно попросту лень (мне проще VB в руки взять )
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > VBA vs LISP

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск