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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Можно ли в автокад выполнить команду "сечение" и разрезать 3Д тело сразу по нескольким сечениям?

Можно ли в автокад выполнить команду "сечение" и разрезать 3Д тело сразу по нескольким сечениям?

Ответ
Поиск в этой теме
Непрочитано 09.03.2018, 04:44 #1
Можно ли в автокад выполнить команду "сечение" и разрезать 3Д тело сразу по нескольким сечениям?
yarus.khv
 
Регистрация: 06.03.2012
Сообщений: 321

Добрый день!
Подскажите, можно ли в автокад выполнить команду "сечение" и разрезать 3Д тело сразу по нескольким сечениям?
Пример во вложении. Нужно разбить цилиндр на 3 части одной командой.

Вложения
Тип файла: dwg
DWG 2013
Чертеж2.dwg (45.8 Кб, 26 просмотров)

Просмотров: 3754
 
Непрочитано 17.08.2018, 11:55
#2
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Небольшая программка. Будет резать 3DSolid-ы на части экструдированными плоскостями только, расположенными в плоскостях XY с разными Z координатами.
Код:
[Выделить все]
 
(defun c:Slice_Multiple ( /
							acad_Object document_object modelSpace_object Slice_Plane_Pickset
							current_slice_plane slice_Plane_Z_coordinate
							slice_plane_point_1 slice_plane_point_2 slice_plane_point_3
							slice_plane_Z_list sliced_Object 3DBoxes_sset_Object
							document_Selection_sets there_is_3Dsolids_Sset ;solids_processed
							vlax_executed lisp_executed group_Code data_Value
						)
    (setq acad_Object (vlax-get-acad-object)
          document_object (vla-get-Activedocument acad_Object)
          modelSpace_object (vla-get-modelSpace document_object)
		  document_Selection_sets (vla-get-SelectionSets document_object)
		  vlax_executed (vla-startUndoMark document_object)
		  there_is_3Dsolids_Sset nil
;		  solids_processed 0
	)
	(vlax-for selection_set document_Selection_sets
		(if (= "3Dsolids_Sset" (vla-get-name selection_set))
			(setq there_is_3Dsolids_Sset t
				  3Dsolids_sset_Object selection_set
			)
		)
	)
	(if there_is_3Dsolids_Sset
		(progn
			(vla-delete 3Dsolids_sset_Object)
			(vlax-release-object 3Dsolids_sset_Object)
			(setq 3Dsolids_sset_Object (vla-Add document_Selection_sets "3Dsolids_Sset"))
		)
		(setq 3Dsolids_sset_Object (vla-Add document_Selection_sets "3Dsolids_Sset"))
	)
	(setq group_Code (vlax-make-safearray vlax-vbInteger '(0 . 0))
		  vlax_executed (vlax-safearray-put-element group_Code 0 0)
		  data_Value (vlax-make-safearray vlax-vbVariant '(0 . 0))
		  vlax_executed	(vlax-safearray-put-element data_Value 0 "3DSOLID")
		  lisp_executed (prompt "\nВыберите 3D тела")
	      vlax_executed (vl-catch-all-apply 'vla-SelectOnScreen (list 3Dsolids_sset_Object group_Code data_Value))
		  lisp_executed (prompt "\nВыберите секущие плоскости")
    	  Slice_Plane_Pickset (ssget '((0 . "EXTRUDEDSURFACE")))
	)
	(while (> (sslength Slice_Plane_Pickset) 0)
		(setq current_slice_plane (ssname Slice_Plane_Pickset 0)
    		  slice_Plane_Z_coordinate (nth 11 (mapcar 'cdr (vl-remove-if-not (function (lambda (list_element) (= 46 (car list_element)))) (entget current_slice_plane))))
			  slice_plane_Z_list (append slice_plane_Z_list (list slice_Plane_Z_coordinate))
			  Slice_Plane_Pickset (ssdel current_slice_plane Slice_Plane_Pickset)
		)
	)

	(setq slice_plane_Z_list (vl-sort slice_plane_Z_list '>))

	(vlax-map-collection 3Dsolids_sset_Object
		'(lambda (sset_box)
			(foreach slice_plane slice_plane_Z_list
				(setq slice_Plane_Z_coordinate slice_plane
					  slice_plane_point_1 (vlax-3d-point 1.0 1.0 slice_Plane_Z_coordinate)
					  slice_plane_point_2 (vlax-3d-point -1.0 1.0 slice_Plane_Z_coordinate)
					  slice_plane_point_3 (vlax-3d-point 0 0 slice_Plane_Z_coordinate)
			    	  sliced_Object (vla-SliceSolid sset_box slice_plane_point_1 slice_plane_point_2 slice_plane_point_3 :vlax-true)
				)
			)
;			(setq solids_processed (1+ solids_processed))
		 )
	)
	(vlax-release-object 3Dsolids_sset_Object)
	(vlax-release-object sliced_Object)
	(vla-EndUndoMark document_object)
	(princ)
)

Последний раз редактировалось koMon, 20.08.2018 в 09:39. Причина: множественный выбор 3d тел
koMon вне форума  
 
Автор темы   Непрочитано 18.08.2018, 03:07
#3
yarus.khv


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Небольшая программка. Будет резать 3DSolid на части экструдированными плоскостями только, расположенными в плоскостях XY с разными Z координатами
Спасибо! можно ли сделать выбор и дробление неограниченного количества 3D солидов?
yarus.khv вне форума  
 
Непрочитано 19.08.2018, 16:02
#4
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Цитата:
Сообщение от yarus.khv Посмотреть сообщение
можно ли сделать выбор и дробление неограниченного количества 3D солидов?
дробиться они будут опять же экструдирванными плоскостями с разными Z?
koMon вне форума  
 
Автор темы   Непрочитано 19.08.2018, 16:19
#5
yarus.khv


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


Цитата:
Сообщение от koMon Посмотреть сообщение
дробиться они будут опять же экструдирванными плоскостями с разными Z?
да, выбираем несколько (большое количество) 3Д тел, которые дробятся рядом поверхностей
yarus.khv вне форума  
 
Непрочитано 20.08.2018, 09:40
#6
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Цитата:
Сообщение от yarus.khv Посмотреть сообщение
да, выбираем несколько (большое количество) 3Д тел, которые дробятся рядом поверхностей
добавил множественный выбор 3D тел
koMon вне форума  
 
Автор темы   Непрочитано 20.08.2018, 10:31
#7
yarus.khv


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


Цитата:
Сообщение от koMon Посмотреть сообщение
добавил множественный выбор 3D тел
Работает, спасибо!
yarus.khv вне форума  
 
Непрочитано 20.08.2018, 10:37
#8
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Цитата:
Сообщение от yarus.khv Посмотреть сообщение
Работает, спасибо!
koMon вне форума  
 
Автор темы   Непрочитано 13.04.2019, 03:28
#9
yarus.khv


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


Добрый день! А можно ли в лисп добавить возможность резать по оси X и Y тоже? одновременно с резкой по Z
yarus.khv вне форума  
 
Непрочитано 13.04.2019, 22:08
#10
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


то есть выбираются множественные солиды и множественные ортогональные плоскости эктрудированные поверхности, которые режут всё что режется из выбранных солидов?

----- добавлено через ~5 мин. -----
то есть выбираются множественные солиды и множественные ортогональные плоскости, которые режут всё что режется из выбранных солидов?
koMon вне форума  
 
Автор темы   Непрочитано 14.04.2019, 05:24
#11
yarus.khv


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


Цитата:
Сообщение от koMon Посмотреть сообщение
то есть выбираются множественные солиды и множественные ортогональные плоскости эктрудированные поверхности, которые режут всё что режется из выбранных солидов?
да, именно так.
yarus.khv вне форума  
 
Непрочитано 15.04.2019, 07:07
#12
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от yarus.khv Посмотреть сообщение
Добрый день! А можно ли в лисп добавить возможность резать по оси X и Y тоже? одновременно с резкой по Z
Код вроде открыт, кто же Вам может помешать добавить то, что Вам нужно!? Не сдерживайте себя, смело добавляйте. =о)

ЗЫ.
Данный раздел форума вроде как не про программирование...
Boxa вне форума  
 
Непрочитано 18.04.2019, 10:18
#13
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Цитата:
Сообщение от Boxa Посмотреть сообщение
кто же Вам может помешать добавить то, что Вам нужно!? Не сдерживайте себя, смело добавляйте. =о)
Boxa, добавить не получилось) только переписать

Цитата:
Сообщение от Boxa Посмотреть сообщение
Данный раздел форума вроде как не про программирование...
автокад без автолиспа?

Цитата:
Сообщение от yarus.khv Посмотреть сообщение
да, именно так
только ортогональные солиды и поверхности. для теста. проверок нет вообще!

Код:
[Выделить все]
 
;**************************************************************************************************************************************
;
															(vl-load-com)
;
;**************************************************************************************************************************************
;
;				   												koMon
;               											 18.04.2019
;
;**************************************************************************************************************************************
(defun c:All_Slice_Multiple ( / XY_points_list YZ_points_list XZ_points_list plane_list solid_list solid_init_number
								46_list 46_t_matrix
								modelSpace_object sliced_solid_object min_XYZ max_XYZ
								delete_planes
								start_time end_time
							)

	(alert "     Выберите ОРТОГОНАЛЬНЫЕ 3D Solid-ы и секущие поверхности")
	(setq plane_solid_pickset (ssget '((-4 . "<or") (0 . "EXTRUDEDSURFACE") (0 . "SWEPTSURFACE") (0 . "3DSOLID") (-4 . "or>"))))
	(initget "Да Нет")
	(setq delete_planes (GetKWord (strcat "\nУдалять поверхности после выполнения команды " "[Да/Нет]" " <Нет>: ")))

	(setq start_time (getvar 'millisecs)
		  plane_list (vl-remove-if-not '(lambda (list_member)
											(and
												(= 'ename (type list_member))
												(or
													(= "EXTRUDEDSURFACE" (cdr (assoc 0 (entget list_member))))
													(= "SWEPTSURFACE" (cdr (assoc 0 (entget list_member))))
												)
											)
										)
										(mapcar 'cadr (ssnamex plane_solid_pickset))
					 )
	)
	(setq solid_list (vl-remove-if-not '(lambda (list_member)
											(and
												(= 'ename (type list_member))
												(= "3DSOLID" (cdr (assoc 0 (entget list_member))))
											)
										)
										(mapcar 'cadr (ssnamex plane_solid_pickset))
					 )
		  solid_init_number (length solid_list)
	)
	(foreach plane plane_list
		(setq 46_list (mapcar 'cdr (vl-remove-if-not '(lambda (list_element)
										 					(= 46 (car list_element))
								 		 			  )
								 		 			  (entget Plane)
			  		  			   )
					  )
		)
		(setq 46_t_matrix (list
								(list (nth 0 46_list) (nth 4 46_list) (nth 8  46_list) (nth 12 46_list))
								(list (nth 1 46_list) (nth 5 46_list) (nth 9  46_list) (nth 13 46_list))
								(list (nth 2 46_list) (nth 6 46_list) (nth 10 46_list) (nth 14 46_list))
								(list (nth 3 46_list) (nth 7 46_list) (nth 11 46_list) (nth 15 46_list))
						  )
		)
		(cond
			(
				(and
					(or
						(equal '(1.0 0.0 0.0 0.0) (car 46_t_matrix) 1e-6)
						(equal '(-1.0 0.0 0.0 0.0) (car 46_t_matrix) 1e-6)
						(equal '(0.0 1.0 0.0 0.0) (car 46_t_matrix) 1e-6)
						(equal '(0.0 -1.0 0.0 0.0) (car 46_t_matrix) 1e-6)
					)
					(or
						(equal '(0.0 0.0 -1.0 0.0) (cadr 46_t_matrix) 1e-6)
						(equal '(0.0 0.0 1.0 0.0) (cadr 46_t_matrix) 1e-6)
						(equal '(0.0 -1.0 0.0 0.0) (cadr 46_t_matrix) 1e-6)
					)
					(or
						(equal '(1.0 0.0 0.0 0.0) (caddr 46_t_matrix) 1e-6)
						(equal '(-1.0 0.0 0.0 0.0) (caddr 46_t_matrix) 1e-6)
						(equal '(0.0 1.0 0.0 0.0) (caddr 46_t_matrix) 1e-6)
						(equal '(0.0 -1.0 0.0 0.0) (caddr 46_t_matrix) 1e-6)
						(equal '(0.0 0.0 1.0 0.0) (caddr 46_t_matrix) 1e-6)
					)
				)
;					"XY"
					(setq XY_points_list (cons
												(list
													(list (car (cadddr 46_t_matrix)) (cadr (cadddr 46_t_matrix)) (caddr (cadddr 46_t_matrix)))
													(list (1+ (car (cadddr 46_t_matrix))) (cadr (cadddr 46_t_matrix)) (caddr (cadddr 46_t_matrix)))
													(list (car (cadddr 46_t_matrix)) (1+ (cadr (cadddr 46_t_matrix))) (caddr (cadddr 46_t_matrix)))
												)
												XY_points_list
										 )
					)
			)
			(
				(and
					(equal '(0.0 1.0 0.0 0.0) (car 46_t_matrix) 1e-6)
					(equal '(-1.0 0.0 0.0 0.0) (cadr 46_t_matrix) 1e-6)
					(equal '(0.0 0.0 1.0 0.0) (caddr 46_t_matrix) 1e-6)
				)
;					"YZ"
					(setq YZ_points_list (cons
												(list
													(list (car (cadddr 46_t_matrix)) (cadr (cadddr 46_t_matrix)) (caddr (cadddr 46_t_matrix)))
													(list (car (cadddr 46_t_matrix)) (1+ (cadr (cadddr 46_t_matrix))) (caddr (cadddr 46_t_matrix)))
													(list (car (cadddr 46_t_matrix)) (cadr (cadddr 46_t_matrix)) (1+ (caddr (cadddr 46_t_matrix))))
												)
				                                YZ_points_list
										 )
					)
			)
			(
				(and
					(equal '(1.0 0.0 0.0 0.0) (car 46_t_matrix) 1e-6)
					(equal '(0.0 1.0 0.0 0.0) (cadr 46_t_matrix) 1e-6)
					(equal '(0.0 0.0 1.0 0.0) (caddr 46_t_matrix) 1e-6)
				)
;					"XZ"
					(setq XZ_points_list (cons
												(list
													(list (car (cadddr 46_t_matrix)) (cadr (cadddr 46_t_matrix)) (caddr (cadddr 46_t_matrix)))
													(list (1+ (car (cadddr 46_t_matrix))) (cadr (cadddr 46_t_matrix)) (caddr (cadddr 46_t_matrix)))
													(list (car (cadddr 46_t_matrix)) (cadr (cadddr 46_t_matrix)) (1+ (caddr (cadddr 46_t_matrix))))
												)
												XZ_points_list
										 )
					)
			)
			(
				t
					nil
			)
		)
	)

	(setq modelSpace_object (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
	(foreach plane_point XY_points_list
		(foreach solid solid_list
			(vla-GetBoundingBox (vlax-ename->vla-object solid) 'min_XYZ 'max_XYZ)
			(cond
				(
					(and
						(> (caddr (car plane_point)) (caddr (vlax-safearray->list min_XYZ)))
						(< (caddr (car plane_point)) (caddr (vlax-safearray->list max_XYZ)))
					)
			    		(setq sliced_solid_object (vla-SliceSolid (vlax-ename->vla-object solid) (vlax-3d-point (car plane_point)) (vlax-3d-point (cadr plane_point)) (vlax-3d-point (caddr plane_point)) :vlax-true))
						(setq solid_list (append solid_list (list (vlax-vla-object->ename sliced_solid_object))))
				)
				(
					t
				)
			)
		)
	)
	(foreach plane_point YZ_points_list
		(foreach solid solid_list
			(vla-GetBoundingBox (vlax-ename->vla-object solid) 'min_XYZ 'max_XYZ)
			(cond
				(
					(and
						(> (car (car plane_point)) (car (vlax-safearray->list min_XYZ)))
						(< (car (car plane_point)) (car (vlax-safearray->list max_XYZ)))
					)
			    		(setq sliced_solid_object (vla-SliceSolid (vlax-ename->vla-object solid) (vlax-3d-point (car plane_point)) (vlax-3d-point (cadr plane_point)) (vlax-3d-point (caddr plane_point)) :vlax-true))
						(setq solid_list (append solid_list (list (vlax-vla-object->ename sliced_solid_object))))
				)
				(
					t
				)
			)
		)
	)
	(foreach plane_point XZ_points_list
		(foreach solid solid_list
			(vla-GetBoundingBox (vlax-ename->vla-object solid) 'min_XYZ 'max_XYZ)
			(cond
				(
					(and
						(> (cadr (car plane_point)) (cadr (vlax-safearray->list min_XYZ)))
						(< (cadr (car plane_point)) (cadr (vlax-safearray->list max_XYZ)))
					)
			    		(setq sliced_solid_object (vla-SliceSolid (vlax-ename->vla-object solid) (vlax-3d-point (car plane_point)) (vlax-3d-point (cadr plane_point)) (vlax-3d-point (caddr plane_point)) :vlax-true))
						(setq solid_list (append solid_list (list (vlax-vla-object->ename sliced_solid_object))))
				)
				(
					t
				)
			)
		)
	)

	(setq end_time (getvar 'millisecs))
	(princ (strcat "\nВыбрано 3D Solid-ов: " (itoa solid_init_number) ", плоскостей XY: " (itoa (length XY_points_list)) ", плоскостей YZ: " (itoa (length YZ_points_list)) ", плоскостей XZ: " (itoa (length XZ_points_list))))
	(princ (strcat "\nИз " (itoa solid_init_number) " 3D Solid-а(ов) образовано: " (itoa (length solid_list)) " 3D Solid-а(ов) за " (rtos (/ (- end_time start_time) 1000.0)) " секунд"))
	(vlax-release-object modelSpace_object)
	(vlax-release-object sliced_solid_object)
	(if (= "Да" delete_planes)
		(foreach plane plane_list
			(vla-erase (vlax-ename->vla-object plane))
		)
	)
	(princ)
)

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

Последний раз редактировалось koMon, 18.04.2019 в 10:24.
koMon вне форума  
 
Непрочитано 18.04.2019, 10:56
#14
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от koMon Посмотреть сообщение
автокад без автолиспа?
LT
Boxa вне форума  
 
Непрочитано 18.04.2019, 11:05
#15
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679



это была риторика) от риторический
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Можно ли в автокад выполнить команду "сечение" и разрезать 3Д тело сразу по нескольким сечениям?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Как разрезать тело плоскостью? semak AutoCAD 2 12.03.2014 09:31
Можно ли нескольким листам задать стиль печати Maiia AutoCAD 1 19.10.2012 16:00
Можно ли в Автокаде на клавишу пробел повесить команду? plugin AutoCAD 15 09.07.2007 21:32
Автокад Mechanical, какую команду лучше всего использовать д Jerald Вертикальные решения на базе AutoCAD 1 02.05.2007 10:01