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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1971806
 
Непрочитано 07.06.2013, 09:36
#2001
Frigate

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


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

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

Итак,

имею файл .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
С.-Петербург
Сообщений: 39,832


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

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


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

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


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

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

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

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

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

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


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

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


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

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


Дима_,

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

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

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


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

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


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

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

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

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

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


Цитата:
Сообщение от 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,515


Цитата:
Сообщение от Никита Ремизов Посмотреть сообщение
При работе данного лиспа, при вводе второй точки отрезка распространения не работает полярное отслеживание. Как сделать, чтобы работало?
Почитай про функцию 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


 
Регистрация: 20.03.2008
Сообщений: 2,653


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

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


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

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


У кого-нибудь есть инфа по (_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
<phrase 1= Отправить сообщение для Flash51 с помощью Skype™


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

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

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


Разрешите вопрос новичка.
Кое-что понял из "Полещука". Теоретически, а на практике - прошу помочь.
Вот функция извлечения начала и конца отрезка:
Код:
[Выделить все]
 (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,335


мапкар последовательно применяет 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
Сообщений: 359


Но ведь код "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,515


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

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

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


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