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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Необъяснимое поведение fix

Необъяснимое поведение fix

Ответ
Поиск в этой теме
Непрочитано 25.09.2018, 11:41
Необъяснимое поведение fix
a-karlson
 
Регистрация: 06.06.2009
Сообщений: 19

Господа, доброго времени суток!
Не может ли кто-нибудь рассказать, почему fix при округлении вычитает единицу?
т.е. мы имеем число 3550.0, желаем превратить его в int и ждем, что получится 3550, но fix выдает 3449
Просмотров: 8676
 
Непрочитано 27.09.2018, 18:14
#21
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,007


Цитата:
Сообщение от a-karlson Посмотреть сообщение
fix отбрасывает целую единицу в числе, у которого отсутствует дробная часть,
уверены, что отсутствует, а не 499,999999... вместо 500, к примеру?

Цитата:
Сообщение от a-karlson Посмотреть сообщение
в смысле?
в лиспе динамическая типизация данных
Сергей812 вне форума  
 
Автор темы   Непрочитано 27.09.2018, 18:16
#22
a-karlson


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Еще раз: откуда берутся цифры? Что показывает rtos с максимальным количеством значащих знаков?
цифры с объектов, код примерно такой:
Код:
[Выделить все]
 (setq objs (ssget))
...
(if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-length (list obj))))
      (progn
    (setq len (vla-get-length obj))...
парадокс еще и в том, что даже если принудительно выставлять длину (vla-put-Length obj (flen)) (flen вообще без дробной части) то поведение не изменяется

----- добавлено через ~7 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
уверены, что отсутствует, а не 499,999999... вместо 500, к примеру?
полной уверенности у меня, конешно, нет, но мне очень хочется верить, что, когда я задаю объекту длину=500, как вручную, так и vla-put-length, то объект содержит именно 500 и, что не менее важно, отдает 500, а не что-то другое
a-karlson вне форума  
 
Непрочитано 27.09.2018, 18:31
#23
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от a-karlson Посмотреть сообщение
цифры с объектов
luprec поставь "на побольше"

Цитата:
Сообщение от a-karlson Посмотреть сообщение
(vla-put-Length obj (flen))
А не смущает, что свойство Length обычно все же ReadOnly?

----- добавлено через 52 сек. -----
Задать объекту длину невозможно - неизвестно, в какую сторону и насколько выполнять увеличение длины. Если это увеличение вообще возможно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.09.2018, 19:55
#24
ShaggyDoc

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


Цитата:
Сообщение от a-karlson Посмотреть сообщение
в то-то и дело, что я вижу, что иногда fix отбрасывает целую единицу в числе, у которого отсутствует дробная часть, насколько это можно считать фичей?
Вот потому я давным давно и сделал функцию округления. Fix делает всё, как описано. Но только надо учитывать особенности представления вещественных чисел в AutoCAD, состояние системных переменных, точность отображения и прочее. Чтобы с этим не заморачиваться и сделаны "костыли".

Если в других языках тип данных явно объявляется, то в Lisp такого нет.

Примеры "странного" поведения, в котором нет ничего странного.
Код:
[Выделить все]
 Command: (fix 5450)
5450

Command: (fix 5450.1)
5450

Command: (fix 5450.9999999999)
5450

Command: luprec

New value for LUPREC <4>: 1

Command: (fix 5450.9999999999)
5450

Command: (fix 5450.9999999999999)
5451

Command: (fix 5449.9999999999999)
5450

Command: (fix 5449.99)
5449

Цитата:
Сообщение от a-karlson Посмотреть сообщение
увы, но я так и не научился автолиспом доставать функции из dll
Зачем из dll? Все эти функции состоят из одной-двух строк и могут быть написаны на Lisp. Как и тысячи других. Надо иметь свою постоянно загружаемую библиотеку, хранить в ней свои функции и с их использованием делать простые короткие программы.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 28.09.2018, 10:44
#25
a-karlson


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
luprec поставь "на побольше"


А не смущает, что свойство Length обычно все же ReadOnly?
обычно да, но не у всех, тем более, что я проверяю на доступность
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение

----- добавлено через 52 сек. -----
Задать объекту длину невозможно - неизвестно, в какую сторону и насколько выполнять увеличение длины.
конечная точка удаляется от начальной на длину

----- добавлено через ~19 мин. -----
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Зачем из dll?
а что еще можно изобразить на дельфях?
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Все эти функции состоят из одной-двух строк и могут быть написаны на Lisp. Как и тысячи других. Надо иметь свою постоянно загружаемую библиотеку, хранить в ней свои функции и с их использованием делать простые короткие программы.
ну (fix x) куда уж короче?

но вот его странный алгоритм работы меня и поразил

----- добавлено через ~21 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
luprec поставь "на побольше"
попробовал, разницы не заметил
a-karlson вне форума  
 
Непрочитано 28.09.2018, 11:33
#26
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от a-karlson Посмотреть сообщение
конечная точка удаляется от начальной на длину
Да ну?
Цитата:
_$ (vlax-dump-Object (vlax-ename->vla-object (car(entsel))))
; IAcadLine: Интерфейс AutoCAD для работы с отрезками.
; Property values:
<...>
; Length (RO) = 1784.2
_$ (vlax-dump-Object (vlax-ename->vla-object (car(entsel))))
; IAcadLWPolyline: Интерфейс AutoCAD для работы с компактными полилиниями.
; Property values:
<...>
; Length (RO) = 1981.77
Наличие свойства не означает, что его можно поменять. В крайнем случае выполни код:
Код:
[Выделить все]
 (defun check (obj len / err) ;|
*    Установка "длины" объекту
*    Параметры вызова:
  obj    указатель на графический объект
  len    новая длина
|;
  (if (and obj
           (setq obj (cond ((= (type obj) 'ename) (vlax-ename->vla-object obj))
                           ((= (type obj) 'vla-object) obj)
                           ) ;_ end of cond
                 ) ;_ end of setq
           ) ;_ end of and
    (if (vlax-property-available-p obj 'length)
      (if (vl-catch-all-error-p
            (setq err (vl-catch-all-apply (function (lambda () (vla-put-length obj len)))))
            ) ;_ end of vl-catch-all-error-p
        (princ (strcat "\nError set length : " (vl-catch-all-error-message err)))
        (princ "\nOK!")
        ) ;_ end of if
      (princ "\nLength property is not available")
      ) ;_ end of if
    (princ "\nobj is nil")
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
P.S. Замена len с типа REAL на vlax-variant не поможет, можешь поверить, можешь проверить.

----- добавлено через 36 сек. -----
Пример вызова:
Код:
[Выделить все]
 (check (car (entsel)) 100.)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.09.2018, 11:41
#27
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от a-karlson Посмотреть сообщение
конечная точка удаляется от начальной на длину
длина это производная от координат, поэтому это число рациональное
Vov.Ka вне форума  
 
Непрочитано 28.09.2018, 12:41
#28
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от a-karlson Посмотреть сообщение
конечная точка удаляется от начальной на длину
А почему не наоборот?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.10.2018, 11:43
#29
a-karlson


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Да ну?
ну да, а что?
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение

Наличие свойства не означает, что его можно поменять. В крайнем случае выполни код:
Код:
[Выделить все]
 (defun check (obj len / err) ;|
*    Установка "длины" объекту
*    Параметры вызова:
  obj    указатель на графический объект
  len    новая длина
|;
  (if (and obj
           (setq obj (cond ((= (type obj) 'ename) (vlax-ename->vla-object obj))
                           ((= (type obj) 'vla-object) obj)
                           ) ;_ end of cond
                 ) ;_ end of setq
           ) ;_ end of and
    (if (vlax-property-available-p obj 'length)
      (if (vl-catch-all-error-p
            (setq err (vl-catch-all-apply (function (lambda () (vla-put-length obj len)))))
            ) ;_ end of vl-catch-all-error-p
        (princ (strcat "\nError set length : " (vl-catch-all-error-message err)))
        (princ "\nOK!")
        ) ;_ end of if
      (princ "\nLength property is not available")
      ) ;_ end of if
    (princ "\nobj is nil")
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
P.S. Замена len с типа REAL на vlax-variant не поможет, можешь поверить, можешь проверить.

----- добавлено через 36 сек. -----
Пример вызова:
Код:
[Выделить все]
 (check (car (entsel)) 100.)
посмотрел, у меня конешно, не столь изящно, но смысл тот же самый
Код:
[Выделить все]
 (defun c:3072 ( / obj objs len lst i j flen)
  (setq objs (ssget)
	i 0)
  ;(if (= nil objs) (exit))
  (while (< i (sslength objs))
    (setq obj (vlax-ename->vla-object (ssname objs i))
	  i (1+ i)
	  )
    (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-length (list obj))))
      (progn
	(setq len (vla-get-length obj)
	      flen (float (fix len)); да, я смирился ((
	      )
	;(princ (type len))
	(if (not (eq len flen))
	  (progn
	    ;(princ "\n")
	    (princ len);
	    (princ " "); эти строки для того, чтобы автокад сам преобразовывал число во что ему надо
	    (princ flen);
	    (princ "\n");
	    (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-length (list obj flen))))
	      (vla-put-Length obj flen)
	      )
	    (vla-Highlight obj :vlax-true)	    	    
	    )
	  )
	)
      )
    )
  (princ)
  )
----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А почему не наоборот?
честно говоря, не знаю почему, чего вижу, то и пою
a-karlson вне форума  
 
Непрочитано 31.10.2018, 12:03
#30
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от a-karlson Посмотреть сообщение
посмотрел
И что, меняется объект?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.11.2018, 13:23
#31
a-karlson


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И что, меняется объект?
конешно, иначе я и не интересовался бы сопутствующими обстоятельствами, ведь, если программа неприменима в принципе, какая разница, как ведет себя ее часть?
a-karlson вне форума  
 
Непрочитано 01.11.2018, 16:13
#32
Кулик Алексей aka kpblc
Moderator

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


Ничего не меняется - специально несколько раз проверил. Чутка подправил твой код, добавил информационные выводы:
Код:
[Выделить все]
 (defun c:3072 (/ obj objs len lst i j flen)
  (setq objs (ssget)
        i    0
        ) ;(if (= nil objs) (exit))
  (while (< i (sslength objs))
    (setq obj (vlax-ename->vla-object (ssname objs i))
          i   (1+ i)
          ) ;_ end of setq
    (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-length (list obj))))
      (progn (setq len  (vla-get-length obj)
                   flen (float (fix len)) ; да, я смирился ((
                   ) ;(princ (type len))
             (if (not (eq len flen))
               (progn ;(princ "\n")
                 (princ (strcat "\nOld Len = " (rtos len 2 6))) ;
                 (princ " ") ; эти строки для того, чтобы автокад сам преобразовывал число во что ему надо
                 (princ (strcat "\nNew Len = " (rtos flen 2 6))) ;
                 (princ "\n") ;
                 (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-length (list obj flen))))
                   (progn (vla-put-length obj flen) (vla-update obj) (vla-highlight obj :vlax-true))
                   (princ "\nError put length")
                   ) ;_ end of if
                 (princ (strcat "\nCur Len = " (rtos (vla-get-length obj) 2 6) "\n\n"))
                 ) ;_ end of progn
               ) ;_ end of if
             ) ;_ end of progn
      (princ "\nNo Legth property")
      ) ;_ end of if
    ) ;_ end of while
  (princ)
  ) ;_ end of defun
Попробуй поменять - хоть старым кодом, хоть исправленным, хоть моим. Потом выполни обновление полей (хоть через команду _.UPDATEFIELD) и посмотри, что и как происходит.
Ну и показывай свой файл с образцами примитивов, для которых у тебя "все работает".
Вложения
Тип файла: dwg
DWG 2010
Drawing2.dwg (60.9 Кб, 6 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.11.2018, 12:58
#33
a-karlson


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
...файл с образцами примитивов, для которых у тебя "все работает".
но я не говорил про примитивы, я говорил про объекты
Вложения
Тип файла: dwg
DWG 2013
образец.dwg (536.8 Кб, 5 просмотров)
a-karlson вне форума  
 
Непрочитано 08.11.2018, 13:05
#34
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от a-karlson Посмотреть сообщение
но я не говорил про примитивы, я говорил про объекты
Примитив (в терминах AutoCAD) - это графический объект. Например, слой или тип линии или размерный стиль - это объекты (не примитивы). А линия, полилиния, дуга, твердое тело и т.д. - это примитивы.
Александр Ривилис вне форума  
 
Непрочитано 08.11.2018, 13:15
#35
Кулик Алексей aka kpblc
Moderator

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


a-karlson, у тебя там элементы вертикалок, а не чистого ACAD'a. Поведение пользовательских примитивов может принципиально отличаться от поведения стандартных примитивов.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.11.2018, 08:18
#36
a-karlson


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
a-karlson, у тебя там элементы вертикалок, а не чистого ACAD'a. Поведение пользовательских примитивов может принципиально отличаться от поведения стандартных примитивов.
да, но значения полей, после их получения и занесения в переменную (список, пр.), отчуждаются от примитива и на поведение фикса их происхождение не влияет же
a-karlson вне форума  
 
Непрочитано 13.11.2018, 09:26
#37
Громов Владимир

Инженер
 
Регистрация: 24.05.2008
г. Москва
Сообщений: 13


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Примитив (в терминах AutoCAD) - это графический объект. Например, слой или тип линии или размерный стиль - это объекты (не примитивы). А линия, полилиния, дуга, твердое тело и т.д. - это примитивы.
Странно видеть это заявление от опытного со стажем программиста. Особенно про термины AutoCAD. Когда AutoCAD предлагает выбрать ОБЪЕКТЫ, то это ни в коем случае не означает выбрать слой, тип линии и т.д. Слой, тип линии и т.д. - это свойства объекта. А сам объект - это в большинстве случаев именно графическое представление. Зато примитив - простейший графический объект, т.е. - точка.
Громов Владимир вне форума  
 
Непрочитано 13.11.2018, 14:41
#38
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Громов Владимир Посмотреть сообщение
Странно видеть это заявление от опытного со стажем программиста. Особенно про термины AutoCAD. Когда AutoCAD предлагает выбрать ОБЪЕКТЫ, то это ни в коем случае не означает выбрать слой, тип линии и т.д. Слой, тип линии и т.д. - это свойства объекта. А сам объект - это в большинстве случаев именно графическое представление. Зато примитив - простейший графический объект, т.е. - точка.
Увы, но это некорректный перевод с английского и разночтения. Entity - примитив (и соответствующий ему класс AcDbEntity в ObjectARX и Entity в .NET API) . Object - объект (класс AcDbObject и DBObject). Примитив - это не обязательно "простейший" объект. Вставка блока - это тоже примитив (entity), как, например, и стена/окно/дверь/лестница/и т.д. из AutoCAD Architecture и соответствующие Custom Entity из других вертикальных приложений.
В иерархии классов всё четко.
Александр Ривилис вне форума  
 
Непрочитано 13.11.2018, 17:58
#39
Кулик Алексей aka kpblc
Moderator

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


a-karlson, еще раз - с любым числом, которое тебе "неправильно" обрабатывается, выполни такую последовательность (где val - твое число):
Код:
[Выделить все]
 (vl-prin1-to-string val)
(fix val)
(rtos val 2 16)
(strcat (itoa (fix val)) "." (rtos (* 1e16 (- val (fix val))) 2 16))
И посмотри, что получается.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.11.2018, 08:22
#40
a-karlson


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
a-karlson, еще раз - с любым числом, которое тебе "неправильно" обрабатывается, выполни такую последовательность (где val - твое число):
Код:
[Выделить все]
 (vl-prin1-to-string val)
(fix val)
(rtos val 2 16)
(strcat (itoa (fix val)) "." (rtos (* 1e16 (- val (fix val))) 2 16))
И посмотри, что получается.
посмотрел (скриншот прилагается)
выхлоп в текстовое окно:
Код:
[Выделить все]
 
число (fix число)
9160.86 9160.0
9160.0 9159.0
9159.0 9159.0 (отсюда и далее изменений нет, или у меня не хватило терпения дождаться)
Миниатюры
Нажмите на изображение для увеличения
Название: res.png
Просмотров: 22
Размер:	20.6 Кб
ID:	208202  
a-karlson вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Необъяснимое поведение fix

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посоветуйте, пожалуйста, литературу по проектированию фундаментов на основаниях, содержащих слой сильновыветрелого грунта (рухляка) или поведение рухляка под нагрузкой Zvezdaneba Поиск литературы, чертежей, моделей и прочих материалов 5 28.07.2016 15:11
Странное поведение функции GetPoint krok64 Программирование 3 15.06.2016 08:01
Непонятное поведение цикла по списку swkx Программирование 33 28.03.2012 15:39
Поведение AutoCAD 2005 после установки 2006 Кулик Алексей aka kpblc AutoCAD 12 10.08.2005 08:49