SAPR-ART
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Округление координат кратно значению

Округление координат кратно значению

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 13.12.2012, 02:35
Округление координат кратно значению
baaba
 
архитектор
 
Москва
Регистрация: 07.07.2007
Сообщений: 608
Отправить сообщение для baaba с помощью ICQ Отправить сообщение для baaba с помощью Skype™

baaba вне форума Вставить имя

Часто возникает потребность избавиться от "паразитных" значений при работе над чертежами, когда координаты узловой точки линии могут быть скажем такие:
0.111222,23.999999
что может раздражать, мешать работать (т. к. потом возникают проблемы со штриховками, два миллиметра могут "гулять" по всему проекту). Просмотрел несколько давно существующих похожих тем "округления координат". Однако, потратив около двух часов времени, я так и не нашёл того что мне нужно: утилиту для округления координат узловых точек примитивов чертежа скажем кратно 5 мм, что достаточно для строительства. Пришлось потратить ещё 4 часа и вот что у меня получилось:
Код:
[Выделить все]
; The program rounds the values ​​x, y, z coordinates of the point of the lines, polylines,
; circles, multiply the specified value.
; Radius, coordinates community centers also become multiple setpoint.
; This can be avoided in the drawings of the coordinates of the form 150.0989,
; do say multiple dimensions of 5 mm, which is sufficient for construction drawings.

; Программа округляет значения x, y, z координат узловых точке отрезков,
; полилиний, кругов кратно заданному значению.
; Радиусы, координаты центров кругов так же становятся кратными заданному значению.
; Этим можно избежать в чертежах значений координат вида: 150.0989,
; сделать все размеры кратными скажем 5 мм, что достаточно для
; строительных чертежей

(defun rn (num w)
	(* (atof (rtos (/ num w) 2 0)) w)
)

(defun rn1 (lst w)
	(if (or
			(eq 10 (car lst))
			(eq 11 (car lst))
			(eq 40 (car lst))
		)

		(if (listp (cdr lst))
			(cons 
				(car lst)
				(mapcar '(lambda (x) (rn x w)) (cdr lst))
			)
			(cons (car lst) (rn (cdr lst) w))
		)
		lst
	)
)

(defun c:rnd (/ ss w cnt inent)
	(setq
		w (getreal "Enter the value to which the round: ")
		ss (ssget)
		cnt 0
	)
	(while (setq inent (entget (ssname ss cnt)))
		(progn
			(entmod (mapcar '(lambda (x) (rn1 x w)) inent))	
			(setq cnt (1+ cnt))		
		)
	)
	(princ)
)
(princ "type: \"RND\"")
(princ)
Прошу прощения за несколько неоптимальный код: алгоритм округления выполнен несколько мудрёно, возможно следовало бы "втащить" подсобные функции в тело основной функции, дабы не сорить в памяти. Но т. к. программа "ругается" при каждом выполнении, а я не владею средствами отладки программ (да я кустарь), функции оставлены "снаружи", что бы можно было починить "на ходу" если что отвалится
Может быть кому-нибудь пригодится!
=================================================
PS Вопрос модераторам форума:
попробовал скопировать текст программы. При вставке получаются номера строк (я пользовался тегом LISP). Такой код неработоспособен. Обычным notepad это трудно исправить. По-этому я добавляю вложение, использую тег [code] вместо [code] + [lisp].
Предлагаю исправить тег LISP так что бы не показывались номера строк, или при "выделить всё" они не выделялись.

Вложения
Тип файла: zip rnd.zip (694 байт, 232 просмотров)


Последний раз редактировалось baaba, 13.12.2012 в 20:34.
Просмотров: 16442
 
Непрочитано 09.05.2017, 11:51
#21
чудик


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


код от Кулик Алексей aka kpblc, он получается округляет в большую сторону без учета знака. Т.е. 439.69 округлит кратно 5 до 440, если бы было -439.69 округлит кратно 5 до -435, а нужно до -440

Последний раз редактировалось чудик, 12.05.2017 в 14:01.
чудик вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.02.2018, 14:55
#22
Агент СмиТ

Gti
 
Регистрация: 14.01.2010
МО Железнодорожный
Сообщений: 121


Доброго времени суток!
Кто нибудь сталкивался с необходимостью округления координат вершин такого замечательного примитива как MPolygon?
Перепробовал коды из этой и этой тем, c MPolygon не работают, а "взрывать" каждый примитив до полилиний, округлять и вновь экспортировать в MPolygon неблагодарное занятие
P.s. образец мполигона во вложении, версия файла 2007
Вложения
Тип файла: dwg
DWG 2007
МПолигон 2007.dwg (445.8 Кб, 6 просмотров)
__________________
Каждая система стремится к равновесию.
Агент СмиТ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.02.2018, 20:16
1 | #23
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,676
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Агент СмиТ Посмотреть сообщение
Перепробовал коды из этой и этой тем, c MPolygon не работают
В #36 замени строку "LWPOLYLINE,LINE,ARC,CIRCLE,POINT,INSERT"
этой "LWPOLYLINE,LINE,ARC,CIRCLE,POINT,INSERT,MPOLYGON"
-------------------------------------
Приведу код полностью
Код:
[Выделить все]
 
(defun c:RC (/ _kpblc-eval-nearest round)
;;;Round-Coord
;;;http://forum.dwg.ru/showthread.php?p=1181242#post1181242
;;;VVA for dwg.ru
  (defun _kpblc-eval-nearest (value lst / x base)
    (if lst
      (progn
        (setq x    (car lst)
              base (abs (- value x))
        ) ;_ end of setq
        (foreach item (cdr lst)
          (if (> base (abs (- value item)))
            (setq x    item
                  base (abs (- value item))
            ) ;_ end of setq
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
      (setq x value)
    ) ;_ end of if
    x
  ) ;_ end of defun
  (vl-load-com)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc*
           (vla-get-activedocument (vlax-get-acad-object))
    ) ;_ end of setq
  ) ;_ end of if
  (vla-startundomark *kpblc-activedoc*)
  (cond
    ((setq round
            (getreal
              "\nЗначение округления координат <Приводить к целым> : "
            ) ;_ end of getreal
     ) ;_ end of setq
    )
    (t (setq round 1.))
  ) ;_ end of cond
  (foreach ent
           (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_:L"))))
    (vl-catch-all-apply
      (function
        (lambda ()
          (cond
            ((wcmatch (cdr (assoc 0 (entget ent)))
                      "LWPOLYLINE,LINE,ARC,CIRCLE,POINT,INSERT,MPOLYGON"
             ) ;_ end of wcmatch
             (entmod
               (mapcar
                 '(lambda (x)
                    (if (member (car x) '(10 11 40)) ;_Начало; конец; точка вставки; радиус
                      (vl-list*
                        (car x)
                        (if (listp (cdr x))
                          (mapcar
                            '(lambda (y)
                               (_kpblc-eval-nearest
                                 y
                                 (list (* round (fix (/ y round)))
                                       (* round (1+ (fix (/ y round))))
                                 ) ;_ end of list
                               ) ;_ end of _kpblc-eval-nearest
                             ) ;_ end of lambda
                            (cdr x)
                          ) ;_ end of mapcar
                          (_kpblc-eval-nearest
                            (cdr x)
                            (list (* round (fix (/ (cdr x) round)))
                                  (* round (1+ (fix (/ (cdr x) round))))
                            ) ;_ end of list
                          ) ;_ end of _kpblc-eval-nearest
                        ) ;_ end of if
                      ) ;_ end of VL-LIST*
                      x
                    ) ;_ end of if
                  ) ;_ end of lambda
                 (entget ent)
               ) ;_ end of mapcar
             ) ;_ end of entmod
             (entupd ent)
            )
            (t nil)
          ) ;_ end of cond
        ) ;_ end of lambda
      ) ;_ end of function
    ) ;_ end of vl-catch-all-apply
  ) ;_ end of foreach
  (vla-endundomark *kpblc-activedoc*)
  (princ)
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 15.02.2018, 08:50
#24
Агент СмиТ

Gti
 
Регистрация: 14.01.2010
МО Железнодорожный
Сообщений: 121


Цитата:
Сообщение от VVA Посмотреть сообщение
В #36 замени строку "LWPOLYLINE,LINE,ARC,CIRCLE,POINT,INSERT"
этой "LWPOLYLINE,LINE,ARC,CIRCLE,POINT,INSERT,MPOLYGON"
-------------------------------------
VVA, благодарю за ответ! Код работает как нужно, одельно порадовала возможность обработки нескольких предварительно выбранных объектов.
Offtop: Понимаю, что выглядит несколько нагловато, но есть ли возможность добавить MPolygon в код ECoorE, уверен многие пользователи Map3D будут благодарны за это!
__________________
Каждая система стремится к равновесию.
Агент СмиТ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 15.02.2018, 16:43
#25
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,676
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Агент СмиТ, Offtop: MPolygon добавил http://forum.dwg.ru/showthread.php?p=244237#post244237
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Округление координат кратно значению

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Округление координат, полилиний, центров окружностей, блоков MA2 Программирование 44 15.01.2015 15:19
округление подписей координат в атрибутах блока АлексЮстасу AutoCAD 4 19.07.2010 13:35
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
управление системой координат Автокад из Делфей Владимир В Программирование 12 27.04.2005 09:54

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||