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

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

Сортировка текстовых примитивов

Ответ
Поиск в этой теме
Непрочитано 11.12.2007, 13:00 #1
Сортировка текстовых примитивов
CB
 
Конструирование в области нефтеразведки
 
Гомель
Регистрация: 10.02.2006
Сообщений: 321

Код представленный ниже создает список выбранных текстовых примитивов, отсортированных по убыванию Y-координаты:
Код:
[Выделить все]
(defun sel_txt (/ sset)
  (if (setq sset (ssget '((0 . "*TEXT"))))
    (mapcar (function (lambda (x)
                        (cdr (assoc '1 (entget x)))
                      ) ;_ end of lambda
            ) ;_ end of function
            (vl-sort
              (vl-remove-if
                (function listp)
                (mapcar (function cadr)
                        (ssnamex sset)
                ) ;_ end of mapcar
              ) ;_ end of vl-remove-if
              (function (lambda (x y)
                          (>
                            (caddr (assoc '10 (entget x)))
                            (caddr (assoc '10 (entget y)))
                          ) ;_ end of >
                        ) ;_ end of lambda
              ) ;_ end of function
            ) ;_ end of vl-sort
    ) ;_ end of mapcar
  ) ;_ end of if
) ;_ end of defun
Вопрос в следующем - как можно дополнительно отсортировать текст по такому критерию - если в выбранном тексте встретились примитивы с одинаковыми Y-координатами , то эти примитивы отсортировать по увеличению X-координаты...
Просмотров: 2916
 
Непрочитано 11.12.2007, 13:13
#2
Кулик Алексей aka kpblc
Moderator

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


Попробуй так:
Код:
[Выделить все]
(vl-sort
  (vl-sort
    (vl-remove-if
      (function listp)
      (mapcar (function cadr)
              (ssnamex sset)
              ) ;_ end of mapcar
      ) ;_ end of vl-remove-if
    (function (lambda (x y)
                (> (caddr (assoc '10 (entget x)))
                   (caddr (assoc '10 (entget y)))
                   ) ;_ end of >
                ) ;_ end of lambda
              ) ;_ end of function
    ) ;_ end of vl-sort
  '(lambda (a b) (> (cadr (assoc 10 (entget a))) (cadr (assoc 10 (entget b)))))
  ) ;_ end of vl-sort
Код не проверял.
Но перед использованием кода просмотри http://www.arcada.com.ua/forum/viewtopic.php?t=653
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 11.12.2007 в 15:01. Причина: Исправил последнюю сортировку car -> cadr
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.12.2007, 14:08
#3
VVA

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


Код:
[Выделить все]
(defun sel_txt (/ sset)
  (if (setq sset (ssget '((0 . "*TEXT"))))
    (mapcar (function (lambda (x)
   (cdr (assoc '1 (entget x)))
        ) ;_ end of lambda
     ) ;_ end of function
     (vl-sort
       (vl-remove-if
  (function listp)
  (mapcar (function cadr)
   (ssnamex sset)
  ) ;_ end of mapcar
       ) ;_ end of vl-remove-if
       '(lambda (a b)
   (or
     (> (caddr (assoc '10 (entget a)))
        (caddr (assoc '10 (entget b)))
     ) ;_ on Y
     (and  ;_ On X if eq Y
   (equal (caddr (assoc '10 (entget a)))
          (caddr (assoc '10 (entget b)))
          1e-6
   ) ;_ end of equal
   (< (cadr (assoc '10 (entget a)))
      (cadr (assoc '10 (entget b)))
   ) ;_ end of <
     ) ;_ end of and
   ) ;_ end of or
        ) ;_ end of lambda
     ) ;_ end of vl-sort
    ) ;_ end of mapcar
  ) ;_ end of if
) ;_ end of defun
Тоже код не проверял
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 11.12.2007 в 15:54. Причина: Замечание CB #7
VVA вне форума  
 
Автор темы   Непрочитано 11.12.2007, 14:20
#4
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Да нет - это не то, даже если учесть, что (car (assoc 10.. - опечатка, потому что тогда предыдущая сортировка по Y уходит в никуда...
Пример того, что надо получить:
1-я строка: текст1 текст2 текст3 [Y1 одинаков X разный]
2-я строка: текст4 текст5 текст6 [Y2 одинаков X разный]
Y1>Y2
................................
Результат: (текст1 текст2 текст3 текст4 текст5 текст6)
А получается например так: (текст2 текст1 текст3 текст5 текст4 текст6) т.е. по Y нормально, а по X - фигня...
CB вне форума  
 
Непрочитано 11.12.2007, 14:54
#5
VVA

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


Ты про какой пост говоришь?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 11.12.2007, 15:22
#6
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Про пост №2
Ты
CB вне форума  
 
Автор темы   Непрочитано 11.12.2007, 15:44
#7
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Пост #3(VVA) - все работает нормально - только надо изменить в строчке
(< (cadr (assoc '10 (entget a)))
(caddr (assoc '10 (entget b)))
) ;_ end of <
на cadr
Спасибо за помощь!
CB вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Сортировка текстовых примитивов

Реклама i
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
список свойств параметров примитивов leonardo23 AutoCAD 7 10.01.2007 09:02
Выбор всех примитивов одним кликом DANZZ AutoCAD 5 12.08.2006 17:49
Выбор примитивов в функции (command) mmax Программирование 12 19.05.2006 20:02
Шаблон для текстовых документов по ГОСТ 2.105-95 Бриг Поиск литературы, чертежей, моделей и прочих материалов 36 16.10.2005 12:28
Rotate текстовых элементов относительно точки вставки plaz AutoCAD 2 19.09.2003 08:37