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

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

Как вывести координаты всех точек полилинии?

Ответ
Поиск в этой теме
Непрочитано 28.10.2014, 10:37 #1
Как вывести координаты всех точек полилинии?
iiscienceii
 
Регистрация: 30.05.2014
Сообщений: 20

Добрый день всем.
Задача заключается в следующем:
есть замкнутая полилиния, необходимо проверить вписывается ли она в прямоугольник определенных размеров. Если нет то нужно это вывести в окне предупреждения и предложить разбить эту полилинию отрезком на две фигуры меньшего размера которые бы вписывались в заданый прямоугольник.

Я так понимаю для этого в начале необходимо сохранить коардинаты всех точек полилинии в переменную а затем уже работать с этими коардинатами.
Подскажите пожалуйста как сохранить коардинаты всех точек полилинии в переменную?

Последний раз редактировалось iiscienceii, 29.10.2014 в 15:57.
Просмотров: 5634
 
Непрочитано 28.10.2014, 10:56
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Язык?
Версия автокада?
Boxa вне форума  
 
Автор темы   Непрочитано 28.10.2014, 11:02
#3
iiscienceii


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



AutoLisp, AutoCad 2010.
iiscienceii вне форума  
 
Непрочитано 28.10.2014, 11:33
#4
Кулик Алексей aka kpblc
Moderator

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


А "прямоугольник" существует или нет?
В любом случае как вариант: получить габаритный контейнер (vla-getBoundingBox) и проверить вхождение соответствующих точек в прямоугольник.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.10.2014, 11:45
#5
iiscienceii


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


Нет прямоугольник не существует. Это проверка на габариты (влезит или не влезит).
Решение которое мне пришло в голову следующее.
Разбиваем полилинию на отдельные отрезки. Выбираем все эти отрезки.
Поочереди их перебераем и в список заносим коардинаты начальной точки каждого отрезка.
Но это получается очень громоздко. Есть, что по проще.
iiscienceii вне форума  
 
Непрочитано 28.10.2014, 13:44
#6
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от iiscienceii Посмотреть сообщение
есть замкнутая полилиния, необходимо проверить вписывается ли она в прямоугольник определенных размеров
Возможный алгоритм: координаты вершин прямоугольника используем как аргументы для функции ssget с опцией "_W" (если брать две диагональные вершины и прямоугольник расположен "горизонтально") или "_WP" (если четыре и прямоугольник расположен под углом к горизонту) и анализируем набор. Если нужная полилиния в него входит, то есть вся она опоясывается рамкой (заметим, НЕ секушей), то проверка возвращает T - вписывается. Правда, тут есть вариант граничного случая, когда полилиния касается стороны прямоугольника - это надо учесть.
Offtop: iiscienceii, прошу изменить название темы в соответствии с правописанием (коОрдинаты). Это я не цепляюсь к грамотности, просто для других в поиске по слову "координаты" эта тема может не всплыть. Без обид, хорошо?

Последний раз редактировалось skkkk, 28.10.2014 в 13:51.
skkkk вне форума  
 
Непрочитано 28.10.2014, 14:08
#7
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от iiscienceii Посмотреть сообщение
Есть, что по проще.
Есть. Я уже написал. Прорабатывать полностью код я не буду - у меня своей работы хватает.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.10.2014, 18:42
#8
iiscienceii


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


Задачу решил. Всем спасибо.
iiscienceii вне форума  
 
Непрочитано 28.10.2014, 21:17
#9
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


iiscienceii, вообще на форумах принято показывать форумчанам найденное решение поставленной задачи. Так сказать, раскрывать тему. А с таким подходом велик риск в последствии все задачи решать самому. Поправьте меня, если я ошибаюсь. И повторюсь: название темы изменить в соответствии с нормами орфографии? Не?
Как переименовать тему?
skkkk вне форума  
 
Автор темы   Непрочитано 29.10.2014, 15:51
#10
iiscienceii


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


Если кому поможет выкладываю част програмного кода
Код делает следующее:
Переберает все точки полилинии и заносит их координаты в два списка (координата Х и координата Y), далее ищется максимум и минимум в этих списках. Вычитанием из максимума минимума получаем габарит изделия.
Код:
[Выделить все]
 
        (setq lst (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "STOLESHNICA"))))
        (command "_copy" lst "" (list 0 0 0)
                                               (list 0 0 0))
        (setq nm_stoleshka1 (entlast))
        (vl-cmdf "_change" nm_stoleshka1 "" "_prop" "_layer" "0" "")
        (vl-cmdf "_explode" nm_stoleshka1)  
        (setq tbl_lst (entget (tblobjname "LAYER" "stoleshnica")) clr_grp (assoc 62 tbl_lst))
        (entmod (subst (cons 62 (- (cdr clr_grp))) clr_grp tbl_lst))
        (setq objekti_stol (ssget "_X" (list (cons 0 "LWPOLYLINE,LINE,ARC") (cons 8 "0") (cons 62 131))))
        (setq nach_objekti_stol_i nil)
        (setq matr_nach_toch nil)
	(setq matr_nach_toch_x nil)
	(setq matr_nach_toch_y nil)
        (setq i 0)
        (setq matr_nach_toch nil) 
        (while (< i (sslength objekti_stol))
             (setq objekti_stol_i (entget(ssname objekti_stol i)))
	     (setq nach_objekti_stol_i (cdr (assoc 10 objekti_stol_i)))
	     (setq matr_nach_toch (append matr_nach_toch (list nach_objekti_stol_i)))
	     (setq matr_nach_toch_x (append matr_nach_toch_x (list (nth 0 (nth i matr_nach_toch)))))
	     (setq matr_nach_toch_y (append matr_nach_toch_y (list (nth 1 (nth i matr_nach_toch)))))
	     (setq i (+ i 1))
	)
        (setq objekti_stol (ssget "_X" (list (cons 0 "LWPOLYLINE,LINE,ARC") (cons 8 "0") (cons 62 131))))
        (vl-cmdf "_erase" objekti_stol "")
        (setq tbl_lst (entget (tblobjname "LAYER" "stoleshnica")) clr_grp (assoc 62 tbl_lst))
        (entmod (subst (cons 62 (- (cdr clr_grp))) clr_grp tbl_lst))
        (setq i 0)
        (setq matr_nach_toch_max_x (nth 0 matr_nach_toch_x) matr_nach_toch_min_x (nth 0 matr_nach_toch_x))
        (while (< i (length matr_nach_toch_x))
	     (if (> (nth i matr_nach_toch_x) matr_nach_toch_max_x)
	       (setq matr_nach_toch_max_x (nth i matr_nach_toch_x))
	     )
	     (if (< (nth i matr_nach_toch_x) matr_nach_toch_min_x)
	       (setq matr_nach_toch_min_x (nth i matr_nach_toch_x))
	     )
	     (setq i (+ i 1))
	)
        (setq i 0)
        (setq matr_nach_toch_max_y (nth 0 matr_nach_toch_y) matr_nach_toch_min_y (nth 0 matr_nach_toch_y))
        (while (< i (length matr_nach_toch_y))
	     (if (> (nth i matr_nach_toch_y) matr_nach_toch_max_y)
	       (setq matr_nach_toch_max_y (nth i matr_nach_toch_y))
	     )
	     (if (< (nth i matr_nach_toch_y) matr_nach_toch_min_y)
	       (setq matr_nach_toch_min_y (nth i matr_nach_toch_y))
	     )
	     (setq i (+ i 1))
	)
        (setq length_x nil length_y nil)
        (setq length_x (- matr_nach_toch_max_x matr_nach_toch_min_x))
        (setq length_y (- matr_nach_toch_max_y matr_nach_toch_min_y))
        (if (= dl_sh_length 0.00)
          (if (or (> length_x 2850.00) (> length_y 900.00))
	    (progn
	         (setq message (strcat "Габариты изделия не должны превышать размер 3000х900 мм.\n"
	   			       " необходимо указать линии разделения, что бы части изделия\n"
				       "                 не превышали указанный размер!"
		               )
                 )
	         (alert message)
	         (exit)
	    )
	  )
	)
Только не учитывается один момент. Если у полилиния есть дуги выходящие за габарит крайних точек то таким способом найти габарит нельзя.
Соответственно вопрос подскажите как найти габариты дуги полилинии

Последний раз редактировалось iiscienceii, 30.10.2014 в 13:08.
iiscienceii вне форума  
 
Непрочитано 29.10.2014, 15:54
#11
Кулик Алексей aka kpblc
Moderator

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


Дуговые сегменты забыл.
Код:
[Выделить все]
 (vl-load-com)

(defun tt (/ ent minp maxp)
  (if (setq ent (vlax-ename->vla-object (car (entsel))))
    (progn
      (vla-getboundingbox ent 'minp 'maxp)
      (list (cons "min" (vlax-safearray->list minp))
            (cons "max" (vlax-safearray->list maxp))
            ) ;_ end of list
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.10.2014, 18:37
#12
VVA

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
iiscienceii, прошу изменить название темы в соответствии с правописанием (коОрдинаты). Это я не цепляюсь к грамотности, просто для других в поиске по слову "координаты" эта тема может не всплыть. Без обид, хорошо?
Цитата:
Сообщение от skkkk Посмотреть сообщение
повторюсь: название темы изменить в соответствии с нормами орфографии? Не?
Цитата:
Сообщение от iiscienceii Посмотреть сообщение
Если кому поможет выкладываю част програмного кода
Код делает следующее:
Переберает все точки полилинии и заносит их коардинаты в два списка (коардината Х и коардината Y), далее ищется максимум и минимум в этих списках. Вычитанием из максимума минимума получаем габарит изделия.
Offtop: Проще поменять нормы орфографии
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.10.2014, 23:11
#13
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Столько setq... Оно нам нада?...
roaa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как вывести координаты всех точек полилинии?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить список точек перелома полилинии (Lisp/VBA) mephis LISP 24 14.10.2015 18:53
Распределение точек по полилинии с определенным расстоянием между ними ПО ПРЯМОЙ Prestan AutoCAD 10 14.10.2010 22:54
Оптимизация (уменьшение количества) точек в полилинии. Как сделать? Очень нужно.. xaoc25 AutoCAD 2 27.11.2009 15:18
Нужна помощь! Полилиния с равными интервалами опорных точек. pffafer AutoCAD 8 14.03.2005 21:24
Нужна прога для преобразования ВСЕХ примитивов в полилинии timurka AutoCAD 4 25.11.2003 05:15