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

Вернуться   Форум 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.
Просмотров: 1972229
 
Непрочитано 19.10.2015, 16:47
#2741
Кулик Алексей aka kpblc
Moderator

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


Pavel_GP, ты отредактировал пост позднее, чем я дал ответ.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.10.2015, 17:01
#2742
Pavel_GP

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(append angl_1 (list (car angl_1)))
Вместо car ты наверное хотел поставить cdr

----- добавлено через 54 сек. -----

Сорь, мысли гуляют пытаюсь внятное подать
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 19.10.2015, 17:08
1 | #2743
Кулик Алексей aka kpblc
Moderator

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


Ты сначала просил дополнить список - поставить в конец первый элемент. Я дал решение.
P.S. С
Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
(a (/ (a+b) 2.) (/ (b+c) 2.) ... (/ (g+n) 2.) n), где второй список это среднее между 1 и 2 углами и т.д. а последний угол это просто угол
просто угол - это откуда докуда угол? В качестве варианта:
Код:
[Выделить все]
 (defun tt (lst / res count)
  ;; (tt (mapcar 'cdr (vl-remove-if-not '(LAMBDA(x)(=(car x) 10)) (entget(car(entsel))))))
  (setq count 0)
  (mapcar
    (function
      (lambda (x / tmp)
          ;  (- pi
        (cond
          ((= count 0)
           (setq tmp   (angle x (nth (1+ count) lst))
                 count (1+ count)
                 ) ;_ end of setq
           tmp
           )
          ((= count (1- (length lst))) (angle (nth (1- count) lst) x))
          (t
           (setq tmp   (* (+ (angle (nth (1- count) lst) x)
                             (angle x (nth (1+ count) lst))
                             ) ;_ end of +
                          0.5
                          ) ;_ end of *
                 count (1+ count)
                 ) ;_ end of setq
           tmp
           )
          ) ;_ end of cond
          ; ) ;_ end of -
        ) ;_ end of lambda
      ) ;_ end of function
    lst
    ) ;_ end of mapcar
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.10.2015, 09:10
#2744
Pavel_GP

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


Спс.
1. Куда вставить функцию, где ее применить?
2. Если применить вот так ( setq ugol (tt angl_1)), то не правильный тип аргумента 2D/3D, скорее всего ругается функция angle.
3. Если убрать комментарий (;; (tt ....)), то требуется выбрать объект.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
просто угол - это откуда докуда угол?
см. вложение.
Миниатюры
Нажмите на изображение для увеличения
Название: углы.png
Просмотров: 20
Размер:	7.9 Кб
ID:	158802  
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 20.10.2015, 09:15
#2745
Кулик Алексей aka kpblc
Moderator

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


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

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


Отлично!!!

Только можно отредактировать чтобы не запрашивал выбрать объект, я его уже выбираю до функции.
Спасибо.
А есть у тебя lisp функции offset (которая родная в автокаде)?
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 20.10.2015, 10:24
#2747
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
можно отредактировать чтобы не запрашивал выбрать объект, я его уже выбираю до функции.
Можно. Редактируй.

Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
есть у тебя lisp функции offset (которая родная в автокаде)?
Нет. У тебя более чем достаточно информации для того, чтобы сделать нужный тебе функционал самостоятельно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.10.2015, 10:27
#2748
Pavel_GP

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


"блин" сам допер, туплю, ну извиняйте... (entsel) заменил на свою переменную obj
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 21.10.2015, 14:39
#2749
Pavel_GP

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


1. Посмотри плз код и помоги с расстановкой глобальных переменных.
2. Если начать следующее построение, то после построения полилинии цепляются к ней (строятся все заново) прошлые построения.
Спс.
Пысы: Если не трудно где добавить и что, чтобы полилиния строилась красного цвета толщиной вес 0.3

----- добавлено через ~19 ч. -----
Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
1. Посмотри плз код и помоги с расстановкой глобальных переменных.
2. Если начать следующее построение, то после построения полилинии цепляются к ней (строятся все заново) прошлые построения.
Спс.
Вопрос снят.

Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Если не трудно где добавить и что, чтобы полилиния строилась красного цвета вес 0.3
Вопрос открыт снят.
Код:
[Выделить все]
 (setq entg (entget (entlast)))
	    (entmod (append entg (list (cons 370 30) (cons 62 1))))
Вложения
Тип файла: lsp PPM.LSP (7.2 Кб, 15 просмотров)
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 22.10.2015 в 13:07. Причина: Вопросы сняты
Pavel_GP вне форума  
 
Непрочитано 26.10.2015, 09:14
#2750
Pavel_GP

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


Привет. Нужна функция сумма чисел в списке.
Пример: lst (1 2 3 4) 10, могут быть и не целые.
Спс. Вопрос снят.
Код:
[Выделить все]
 (apply '+ lst)
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 26.10.2015 в 09:30.
Pavel_GP вне форума  
 
Непрочитано 26.10.2015, 15:10
#2751
Pavel_GP

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
 (defun tt (lst / res count)
 ;; (tt (mapcar 'cdr (vl-remove-if-not '(LAMBDA(x)(=(car x) 10)) (entget(car(entsel))))))
 (setq count 0)
 (mapcar
   (function
     (lambda (x / tmp)
         ;  (- pi
       (cond
         ((= count 0)
          (setq tmp   (angle x (nth (1+ count) lst))
                count (1+ count)
                ) ;_ end of setq
          tmp
          )
         ((= count (1- (length lst))) (angle (nth (1- count) lst) x))
         (t
          (setq tmp   (* (+ (angle (nth (1- count) lst) x)
                            (angle x (nth (1+ count) lst))
                            ) ;_ end of +
                         0.5
                         ) ;_ end of *
                count (1+ count)
                ) ;_ end of setq
          tmp
          )
         ) ;_ end of cond
         ; ) ;_ end of -
       ) ;_ end of lambda
     ) ;_ end of function
   lst
   ) ;_ end of mapcar
 ) ;_ end of defun
Ув. akka_KPblC, поправь плз код согласно вложения: Красный цвет углов, это как щас строит, Зеленый цвет, как пока нужно.
Миниатюры
Нажмите на изображение для увеличения
Название: углы2.png
Просмотров: 21
Размер:	9.6 Кб
ID:	159218  
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 26.10.2015, 15:30
#2752
Кулик Алексей aka kpblc
Moderator

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


Pavel_GP, я не вникал в твой алгоритм, я всего лишь его адаптировал. Сними комментарии со строк 7 и 27 - попробуй. Похоже, я скинул какой-то из тестовых вариантов.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.10.2015, 15:44
#2753
Pavel_GP

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Pavel_GP, я не вникал в твой алгоритм, я всего лишь его адаптировал. Сними комментарии со строк 7 и 27 - попробуй. Похоже, я скинул какой-то из тестовых вариантов.
Комментарии я снимал.
Извини откорректировал вложение.

----- добавлено через ~3 мин. -----
1. Если тебе это поможет, то углы между вершинами автокад вычисляет от оси Х против часовой стрелки
2. Еще дополню, а углы которые я нарисовал - это азимуты от оси Y по часовой стрелки.
3. В ком. (7,27) я подставляю значения либо pi или 2pi., но они на алгоритм не влияют, мне кажется дело в этой функции.
4. Еще дополню, в ком (7) знак сменить на "+", вместо pi поставить коэффициент (к), который будет равен либо 0 либо pi, в зависимости от стороны смещения вправо=0, влево=pi. Отсюда следует при выборе справо, угол (между двумя вершина) будет равен Азимуту, но при угле=0, Азимут=180. Азимут это результат твоей функции.
5. Когда вычисляем среднее между Азимутами, нужно учесть, что если значение у крайних азимутов больше 360° (6.283185307179586), то (у каждого которого > 360°) перед вычислением среднего, от полученного значения отнять 360°
Миниатюры
Нажмите на изображение для увеличения
Название: углы3.png
Просмотров: 15
Размер:	9.8 Кб
ID:	159222  
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 26.10.2015 в 16:34.
Pavel_GP вне форума  
 
Непрочитано 26.10.2015, 17:17
#2754
Кулик Алексей aka kpblc
Moderator

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


Pavel_GP, ты про углы в курсе? Что pi = 180°, а (* 2. pi) = 360°? У тебя абсолютно непонятные требования - и при этом ты почему-то не показываешь свой код. И не показываешь, на каком месте у тебя "спотык".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.10.2015, 08:40
#2755
Pavel_GP

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Pavel_GP, ты про углы в курсе?
Семен Семеныч, я в курсе, я для подробно описываю ситуацию, чтоб тщательнее разобраться.
Код:
[Выделить все]
 ;;; Аналог off_set только для проекции Меркатора
;;; Большая отдельная благодарность Кулик Алексей akka_KPbIC http://forum.dwg.ru
(defun C:PPM (/	     dtr    ao	   bo	  f_ps	 fg	e1     e1_2
	      e2     e2_2   s	   sfg2	  ko	 pt	xi     tt
	      azimut_s	    Az	   coords *cdl_actvdoc*	LWPoly vertex
	      x1     x2	    ugol1  ugol2  obj	 ent	OSM    k
	      y_pt   y1	    y2
	     )
  (setq OSM (getvar "OSMODE"))		;запоминаем значение объективной привязки
  (setvar "OSMODE" 0)			;выключаем объективную привязку
  (vl-load-com)
;;; Настраиваем систему координат WGS84
;;; Вспомогательные функции
  (defun dtr (a) (* pi (/ a 180.)))
  (defun deg (r) (/ (* r 180.) pi))

;;; -----------------параметры эллипсоида WGS84----------------------
  (setq	ao   6378137.			;большая полуось
	bo   6356752.3142		;малая полуось
	f_ps (/ 1. 298.25722356)	;первое сжатие
	e1   0.0818191909289067		;первый эксцентриситет
	e1_2 (sqrt (/ (- (expt ao 2.) (expt bo 2.)) (expt bo 2.)))
					;второй эксцентриситет
	e2_2 (expt e1_2 2.)
	e2   (* f_ps (- 2. f_ps))
  )
  (setq fg (getreal "\n Введите главную параллель, xx.xxx°: "))
  (setq fg (dtr fg))			;перевод градусов в радианы
  (setq s (getdist "\n Укажите расстояние смещения, метры:"))
  (setq sfg2 (expt (sin fg) 2.))
  (setq	ko (/ (cos
		fg
	      ) ;_end of cos
	      (expt (- 1. (* e2 sfg2)) 0.5)
	   ) ;_end of /
  ) ;_end of setq ko

  (if (setq obj (entsel "\n Выбрать полилинию : ")) ;|<Имя объекта:|;
    (progn
      (if (and (= (type	(setq ent (vl-catch-all-apply ;|#<VLA-OBJECT|;
				    (function
				      (lambda ()
					(car obj)
				      ) ;_ end of LAMBDA
				    ) ;_ end of function
				  ) ;_ end of VL-CATCH-ALL-APPLY
			) ;_ end of setq ent
		  ) ;_ end of type
		  'ename
	       ) ;_ end of =
	       (setq ent (vlax-ename->vla-object ent))
	       (= (vla-get-objectname ent) "AcDbPolyline")
	  ) ;_ end of and
	(progn
	  (setq	pt
		 (getpoint "\n Уажите точку, определяющую сторону смещения"
		 )
	  ) ;_end setq pt
	  (setvar "OSMODE" OSM)		;включаем объективную привязку
;;;получение списка координат вершин полилинии
	  (setq
	    xy_v (mapcar 'cdr
			 (vl-remove-if-not
			   '(lambda (x) (= (car x) 10))
			   (entget (car obj))
			 ) ;_end vl-remove-if-not
		 ) ;_end of mapcar
	  ) ;_end of setq xy_v

;;; записываем азимуты
	  (defun tt (xy_v / res count)
	    (setq ugol1	(angle (car xy_v) pt) ;вспомогательные величины
		  ugol2	(angle (car xy_v) (cadr xy_v))
					;для определения			
		  x1	(caar xy_v)	;стороны смещения
		  x2	(caadr xy_v)
		  y_pt	(cadr pt)
		  y1	(cadar xy_v)
		  y2	(cadadr xy_v)
	    ) ;_end of setq(s)
	    (cond ((and (= y1 y2) (= ugol2 0) (< y_pt y1))
		   (setq k pi)
		  )
		  ((and (= y1 y2) (> ugol2 ugol1))
		   (setq k pi)
		  )
		  ((and (= y1 y2) (< ugol2 ugol1))
		   (setq k (* 2. pi))
		  )
		  ((and (= x1 x2) (> ugol2 ugol1))
		   (setq k pi)
		  )
		  ((and (= x1 x2) (< ugol2 ugol1))
		   (setq k (* 2. pi))
		  )
		  ((and (< x1 x2) (> y_pt y1) (> ugol2 ugol1) (< y1 y2))
		   (setq k pi)
		  )
		  ((and (< x1 x2) (> y_pt y1) (> ugol2 ugol1))
		   (setq k (* 2. pi))
		  )
		  ((and (< x1 x2) (< y1 y2) (< ugol2 ugol1) (< y_pt y1))
		   (setq k pi)
		  )
		  ((and (> ugol2 ugol1) (< x1 x2))
		   (setq k pi)
		  )
		  ((and (< ugol2 ugol1) (< x1 x2))
		   (setq k (* 2. pi))
		  )
		  ((and (> ugol2 ugol1) (> x1 x2))
		   (setq k pi)
		  )
		  ((and (< ugol2 ugol1) (> x1 x2))
		   (setq k (* 2. pi))
		  )
	    ) ;_end of cond
	    (setq count 0)
	    (mapcar
	      (function
		(lambda	(x / tmp)
		  (-
		  k
		  (cond
		    ((= count 0)
		     (setq tmp	 (angle x (nth (1+ count) xy_v))
			   count (1+ count)
		     ) ;_ end of setq
		     tmp
		    )
		    ((= count (1- (length xy_v)))
		     (angle (nth (1- count) xy_v) x)
		    )
		    (t
		     (setq tmp	 (* (+ (angle (nth (1- count) xy_v) x)
				       (angle x (nth (1+ count) xy_v))
				    ) ;_ end of +
				    0.5
				 ) ;_ end of *
			   count (1+ count)
		     ) ;_ end of setq
		     tmp
		    )
		  ) ;_ end of cond
					) ;_ end of -
		) ;_ end of lambda
	      ) ;_ end of function
	      xy_v
	    ) ;_ end of mapcar
	  ) ;_ end of defun

	  (setq	azimut_s ;|список азимутов|;
		 (tt (mapcar 'cdr
			     (vl-remove-if-not
			       '(LAMBDA (x) (= (car x) 10))
			       (entget (car obj))
			     ) ;_end of vl-remove-if-not
		     ) ;_end of mapcar
		 ) ;_end of tt
	  ) ;_end of setq
;;; получаем новый список координат вершин
	  (setq n 0)
	  (foreach vertex xy_v
	    (setq Az (nth n azimut_s))
	    (defun eval-new-coords (x	  y	/     mo    f_r	  l_r
				    nym2  c	Nm    Mm    betta gamma
				    alfa  b	w     fnew_r	  lnew_r
				    x0	  y0	tan   xy_new
				   )
	      (setq mo (- (/ pi 2.)
			  (* 2.
			     (atan (exp	(/ (* -1. y) (* ao ko))
				   ) ;_end of exp
			     ) ;_end of atan
			  ) ;_end of *
		       ) ;_end of -
	      ) ;_end of setq mo
;;; преобразование прямоугольных в географические координаты
	      (setq f_r
		     (+	(+ (+ (+ mo
				 (* (sin (* 2. mo))
				    (+ (+ (+ (/ (expt e1 2.) 2.)
					     (* 5. (/ (expt e1 4.) 24.))
					  ) ;_end of +
					  (/ (expt e1 6.) 12.)
				       ) ;_end of +
				       (* 13. (/ (expt e1 8.) 360.))
				    ) ;_end of +
				 ) ;_end of *
			      ) ;_end of +
			      (* (sin (* 4. mo))
				 (+ (+ (* 7. (/ (expt e1 4.) 48.))
				       (* 29. (/ (expt e1 6.) 240.))
				    ) ;_end of +
				    (* 811. (/ (expt e1 8.) 11520.))
				 ) ;_end of +
			      ) ;_end of *
			   ) ;_end of +
			   (* (sin (* 6. mo))
			      (+ (* 7. (/ (expt e1 6.) 120.))
				 (* 81. (/ (expt e1 8.) 1120.))
			      ) ;_end of +
			   ) ;_end of *
			) ;_end of +
			(* (sin (* 8. mo))
			   (* 4279. (/ (expt e1 8.) 161280.))
			) ;_end of *
		     ) ;_end of +
	      ) ;_end of setq f_r
	      (setq f_r	  (abs f_r)	; широта в радианах
		    l_r	  (/ x (* ao ko))
		    l_r	  (abs l_r)	; долгота в радианах
;;; вычисление новых координат вершин

;;; **************************************************************
		    nym2  (* e2_2 (expt (cos f_r) 2.))
		    c	  (* bo (+ 1. e2_2))
		    Nm	  (/ c (sqrt (+ 1. nym2)))
		    Mm	  (/ Nm (+ 1. nym2))
		    betta (/ (* s (cos Az)) Mm)
		    gamma (/ (* s (sin Az)) (* Nm (cos f_r)))
		    alfa  (sin f_r)
		    b	  (* betta (1+ (/ (+ (* 2. (expt gamma 2.))) 24.)))
	      ) ;_end of setq(s)
	      (setq
		w (* gamma
		     (1+ (/ (- (expt alfa 2.) (expt betta 2.)) 24.))
		  ) ;_end of *
	      ) ;_end of setq w
	      (setq fnew_r (+ f_r b))	;широта новой вершины
	      (setq lnew_r (+ l_r w))	;долгота новой вершины

;;; **************************************************************		  

	      (setq x0 (* (* ao ko) lnew_r))
	      (setq tan	(/ (sin (+ (/ pi 4.) (/ fnew_r 2.)))
			   (cos (+ (/ pi 4.) (/ fnew_r 2.)))
			) ;_end of /
	      ) ;_end of setq tan
	      (setq y0 (* (* ao ko)
			  (log (* tan
				  (expt	(/ (- 1. (* e1 (sin fnew_r)))
					   (+ 1. (* e1 (sin fnew_r)))
					) ;_end of /
					(/ e1 2.)
				  ) ;_end of expt
			       ) ;_end of *
			  ) ;_end of expt
		       ) ;_end of *
	      ) ;_end of setq y0
	      (setq xy_new (list x0 y0)); список прямоугольных координат новой вершины
	    ) ;_end of defun eval-new-coords
;;; список прямоугольных координат новых вершин
	    (setq coords
		   (cons (eval-new-coords (car vertex) (cadr vertex))
			 coords
		   ) ;_end of cons
	    ) ;_end of setq coords
	    (setq n (1+ n))
	  ) ;_end of foreach

	  (setq	*cdl_actvdoc*
		 (vla-get-ActiveDocument
		   (vlax-get-acad-object)
		 ) ;_end of vla-get-ActiveDocument
	  ) ;_end of setq *cdl_actvdoc*
;;; Строим полилинию по новым вершинам
	  (defun LWPoly	(coords / templst entg)
	    (vla-AddLightWeightPolyline
	      (vla-get-Block (vla-get-ActiveLayout *cdl_actvdoc*))
	      (vlax-safearray-fill
		(vlax-make-safearray
		  vlax-vbDouble
		  (vl-list* 0
			    (1-	(length	(setq templst
					       (apply
						 'append
						 (mapcar
						   (function
						     (lambda (x)
						       (cond
							 ((= 3 (length x))
							  (reverse (cdr (reverse x)))
							 )
							 (T x)
						       ) ;_end of cond
						     ) ;_end of lambda
						   ) ;_end of function
						   coords
						 ) ;_end of mapcar
					       ) ;_end of apply
					) ;_end of setq templst
				) ;_end of length
			    ) ;_end of 1-
		  ) ;_end of vl-list*
		) ;_end of vlax-make-safearray
		templst
	      ) ;_end of vlax-safearray-fill
	    ) ;_end of vla-AddLightWeightPolyline
	    (setq entg (entget (entlast)))
	    (entmod (append entg (list (cons 370 30) (cons 62 1))))
	  ) ;_end of defun LWPoly
	  (LWPoly coords)
	) ;_end of progn
	(princ "\n Это не тип полилинии.")
      ) ;_end of if
    ) ;_end of progn
    (princ "\n Объект не выбран.")
  ) ;_end of if
  (princ)
  (gc)
) ;_end of defun C:PPM
Пояснение к работе с кодом:
1. Загрузи dwg (см. вложение).
2. Прими по запросу систему координат.
3. параллель 75
4. для удобства работы смещение ввожу 50

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
на каком месте у тебя "спотык".
Как такого "стоптыка" нет, По моему мнению не правильные значения получает azimut_s строка 152

----- добавлено через ~4 ч. -----
Добавлю:
1. Строки 72-117, расчет вспомогательного коэффициента при выборе стороны смещения. Я лично не могу сейчас додуматься, как конкретно программно при выборе стороны смещения (вправо/влево), программа понимала что, где вправо, а где влево. Поэтому я прописываю такие вычисления, скорее всего все намного проще.
2. 94 просмотра вложения, ни одного ответа
Вложения
Тип файла: dwg
DWG 2010
test_PPM.dwg (1.27 Мб, 1465 просмотров)
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 27.10.2015 в 13:08. Причина: вставил скобку ( - k и и закрывающую ) ;_end of - (в функции tt)
Pavel_GP вне форума  
 
Непрочитано 27.10.2015, 13:52
#2756
Jerald

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


Как программно переключить цвет?
Jerald вне форума  
 
Непрочитано 27.10.2015, 14:21
#2757
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
94 просмотра вложения, ни одного ответа
Особенность движка - это не количество скачиваний, а количество просмотров страницы

Цитата:
Сообщение от Jerald Посмотреть сообщение
Как программно переключить цвет?
Цвет чего?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.10.2015, 14:31
#2758
Jerald

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Цвет чего?
Текущий цвет.
Jerald вне форума  
 
Непрочитано 27.10.2015, 14:37
1 | #2759
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от Jerald Посмотреть сообщение
Текущий цвет.
например
Код:
[Выделить все]
 (setvar "cecolor" "1")
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 27.10.2015, 14:47
#2760
Pavel_GP

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Pavel_GP,ты почему-то не показываешь свой код.
Что скажешь по коду, жду твоего ответа...
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
Ответ
Вернуться   Форум 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