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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Объединение двух 3D тел

Lisp. Объединение двух 3D тел

Ответ
Поиск в этой теме
Непрочитано 03.09.2013, 12:55 #1
Lisp. Объединение двух 3D тел
Golem-iq
 
студент
 
Москва
Регистрация: 03.03.2012
Сообщений: 50

Есть два 3D тела, созданных из двух полилиний с помощью выдавливания. Их нужно объединить в одно тело.
Вот пример:
исходный

получившийся


Мне нужно это сделать на Lisp'е. Пытаюсь сделать вот так:
Код:
[Выделить все]
 (defun condust( / n osm otv x y h)

  (setq osm (getvar "osmode")) ;; Сохраняем объектную привязку
  (setvar "osmode" 0)
  (command "_.layer" "_set" "cond" "")

  (setq x (atoi (nth 6 obor)); длина
	y (atoi (nth 7 obor)); ширина
	h (atoi (nth 8 obor)); высота

	n '(300 300)       ; точка появления блока
  )
  (command "_pline" ; отрисовка 2D основы блока
           (list (nth 0 n) (nth 1 n))
	   (list (+ (nth 0 n) y) (nth 1 n))
	   (list (+ (nth 0 n) y) (+ (nth 1 n) x))
	   (list (nth 0 n) (+ (nth 1 n) x))
	   (list (nth 0 n) (nth 1 n))
	   ""
  )
  (setq temp1 (entlast))
  (command "_extrude" temp1 "" h "") ; выдавливаем для придания объёма

  (command "_pline" ; отрисовка 2D метки направления движения потока воздуха для блока
           (list (+ (nth 0 n) (/ (nth 0 n) 10)) (+ (nth 1 n) (/ (nth 1 n) 10)))
	   (list (+ (nth 0 n) (/ y 1.2)) (+ (nth 1 n) (/ x 2)))
	   (list (+ (nth 0 n) (/ (nth 0 n) 10)) (+ x (- (nth 1 n) (/ (nth 1 n) 10))))
	   (list (+ (nth 0 n) (/ (nth 0 n) 10)) (+ (nth 1 n) (/ (nth 1 n) 10)))
	   ""
  )
  (setq temp2 (entlast))
  (command "_move" temp2 "" '(0 0 -50) "")
  (command "_extrude" temp2 "" (+ h 100) "")

  (command "_union" temp1 temp2 "") ;;  Объединения не происходит. AutoCAD выводит, что "Выделено 0 объектов".
  
  (setvar "osmode" osm)
)

Объединения не происходит. AutoCAD выводит, что "Выделено 0 объектов". Помогите найти ошибку.
Просмотров: 1536
 
Непрочитано 03.09.2013, 13:19
1 | #2
Do$

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


Логика приведенной программы:
берем последний примитив (полилинию), выдавливаем. При этом, полилиния, скорее всего, удаляется и создается новый объект - тело (3d solid). А в union передаются ссылки на полилинии. Естественно, что команда не принимает их и пишет, что выбрано 0 объектов.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 03.09.2013, 13:30
#3
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от Do$ Посмотреть сообщение
Логика приведенной программы:
берем последний примитив (полилинию), выдавливаем. При этом, полилиния, скорее всего, удаляется и создается новый объект - тело (3d solid). А в union передаются ссылки на полилинии. Естественно, что команда не принимает их и пишет, что выбрано 0 объектов.
Благодарю, мягко говоря прозевал...

Если кому нужен будет исправленный вариант:
Код:
[Выделить все]
  (defun condust( / n osm otv x y h)

  (setq osm (getvar "osmode")) ;; Сохраняем объектную привязку
  (setvar "osmode" 0)
  (command "_.layer" "_set" "cond" "")

  (setq x (atoi (nth 6 obor)); длина
	y (atoi (nth 7 obor)); ширина
	h (atoi (nth 8 obor)); высота

	n '(300 300)       ; точка появления блока
  )
  (command "_pline" ; отрисовка 2D основы блока
           (list (nth 0 n) (nth 1 n))
	   (list (+ (nth 0 n) y) (nth 1 n))
	   (list (+ (nth 0 n) y) (+ (nth 1 n) x))
	   (list (nth 0 n) (+ (nth 1 n) x))
	   (list (nth 0 n) (nth 1 n))
	   ""
  )
  (setq temp1 (entlast))
  (command "_extrude" temp1 "" h "") ; выдавливаем для придания объёма
  (setq temp1 (entlast)) ; ИСПРАВЛЕНО

  (command "_pline" ; отрисовка 2D метки направления движения потока воздуха для блока
           (list (+ (nth 0 n) (/ (nth 0 n) 10)) (+ (nth 1 n) (/ (nth 1 n) 10)))
	   (list (+ (nth 0 n) (/ y 1.2)) (+ (nth 1 n) (/ x 2)))
	   (list (+ (nth 0 n) (/ (nth 0 n) 10)) (+ x (- (nth 1 n) (/ (nth 1 n) 10))))
	   (list (+ (nth 0 n) (/ (nth 0 n) 10)) (+ (nth 1 n) (/ (nth 1 n) 10)))
	   ""
  )
  (setq temp2 (entlast))
  (command "_move" temp2 "" '(0 0 -50) "")
  (command "_extrude" temp2 "" (+ h 100) "")
  (setq temp2 (entlast)) ; ИСПРАВЛЕНО


  (command "_union" temp1 temp2 "") ;;  Объединения не происходит. AutoCAD выводит, что "Выделено 0 объектов".
  
  (setvar "osmode" osm)
)
Golem-iq вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Объединение двух 3D тел

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"виртуальный" 3D CAD / С#, GDL, LISP SergeyAB LISP 6 15.10.2013 22:20
И снова про объединение 3D объектов.. sisrar AutoCAD 9 01.04.2013 09:40
autocad 2009, не могу сделать объект из двух паралелепипедов (3d) rt_dev AutoCAD 16 16.04.2009 23:23
Поворот в двух плоскостях для 3d объекта MegaPascal AutoCAD 7 30.01.2009 15:06
Объединение двух 3D полилиний Рyslan AutoCAD 12 22.05.2008 13:14