Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 91
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 2049832
 
Непрочитано 17.02.2012, 16:15
1 | #1801
Do$

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


Логическая ошибка условия в цикле while.
(<= use_l base_l) - как бы все правильно, текущая длина меньше всей длины, но потом в цикле
(setq use_l (+ use_l (+ (* sl_ch (- k2 k1)) k1))) - длину увеличиваем, и она становится больше длины полилинии. Выражение (vlax-curve-getPointAtDist pln use_l) выдает nil => ошибка. А надо сделать типа такого:
Код:
[Выделить все]
 (vl-load-com)

(defun _dwgru-random (/ modulus multiplier increment)
;;; Генерирует случайное вещественное число в диапазоне от 0 до 1
;;; Используется глобальная переменная *DWGRU_SEED*
  (if (not *DWGRU_SEED*)
    (setq *DWGRU_SEED* (getvar "DATE"))
  ) ;_ end of if
  (setq	modulus	65536
	multiplier
	 25173
	increment 13849
	*DWGRU_SEED*
	 (rem (+ (* multiplier *DWGRU_SEED*) increment) modulus)
  ) ;_ end of setq
  (/ *DWGRU_SEED* modulus)
) ;_ end of defun

;;;Вычисление контрольных точек трубопровода, запись ПК и координат в текстовый файл

(defun c:cp (/
	     pln
	     base_l
	     use_l
	     cp_coord
	     num
	     num_str
	     suff_str
	     suff
	     cp_coord_x
	     cp_coord_y
	     use_l_str
	     spis_str
	     poln_spisok
	     sl_ch
	     step_l
	     spisok_pr
	     coord1
	     coord2
	     f
	     x
	    )
  (setq snp (getvar "Osmode"))
  (setvar "Osmode" 0)
  (setq
    k1	   (getint "Минимальное расстояние между контрольными точками:"
	   ) ;_ end of getint
    k2	   (getint
	     "Максимальное расстояние между контрольными точками:"
	   ) ;_ end of getint
    b_name (cdr
	     (assoc 2
		    (entget
		      (car (entsel "\nУкажите блок для вставки в контр. точках:"))
		    ) ;_ end of entget
	     ) ;_ end of assoc
	   )				;(getstring "Введите имя блока:") ; имя блока для вставки в контрольных точках
    pln	   (car (entsel))		;  выбор полилинии
    base_l (vlax-curve-getDistAtParam pln (vlax-curve-getEndParam pln)) ;полная длина т/п
    use_l  0				; начальная длина пройденного пути
  ) ;_ end of setq
  (while (<= (setq sl_ch (_dwgru-random) ;  случайное число
		   use_l (+ use_l (+ (* sl_ch (- k2 k1)) k1)) ; текущее значение пройденного расстояния
	     ) ;_ end of setq
	     base_l
	 ) ;_ end of <=
    (progn
      (setq
	cp_coord (vlax-curve-getPointAtDist pln use_l) ; вычисление координаты контрольной точки
	num	 (fix (/ use_l 100))	; префикс
	suff	 (- (fix use_l) (* num 100)) ; суффикс
      ) ;_ end of setq
      (if (< num 10)
	(setq num_str (strcat "0" (itoa num)))
	(setq num_str (itoa num))
      )					; end if /// если num<10, то добавляется 0 перед числом
      (if (< suff 10)
	(setq suff_str (strcat "0" (itoa suff)))
	(setq suff_str (itoa suff))
      )					; end if /// если suff<10, то добавляется 0 перед числом
      (setq cp_coord_x (fix (nth 0 cp_coord))
	    cp_coord_y (fix (nth 1 cp_coord))
	    spis_str   (strcat (itoa (fix use_l))
			       " "
			       (strcat "ПК " num_str "+" suff_str)
			       " "
			       (itoa cp_coord_x)
			       " "
			       (itoa cp_coord_y)
		       )		; создаем строчку со всеми данными контрольной точки
      ) ;_ end of setq
      (setq poln_spisok (cons spis_str poln_spisok)) ; добавляем в список новую запись
      (command "_.insert" b_name cp_coord 1.0 0) ; вставляем блок
      (command "_.mtext"
	       (list (- cp_coord_x 10) (+ cp_coord_y 2))
	       (list (+ cp_coord_x 10) (+ cp_coord_y 12))
	       (strcat "+" suff_str)
	       ""
      )					; добавляем текст около контр. точки
    )					;end of progn
  )					;end of progn
  (setvar "Osmode" snp)
  (setq spisok_pr (reverse poln_spisok))
  (if
    (and (setq fn (getfiled "Куда сохранить?"
			    "C:\\AutoLISP_files\\cp_file.txt"
			    "txt"
			    1
		  ) ;_ end of getfiled
	 ) ;_ end of setq
	 (setq f (open fn "w"))
    ) ;_ end of and
     (progn
       (foreach x spisok_pr (princ (strcat x "\n") f))
       (close f)
     ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
Do$ вне форума  
 
Непрочитано 17.02.2012, 19:23
#1802
La Persona

Чайник
 
Регистрация: 01.12.2011
Сообщений: 27


Do$, премного благодарен за помощь! Все заработало отлично
ЗЫ: на будущее учту, что и логические ошибки могут быть )
La Persona вне форума  
 
Непрочитано 18.02.2012, 18:32
#1803
Wayne Rooney


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


Обращаюсь к Вам со своим вопросом.

Создал я блок динамический, назвал его ZD_001_001. Сам dwg файл назвал ZD_01_01.

Вставляю вот так вот, предварительно прописав путь:

Код:
[Выделить все]
 [LIB001(PIR_01,Вид сверху)]^C^C_-layer;_m;Закладные_детали;;_-insert;d:/zaklad/lib001/ZD_01_01;_scale;1;;;
Уже узнал, что инсертом у меня dwg файл файл вставляется как блок, оттого получалось вот так вот:

[IMG]http://s42.***********/i095/1202/03/f2c0a3d3e499.jpg[/IMG]

Вопрос такой. Как мне сделать(мб как-то по другому путь прописать) чтобы вставлялся динамический блок?
Wayne Rooney вне форума  
 
Непрочитано 18.02.2012, 23:27
#1804
Дима_

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


После того как ты вставишь файл как блок у тебя в документе появяться описания всех включенных в этот файл блоков, вот их потом и вставляй, вытянуть отдельное описание блока из файла тоже конечно можно, но здесь потребуется код гораздо более продвинутого уровня нежели у тебя (можешь обратиться в поиск по вопросу "работа с неактивным документом").
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.02.2012, 07:44
#1805
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Wayne Rooney Посмотреть сообщение
Вопрос такой. Как мне сделать(мб как-то по другому путь прописать) чтобы вставлялся динамический блок?
Похоже, ты ищешь способ сделать файл блоком, точнее, чтоб при вставке всего файла, получался динамический блок...
Это тоже можно сделать! Открываешь файл и запускаешь редактирование блоков. У тебя появляется окно, где в столбик написаны все блоки и на самом верху строка - этот файл. При выборе этой строки, можно из всего файла сделать динамический блок. Единственное неудобство - для тестирования необходимо вставлять этот файл в другой...
Удачи!
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 19.02.2012, 18:34
#1806
Wayne Rooney


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


Я ищу способ доступиться к динамическому блоку, который у меня уже создан. Прочитал в книге "САПР на базе AutoCAD", что надо бы создать имитацию вставки, потом прервать ее - блок оказывается внедрен со всеми сложениями, в том числе и с нужным мне, а потом можно и доступиться до него. Но вот что-то у меня реализация хромает

Код:
[Выделить все]
  [LIB001(PIR_01,Вид сверху)]^C^C_-layer;_m;Закладные_детали;;(command "_.-insert" "ZD_01_01") (сommand) (command "_.-insert" "ZD_001_001");_scale;1;;;
Wayne Rooney вне форума  
 
Непрочитано 02.03.2012, 12:11
#1807
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


Возникла идея такого вот лиспа, думаю, многим мог бы сгодиться:

а. Вызывается команда (типа команды печати);
б. В модели рамкой выбирается область печати;
в. По заданному шаблону создаётся новый Лист с ВЭ в которую вписывается выбранная ОП;
г. Рамка выбранной ОП остаётся в ПМ, ложась на непечатный слой.
Jerald вне форума  
 
Непрочитано 02.03.2012, 15:20
#1808
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Здравствуйте.
Подскажите плз создание правильно лисп кода, а именно необходимо чтоб в коде вызывался слой "0", потом я пишу команды построения для этого слоя. Далее вызывался другой слой (допустим "поп"), и прописываю другие команды для уже нового слоя.
спс.
Pavel_GP вне форума  
 
Непрочитано 02.03.2012, 15:45
1 | #1809
Дима_

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


Если под словосочетанием "вызывался слой" подразумеваеться как установить текущий - то для Вас наверное лучше всего подойдет _-layer _s имя_слоя
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 02.03.2012, 15:57
1 | #1810
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Здравствуйте.
Подскажите плз создание правильно лисп кода, а именно необходимо чтоб в коде вызывался слой "0", потом я пишу команды построения для этого слоя. Далее вызывался другой слой (допустим "поп"), и прописываю другие команды для уже нового слоя.
спс.
+ к тому, что сказал Дима_,
Вариант 1
Код:
[Выделить все]
 
(setq old_clayer (getvar 'clayer)) ; запомнили текущий слой
(setvar 'clayer "0")
...
(setvar 'clayer "поп") ; слой с именем "поп" должен существовать
...
(setvar 'clayerold_clayer) ; восстановили исходный слой
Вариант 2
Использовать функцию entmake и (или) entmakex, тогда и слой не надо будет переключать, можно сразу рисовать на нужном слое.
Например, рисуем текст на слое "1" и неважно какой сейчас слой установлен и если слоя "1" он будет автоматически создан
Код:
[Выделить все]
 
(entmake (list '(0 . "TEXT") '(8 . "1") '(10 2017.19 1203.1 0.0) '(40 . 2.5) '(1 . "Текст")))
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 05.03.2012, 15:32
#1811
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
+ к тому, что сказал Дима_,
Код:
[Выделить все]
 
(entmake (list '(0 . "TEXT") '(8 . "1") '(10 2017.19 1203.1 0.0) '(40 . 2.5) '(1 . "Текст")))
Подскажите плз, как в Вашем коде сменить стиль текста? У Вас сейчас настроен "стандарт". или ссылку dxf-группы м.б. там расписано какая группа отвечает стиль.
спс.
Pavel_GP вне форума  
 
Непрочитано 05.03.2012, 16:21
1 | #1812
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Подскажите плз, как в Вашем коде сменить стиль текста? У Вас сейчас настроен "стандарт". или ссылку dxf-группы м.б. там расписано какая группа отвечает стиль.
спс.
Код:
[Выделить все]
 
(entmake (list '(0 . "TEXT")
               '(8 . "0")
               '(10 730.796 356.381 0.0)
               '(40 . 2.5)
               '(1 . "aaa")
               '(41 . 0.9)      ; степень растяжения
               '(51 . 0.261799)	; угол наклона букв
               '(7 . "GOST")	; стиль
               )
         )
или ссылка dxf-группы
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 06.03.2012, 09:54
#1813
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Подскажите плз.
Пример:
dcl
:edit_box {label="Введите шифр:"; key="shps";
edit_width=12;
edit_limit=24;}

lsp
(action_tile "shps" "(setq shp (atof $value))")
...
(setq x_p (+ (+ x0 width) 12.))
(setq y_p (+ (+ y0 height) 12.))
(setq pt (list x_p y_p))
(setq ang 0)
(setq h 3.4)
(vl-cmdf "_.text" "_j" "_m" pt h ang shp)

Вопрос: Когда я ввожу по диалоговому окну шифр (пример: 10-11-25), то текст выводится на чертеже 10.00000000. Само значение shp получается после обработки dcl 10.00000, а не 10-11-25.
Pavel_GP вне форума  
 
Непрочитано 06.03.2012, 10:04
1 | #1814
Кулик Алексей aka kpblc
Moderator

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


А почему используется atof?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.03.2012, 10:32
#1815
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А почему используется atof?
Спс. понял в чем =) заменил на strcat и все получилось.
Pavel_GP вне форума  
 
Непрочитано 06.03.2012, 12:15
#1816
gomer

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


strcat там как козе баян ибо клеить нечего
правильный код:
Код:
[Выделить все]
 (action_tile "accept" "(setq shp (get_tile \"shps\"))(done_dialog 1)")

Последний раз редактировалось gomer, 06.03.2012 в 14:20. Причина: надо ж закрывать диалог
gomer вне форума  
 
Непрочитано 06.03.2012, 13:18
#1817
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от gomer Посмотреть сообщение
strcat там как козе баян ибо клеить нечего
правильный код:
Код:
[Выделить все]
 (action_tile "accept" "(setq shp (get_tile \"shps\"))")
После Вашей замены, выдается сообщение:
Ошибка приложения: В команду послан неверный тип
и построения текста нет.
Подскажите в чем дело?
При моей вставке замены - вычерчивание текста происходит.
Я понимаю, что Вы хотите правильно прописать действие. Я просто подобрал команду.
Pavel_GP вне форума  
 
Непрочитано 06.03.2012, 14:19
#1818
gomer

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


В ващем диалоге должен быть элемент ok_cancel, тогда при нажатии Ок будет считываться значение поля shps А при нажатии Отмена можно просто закрывать диалог и выходить из программы
посмотрте еще раз на код, я добавил done_dialog... просто писал не глядя
gomer вне форума  
 
Непрочитано 06.03.2012, 15:21 преобразование в полилинии
#1819
baaba

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


Есть жилая застройка, отрисованная в автокаде. Пятна застройки были отрисованы полилиниями. Сейчас все полилинии расчленены. Мне нужно снова отрезки объёдинить в полилинии.
Руками выделяем отрезок, преобразовываем в полилинию, добавляем отрезки, объединяем в полилинию. Получился вот такой код.
Код:
[Выделить все]
 
; Объединяет группы отрезков в полилинии, если вершины отрезков совпадают
(defun c:mkpoly (/ nlst count entc)
	(setq nlst (ssget) count (1- (sslength nlst)))
	(while (<= 0 count)
    (setq entc (ssname nlst count))
    (if (eq "LINE" (cdr (assoc 0 (entget entc))))
      (command "_.pedit" entc "y" "j" "all" "" "")
     )
    (setq count (1- count))
   )
   (setq count nil)
)
Но он очень неэффективный. Компиляция в vlx не помогла. Наверное давно есть похожие программы. Ткните пожалуйста носом !
Во-первых каждый раз выделяю всё. Во-вторых перебираю отрезки, которые уже попали в какую-либо полилинию (например в доме минимум четыре отрезка, после объёдинения в полилинию три остальных уже перебирать не надо)

Последний раз редактировалось baaba, 06.03.2012 в 15:27.
baaba вне форума  
 
Непрочитано 06.03.2012, 16:35
#1820
Кулик Алексей aka kpblc
Moderator

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


Из выступлений Евгения Елпанова на форумах Autodesk:
Код:
[Выделить все]
(defun c:ple (/ sv)
  (setq sv (getvar "peditaccept"))
  (setvar "peditaccept" 1)
  (command "_.pedit" "_m" (ssget) "" "_j" 0. "")
  (setvar "peditaccept" sv)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека 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