Определение положения центра тяжести фигуры в АвтоКАДе
Реклама i
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Определение положения центра тяжести фигуры в АвтоКАДе

Определение положения центра тяжести фигуры в АвтоКАДе

Ответ
Поиск в этой теме
Непрочитано 16.10.2009, 11:25 #1
Определение положения центра тяжести фигуры в АвтоКАДе
alexNAP
 
инженер-конструктор
 
Калуга
Регистрация: 11.01.2007
Сообщений: 565

Добрый день коллеги!
Нет ли у кого программки или модуля, я не знаю как это точно сказать, ну типа Вет Када, который определял бы положение центра тяжести фигуры. Я сейчас пользуюсь Скадом, очень не удобно, беру фигуру сохраняю отдельным файлом в DXF, и импортирую в Консул.
Заранее благодарен за ответы.
Просмотров: 44999
 
Непрочитано 16.10.2009, 11:34
1 | #2
tutanhamon


 
Блог
 
Регистрация: 06.09.2007
Архангельск/СПб
Сообщений: 461


В свое время написал следующий лисп (см. ниже), который ставит Точку в центр тяжести области, полилинии (замкнутой),круга, эллипса или 3dsolid-а
Понимаю, что скорее всего "буду бит" местными программистами за качество кода, однако для меня работает надежно
Код:
[Выделить все]
(defun c:centroid (/)
  (vl-load-com)
  (setq acadObject (vlax-get-acad-object))
  (setq acadDocument (vla-get-ActiveDocument acadObject))
  (setq numSpace (vla-get-ActiveSpace acadDocument))
  (cond	((= numSpace 1)
	 (setq ActSpace (vla-get-ModelSpace acadDocument))
	)
	((= numSpace 0)
	 (setq ActSpace (vla-get-PaperSpace acadDocument))
	)
  )
  (setq	sset (ssget '((-4 . "<OR")
		      (0 . "CIRCLE")
		      (0 . "ELLIPSE")
		      (-4 . "<AND")
		      (0 . "LWPOLYLINE")
		      (70 . 1)
		      (-4 . "AND>")
		      (0 . "REGION")
		      (0 . "3DSOLID")
		      (-4 . "OR>")
		     )
	     )
  )
  (setq	count (sslength sset)
	i     0
  )
  (while (<= i (1- count))
    (setq objType (cdr (assoc 0 (entget (ssname sset i)))))
    (setq Obj (vlax-ename->vla-object (ssname sset i)))

    (if	(= objType "LWPOLYLINE")
      (progn
	(setq vla_region
			  (car (vlax-safearray->list
				 (vlax-variant-value
				   (vla-addregion
				     (vla-objectidtoobject
				       (vla-get-document
					 Obj
				       )
				       (vla-get-ownerid
					 Obj
				       )
				     )
				     (vlax-safearray-fill
				       (vlax-make-safearray
					 vlax-vbobject
					 (cons 0 (1- (length (list Obj))))
				       )
				       (list Obj)
				     )
				   )
				 )
			       )
			  )
	      centerPtLst
			  (vlax-safearray->list
			    (vlax-variant-value (vla-get-centroid vla_region))
			  )
	      centerPtLst (append centerPtLst (list 0))
	      centerPtLst (trans centerPtLst 1 0)
	      pointCoord  (ptnList->variantArray centerPtLst)
	      PointObj	  (vla-addPoint ActSpace pointCoord)
	)
	(vla-delete vla_region)
      )
    )

    (if	(= objType "REGION")
      (progn
	(setq centerPtLst
			  (vlax-safearray->list
			    (vlax-variant-value (vla-get-centroid Obj))
			  )
	      centerPtLst (append centerPtLst (list 0))
	      centerPtLst (trans centerPtLst 1 0)
	      pointCoord  (ptnList->variantArray centerPtLst)
	      PointObj	  (vla-addPoint ActSpace pointCoord)
	)
      )
    )

    (if	(or (= objType "CIRCLE") (= objType "ELLIPSE"))
      (progn
	(setq
	  pointCoord
		      
			(vlax-variant-value (vla-get-center Obj))
	  PointObj    (vla-addPoint ActSpace pointCoord)
	)
      )
    )

    (if	(= objType "3DSOLID")
      (progn
	(setq pointCoord
	       
			 (vlax-variant-value
			   (vla-get-centroid Obj)
			 )
	      ;;;centerPtLst (trans centerPtLst 1 0)
	      ;;;pointCoord  (ptnList->variantArray centerPtLst)
	      PointObj	 (vla-addPoint ActSpace pointCoord)
	)
      )
    )
    (setq i (1+ i))
  )
  (princ)
)
запускается по команде Centroid после подгрузки lisp-а

Последний раз редактировалось tutanhamon, 16.10.2009 в 11:36. Причина: Добавил пояснения
tutanhamon вне форума  
 
Автор темы   Непрочитано 16.10.2009, 11:41
#3
alexNAP

инженер-конструктор
 
Регистрация: 11.01.2007
Калуга
Сообщений: 565


Спасибо это именно то что надо, но можно подробнее описать как это подгрузить?
alexNAP вне форума  
 
Непрочитано 16.10.2009, 11:47
#4
tutanhamon


 
Блог
 
Регистрация: 06.09.2007
Архангельск/СПб
Сообщений: 461


alexNAP,
по ссылке http://dwg.ru/art/8 описано как подгрузить лисп
tutanhamon вне форума  
 
Автор темы   Непрочитано 16.10.2009, 11:53
#5
alexNAP

инженер-конструктор
 
Регистрация: 11.01.2007
Калуга
Сообщений: 565


Огрмное спасибо!
Но ставит ц.т. только в круг, хорошо бы серьёзно доработать, чтобы вычисляла центр штриховки.

Последний раз редактировалось alexNAP, 16.10.2009 в 12:53.
alexNAP вне форума  
 
Непрочитано 16.10.2009, 13:54
#6
tutanhamon


 
Блог
 
Регистрация: 06.09.2007
Архангельск/СПб
Сообщений: 461


alexNAP,
как вариант:
Выбрать штриховку, в контекстном меню по правой кнопке мыши выбрать Hatch Edit ("Редактирование..."). Откроется окно редактирования штриховки. Нажать Recreate Boundary ("Восстановить контур..."), выбрать Region (Область) или Polyline (Полилинию) в командной строке. На запрос Associate hatch with new boundary? ("Связать штриховку с новым контуром?") ответить Да или Нет - без особой разницы. И после запустить Centroid и выбрать полученную полилинию (ну или область).
tutanhamon вне форума  
 
Непрочитано 16.10.2009, 21:09
#7
RFL


 
Регистрация: 05.10.2006
ЧЕЛНЫ
Сообщений: 122


А стандартно - превращение фигуры в область и менюшки Сведения Геометрия и масса - чем не устраивает?
RFL вне форума  
 
Непрочитано 16.10.2009, 21:46
#8
SLADE

проектировщик-новобранец
 
Регистрация: 14.09.2005
Minsk
Сообщений: 324


Можно ли модернизировать лисп для расчета стале бетона?
с разными модулями упругостями?
SLADE вне форума  
 
Непрочитано 16.10.2009, 23:13
#9
Александр Бауск

FEA/CAD/МКЭ/САПР
 
Регистрация: 20.03.2007
48,38°:35,03°
Сообщений: 1,056
Отправить сообщение для Александр Бауск с помощью Skype™


Вы чего, народ? Какие лиспы? _MASSPROP и всё.
__________________
Reshaping the STEM field
Александр Бауск вне форума  
 
Непрочитано 20.01.2011, 05:25
#10
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,537
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Цитата:
Сообщение от Александр Бауск Посмотреть сообщение
Вы чего, народ? Какие лиспы? _MASSPROP и всё.
а так как большинству нужно узнать характеристики полилинии, то
_REGION, а потом _MASSPROP
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 20.01.2011, 07:23
#11
eng


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


эспри
eng вне форума  
 
Непрочитано 20.01.2011, 08:33
#12
Лиспер


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


Цитата:
Сообщение от eng Посмотреть сообщение
эспри
Чего???
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 20.01.2011, 08:37
#13
Дрюха

Инженер-конструктор
 
Регистрация: 20.07.2007
Москва
Сообщений: 2,936


Скорее всего он имел ввиду прогу от Лира-софт Э.СПР.И (электронный справочник инженера), позволяющую вычислять характеристики сечения.
Дрюха вне форума  
 
Непрочитано 20.01.2011, 08:37
#14
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Чего???
ЭСПРИ- Электронный СПРавочник Инженера от Лира-софт
Хмурый вне форума  
 
Непрочитано 16.08.2012, 15:23
2 | #15
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 236


Цитата:
Сообщение от tutanhamon Посмотреть сообщение
запускается по команде Centroid после подгрузки lisp-а
В 2013 Автокаде выдаёт ошибку:
Код:
[Выделить все]
; ошибка: no function definition: PTNLIST->VARIANTARRAY
Можно ли подправить лисп под актуальную версию Автокада?

Проверил в 2006 Автокаде, аналогично:
Код:
[Выделить все]
; ошибка: no function definition: PTNLIST->VARIANTARRAY
Нашёл рабочий вариант на турецком форуме (ссылка).
Код:
[Выделить все]
 (defun c:qw (/)
  (vl-load-com)
  (setq acadObject (vlax-get-acad-object))
  (setq acadDocument (vla-get-ActiveDocument acadObject))
  (setq numSpace (vla-get-ActiveSpace acadDocument))
  (cond	((= numSpace 1)
	 (setq ActSpace (vla-get-ModelSpace acadDocument))
	)
	((= numSpace 0)
	 (setq ActSpace (vla-get-PaperSpace acadDocument))
	)
  )
  (setq	sset (ssget '((-4 . "<OR")
		      (0 . "CIRCLE")
		      (0 . "ELLIPSE")
		      (-4 . "<AND")
		      (0 . "LWPOLYLINE")
		      (70 . 1)
		      (-4 . "AND>")
		      (0 . "REGION")
		      (-4 . "OR>")
		     )
	     )
  )
  (setq	count	  (sslength sset)
	i	  0
	n	  0
	m	  0
	k	  0
	summX	  0
	summY	  0
	summareas 0
	listX	  (list)
	listY	  (list)
	listAreas (list)
  )
  (while (<= i (1- count))
    (setq objType (cdr (assoc 0 (entget (ssname sset i)))))
    (setq Obj (vlax-ename->vla-object (ssname sset i)))
    (if	(= objType "LWPOLYLINE")
      (progn
	(setq vla_region
			  (car (vlax-safearray->list
				 (vlax-variant-value
				   (vla-addregion
				     (vla-objectidtoobject
				       (vla-get-document
					 Obj
				       )
				       (vla-get-ownerid
					 Obj
				       )
				     )
				     (vlax-safearray-fill
				       (vlax-make-safearray
					 vlax-vbobject
					 (cons 0 (1- (length (list Obj))))
				       )
				       (list Obj)
				     )
				   )
				 )
			       )
			  )
	      centerPtLst
			  (vlax-safearray->list
			    (vlax-variant-value (vla-get-centroid vla_region))
			  )
	      CurrArea
			  (vla-get-Area vla_region)
	)
	(setq ListX	(append ListX (list (car centerPtLst)))
	      ListY	(append ListY (list (cadr centerPtLst)))
	      ListAreas	(append ListAreas (list CurrArea))
	)
	(vla-delete vla_region)
      )
    )

    (if	(= objType "REGION")
      (progn
	(setq centerPtLst
			  (vlax-safearray->list
			    (vlax-variant-value (vla-get-centroid Obj))

			  )
	      CurrArea
			  (vla-get-Area obj)
	)
	(setq ListX	(append ListX (list (car centerPtLst)))
	      ListY	(append ListY (list (cadr centerPtLst)))
	      ListAreas	(append ListAreas (list CurrArea))
	)
      )
    )
    (if	(or (= objType "CIRCLE") (= objType "ELLIPSE"))
      (progn
	(setq centerPtLst
			  (vlax-safearray->list
			    (vlax-variant-value (vla-get-center Obj))
			  )
	      CurrArea
			  (vla-get-Area obj)
	)
	(setq ListX	(append ListX (list (car centerPtLst)))
	      ListY	(append ListY (list (cadr centerPtLst)))
	      ListAreas	(append ListAreas (list CurrArea))
	)
      )
    )
    (setq i (1+ i))
  )
  (setq	summXlist (mapcar '* ListX ListAreas)
	summYlist (mapcar '* ListY ListAreas)
  )
  (foreach n summXList (setq summX (+ summX n)))
  (foreach m summYList (setq summY (+ summY m)))
  (foreach k ListAreas (setq summAreas (+ summAreas k)))
  (setq	centerPtList (list (/ summX summAreas) (/ summY summAreas) 0)
	pointCoord   (ptnList->variantArray centerPtList)
	PointObj     (vla-addPoint ActSpace pointCoord)
  )
  (princ)
)

(defun ptnList->variantArray (ptsList / arrayActSpace sArray)
  (setq	arrayActSpace
	 (vlax-make-safearray
	   vlax-vbdouble
	   (cons 0
		 (- (length ptsList) 1)
	   )
	 )
  )
  (setq sArray (vlax-safearray-fill arrayActSpace ptsList))
  (vlax-make-variant sArray)
)
P.S. Один минус в коде (для меня). При выделении множества полилиний центр тяжести находится один, для всего множества. Можно ли внести в код небольшое изменение, которое позволило бы найти центр тяжести для каждой полилинии отдельно?

Последний раз редактировалось wepp, 17.08.2012 в 08:04. Причина: проблема решена
wepp вне форума  
 
Непрочитано 17.09.2012, 14:00
#16
art_09


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


centroid Почему не определяет ц.т. в замкнутых полилиниях неопределенной формы к то может ответить?
art_09 вне форума  
 
Непрочитано 17.09.2012, 14:12
#17
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


art_09, у областей определяет.
полилинию- в область.
Хмурый вне форума  
 
Непрочитано 17.09.2012, 16:55
#18
art_09


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


а можно тут подробней если не тяжело как сделать из замкнутых полилиний область или я не тка понял чего то?
art_09 вне форума  
 
Непрочитано 17.09.2012, 18:12
#19
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


_region команда
Хмурый вне форума  
 
Непрочитано 17.09.2012, 18:27
#20
art_09


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


Спасибо Хмурый теперь понял все
art_09 вне форума  
 
Непрочитано 20.09.2012, 17:51
#21
mutukpuv


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


объём определяет цт, если фигура плоская, задайте толщину, нажмите на объём и не берите во внимание "Z" или я чего-то не догнал...
mutukpuv вне форума  
 
Непрочитано 26.12.2012, 08:55
#22
Татьяна С


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


Чтобы заработал липс, который указал wepp нужно ввести какую-то команду?
Татьяна С вне форума  
 
Непрочитано 26.12.2012, 09:21
#23
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 236


Цитата:
Сообщение от Татьяна С Посмотреть сообщение
нужно ввести какую-то команду
_qw
wepp вне форума  
 
Непрочитано 23.01.2014, 12:28
#24
Агент СмиТ

Gti
 
Регистрация: 14.01.2010
МО Железнодорожный
Сообщений: 121


У меня в 2011 автокаде почему то программа Сentroid при выборе одного объекта создаёт поверх него область, при множественном выборе, все кроме одного игнорируются, на оставшийся накладывается копия в виде области, как и в случае с одним объектом, при этом центроиды ни там ни там не появляются (см. вложение).
Лисп qw работает, но как говорилось выше, при выборе нескольких объектов центр масс расчитывается общий... Однако, подгрузив оба лиспа и вызвав команду Сentroid, зараз получил отдельные центроиды для каждого из объектов!!!

Может кто то сможет скомпоновать обе программы воедино, что бы при множественном выборе создавались отдельные ЦМ для каждого объекта?
Вложения
Тип файла: dwg
DWG 2007
Центр масс.dwg (79.4 Кб, 1276 просмотров)
__________________
Каждая система стремится к равновесию.
Агент СмиТ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Определение положения центра тяжести фигуры в АвтоКАДе



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Центр тяжести фигуры scarface AutoCAD 5 20.12.2019 11:03
Площадь фигуры и центр её тяжести rust-resisting AutoCAD 32 17.11.2010 08:53
Нагрузка на сваи в кусте со смещением центра тяжести относительно нагрузки baryshnikoff Основания и фундаменты 3 19.08.2008 13:12
Центр тяжести плоской фигуры , геом. центр контура ? bdfy AutoCAD 1 10.05.2005 17:21
определение центра масс здания в SCAD vv SCAD 2 27.01.2004 11:59