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

Вернуться   Форум 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.
Просмотров: 1972417
 
Непрочитано 21.10.2013, 09:30
#2061
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
Есть задачка. Найти пересечение двух линий и по полученой координате выбрать ближайший к этой точке примитив.
Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
Зачем мне это нужно: есть номограмма, по значениям двух параметров надо выбрать изолинию на пересечении (но точка может оказаться не на изолинии, а рядом...)
Могу предложить такой алгоритм
1. Сформировать набор изолиний (скорее всего это полилинии, возможно на определенном слое)
2. С помощью vlax-curve-getClosestPointTo найти ближайшую к указанной точку на изолинии.
3. С помощью distance найти минимальное расстояние и ,соотвественно, саму ближайшую изолинию
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.10.2013, 12:15
#2062
Vladimir_Sergeevich

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


VVA, таким макаром проверять каждую из изолиний надо что ли и у каждой считать расстояние и выбирать минимальный?
в моем случае выбор через (ssget "_c" p1 p2) с увеличением рамки с шагом 0.1 достаточно.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 17.11.2013, 16:42
#2063
Flash51

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


Может ли редактор блоков работать в фоновом режиме? Программно создаю блок, задаю атрибут и закрываю редактор блоков. Нужно чтобы все операции были невидимыми и экран не мигал.
Flash51 вне форума  
 
Непрочитано 17.11.2013, 17:00
#2064
Кулик Алексей aka kpblc
Moderator

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


Создавай блок программно и на этом все.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.11.2013, 19:04
#2065
Flash51

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


Под "программно" я имел ввиду следующее. Описал в лиспе все действия, которые выполняет пользователь при создании блока, а при запуске, акад сам отрисовывает модель, создает блок и присваивает атрибут. Как в этой ситуации быть, т.к. видимо до создания блоков на самом деле программно я еще не дошел.
Flash51 вне форума  
 
Непрочитано 24.11.2013, 17:00
#2066
skkkk


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Создавай блок программно и на этом все.
Программно, если говорить о лиспе, блок можно создать тремя способами (насколько я знаю):
1. Командные методы (функции command и vl-cmdf)
2. Метод описания точечных пар (entmake)
3. Обращение к объектной модели (vla-методы)
Цитата:
Сообщение от Flash51 Посмотреть сообщение
Под "программно" я имел ввиду следующее. Описал в лиспе все действия, которые выполняет пользователь при создании блока, а при запуске, акад сам отрисовывает модель, создает блок и присваивает атрибут. Как в этой ситуации быть, т.к. видимо до создания блоков на самом деле программно я еще не дошел.
Очевидно, имеется в виду первый пункт.
Командными методами можно сделать примерно так:
Код:
[Выделить все]
 (defun C:CreateBlock ( / ss)
	; тут нужно бы добавить обработку ошибок и отключение привязок
	(if (not (tblsearch "block" "Наш_блок")) ; выполняем проверку: если блока "Наш_блок" в чертеже нет, то
  		(progn
    			(setq ss (ssadd)) ; создаем пустой набор
    			(command "_PLINE" "0.00,0.75" "0.00,-0.75" "") ; создаем, например, полилинию
    			(ssadd (entlast) ss) ; добавляем полилинию в этот набор
    			(command "_CIRCLE" "0.0,0.0" "0.26") ; создаем, например, круг
    			(ssadd (entlast) ss) ; добавляем его в набор
    			(command "_-ATTDEF" ; создаем атрибут
				 "" ; тут, если нужно, можем назначить свойства (скрытый, аннотативный, многострочный, см. опции командной строки)
				 "Наш_атрибут" ; имя атрибута
				 ""  ; подсказка
 				 "1" ; значение по умолчанию
				 "0.0,0.0" ; точка вставки
				 "2.5" ; высота текста
				 "" ; поворот
			    ) ; end of command "_-ATTDEF"
			    (ssadd (entlast) ss) ; добавляем его в набор
    			(command "_CHANGE" ss "" "_P" "_COLOR" "_BYBLOCK" "_LTYPE"  "_BYBLOCK" "_LWEIGHT" "_BYBLOCK" "_LAYER" "0" "") ; назначаем объектам из набора свойства "По блоку" и слой "0"
    			(command "_-BLOCK" "Наш_блок" "0,0" ss "") ; наконец, создаем блок
  		) ; end of progn
 	) ; end of if
     ; тут добавить включение привязок 
    (command "_-INSERT" "Наш_блок") ; ну и вставляем блок с запросом параметров у пользователя
) ; end of defun

Последний раз редактировалось skkkk, 26.11.2013 в 02:07. Причина: Поправки
skkkk вне форума  
 
Непрочитано 25.11.2013, 22:40
#2067
Flash51

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


Я примерно так и делаю. Через command. Но меня немного беспокоит мигание экрана при открытии и закрытии редактора блока в этом процессе. skkkk, не могли бы Вы немного прояснить, как то же самое сделать через
Цитата:
Сообщение от skkkk Посмотреть сообщение
2. Метод описания точечных пар (entmake)
Flash51 вне форума  
 
Непрочитано 25.11.2013, 23:21
#2068
chicot


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


Приветствую! Прошу посильной помощи Клуба.
У Полещука:
(ssget '(125.4 58.1)
создает набор из всех примитивов, проходящих через точку (125,4 58,1)


Из официальной справочной документации:
Command: (ssget '(2 2))
Create a selection set of the object passing through (2,2)


Из личных "хождений по целине":
Строю ряд отрезков, абсолютно точно, проходящих через начало UCS (оная есть World). Запускаю код
Код:
[Выделить все]
(sslength (ssget '(0 0 ) '(( 0 . "line"))))
получаю 1(мать бы его так).
Так что же нужно учитывать при написании кода, чтобы был набор из примитивов, а не просто один object ? И если, все же, можно только один, то по какому критерию он выбирается из общего множества?
chicot вне форума  
 
Непрочитано 25.11.2013, 23:30
#2069
gomer

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


обсуждалось, в поиск
gomer вне форума  
 
Непрочитано 25.11.2013, 23:46
#2070
chicot


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


Поверьте, не имею такой привычки - постить с бухты барахты:
http://www.google.ru/cse?cx=partner-...%83&gsc.page=1
http://www.google.ru/cse?cx=partner-...get&gsc.page=2
Если не сложно уточните свое утверждение ссылкой.
chicot вне форума  
 
Непрочитано 25.11.2013, 23:56
#2071
gomer

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


http://forum.dwg.ru/showpost.php?p=1...postcount=2054
gomer вне форума  
 
Непрочитано 26.11.2013, 00:38
#2072
chicot


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


Спасибо огромное! Однако, хотелось бы понять отчего же такой облом происходит. Это не первое и, увы, не единственное мое наблюдение странностей применения "условий выбора" при создании наборов. Пытался докопаться, посты читая, но так и не нашел ответов - просто поменял алгоритм, усыпляя чувство нарастающей тревоги, своей недалекостью в ОбработчикеСписков... Ну а сегодня понял, что нужно ставить диагноз не допуская перетекания в хронику.
И кстати, даже увеличив величину допуска до 1, в любезно предоставленном коде, все рано в набор цепляет всего 3 отрезка из 8-ми.
Пардон - вот только что прочел всю ветку (сразу не вкурил как перейти туда). Так вот - точка с координатами '(0 0 0). как мне видится, здесь абсолютно не причем. На этот косяк, а точнее свою неверную трактовку Полещука, я нарвался, решая не рафинированную (как в моем первом примере "для чистоты эксперимента") задачу, и исход был таким же!
Мое внимание привлек вот этот пост:
Цитата:
Сообщение от skkkk Посмотреть сообщение
Олег (jr.), а как в твоем варианте выбрать ТОЛЬКО полилинии, проходящие через точку pt?
Do$, не пойму, причем тут погрешность и числа с плавающей запятой? В варианте Полещука выбирается тот примитив, который является самым новым в порядке прорисовки, т.е. самый "верхний". Если его убрать за объекты, выбирается другой примитив, проходящий через эту точку.
Что и соответствует всем результатам моих проб и ошибок. В голове вертится один алгоритм, но уж больно он проктологический. Подумаю на досуге. Найду не постыдное решение - отпишусь.
Спасибо огромное Клуб!!! Всем успехов.

Последний раз редактировалось chicot, 26.11.2013 в 01:19.
chicot вне форума  
 
Непрочитано 26.11.2013, 00:48
#2073
Кулик Алексей aka kpblc
Moderator

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


Насколько я помню, при программном формировании набора примитивов внутри определенной области, эта область должна быть на экране. Чуть ли не первое условие. Второе - соблюдение точности вычислений (а это уже показали).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.11.2013, 01:55
#2074
skkkk


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


Цитата:
Сообщение от Flash51 Посмотреть сообщение
Я примерно так и делаю. Через command. Но меня немного беспокоит мигание экрана при открытии и закрытии редактора блока в этом процессе.
Flash51, при использовании команды _-BLOCK (обратить внимание на тире) ни диалоговые окна, ни редактор блоков не открываются. Это работа в режиме опций командной строки. Поэтому никаких миганий экрана быть не должно. Либо я что-то не так понял.
Цитата:
Сообщение от Flash51 Посмотреть сообщение
не могли бы Вы немного прояснить, как то же самое сделать через метод описания точечных пар (entmake)
Так в двух словах и не объяснишь. Это надо смотреть DXF-Reference и функцию entmake - не все там так просто. Проще разобраться с кодом из поста #2061. Либо пояснее поставить задачу. Что нужно? Чтоб при нажатии на кнопку на панели на курсоре висел нужный блок с запросом точки вставки? Или что-то еще?


Цитата:
Сообщение от chicot Посмотреть сообщение
Так что же нужно учитывать при написании кода, чтобы был набор из примитивов, а не просто один object ?
chicot, я сделал вот так:
Код:
[Выделить все]
(ssget "_C" (polar pt (/ pi 4) 0.01) (polar pt (/ (* 5 pi) 4) 0.01) '(( 0 . "LINE")))
где pt - нужная точка. Данный вариант создаст набор из всех примитивов LINE, попадающих в квадрат (рамку) с центром в данной точке и с диагональю 0.02 (единицы чертежа). Для моих целей подходит стопроцентно, работает безошибочно. Спасибо CB за наводку. Хотя Александр Ривилис считает подобные методы извращением. К слову, точность можно и увеличить, если есть страх, что в этот квадратик попадут ненужные линии.
И, как абсолютно справедливо заметил Алексей в предыдущем посте, область должна быть на экране. Поэтому я всегда предварительно программно зумирую вид в эту точку.

Последний раз редактировалось skkkk, 26.11.2013 в 02:05.
skkkk вне форума  
 
Непрочитано 26.11.2013, 21:04
#2075
chicot


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Хотя Александр Ривилис считает подобные методы извращением.
Признаться, меня тоже всегда коробят компромиссы основанные на подмене понятий ( в нашем случае точки на область). Тем не менее хочу еще раз выразить огромнейшую признательность всем завсегдатаям этого Клуба Братьев по Разуму
Ну и выставляю на ваш суд свой опус:
Код:
[Выделить все]
 setq nabor (ssadd))			;из пустой консервной банки создаем камеру-обскура
(vl-cmdf "undo" "mark" "")		;отмечаем точку входав "Матрицу" :-)
(while (ssget '(0 0 0))
  (setq nabor (ssadd (ssname (ssget '(0 0 0)) 0) nabor))
  (vl-cmdf "erase" (ssname (ssget '(0 0 0)) 0) "")
)					;в нужной нам стопке фотографируем верхний лист и уничтожаем его  циклично до полной аннигиляции стопки)
(vl-cmdf "undo" "back" "")		;делаем обратный звонок в реальность :-)
(setq i 0)
(while (ssname nabor i)
  (if (not
	(equal (assoc 0 (entget (ssname nabor i))) (cons 0 "LINE"))
      )
    (progn (setq nabor (ssdel (ssname nabor i) nabor))
	   (setq i 0)
    )
    (setq i (1+ i))
  )
)
					;фильтруем нашу "пиратку" на предмет ненужных вхождений
chicot вне форума  
 
Непрочитано 29.11.2013, 14:06
#2076
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
Это надо смотреть DXF-Reference и функцию entmake - не все там так просто.
Здесь подробно и с примерами entmake и block/insert
примеры entmake'ов Entmake Functions
Чтобы создать вхождение блока (INSERT) нужно воспользоваться функцией insert из последней ссылки
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.12.2013, 15:03 Научное представление единиц
#2077
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 644
<phrase 1= Отправить сообщение для baaba с помощью Skype™


У меня проблема: моя функция выводит результат вычисления в экспоненциальном виде:
6.66e+007
А я ожидал: 185.0

Вот так выглядит функция:
Код:
[Выделить все]
 
(defun c:dii ()
	(* (getdist) (getvar "dimscale"))
)
Мне она нужна что бы делать измерения на чертежах, сделанных не в масштабе.

Если запускать из командной строки, нет проблем:
Код:
[Выделить все]
 (* (getdist) (getvar "dimscale"))
Но это не так удобно.

PS У меня ещё вопрос: может ли человек читать такое представление числа?

Последний раз редактировалось baaba, 23.12.2013 в 15:11.
baaba вне форума  
 
Непрочитано 23.12.2013, 15:10
#2078
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (rtos (* (getdist) (getvar "dimscale")) 2 1)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.12.2013, 15:26
#2079
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от baaba Посмотреть сообщение
У меня проблема: моя функция выводит результат вычисления в экспоненциальном виде:
6.66e+007
А я ожидал: 185.0
6.66e+007 = 66600000.0
Ожидания сильно не оправдались. Может быть, поделить надо на dimscale?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 23.12.2013, 16:12
#2080
Кулик Алексей aka kpblc
Moderator

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


Или на dimlfac... Кто ж его знает?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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