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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > (Lisp) интерактивно выбрать только горизонтальные или вертикальные линейные размеры ?

(Lisp) интерактивно выбрать только горизонтальные или вертикальные линейные размеры ?

Ответ
Поиск в этой теме
Непрочитано 15.08.2013, 16:15 #1
(Lisp) интерактивно выбрать только горизонтальные или вертикальные линейные размеры ?
andrey76andreev
 
Регистрация: 03.12.2012
Сообщений: 15

Добрый день уважаемые форумчане.

Вопрос такой : хотелось бы интерактивно выбрать только горизонтальные или вертикальные ЛИНЕЙНЫЕ размеры. Как я понимаю без Lisp кода не обойтись ... Подскажите позжайлуста функции которые нужно использовать или весь код - если особо не затруднительно.

Заранее премного благодарен за любую помощь!!!
Просмотров: 5542
 
Непрочитано 15.08.2013, 16:27
1 | #2
Do$

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


Чтобы подсказывать, надо конкретизировать задачу.
Линейные размеры бывают двух типов: Rotated и Alignment. В русском варианте что-то типа "Поворачиваемый" и "Выровненный". Под термином ЛИНЕЙНЫЕ оба этих типа подразумеваются?
Выбрать на всем чертеже/в модели/в текущем листе?
Размерные стили игнорируются?
Do$ вне форума  
 
Непрочитано 15.08.2013, 16:38
1 | #3
Кулик Алексей aka kpblc
Moderator

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


И чего самостоятельно сделано, поскольку вопрос в "Программировании"?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.08.2013, 16:43
#4
andrey76andreev


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


Do$ спасибо что откликнулись !!!

Цитата:
Сообщение от Do$ Посмотреть сообщение
Размерные стили игнорируются?
- да

Выбрать на всем чертеже/в модели/в текущем листе?
Желательно в модели. но можно в листе (что по проще) - я там сам подстроюсь

также без разницы ко всему чертежу или к выбранным обьектам (как я понимаю будет использоваться qselect) - я там сам подстроюсь

Цитата:
Сообщение от Do$ Посмотреть сообщение
Линейные размеры бывают двух типов: Rotated и Alignment. В русском варианте что-то типа "Поворачиваемый" и "Выровненный". Под термином ЛИНЕЙНЫЕ оба этих типа подразумеваются?
это вы имеете ввиду линейный (он как раз бывает только горизонтальный и вертикальный) и параллельный (он паралелен тому обекту который образмеривается)? - если все верно - то только линейные (который вероятно всего Alignment "Выровненный" (но точно не знаю))...

Кулик Алексей aka kpblc - спасибо что и вы откликнулись !!!
И чего самостоятельно сделано, поскольку вопрос в "Программировании"?

- (command "_.qselect" "???" - как я понимаю здесь и вся загвоздка ....

Последний раз редактировалось andrey76andreev, 15.08.2013 в 16:50.
andrey76andreev вне форума  
 
Непрочитано 15.08.2013, 17:20
1 | #5
Do$

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


Если бы у QSELECT был недиалоговый режим, мир был бы другим
Так что про COMMAND можно забыть пока.
Наши друзья:
SSSETFIRST - чтобы выделить нужное
SSGET - чтобы сформировать набор для нужных объектов
SSDEL - чтобы удалять из набора неподходящие элементы
Do$ вне форума  
 
Автор темы   Непрочитано 15.08.2013, 17:58
#6
andrey76andreev


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


Был бы очень признателен если бы вы дали код по конкретнее.

- вот так выделяет все линейные размеры
(setq ss2 (ssget "_X" '((0 . "Dimension") )))

(sssetfirst nil ss2)

, подкажите позжайлуста как удалить горизонтальные ssdel ?

Последний раз редактировалось andrey76andreev, 15.08.2013 в 18:30.
andrey76andreev вне форума  
 
Непрочитано 15.08.2013, 18:40
1 | #7
Do$

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


Конкретнее надо время чтобы сидеть придумывать. Я так с ходу и не скажу как отличить вертикальный от горизонтального размера, подозреваю, что надо извлекать какие-то точки и сравнивать. Как вариант - попробовать поискать здесь, на болоте, кадузере и т.п., может уже кто-то подобное писал.
Do$ вне форума  
 
Автор темы   Непрочитано 15.08.2013, 18:54
#8
andrey76andreev


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


Do$ спасибо что помогате.
искал на этом форуме, ничего похожего не нашел.

а болото, кадузер это тоже форумы ???

Помогите позжайлуста с кодом кто нибудь ...
andrey76andreev вне форума  
 
Непрочитано 15.08.2013, 19:41
1 | #9
Do$

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


Цитата:
Сообщение от andrey76andreev Посмотреть сообщение
а болото, кадузер это тоже форумы ???
http://www.theswamp.org/
http://www.caduser.ru/forum/
Do$ вне форума  
 
Непрочитано 15.08.2013, 19:52
#10
Boxa

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


Цитата:
Сообщение от andrey76andreev Посмотреть сообщение
Помогите позжайлуста с кодом кто нибудь ...
С этим вопросом сюда: http://forum.dwg.ru/forumdisplay.php?f=33
Boxa вне форума  
 
Непрочитано 16.08.2013, 00:55
1 | #11
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от andrey76andreev Посмотреть сообщение
Добрый день уважаемые форумчане.

Вопрос такой : хотелось бы интерактивно выбрать только горизонтальные или вертикальные ЛИНЕЙНЫЕ размеры. Как я понимаю без Lisp кода не обойтись ... Подскажите позжайлуста функции которые нужно использовать или весь код - если особо не затруднительно.

Заранее премного благодарен за любую помощь!!!
Попробуй
Код:
[Выделить все]
 ;; Вертикальные
(defun C:VERD  (/ elist ent sset)
  (prompt "\nSelect dimensions >>")
  (if (setq sset (ssget
		   (list (cons -4 "<and")
			 (cons 0 "DIMENSION")
			 (cons -4 "=")
			 (cons 70 32)
			 (cons -4 "<or")
			 (cons -4 "=")
			 (cons 50 (* pi 0.5))
			 (cons 50 (* pi 1.5))
			 (cons -4 "or>")
			 (cons -4 "and>"))))
    (progn
     
      (while (setq ent (ssname sset 0))
	(setq elist (entget ent))
	(if (assoc 62 elist)
	  (entmod (subst (cons 62 1) (assoc 62 elist) elist))
	  (entmod (setq elist (append elist (list (cons 62 1))))))
	(ssdel ent sset))
      )
    )
  (princ)
  )

;; Горизонтальные
(defun C:HORD  (/ elist ent sset)
  (prompt "\nSelect dimensions >>")
  (if (setq sset (ssget
		   (list (cons -4 "<and")
			 (cons 0 "DIMENSION")
			 (cons -4 "=")
			 (cons 70 32)
			 (cons -4 "<or")
			 (cons -4 "=")
			 (cons 50 0.0)
			 (cons 50 pi)
			 (cons -4 "or>")
			 (cons -4 "and>"))))
    (progn
     
      (while (setq ent (ssname sset 0))
	(setq elist (entget ent))
	(if (assoc 62 elist)
	  (entmod (subst (cons 62 3) (assoc 62 elist) elist))
	  (entmod (setq elist (append elist (list (cons 62 3))))))
	(ssdel ent sset))
      )
    )
  (princ)
  )
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 16.08.2013, 11:28
#12
andrey76andreev


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


Олег (jr.) спасибо дружище - все работает !!! Долгих лет тебе, богатырского здоровья, жену фотомодель, и всего самого хорошего!!!

Огромное уважение !!! Спасибо
andrey76andreev вне форума  
 
Непрочитано 16.08.2013, 14:03
#13
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Не за что, это самые азы,
на будущее приобрети книгу НН Полещука,
очень рекомендую,
Удачи
Олег (jr.) вне форума  
 
Непрочитано 16.08.2013, 14:36
1 | #14
MrBrown

ПенсионЭр
 
Регистрация: 26.06.2009
Сообщений: 361


Олег (jr.), от меня тоже отдельно спасибо, классный макрос. Ну, может быть, уж до конца добьёте его - добавите функцию выбора выровненных размеров, неортогональных, типа "defun c: ALIGND".
Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
приобрети книгу НН Полещука
Тоже приобрёл, а толку - ноль
(Да читаю я, читаю. Не просто смотрю на корешок книги, стоящей на полке.)
p.s. догадываюсь, что надо что-то изменить в строках, где фигурирует "pi".
Или же в строках, где (cons -4 "="), поставить "не равно" (программным способом, конечно).

p.p.s хотя, эта функция уже есть в быстром выборе.
Что-то я перегрелся: пятница, конец недели.

Последний раз редактировалось MrBrown, 16.08.2013 в 14:49.
MrBrown вне форума  
 
Непрочитано 16.08.2013, 16:08
1 | #15
Do$

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


Посмотрите дамп выровненных и повернутых размеров (entget (car (entsel "\nSelect object:"))). Там есть в 100 группе различия. Соответственно, чтобы выбрать то или иное, эти пары нужно добавить в фильтр SSGET.
Do$ вне форума  
 
Непрочитано 16.08.2013, 16:23
2 | #16
VVA

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Там есть в 100 группе различия
Есть еще различие в значении dxf group 70 (= 33)
MrBrown, Изменения выделил красным
Код:
[Выделить все]
(defun C:ALIGND  (/ elist ent sset)
  (prompt "\nSelect dimensions >>")
  (if (setq sset (ssget
		   (list (cons -4 "<and")
			 (cons 0 "DIMENSION")
			 (cons -4 "=")
			 (cons 70 33)
			 (cons -4 "and>"))))
    (progn
     
      (while (setq ent (ssname sset 0))
	(setq elist (entget ent))
	(if (assoc 62 elist)
	  (entmod (subst (cons 62 1) (assoc 62 elist) elist))
	  (entmod (setq elist (append elist (list (cons 62 1))))))
	(ssdel ent sset))
      )
    )
  (princ)
  )
Насчет неортогональных нужно, наверное, анализировать угол между точками в группах 13 и 14
PS Как вариант (вроде должен покрасить неортогональные выравненные размеры
Код:
[Выделить все]
(defun C:ALIGND1  (/ elist ent sset)
  (prompt "\nSelect dimensions >>")
  (if (setq sset (ssget
		   (list (cons -4 "<and")
			 (cons 0 "DIMENSION")
			 (cons -4 "=")
			 (cons 70 33)
			 (cons -4 "and>"))))
    (progn
     (while (setq ent (ssname sset 0))
	(setq elist (entget ent))
	(if
             (and
               (not(equal (angle(cdr(assoc 13 elist))(cdr(assoc 14 elist))) 0.0 1e-6))
               (not(equal (angle(cdr(assoc 13 elist))(cdr(assoc 14 elist))) pi 1e-6))
               )
          (if (assoc 62 elist)
            (entmod (subst (cons 62 1) (assoc 62 elist) elist))
            (entmod (setq elist (append elist (list (cons 62 1)))))
            )
          )
	(ssdel ent sset))
      )
    )
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 16.08.2013 в 16:38.
VVA вне форума  
 
Непрочитано 17.08.2013, 00:20
1 | #17
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


@VVA,
Спасибо
Олег (jr.) вне форума  
 
Непрочитано 17.08.2013, 14:11
1 | #18
VVA

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


В #16 в and нужно добавить проверку углов на 90 и 270 градусов
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 23.08.2013, 02:11
#19
andrey76andreev


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


Доброй ночи уважаемые форумчане !!! Спасибо присоединившимся к теме за присоединение
MrBrown был прав в лиспе Олег (jr.) (которому огромное спасибо за помощь !!!) есть недочет - если в проставленных размерах пользователь изменил расположение значений на стрелке или сделал вынеску, то эти размеры лисп не определяет как вертикальные или горизонтальные (взависимости от того чего выбирали).

как я понял VVA (спасибо за помощь,УВАЖЕНИЕ !!!) исправил этот недочет. Но я попытался использовать оба - и они не выбирали вообще никаких размеров. Эти два лиспа (которые написали Олег (jr.) и VVA) нужно как то хитроумно соединить ???(чтобы лисп выделял вертикальные или горизонтальные размеры даже изменные пользователем) И как это сделать ???

Заранее огромное спасибо за помошь !!!
andrey76andreev вне форума  
 
Непрочитано 26.08.2013, 09:21
1 | #20
VVA

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


Цитата:
Сообщение от andrey76andreev Посмотреть сообщение
как я понял VVA (спасибо за помощь,УВАЖЕНИЕ !!!) исправил этот недочет.
Нет не исправил.
Пробуй сейчас
Код:
[Выделить все]
 ;;; (Lisp) интерактивно выбрать только горизонтальные или вертикальные линейные размеры ?
;;;http://forum.dwg.ru/showthread.php?t=102626
;;; Вертикальные
(defun C:VERD (/ elist ent sset)
  (prompt "\nSelect dimensions >>")
  (if (setq sset (ssget
                   (list (cons -4 "<and")
                         (cons 0 "DIMENSION")
                         (cons -4 "<or")
                         (cons 50 (* pi 0.5))
                         (cons 50 (* pi 1.5))
                         (cons -4 "or>")
                         (cons -4 "and>")
                   ) ;_ end of list
                 ) ;_ end of ssget
      ) ;_ end of setq
    (progn
      (while (setq ent (ssname sset 0))
        (setq elist (entget ent))
        (if (and
              (= (boole 1 32 (cdr (assoc 70 elist))) 32)
              (/= (boole 1 1 (cdr (assoc 70 elist))) 1)
            ) ;_ end of and
          (if (assoc 62 elist)
            (entmod (subst (cons 62 1) (assoc 62 elist) elist));_1-цвет размера
            (entmod (setq elist (append elist (list (cons 62 1)))));_1-цвет размера
          ) ;_ end of if
        ) ;_ end of if
        (ssdel ent sset)
      ) ;_ end of while
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun

;; Горизонтальные
(defun C:HORD (/ elist ent sset)
  (prompt "\nSelect dimensions >>")
  (if (setq sset (ssget
                   (list (cons -4 "<and")
                         (cons 0 "DIMENSION")
                         (cons -4 "<or")
                         (cons 50 0.0)
                         (cons 50 pi)
                         (cons -4 "or>")
                         (cons -4 "and>")
                   ) ;_ end of list
                 ) ;_ end of ssget
      ) ;_ end of setq
    (progn

      (while (setq ent (ssname sset 0))
        (setq elist (entget ent))
        (if (and
              (= (boole 1 32 (cdr (assoc 70 elist))) 32)
              (/= (boole 1 1 (cdr (assoc 70 elist))) 1)
            ) ;_ end of and
          (if (assoc 62 elist)
            (entmod (subst (cons 62 3) (assoc 62 elist) elist)) ;_3-цвет размера
            (entmod (setq elist (append elist (list (cons 62 3)))));_3-цвет размера
          ) ;_ end of if
        ) ;_ end of if
        (ssdel ent sset)
      ) ;_ end of while
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun
;;;Пареллельные
(defun C:ALIGND (/ elist ent sset ang)
  (prompt "\nSelect dimensions >>")
  (if (setq sset (ssget (list (cons 0 "DIMENSION"))))
    (progn
      (while (setq ent (ssname sset 0))
        (setq elist (entget ent)
              ang   (angle (cdr (assoc 13 elist)) (cdr (assoc 14 elist)))
        ) ;_ end of setq
        (if (and
              (= (boole 1 32 (cdr (assoc 70 elist))) 32)
              (= (boole 1 1 (cdr (assoc 70 elist))) 1) ;_ 32+1=33
            ) ;_ end of and
          (cond
            ((equal (angle (cdr (assoc 13 elist)) (cdr (assoc 14 elist)))
                    0.0
                    1e-6
             ) ;_ end of equal
            ) ;_Угол 0
            ((equal (angle (cdr (assoc 13 elist)) (cdr (assoc 14 elist)))
                    pi
                    1e-6
             ) ;_ end of equal
            ) ;_Угол 180
            ((equal (angle (cdr (assoc 13 elist)) (cdr (assoc 14 elist)))
                    (* 0.5 pi)
                    1e-6
             ) ;_ end of equal
            ) ;_Угол 90
            ((equal (angle (cdr (assoc 13 elist)) (cdr (assoc 14 elist)))
                    (* 1.5 pi)
                    1e-6
             ) ;_ end of equal
            ) ;_Угол 270
            (t ;_Остальные углы
             (if (assoc 62 elist)
               (entmod (subst (cons 62 5) (assoc 62 elist) elist));_5-цвет размера
               (entmod (setq elist (append elist (list (cons 62 5)))));_5-цвет размера
             ) ;_ end of if
            )
          ) ;_ end of cond
        ) ;_ end of if
        (ssdel ent sset)
      ) ;_ end of while
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 26.08.2013, 18:42
#21
andrey76andreev


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


VVA Спасибо !!! - теперь все ништяк.
andrey76andreev вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > (Lisp) интерактивно выбрать только горизонтальные или вертикальные линейные размеры ?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Как интерактивно выбрать только горизонтальные или вертикальные размеры ? andrey76andreev AutoCAD 2 15.08.2013 15:58