Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум 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.
Просмотров: 13319
 
Непрочитано 02.02.2009, 23:58
#2
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<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
С.-Петербург
Сообщений: 39,849


группы 220 и 230 появляются только в DXF-формате. В ename-представлении они есть необязательно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.02.2009, 00:13
#5
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<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,439
Отправить сообщение для Елпанов Евгений с помощью 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,439
Отправить сообщение для Елпанов Евгений с помощью 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,439
Отправить сообщение для Елпанов Евгений с помощью 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,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


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

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

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью 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 Кб, 1116 просмотров)
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,439
Отправить сообщение для Елпанов Евгений с помощью 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,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


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

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

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


ах-х-х!!! страница временно недоступна!
eugen81 вне форума  
 
Непрочитано 03.02.2009, 21:18
#22
Елпанов Евгений

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


eugen81, лови..
Вложения
Тип файла: rar satmanual.rar (754.7 Кб, 120 просмотров)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

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

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


Спасибо) с английским я не очень, но разберусь
eugen81 вне форума  
 
Непрочитано 04.02.2009, 11:48
#24
zamtmn

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


http://www.cad.bmstu.ru/index.php?vi...tent&Itemid=25

вот на руском чуток по ACIS
zamtmn вне форума  
 
Автор темы   Непрочитано 04.02.2009, 11:59
#25
eugen81

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


Спасибо. Так хоть быстрее войду в курс дела
eugen81 вне форума  
 
Непрочитано 04.02.2009, 12:06
#26
zamtmn

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


>>eugen81
если не секрет нафига связался с солидами?
zamtmn вне форума  
 
Автор темы   Непрочитано 04.02.2009, 12:21
#27
eugen81

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


Не секрет. Если я собираюсь писать приложение, которое, возможно, претендует на полноценную надстройку к автокаду, то азы 3д я точно должен знать
Да и вопрос собственно встает таким образом. Труба - это ведь цилиндр, хоть и условно. Для выполнения модели теплового узла - вполне достаточно. Остается проблема программного изменения параметров этой трубы - диаметра, длины, расположения в пространстве.
И если я уж начал оперировать блоками на таком уровне, что вставляю, ориентирую, выдергиваю атрибуты через функции доступа к примитивам, то желательно и параметрами других солидов начиться управлять на том же уровне

Последний раз редактировалось eugen81, 04.02.2009 в 12:30.
eugen81 вне форума  
 
Непрочитано 04.02.2009, 12:23
#28
zamtmn

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


3d и солиды между собой не связаны. вполне можно обойтись без них
zamtmn вне форума  
 
Непрочитано 04.02.2009, 12:30
#29
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


eugen81, ты идешь в неверном направлении, зайдешь в темный лес SAT, а результата не будет.

Хочешь всерьез сделать 3D хотя бы для труб и всего, что с ними связано? Не заморачивайся с DXF-кодами!

Покажу несколько картинок. Всё, что там смоделировано - только на LISP, там нет вообще блоков, только солиды. Даже насос - один солид. Нигде DXF-кодов применять не пришлось.

Вот на чем сосредотачивай усилия:

1. Библиотека функций для 3D, основанная на векторах. Чтоб любую точку в пространстве можно было определить так же просто, как с помощью polar на плоскости.

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

3. Стыковка элементов. Если уже есть труба, а на ней надо поставить задвижку, задвижка должна полуавтоматом пристыковаться к концу трубы, а потом уже у неё интерактивно надо задать направление шпинделя. Именно визуальным вращением, только в 3D и вокруг оси трубы. Если уже есть труба, и под неё надо подставить опору (см. рис), то надо только указать точку на оси трубы (ось должна быть, а саму трубу надо уметь на этот момент скрыть ( чтоб ось увидеть), и опора должна сама нарисоваться вниз на заданную высоту.

Вот в этом направлении надо усилия направлять.
Миниатюры
Нажмите на изображение для увеличения
Название: chamber_005.jpg
Просмотров: 128
Размер:	55.5 Кб
ID:	15526  Нажмите на изображение для увеличения
Название: pump_004.jpg
Просмотров: 108
Размер:	62.5 Кб
ID:	15527  Нажмите на изображение для увеличения
Название: ru_3d_pole.jpg
Просмотров: 108
Размер:	29.5 Кб
ID:	15528  Нажмите на изображение для увеличения
Название: ru_3d_pump_k.jpg
Просмотров: 101
Размер:	15.6 Кб
ID:	15529  Нажмите на изображение для увеличения
Название: ru_xml_ballorex.png
Просмотров: 106
Размер:	21.8 Кб
ID:	15530  

ShaggyDoc вне форума  
 
Непрочитано 04.02.2009, 12:31
#30
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от zamtmn Посмотреть сообщение
3d и солиды между собой не связаны. вполне можно обойтись без них
Очень глубокая мысль....Читал...Долго думал....
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 04.02.2009, 13:03
#31
eugen81

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


ShaggyDoc, именно этого я и хочу добиться. Я лиспом начал заниматься только три месяца назад и то с большими перерывами ввиду большой загруженности на работе.
Управление блоком через DFX коды показалось мне довольно удобным. Из блока с помощью DFX я легко выдергиваю атрибуты, в которых записан условный диаметр той же задвижки, ее монтажная длина, с помощью которой программно вычисляется точка вставки следующего объекта.
И хоть меню выбора объекта у меня не так красиво как у вас но выбор происходит только из Ду предыдущего объекта. То есть если труба была Ду50, то я не смогу вставить задвижку DN80 без перехода.
Мне кажется, блоки тем и хороши, что позволяют хранить необходимую информацию внутри самого блока. Но к сожалению трубу, у которой изменяемая длина, я не могу вставить блоком. Знаний пока мало. Поэтому и залез в солиды.
eugen81 вне форума  
 
Автор темы   Непрочитано 04.02.2009, 13:15
#32
eugen81

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


ShaggyDoc, не могли бы вы показать кусок рабочего кода, где к концу трубы вы вставляете задвижку и ориентируете ее вокруг оси?
eugen81 вне форума  
 
Автор темы   Непрочитано 04.02.2009, 13:37
#33
eugen81

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


И еще:
Допустим, что необходимо укоротить какой-то кусок трубы, после которой вы повесили арматуру и еще много всякого добра. То есть после укорачивания так же должны будут сдвинуться по оси все объекты. Каким образом вы это реализуете, используя солиды?
eugen81 вне форума  
 
Непрочитано 04.02.2009, 14:07
#34
zamtmn

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


>>Очень глубокая мысль....Читал...Долго думал...
ИМХО. солиды в автокаде вещь не родная. имеется для "галочки"
по вашему работать с 3д - везде где надо и не надо тыкать солиды?

>>Покажу несколько картинок. Всё, что там смоделировано - только на
>>LISP, там нет вообще блоков, только солиды. Даже насос - один
>>солид. Нигде DXF-кодов применять не пришлось.
вот именно - картинок. при таком подходе возникнут сложности с хранением неграфической информации - dy труб у вас где хранится? а если понадобится чтото поменять - колено в трубу какуюнибудь врезать? солид заново пересоздавать?
zamtmn вне форума  
 
Непрочитано 04.02.2009, 14:32
#35
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от eugen81 Посмотреть сообщение
ShaggyDoc, не могли бы вы показать кусок рабочего кода, где к концу трубы вы вставляете задвижку и ориентируете ее вокруг оси?
Без проблем. Если поможет:

Код:
[Выделить все]
(ru-3d-valve-gate-simple  (ru-3d-pipe-flange-std-100-16)  230.0 523 200)
Это задвижка Ду 100. Такой код вставлен в меню (иллюстрация в моем предыдущем посте). Вот этот код и прилепляет здавижку к трубе и вращает её. Если понадобится, допустим, задвижка Ду 200, то уже обычный пользователь уровня "смышленая тетка" скопирует эту строчку, исправит аргументы и будет уже иметь и программу моделирования задвижки Ду 200:

Код:
[Выделить все]
(ru-3d-valve-gate-simple  (ru-3d-pipe-flange-std-200-16)  330.0 900 280)
А вот чтобы добиться такой конечной простоты, надо начинать с того, что я написал в #29 - делать библиотеку функций, а не мучиться с частным случаем.

Если я начну сейчас расшифровывать приведенные высокоуровневые функции до самого "низа", т.е. до штатных средств Автокада, это будет длинная цепочка и займет много страниц. Это более 400 связанных между собой отдельных функций, каждая из которых делает своё дело.

Сам момент вращения очень прост:

Код:
[Выделить все]
(vl-cmdf "_.ROTATE" selection "" (trans pnt 0 1) pause)
А вот его окружение, "предварительные ласки", чтобы обычная команда ROTATE заработала в 3D, да как надо - требует дополнительных функций-оболочек.

Код:
[Выделить все]
Допустим, что необходимо укоротить какой-то кусок трубы, после которой вы повесили арматуру и еще много всякого добра. То есть после укорачивания так же должны будут сдвинуться по оси все объекты. Каким образом вы это реализуете, используя солиды?
А я это и не реализую. "Я не буду глотать столько попугаев".

Подобные вещи реализуются только при использовании CUSTOM-объектов на ObjectARX. Создается не просто 3DSOLID, а совершенно новый класс, отсутствующий в "голом" AutoCAD - под названием, например, PIPE. Такой объект имеет свойства наподобие наружного диаметра, толщины стенки, длины. А также обладает способностью изменять свою геометрию при сдвижке смежных объектов. А смежные объекты, такие как СТЕНА, умеют "протыкаться" при прохождении через них трубы. Это продукты класса MEP, ADT, ABS (куча, меняющая свои названия по мере развития).

Но, если мы можем построить трубу средствами обычного LISP одним щелчком по оси трубы, так нам, при изменении геометрии проще эту трубу стереть, укоротить или удлинить ось, а потом одним щелчком заново построить.
ShaggyDoc вне форума  
 
Непрочитано 04.02.2009, 14:42
#36
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от zamtmn Посмотреть сообщение
по вашему работать с 3д - везде где надо и не надо тыкать солиды?
Я разве написал, что надо втыкать, куда не надо? "Втыкать" вообще надо только то, "что надо" и "куда надо". Если кто-то куда-то не туда втыкает, не надо подозревать других

Цитата:
вот именно - картинок. при таком подходе возникнут сложности с хранением неграфической информации - dy труб у вас где хранится? а если понадобится чтото поменять - колено в трубу какуюнибудь врезать? солид заново пересоздавать?
Родной, сделай такие картинки, покажи, а потом и поговорим. И про где что хранится, где Ду, где Ру, и про подходы, и про отходы, и как врезать.
ShaggyDoc вне форума  
 
Непрочитано 04.02.2009, 14:47
#37
zamtmn

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


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

Для создания таких картинок есть гораздо более удобные средства чем автокад+лисп. Ни сколько не умаляю Ваших трудов при разрабоке программы, но это не более чем красивые картинки
zamtmn вне форума  
 
Автор темы   Непрочитано 04.02.2009, 15:27
#38
eugen81

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


Давайте только не будем устраивать войну из-за различных подходов к моделированию

ShaggyDoc: на мой взгляд работа с блоками и DFX кодами тем и удобна, что удобно хранить и извлекать неграфическую информацию из самих объектов. Можно было бы хранить ее, скажем, в отдельной базе данных, но тогда возникла бы проблема синхронизации этой базы с солидами.
Так же возникает вопрос. Открываем новый чертеж проекта, который необходимо наполнить. Как я понял, все ваши солиды формируются на ходу, то есть каждый раз обсчитываются при вставке.
Тогда опять возникает проблема, которая часто имеет место в процессе создания проекта. Заказчик вдруг понимает, что на устанавливаемое оборудование у него не хватает денег, просит вставить что-нибудь попроще. А это что-то попроще вдруг имеет другие установочные размеры. Или что еще хуже - делать реконструкцию узла, когда здание разобрано на половину. По рабочему проекту строителей планировка помещения будет такая, а на самом деле сделают все по другому.
А вручную перерисовывать трубы и другую атрибутику в новых местах - это, извините, геморой, от которого руки опускаются.
Моя цель - тупо в списке оборудования меняешь объект на новый, указываешь мышью объекты, которые необходимо подвинуть, и просто говоришь программе "действуй".
В случае использования DFX - правятся нужные группы и все. они сами встали на свое место. при использованиии солидов - приходится перерисовывать все заново.
Да и код, если его развернуть до функций автокада с использованием DFX и готовых блоков занимает гораздо меньше места, чем вы сказали, что облегчает его проверку и модификацию в случае необходимости.

Но с другой стороны есть и такие ситуации, где блоки, как и DFX коды бесполезны, или по крайней мере применять их было бы делом не оправдывающим себя. Так что всегда надо искать компромисс

Последний раз редактировалось eugen81, 04.02.2009 в 19:47.
eugen81 вне форума  
 
Автор темы   Непрочитано 04.02.2009, 15:30
#39
eugen81

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


А за ObjectARX - отдельное спасибо. Обязательно посмотрю, что это такое
eugen81 вне форума  
 
Непрочитано 04.02.2009, 21:28
#40
Кулик Алексей aka kpblc
Moderator

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


Неграфическую информацю как из DXF кодов извлекать - удовольствие весьма сомнительное (сугубо ИМХО). Особенно учитывая непредсказуемый объем информации.
По задаче работы с трубами и арматурой: если ты еще не сильно завязан на AutoCAD, посмотри AutoCAD MEP или Revit MEP. Времени на изучение потратишь вряд ли больше, но большинство "хотелок" там реализовано, как мне кажется.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.02.2009, 21:58
#41
eugen81

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


Кулик Алексей aka kpblc, спасибо за совет

И все же, вопрос остается открытым: Необходимо повернуть/переместить объект вокруг/вдоль заданной оси мышью с отслеживанием положения.
eugen81 вне форума  
 
Автор темы   Непрочитано 04.02.2009, 22:10
#42
eugen81

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


Кулик Алексей aka kpblc, по крайней мере извлечение до сих пор необходимой мне информации (в основном атибуты блоков и, собственно, имен примитивов для построения спецификаций) не представляло проблем, потому что информация эта находилась во вполне ожидаемых местах и в необходимом объеме. Функцию для вытаскивания атрибутов при почти полном отсутствии опыта программирования в лисп написал и отладил за 15 минут. Проблемой было определить местоположение этой информации, так как справочник ввиду его специфичности удалось приобрести много позже.
Если кому интересно выкладываю код функции. Сразу оговорюсь - атрибуты в блоке для удобства имеют вид "Dy 50" "L 150"
Код:
[Выделить все]
; Функция извлечения данных из только что вставленного блока
(DEFUN GETDATA (/ ATTR ENAME DATA NAME TABLE INC_ENAME INC_TYPE INC_DATA ATTR)
  (SETQ ATTR nil)
  ; Получаем имя только что загруженного примитива
  (SETQ ENAME (ENTLAST))
  ; Получаем данные примитива
  (SETQ DATA (ENTGET ENAME))
  ; Выделяем имя блока
  (SETQ NAME (CDR (ASSOC 2 DATA)))
  ; Ищем это имя в таблице блоков
  (SETQ TABLE (TBLSEARCH "BLOCK" NAME))
  ; Выделяем имя первого вхождения в блок
  (SETQ INC_ENAME (CDR (ASSOC -2 TABLE)))
  ; Запускаем цикл, в котором ищем вхождение ATTDEF
  (WHILE (/= INC_ENAME nil)
    ; Получаем его данные
    (SETQ INC_DATA (ENTGET INC_ENAME))
    ; Выделяем тип вхождения
    (SETQ INC_TYPE (CDR (ASSOC 0 INC_DATA)))
    ; Проверяем, является ли INC_TYPE "ATTDEF". Если условие выполнено,..
    (IF (= INC_TYPE "ATTDEF")
      ; ...то создаем список, вида ("ИМЯ" <значение>)
      (SETQ ATTR (APPEND ATTR (LIST (LIST (CDR (ASSOC 2 INC_DATA)) (ATOF (CDR (ASSOC 1 INC_DATA))))))))
      ; Следующее вхождение
      (SETQ INC_ENAME (ENTNEXT INC_ENAME)))
  (SETQ BLOCK (STRCAT NAME ENAME ATTR))
  (PRINC))
eugen81 вне форума  
 
Непрочитано 04.02.2009, 22:37
#43
Кулик Алексей aka kpblc
Moderator

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


Мой слегка переделанный вариант:
Код:
[Выделить все]
(vl-load-com)

(defun get-attr-by-mask (ent mask / _kpblc-conv-vla-to-list
                         _kpblc-conv-ent-to-ename _kpblc-conv-ent-to-vla)
                        ;|
*    Получение указателей на атрибуты вхождения блока
*    Параметры вызова:
	ent	указатель на вхождение блока (ename или vla-object)
	mask	маска тэга атрибута (nil -> "*"). Регистронезависима.
*    Примеры вызова:
(get-attr-by-mask (car (Entsel "\nУкажи блок : ")) nil)	; возвращает
	; список указателей на все атрибуты указанного блока
(get-attr-by-mask (car (Entsel "\nУкажи блок : ")) "*det*")	; возвращает
	; список указателей на все атрибуты указанного блока, в тэге которых
	; содержится последовательность DET
|;

  (defun _kpblc-conv-ent-to-ename (ent_value /)
                                  ;|
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в примитив. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-ename (entlast))
(_kpblc-conv-ent-to-ename (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object)
       (vlax-vla-object->ename ent_value)
       )
      ((= (type ent_value) 'ename) ent_value)
      ((= (type ent_value) 'str) (handent ent_value))
      ((= (type ent_value) 'list) (cdr (assoc -1 ent_value)))
      (t nil)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-vla (ent_value / res)
                                ;|
*    Функция преобразования полученного значения в vla-указатель.
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в указатель. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-vla (entlast))
(_kpblc-conv-ent-to-vla (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object) ent_value)
      ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
      ((setq res (_kpblc-conv-ent-to-ename ent_value))
       (vlax-ename->vla-object res)
       )
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((listp value)
       (mapcar (function _kpblc-conv-vla-to-list) value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (member (type value) (list 'ename 'str 'vla-object))
            (setq value (_kpblc-conv-ent-to-vla value))
            (and (= (type value) 'vla-object)
                 (vlax-property-available-p value 'count)
                 ) ;_ end of and
            ) ;_ end of and
       (vlax-for sub (_kpblc-conv-ent-to-vla value)
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (if (and (setq mask (if (or (not mask) (/= (type mask) 'str))
                        "*"
                        (strcase mask)
                        ) ;_ end of if
                 ) ;_ end of setq
           (setq ent (cond
                       ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                       ((= (type ent) 'vla-object) ent)
                       (t nil)
                       ) ;_ end of cond
                 ) ;_ end of setq
           ) ;_ end of and
    (vl-remove-if-not
      (function
        (lambda (x)
          (wcmatch (strcase (vla-get-tagstring x)) mask)
          ) ;_ end of lambda
        ) ;_ end of function
      (apply (function append)
             (mapcar (function _kpblc-conv-vla-to-list)
                     (list (vla-getattributes ent)
                           (vla-getconstantattributes ent)
                           ) ;_ end of list
                     ) ;_ end of mapcar
             ) ;_ end of apply
      ) ;_ end of vl-remove-if-not
    ) ;_ end of if
  ) ;_ end of defun
Один из вариантов использования:
Код:
[Выделить все]
(mapcar (function (lambda(x) (cons (vla-get-TagString x) (vla-get-TextString x)))) (get-attr-by-mask (car (entsel "\nУкажи блок : ")) "*"))
; (("DETAIL#" . "1"))
Но основная проблема в том, что атрибутами можно сделать далеко не все. И часть информации надо скрывать от пользователя, чтобы (сознательно или нет - неважно) тот ее не поменял на любое значение, которое ему в голову придет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.02.2009, 23:02
#44
eugen81

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


Кулик Алексей aka kpblc, "слегка", говоришь? как говорил один великий человек - учиться, учиться и еще раз учиться... до activex я еще не дошел, так что многое здесь мне непонятно. Придется форсировать свое обучение. Найти бы время на все это...
eugen81 вне форума  
 
Непрочитано 04.02.2009, 23:13
#45
Кулик Алексей aka kpblc
Moderator

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


Под "слегка" имелась в виду переделка того, что у меня самого используется. Почему я предпочитаю получать указатели на атрибуты: если понадобится, можно будет "легким движением" поменять слой, цвет, тип, вес линии, стиль и еще до дури параметров
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.02.2009, 09:22
#46
eugen81

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


Кулик Алексей aka kpblc, в теме DwgRuLispLib: Получение указанного свойства объекта какие конкретно свойства объекта показываются? те, которые отражаются в Properties?
eugen81 вне форума  
 
Непрочитано 05.02.2009, 09:26
#47
Кулик Алексей aka kpblc
Moderator

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


Так там же все написано. Есть объект, есть у него запрашиваемое свойство. Например, у текста - значение строки. Для получения в свою программу вызываем (setq text (_dwgru-property-get (car (entsel)) 'textstring)) и дальше используется уже значение переменной text
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.02.2009, 11:08
#48
Елпанов Евгений

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


Наконец, нашел время на программу вставки блока с одновременным поворотом, вокруг произвольной оси...

Сама программа, выполнена в формате библиотечной функции:
Код:
[Выделить все]
(defun eea-ins-bl (a b c / D E F G L)
  ;; By ElpanovEvgeniy
  ;; 05.02.2009
  ;; for
  ;; http://forum.dwg.ru/showthread.php?t=29842
  ;;
  ;; Программа динамической вставки блока с поворотом вокруг оси.
  ;; Система координат чертежа - любая
  ;; Система координат поворачиваемого блока - любая
  ;; Во время поворота, находится точка пересечения
  ;; луча взгляда на курсор и плоскости блока.

  ;; Программа не использует VLA функции
  
  ;;a - point
  ;;b - vector
  ;;c - name block

  ;|
  Пример использования:

(defun c:test (/ a b c)
  (princ
    "\n Укажите на чертеже блок, копию которого необходимо использовать"
  )
  (if (and
	(setq c (ssget "_+.:S:E" '((0 . "insert"))))
	(setq a (getpoint "\n Укажите точку вставки блока"))
	(setq
	  b (getpoint "\n Укажите точку в направлении оси построений")
	)
      )
    (eea-ins-bl
      a
      (mapcar '- b a)
      (cdr (assoc 2 (entget (ssname c 0))))
    )
  )
)
  |;
  (if (tblobjname "block" c)
    (progn
      (entmake
	(list
	  '(0 . "INSERT")
	  '(100 . "AcDbEntity")
	  '(410 . "Model")
	  (cons 8 c)
	  '(100 . "AcDbBlockReference")
	  (cons 2 c)
	  (cons 10 (trans a 1 (trans b 1 0 t)))
	  '(50 . 0.)
	  (cons 210 (trans b 1 0 t))
	)
      )
      (setq e (ssname (ssget "_l") 0)
	    l (entget e)
      )
      (while (= (car (setq g (grread nil 5 0))) 5)
	(setq
	  d (mapcar '- (trans (cadr g) 1 e t) (trans a 1 e t))
	  f (mapcar '+ (trans '(0 0 1000.) 2 e t) d)
	  l
	    (entmod
	      (subst
		(cons 50
		      (angle
			'(0 0 0)
			(inters	d
				f
				(list (car d) (cadr d) 0)
				(list (car f) (cadr f) 0)
				nil
			)
		      )
		)
		(assoc 50 l)
		l
	      )
	    )
	)
	(redraw)
	(grdraw a (cadr g) 1)
      )
    )
  )
(redraw)
)
Пример использования программы:
Код:
[Выделить все]
(defun c:test (/ a b c)
  (princ
    "\n Укажите на чертеже блок, копию которого необходимо использовать"
  )
  (if (and
	(setq c (ssget "_+.:S:E" '((0 . "insert"))))
	(setq a (getpoint "\n Укажите точку вставки блока"))
	(setq
	  b (getpoint "\n Укажите точку в направлении оси построений")
	)
      )
    (eea-ins-bl
      a
      (mapcar '- b a)
      (cdr (assoc 2 (entget (ssname c 0))))
    )
  )
)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 14.02.2009 в 23:31.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 05.02.2009, 12:21
#49
eugen81

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


Вот за это - огромное человеческое спасибо! вечером буду разбираться в коде
eugen81 вне форума  
 
Автор темы   Непрочитано 06.02.2009, 09:53
#50
eugen81

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


Вот только еще один вопрос. Как заставить функцию grread считывать значения с учетом привязок?
eugen81 вне форума  
 
Непрочитано 06.02.2009, 13:46
#51
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


http://www.caduser.ru/cgi-bin/f1/board.cgi?t=36171KD
Donhuan вне форума  
 
Автор темы   Непрочитано 06.02.2009, 14:38
#52
eugen81

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


Donhuan, Спасибо!
eugen81 вне форума  
 
Непрочитано 06.02.2009, 14:46
#53
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Еще здесь:
http://www.caduser.ru/cgi-bin/f1/board.cgi?t=20084JC
Donhuan вне форума  
 
Автор темы   Непрочитано 14.02.2009, 16:05
#54
eugen81

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


Подскажите в чем проблема:
В свойствах блока, вставляемого из файла, код 10 содержит координаты базовой точки, иначе точку начала координат в СК блока. Вроде так?
На скрине показан такой блок с измененными кодами 10, 50 и 210. код 10 блока содержит координаты (10 -129.273 91.8469 0.0), а на рисунке базовая точка находится в точке 0.0 -129.273 91.846. Как такое может быть?
До этого у блока менялись коды 50 и 210. Может быть в результате этого произошло смещение СК блока?

Заранее спасибо!

P.S., догадался, вошел в режим редактирования блока, посомотрел - там все как было, все на месте

В общем почему-то координаты точки в группе 10 отображаются со смещением - вместо X показывает Y, вместо Y - Z, соответственно вместо Z - X.
Миниатюры
Нажмите на изображение для увеличения
Название: dwg.png
Просмотров: 117
Размер:	54.3 Кб
ID:	16088  

Последний раз редактировалось eugen81, 14.02.2009 в 16:48.
eugen81 вне форума  
 
Непрочитано 14.02.2009, 18:43
#55
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от eugen81 Посмотреть сообщение
В общем почему-то координаты точки в группе 10 отображаются со смещением - вместо X показывает Y, вместо Y - Z, соответственно вместо Z - X.
Во первых в начале проверь соответствие UCS (ПСК), все dxf коды возвращаються в мировой системе (для перевода используй (trans...)), во вторых, как в твеом случае, у тебя вероятно изменен 210 атрибут, вместо (0 0 1) показывает (1 0 0) - а 210 это простыми словами единичный вектор направления оси Z вхождения блока относительно мировой системы координат, кстати если его изменяешь не обязательно приравнивать к единице автокад и так проглатывает.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.02.2009, 19:54
#56
zamtmn

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


>>Может быть в результате этого произошло смещение СК блока?
у тебя система координат блока повернута, z направлен по x wcs. такчто все верно, почитай в справке как считается ск объектов в разделе Arbitrary Axis Algorithm
zamtmn вне форума  
 
Автор темы   Непрочитано 15.02.2009, 11:16
#57
eugen81

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


Спасибо! С помощью trans все отлично получилось
eugen81 вне форума  
 
Автор темы   Непрочитано 21.02.2009, 11:18
#58
eugen81

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


Елпанов Евгений, в вашем коде там, где вы вычисляете переменную f, точка (0 0 1000) переводится из ЭСК в СК блока. Объясните пожалуйста, почему именно "1000"?
eugen81 вне форума  
 
Непрочитано 21.02.2009, 22:40
#59
Елпанов Евгений

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


Цитата:
Сообщение от eugen81 Посмотреть сообщение
Объясните пожалуйста, почему именно "1000"?
Это не именно "1000", а просто 1000.
Если не нравится 1000, замените на другое число, например 38...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 22.02.2009, 08:44
#60
eugen81

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


Понятно. Тогда следующий вопрос Как использовать 3dorbit, не прерывая исполнение программы?
eugen81 вне форума  
 
Непрочитано 22.02.2009, 09:12
#61
Елпанов Евгений

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


Цитата:
Сообщение от eugen81 Посмотреть сообщение
Понятно. Тогда следующий вопрос Как использовать 3dorbit, не прерывая исполнение программы?
Можно использовать свой аналог программы 3dOrbit.
Можно взять отсюда.

__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 22.02.2009, 12:03
#62
Кулик Алексей aka kpblc
Moderator

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


<...> Удалено
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.02.2009, 17:38
#63
eugen81

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


Спасибо!
eugen81 вне форума  
Ответ
Вернуться   Форум 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