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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp в 3D

Lisp в 3D

Ответ
Поиск в этой теме
Непрочитано 02.02.2009, 21:54 #1
Lisp в 3D
eugen81
 
ООО Предприятие "Ирбис"
 
Екатеринбург
Регистрация: 02.02.2009
Сообщений: 45

Доброго времени суток, товарищи!

Помогите, кто может, решить такую проблему: необходимо повернуть объект (блок, примитив и т.д.) в трехмерном пространстве НЕ используя COMMAND и VL-CMDF, желательно оперируя группами характеристик объекта (например 210). Причем так, чтобы выглядело это наглядно, как с командой ROTATE, но вокруг заданой оси, а не только в плоскости XY. Опять же, нельзя менять систему координат
Заранее спасибо!

Последний раз редактировалось eugen81, 03.02.2009 в 21:17.
Просмотров: 10027
 
Непрочитано 02.02.2009, 23:58
#2
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,429
<phrase 1=


оперируя только кодом 210 полноценно вращать получится только окружность. 210 только z ось (нормаль объекта), для остальных объектов нужно еще покрутить 220 и 230 - x и y соответственно
могу дать математику на делфи
zamtmn на форуме  
 
Непрочитано 03.02.2009, 00:06
#3
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Попробуй другой метод
Код:
[Выделить все]
;;======================rob.lsp==========================;;

(defun C:rob (/ ang ent obj p1 p2)
(vl-load-com)
(setq ent (entsel "\nВыбрать солид:")
      obj (vlax-ename->vla-object (car ent)))
 (setq p1 (getpoint "\nПервая точка оси поворота: ")
       p2 (getpoint p1 "\nВторая точка: ")
       ang (getreal "\nУгол в градусах: ")
       p1 (vlax-3d-point p1)
       p2 (vlax-3d-point p2)
       )
(vla-rotate3d obj p1 p2 (/ (* pi ang) 180))
(vlax-release-object obj)
    (princ)
    )
    (prompt "\n***   В командной строке введите ROB   ***")
    (princ)

;;=========================end of========================;;
~'J'~
Олег (jr.) вне форума  
 
Непрочитано 03.02.2009, 00:06
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,694


группы 220 и 230 появляются только в DXF-формате. В ename-представлении они есть необязательно.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.02.2009, 00:13
#5
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,429
<phrase 1=


>>группы 220 и 230 появляются только в DXF-формате. В ename-представлении они есть необязательно.
они и в DXF файле не обязательны, иногда их "заменяет" поворот вокруг пормали
zamtmn на форуме  
 
Автор темы   Непрочитано 03.02.2009, 11:46
#6
eugen81

ООО Предприятие "Ирбис"
 
Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
<phrase 1=


Группа 210 обычно имеет вид (210 0.0 0.0 1.0), то есть представляет собой единичный вектор, направленый вдоль оси z. Только с помощью этой группы можно повернуть примитив как угодно - например (210 1.0 0.0 0.0) повернет примитив вдоль оси x, хотя и с некоторыми оговорками - надо контролировать поворот примитива вокруг нормали.

Вопрос в другом. Важна наглядность, как с командой ROTATE. То есть в процессе поворота с помощью мыши примитив вращается вместе с курсором, пока щелчком не будет указан угол. Можно было бы задать цикл, в котором командой типа getangle считывался бы угол и в соответствии с этим выполнялось обновление примитива. Но:
1. getangle требует "второго" щелчка для получения угла
2. возможно существует более легкий способ обеспечения наглядности

Если есть команда, которая считывала бы положение курсора с учетом привязок без клика - буду безмерно признателен

Последний раз редактировалось eugen81, 03.02.2009 в 12:08.
eugen81 вне форума  
 
Автор темы   Непрочитано 03.02.2009, 12:54
#7
eugen81

ООО Предприятие "Ирбис"
 
Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
<phrase 1=


Чтоб легче было понять, что мне нужно, опишу то, над чем я работаю.
Необходимо изобразить в акаде ИТП (индивидуальный тепловой пункт). То есть рисую трубы, вставляю фланцы, задвижки и прочую аттрибутику.
так как это приходится делать довольно часто, то ручное рисование труб и вставка блоков с арматурой быстро надоело.

Задача сводится к следующему:
Запускаю программу, начинаю рисование скажем с ввода теплотрассы, то есть трубы. Задаем начальное направление оси и рисуем. После того, как нарисовал трубу программа через контекстное меню предлагает вставить объект (фланец, отвод, переход и т.д.) соответствующий условному диаметру.

Допустим выбрали фланец. Его я вставляю в качестве блока из файла через (VL-CMDF "INSERT"...) (каюсь, не люблю я вызывать команды акада из лиспа, но другого выхода не вижу). В файле фланец ориентирован осью по оси z.
Соответственно в чертеже фланец должен быть ориентирован по оси трубы, для чего я корректирую группу 210. Затем нужно повернуть фланец вокруг оси. Причем так, чтобы я мог контролировать вращение визуально в реальном времени, а не по факту ввода значения угла.
eugen81 вне форума  
 
Непрочитано 03.02.2009, 14:00
#8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


>eugen81

Управление вектором нормали, недостаточно для задания ориентирования объекта.
Дело в том, что одну и ту же плоскость, можно задать двумя противоположными векторами. При вычислении необходимого вектора программно, не удается правильно расположить объект в пространстве, используя только вектор нормали. После поворота плоскости объекта, расположение внутренней ориентации объекта в данной плоскости меняется. Приходится еще использовать вращение в этой плоскости. Не советую пытаться расположить блок, примитив или другой объект в пространстве, используя только вектор нормали. Сразу разрабатывай программу, умеющую определять необходимый угол поворота в нужной плоскости в пространстве, относительно произвольной точки.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.02.2009, 15:04
#9
eugen81

ООО Предприятие "Ирбис"
 
Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
<phrase 1=


Я некорректно выразил свою просьбу вектором нормали я задаю только "ось" объекта. На примере того же фланца - добиваюсь, чтобы его зеркало смотрело по оси в нужную мне сторону. А затем корректирую положение объекта вокруг этой оси путем изменения групп... эххх, справочника рядом нет... в общем нужная ориентация объекта получается без каких-то проблемм.

Вопрос-то в том, есть ли аналог команды ROTATE (или как его самому сделать), позволяющий повернуть объект с отслеживанием по указанной оси.
Просто специфика работы такая, что просто вводить градусы с клавиатуры не всегда удобно, так как трубы могут идти как угодно.

Я пытаюсь написать программу, которая была бы удобна не только для меня, но и для другого проектировщика. Поэтому необходима максимальная интерактивность.

Последний раз редактировалось eugen81, 03.02.2009 в 15:38.
eugen81 вне форума  
 
Непрочитано 03.02.2009, 16:10
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от eugen81 Посмотреть сообщение
Я пытаюсь написать программу, которая была бы удобна не только для меня, но и для другого проектировщика. Поэтому необходима максимальная интерактивность.
Тогда, для начала, напиши предполагаемую тобой последовательность действий пользователя. Например, сначала указываем объекты, потом первую точку оси поворота, потом вторую... А в это время, объекты начинают вращаться вслед... Резиновая нить, показывает направление... итд.

Думаю, после этого, будет понятна твоя задумка и уменьшится количество вариантов, как это сделать.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.02.2009, 16:20
#11
eugen81

ООО Предприятие "Ирбис"
 
Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
<phrase 1=


Именно так, объект вращается вслед за резиновой нитью. И поворачивать вокруг оси его нужно сразу после создания. Ось поворота - это вектор нормали блока. Все объекты в собраной мной базе ориентированы именно по нормали. При вставке блока сразу же меняется группа 210

Последний раз редактировалось eugen81, 03.02.2009 в 17:19.
eugen81 вне форума  
 
Непрочитано 03.02.2009, 17:07
#12
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от eugen81 Посмотреть сообщение
Именно так, объект вращается вслед за резиновой нитью. И поворачивать его нужно сразу после создания
Какого еще создания?
Давай, рассказывай, начиная от сотворения мира.
Я точно не буду писать программы, основываясь на кусочках информации....
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.02.2009, 17:20
#13
eugen81

ООО Предприятие "Ирбис"
 
Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
<phrase 1=


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Какого еще создания?
От создания объекта
eugen81 вне форума  
 
Непрочитано 03.02.2009, 17:39
#14
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


eugen81, перечитал тему сначала, понял.
Сейчас сделаю примерчик, программы, только выложи мне пример блока - задвижки какой нибудь, чисто для экспериментов...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 16.02.2009 в 22:26.
Елпанов Евгений вне форума  
 
Непрочитано 03.02.2009, 17:59
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Кстати, если блок сделать так, чтоб его вектор нормали и точка вставки, совпадали с осью трубы, то программа сильно упрощается - нужно просто программно вставить блок с нужным вектором нормали, а потом просто крутить его интерактивно...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 16.02.2009 в 22:26.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.02.2009, 19:08
#16
eugen81

ООО Предприятие "Ирбис"
 
Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
<phrase 1=


Именно так я и делаю) Осталось только "интерактивно покрутить"

Здесь шаровой кран Балломакс DN50 фланцевый для примера
Вложения
Тип файла: dwg
DWG 2007
64.103.050_3d.dwg (428.3 Кб, 1110 просмотров)
eugen81 вне форума  
 
Автор темы   Непрочитано 03.02.2009, 20:05
#17
eugen81

ООО Предприятие "Ирбис"
 
Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
<phrase 1=


А хотите сразу второй вопрос? где хранится информация о высоте цилиндра? я посмотрел с помощью (entget), но ничего похожего там не нашел
eugen81 вне форума  
 
Непрочитано 03.02.2009, 20:39
#18
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от eugen81 Посмотреть сообщение
А хотите сразу второй вопрос? где хранится информация о высоте цилиндра? я посмотрел с помощью (entget), но ничего похожего там не нашел
расскажи с примерами, как ты смотрел высоту и где...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 16.02.2009 в 22:25.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.02.2009, 20:50
#19
eugen81

ООО Предприятие "Ирбис"
 
Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
<phrase 1=


Простой пример:
рисую цилиндр диаметром 57мм, высотой 150мм из точки (0, 0, 0)
далее:
Код:
[Выделить все]
(entget (entlast))
В ответ на это акад выдает следующее:
Код:
[Выделить все]
((-1 . <Entity name: 7ffffb04ab0>) (0 . "3DSOLID") (330 . <Entity name: 
7ffffb039f0>) (5 . "273") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . 
"0") (100 . "AcDbModelerGeometry") (70 . 1) (1 . "mnmoo lf m mi          ") (1 
. "ni ^*+0;:,4 ^*+0\\^[ nh ^LR nmqoqnqfnj QK o  ") (1 . "n 
fqfffffffffffffffj:rooh n:rono ") (1 . ">,27:>;:- {rn rn _nn mnmqoqnqfnj |") (1 
. "=0;& {m rn {rn {l {rn {rn |") (1 . "-:9@)+r:&:r>++-6= {rn rn {rn {rn {n {k 
{j |") (1 . "3*2/ {i rn {rn {rn {h {n |") (1 . ":&:@-:961:2:1+ {rn rn _j 8-6;  
n _l +-6 n _k ,*-9 o _l >;5 o _k 8->; o _f /0,+<7:<4 o _k ,+03 
oqljggfnngfofgljgnj _k 1+03 lo _k ;,63 o _g 93>+1:,, o _h /6'>-:> o _k 72>' o 
_i 8-6;>- o _j 28-6; looo _j *8-6; o _j )8-6; o _no :1;@96:3;, |") (1 . 
"):-+:'@+:2/3>+: {rn rn l o n g |") (1 . "-:9@)+r:&:r>++-6= {rn rn {rn {rn {l 
{k {j |") (1 . ",7:33 {g rn {rn {rn {rn {f {rn {l |") (1 . "-:9@)+r:&:r>++-6= 
{rn rn {rn {rn {h {k {j |") (1 . "9><: {no rn {rn {nn {nm {h {rn {nl 90-(>-; 
,6183: |") (1 . "92:,7r:&:r>++-6= {rn rn {nk {rn {f |") (1 . "9><: {nj rn {rn 
{ni {nh {h {rn {ng 90-(>-; ,6183: |") (1 . "300/ {rn rn {rn {nf {mo {f |") (1 . 
"<01:r,*-9><: {rn rn {rn o o hj o o n mgqj o o n V V o n mgqj 90-(>-; V V V V 
|") (1 . "-:9@)+r:&:r>++-6= {rn rn {rn {no {f {k {j |") (1 . "92:,7r:&:r>++-6= 
{rn rn {mn {rn {nn |") (1 . "9><: {mm rn {rn {rn {ml {h {rn {mk 90-(>-; ,6183: 
|") (1 . "300/ {rn rn {rn {rn {mj {nn |") (1 . "/3>1:r,*-9><: {rn rn {rn o o o 
o o rn rn o o 90-(>-;@) V V V V |") (1 . "300/ {rn rn {rn {rn {mi {f |") (1 . 
"<0:;8: {rn rn {rn {mo {mo {mj {mh -:):-,:; {nm {rn |") (1 . "-:9@)+r:&:r>++-6= 
{rn rn {rn {nj {nn {k {j |") (1 . "92:,7r:&:r>++-6= {rn rn {mg {rn {ni |") (1 . 
"300/ {rn rn {rn {rn {mf {ni |") (1 . "/3>1:r,*-9><: {rn rn {rn o o njo o o n n 
o o 90-(>-;@) V V V V |") (1 . "<0:;8: {rn rn {rn {mj {mj {mo {mh 90-(>-; {nh 
{rn |") (1 . "<0:;8: {rn rn {rn {mi {mi {mf {lo -:):-,:; {nf {rn |") (1 . ":;8: 
{ln rn {rn {lm o {lm iqmglngjlohnhfjgim {mj {ll 90-(>-; _h *1410(1 |") (1 . 
"-:9@)+r:&:r>++-6= {rn rn {rn {mm {ni {k {j |") (1 . "<0:;8: {rn rn {rn {mf {mf 
{mi {lo 90-(>-; {ml {rn |") (1 . ":;8: {lk rn {rn {lj o {lj iqmglngjlohnhfjgim 
{mf {li 90-(>-; _h *1410(1 |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {mh |") 
(1 . "):-+:' {rn rn {rn {mh o {lh |") (1 . ":336/,:r<*-): {rn rn {rn o o o o o 
rn mgqj o o n V V |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {lo |") (1 . 
"):-+:' {rn rn {rn {lo o {lg |") (1 . ":336/,:r<*-): {rn rn {rn o o njo o o n 
mgqj o o n V V |") (1 . "/061+ {rn rn {rn mgqj o o |") (1 . "/061+ {rn rn {rn 
mgqj o njo |") (100 . "AcDb3dSolid") (350 . <Entity name: 7ffffb04ae0>))
Было предположение, что требуемые данные (как высота цилиндра, так и радиус) хранятся примерно в том же виде, как и вершины полилинии. Но (entget (entnext (entlast))) ничего не дало.
eugen81 вне форума  
 
Непрочитано 03.02.2009, 20:58
#20
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от eugen81 Посмотреть сообщение
Было предположение, что требуемые данные (как высота цилиндра, так и радиус) хранятся примерно в том же виде, как и вершины полилинии. Но (entget (entnext (entlast))) ничего не дало.
Правильное предположение. Просто есть несколько хитростей...
Пособие по формату файла SAT (ACIS)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 16.02.2009 в 22:25.
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp в 3D

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструирование в 3D Serz AutoCAD 87 28.10.2014 10:40
Lisp Как поставить диаметр отверстия на 3D solidе P4s8x LISP 4 06.11.2008 19:31
Как тело построенное 3D Face превратить в 3D Solid? Bdod AutoCAD 37 03.08.2006 11:36
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19