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

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

Выдавливание и вычитание трехмерных объектов

Ответ
Поиск в этой теме
Непрочитано 02.04.2009, 07:17 #1
Выдавливание и вычитание трехмерных объектов
HooDRooK
 
Регистрация: 11.03.2009
Сообщений: 33

Подскажите, господа знающие программисты, как программно (с помощью LISP) и проще выполнить следующие действия:
1. В трехмерном пространстве рисуется круг,
2. Нарисованный круг выдавливается на определённую высоту;
3. Из верхнего центра полученного циллиндра рисуется круг меньшего диаметра;
4. Круг 2 выдавливается с отрицательной высотой, равной высоте круга 1;
В общем в результате должен получиться циллиндр с отверстием посередине.
С Уважением!
Просмотров: 4046
 
Непрочитано 02.04.2009, 08:14
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,626


Зачем из верхнего центра?
Profan вне форума  
 
Непрочитано 02.04.2009, 08:17
#3
VictorHunter


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


Код:
[Выделить все]
(defun test1 (/	       adoc	pt	 rad1	  rad2	   lst
	      ext_circle	int_circle	  height   model
	      err      ext_reg	int_reg	 reg
	     )
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  ) ;_ end of vla-startundomark
  (if
    (and
      (= (type
	   (setq
	     pt	(vl-catch-all-apply
		  (function
		    (lambda () (getpoint "\nТочка центра <Отмена> : "))
		  ) ;_ end of function
		) ;_ end of vl-catch-all-apply
	   ) ;_ end of setq
	 ) ;_ end of type
	 'list
      ) ;_ end of =
      pt
      (= (type (setq rad1
		      (vl-catch-all-apply
			(function (lambda ()
				    (getdist pt "\nВнешний радиус <Отмена> : ")
				  ) ;_ end of lambda
			) ;_ end of function
		      ) ;_ end of vl-catch-all-apply
	       ) ;_ end of setq
	 ) ;_ end of type
	 'real
      ) ;_ end of =
      (= (type
	   (setq
	     rad2 (vl-catch-all-apply
		    (function
		      (lambda ()
			(getdist pt "\nВнутренний радиус <Отмена> : ")
		      ) ;_ end of lambda
		    ) ;_ end of function
		  ) ;_ end of vl-catch-all-apply
	   ) ;_ end of setq
	 ) ;_ end of type
	 'real
      ) ;_ end of =
      (= (type
	   (setq
	     height (vl-catch-all-apply
		      (function
			(lambda	()
			  (getdist "\nВысота выдавливания <Отмена> : ")
			) ;_ end of lambda
		      ) ;_ end of function
		    ) ;_ end of vl-catch-all-apply
	   ) ;_ end of setq
	 ) ;_ end of type
	 'real
      ) ;_ end of =
    ) ;_ end of and
     (if (vl-catch-all-error-p
	   (setq err (vl-catch-all-apply
		       (function
			 (lambda ()
			   (setq rad1	 (car (setq lst	(vl-sort (list rad1 rad2)
								 (function >)
							) ;_ end of vl-sort
					      ) ;_ end of setq
					 ) ;_ end of car
				 rad2	 (cadr lst)
				 model	 (vla-get-modelspace adoc)
				 ext_reg (vla-addregion
					   model
					   (vlax-safearray-fill
					     (vlax-make-safearray
					       vlax-vbobject
					       '(0 . 0)
					     ) ;_ end of vlax-make-safearray
					     (list (setq ext_circle
							  (vla-addcircle
							    model
							    (vlax-3d-point pt)
							    rad1
							  ) ;_ end of vla-addcircle
						   ) ;_ end of setq
					     ) ;_ end of list
					   ) ;_ end of vlax-safearray-fill
					 ) ;_ end of vla-addregion
				 int_reg (vla-addregion
					   model
					   (vlax-safearray-fill
					     (vlax-make-safearray
					       vlax-vbobject
					       '(0 . 0)
					     ) ;_ end of vlax-make-safearray
					     (list (setq int_circle
							  (vla-addcircle
							    model
							    (vlax-3d-point pt)
							    rad2
							  ) ;_ end of vla-addcircle
						   ) ;_ end of setq
					     ) ;_ end of list
					   ) ;_ end of vlax-safearray-fill
					 ) ;_ end of vla-addregion
				 reg	 (vla-boolean
					   (car	(vlax-safearray->list
						  (vlax-variant-value ext_reg)
						) ;_ end of vlax-safearray->list
					   ) ;_ end of car
					   acsubtraction
					   (car	(vlax-safearray->list
						  (vlax-variant-value int_reg)
						) ;_ end of vlax-safearray->list
					   ) ;_ end of car
					 ) ;_ end of vla-boolean
			   ) ;_ end of setq
			   (vla-addextrudedsolid
			     model
			     (car (vlax-safearray->list
				    (vlax-variant-value
				      ext_reg
				    ) ;_ end of vlax-variant-value
				  ) ;_ end of vlax-safearray->list
			     ) ;_ end of car
			     height
			     0.
			   ) ;_ end of vla-addextrudedsolid
			 ) ;_ end of lambda
		       ) ;_ end of function
		     ) ;_ end of vl-catch-all-apply
	   ) ;_ end of setq
	 ) ;_ end of vl-catch-all-error-p
       (princ (strcat "\nОшибка времени выполнения : "
		      (vl-catch-all-error-message err)
	      ) ;_ end of strcat
       ) ;_ end of princ
     ) ;_ end of if
  ) ;_ end of if
  (foreach item	(list ext_circle int_circle)
    (if	(and (vlax-write-enabled-p item)
	     (not (vlax-erased-p item))
	) ;_ end of and
      (vla-erase item)
    ) ;_ end of if
  ) ;_ end of foreach
  (vla-endundomark adoc)
  (princ)
) ;_ end of defun
VictorHunter вне форума  
 
Непрочитано 02.04.2009, 08:24
#4
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,626


Заготовка в случае использования нижнего центра:
Код:
[Выделить все]
 
(defun C:TR ( / pt1 ent1 ent2)
(setq pt1 (getpoint "\n Укажите центр круга: "))
(vl-cmdf "_CIRCLE" pt1 50)
(vl-cmdf "_EXTRUDE" "_L" "" 200 "")
(setq ent1 (entlast))
(vl-cmdf "_CIRCLE" pt1 40)
(vl-cmdf "_EXTRUDE" "_L" "" 200 "")
(setq ent2 (entlast))
(vl-cmdf "_subtract" ent1 "" ent2 "")
(princ)
)
Profan вне форума  
 
Непрочитано 02.04.2009, 08:29
#5
Кулик Алексей aka kpblc
Moderator

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


Profan, ты про osmode забыл.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.04.2009, 08:31
#6
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,626


Алексей, я не забыл. Это же заготовка (рыба).
Profan вне форума  
 
Автор темы   Непрочитано 02.04.2009, 18:31
#7
HooDRooK


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


Заранее спасибо гопода программисты!...проверю что получилось по предложенным кодам как смогу (сейчас на выезде по работе)...Так что зайдите ещё раз пожалуйста, посмотри что напишу по поводу вопросов...
ЗЫ: всем по пиву...пишите адреса. куда пиво слать..
HooDRooK вне форума  
 
Непрочитано 02.04.2009, 19:57
#8
Рyslan


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


что такое ent1 ent2?
Рyslan на форуме  
 
Непрочитано 02.04.2009, 20:03
#9
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,626


ent1 и ent2 - локальные переменные, в которых запоминаются имена последних отрисованных объектов. В данном случае это выдавленные цилиндры.
Profan вне форума  
 
Автор темы   Непрочитано 29.04.2009, 12:32
#10
HooDRooK


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


Ещё вопрос. Почему говорил что надо из верхнего центра вычитать потому что деталька состоит из нескольких таких установленных друг на друга циллиндров. Т.е. в предложенных кодах где запоминаются координаты подскажите?.
HooDRooK вне форума  
 
Непрочитано 04.05.2009, 09:48
#11
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Уважаемый HooDRooK.
Привожу простейший, без наворотов пример программы,
удовлетворяющей всем четырем пунктам вашей темы.
Код:
[Выделить все]
(setq p1 (getpoint "\nУкажите центр круга"))
(setq r_b (getdist p1 "\nУкажите радиус большого круга"))
(setq r_m (getdist p1 "\nУкажите радиус малого круга"))
(setq v_z (getdist p1 "\nУкажите высоту цилиндра"))
(setq p2 (list (car p1) (cadr p1) v_z)); получение координат центра верхнего основания цилиндра
(command "_circle" p1 r_b);отрисовка большей окружности
(command "_extrude" (entlast) "" v_z);выдавливание большего цилиндра (вверх)
(setq zil_b (entlast));запомнить больший цилиндр для последующего вычитания
(command "_circle" p2 r_m);отрисовка меньшей окружности с центром в точке p2 (верхнее основание цилиндра)
(command "_extrude" (entlast) "" (- v_z));выдавливание меньшего цилиндра в отрицательном направлении (вниз)
(setq zil_m (entlast));запомнить меньший цилиндр для последующего вычитания
(command "_subtract" zil_b "" zil_m "");вычитание тел цилиндров
E-degtyarev вне форума  
 
Автор темы   Непрочитано 14.05.2009, 07:31
#12
HooDRooK


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


А теперь вот ещё вопрос...Как можно заставить лисп вычесть один объект сразу из двух?...
Например друг на друге с помощью circle и extrude два цилиндра. Из верхней точки рисуется один, высотой, равной сумме первых двух но меньшего диаметра. В общем должна получиться сквозная дырка.
Но вот если писать
(command "_subtract" zil_b3 "" zil_b5 "");âû÷èòàíèå òåë öèëèíäðîâ
(command "_subtract" zil_b2 "" zil_b5 "");âû÷èòàíèå òåë öèëèíäðîâ
где zil_b3- верхний циллиндр
zil_b2- нижний циллиндр
zil_b5- циллиндр, который надо вычетать из обоих

То естественно что последний циллиндр вычтется только из верхнего.
HooDRooK вне форума  
 
Непрочитано 14.05.2009, 09:52
#13
Кулик Алексей aka kpblc
Moderator

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


Либо объединяй 2 первых тела, либо копируй вычитаемое.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.05.2009, 10:43
#14
HooDRooK


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


Вопрос такой...если я получаю координаты центра круга с помощью
.....
(setq p1 (getpoint "\nУкажите центр детали"));получение размеров нижнего циллиндра
(setq p2 (list (car p1) (cadr p1) L4)); получение координат центра верхнего основания цилиндра
......
каким образом я могу например начертить ещё несколько кругов меняя только значение по X или по Y? Т.е. чтобы одна координата нижнего центра оставалась неизменной а менялась только вторая...

Последний раз редактировалось HooDRooK, 14.05.2009 в 11:47.
HooDRooK вне форума  
 
Непрочитано 18.05.2009, 11:16
#15
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Код:
[Выделить все]
(setq p1 (getpoint "\nУкажите центр детали"));получение размеров нижнего циллиндра
(setq p2 (list (car p1) (cadr p1) L4)); получение координат центра верхнего основания цилиндра

;координаты центров оснований цилиндров можно получить так:
(setq p_n (list (+ (car p1) 100) (+ (cadr p1) 100) (caddr p1)));добавляя или вычитая известные Вам величины (здесь 100 и 100) к координатам  по X и Y
;либо:
(setq p_n (polar p1 (* pi 0.25) 140));где (* pi 0.25) - угол (здесь 45 градусов), 140- растояние между центрами окружностей
E-degtyarev вне форума  
 
Непрочитано 21.05.2009, 03:29
#16
Валенок

Проектировщик
 
Регистрация: 19.10.2006
Москва
Сообщений: 37


Внесу свои три копейки.

Ваше условие №1 - было рисовать в трехмере.
В моем понимании трехмер это не только вверх, а вообще в ЛЮБОМ направлении.

В силу специфики своей деятельности, в вашем примере увидел только трубу. Вам принципиально рисовать выдавливанием цирклей ?

Предположил что для дальнейшей обработки может потребоватся какая-то информация о полученном объекте.
Вложения
Тип файла: lsp draw-truba.lsp (1.6 Кб, 81 просмотров)

Последний раз редактировалось Валенок, 21.05.2009 в 04:07. Причина: косячок
Валенок вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выдавливание и вычитание трехмерных объектов



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Набор объектов DEM Программирование 21 26.03.2014 19:11
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35
Перевод трехмерных объектов в плоские Jerald AutoCAD 31 08.04.2007 01:15
как вырезать из набора трехмерных объектов область другим тр bodya AutoCAD 2 23.10.2006 00:28
Печать трехмерных объектов в Автокаде Maxim_ AutoCAD 3 15.04.2004 16:07