Тема: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

;|====================================================
Растяжение/сжатие 3D тел в указанной плоскости на заданную величину
Программа Дениса Флюстикова "Stretch_Den"
Попытка сделать по просьбе Владимира Мадюшкина аналог программы
"QD3D STRETCH", триал версия предсталена на
http://www.cadopolis.com/autocad_addons/quick-draw-3d-stretch.shtml
Программа тестировалась на AutoCAD 2008/09
Макрос для кнопки: ^C^C^P(load "Stretch3D_Den");Stretch3D_Den
Замечания и предложения по адресу fd-@mail.ru
====================================================|;
(defun C:Stretch3D_Den (/ *error* cecolor osmode aa1
            aa2 aa3 aa4 aa5 aa6 aa7 aa8 aa9)
(setq cecolor (getvar "CECOLOR")
      osmode (getvar "OSMODE")
      aa1 (getvar "VIEWDIR"))
(if (and (equal (car aa1) 0 0.00001)
     (equal (cadr aa1) 0 0.00001)
     (> (caddr aa1) 0))(progn
(if (setq aa1 (ssget "_i" '((0 . "3DSOLID"))))
(princ (strcat "\nВыбрано объектов: " (itoa (sslength aa1))))(progn
(princ "\nВыбор 3D тел для преоразования")
(setq aa1 (ssget '((0 . "3DSOLID"))))
))
(if aa1
(if (setq aa2 (getpoint "\nПервая точка плоскости растяжения/сжатия:"))
(if (setq aa3 (getpoint aa2 "\nВторая точка плоскости (плоскость перпендикулярна XY):"))(progn
(grdraw aa2 aa3 7)
(vl-load-com)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(setvar "CMDECHO" 0)
(defun *error* (msg)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
(if (and (>= (atof (getvar "ACADVER")) 16.2)(< (atof (getvar "ACADVER")) 17.1))
(vla-sendcommand (vla-get-activedocument
(vlax-get-acad-object)) "_.undo 1 ")
(command nil nil nil nil "_.undo" 1))
(princ "\nВыход во время обработки данных\n")
)
(command "_.undo" "_m"
     "_ucs" "_z" aa2 aa3)
(setvar "ORTHOMODE" 1)
(initget 1)
(if (vl-catch-all-error-p
(setq aa4 (vl-catch-all-apply 'getpoint
(list "\nПервая точка вектора, определяющая сторону растяжения/сжатия:"))))
(setq aa4 nil)(progn
(initget 1)
(if (vl-catch-all-error-p
(setq aa5 (vl-catch-all-apply 'getpoint
(list aa4 "\nВторая точка вектора, определяющая растяжение или сжатие и их величину:"))))
(setq aa4 nil)
(setq aa7 (trans (mapcar '+ aa4 '(0 0)) 1 0)
      aa5 (trans (mapcar '+ aa5 '(0 0)) 1 0)
      aa4 (distance aa7 aa5))
)))
(redraw)
(command "_.undo" "_b")
(if aa4 (progn
(setq aa7 (trans aa7 0 1)
      aa5 (trans aa5 0 1))    
(if (> (sin (angle aa2 aa3)) 0)
(setq aa6 aa2 aa2 aa3 aa3 aa6))
(if (> (sin (- (angle aa2 aa3)(angle aa2 aa7))) 0)
(setq aa6 aa2 aa2 aa3 aa3 aa6))
(if (> (distance aa2 aa7)(distance aa2 aa5))
(setq aa4 (- aa4)))
(setq aa9 (polar '(0 0 0) (+ (angle aa2 aa3)(/ pi 2)) aa4))
(setvar "OSMODE" 0)
(repeat (setq aa5 (sslength aa1))
(setq aa5 (1- aa5)
      aa6 (ssname aa1 aa5)
      aa7 (entlast)
      aa8 (entget aa6))
(while (entnext aa7)
(setq aa7 (entnext aa7)))
(if (> aa4 0)(progn
(command "_.section" aa6 "" "3" aa2 aa3 "@0,0,1")
(if (setq aa7 (entnext aa7))(progn
(if (/= (cdr (assoc 70 (tblsearch "Layer" (cdr (assoc 8 aa8))))) 4)(progn
(if (and (>= (atof (getvar "ACADVER")) 16)(assoc 420 aa8))
(setq aa8 (cdr (assoc 420 aa8))
      aa8 (strcat "RGB:" (rtos (logand (lsh aa8 -16) 255)) ","
          (rtos (logand (lsh aa8 -8) 255)) ","
          (rtos (logand aa8 255))))
(if (setq aa8 (assoc 62 aa8))
(setq aa8 (rtos (cdr aa8)))
(setq aa8 "256")))
(setvar "CECOLOR" aa8)))
(command "_.extrude" aa7 "" "_d" '(0 0 0) aa9)
(setq aa8 (ssadd))
(while (entnext aa7)
(setq aa7 (entnext aa7)
      aa8 (ssadd aa7 aa8)))
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b"
     "_.move" (entlast) "" '(0 0 0) aa9
     "_.union" aa6 aa8 (entlast) "")
)
(command "_.move" aa6 "" '(0 0 0) aa9)
)
)(progn
(if (/= (cdr (assoc 70 (tblsearch "Layer" (cdr (assoc 8 aa8))))) 4)(progn
(if (and (>= (atof (getvar "ACADVER")) 16)(assoc 420 aa8))
(setq aa8 (cdr (assoc 420 aa8))
      aa8 (strcat "RGB:" (rtos (logand (lsh aa8 -16) 255)) ","
          (rtos (logand (lsh aa8 -8) 255)) ","
          (rtos (logand aa8 255))))
(if (setq aa8 (assoc 62 aa8))
(setq aa8 (rtos (cdr aa8)))
(setq aa8 "256")))
(setvar "CECOLOR" aa8)))
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (setq aa7 (entnext aa7))(progn
(command "_.move" aa7 "" '(0 0 0) aa9
     "_.slice" aa7 "" "3" aa2 aa3 "@0,0,1" "_b"
     "_.erase" aa7 "")
(if (setq aa7 (entnext aa7))
(command "_.union" aa6 aa7 ""))
)
(command "_.move" aa6 "" '(0 0 0) aa9)
)
))
)
))
(setvar "CECOLOR" cecolor)
(setvar "OSMODE" osmode)
(setvar "CMDECHO" 1)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
))))
)
(princ "\nУстановите один из стандартных ортогональных видов")
)
(princ)
)

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Макрос для кнопки (поправляю):
^C^C^P(load "Stretch3D_Den");Stretch3D_Den

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

;|====================================================
Растяжение/сжатие 3D тел в указанной плоскости на заданную величину
Программа Дениса Флюстикова "Stretch3D_Den" от 23.09.08:
- Исправлена работа со составными 3D телами
- Более удобный выбор 3D тел (обрабатываются только те тела,
  которые находятся на указанной стороне растяжения/сжатия)
- Исправлена работа при заблокированном активном слое
Попытка сделать по просьбе Владимира Мадюшкина аналог программы
"QD3D STRETCH", триал версия предсталена на
http://www.cadopolis.com/autocad_addons/quick-draw-3d-stretch.shtml
Программа тестировалась на AutoCAD 2008/09
Макрос для кнопки:
^C^C^P(load "Stretch3D_Den");Stretch3D_Den
Замечания и предложения по адресу fd-@mail.ru
====================================================|;
(defun C:Stretch3D_Den (/ *error* cecolor layer osmode
            aa1 aa2 aa3 aa4 aa5 aa6 aa7 aa8 aa9)
(setq cecolor (getvar "CECOLOR")
      layer (cdr (assoc 70 (tblsearch "Layer" (getvar "CLAYER"))))
      osmode (getvar "OSMODE")
      aa1 (getvar "VIEWDIR"))
(if (and (equal (car aa1) 0 0.00001)
     (equal (cadr aa1) 0 0.00001)
     (> (caddr aa1) 0))(progn
(if (setq aa1 (ssget "_i" '((0 . "3DSOLID"))))
(princ (strcat "\nВыбрано объектов: " (itoa (sslength aa1))))(progn
(princ "\nВыбор 3D тел для преоразования")
(setq aa1 (ssget '((0 . "3DSOLID"))))
))
(if aa1
(if (setq aa2 (getpoint "\nПервая точка плоскости растяжения/сжатия:"))
(if (setq aa3 (getpoint aa2 "\nВторая точка плоскости (плоскость перпендикулярна XY):"))(progn
(grdraw aa2 aa3 7)
(vl-load-com)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(setvar "CMDECHO" 0)
(defun *error* (msg)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
(if (and (>= (atof (getvar "ACADVER")) 16.2)(< (atof (getvar "ACADVER")) 17.1))
(vla-sendcommand (vla-get-activedocument
(vlax-get-acad-object)) "_.undo 1 ")
(command nil nil nil nil "_.undo" 1))
(princ "\nВыход во время обработки данных\n")
)
(command "_.undo" "_m"
     "_.ucs" "_z" aa2 aa3)
(setvar "ORTHOMODE" 1)
(initget 1)
(if (vl-catch-all-error-p
(setq aa4 (vl-catch-all-apply 'getpoint
(list "\nПервая точка вектора, определяющая сторону растяжения/сжатия:"))))
(setq aa4 nil)(progn
(initget 1)
(if (vl-catch-all-error-p
(setq aa5 (vl-catch-all-apply 'getpoint
(list aa4 "\nВторая точка вектора, определяющая растяжение или сжатие и их величину:"))))
(setq aa4 nil)
(setq aa7 (trans (mapcar '+ aa4 '(0 0)) 1 0)
      aa5 (trans (mapcar '+ aa5 '(0 0)) 1 0)
      aa4 (distance aa7 aa5))
)))
(redraw)
(command "_.undo" "_b")
(if aa4 (progn
(setq aa7 (trans aa7 0 1)
      aa5 (trans aa5 0 1))
(if (> (sin (angle aa2 aa3)) 0)
(setq aa6 aa2 aa2 aa3 aa3 aa6))
(if (> (sin (- (angle aa2 aa3)(angle aa2 aa7))) 0)
(setq aa6 aa2 aa2 aa3 aa3 aa6))
(if (> (distance aa2 aa7)(distance aa2 aa5))
(setq aa4 (- aa4)))
(setq aa9 (polar '(0 0 0) (+ (angle aa2 aa3)(/ pi 2)) aa4)
      aa5 (sslength aa1))
(setvar "OSMODE" 0)
(if (eq layer 4)(command "_.layer" "_u" (getvar "CLAYER") ""))
(while (> aa5 0)
(setq aa5 (1- aa5)
      aa6 (ssname aa1 aa5)
      aa7 (entlast)
      aa8 (entget aa6))
(while (entnext aa7)
(setq aa7 (entnext aa7)))
(if (/= (cdr (assoc 70 (tblsearch "Layer" (cdr (assoc 8 aa8))))) 4)(progn
(if (and (>= (atof (getvar "ACADVER")) 16)(assoc 420 aa8))
(setq aa8 (cdr (assoc 420 aa8))
      aa8 (strcat "RGB:" (rtos (logand (lsh aa8 -16) 255)) ","
          (rtos (logand (lsh aa8 -8) 255)) ","
          (rtos (logand aa8 255))))
(if (setq aa8 (assoc 62 aa8))
(setq aa8 (rtos (cdr aa8)))
(setq aa8 "256")))
(setvar "CECOLOR" aa8)))
(if (> aa4 0)(progn
(command "_.section" aa6 "" "3" aa2 aa3 "@0,0,1")
(if (entnext aa7)(progn
(setq aa7 (entnext aa7)
      aa8 (ssadd))
(command "_.extrude" aa7 "" "_d" '(0 0 0) aa9)
(while (entnext aa7)
(setq aa7 (entnext aa7)
      aa8 (ssadd aa7 aa8)))
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b"
     "_.move" (entlast) "" '(0 0 0) aa9
     "_.union" aa6 aa8 (entlast) "")
)
(progn
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (setq aa7 (entnext aa7))
(command "_.move" aa7 "" '(0 0 0) aa9
     "_.union" aa6 aa7 "")
(if (< (sin (- (angle aa2 aa3)
           (angle aa2
(trans (vlax-safearray->list
     (vlax-variant-value
       (vla-get-Centroid
         (vlax-ename->vla-object aa6)))) 0 1)))) 0)
(command "_.move" aa6 "" '(0 0 0) aa9)
)
))
)
)
(progn
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (setq aa7 (entnext aa7))(progn
(command "_.move" aa7 "" '(0 0 0) aa9
     "_.slice" aa7 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (entnext aa7)
(command "_.erase" aa7 ""
     "_.union" aa6 (entnext aa7) "")
(command "_.union" aa6 aa7 "")
)
)
(if (< (sin (- (angle aa2 aa3)
           (angle aa2
(trans (vlax-safearray->list
     (vlax-variant-value
       (vla-get-Centroid
         (vlax-ename->vla-object aa6)))) 0 1)))) 0)
(command "_.move" aa6 "" '(0 0 0) aa9)
)
)
))
)
))
(if (eq layer 4)(command "_.layer" "_lo" (getvar "CLAYER") ""))
(setvar "CECOLOR" cecolor)
(setvar "OSMODE" osmode)
(setvar "CMDECHO" 1)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
))))
)
(princ "\nУстановите один из стандартных ортогональных видов")
)
(princ)
)

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Денис, проблема со вторым кодом. Не хочет работать в сечение с отверстием!

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

- Более удобный выбор 3D тел (обрабатываются только те тела,
  которые находятся на указанной стороне растяжения/сжатия)

Я думаю это не есть хорошо! Хотя есть идея расширить возмоности, при фигурах с углами (пирамиды, конусы) сделать растяжение соблюдая угол схождения или расхождения

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Денис, проблема и с первым кодом тоже не хочет работать в сечение с отверстием! тест на AutoCAD 2007 RUS, А вот на 2009 проблем нет, не понимаю почему?

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

> Владимир М
Прошу выслать DWG-файл мне на fd-@mail.ru и показать по какой плоскости преобразовывать тела с отверстиями. Если есть возможность, попробуй сделать эту операцию на Acad'e более поздней версии (Под рукой есть только 2008 AutoCAD и у меня все ОК).
А насчет

Я думаю это не есть хорошо!

, задумался, хотя пока кажется, что легче не напрягаясь выделить зону и с телами которые не надо растягивать, а программа сама выберет те что нужно оставить для преобразования (находятся на заданной стороне растяжения/сжатия и на указанной плоскости).

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Денис, файл выслал! Извини на счет второго кода погорячился. Мне понравилось на  AutoCAD 2009

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Для работы программы при различных настройках переменной DIMZIN:
Замените строчку:
(setq aa8 (rtos (cdr aa8)))
на:
(setq aa8 (itoa (cdr aa8)))

> Владимир М
Файл получил, на 2008-ом работает нормально, буду искать машины с более ранним Acad'ом.

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Денис, а строчки
aa8 (strcat "RGB:" (rtos (logand (lsh aa8 -16) 255)) ","
      (rtos (logand (lsh aa8 -8) 255)) ","
      (rtos (logand aa8 255))))
тоже менять на
aa8 (strcat "RGB:" (itoa (logand (lsh aa8 -16) 255)) ","
      (itoa (logand (lsh aa8 -8) 255)) ","
      (itoa (logand aa8 255))))
правильно я понял?

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Денис, все равно такой же результат с этим сечением

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

;|====================================================
Растяжение/сжатие 3D тел в указанной плоскости на заданную величину
Программа Дениса Флюстикова "Stretch3D_Den" от 24.09.08:
адаптирована под AutoCAD 2004-06
Попытка сделать по просьбе Владимира Мадюшкина аналог программы
"QD3D STRETCH", триал версия предсталена на
http://www.cadopolis.com/autocad_addons/quick-draw-3d-stretch.shtml
Программа тестировалась на AutoCAD 2004-06, 2008-09
(на 2007-ом пока имеется проблема когда плоскость растяжения/сжатия
попадает на отверстие в 3D теле)
Макрос для кнопки:
^C^C^P(load "Stretch3D_Den");Stretch3D_Den
Замечания и предложения по адресу fd-@mail.ru
====================================================|;
(defun C:Stretch3D_Den (/ *error* cecolor layer osmode
      aa1 aa2 aa3 aa4 aa5 aa6 aa7 aa8 aa9)
(setq cecolor (getvar "CECOLOR")
      layer (cdr (assoc 70 (tblsearch "Layer" (getvar "CLAYER"))))
      osmode (getvar "OSMODE")
      aa1 (getvar "VIEWDIR"))
(if (and (equal (car aa1) 0 0.00001)
   (equal (cadr aa1) 0 0.00001)
   (> (caddr aa1) 0))(progn
(if (setq aa1 (ssget "_i" '((0 . "3DSOLID"))))
(princ (strcat "\nВыбрано объектов: " (itoa (sslength aa1))))(progn
(princ "\nВыбор 3D тел для преоразования")
(setq aa1 (ssget '((0 . "3DSOLID"))))
))
(if aa1
(if (setq aa2 (getpoint "\nПервая точка плоскости растяжения/сжатия:"))
(if (setq aa3 (getpoint aa2 "\nВторая точка плоскости (плоскость перпендикулярна XY):"))(progn
(grdraw aa2 aa3 7)
(vl-load-com)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(setvar "CMDECHO" 0)
(defun *error* (msg)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
(if (and (>= (atof (getvar "ACADVER")) 16.2)(< (atof (getvar "ACADVER")) 17.1))
(vla-sendcommand (vla-get-activedocument
(vlax-get-acad-object)) "_.undo 1 ")
(command nil nil nil nil "_.undo" 1))
(princ "\nВыход во время обработки данных\n")
)
(command "_.undo" "_m"
   "_.ucs" "_z" aa2 aa3)
(setvar "ORTHOMODE" 1)
(initget 1)
(if (vl-catch-all-error-p
(setq aa4 (vl-catch-all-apply 'getpoint
(list "\nПервая точка вектора, определяющая сторону растяжения/сжатия:"))))
(setq aa4 nil)(progn
(initget 1)
(if (vl-catch-all-error-p
(setq aa5 (vl-catch-all-apply 'getpoint
(list aa4 "\nВторая точка вектора, определяющая растяжение или сжатие и их величину:"))))
(setq aa4 nil)
(setq aa7 (trans (mapcar '+ aa4 '(0 0)) 1 0)
      aa5 (trans (mapcar '+ aa5 '(0 0)) 1 0)
      aa4 (distance aa7 aa5))
)))
(redraw)
(command "_.undo" "_b")
(if aa4 (progn
(setq aa7 (trans aa7 0 1)
      aa5 (trans aa5 0 1))
(if (> (sin (angle aa2 aa3)) 0)
(setq aa6 aa2 aa2 aa3 aa3 aa6))
(if (> (sin (- (angle aa2 aa3)(angle aa2 aa7))) 0)
(setq aa6 aa2 aa2 aa3 aa3 aa6))
(if (> (distance aa2 aa7)(distance aa2 aa5))
(setq aa4 (- aa4)))
(setq aa9 (polar '(0 0 0) (+ (angle aa2 aa3)(/ pi 2)) aa4)
      aa5 (sslength aa1))
(setvar "OSMODE" 0)
(if (eq layer 4)(command "_.layer" "_u" (getvar "CLAYER") ""))
(while (> aa5 0)
(setq aa5 (1- aa5)
      aa6 (ssname aa1 aa5)
      aa7 (entlast)
      aa8 (entget aa6))
(while (entnext aa7)
(setq aa7 (entnext aa7)))
(if (/= (cdr (assoc 70 (tblsearch "Layer" (cdr (assoc 8 aa8))))) 4)(progn
(if (and (>= (atof (getvar "ACADVER")) 16)(assoc 420 aa8))
(setq aa8 (cdr (assoc 420 aa8))
      aa8 (strcat "RGB:" (itoa (logand (lsh aa8 -16) 255)) ","
      (itoa (logand (lsh aa8 -8) 255)) ","
      (itoa (logand aa8 255))))
(if (setq aa8 (assoc 62 aa8))
(setq aa8 (itoa (cdr aa8)))
(setq aa8 "256")))
(setvar "CECOLOR" aa8)))
(if (> aa4 0)(progn
(command "_.section" aa6 "" "3" aa2 aa3 "@0,0,1")
(if (entnext aa7)(progn
(setq aa7 (entnext aa7)
      aa8 (ssadd))
(command "_.extrude" aa7 "" (- aa4))
(while (= (getvar 'cmdactive) 1)
(command ""))
(while (entnext aa7)
(setq aa7 (entnext aa7)
      aa8 (ssadd aa7 aa8)))
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b"
   "_.move" (entlast) "" '(0 0 0) aa9
   "_.union" aa6 aa8 (entlast) "")
)
(progn
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (setq aa7 (entnext aa7))
(command "_.move" aa7 "" '(0 0 0) aa9
   "_.union" aa6 aa7 "")
(if (< (sin (- (angle aa2 aa3)
         (angle aa2
(trans (vlax-safearray->list
   (vlax-variant-value
     (vla-get-Centroid
       (vlax-ename->vla-object aa6)))) 0 1)))) 0)
(command "_.move" aa6 "" '(0 0 0) aa9)
)
))
)
)
(progn
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (setq aa7 (entnext aa7))(progn
(command "_.move" aa7 "" '(0 0 0) aa9
   "_.slice" aa7 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (entnext aa7)
(command "_.erase" aa7 ""
   "_.union" aa6 (entnext aa7) "")
(command "_.union" aa6 aa7 "")
)
)
(if (< (sin (- (angle aa2 aa3)
         (angle aa2
(trans (vlax-safearray->list
   (vlax-variant-value
     (vla-get-Centroid
       (vlax-ename->vla-object aa6)))) 0 1)))) 0)
(command "_.move" aa6 "" '(0 0 0) aa9)
)
)
))
)
))
(if (eq layer 4)(command "_.layer" "_lo" (getvar "CLAYER") ""))
(setvar "CECOLOR" cecolor)
(setvar "OSMODE" osmode)
(setvar "CMDECHO" 1)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
))))
)
(princ "\nУстановите один из стандартных ортогональных видов")
)
(princ)
)

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Здравствуйте .
У меня Ваша программа Stretch3D_Den работает , только непонятно почему оставляет просвет между телами , т.е. указываем 2 точки плоскости , затем точку вектора , двигаем курсор в ортогональном режиме в сторону удлинения , указываем величину удлинения , и - получаем 2 объединенных тела с разрывом равным указанной длине удлинения . Т.е. все бы хорошо , но почему-то возникает этот разрыв . Может я неправильно пользуюсь программой ? Подскажите , пожалуйста . Acad2006

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

> APavl
Разрыв должен заполниться выдавленным сечением по указанной плоскости.
Такая проблема во всех файлах? Большая просьба выслать мне на fd-@mail.ru твой файлик, вечером после футбола буду разбираться.

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Прошу прощения , Денис .
Видно я не понял принцип определения плоскости растяжения/сжатия ,но наконец - получилось .
Ранее я пытался точно указать плоскость 2 точками с привязками , а нужно , наверное , указывать просто направление плоскости 2 точками ( гор ./ верт. ...) . Спасибо . Программа очень мне пригодится .

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

> APavl
Рад, что программа заработала и может пригодиться, а насчет полученного разрыва при привязках, буду думать, такого не должно быть.

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

;|====================================================
Растяжение/сжатие 3D тел в указанной плоскости на заданную величину
Программа Дениса Флюстикова "Stretch3D_Den" от 05.10.08:
- Учтена переменная DELOBJ
- Индикация процесса преобразования в строке состояния
- Увеличено быстродействие если указанная плоскость
  параллельна оси X или Y (за счет группового переноса 3D тел)
- И мелочи
Попытка сделать по просьбе Владимира Мадюшкина аналог программы
"QD3D STRETCH", триал версия предсталена на
http://www.cadopolis.com/autocad_addons/quick-draw-3d-stretch.shtml
При тестировании программы на AutoCAD 2004-06, 2008-09 без замечаний,
на 2007-ом пока имеется проблема когда плоскость растяжения/сжатия
попадает на отверстие в 3D теле.
Макрос для кнопки:
^C^C^P(load "Stretch3D_Den");Stretch3D_Den
Замечания и предложения по адресу fd-@mail.ru
====================================================|;
(defun C:Stretch3D_Den (/ *error* cecolor layer delobj osmode modemacro
            aa1 aa2 aa3 aa4 aa5 aa6 aa7 aa8 aa9 aa10 aa11 aa12)
(setq cecolor (getvar "CECOLOR")
      delobj (getvar "DELOBJ")
      modemacro (getvar "MODEMACRO")
      osmode (getvar "OSMODE")
      layer (cdr (assoc 70 (tblsearch "Layer" (getvar "CLAYER"))))
      aa1 (getvar "VIEWDIR")
      aa10 (ssadd))
(if (and (equal (car aa1) 0 0.00001)
     (equal (cadr aa1) 0 0.00001)
     (> (caddr aa1) 0))(progn
(if (setq aa1 (ssget "_i" '((0 . "3DSOLID"))))
(princ (strcat "\nВыбрано объектов: " (itoa (sslength aa1))))(progn
(princ "\nВыбор 3D тел для преоразования")
(setq aa1 (ssget '((0 . "3DSOLID"))))
))
(if aa1
(if (setq aa2 (getpoint "\nПервая точка плоскости растяжения/сжатия:"))
(if (setq aa3 (getpoint aa2 "\nВторая точка плоскости (плоскость перпендикулярна XY):"))(progn
(setq aa8 (trans aa2 1 0))
(grdraw aa2 aa3 7)
(vl-load-com)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(setvar "CMDECHO" 0)
(defun *error* (msg)
(setvar "CECOLOR" cecolor)
(setvar "MODEMACRO" modemacro)
(setvar "DELOBJ" delobj)
(setvar "OSMODE" osmode)
(setvar "CMDECHO" 1)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
(if (and (>= (atof (getvar "ACADVER")) 16.2)(< (atof (getvar "ACADVER")) 17.1))
(vla-sendcommand (vla-get-activedocument
(vlax-get-acad-object)) "_.undo 1 ")
(command nil nil nil nil "_.undo" 1))
(princ "\nВыход во время обработки данных\n")
)
(command "_.undo" "_m"
     "_.ucs" "_z" aa2 aa3)
(setvar "ORTHOMODE" 1)
(setvar "UCSICON" 0)
(initget 1)
(if (vl-catch-all-error-p
(setq aa4 (vl-catch-all-apply 'getpoint
(list "\nПервая точка вектора, определяющая сторону растяжения/сжатия:"))))
(setq aa4 nil)(progn
(initget 1)
(if (vl-catch-all-error-p
(setq aa5 (vl-catch-all-apply 'getpoint
(list aa4 "\nВторая точка вектора, определяющая растяжение или сжатие и их величину:"))))
(setq aa4 nil)
)))
(redraw)
(if aa4 (progn
(setq aa7 (sslength aa1)
      aa8 (trans aa8 0 1)
      aa9 (sin (angle aa8 aa4)))
(if (equal (sin (* 2.0 (angle aa2 aa3))) 0 0.00001)
(while (> aa7 0)
(setq aa7 (1- aa7)
      aa6 (ssname aa1 aa7))
(vla-GetBoundingBox (vlax-ename->vla-object aa6) 'aa11 'aa12)
(setq aa11 (vlax-safearray->list aa11)
      aa12 (vlax-safearray->list aa12)
      aa11 (trans aa11 0 1)
      aa12 (trans aa12 0 1)
      aa11 (sin (angle aa8 aa11))
      aa12 (sin (angle aa8 aa12)))
(if (> (* aa11 aa12) 0)(progn
(setq aa1 (ssdel aa6 aa1))
(if (> (* aa9 aa12) 0)
(setq aa10 (ssadd aa6 aa10))
)))
))
(setq aa7 (trans (mapcar '+ aa4 '(0 0)) 1 0)
      aa5 (trans (mapcar '+ aa5 '(0 0)) 1 0)
      aa4 (distance aa7 aa5))
))
(command "_.undo" "_b")
(if aa4 (progn
(setq aa7 (trans aa7 0 1)
      aa5 (trans aa5 0 1))
(if (> (sin (angle aa2 aa3)) 0)
(setq aa6 aa2 aa2 aa3 aa3 aa6))
(if (> (sin (- (angle aa2 aa3)(angle aa2 aa7))) 0)
(setq aa6 aa2 aa2 aa3 aa3 aa6))
(if (> (distance aa2 aa7)(distance aa2 aa5))
(setq aa4 (- aa4)))
(setq aa9 (polar '(0 0 0) (+ (angle aa2 aa3)(/ pi 2)) aa4)
      aa5 (sslength aa1))
(setvar "OSMODE" 0)
(setvar "DELOBJ" 1)
(if (eq layer 4)(command "_.layer" "_u" (getvar "CLAYER") ""))
(if (> (sslength aa10) 0)
(command "_.move" aa10 "" '(0 0 0) aa9))
(while (> aa5 0)
(setq aa5 (1- aa5)
      aa6 (ssname aa1 aa5)
      aa7 (entlast)
      aa8 (entget aa6))
(while (entnext aa7)
(setq aa7 (entnext aa7)))
(if (/= (cdr (assoc 70 (tblsearch "Layer" (cdr (assoc 8 aa8))))) 4)(progn
(if (and (>= (atof (getvar "ACADVER")) 16)(assoc 420 aa8))
(setq aa8 (cdr (assoc 420 aa8))
      aa8 (strcat "RGB:" (itoa (logand (lsh aa8 -16) 255)) ","
      (itoa (logand (lsh aa8 -8) 255)) ","
      (itoa (logand aa8 255))))
(if (setq aa8 (assoc 62 aa8))
(setq aa8 (itoa (cdr aa8)))
(setq aa8 "256")))
(setvar "CECOLOR" aa8)))
(if (> aa4 0)(progn
(command "_.section" aa6 "" "3" aa2 aa3 "@0,0,1")
(if (entnext aa7)(progn
(setq aa7 (entnext aa7)
      aa8 (ssadd))
(command "_.extrude" aa7 "" (- aa4))
(while (= (getvar 'cmdactive) 1)
(command ""))
(while (entnext aa7)
(setq aa7 (entnext aa7)
      aa8 (ssadd aa7 aa8)))
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b"
     "_.move" (entlast) "" '(0 0 0) aa9
     "_.union" aa6 aa8 (entlast) "")
)
(progn
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (setq aa7 (entnext aa7))
(command "_.move" aa7 "" '(0 0 0) aa9
     "_.union" aa6 aa7 "")
(if (< (sin (- (angle aa2 aa3)
         (angle aa2
(trans (vlax-safearray->list
   (vlax-variant-value
     (vla-get-Centroid
       (vlax-ename->vla-object aa6)))) 0 1)))) 0)
(command "_.move" aa6 "" '(0 0 0) aa9)
)
))
)
)
(progn
(command "_.slice" aa6 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (setq aa7 (entnext aa7))(progn
(command "_.move" aa7 "" '(0 0 0) aa9
     "_.slice" aa7 "" "3" aa2 aa3 "@0,0,1" "_b")
(if (entnext aa7)
(command "_.erase" aa7 ""
     "_.union" aa6 (entnext aa7) "")
(command "_.union" aa6 aa7 "")
)
)
(if (< (sin (- (angle aa2 aa3)
         (angle aa2
(trans (vlax-safearray->list
   (vlax-variant-value
     (vla-get-Centroid
       (vlax-ename->vla-object aa6)))) 0 1)))) 0)
(command "_.move" aa6 "" '(0 0 0) aa9)
)
)
))
(if (> (sslength aa10) 0)
(setvar "MODEMACRO" (strcat "Перенесено: "
                (itoa (sslength aa10))
                "; Изменено: "
                (itoa (- (sslength aa1) aa5))
                " из "
                (itoa (sslength aa1))))
(setvar "MODEMACRO" (strcat "Обработано 3D тел: "
                (itoa (- (sslength aa1) aa5))
                " из "
                (itoa (sslength aa1))))
)
)
))
(princ "\nОперация завершена")
(if (eq layer 4)(command "_.layer" "_lo" (getvar "CLAYER") ""))
(setvar "CECOLOR" cecolor)
(setvar "MODEMACRO" modemacro)
(setvar "DELOBJ" delobj)
(setvar "OSMODE" osmode)
(setvar "CMDECHO" 1)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
))))
)
(princ "\nУстановите один из стандартных ортогональных видов")
)
(princ)
)

(изменено: sasha_lif lif, 15 октября 2009г. 14:06:33)

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Очень хорошая и НУЖНАЯ программа .
А нельзя ли ее переделать для Автоакада 2004 Eng.

Так не работает , пишет

....
Command: Stretch3D_Den

Select objects: Specify opposite corner: 4 found

Requires numeric distance, two points, or option keyword.

Command:
Выход во время обработки данных

и второе пожелание - сделать по аналогии выбор объектов ,как в той программке что на сайте http://www.cadopolis.com/autocad_addons … etch.shtml

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

sasha_lif lif,
Погонял программу под 2004-ым АвтоКАДом, вроде работает нормально.
НО!, не удалось запустить программу с копированным кодом из моего последнего (и не только последнего) сообщения.
Оказалось, что вместо некоторых сочетаний символов появились смайлики. Раньше этого не было.
Поэтому нужно заменить строчку:
(itoa (logand (lsh aa8 - 255)) ","
на:
(itoa (logand (lsh aa8 -8) 255)) ","
Если программа и после этого не заработает, просьба выслать файлик с 3D-моделью мне на fd-@mail.ru , буду разбираться.
А какие плюсы есть в выборе из "QD3D STRETCH"?

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Денис Флюстиков
В этой новой версии, что вы прислали мне на эл. почту работает и в 2004! Старые версии выложенные тут, у меня не работали (перевод смайликов в -8 учел и заменял). Поэтому думаю Вам имеет смысл выложить эту программу и для 2004 акада.
Там вроде была проблема в (command "_.extrude" aa7 "" "_d" '(0 0 0) aa9) для 2004 нет опции в extrude в виде direction.


Спасибо большое, очень помогает при переделках в 3-d!
А плюсы для работы такие: Есть модель построенная в трехмерке, (например обшивка деревянными панелями стен)и необходимо уменьшить высоту помещения , а вместе с ней и всех панелей, или длину комнаты, так можно за 30 сек, подкорректировать, а без Вашей программы ,- ОГО сколько времени...
А еще если учесть умение экструзировать под углом, чего не было в http://www.cadopolis.com , то я думаю открываются еще большие возможности (правда еще не доконца с ней разобрался, буду пробовать)

А сильно много изменять в коде, для того что бы одновременно тягало и трехмерку и плоские линии , нарисованные в 2-d. А то иногда на трехмерку накладываешь плоские 2-d линии (чтобы не все рисовать в трехмерке). т.е хотелось бы как-то совместить, что те плоские контуры , которые попали в секущую плоскость , потом тянулись как в обычном stretch. Извините за наглость . :)

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

sasha_lif lif пишет:

..., потом тянулись как в обычном stretch. Извините за наглость . :)

В новой версии ("Stretch3D_Den" от 20.10.09) появилась такая возможность, правда, для AutoCAD с 2006, а под 2004-ым ни уговорами, ни угрозами не смог заставить программу выполнять и эту функцию. :(

Re: LISP. Растяжение/сжатие 3D тел в указанной плоскости на заданную величину

Денис, а можно сделать как в обычном stretch, чтобы ОДНОВРЕМЕННО  часть объектов растягивается, а часть сжимается (в зависимости от направления растягивания.) Письмо с примером кинул Вам на почту