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

Вернуться   Форум 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.
Просмотров: 1965681
 
Непрочитано 27.02.2014, 15:23
#2121
Алена92


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


О, класс, то что нужно! буду пробовать и по результату напишу что получилось. Мерси ! :*
Алена92 вне форума  
 
Непрочитано 27.02.2014, 15:27
#2122
Кулик Алексей aka kpblc
Moderator

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


Только не помешает предусмотреть ситуацию, когда контур не создался.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.02.2014, 19:15
#2123
Алена92


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Только не помешает предусмотреть ситуацию, когда контур не создался.
кстати да , бывает что вместо штриховки в наших чертежах бывают просто параллельные отрезки равноудаленные... редко, но случается.
Алена92 вне форума  
 
Непрочитано 27.02.2014, 19:41
#2124
gomer

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


Цитата:
Сообщение от Алена92 Посмотреть сообщение
Начала (учить '(lisp))
Цитата:
Сообщение от Алена92 Посмотреть сообщение
Восстанавливаю 3D из 2D чертежей.
Цитата:
Сообщение от Алена92 Посмотреть сообщение
как передавать полученный из штриховки контур функции автокада по созданию области?
Меня одного напрягает такая постановка вопроса?
gomer вне форума  
 
Непрочитано 27.02.2014, 21:00
#2125
Кулик Алексей aka kpblc
Moderator

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


Меня "напрягает" только создание 3D из 2D... А в остальном - мы все учились понемногу...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.03.2014, 13:43
#2126
mankurt

геодезист
 
Регистрация: 25.10.2011
Москва
Сообщений: 45


Снова вынужден обратиться к вам, гуру Lisp, cо своей неразрешимой проблемой ).
У небезызвестного многим Lee Mac есть функция определения координат центроида замкнутой полилинии (код смотрите ниже).
При встраивании этой функции в свою программу столкнулся с тем, что не все контуры обрабатываются правильно - то есть не всегда точка центроида ставится внутри контура.
Приложил файл .dwg c примером конфликтной ситуации. Все контура полилинии одинаковые и замкнутые.

Случай 1: Координаты X - семизначные, Y - шестизначные. Контур полилинии слева отрабатывается неправильно, справа - правильно.

Случай 2: Те же контура, но находятся в окрестностях начала координат. Оба контура обрабатываются правильно.

Намекните, как могут координаты контуров влиять на результат функции LM:PolyCentroid и приводить к неправильному вычислению координат центроида?
Координаты же не сикстиллионы с сикстиллиардами.. Может дело в какой-то системной переменной?


UPD. C причиной не разобрался, попробовал использовать библиотечную dwgru-geom-lwpolyline-centroid - работает безошибочно


Код:
[Выделить все]
 ;; Polygon Centroid  -  Lee Mac
;; Returns the WCS Centroid of an LWPolyline Polygon Entity

(defun LM:PolyCentroid ( e / l )
    (foreach x (setq e (entget e))
        (if (= 10 (car x)) (setq l (cons (cdr x) l)))
    )
    (
        (lambda ( a )
            (if (not (equal 0.0 a 1e-8))
                (trans
                    (mapcar '/
                        (apply 'mapcar
                            (cons '+
                                (mapcar
                                    (function
                                        (lambda ( a b )
                                            (
                                                (lambda ( m )
                                                    (mapcar
                                                        (function
                                                            (lambda ( c d ) (* (+ c d) m))
                                                        )
                                                        a b
                                                    )
                                                )
                                                (- (* (car a) (cadr b)) (* (car b) (cadr a)))
                                            )
                                        )
                                    )
                                    l (cons (last l) l)
                                )
                            )
                        )
                        (list a a)
                    )
                    (cdr (assoc 210 e)) 0
                )
            )
        )
        (* 3.0
            (apply '+
                (mapcar
                    (function
                        (lambda ( a b )
                            (- (* (car a) (cadr b)) (* (car b) (cadr a)))
                        )
                    )
                    l (cons (last l) l)
                )
            )
        )
    )
)

(defun c:test ( / ss )
    (if
        (setq ss
            (ssget "_+.:E:S:L"
               '(
                    (0 . "LWPOLYLINE")
                    (-4 . "&=")
                    (70 . 1)
                    (-4 . "<NOT")
                    (-4 . "<>")
                    (42 . 0.0)
                    (-4 . "NOT>")
                )
            )
        )
        (entmake (list '(0 . "POINT") (cons 10 (LM:PolyCentroid (ssname ss 0)))))
    )
    (princ)
)
Вложения
Тип файла: dwg
DWG 2004
test.dwg (334.9 Кб, 3008 просмотров)

Последний раз редактировалось mankurt, 07.03.2014 в 16:10.
mankurt вне форума  
 
Непрочитано 07.03.2014, 16:20
#2127
mankurt

геодезист
 
Регистрация: 25.10.2011
Москва
Сообщений: 45


Есть ли, навскидку, какая-то альтернатива команде trim среди ActiveX методов? Или все только trim в своих программах используют?
"Extrim" из Express написана c обращением к куче команд. Если на нее подавать кучу полилиний из SS, то очень долго получается. Хотя там много проверочных условий...
mankurt вне форума  
 
Непрочитано 07.03.2014, 16:46
#2128
gomer

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


нет такого вроде
gomer вне форума  
 
Непрочитано 13.03.2014, 13:19 Подскажите чайнику элементарную вещь
#2129
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 165


Добрый день.
Понадобилось написать небольшую программку (чего очень давно не делал).
В зависимости от наличия переменной или уже определенных путей, устанавливает или добавляет нужное значение переменной TRUSTEDPARTS.
Вот ее текст:
Код:
[Выделить все]
 (vl-load-com)
(setq trup (getvar "TRUSTEDPATHS"))
(if (/= trup nil)
      (if (or (= trup ";") (= trup "")) ((setvar "TRUSTEDPATHS" "T:\\AutoCAD\\admin_tools\\lispload") 
	                                              (princ "\nПуть к доверенным файлам установлен") 
	                                             )
			                             (if (wcmatch trup "T*AutoCAD*admin_tools*lispload") (princ "\nНужный путь к доверенным файлам уже установлен") 
					 					                                                          ((setvar "TRUSTEDPATHS" (strcat trup "; T:\\AutoCAD\\admin_tools\\lispload"))
											                                                   (princ "\nПуть к доверенным файлам добавлен") 
											                                                  )
				                     )
      )
      (princ "\nТакой переменной не существует")
)
Все работает как надо, но одна беда - по завершении после сообщения вылазит "ошибка; неизвестная команда "T:\\AUTOCAD..."
Я так понимаю, что это установленное значение влетает в командную строку и пытается выполниться.
Как этого избежать? Заранее благодарен.
Михаил

Последний раз редактировалось mkung, 16.03.2014 в 22:30.
mkung вне форума  
 
Непрочитано 13.03.2014, 14:03
#2130
Frigate

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


Код:
[Выделить все]
  ((setvar "TRUSTEDPATHS" (strcat trup "; T:\\AutoCAD\\admin_tools\\lispload")) 
у тебя тут скобки закомменчены, проверь еще раз
Frigate вне форума  
 
Непрочитано 16.03.2014, 22:32
#2131
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 165


Цитата:
Сообщение от Frigate Посмотреть сообщение
Код:
[Выделить все]
  ((setvar "TRUSTEDPATHS" (strcat trup "; T:\\AutoCAD\\admin_tools\\lispload")) 
у тебя тут скобки закомменчены, проверь еще раз
Да вроде нормально все со скобками...
mkung вне форума  
 
Непрочитано 17.03.2014, 01:26
#2132
w7ra


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


to mkung ,
Да нет одной не хватает 3- начинают, а 2 закрывают. Не зер гуд, посмотри в строке (посчитай, количество открытых и закрытых скобок повнимательней).Должно быть (_(_(_____)_)_), а у Вас (_(_(_____)_)_?. Вроде так учили на парах по программированию.
w7ra вне форума  
 
Непрочитано 17.03.2014, 01:36
#2133
Кулик Алексей aka kpblc
Moderator

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


А почему перед setvar стоит 2 скобки? Почему после ";" в строковой переменной установлен пробел?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.03.2014, 01:49
1 | #2134
gomer

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


Код:
[Выделить все]
 (setq appath "T:\\AutoCAD\\admin_tools\\lispload"
      trup   (getvar "TRUSTEDPATHS")
)
(cond
  ((null trup)
   (princ "\nТакой переменной не существует")
  )
  ((wcmatch trup (strcat  "*" appath "*"))
   (princ "\nНужный путь к доверенным файлам уже установлен")

  )
  ((member trup '("" ";"))
   (setvar "TRUSTEDPATHS" appath)
   (princ "\nПуть к доверенным файлам установлен")
  )

  (T
   (setvar "TRUSTEDPATHS" (strcat trup (chr 59) appath))
   (princ "\nПуть к доверенным файлам добавлен")
  )
)
gomer вне форума  
 
Непрочитано 31.03.2014, 14:02
#2135
kha

BIM, С#, AutoCAD, LISP
 
Регистрация: 15.03.2006
Дуброво
Сообщений: 657


Прошу покритиковать одну из моих первых программ:

Код:
[Выделить все]
 (defun C:kha_spds_explode ( / ss answer i obj_name)

  (setq ss (ssget "_x"))
(setq answer (bg:msg-yes-no "Внимание"
	     "Все объекты SPDS GraphiCS будут взорваны !!!\nПродолжить?"))
(setq i 0)
(if ss (repeat (sslength ss)
  (setq obj_name (cdr (assoc 0 (entget (ssname ss i)))))

  (if (or (= obj_name "mcsPseudoLine") (= obj_name "mcsPseudoPolyline") (wcmatch obj_name "SPDS*"))
    (setq i (1+ i))
    (setq ss (ssdel (ssname ss i) ss))
   )
)
)
(if (and ss answer)
  (progn
   	(setvar "qaflags" 1)
   	(command "_.explode" ss "")
        (setvar "qaflags" 2)
	)
  )
)

(defun bg:msg-yes-no ( title message / WScript ret)
(setq WScript (vlax-get-or-create-object "WScript.Shell"))
(setq ret (vlax-invoke-method WScript "Popup" message "0" title (+ 4 48)))
(vlax-release-object WScript)
(= ret 6)  
)
Программа взрывает объекты СПДС GraphiCS и псевдолинии и псевдополилинии SPDS.

Вопросы:

1. Не слишком ли много переменных? Можно ли сделать меньше?
Как вариант: (setq obj_name (cdr (assoc 0 (entget (ssname ss i))))) заменить на функцию и вызывать функцию, а не обращаться к переменной. Ещё вариант ухода от переменной (только что пришла мысль) - блок кода со взрывом объектов забросить в первую конструкцию (if ...) и в условии спрашивать не переменную answer, а сделать прям там вызов диалога (итого - получилось минус две переменные)

2. В этой программе я использовал функцию вызова диалога из пакета программ bgtools. Как обычно описываются сторонние функции? Требуется ли сообщать автору (если есть возможность его найти) об использовании его функции в своей программе? Какие правила (писаные/неписаные) есть по этому поводу?
__________________
"Молодой человек, Вы не представляете всей широты поставленной перед Вами задачи." © Панкратова Г.Е.

Последний раз редактировалось kha, 31.03.2014 в 14:11.
kha вне форума  
 
Непрочитано 31.03.2014, 15:32
#2136
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Два вопроса о vla-
1. условие (if (not (vla-item (vla-get-layers adoc) "_vsp"))... понял, что нельзя, как красиво обойти?
2.объясните как оптимизировать создание объекта с помощью vla
Код:
[Выделить все]
 (setq lay-vsp (vla-add (vla-get-layers adoc) "_vsp"))
(vla-put-plottable lay-vsp :vlax-false)
(vla-put-color lay-vsp 140)
(vla-put-lineweight lay-vsp 30)
в частном случае создаю вспомогательный слой, который не будет выводится на печать.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 31.03.2014, 17:38
#2137
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
2.объясните как оптимизировать создание объекта с помощью vla
Надо не столько "оптимизировать", сколько сделать надежным. Например, в "частном случае" vla-add может сработать с ошибкой, и последующие vla-put также будут создавать ошибки. Но со слоем это частный случай. Гораздо чаще надо создавать объекты-примитивы. Для них надо сделать надежные библиотечные функции, в аргументах которых можно передавать чаще всего используемые данные - слой, цвет, тип линии, вес.

Например, создание отрезка:

Код:
[Выделить все]
 
(defun ru-line-add (start_pnt end_pnt lineweight ltype / obj)

  (ru-error-catch
    (function (lambda ()
                (setq obj (vla-addline
                            (ru-obj-active-space)
                            (vlax-3d-point start_pnt)
                            (vlax-3d-point end_pnt)
                          ) 
                ) 
                (cond
                  ((vlax-write-enabled-p obj)
                   (ru-lw-set-for-obj obj lineweight)
                   (if Ltype
                     (ru-ltype-apply obj Ltype)
                   ) 
                   (vla-update obj)
                   obj
                  )
                )
              )
    ) 
    (function (lambda (x)
                (princ (strcat "\nОШИБКА RU-LINE-ADD " x))
                nil
              ) 
    ) 
  )                 
)    
Здесь создание объекта обернуто ловушкой ошибок. Кроме того делается проверка созданного объекта на возможность изменения свойств, а также устанавливаются (если не NIL) вес и тип линии. В результате в конечных программах будут простые вызовы наподобие
Код:
[Выделить все]
   (ru-line-add (list 0.0 0.0) (list 10000.0 10000.0) 50 nil)
  (ru-line-add (list 0.0 0.0) (list 1000.0 10000.0) 50 "DASHDOT2")
И работать эти функции будут очень надежно. Кроме того, при изменении библотечной функции изменится (безо всяких переделок) работа сотен программ.
ShaggyDoc вне форума  
 
Непрочитано 31.03.2014, 18:18
#2138
gomer

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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
как красиво обойти?
В большинстве случаев можно схалтурить и просто спросить у чертежа есть ли в нем нужный слой
gomer вне форума  
 
Непрочитано 31.03.2014, 23:22
1 | #2139
Дима_

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


Цитата:
Сообщение от kha Посмотреть сообщение
Прошу покритиковать одну из моих первых программ:
Ну если из первых - то программа просто шикарная, но есть несколько логических казусов:
- возврат функции msg-yes-no надо проверять сразу по выполнению и если он "нет", то нет никакого смысла выполнять фильтрацию набора - он все равно не понадобится - как следствие нет нужды в выделении имени answer - ненужная работа.
- "qaflags" надо не устанавливать в фиксированное значение, а "запоминать" перед изменением и восстанавливать после работы (как впрчем и любые другие используемые на изменение системные переменные).
Цитата:
Сообщение от kha Посмотреть сообщение
1. Не слишком ли много переменных? Можно ли сделать меньше?
Это на ваш вкус - можно избавиться от всех.
з.ы. Не партесь - все бы так как Вы программировали...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 01.04.2014, 06:40
#2140
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Надо не столько "оптимизировать", сколько сделать надежным. Например, в "частном случае" vla-add может сработать с ошибкой, и последующие vla-put также будут создавать ошибки. Но со слоем это частный случай. Гораздо чаще надо создавать объекты-примитивы. Для них надо сделать надежные библиотечные функции, в аргументах которых можно передавать чаще всего используемые данные - слой, цвет, тип линии, вес.
я немного о другом спрашивал... в примере создал объект и запомнил его в переменной. И потом построчно менял свойства объекта... полагаю можно обойтись без переменной, загнав все это дело в какой нибудь foreach или mapcar или что нибудь еще, и задать все параметры чохом...вот только до конца не пониманию синтаксиса таких функций.
Цитата:
Сообщение от gomer Посмотреть сообщение
В большинстве случаев можно схалтурить и просто спросить у чертежа есть ли в нем нужный слой
tblsearch ? я собственно это и хотел, но vla-item возвращает либо нужный слой, либо ошибку и абзац...
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
Ответ
Вернуться   Форум 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