dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,964
Отправить сообщение для Red Nova с помощью Skype™

Red Nova вне форума Вставить имя

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 1297376
 
Непрочитано 07.06.2013, 09:36
#2001
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 409


Уважаемые софорумчане :-)

Прошу помощи, может кто предложит нормальное решение моей проблемки.

Итак,

имею файл .txt с разделителями Tab.

Открываю его в Excel.

И вместо номера позиции "4-1" получаю запись в ячейке "04.янв".

Как с этим бороться?

Пока рациональных мыслей нет )))

На всякий случай код функции, открывающей файл в Excel (взято у VVA и немного упрощено):

Код:
[Выделить все]
  
(defun adv-file-open-in-EXEL (path      /
         excelapp      sheet
         sheet_name_or_number
         workbook
        )
    (setq sheet_name_or_number 1)  ; 1 - первый лист файла Эксель 
  (setq ExcelApp (vlax-get-or-create-object "Excel.Application"))
  (vla-put-visible ExcelApp :vlax-true)
  (setq
    Workbook (vl-catch-all-apply
        'vla-open
        (list (vlax-get-property ExcelApp "WorkBooks") path)
      ) ;_ end of vl-catch-all-apply
  ) ;_ end of setq
  (setq sheet (vl-catch-all-apply
  'vlax-get-property
  (list (vlax-get-property Workbook "Sheets")
        "Item"
        sheet_name_or_number
  ) ;_ end of list
       ) ;_ end of vl-catch-all-apply
  ) ;_ end of setq
  (vlax-invoke-method sheet "Activate")
  (setq sheet nil
 WorkBook nil
 ExcelApp nil
  ) ;_ end of setq
 
  (gc)
  (gc)
  (PRINC "\nФайл настроек открыт в Exel.")
) ;_ end of defun
 
Frigate вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.06.2013, 09:48
#2002
Кулик Алексей aka kpblc
Moderator

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


Перед такими значениями принудительно попробуй поставить знак апострофа '
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.06.2013, 10:49
#2003
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Для открытия текстового файла с особыми параметрами юзай Workbooks.OpenText
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.06.2013, 12:28
#2004
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 409


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

так можно и любой ставить, например звездочку )))

я тоже к такому склонялся, хотя это вносит некую нестыковку и необходимость доработки таблицы.

Ладно, чую что нет иного выхода.

Дима_,
С применением методов VBA нет пока времени разбираться, может позднее.
Frigate вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.06.2013, 12:40
#2005
Кулик Алексей aka kpblc
Moderator

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


Frigate, символ апострофа принудительно переводит значение в строковое представление - по крайней мере при программном заполнении ячеек.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.06.2013, 12:53
#2006
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Методы VBA это сильно сказанно - а код Вашей функции какие методы применяет?? - все что Вам нужно - это подготовить FieldInfo для каждого столбца и вся проблема.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.06.2013, 21:49
#2007
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 409


Дима_,

я же писал, что это функция от VVA (вроде так).

Прошу помочь с написанием кода, если это не сильно затруднит.

Прилагаю файл txt с пробелами, который нужно открывать в Excel.


======добавлено===========

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


=============добавлено=============

помучался немного и решил открывать текстовый файл не из автокада а из экселя, так проще - макрос это не lisp )))

Хотя жаль, конечно.
Вложения
Тип файла: rar test.rar (701 байт, 42 просмотров)

Последний раз редактировалось Frigate, 08.06.2013 в 19:37.
Frigate вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.06.2013, 12:23
#2008
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Цитата:
Сообщение от Frigate Посмотреть сообщение
Смотрю на филдинфо ))) Немноо как китайская грамота. ПРимерчик бы )))
Код:
[Выделить все]
 (defun excel-open-text (excel path field)
  (vlax-invoke-method
    (vlax-get-property excel 'Workbooks)
    'OpenText path nil nil nil nil nil nil nil nil nil nil nil
    (if field
         (vlax-safearray-fill
            (vlax-make-safearray vlax-vbvariant
                                 (cons 1 (length field)))
         (mapcar
             '(lambda (x)
                (vlax-safearray-fill
                   (vlax-make-safearray vlax-vbinteger '(0 . 1))
                   x))
              field)))
    nil nil nil nil nil))
excel - vla указатель на excel, path - полное имя к файлу, field список списков в формате номер столбца (начиная с 1 и тип данных его данных - вот). С фиелдом, по крайней мере у меня на машине - не все гладко, на номер столбца он почему-то глубоко плюет - а расставляет типы данных тупо попорядку (пробовал "жестко" устанавливать DataType<-XlTextParsingType.xlDelimited - ему по боку) - почему не знаю (может в какаой другой variant завернуть надо - возиться лень)???
Пример вызова:
(excel-open-text (vlax-get-object "excel.application") "d:/test.txt" '((1 2) (2 2) (3 2) (4 2)))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2013, 11:40
#2009
Никита Ремизов


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


Код:
[Выделить все]
(defun C:MASSIVM ()
(setvar "cmdecho" 0)
(setvar "osnapcoord" 1)
(prompt "\nВыберите объекты: ")
(setq old_error *error*)
(setq *error* ERR_)
(setq
     LL        (ssget)
     W         (entget (ssname LL 0))
     TN        (cdr (assoc 10 W))
     S         (getreal "\n Шаг копирования: ")
);setq

(setq sp (getpoint "\nВведите первую точку отрезка распространения: "))
(setq ep (getpoint "\nВведите вторую точку отрезка распространения: "))
(setq pangle (angle sp ep))
(setq plength (distance sp ep))



(setq
          
     Q         (fix (/ plength S))
     TK        (polar TN pangle S)
     N         2)
(command "_.undo" "_be")
(repeat Q
(command "_.copy" LL "" TN TK)
(setq
      S1       (* S N)
      TK       (polar TN pangle S1)
      N        (+ 1 N))
);repeat
(command "_.undo" "_end") 
(setq *error* old_error)
);setq
(defun ERR_ (msg)
(command "_.undo" "_end")
(setq *error* old_error)
(princ)
)efun ERR
При работе данного лиспа, при вводе второй точки отрезка распространения не работает полярное отслеживание. Как сделать, чтобы работало?
Никита Ремизов вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2013, 15:14
#2010
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,552
Отправить сообщение для gomer с помощью ICQ Отправить сообщение для gomer с помощью Skype™


Цитата:
Сообщение от Никита Ремизов Посмотреть сообщение
При работе данного лиспа, при вводе второй точки отрезка распространения не работает полярное отслеживание. Как сделать, чтобы работало?
Почитай про функцию getpoint и ее аргументы в справке, а вообще это плохой, плохой лисп.. К тому же, следует помнить, что для вкл/выкл режима объектной привязки есть переменная autosnap

Последний раз редактировалось gomer, 26.06.2013 в 15:27.
gomer вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2013, 15:20
#2011
Никита Ремизов


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


Цитата:
Сообщение от gomer Посмотреть сообщение
Почитай про функцию getpoint и ее аргументы в справке, а вообще это плохой, плохой лисп..
В какой справке?
Лисп не моего авторства, может он и какой-то там очень плохой, но работает безотказно
Никита Ремизов вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2013, 15:20
1 | #2012
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,172


Цитата:
Сообщение от Никита Ремизов Посмотреть сообщение
При работе данного лиспа, при вводе второй точки отрезка распространения не работает полярное отслеживание. Как сделать, чтобы работало?
А вдруг, посмотреть негде?
Надо заменить строку
Код:
[Выделить все]
(setq ep (getpoint "\nВведите вторую точку отрезка распространения: "))
на строку
Код:
[Выделить все]
(setq ep (getpoint sp "\nВведите вторую точку отрезка распространения: "))
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2013, 15:33
1 | #2013
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,552
Отправить сообщение для gomer с помощью ICQ Отправить сообщение для gomer с помощью Skype™


Код:
[Выделить все]
 (if (zerop (logand 16 (setq as (getvar 'autosnap))))
 (setvar 'autosnap (+ 16 as))
)
gomer вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 03.07.2013, 00:31
#2014
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,552
Отправить сообщение для gomer с помощью ICQ Отправить сообщение для gomer с помощью Skype™


У кого-нибудь есть инфа по (_vl-times)? Что-то привирает она, как раз в 4 раза (по количеству ядер процессора, что ли?)
Код:
[Выделить все]
 
(defun dividers	(n / i lst)
  (setq
    i	1
    lst	'()
  )
  (while (<= i (/ n 2))
    (setq i (1+ i))
    (if	(zerop (rem n i))
      (setq lst (cons i lst))
    )
  )
  lst
)

(defun solve (a b / lst _timer _result len)
  (setq
    lst	   '()
    _timer (car (_vl-times))
  )
  (while (<= a b)
    (if	(>= (setq len (length (dividers a))) (cdar lst))
      (setq lst (cons (cons a len) lst))
    )
    (setq a (1+ a))
  )
  (setq	_result
	 (mapcar 'car
		 (vl-remove-if-not
		   (function (lambda (x) (= (cdr x) (cdar lst))))
		   lst
		 )
	 )
  )
  (princ "\nTime: ")
  (princ (* 0.001 (- (car (_vl-times)) _timer) 2 2))
  (terpri)
  _result
)
Самое интересное, что, если использовать (getvar 'date), то результат такой же... в общем я в прострации уже...
gomer вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 05.07.2013, 21:43
#2015
Flash51

ГКП
 
Регистрация: 18.01.2009
Подольск
Сообщений: 18
Отправить сообщение для Flash51 с помощью ICQ Отправить сообщение для Flash51 с помощью Skype™


Как в cond объединить несколько условий?

Последний раз редактировалось Flash51, 05.07.2013 в 22:25.
Flash51 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.08.2013, 10:45
#2016
MrBrown


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


Разрешите вопрос новичка.
Кое-что понял из "Полещука". Теоретически, а на практике - прошу помочь.
Вот функция извлечения начала и конца отрезка:
Код:
[Выделить все]
 (defun c:test  ()
(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car (entsel)))))
)
Анализирую с конца, с внутренних скобок:
(entget (car (entsel)) - получен первый элемент (имя выбранного примитива) из базы.
(lambda (x) (= (car x) 10)) - первому элементу аргумента Х функции lambda присвоены координаты начала отрезка
vl-remove-if-not исключает lambda (x), значит, остается вся остальная инфа из базы, а не только координата конца отрезка (?).
Вопрос: как тут работает mapcar, последовательно составляя список координат?
Реально, запутался в этой простой строке, как та сороконожка, которая задумалась, с какой ноги начинать движение.
Спасибо.
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.08.2013, 10:50
#2017
Sleekka

главный энженегр
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,455


мапкар последовательно применяет cdr к каждому элементу списка, т.е. отрезает dxf - пометку "10".
Sleekka вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.08.2013, 10:51
#2018
dirge


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


MrBrown, там получается список списков из координат ((10 0 1 0) (10 1 1 0)) и т.д. mapcar 'cdr из каждого списка вынимает всё кроме первого елемента, получается ((0 1 0) (1 1 0))
dirge вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.08.2013, 11:04
#2019
MrBrown


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


Но ведь код "10" - это код начала отрезка. А "11" - конца. Или я ошибаюсь? Вот я нарисовал отрезок с координатами (0.0 0.0) (200.0 200.0)
ком.строка на запрос
Код:
[Выделить все]
 (defun c:test  ()
(lambda (x) (= (car x) 10)) (entget (car (entsel)))
)
выдала
Код:
[Выделить все]
 Выберите объект: ((-1 . <Имя объекта: 7ea09518>) (0 . "LWPOLYLINE") (330 . <Имя 
объекта: 7ea0fcf8>) (5 . "21B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") 
(8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 
0.0) (10 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 200.0 200.0) 
(40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))
то есть и начало и конец отрезка имеют код "10". Или я невнимательно читал "Маркса"? ("Полещука")
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.08.2013, 11:09
#2020
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,552
Отправить сообщение для gomer с помощью ICQ Отправить сообщение для gomer с помощью Skype™


А ты часом окружности дугами не рисуешь,бро?
gomer вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 260 05.12.2017 20:18
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||