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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLISP. Как функцией entmake нарисовать сплайн?

AutoLISP. Как функцией entmake нарисовать сплайн?

Ответ
Поиск в этой теме
Непрочитано 25.09.2013, 11:15 #1
AutoLISP. Как функцией entmake нарисовать сплайн?
Иванов Дмитрий
 
Регистрация: 28.09.2010
Сообщений: 55

Уже по разному пробовал, никак не выходит:
Код:
[Выделить все]
 (entmake (list '(0 . "SPLINE")
		 '(8 . "0")
		 (cons 210 (list 0.0 0.0 1.0))
;;;		 (cons 70  8)
;;;		 (cons 71  3)
;;;		 (cons 72  12)
;;;		 (cons 73  8)
;;;		 (cons 74  6)
;;;		 (cons 42  1.0e-010)
;;;		 (cons 43  1.0e-010)
;;;		 (cons 44  1.0e-010)
		 (cons 40  0.0)
		 (cons 40  0.0)
		 (cons 40  0.0)
		 (cons 40  0.0)
		 (cons 40  0.0621055)
		 (cons 40  0.78453)
		 (cons 40  1.74739)
		 (cons 40  2.80511)
		 (cons 40  2.88877)
		 (cons 40  2.88877)
		 (cons 40  2.88877)
		 (cons 40  2.88877)
		 (cons 10 (list 0.698769 0.706364 0.0)) (cons 10 (list 0.711122 0.72295 0.0)) (cons 10 (list 0.86717 0.932463 0.0))
		 (cons 10 (list 1.29382 1.36834 0.0)) (cons 10 (list 2.21171 1.53635 0.0)) (cons 10 (list 2.95836 1.5874 0.0))
		 (cons 10 (list 3.29314 1.40471 0.0)) (cons 10 (list 3.31767 1.39132 0.0))
                 (cons 11 (list 0.698769 0.706364 0.0)) (cons 11 (list 0.736051 0.756035 0.0)) (cons 11 (list 1.26313 1.25008 0.0))
                 (cons 11 (list 2.18924 1.51357 0.0)) (cons 11 (list 3.24368 1.43036 0.0)) (cons 11 (list 3.31767 1.39132 0.0))
		 ))
Задача нарисовать сплайн по шести точкам без задания начальной и конечной направляющей. Смотрел код сплайна в entget, и как понимаю под индексом 10 управляющая точка, под 11 - вершина.
Также, если у кого-то есть ссылка на материал по теории nurbs сплайна, используемого в автокаде, скиньте пожалуйста. Не ясно, как по заданным вершинам (и направляющим в начале и конце сплайна) высчитываются управляющие точки

Последний раз редактировалось Кулик Алексей aka kpblc, 25.09.2013 в 11:53.
Просмотров: 3787
 
Непрочитано 25.09.2013, 11:34
#2
gomer

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


Код:
[Выделить все]
 (defun entmake-spline (lst / plst)
  (entmake
	(append
	  (list
		'(0 . "SPLINE")
		'(100 . "AcDbEntity")
		'(100 . "AcDbSpline")
		(cons 90 (length (setq plst (mapcar '(lambda (x)(cons 11 x))lst))))
	  )
	  plst
	)
  )
)
gomer вне форума  
 
Автор темы   Непрочитано 25.09.2013, 12:02
#3
Иванов Дмитрий


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


Не получается. Как пользоваться вашей функцией? Ее аргумент это список ((x1 y1 z1) (x2 y2 z2) ...)?
(defun entmake-spline (lst / plst)
(entmake
(append
(list
'(0 . "SPLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbSpline")
(cons 90
(length (setq plst (mapcar '(lambda (x) (cons 11 x)) lst)))
)
)
plst
)
)
)

(defun c:spl_prob (/ n)
(setq n 0 list_for_spl (list ))
(while (< n 3)
(setq list_for_spl (append list_for_spl (list (getpoint))))
(setq n (1+ n))
)
(entmake-spline list_for_spl)
)
И ничего.
Иванов Дмитрий вне форума  
 
Непрочитано 25.09.2013, 12:43
#4
gomer

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


Код:
[Выделить все]
 (defun c:test ( / i lst pt)
  (setq i 0
        lst '()
  )
  (while (< i 3)
    (if (setq pt (getpoint "\nУкажите точку сплайна: "))
      (setq 
        lst
        (cons
          (list (car pt) (cadr pt))
          lst
        )
        i (1+ i)
      )
    )
  )
  (entmake-spline (reverse lst))
  (princ)
)
gomer вне форума  
 
Автор темы   Непрочитано 25.09.2013, 14:28
#5
Иванов Дмитрий


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


Гомер, ты наверно больше ломаешь чем строишь. Все равно не получается, в твоем примере создается список lst, например !lst ((89.2985 62.88) (44.3199 56.2198) (22.6634 29.5788)). А сплайн не рисуется. Я примерно так и использовал аргумент-список, только трехмерный.
Иванов Дмитрий вне форума  
 
Непрочитано 25.09.2013, 15:32
#6
TararykovDG

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


Иванов Дмитрий, попробуй так
Код:
[Выделить все]
 ;lst - список вида (list '(-37.203 99.9158 0.0) '(-20.1896 114.98 0.0) '(8.42394 100.302 0.0) '(31.2374 113.435 0.0) '(37.8108 138.541 0.0) '(10.3573 164.806 0.0))
(entmake (append (list '(0 . "SPLINE") '(100 . "AcDbEntity") '(100 . "AcDbSpline") '(71 . 3)) (mapcar '(lambda(x) (cons 11 x)) lst)))
TararykovDG вне форума  
 
Автор темы   Непрочитано 25.09.2013, 16:13
#7
Иванов Дмитрий


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


Нет, я лучше сначала попробую вот так:
(defun c:1 (/ )
(entmake '((0 . "POLYLINE") ; Object type
(66 . 1) ; Vertices follow
) )
(entmake '((0 . "VERTEX") ; Object type
(10 1.0 1.0 0.0) ; Start point
) )
(entmake '((0 . "VERTEX") ; Object type
(10 4.0 6.0 0.0) ; Second point
) )
(entmake '((0 . "VERTEX") ; Object type
(10 3.0 2.0 0.0) ; Third point
) )
(entmake '((0 . "SEQEND"))) ; Sequence end
)
Отпокал из справки по VisualLisp, глава Creating Complex Entities
По крайней мере работает на плоской полилинии. Сплайн это по ощущению объект где-то близкий полилинии. Тоже составной сложный длинный объект. Смысл в том, что составные объекты генерятся вложенными командами entmake. Может я ошибаюсь, но интуитивно это правильно. Для окончания ввода точек есть SEQEND. А в ваших примерах все время встречается мешанина из лямбда-выражения, не знаю откуда вы это взяли
Иванов Дмитрий вне форума  
 
Непрочитано 25.09.2013, 16:17
#8
TararykovDG

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


Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
По крайней мере работает на плоской полилинии. Сплайн это по ощущению объект где-то близкий полилинии. Тоже составной сложный длинный объект. Смысл в том, что составные объекты генерятся вложенными командами entmake. Может я ошибаюсь, но интуитивно это правильно. Для окончания ввода точек есть SEQEND. А в ваших примерах все время встречается мешанина из лямбда-выражения, не знаю откуда вы это взяли
Ну тогда флаг Вам в руки, барабан на шею
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 25.09.2013, 16:49
#9
Иванов Дмитрий


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


TararykovDG, спасибо тебе! Получилось наконец-то, а этот код из справки автокада только на плоской полилинии работает. Там было написано что-то типа old... , как я понял это старая форма задания полилинии. Пытался сделать из этого кода вариант для трехмерной (3DPOLYLINE), ничего не вышло
Спасибо за внимание
Еще вопрос - как ввести касательные к сплайну? Код 12 и 13. С касательными не знаю как быть

Последний раз редактировалось Иванов Дмитрий, 25.09.2013 в 17:47.
Иванов Дмитрий вне форума  
 
Непрочитано 25.09.2013, 17:59
#10
gomer

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


Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
Гомер, ты наверно больше ломаешь чем строишь.
Ну я если честно взял код для полилинии и обработал напильником, в брикскаде все строится нормально, а на акад я уж давно М27 забил...
gomer вне форума  
 
Автор темы   Непрочитано 25.09.2013, 20:08
#11
Иванов Дмитрий


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


У меня тоже брикскад дома, а на работе акад. Проверил, твой код из #2 работает в брикскаде, но зато у инженера-энтузиаста код работает и там и там. Я не забиваю на акад, программу делаю универсальной
Вот если бы с касательными разобраться , то этого решения по отрисовке сплайнов хватит на всю жизнь
Все, разобрался, вот так это делается:
(defun c:1 (/ lst n)
(setq n 0)
(setq lst (list
'(1257.71 526.504 131.137) '(1322.59 546.226 133.436)
'(1390.58 547.768 130.097) '(1457.5 536.9 123.087)
'(1521.67 516.119 113.252))
)
(entmake
(append (list '(0 . "SPLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbSpline")
'(71 . 3)
(list 12 0.87776 0.470142 0.0922135); начальная касательная
(list 13 0.913997 -0.371616 -0.162821); конечная касательная
)
(mapcar '(lambda (x) (cons 11 x)) lst)
)
)
(princ)
)

Последний раз редактировалось Иванов Дмитрий, 26.09.2013 в 09:53.
Иванов Дмитрий вне форума  
 
Автор темы   Непрочитано 02.11.2013, 19:52
#12
Иванов Дмитрий


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


Доброго дня снова! А какой будет в автолиспе код, чтобы нарисовать функцией entmake 3d-полилинию? Так же как и со сплайном, чтобы аргумент был список координат вершин ((x1 y1 z1) (x2 y2 z2) ...). Пытаюсь изобрести примерно такое,
(defun ris_lw_entmake_neud (lst / )
(entmake (append (list '(0 . "POLYLINE") '(100 . "AcDbEntity") '(100 . "AcDb3dPolyline") '(66 . 1))
(mapcar '(lambda (x) (cons 11 x)) lst))) (princ)
)
и не получается. Подскажите
Иванов Дмитрий вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLISP. Как функцией entmake нарисовать сплайн?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как нарисовать сплайн либо полилинию на сложной поверхности (например на поверхности цилиндра)? perfy AutoCAD 5 11.04.2013 13:05
Как нарисовать садовые дорожки заданой ширины (Какой функцией) ADZUMA AutoCAD 10 15.06.2012 14:24
entmake, как создать призму (autolisp entmake)? baaba LISP 4 25.01.2011 12:40