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

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

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

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

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


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


В свое время написал следующий лисп (см. ниже), который ставит Точку в центр тяжести области, полилинии (замкнутой),круга, эллипса или 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
Архангельск/СПб
Сообщений: 460


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
Архангельск/СПб
Сообщений: 460


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,535
<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
Сообщений: 980


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

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


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


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


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

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


Цитата:
Сообщение от 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,327


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,327


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


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


Спасибо Хмурый теперь понял все
art_09 вне форума  
Ответ
Вернуться   Форум 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