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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Rotate нескольких объектов вокруг своей оси

Rotate нескольких объектов вокруг своей оси

Ответ
Поиск в этой теме
Непрочитано 16.09.2006, 00:37
Rotate нескольких объектов вокруг своей оси
Silavsale
 
Kyiv
Регистрация: 19.02.2006
Сообщений: 19

мне нужно обернуть объект вокруг оси на 180 градусов..таких объектов сотни , хочу сыкономить время если такое возможно , оборачивать не поо тдельности а все сразу ....
когда выдиляешь все они обарачиваются вокруг одной точки а мне надо обернуть их вокруг своей оси тоесть оставить их на томже месте только верх ногами...
Просмотров: 17808
 
Непрочитано 09.02.2012, 09:30 Произвольное вращение на 180
#21
voron83

Геодезист
 
Регистрация: 09.02.2012
Сергиев Посад
Сообщений: 6


Цитата:
Сообщение от VVA Посмотреть сообщение
Объекты вращаются вокруг центра последнего выбранного примитива.
Нижеприведенный код вращает выбранные объекты вокруг относительно центра прямоугольника, описанного вокруг каждого объекта

Код:
[Выделить все]
 
(defun c:srot (/ ERRCOUNT MAXPT MINPT MIPT MNPT MXPT 
OBJSET VLAOBJ PTLST XLST YLST) 
(vl-load-com) 
(if(not srot:ang)(setq srot:ang (* pi 0.5))) 
(setq oldAng srot:ang 
srot:ang(getangle 
(strcat"\nSpecify rotation angle <"(angtos srot:ang)">: ")) 
); end setq 
(if(null srot:ang)(setq srot:ang oldAng)) 
(setq errCount 0 
ptLst '() 
); en setq
(princ "\n§§§ Select objects or press Enter to Quit. §§§")
(if 
(not(setq objSet(ssget "_I"))) 
(setq objSet(ssget)) 
); end if
(sssetfirst) 
(while objSet
(setq objSet 
(mapcar 'vlax-ename->vla-object 
(vl-remove-if 'listp 
(mapcar 'cadr(ssnamex objSet))))) 
(foreach obj objSet 
(vla-GetBoundingBox obj 'MinPt 'MaxPt) 
(setq mnPt(vlax-safearray->list MinPt) 
mxPt(vlax-safearray->list MaxPt)
miPt (polar mnPt (angle mnPt mxPt)(* 0.5 (distance mnPt mxPt))) 
)
(if 
(vl-catch-all-error-p 
(vl-catch-all-apply 'vla-rotate 
(list obj(vlax-3D-Point miPt)srot:ang))) 
(setq errCount(1+ errCount)) 
) 
); end foreach 
(if(/= 0 errCount) 
(princ(strcat "\n" (itoa errCount) " objects were on locked layer! ")) 
); end if
(princ "\n§§§ Select objects or press Enter to Quit. §§§")
(setq objSet(ssget)) 
); end while 
(princ) 
); end of c:srot
PS: Похожая тема: Поворот на 90 градусов.
Привет.
Очень нравятся твой лисп и я рад что есть такие этузиасты.
Сам я в лиспах полный 0000000000000000, так что прошу помощи у тебя.
Суть программки такова:
есть примерно 150 элементов оного и того же блока
нужно что бы при выполнении лиспа все эти блоки произвольно вращались на 180.
т.е. либо блок вращался на 180 либо остовался на своем месте (вращение на 360 или на 0)
Если есть возможность модернизируй свой лисп добавив в него возможность такого вращения выбранных элементом плиз.
Жду твоей помощи, а пока пробую сам разобраться.
P.S. посоветуй литературку для изучения autolisp
voron83 вне форума  
 
Непрочитано 11.06.2013, 11:59
#22
FRC_Volen


 
Регистрация: 10.06.2013
Тюмень
Сообщений: 14


Я прошу меня извинить, но я познакомился с автокадом в пятницу, а в понедельник я уже пытаюсь изучать команды и знакомлюсь с языком lisp и все с помощью данного форума без возможности проконсультироваться с кем либо в живую. Мне пока трудно освоить все сразу не отрываясь от прямых моих обязанностей на работе.
Поиск насилую постоянно,
на данный момент я нашел как разворачивать объекты все сразу и вокруг своей оси. Пусть это отдельная программа но это не так важно. Главное что эту операцию можно выполнить всего один раз, вместо 1000 для каждого объекта отдельно

Цитата:
Сообщение от VVA Посмотреть сообщение
Объекты вращаются вокруг центра последнего выбранного примитива.
Нижеприведенный код вращает выбранные объекты вокруг относительно центра прямоугольника, описанного вокруг каждого объекта

Код:
[Выделить все]
 
(defun c:srot (/ ERRCOUNT MAXPT MINPT MIPT MNPT MXPT 
OBJSET VLAOBJ PTLST XLST YLST) 
(vl-load-com) 
(if(not srot:ang)(setq srot:ang (* pi 0.5))) 
(setq oldAng srot:ang 
srot:ang(getangle 
(strcat"\nSpecify rotation angle <"(angtos srot:ang)">: ")) 
); end setq 
(if(null srot:ang)(setq srot:ang oldAng)) 
(setq errCount 0 
ptLst '() 
); en setq
(princ "\n§§§ Select objects or press Enter to Quit. §§§")
(if 
(not(setq objSet(ssget "_I"))) 
(setq objSet(ssget)) 
); end if
(sssetfirst) 
(while objSet
(setq objSet 
(mapcar 'vlax-ename->vla-object 
(vl-remove-if 'listp 
(mapcar 'cadr(ssnamex objSet))))) 
(foreach obj objSet 
(vla-GetBoundingBox obj 'MinPt 'MaxPt) 
(setq mnPt(vlax-safearray->list MinPt) 
mxPt(vlax-safearray->list MaxPt)
miPt (polar mnPt (angle mnPt mxPt)(* 0.5 (distance mnPt mxPt))) 
)
(if 
(vl-catch-all-error-p 
(vl-catch-all-apply 'vla-rotate 
(list obj(vlax-3D-Point miPt)srot:ang))) 
(setq errCount(1+ errCount)) 
) 
); end foreach 
(if(/= 0 errCount) 
(princ(strcat "\n" (itoa errCount) " objects were on locked layer! ")) 
); end if
(princ "\n§§§ Select objects or press Enter to Quit. §§§")
(setq objSet(ssget)) 
); end while 
(princ) 
); end of c:srot
PS: Похожая тема: Поворот на 90 градусов.

За основу решения проблемы взята программа описная ниже
Программа вымерят расстояние между двумя точками и записывает текстов в третей точке.


Цитата:
Сообщение от skkkk Посмотреть сообщение
Что-то типа такого? (Без проверок, обработки ошибок и прочих прелестей)
Код:
[Выделить все]
(defun C:test ()
    (vl-load-com)
    (vla-AddMtext (vla-get-ModelSpace(vla-get-activedocument (vlax-get-acad-object)))
              (vlax-3d-point '(0.0 0.0 0.0)) 
              0
              (vl-princ-to-string (distance (getpoint "\nУкажите первую точку") (getpoint "\nУкажите вторую точку")))
    )
    (command "_.copybase" '(0.0 0.0 0.0) (entlast) "")
    (command "_.erase" (entlast) "")
    (command "_.pasteclip")
)
Конечно, написание кода заняло буквально пару минут, но поиск никто не отменял - было уже множество решений. Очень советую поискать - полезное занятие.

Как она это делает я так и не понял, но она это делает отлично.

А как теперь добиться корректировки выводимых данных, а именно: полученный результат нужно умножить на два (чертеж в масштабе и требуется корректировка полученных результатов) и прибавить к полученному значению +30

т.е. вместо "10" она должна будет выводить 10*2+30= "50"

и как можно осуществить повтор выполнения команды на примере макроса когда в начале ставится * и команда повторятся до нажатия кнопки Esc

Просьба отнестись с нисхождением) я все таки пользователь с опытом работы автокада меньше недели и у меня сжатый срок на выполнение большого объема типовой работы
FRC_Volen вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Rotate нескольких объектов вокруг своей оси

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск