_

[LISP] Kopiowanie obiektów 3D

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

[LISP] Kopiowanie obiektów 3D

Postprzez Bieniasq » sie 21, 2020 17:31

Witam,

Próbuję skopiować obiekt 3D w dwa dowolne miejsca za pomocą krótkiego LISPa (zamieszczony poniżej). Niestety zacina się w pewnym monecie, nie wiem dlaczego. Zaznaczę że jeżeli próbuję kopiować w jedno miejsce to działa, oczywiście po małej poprawie LISPa (zamieszczony jeszcze niżej). Czy ktoś ma jakieś pomysły dlaczego nie mogę skopiować w dwa różne miejsca?

Nie działający dla dwóch miejsc:
Kod: Zaznacz cały
(vl-load-com)
(defun c:www ( / circleObj1 objCollection retObjects SourceObject)
    (setq *ZCApp* (vlax-get-acad-object))
    (setq *ActiveDocument* (vla-get-ActiveDocument *ZCApp*))
    (setq modelSpace (vla-get-ModelSpace *ActiveDocument*))

   (setq circleObj (ssget))
   (setq ile_danych 0)
         (repeat (sslength circleObj)
            (setq objColl (ssname circleObj ile_danych))
            (setq circleObj1 (vlax-ename->vla-object objColl))
            (setq circleObj2 (vlax-ename->vla-object objColl))
   
    (setq objCollection (vlax-make-safearray vlax-vbObject '(0 . 1)))

    (vlax-safearray-put-element objCollection 0 circleObj1)
   (vlax-safearray-put-element objCollection 1 circleObj2)

    (setq retObjects (vlax-variant-value (vla-CopyObjects *ActiveDocument* objCollection nil 'IDPairs)))
   
   (setq circleObj1Copy (vlax-safearray-get-element retObjects 0))
   (setq circleObj2Copy (vlax-safearray-get-element retObjects 1))
   
    (vla-Regen *ActiveDocument* acAllViewports)
   
    (setq SourceObject (vla-ObjectIdToObject *ActiveDocument* (vla-get-Key (vlax-safearray-get-element IDPairs 0))))
    (vla-Move SourceObject (vlax-3d-point 0 0 0) (vlax-3d-point 0 0 30))
    (setq SourceObject (vla-ObjectIdToObject *ActiveDocument* (vla-get-Key (vlax-safearray-get-element IDPairs 1))))
    (vla-Move SourceObject (vlax-3d-point 0 0 0) (vlax-3d-point 0 0 90))

        (vla-Regen *ActiveDocument* acAllViewports)
          
   (setq ile_danych (+ 1 ile_danych)));koniec reapt

)


Działający dla jednego miejsca:
Kod: Zaznacz cały
(vl-load-com)
(defun c:www ( / circleObj1 objCollection retObjects SourceObject)
    (setq *ZCApp* (vlax-get-acad-object))
    (setq *ActiveDocument* (vla-get-ActiveDocument *ZCApp*))
    (setq modelSpace (vla-get-ModelSpace *ActiveDocument*))

   (setq circleObj (ssget))
   (setq ile_danych 0)
         (repeat (sslength circleObj)
            (setq objColl (ssname circleObj ile_danych))
            (setq circleObj1 (vlax-ename->vla-object objColl))
   
    (setq objCollection (vlax-make-safearray vlax-vbObject '(0 . 0)))

    (vlax-safearray-put-element objCollection 0 circleObj1)

    (setq retObjects (vlax-variant-value (vla-CopyObjects *ActiveDocument* objCollection nil 'IDPairs)))
   
   (setq circleObj1Copy (vlax-safearray-get-element retObjects 0))
   
    (vla-Regen *ActiveDocument* acAllViewports)
   
    (setq SourceObject (vla-ObjectIdToObject *ActiveDocument* (vla-get-Key (vlax-safearray-get-element IDPairs 0))))
    (vla-Move SourceObject (vlax-3d-point 0 0 0) (vlax-3d-point 0 0 30))

        (vla-Regen *ActiveDocument* acAllViewports)
          
   (setq ile_danych (+ 1 ile_danych)));koniec reapt

)


Dziękuję za pomoc.
Bieniasq
 
Posty: 7
Dołączył(a): sty 26, 2016 00:18

Re: [LISP] Kopiowanie obiektów 3D

Postprzez andkal » sie 21, 2020 21:58

Jak program ma tylko skopiować obiekty w 2 rozne miejsca dalej o 30 i 90 jednostek to można przecież sporo prościej np tak:
Kod: Zaznacz cały
(defun c:www3 ( / ss1 )
    (setq ss1 (ssget))
    (command "_copy" ss1 "" "0,0,0" "0,0,30" "")
    (command "_copy" ss1 "" "0,0,0" "0,0,90" "")
);defun


A tak będzie działać szybciej:
Kod: Zaznacz cały
(defun c:www2 ( / ss1  licznik1  obj)
    (setq ss1 (ssget))
    (setq licznik1 0 )
    (repeat (sslength ss1)

        (setq obj (vlax-ename->vla-object (ssname ss1 licznik1)))
        (setq obj(vla-copy obj))
        (vla-move obj (vlax-3D-point (list 0 0 0 ) ) (vlax-3D-point (list 0 0 30 ) ))

        (setq obj (vlax-ename->vla-object (ssname ss1 licznik1)))
        (setq obj(vla-copy obj))
        (vla-move obj (vlax-3D-point (list 0 0 0 ) ) (vlax-3D-point (list 0 0 90 ) ))

        (setq licznik1(+ licznik1 1))
    );repeat
);defun
http://www.autolisps.blogspot.com - handy plugins for autocad
andkal
 
Posty: 68
Dołączył(a): paź 01, 2017 22:10

Re: [LISP] Kopiowanie obiektów 3D

Postprzez Bieniasq » sie 22, 2020 15:49

Oczywiście że nie chodzi tylko o kopiowanie :) Jest to część większego programu. Twój program "c:www2" pasuje idealnie, dokładnie o to chodziło. Dzięki wielkie za pomoc.
Bieniasq
 
Posty: 7
Dołączył(a): sty 26, 2016 00:18


Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników