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

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

Нужен макрос выявления "неправильных" ортогональных линий

Ответ
Поиск в этой теме
Непрочитано 23.09.2012, 05:17 #1
Нужен макрос выявления "неправильных" ортогональных линий
Малявка
 
Егорьевск Моск.обл.
Регистрация: 28.02.2007
Сообщений: 206

Здравствуйте! Несколько раз сталкивалась с ситуацией, когда, работая со сторонним чертежом, не могла правильно отрисовать свои примитивы: привязка капризничала. Увеличивая зум, убеждалась, что некоторые горизонтальные и вертикальные линии таковыми не являются: обычная неряшливость чертёжника. Да и у самой иногда такое бывало.

Просьба: напишите, пожалуйста, макрос, чтобы он такие вот неправильные линии (или полилинии) перекидывал в новый слой, допустим, "NOT_ORTO". Или макрос, определяющий неправильное соединение концов линий (с зазором, с перехлёстом, с примыканием).

А уж, оставив видимым только этот новый слой, я смогу быстрее исправить ошибки.

Спасибо.

p.s. А может есть уже готовое решение? Подскажите, буду признательна.
Просмотров: 5957
 
Непрочитано 24.09.2012, 10:55
#2
Petrov-Vodkin


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


Цитата:
Сообщение от Малявка Посмотреть сообщение
неправильные линии (или полилинии) перекидывал в новый слой, допустим, "NOT_ORTO"
Плохое решение. Буквально это означает "изуродовать чертеж".
Были объекты на чертеже (пусть и не аккуратном) разложены по своим слоям, а ты предлагаешь некоторые из них перекинуть в бессмысленный слой "NOT_ORTO".

И еще интересный вопрос:
Попробуй, пользуясь терминами из геометрии, сформулировать, что такое "неправильное соединение концов линий" и чем будет отличаться "негоризонтальная линия" от наклонной
Petrov-Vodkin вне форума  
 
Непрочитано 24.09.2012, 11:17
#3
MEsher


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


Цитата:
Сообщение от Petrov-Vodkin Посмотреть сообщение
в бессмысленный слой "NOT_ORTO".
возможно сделать осмысленным если в нем расположить не линии, а указатели, например окружности, отмечающие неправильно соединенные концы линий.
__________________
Код порою получается жутковат, конешно, и убиться об его можно, да ведь все под богом ходим...
MEsher вне форума  
 
Непрочитано 24.09.2012, 12:44
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,517


Цитата:
Сообщение от Petrov-Vodkin Посмотреть сообщение
чем будет отличаться "негоризонтальная линия" от наклонной
Отклонение от прямых углов не более, чем на 1 градус: углы 359-1 град, 89-91 град, 179-181 град, 269-271 град. В строительных чертежах таких малых углов ОБЫЧНО не бывает. В исполнительных съемках - часто.

Цитата:
что такое "неправильное соединение концов линий"
Если с перехлестом или примыканием, то длина от одного конца до точки пересечения - 0,1% общей длины, с другой стороны 99,9%. Если с зазором - попадание конца одного в квадратик 0,1х0,1 мм с центром на конце другого отрезка при условии отсутствии пересечения самих отрезков.

Offtop: PS Это на словах я такой умный, а код написать ниасилю - не маленький кусок работы, не до того
__________________
Одно меня лишь радует - я это вижу сам! (С)

Последний раз редактировалось kp+, 24.09.2012 в 13:50.
kp+ вне форума  
 
Автор темы   Непрочитано 24.09.2012, 16:54
#5
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


Какой же выход можете предложить? Провожу конструктивную линию, привязываясь к одному углу прямоугольника. А другой угол - стоит в стороне на пол-миллиметра или на полтора миллиметра, неважно. Но ясно видно, что прямоугольник - ортогональные линии (должны быть ортогональными)! И приходится ручками выравнивать. А выровняв один угол, сразу проверяешь длину сторон - она ведь изменилась. Вот так одно за другое цепляется.
p.s. Было именно в проектных чертежах, я по ним исполнительные делаю и сталкиваюсь часто с этой проблемой. А в новый слой хочу перекинуть, чтобы сразу определить эти линии. Ну, можно просто выделить их миллиметровой толщиной, например. А новый слой не портит мой чертёж, ведь это МОЯ исполнительная схема. А проектный чертёж я и не затрагиваю.

Последний раз редактировалось Малявка, 24.09.2012 в 16:58. Причина: добавление
Малявка вне форума  
 
Непрочитано 24.09.2012, 19:04
#6
VVA

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


Что пришло в голову
Код:
[Выделить все]
(defun C:F8 ( / fuzz)
  ;;;Проверка на ортогональность
    (setq fuzz 0.1) ;_Точность совпадения координат по X или Y для проверки вертикальности или горизонтальности
  (if (setq ss (ssget "_:L" '((0 . "LINE"))))
    (ApplyFootoSS
      (lambda (e1)
        (if
          (_is-not-optho
            (cdr(assoc 10 (entget e1)))
            (cdr(assoc 11 (entget e1)))
            fuzz
            )
          (entmod
            (subst
              (cons 8 "_NOT_ORTO")
              (assoc 8 (entget e1))
              (entget e1)
              )
            )
          )
        )
      ss
      )
    )
  (princ "Done.")
  (princ)
  )
(defun ApplyFootoSS ( foo ss )
;;------------------=={ Apply Foo to SS }==-------------------;;
;;                                                            ;;
;;  Applies a function to every entity in a SelectionSet      ;;
;;------------------------------------------------------------;;
;;  Author: Lee McDonnell, June 2010                          ;;
;;                                                            ;;
;;  Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
;;  Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  foo - a function taking one argument (an entity name)     ;;
;;  ss  - valid SelectionSet (pickset)                        ;;
;;------------------------------------------------------------;;
;;  Returns:  Last evaluation of function foo                 ;;
;;------------------------------------------------------------;;
;; © Lee Mac 2010
;;; Use (ApplyFootoSS (lambda (e1)(if(= (cdr(assoc 0 (entget e1))) "LINE")(setq PICK1 t))) ss)
  (
    (lambda ( i / e )
      (while (setq e (ssname ss (setq i (1+ i)))) (foo e))
    )
    -1
  )
)
(defun _is-not-optho (p1 p2 fuzz)
  ;;;Функция проверки на ортогональность
  ;;; p1 -начальная точка (МСК)
  ;;; p2 -конечная точка (МСК)
  ;;; Должна возвращать
  ;;; t - объект не ортогонален
  ;;; nil - во всех остальных случаях
  ;;; fuzz - Точность проверки
  
  (cond
    ((equal (car p1)(car p2) fuzz) ;_объект должен быть вертикален по заявленному допуску fuzz
     (if (equal (car p1)(car p2) 1e-9) ;_проверка совпадения координат с точностью до 1e-9
       nil
       t
       )
     )
    ((equal (cadr p1)(cadr p2) fuzz) ;_объект должен быть горизонтален по заявленному допуску fuzz
     (if (equal (cadr p1)(cadr p2) 1e-9) ;_проверка совпадения координат с точностью до 1e-9
       nil
       t
       )
     )
    (t nil) ;_Все остальные случаи
    )
  )
Здесь координаты сравниваются с точность до 0.1

Цитата:
Сообщение от Малявка Посмотреть сообщение
А другой угол - стоит в стороне на пол-миллиметра или на полтора миллиметра, неважно.
Важно
Если вертикальными или горизонтальными должны быть линии с отклонением по любой (X,Y) из координат до пол-милииметра, то измени
Цитата:
(setq fuzz 0.1);_Точность совпадения координат по X или Y для проверки вертикальности или горизонтальности
на
Цитата:
(setq fuzz 0.5);_Точность совпадения координат по X или Y для проверки вертикальности или горизонтальности
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 24.09.2012 в 22:42.
VVA вне форума  
 
Автор темы   Непрочитано 24.09.2012, 20:57
#7
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


VVA, спасибо, однако не работает.
Я скопировала код, сохранила как F8.txt, переименовала в F8.lsp и загрузила в автокад. Вроде всё правильно сделала (я всегда так делаю).
Вот командная строка. Позволяет выбирать линию и всё.
Код:
[Выделить все]
Команда: F8
Выберите объекты: Противоположный угол: найдено: 1
Выберите объекты:
Done.
Команда:
Малявка вне форума  
 
Непрочитано 24.09.2012, 22:43
#8
VVA

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


Малявка, Проверь слои. А так же установи нужный допуск (Прочти в #6 после выделенного красным)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 25.09.2012, 08:15
#9
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


VVA, работает! Моя великая благодарность! Маленькая просьба: добавьте в макрос ещё и обработку полилиний, включая составные. Если у такой полилинии хотя бы один отрезок входит в установленный диапазон (setq fuzz 0.1), то эта полилиния перемещалась бы на тот же слой _NOT_ORTO и проблемные точки выделялись бы окружностями. (хотя про окружности - это уже злоупотребление вашей добротой. Если это сделать сложно, то достаточно перемещения на слой, а там я уже разберусь вручную)
И - сделайте, пожалуйста, автоматическое создание этого слоя с голубым цветом (CYAN) и весом линии 0,5мм, если он не существует (просто лень каждый раз самой создавать один и тот же слой)
Спасибо!

Последний раз редактировалось Малявка, 25.09.2012 в 08:22. Причина: добавление
Малявка вне форума  
 
Непрочитано 25.09.2012, 08:42
#10
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Похожие темы:
http://www.caduser.ru/forum/index.ph...D=44&TID=20481
http://www.caduser.ru/forum/index.ph...D=44&TID=20482
Profan вне форума  
 
Автор темы   Непрочитано 25.09.2012, 12:03
#11
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


Profan, программа А.Ривилиса L_ALIGN_XY тоже не работает с полилиниями, увы. Кроме того, она выравнивает линии автоматически, а мне надо самой решить, что делать с линиями. И выравнивает относительно её центра, а мне надо, чтобы один из концов оставался на месте. Какой - на моё решение.

Последний раз редактировалось Малявка, 25.09.2012 в 12:30.
Малявка вне форума  
 
Непрочитано 26.09.2012, 12:06
#12
MEsher


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


можно попробывать и такой вариант. Неортогональные линии и LWлинии перемещает на слой "_NOT_ORTO", который должен быть предварительно создан.
Код:
[Выделить все]
 
(vl-load-com)

(defun C:ORTLINE  (/	       *error*	   ORTLINE     *adoc
		   *mospace    *fuzz	   ort-2pnt    nabor->list
		   list-prim)
  (setq	*adoc	 (vla-get-ActiveDocument (vlax-get-acad-object))
	*mospace (vla-get-ModelSpace *adoc))
  (defun *error*  (msg)
    (if	(and msg
	     (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")))
      (princ (strcat "\n** Error: " msg " **")))
    (princ))
  (defun ORTLINE  (/ list-prim ort-2pnt nabor->list)
    (setq ort-2pnt    (lambda (spisok-2pnt)
			(if (< 2 (length spisok-2pnt))
			  (if
			    (OR	(AND (equal (car spisok-2pnt)
					    (caddr spisok-2pnt)
					    *fuzz)
				     (not (equal (car spisok-2pnt)
						 (caddr spisok-2pnt)
						 1e-4)))
				(AND (equal (cadr spisok-2pnt)
					    (cadddr spisok-2pnt)
					    *fuzz)
				     (not (equal (cadr spisok-2pnt)
						 (cadddr spisok-2pnt)
						 1e-4))))
			     (vla-put-layer
			       (vlax-ename->vla-object *primitiv)
			       "_NOT_ORTO")
			     (ort-2pnt (cddr spisok-2pnt)))))
	  nabor->list (lambda (nabor)
			(if nabor
			  (if (/= 0 (sslength nabor))
			    (cons (ssname nabor 0)
				  (nabor->list
				    (ssdel (ssname nabor 0) nabor))))))
	  list-prim   (nabor->list
			(ssget "_:L"
			       (list (cons -4 "<OR")
				     '(0 . "LINE")
				     '(0 . "LWPOLYLINE")
				     (cons -4 "OR>")))))
    (vla-startundomark *adoc)
    (mapcar
      '(lambda (*primitiv)
	 (ort-2pnt
	   (if
	     (= (cdr (assoc 0 (entget *primitiv))) "LWPOLYLINE")
	      (vlax-safearray->list
		(vlax-variant-value
		  (vla-get-Coordinates
		    (vlax-ename->vla-object *primitiv))))
	      (list (cadr (assoc 10 (entget *primitiv)))
		    (caddr (assoc 10 (entget *primitiv)))
		    (cadr (assoc 11 (entget *primitiv)))
		    (caddr (assoc 11 (entget *primitiv)))))))
      list-prim)
    (vla-endundomark *adoc))
  (initget 6)
  (if (not
	(setq *fuzz (getreal "Введите допуск(по умолчанию <0.1>):")))
    (setq *fuzz 0.1))
  (if (NOT (tblsearch "LAYER" "_NOT_ORTO"))
    (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 "_NOT_ORTO") '(70 . 0) (cons 62 1))))
  (ORTLINE)
  (princ))
__________________
Код порою получается жутковат, конешно, и убиться об его можно, да ведь все под богом ходим...

Последний раз редактировалось MEsher, 26.09.2012 в 21:08.
MEsher вне форума  
 
Автор темы   Непрочитано 26.09.2012, 12:39
#13
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


MEsher, работает! Больше спасибо. Ну, а уж с созданием слоя я как-нибудь привыкну.
СПАСИБО!
Малявка вне форума  
 
Непрочитано 26.09.2012, 13:04
1 | #14
MEsher


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


Цитата:
Сообщение от Малявка Посмотреть сообщение
Ну, а уж с созданием слоя я как-нибудь привыкну.
забыл убрать Alert.

Если слоя нет, то создается слой _NOT_ORTO цветом 1 - красный. Исправил выше.
__________________
Код порою получается жутковат, конешно, и убиться об его можно, да ведь все под богом ходим...
MEsher вне форума  
 
Непрочитано 26.09.2012, 13:07
#15
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Малявка Посмотреть сообщение
Ну, а уж с созданием слоя я как-нибудь привыкну.
Вставьте в начало лисп-файла после (vl-load-com):
Код:
[Выделить все]
((lambda (/ new-layer)
   (or (tblsearch "layer" "_NOT_ORTHO")
       (progn
	 (setq
	   new-layer
	    (vla-Add (vla-get-Layers
		       (vla-get-ActiveDocument (vlax-get-acad-object))
		     ) ;_ end of vla-get-Layers
		     "_NOT_ORTHO"
	    ) ;_ end of vla-Add
	 ) ;_ end of setq
	 (vla-put-Color new-layer 4)
	 (vla-put-lineweight new-layer 50)
       ) ;_ end of progn
   ) ;_ end of or
 ) ;_ end of lambda
)
Do$ вне форума  
 
Непрочитано 26.09.2012, 16:07
#16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


Цитата:
Сообщение от Do$ Посмотреть сообщение
((lambda (/ new-layer)...
Ихмо - это Вы перемудрили:
Код:
[Выделить все]
 ((lambda (new-layer)....)
  (vla-Add ...))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.09.2012, 16:52
#17
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Замечание принимается
Все равно это неактуально после исправления MEsher в #12.
Do$ вне форума  
 
Автор темы   Непрочитано 26.09.2012, 20:34
#18
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


А переделанный макрос не работает:
пишет - Неизвестная команда "ORTLINE". Для вызова справки нажмите F1.
(
Малявка вне форума  
 
Непрочитано 26.09.2012, 21:07
#19
MEsher


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


Цитата:
Сообщение от Малявка Посмотреть сообщение
А переделанный макрос не работает:
Offtop: Говорила мне мама, не правь код по месту

теперь должен. Исправлено выше
__________________
Код порою получается жутковат, конешно, и убиться об его можно, да ведь все под богом ходим...
MEsher вне форума  
 
Автор темы   Непрочитано 26.09.2012, 21:25
#20
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


MEsher, Класс! Я на седьмом небе! Спасибо!
Малявка вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нужен макрос выявления "неправильных" ортогональных линий

Реверс. Автоматическая пакетная печать множества рамок (форматов) из пространства модели и листов
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен макрос для AutoCAD, экспортирующий список деталей в текстовый файл technos Программирование 20 24.10.2015 18:11
Нужен макрос для черчения почасовых графиков SON Программирование 2 03.08.2010 21:11
Нужен макрос для команды "стыковка с поворотом" *AllA* AutoCAD 2 15.07.2010 09:53
Нужен макрос (поворот на 90 предварительно выделенного) dextron3 Программирование 20 10.07.2007 21:36
координаты Excel->_line x,y x,y для Acad. нужен макрос на VictorSM Программирование 9 22.01.2006 18:41