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

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

Как отсортировать слои по числовым значениям?

Ответ
Поиск в этой теме
Непрочитано 27.01.2009, 15:15 #1
Как отсортировать слои по числовым значениям?
Olga_@@@
 
Екатеринбург
Регистрация: 14.03.2008
Сообщений: 678

Проблема:
есть файл(ы) с кучей слоев в именах которых содержатся только числовые значения. Автокад их сортирует, как текст: 1, 110, 14 и т.д.
Можно ли как-то изменить порядок сортировки, что бы было так: 1, 14, 110 ???
Просмотров: 1956
 
Непрочитано 27.01.2009, 15:17
#2
Profan


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


001
014
110
Profan вне форума  
 
Автор темы   Непрочитано 27.01.2009, 15:25
#3
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Profan, у меня названия слоев создаются при выполнении запроса по значению поля Elevation. Как в процессе запроса вставить нули... чего-то не соображу. Там нет вроде такой функции...
Olga_@@@ вне форума  
 
Непрочитано 27.01.2009, 15:28
#4
Кулик Алексей aka kpblc
Moderator

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


Olga_@@@, названия слоев назначаются пользовательским лиспом? Или какой-то встроенной функцией?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.01.2009, 15:33
#5
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


запросом Autodesk Map, т.е. встроенной функцией, но это не функция базового автокада
Olga_@@@ вне форума  
 
Непрочитано 27.01.2009, 15:44
#6
Кулик Алексей aka kpblc
Moderator

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


Ясно... Образец файла в теме http://forum.dwg.ru/showthread.php?t=29433 покатит?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.01.2009, 15:52
#7
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Кулик Алексей aka kpblc, в том файле набор слоев неудачный попался, они там все ###_m. Я лучше другой сделаю.
PS если стандартными средствами это не решается, то может быть объединить это с задачей в той теме??? или лучше по отдельности?
Olga_@@@ вне форума  
 
Непрочитано 27.01.2009, 16:19
#8
Кулик Алексей aka kpblc
Moderator

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


Думаю, что лучше в этой теме образец. Вопрос сразу: какие примитивы понадобится обрабатывать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.01.2009, 16:20
#9
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


полилинии
Olga_@@@ вне форума  
 
Непрочитано 27.01.2009, 21:27
#10
VVA

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


Olga_@@@, А если "нормализовать" слои как показано в #2?
Тогда Автокад отсортирует их по порядку
Код:
[Выделить все]
;;;LayerSort
(defun c:LayS ()
;;;================================================================================
;;;Written By Michael Puckett. 
;;;Список элементов символьных таблиц АвтоКАДа 
;;; - s- имя таблицы
;;;Пример - список всех слоев - (setq all_layers (tablelist "LAYER"))
;;;(setq all_layers (tablelist "LAYER"))
;;;
;;;AutoLisp should return something like this :
;;;Start Coding Here 
(defun tablelist (s / d r)
  (while (setq d (tblnext s (null d)))
    (setq r (cons (cdr (assoc 2 d)) r))
  )					;while
)					;defun
;;;End Coding Here
  ;;-------------------------------------------------
  ;;  function to Count the longest number in string 
  ;;  CAB added to get the correct COUNT
  (defun getcount (lst / count pat)
    (setq count 0)
    (setq pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
    (mapcar
      '(lambda (str / i maxlen ch)
         (setq i 0 maxlen 0)
         (while (/= (setq ch (substr str (setq i (1+ i)) 1)) "")
           (if (vl-position ch pat) ; number
             (setq maxlen (1+ maxlen))
             (setq count  (max count maxlen) maxlen 0)
           )
         )
	 (setq count  (max count maxlen)) ;_<<< ADD 21.06.2007 by 
       )
      Lst
    )
    count
  )
;;;Function Normalize (add 0 befor number) number in string
;;; Count normalize symbols set in variable count
;;; CAB added count as an argument
  (defun NormalizeNumberInString (str count / ch i pat ret buf)
    (setq i   0
          pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
          ret ""
    ) ;_ end of setq
    (while (/= (setq ch (substr str (setq i (1+ i)) 1)) "")
      (if (vl-position ch pat)
        (progn
          (setq buf ch) ;_ end of setq
          (while
            (vl-position (setq ch (substr str (setq i (1+ i)) 1)) pat)
             (setq buf (strcat buf ch))
          ) ;_ end of while
          (while (< (strlen buf) count) (setq buf (strcat "0" buf)))
          (setq ret (strcat ret buf))
        ) ;_ end of progn
      ) ;_ end of if
      (setq ret (strcat ret ch))
    ) ;_ end of while
    ret
  ) ;_ end of defun

(setq lay-list (tablelist "LAYER"))
(setq count  (1+ (GetCount  lay-list))
        NorStrs (mapcar '(lambda (x) (NormalizeNumberInString x count))
                        lay-list)
      tmp lay-list
  )
(mapcar '(lambda(x y / i lay)
           (setq i 0)
           (while (member y tmp)
             (setq y (strcat y (itoa(setq i (1+ i)))))
             )
           (VL-CATCH-ALL-APPLY '(lambda()
           (setq lay (vla-item (vla-get-Layers(vla-get-activedocument (vlax-get-acad-object))) x))
           (vla-put-name lay y)
                                  )
             )
           (setq tmp (cons y tmp))
           )
        lay-list NorStrs
        )
  (princ "\nГотово")
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.01.2009, 21:33
#11
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


VVA, спасибо, попробую.
Olga_@@@ вне форума  
 
Автор темы   Непрочитано 28.01.2009, 01:23
#12
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Кулик Алексей aka kpblc, примеры здесь (облегченный вариант без примитивов)
Вложения
Тип файла: dwg
DWG 2004
V1.dwg (99.0 Кб, 377 просмотров)
Тип файла: dwg
DWG 2004
V2.dwg (87.2 Кб, 377 просмотров)

Последний раз редактировалось Olga_@@@, 28.01.2009 в 17:34. Причина: заменила вложенные файлы
Olga_@@@ вне форума  
 
Автор темы   Непрочитано 28.01.2009, 17:40
#13
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


VVA, код работает, хотя отрицательные значения все равно идут в противоестественном порядке. Но, это не проблема кода, просто автокад любые названия слоев воспринимает только как текст, к сожалению.
Но, все равно с переименованными слоями работать намного легче . Огромное спасибо!
Olga_@@@ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как отсортировать слои по числовым значениям?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как убрать неиспользуемые видовые слои? Mikhail AutoCAD 14 16.09.2011 13:28
Как именно настроить параметры нового чертежа? Макс_Северянин AutoCAD 31 01.09.2010 10:16
Мониторы LCD CRT Разное 94 17.06.2008 10:51