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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Точность чисел возращаемых LISP ActiveX

Точность чисел возращаемых LISP ActiveX

Ответ
Поиск в этой теме
Непрочитано 27.03.2008, 19:23 #1
Точность чисел возращаемых LISP ActiveX
[N.S]
 
инженер-дефектоскопист
 
Санкт-Петербург
Регистрация: 08.12.2006
Сообщений: 58

Не могу совладать с точностью чисел возвращаемых ActiveX через LISP. Например (vlax-get obj 'Coordinates) возвращает координаты с тремя цмфрами после запятой в лучшем случае. А мне бы цифр 8 после запятой хотя б..
Что нужно настроить чтобы поднять точность?
Просмотров: 4157
 
Непрочитано 27.03.2008, 19:55
#2
Кулик Алексей aka kpblc
Moderator

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


luprec ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.03.2008, 11:23
#3
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Кулик Алексей aka kpblc
LUPREC не помогает.. LUPREC влияет на представление координат, возвращаемых непосредственно Автокадом через его собственные команды.
Например:
акад-комманда LIST возвращает
.................
at point X=3861.78817044 Y=2741.43702067 Z=0.00000000
at point X=6861.78817044 Y=2741.43702067 Z=0.00000000

а строчка (vlax-get (vlax-ename->vla-object (car (entsel))) 'Coordinates) для того же примитива возвращает

(3861.79 0.0 6861.79 0.0)

ACAD 2006

Последний раз редактировалось [N.S], 28.03.2008 в 11:35.
[N.S] вне форума  
 
Непрочитано 28.03.2008, 11:48
#4
Кулик Алексей aka kpblc
Moderator

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


А что возвращает вариант DXF? ИМХО представление не всегда критично. Попробуй, например, так:
Код:
[Выделить все]
(mapcar '(lambda (x)
           (dwgru-conv-real-to-str x 15)
           ) ;_ end of lambda
        (vlax-get (vlax-ename->vla-object (car (entsel))) 'coordinates)
        ) ;_ end of mapcar
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.03.2008, 12:10
#5
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Кулик Алексей aka kpblc, что-то лисп из предыдущего поста совсем страшное возвращает:
("788170435449.788170435449000" ".000000000000000" "78817043545.788170435450000" ".000000000000000")
на
Цитата:
at point X=3861.78817044 Y=2741.43702067 Z=0.00000000
at point X=6861.78817044 Y=2741.43702067 Z=0.00000000
совсем не похоже.. =) примитив тот же.
А представление критично, потом по этим координатам еще расчеты ведутся
[N.S] вне форума  
 
Автор темы   Непрочитано 28.03.2008, 12:13
#6
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Цитата:
"788170435449.788170435449000"
- левая часть от точки теряется счас посмотрю где косяк в dwgru фунциях
[N.S] вне форума  
 
Автор темы   Непрочитано 28.03.2008, 12:24
#7
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Нашел баг:
Цитата:
(defun dwgru-string-left-part (string delim_char)
;|......................|;
(_dwgru-string-some-part string delim_char T)
)
Баг не в фунции, а в том, что какя-то бяка переписывает мне значение T в nil. На автокаде у меня стоит еще CADWORX Plant 2006, вот ее то в этой пакости я и подозреваю.. Вообще всегда использую вместо T - 1.
[N.S] вне форума  
 
Автор темы   Непрочитано 28.03.2008, 12:39
#8
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Кулик Алексей aka kpblc, за лиспик спасибо, но теперь задача как эти строки перевести обратно в числа. Преобразования с помощью ATOF или READ возвращают похоже только однобайтовые числа, а этого явно не достаточно!
[N.S] вне форума  
 
Непрочитано 28.03.2008, 13:06
#9
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


[N.S]
Покажи в форуме код, который у тебя возвращает значение. Возможно проблемы и нет вовсе.
Alaspher вне форума  
 
Непрочитано 28.03.2008, 13:12
#10
Кулик Алексей aka kpblc
Moderator

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


Хорошо, тогда пойдем другим путем.
Код:
[Выделить все]
(defun test (/ ent ent_pt ent_vla_pt vla_pt fun_list)

  (defun fun_list (msg entity)
    (princ (strcat "\n" msg " : \n"))
    (command "_.list" entity "")
    ) ;_ end of defun

  (vl-load-com)
          ; Сначала получаем от пользователя полилинию
  (if (and (= (type (setq ent
                           (vl-catch-all-apply
                             '(lambda () (car (entsel "\nУкажите полилинию <Отмена> : ")))
                             ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
           ) ;_ end of and
    (progn
          ; Теперь создаем точку в начальной координате через (entmakex)
      (setq ent_pt     (entmakex
                         (list (cons 0 "POINT") (assoc 10 (entget ent)) (cons 62 1))
                         ) ;_ end of entmakex
          ; то же самое, получаем координату через activex:
            ent_vla_pt (entmakex
                         (list (cons 0 "POINT")
                               (cons 10
                                     (vlax-safearray->list
                                       (vlax-variant-value
                                         (vla-get-coordinate
                                           (vlax-ename->vla-object ent)
                                           0
                                           ) ;_ end of vla-get-coordinate
                                         ) ;_ end of vlax-variant-value
                                       ) ;_ end of vlax-safearray->list
                                     ) ;_ end of cons
                               (cons 62 2)
                               ) ;_ end of list
                         ) ;_ end of entmakex
          ; Теперь "чистое" activex
            vla_pt     (vla-addpoint
                         (vla-objectidtoobject
                           (vla-get-activedocument (vlax-get-acad-object))
                           (vla-get-ownerid
                             (vlax-ename->vla-object ent)
                             ) ;_ end of vla-get-ownerid
                           ) ;_ end of vla-ObjectIDToObject
                         (vlax-3d-point
                           (vlax-safearray->list
                             (vlax-variant-value
                               (vla-get-coordinate (vlax-ename->vla-object ent) 0)
                               ) ;_ end of vlax-variant-value
                             ) ;_ end of vlax-safearray->list
                           ) ;_ end of vlax-3d-point
                         ) ;_ end of vla-AddPoint
            ) ;_ end of setq
      (vla-put-color vla_pt 3)
      (foreach item
               (list (cons "Полилиния" ent)
                     (cons "Точка через entmakex" ent_pt)
                     (cons "Точка создана через entmakex, координаты - через vla"
                           ent_vla_pt
                           ) ;_ end of cons
                     (cons "Точка создана полностью через vla"
                           (vlax-vla-object->ename vla_pt)
                           ) ;_ end of cons
                     ) ;_ end of list
        (fun_list (car item) (cdr item))
        ) ;_ end of foreach
      (textscr)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.03.2008, 13:29
#11
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Кулик Алексей aka kpblc,
Вот результат (test).. [русские буквы из командной строки правда попортились]
Код:
[Выделить все]
Óêàæèòå ïîëèëèíèþ <Îòìåíà> :
Ïîëèëèíèÿ :
_.list
Select objects:   1 found

Select objects:
                  LWPOLYLINE  Layer: "0"
                            Space: Model space
                   Handle = ef
              Open
    Constant width 0.00000000
              area   0.00000000
            length   344.56113047

          at point  X=885.63645182  Y=284.25804266  Z=0.00000000
          at point  X=1129.27796371  Y=527.89955455  Z=0.00000000

Command:
Òî÷êà ÷åðåç entmakex :
_.list
Select objects:   1 found

Select objects:
                  POINT     Layer: "0"
                            Space: Model space
                   Color: 1 (red)    Linetype: "BYLAYER"
                   Handle = f1
                at point, X=885.63645182  Y=284.25804266  Z=0.00000000

Command:
Òî÷êà ñîçäàíà ÷åðåç entmakex, êîîðäèíàòû - ÷åðåç vla :
_.list
Select objects:   1 found

Select objects:
                  POINT     Layer: "0"
                            Space: Model space
                   Color: 2 (yellow)    Linetype: "BYLAYER"
                   Handle = f2
                at point, X=885.63645182  Y=284.25804266  Z=0.00000000

Command:
Òî÷êà ñîçäàíà ïîëíîñòüþ ÷åðåç vla :
_.list
Select objects:   1 found

Select objects:
                  POINT     Layer: "0"
                            Space: Model space
                   Color: 3 (green)    Linetype: "BYLAYER"
                   Handle = f3
                at point, X=885.63645182  Y=284.25804266  Z=0.00000000
Т.е. всеми методами полилиния строится корректно. Отображаются координаты через коиианду _.LIST тоже корректно. Но в AutoLISP координаты передаются все равно в ущербном виде!
[N.S] вне форума  
 
Непрочитано 28.03.2008, 13:34
#12
Кулик Алексей aka kpblc
Moderator

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


Да не передаются, а отображаются! Утку можно назвать лягушкой, но от этого она не станет квакать. Передача данных выполняется корректно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.03.2008, 13:35
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
а строчка (vlax-get (vlax-ename->vla-object (car (entsel))) 'Coordinates) для того же примитива возвращает
(3861.79 0.0 6861.79 0.0)
Не парься по этому поводу. Автокад работает числами до 23 знака. Отображает только до 3, а считает до 23. Если нужно кому-то показать или куда-то послать делай так
Код:
[Выделить все]
 
(mapcar '(lambda(x)(rtos x 2 12))(vlax-get (vlax-ename->vla-object (car (entsel))) 'Coordinates))
И всех делов.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.03.2008, 13:35
#14
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Показательный пример:
Код:
[Выделить все]
(vl-load-com)
(mapcar
  	'(lambda (f)
	   	(vlax-make-variant
		  	f
		  	vlax-vbDouble
		)
	)
	(vlax-get (vlax-ename->vla-object (car (entsel))) 'Coordinates)
)
Возращает
Код:
[Выделить все]
(#<variant 5 885,636451820857> #<variant 5 284,258042664824> #<variant 5 1129,27796371047> #<variant 5 527,899554554435>)
При этом
Код:
[Выделить все]
(vl-load-com)
(mapcar
  	'(lambda (f)
	   	(vlax-variant-value
	   		(vlax-make-variant
			  	f
			  	vlax-vbDouble
			)
		)
	)
	(vlax-get (vlax-ename->vla-object (car (entsel))) 'Coordinates)
)
Возращает:
Код:
[Выделить все]
(885.636 284.258 1129.28 527.9)
Это издевательство какое-то! "Вот посмотри на точные цифорки, только я тебе их не дам!"
[N.S] вне форума  
 
Непрочитано 28.03.2008, 13:36
#15
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Передаются и отображаются немного разные вещи
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.03.2008, 13:39
#16
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


В переменной как раз-таки точные цифирьки. Хочешь посмотреть-преобразуй в строку. См. #13
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.03.2008, 13:39
#17
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Кулик Алексей aka kpblc, VVA, ну если только отображает, то вы меня успокоили.. Хотя это стоит проверить
[N.S] вне форума  
 
Непрочитано 28.03.2008, 13:40
#18
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Проверка в #13
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.03.2008, 13:46
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Про точночсть еще здесь почитай
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.03.2008, 13:50
#20
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Проверил для своей задачи - все в порядке. Прошу прощения за панику, но перспективы были ужасны.. Всем спасибо, теперь я знаю что мне делать. А именно в финальном списке координат, который будет записываться в файл, выполнить (rtos f 2 12) для всех координатных чисел. В файле что строки, что числа все равно выглядят одинаково..
[N.S] вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Точность чисел возращаемых LISP ActiveX

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Генератор случайных чисел на Lisp Cleper Прочее. Программное обеспечение 22 13.08.2006 19:03
Срочно! HELP! Двойная точность чисел AGEL Программирование 3 25.05.2006 15:56
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19