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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему макрос просчитывает одни координаты, а вырисовывает на чертеже другие?

Почему макрос просчитывает одни координаты, а вырисовывает на чертеже другие?

Ответ
Поиск в этой теме
Непрочитано 30.08.2013, 11:24 #1
Почему макрос просчитывает одни координаты, а вырисовывает на чертеже другие?
sam_n
 
Регистрация: 04.06.2013
Сообщений: 34

Вот макрос для рисования точек с заданным шагом относительно существующего текста

Код:
[Выделить все]
 ^C^C(setq a(atof(cdr(assoc 1(setq ed(entget(car(entsel"Выбери текст:"))))))) c (cdr(assoc 11 ed)));\(setq b(atof(cdr(assoc 1(setq ed(entget(car(entsel"Выбери текст:"))))))) d (cdr(assoc 11 ed)));\-цвет;1;_cal;P1=Plt(c,d,abs(5.65-a)/abs(a-b));точка;!P1;-цвет;2;_cal;P2=Plt(c,d,abs(7.69-a)/abs(a-b));точка;!P2;
То есть для случая текста значением 0 в точке (0,0,0) и значением 10 в точке (10,0,0) макрос должен нарисовать 2 точки - (5.65,0,0) и (7.69,0,0). Если поглядеть в командную строку, то о считает все правильно

Код:
[Выделить все]
Команда: -цвет

Цвет объектов по умолчанию [изПалитры/Альбом] <2 (желтый)>: 1

Команда: _cal
>> Выражение: P1=Plt(c,d,abs(5.65-a)/abs(a-b))
5.65,0,0

Команда: точка

Текущие режимы точек:  PDMODE=3  PDSIZE=0.0000
Укажите точку: !P1
(5.65 0.0 0.0)

Команда: -цвет

Цвет объектов по умолчанию [изПалитры/Альбом] <1 (красный)>: 2

Команда: _cal
>> Выражение: P2=Plt(c,d,abs(7.69-a)/abs(a-b))
7.69,0,0

Команда: точка

Текущие режимы точек:  PDMODE=3  PDSIZE=0.0000
Укажите точку: !P2
(7.69 0.0 0.0)
Но вот на самом чертеже точки рисуются с координатами (5,0,0) и (10,0,0)... Не могу понять в чем дело.

Изображения
Тип файла: jpg Безымянный.jpg (18.2 Кб, 205 просмотров)


Последний раз редактировалось sam_n, 30.08.2013 в 11:33.
Просмотров: 4267
 
Непрочитано 30.08.2013, 12:28
#2
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


А попробуй привязки отключить...
Sleekka вне форума  
 
Непрочитано 30.08.2013, 12:40
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Вот ещё что может влиять:

Миниатюры
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 227
Размер:	12.8 Кб
ID:	110860  
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 30.08.2013, 12:50
#4
sam_n


 
Регистрация: 04.06.2013
Сообщений: 34


Sleekka, ведь когда чертишь с включенным "Шагом", все-равно можно вводить координаты с клавиатуры сколько угодно кривые и и все будет нормально отрисовываться, но для достоврености увеличил пример в 100 раз. Ничего не изменилось.

hwd, тоже не помогло.
sam_n вне форума  
 
Непрочитано 30.08.2013, 13:37
#5
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Текущая ПСК?
trir вне форума  
 
Автор темы   Непрочитано 30.08.2013, 13:39
#6
sam_n


 
Регистрация: 04.06.2013
Сообщений: 34


trir, Мировая СК.
sam_n вне форума  
 
Непрочитано 02.09.2013, 23:31
#7
Иванов Дмитрий


 
Регистрация: 28.09.2010
Сообщений: 55


Недавно начал осваивать функции ActiveX. Например vla-Add... позволяют рисовать примитивы независимо от привязок и полярного отслеживания. Вот пример тестового кода для рисования примитивов 3dface разных цветов:
Код:
[Выделить все]
 (defun c:1 (/ obj n n1 l le col1)
  (vl-load-com)
  (setq obj (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
  (setq n  0
        n1 0
        l  50
        ) ;_ end of setq
  (while (< n l)
    (setq n1 0)
    (while (< n1 l)
      (setvar "cecolor" (itoa (fix (+ 3 (* 2 (sin (sqrt (+ (expt (+ 1.0 n) 2) (expt (+ 1.0 n1) 2)))))))))
      (vla-add3dface obj
                     (vlax-3d-point (list (+ 0.0 n) (+ 0.0 n1) (sin (sqrt (+ (expt (+ 0.0 n) 2) (expt (+ 0.0 n1) 2))))))
                     (vlax-3d-point (list (+ 1.0 n) (+ 0.0 n1) (sin (sqrt (+ (expt (+ 1.0 n) 2) (expt (+ 0.0 n1) 2))))))
                     (vlax-3d-point (list (+ 1.0 n) (+ 1.0 n1) (sin (sqrt (+ (expt (+ 1.0 n) 2) (expt (+ 1.0 n1) 2))))))
                     (vlax-3d-point (list (+ 0.0 n) (+ 1.0 n1) (sin (sqrt (+ (expt (+ 0.0 n) 2) (expt (+ 1.0 n1) 2))))))
                     ) ;_ end of vla-Add3DFace
      (setq n1 (1+ n1))
      ) ;_ end of while
    (setq n (1+ n))
    ) ;_ end of while
  ) ;_ end of defun
К тому же работает гораздо быстрее чем command "_..." и vl-cmdf "_..."

Последний раз редактировалось Кулик Алексей aka kpblc, 03.09.2013 в 09:00.
Иванов Дмитрий вне форума  
 
Непрочитано 02.09.2013, 23:34
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


entmake работает быстрее чем command и ActiveX...
А ActiveX лучше всего сочетается с VBA
А есть ещё dotNet и ObjectArx
trir вне форума  
 
Непрочитано 03.09.2013, 00:08
#9
Иванов Дмитрий


 
Регистрация: 28.09.2010
Сообщений: 55


entmake имеет, например, такой вид:
(entmake '( (0 . "3DFACE") (8 . "0") (62 . 1) (10 0.0 0.0 0.0) (11 1.0 0.0 0.841471) (12 1.0 1.0 0.987766) (13 0.0 1.0 0.841471)))
Но мои попытки ввести в него данные в виде переменных не увенчались успехом. Например чтобы координаты этого 3dface-а прочитать из переменной вида (setq point_1 (list coord_x coord_y coord_z)). Он даже не воспринимает запись (setq x 0.0), а потом в самом entmake '...(10 x 0.0 0.0)... - ошибка
Иванов Дмитрий вне форума  
 
Непрочитано 03.09.2013, 00:25
#10
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
а потом в самом entmake '...(10 x 0.0 0.0)... - ошибка
У вас список не вычисляется, поэтому х - то х, а не 0.0, вот и ошибка, используйте в таких случаях cons - (cons 10 (list x 0.0 0.0))

Цитата:
(setq x 0.0)
0.0
(cons 10 (list x 0.0 0.0))
(10 0.0 0.0 0.0)
gomer вне форума  
 
Непрочитано 03.09.2013, 00:47
#11
Иванов Дмитрий


 
Регистрация: 28.09.2010
Сообщений: 55


Теперь получается, но только цвет не работает:
(entmake '( (0 . "3DFACE") (8 . "0") (cons 62 x1) (cons 10 (list x 0.0 0.0)) (11 1.0 0.0 0.841471) (12 1.0 1.0 0.987766) (13 0.0 1.0 0.841471)))
Здесь перед этой строкой задано (setq x1 3), а фраза (cons 62 x1) не воспринимается. При этом (62 . 3) - все нормально, объект рисуется зеленым
Иванов Дмитрий вне форума  
 
Непрочитано 03.09.2013, 07:38
#12
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
Теперь получается
Да? Мда... У вас брикскад? У вас список не вычисляется...
gomer вне форума  
 
Автор темы   Непрочитано 03.09.2013, 08:13
#13
sam_n


 
Регистрация: 04.06.2013
Сообщений: 34


Мда, а видимо по теме никто не скажет ничего?
sam_n вне форума  
 
Непрочитано 03.09.2013, 09:01
#14
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от gomer Посмотреть сообщение
список не вычисляется
И не вычислится. Потому что надо (как минимум)
Код:
[Выделить все]
 (entmake (list '(0 . "3DFACE")
               '(8 . "0")
               (cons 62 x1)
               (cons 10 (list x 0.0 0.0))
               '(11 1.0 0.0 0.841471)
               '(12 1.0 1.0 0.987766)
               '(13 0.0 1.0 0.841471)
               ) ;_ end of list
         ) ;_ end of entmake
sam_n, тебе еще в #2 ответили. Привязка и шаг (ну так, для справки) - разные понятия.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.09.2013, 09:21
#15
sam_n


 
Регистрация: 04.06.2013
Сообщений: 34


Кулик, упс)
sam_n вне форума  
 
Непрочитано 03.09.2013, 09:34
#16
Иванов Дмитрий


 
Регистрация: 28.09.2010
Сообщений: 55


Действительно, entmake очень быстро работает. Та же задача, только с использованием entmake:
(defun c:5 (/ n n1 l col1)
(setq n 0 n1 0 l 50)
(while (< n l)
(setq n1 0)
(while (< n1 l)
(setq col1 (fix (+ 3 (* 2 (sin (sqrt (+ (expt (+ 1.0 n) 2) (expt (+ 1.0 n1) 2))))))))
(entmake (list '(0 . "3DFACE") '(8 . "0")
(cons 62 col1)
(cons 10 (list (+ 0.0 n) (+ 0.0 n1) (sin (sqrt (+ (expt (+ 0.0 n) 2) (expt (+ 0.0 n1) 2))))))
(cons 11 (list (+ 1.0 n) (+ 0.0 n1) (sin (sqrt (+ (expt (+ 1.0 n) 2) (expt (+ 0.0 n1) 2))))))
(cons 12 (list (+ 1.0 n) (+ 1.0 n1) (sin (sqrt (+ (expt (+ 1.0 n) 2) (expt (+ 1.0 n1) 2))))))
(cons 13 (list (+ 0.0 n) (+ 1.0 n1) (sin (sqrt (+ (expt (+ 0.0 n) 2) (expt (+ 1.0 n1) 2))))))
))
(setq n1 (1+ n1))
)
(setq n (1+ n))
)
)
2500 примитивов рисуются в мгновение ока. Если и в брикскаде будет также быстро работать, то это замечательно
Иванов Дмитрий вне форума  
 
Непрочитано 03.09.2013, 15:11
#17
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
2500 примитивов рисуются в мгновение ока. Если и в брикскаде будет также быстро работать, то это замечательно
в брикскаде будет работать в 6 раз быстрее.
Sleekka вне форума  
 
Непрочитано 03.09.2013, 16:22
#18
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Sleekka Посмотреть сообщение
в брикскаде будет работать в 6 раз быстрее.
нет всего лишь в 4 раза
gomer вне форума  
 
Непрочитано 03.09.2013, 16:33
#19
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Сообщение от gomer Посмотреть сообщение
нет всего лишь в 4 раза
по entmake - да в 4 раза, vl-функции в 10 раз быстрее. (это не только заявления производителя, а проверено на собственном софте). А так как скорость лиспа зависит в основном от vl-sort все остальное не особо важно, то для путячих лиспов средний прирост производительности в 6 раз.
Sleekka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему макрос просчитывает одни координаты, а вырисовывает на чертеже другие?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с макросом -dataextraction Composter AutoCAD 11 26.02.2015 11:37
Помогите разобраться с макросом Ubivec81 Программирование 3 12.04.2011 16:06
Помогите с макросом. Spiteful Berkut Программирование 3 27.01.2011 11:22
Помогите с макросом Размеры на определенном расстоянии Composter AutoCAD 8 25.11.2008 16:55
Спецы по DIESEL - помогите с макросом VetalBY Программирование 7 19.09.2005 17:07