Тема: Округление координат

Ни у кого готовой программки (или желания её написать) нету для следующих целей:
Выбираем несколько точек, программы выдает запросы о том, насколько округлять каждую из координат (x,y,z), а затем точки перемещаются на новые (округлённые координаты).
Ну, например, есть точка (125.3,12.586,96.1267) просим прогу округлить кооридинату z до 2 знаков после запятой, а остльные до целого и точка эта перемещается на новое место (125,13,96.13)

Re: Округление координат

Зачем?

Re: Округление координат

Ну сейчас вот задача простая: тахемотр передает данные с точностью 0.000, а для координаты z на чертеже нужна точность 0.00, чтобы можно было быстро и удобно эту координату в виде текста выносить.
Но, думаю, и другие применения придумать можно, если написать более-менее универсальное что-то (анпример как в исходном посте я написал)

Re: Округление координат

> SStas
Смени параметры программы обработки данных тахеометра

Re: Округление координат

Да ладно. Вот код - вроде как работает. Проверялось на ACAD 2005 Eng + SP1, мировая система координат.

(defun c:round-coord
       (/ selset item counter x_round y_round z_round point vla_point)
  (vl-load-com)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (vla-startundomark *kpblc-activedoc*)
  (setq counter 0
        selset  (ssget '((0 . "POINT")))
        ) ;_ end of setq
  (if selset
    (progn
      (setq x_round (getint "\nКоличество знаков после запятой для X <0> : "))
      (if (not x_round)
        (setq x_round 0)
        (setq x_round (abs x_round))
        ) ;_ end of if
      (setq
        y_round (getint (strcat "\nКоличество знаков после запятой для Y <"
                                (itoa x_round)
                                "> : "
                                ) ;_ end of strcat
                        ) ;_ end of getint
        ) ;_ end of setq
      (if (not y_round)
        (setq y_round x_round)
        (setq y_round (abs y_round))
        ) ;_ end of if
      (setq
        z_round (getint (strcat "\nКоличество знаков после запятой для Z <"
                                (itoa x_round)
                                "> : "
                                ) ;_ end of strcat
                        ) ;_ end of getint
        ) ;_ end of setq
      (if (not z_round)
        (setq z_round x_round)
        (setq z_round (abs z_round))
        ) ;_ end of if
      (while (and selset
                  (setq item    (ssname selset counter)
                        counter (1+ counter)
                        ) ;_ end of setq
                  ) ;_ end of and
        (setq item      (vlax-ename->vla-object item)
              point     (vlax-safearray->list
                          (vlax-variant-value (vla-get-coordinates item))
                          ) ;_ end of vlax-safearray->list
              vla_point (vlax-make-safearray vlax-vbDouble '(0 . 2))
              ) ;_ end of setq
        (vlax-safearray-fill
          vla_point
          (list (atof (rtos (car point) 2 x_round))
                (atof (rtos (cadr point) 2 y_round))
                (atof (rtos (caddr point) 2 z_round))
                ) ;_ end of list
          ) ;_ end of vlax-safearray-fill
        (vla-put-coordinates item vla_point)
        ) ;_ end of while
      ) ;_ end of progn
    ) ;_ end of if
  (vla-regen *kpblc-activedoc* acallviewports)
  (vla-endundomark *kpblc-activedoc*)
  ) ;_ end of defun

Re: Округление координат

Уважаемый SStas!
Было бы интересно узнать какие объекты Вы соби-
раетесь передвигать на 0.5 метра. Уж ни здания ли(раз у Вас тахеометр).

Re: Округление координат

> топограф
Почему именно на 0,5?
Сейчас собираюсь округлять значения высоты у отметок водопроводов и канализаций, т.к. если выводить эти отметки (и другую информацию) на печать с тремя знаками после запятой, то чертеж загромождённым очень получается.
С двумя и то загромождённый, но меньше нельзя.
А размер шрифта задан ГОСТом.
Ну а так, с ходу ещё применение придумалось — если снимать колонны эстакад, то они немного всё время отклоняются от значения по тех. документации. Допуск по точности у нас 10 см и если они отклоняются друг от друга на меньшее расстояние, то удобнее их выравнять — и соединять проще, и выглядит лучше.

Re: Округление координат

> kpblc
Срабатывает всё замечательно, но после выполнения выдаёт:

; ошибка: неверный тип аргумента: lentityp nil

оно так и должно быть?

Re: Округление координат

> SStas
Сорри, не учел. Вариант исправленный:

(defun c:round-coord (/ selset item x_round y_round z_round point vla_point)
  (vl-load-com)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (vla-startundomark *kpblc-activedoc*)
  (setq counter 0
        selset  (ssget '((0 . "POINT")))
        ) ;_ end of setq
  (if selset
    (progn
      (setq x_round (getint "\nКоличество знаков после запятой для X <0> : "))
      (if (not x_round)
        (setq x_round 0)
        (setq x_round (abs x_round))
        ) ;_ end of if
      (setq
        y_round (getint (strcat "\nКоличество знаков после запятой для Y <"
                                (itoa x_round)
                                "> : "
                                ) ;_ end of strcat
                        ) ;_ end of getint
        ) ;_ end of setq
      (if (not y_round)
        (setq y_round x_round)
        (setq y_round (abs y_round))
        ) ;_ end of if
      (setq
        z_round (getint (strcat "\nКоличество знаков после запятой для Z <"
                                (itoa x_round)
                                "> : "
                                ) ;_ end of strcat
                        ) ;_ end of getint
        ) ;_ end of setq
      (if (not z_round)
        (setq z_round x_round)
        (setq z_round (abs z_round))
        ) ;_ end of if
      (while (and selset
                  (> (sslength selset) 0)
                  ) ;_ end of and
        (setq item (ssname selset 0))
        (ssdel item selset)
        (setq item      (vlax-ename->vla-object item)
              point     (vlax-safearray->list
                          (vlax-variant-value (vla-get-coordinates item))
                          ) ;_ end of vlax-safearray->list
              vla_point (vlax-make-safearray vlax-vbdouble '(0 . 2))
              ) ;_ end of setq
        (vlax-safearray-fill
          vla_point
          (list (atof (rtos (car point) 2 x_round))
                (atof (rtos (cadr point) 2 y_round))
                (atof (rtos (caddr point) 2 z_round))
                ) ;_ end of list
          ) ;_ end of vlax-safearray-fill
        (vla-put-coordinates item vla_point)
        ) ;_ end of while
      ) ;_ end of progn
    ) ;_ end of if
  (vla-regen *kpblc-activedoc* acallviewports)
  (vla-endundomark *kpblc-activedoc*)
  ) ;_ end of defun

Re: Округление координат

спасиббы

Re: Округление координат

Пашеть?

Re: Округление координат

пока пашет =)

Re: Округление координат

Уважаемый SStas!
Округлять не значит перемещать!
А 0.5 метра-из Вашего примера.Если ВЫ перемещаете объекты в округленные координаты,
то расстояние между объектами может измениться
на 1.4 метра. Проектировщик запроектирует,а
строитель не пролезет.
Или ВЫ не топопланами занимаетесь.

Re: Округление координат

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

(изменено: Александр, 4 октября 2012г. 19:18:00)

Re: Округление координат

Вдруг такая программка очень понадобилась, а она не работает на моих Автокад 2006, Windows 7, 64-разрядная.
Т.е. запускается, но не позволяет задать степень округления. Не выделяет объекты. Да и не делает вообще ничего.