29.04.2012 19:15    

tastan
autocad de kapalı bir polylinenın ağırlık merkezini buldurabilirmiyiz?

29.04.2012 22:08    

ProhibiT
PoLyLine objenizi Region'a çevirin MassProp komutunu kullanarak centroid koordinatını bulabilirsiniz.

14.05.2012 13:06    

tastan
Teşekkür ederim..

17.05.2012 07:53    

emasi
Herkese selam
Bende şöyle bir lisp mövcut objenin ağırlık merkezini buluyor ve merkeze nokta koyuyor. P.S.-- lisp benim deyil ve nereden götürdüyümü hatırlamıyorum :blush
Kod:

(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)
)


Eyer çalışmasa şuradan indire bilirsiniz http://www.boxca.com/cj61ekdlhpjc/centre.lsp.html

17.05.2012 08:43    

allengir
3d katı resimlerin ağırlık merkezini bulan ve bulduğu yere sphere koyan lisp olsa süper olurdu

17.05.2012 10:57    

ProhibiT
Çok basit bir şey olduğundan kimse yazmamıştır. Yazıvereyim dedim. :)
Ağırlık merkezinde (Geometrik Merkezde) Sphere değil nokta oluşturur.
Sphere diye başlarsak başka parametreler de işin içine girer, uğraşmaya gerek yok bence.
Kod:

;|***************************************************************************|;
;| Cntrd: Seçilen 3DSoLid objenin geometrik merkezinde Point oluşturur       |;
;|        Hazırlayan: M. Şahin Güvercin  www.autocadokulu.com  17.05.2012    |;
;|---------------------------------------------------------------------------|;
(defun c:Cntrd (/ Obj)
  (setvar "cmdecho" 0) (command "_.undo" "group") (vl-load-com)
  (while (not (setq ObJ (ssget ":s" (list (cons 0 "3DSoLid"))))))
  (entmake (list (cons 0 "Point") (cons 10 (vlax-safearray->list
    (vlax-variant-value (vlax-get-property (vlax-ename->vla-object
    (ssname Obj 0)) 'Centroid)))))) (command "_.undo" "e") (prin1))

17.05.2012 13:38    

map
Şahin hocam Cntrd lispini kapalı alanda denedim ama çalışmadı.

17.05.2012 14:21    

ProhibiT
allengir arkadaşımız, "3d katı resimlerin ağırlık merkezi" demiş, bende buna göre yazdım. Bu fonksiyon yalnızca 3DSoLid objelerin ağırlık merkezini bulur. PoLyLine objelerin Agırlık Merkezini (düzlem şekiller olduklarından aslında Geometrik Merkezini) bulan bir fonksiyonu yakın zamanda yazıp paylaştık diye hatırlıyorum...



Linkleri görebilmek için ÜYE olmalısınız.

ProhibiT (24.05.2012 06:07 GMT)

17.05.2012 14:22    

Travaci
Kapalı alandan kastınız polyline ise çalışmaz 3d solid içindir.

18.05.2012 04:55    

allengir
hocam sağol.hakkın ödenmez...

19.07.2018 06:37    

ersinc
Mehabalar, 2d solid için ağırlık merkezini bulan lisp var mı?

> 1 <
Copyright © 2004-2022 SQL: 1.057 saniye - Sorgu: 80 - Ortalama: 0.01321 saniye