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

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

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

Ответ
Поиск в этой теме
Непрочитано 10.06.2013, 17:31 #1
Как выбрать полилинии по определенным значениям высот (Elevation)?
mankurt
 
геодезист
 
Москва
Регистрация: 25.10.2011
Сообщений: 45

Есть куча горизонталей-полилиний - утолщенных, основных, дополнительных, построенных через 0.25м. Они на своей высоте - в elevation забиты значения. Надо вычленить только дополнительные, то есть оканчивающиеся на .25 и .75. Фильтром не получается с помощью*. Может есть какое-то несложное решение без лиспов?
Спасибо.
Просмотров: 5941
 
Непрочитано 10.06.2013, 18:17
#2
CaMoCAD


 
Регистрация: 25.03.2008
Зелик
Сообщений: 1,600


Цитата:
Сообщение от mankurt Посмотреть сообщение
Надо вычленить только дополнительные, то есть оканчивающиеся на .25 и .75
т.е. каждую вторую. Думаю, удалить надо.
Хм, выделяем все, масштабируем х2 относительно крайней (0 или 0,5) --> шаг становится 0,5; потом половину лишних, вылетевших за габарит, - удаляем.
__________________
* Буква "ё" не используется в тексте исключительно в связи с требованиями ЕСКД.
CaMoCAD вне форума  
 
Непрочитано 10.06.2013, 18:27
#3
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


....
mamuk вне форума  
 
Автор темы   Непрочитано 10.06.2013, 18:31
#4
mankurt

геодезист
 
Регистрация: 25.10.2011
Москва
Сообщений: 45


Цитата:
Сообщение от CaMoCAD Посмотреть сообщение
потом половину лишних, вылетевших за габарит, - удаляем.
можно с этого места поподробнее? какой габарит имеется ввиду? они все лишние получаются..
mankurt вне форума  
 
Непрочитано 10.06.2013, 19:51
#5
skkkk


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


Цитата:
Сообщение от mankurt Посмотреть сообщение
Может есть какое-то несложное решение без лиспов?
Лисп не подойдет потому что сложным решение будет или потому что ACAD LT?
На лиспе можно, например, так:
Код:
[Выделить все]
(defun test ( / ss1 ss2 n)
(vl-load-com)
    (setq ss1 (ssget "_X" (list (cons 0 "LWPOLYLINE")))
          ss2 (ssadd)
          n 0
    )
    (repeat (sslength ss1)
        (if (or (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*.25")
                (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*.75")
            )
            (ssadd (ssname ss1 n) ss2)
        )
        (setq n (1+ n))
    )
    (sssetfirst nil ss2)
)
Только лучше добавить в фильтр ssget еще какое-то ограничение (к примеру, имя слоя), потому что выберутся ВСЕ полилинии, на уровне ХХХ.25 и ХХХ.75, а это теоретически могут быть не только горизонтали.
skkkk вне форума  
 
Непрочитано 10.06.2013, 19:53
#6
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


нужно перед этим "кинуть" все горизонтали на свой слой.
Хмурый вне форума  
 
Непрочитано 10.06.2013, 20:09
#7
skkkk


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


Цитата:
Сообщение от Хмурый Посмотреть сообщение
нужно перед этим "кинуть" все горизонтали на свой слой.
Чаще всего на топосъемках горизонтали уже лежат на своем слое или на нескольких своих слоях (допустим, толстые - целые четные, и тонкие - все остальные). Если нет, то да, лучше "кинуть".
И тогда действовать так:
1. Изолировать слой (слои) с горизонталями;
2. Из кода двумя постами выше в строке
Код:
[Выделить все]
(ssget "_X" (list (cons 0 "LWPOLYLINE")))
убрать "_X";
3. Запустить код и на запрос "Выберите объекты:" указать все горизонтали рамкой.
4. Нажать Enter.
Останутся ручки только на нужных горизонталях (либо они будут подсвечены, если их много).
skkkk вне форума  
 
Автор темы   Непрочитано 10.06.2013, 23:08
#8
mankurt

геодезист
 
Регистрация: 25.10.2011
Москва
Сообщений: 45


Цитата:
Сообщение от skkkk Посмотреть сообщение
Лисп не подойдет потому что сложным решение будет или потому что ACAD LT?
Лисп конечно подойдет, просто не думал, что кто-то заморочится и напишет так быстро). Надеялся, что есть какие-то стандартные средства автокада, о которых я не в курсе..
Спасибо огромное все работает). Отключить все посторонние объекты уже дело техники
mankurt вне форума  
 
Непрочитано 11.06.2013, 08:21
#9
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


А можно ли для полной универсальности дополнить этот лисп функцией выбора кратности уровня полилинии?
- выберите объекты -
- укажите кратность (0, 0.25, 0.5, 0.75) <0>
Krovlaf вне форума  
 
Непрочитано 11.06.2013, 11:03
#10
skkkk


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


Код:
[Выделить все]
 (defun test ( / kr ss1 ss2 n oldDIMZIN)
(vl-load-com)
    (defun *error*(msg)
        (if oldDIMZIN (setvar "DIMZIN" oldDIMZIN))
    )
    (setvar "DIMZIN" 0)
    (initget 128 ".00 .25 .50 .75")
    (setq kr (getkword "Укажите кратность: [.00/.25/.50/.75]")
          ss1 (ssget (list (cons 0 "LWPOLYLINE")))
          ss2 (ssadd)
          n 0
          oldDIMZIN (getvar "DIMZIN")
    )
    (repeat (sslength ss1)
        (if (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) (strcat "*" kr))
            (ssadd (ssname ss1 n) ss2)
        )
        (setq n (1+ n))
    )
    (setvar "DIMZIN" oldDIMZIN)
    (if (> (sslength ss2) 0) (sssetfirst nil ss2) (princ (strcat "Нет горизонталей на ХХХ" kr)))
    (princ)
)
skkkk вне форума  
 
Непрочитано 11.06.2013, 11:43
#11
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Спасибо!
Работает!
Не хочу показаться навязчивым, но подскажите как добавить выбор кратности не из существующего списка а вводя значение с клавиатуры.
Krovlaf вне форума  
 
Непрочитано 11.06.2013, 12:06
#12
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
Надеялся, что есть какие-то стандартные средства автокада
угу, есть - называется Civil 3D...
trir вне форума  
 
Непрочитано 11.06.2013, 12:18
#13
skkkk


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


Цитата:
Сообщение от Krovlaf Посмотреть сообщение
как добавить выбор кратности не из существующего списка а вводя значение с клавиатуры
Так можно и с клавиатуры ввести .25 либо .50. Или так не пойдет? Тогда необходимо знать, в каком формате вводить (с точкой/без точки, два знака после точки/один; если введено 5, то это 50 или 25/75 и т.д.)
skkkk вне форума  
 
Непрочитано 11.06.2013, 12:25
#14
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Допустим, нужно выбрать полилинии кратные 5, или 2. Вводя с клавиатуры такие значения ничего не выходит...
Например: 25.5 - выбираются все линии с высотой кратные 25.5, 5.0; 2.75; 0.25 и т.п. соответственно

Последний раз редактировалось Krovlaf, 11.06.2013 в 12:32.
Krovlaf вне форума  
 
Непрочитано 11.06.2013, 12:29
#15
skkkk


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


Кратные 5 - это 5, 10, 15, 20, 25... 50, а также 00? Я правильно понимаю? Или только те, у которых в конце 5 (25, 35, 45....)?
skkkk вне форума  
 
Непрочитано 13.06.2013, 05:29
#16
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Извиняюсь за задержку в ответах. Именно кратность - 5, 10, 15... Это для того чтобы задать одинаковый вес и тип линий уровень которых кратен 5, 0.5, 0.25.
Krovlaf вне форума  
 
Непрочитано 13.06.2013, 09:47
#17
skkkk


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


Все равно не понял: если пользователь введет 5, то это должно расцениваться как ХХХ.05, ХХХ.50 или выбраться должны все из списка ХХХ.05, ХХХ.10, ХХХ.15, ХХХ.20.......? Или пользователь должен ввести непременно две цифры, а, если он ввел одну, то это воспринимается за ошибку и предлагается ввести снова?
Насколько я помню школьную математику и понимаю понятие кратности, число кратно ПЯТИ, если оно делится на 5 без остатка. Т.е. в нашем случае это понятие не совсем корректно. Или совсем некорректно. Но не соображу, как правильно это обозвать.
skkkk вне форума  
 
Непрочитано 13.06.2013, 10:02
#18
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Тогда оставлю понятие кратности (оно здесь не пойдет) и попытаюсь объяснить так:
Если пользователь ввел число 5, то это должно расцениваться как ХХ5.0
если число 0 то ХХ0.0
если число 2 то ХХ(четные).0
если число 0.25 то ХХХ.25 и ХХХ.75
Krovlaf вне форума  
 
Непрочитано 13.06.2013, 10:28
#19
skkkk


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


Я так в общем-то и предполагал, поскольку много работал с топосъемками и видел, что "четные" горизонтали в основном всегда жирнее остальных.
Хорошо, а что будет, если пользователь введет 3 или 4 или 545?
Может, все-таки пользователю не имеет смысла давать право полнейшей свободы действий, а предложить выбрать из списка, например, такого:
ХХХ.00(целые)
ХХ2.00(чётные)
ХХ5.00(кратные 5, кроме целых)
ХХХ.50(кратные 0.5, кроме целых, четных и ХХ5.00)
ХХХ.Х5(кратные 0.25 кроме ХХХ.50 и ХХХ.00).
Либо, предложить ему вводить цифры с клавиатуры, но допустимыми оставить только значения 0, 2, 5, 0.25? Тут опять-таки будет неудобным ввод 0.25 (если стоит русская раскладка и в Windows не настроена точка на циферном блоке при русской раскладке) - запятую ACAD не поймёт, за точкой придется тянуться к буквенному блоку
skkkk вне форума  
 
Непрочитано 13.06.2013, 10:37
#20
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Думаю это правильно:
Цитата:
Может, все-таки пользователю не имеет смысла давать право полнейшей свободы действий,
Это уже получается отдельный фильтр. А нужно что-то попроще.
При этом не обойти вниманием ни "мышечников" (с выбором из списка) ни "кнопочников" (живущих на клавиатуре)
Krovlaf вне форума  
 
Непрочитано 13.06.2013, 11:06
#21
skkkk


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


Еще вопрос: если введено (или выбрано) 2 (четные), а также 5, то должны ли выбираться ХХ0.00?
Думаю, нет.

Последний раз редактировалось skkkk, 13.06.2013 в 11:11.
skkkk вне форума  
 
Непрочитано 13.06.2013, 11:11
#22
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Да, "нули" тоже четные.
Krovlaf вне форума  
 
Непрочитано 13.06.2013, 11:24
#23
skkkk


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


Krovlaf, просьба продумать хорошенечко алгоритм и написать подробнее (вводим 2 -> выбирается то-то и то-то). Дабы переделывать несколько раз не приходилось.

Тут похоже нужен будет определенный порядок работы, вроде такого:
К примеру, у нас все горизонтали имеют вес 0.25
1. Выбираем четные, присваиваем вес, к примеру 0.30
2. Выбираем кратные 5-ти - вес 0.40
3. Выбираем "десятки" - вес 0.50
4. Выбираем 0.5 - вес 0.20
5. Выбираем 0.25/0.75 - вес 0.18
Остальные (целые, судя по всему, оканчивающиеся на 1.00, 3.00, 7.00 и 9.00) остаются 0.25
Так или нет?
skkkk вне форума  
 
Непрочитано 13.06.2013, 11:52
#24
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Я считаю, что в посте 19, Вами сформулирован предельно точный алгоритм выбора горизонталей (если у следящих за веткой есть дополнения/уточнения/поправки - поправьте):
Цитата:
ХХХ.00(целые)
ХХ2.00(чётные ""и нулевые"")
ХХ5.00(кратные 5, кроме целых)
ХХХ.50(кратные 0.5, кроме целых, четных и ХХ5.00)
ХХХ.Х5(кратные 0.25 кроме ХХХ.50 и ХХХ.00).
Либо, предложить ему вводить цифры с клавиатуры, но допустимыми оставить только значения 0, 2, 5, 0.25
Цель лиспа - выбор. Что делать дальше с выбранными горизонталями - дело пользователя (разбросать по слоям, присвоить вес, цвет, тип линии или другое свойство) иногда требуется сделать жирными только четные, иногда только "0" и "5", иногда раскидать по разным слоям основные и вспомогательные (0.5, 0.25) горизонтали, вариантов - масса
Krovlaf вне форума  
 
Непрочитано 13.06.2013, 12:24
#25
skkkk


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


Я ошибся там чуть:
Цитата:
ХХХ.00(целые)
ХХ2.00(чётные ""и нулевые"")
ХХ5.00(кратные 5, кроме целых)
ХХХ.50(кратные 0.5, кроме целых, четных и ХХ5.00)
ХХХ.Х5(кратные 0.25 кроме ХХХ.50 и ХХХ.00).
Вместо красного хотел написать (подразумевал):
ХХ0.00(целые десятки).
Но я так полагаю, что нужна возможность отдельно выбирать и целые, и целые десятки, т е. в итоге список вариантов должен быть таким:
ХХХ.00 (целые) 'или вводим цифру 1
ХХ2.00 (чётные, в том числе десятки ХХ0.00) 'или вводим цифру 2
ХХ5.00 (кратные 5, кроме десятков) - или включая десятки - уточнить 'или вводим цифру 5
ХХ0.00 (десятки) 'или вводим 10
ХХХ.50 (кратные 0.5, кроме целых, четных и ХХ5.00) 'или вводим .5
ХХХ.Х5 (кратные 0.25 кроме ХХХ.50 и ХХХ.00) 'или вводим .25

Постараюсь по мере возможности набросать код.
__________________________________________
Добавлено 1:
Вот, собственно, набросал:
Код:
[Выделить все]
  (defun C:TEST ( / kr ss1 ss2 n oldDIMZIN)
(vl-load-com)
    (defun *error*(msg)
        (if oldDIMZIN (setvar "DIMZIN" oldDIMZIN))
    )
    (sssetfirst nil nil)
    (setvar "DIMZIN" 0)
    (while (and
            (/= kr "1")
            (/= kr "2")
            (/= kr "5")
            (/= kr "10")
            (/= kr ".5")
            (/= kr ".25")
           )
        (princ "\nНеверный ввод")
        (initget 128 "ХХХ.00 ХХ2.00 ХХ5.00 ХХ0.00 ХХХ.50 ХХХ.Х5_1 2 5 10 .5 .25")
        (setq kr (getkword "\nУкажите или введите критерий выбора: [ХХХ.00 целые (1)/ХХ2.00 целые четные (2)/ХХ5.00 пятерки (5)/ХХ0.00 десятки (10)/ХХХ.50 половинные (.5)/ХХХ.Х5 четвертные (.25)]"))
    ) ;while
    (setq ss1 (ssget (list (cons 0 "LWPOLYLINE")))
          ss2 (ssadd)
          n 0
          oldDIMZIN (getvar "DIMZIN")
    ) ;setq
    (cond 
      ((= kr "1")
            (repeat (sslength ss1)
                (if (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*.00")
                    (ssadd (ssname ss1 n) ss2)
                )
                (setq n (1+ n))
            )
      ) ;kr "1"    
      ((= kr "2")
            (repeat (sslength ss1)
                (if (or
                        (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*0.00")
                        (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*2.00")
                        (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*4.00")
                        (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*6.00")
                        (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*8.00")
                    )
                    (ssadd (ssname ss1 n) ss2)
                )
                (setq n (1+ n))
            )
      ) ;kr "2"    
      ((= kr "5")
            (repeat (sslength ss1)
                (if (or (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*5.00")
                        (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*0.00")
                    )
                    (ssadd (ssname ss1 n) ss2)
                )
                (setq n (1+ n))
            )
      ) ;kr "5"
      ((= kr "10")
            (repeat (sslength ss1)
                (if (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*0.00")
                    (ssadd (ssname ss1 n) ss2)
                )
                (setq n (1+ n))
            )
      ) ;kr "10"
      ((= kr ".5")
            (repeat (sslength ss1)
                (if (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*.50")
                    (ssadd (ssname ss1 n) ss2)
                )
                (setq n (1+ n))
            )
      ) ;kr ".5"
      ((= kr ".25")
            (repeat (sslength ss1)
                (if (or
                        (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*.25")
                        (wcmatch (rtos (vla-get-Elevation (vlax-ename->vla-object (ssname ss1 n))) 2 2) "*.75")
                    )
                    (ssadd (ssname ss1 n) ss2)
                )
                (setq n (1+ n))
            )
      ) ;kr ".25"    
    ) ;cond
    (setvar "DIMZIN" oldDIMZIN)
    (if (> (sslength ss2) 0) (sssetfirst nil ss2) (princ (strcat "Нет горизонталей с указанным критерием выбора:" kr)))
    (princ)
) ;defun
Задействовал алгоритм, описанный мною в данном (#25) посте чуть выше.
Сделал командой (C:TEST) - вызывать без скобок.
При вызове команды (при включенном динамическом вводе) появится выпадающий список с вариантами фильтрации. Можно выбрать из списка, а можно ввести с клавиатуры значения, выделенные в описании алгоритма зеленым (они также обозначены подсказками в скобках в выпадающем списке).
Пустой ввод, а также ввод иных значений кроме разрешенных - недопустим.
Выход по Escape.
Тестировал на прилагаемом файле.
__________________________________________
Добавлено 2:
Подправил код так, чтоб при выборе пятерок выбирались и десятки (замеч. в #26)
Вложения
Тип файла: dwg
DWG 2010
Для dwg.ru выбор горизонталей.dwg (65.8 Кб, 736 просмотров)

Последний раз редактировалось skkkk, 13.06.2013 в 21:37. Причина: Добавил код и инструкции к нему, подправил код.
skkkk вне форума  
 
Непрочитано 13.06.2013, 16:01
#26
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Протестировал на своем примере (у меня до сих пор 2008 (точнее 2008++)). Наверное все возможные варианты учтены (от М 1:1000 до М 1:100000). Касаемо включения "10" в "5" - это надо сделать. Я не помню случаев когда выделялись "5" без "10". А так все работает прекрасно! Спасибо за понимание, труды и потраченное драгоценное. Надеюсь многим будет полезен. Лично для меня данный лисп очень кстати - предстоит большая работа по оцифровке топопланов.

Последний раз редактировалось Krovlaf, 13.06.2013 в 16:07.
Krovlaf вне форума  
 
Непрочитано 13.06.2013, 16:42
#27
skkkk


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


Цитата:
Сообщение от Krovlaf Посмотреть сообщение
Касаемо включения "10" в "5" - это надо сделать.
Поправил в #25.
Цитата:
Сообщение от Krovlaf Посмотреть сообщение
Я не помню случаев когда выделялись "5" без "10".
А "10" без "5" оставить?

Вот в этой теме, начиная с поста #15, обсуждали, как называются горизонтали. Нашлись условные обозначения, так в них горизонтали подразделяют на:
  • основные утолщенные
  • основные
  • дополнительные (полугоризонтали)
  • вспомогательные (на произвольной высоте)
Но думаю, в рамках этого лиспа нет смысла пользоваться данной терминологией, потому как горизонтали начинают попадать под приведенные определения уже после выбора и обработки. Если есть - пишите предложения - исправлю.

Последний раз редактировалось skkkk, 13.06.2013 в 16:55.
skkkk вне форума  
 
Непрочитано 14.06.2013, 11:26
#28
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


"10" без "5" оставить!
Представленный лисп может выделить все типы горизонталей за исключением вспомогательных (на произвольной высоте). Обработать последние не составит труда тем же исключением. Еще раз спасибо за программку!
Krovlaf вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как выбрать полилинии по определенным значениям высот (Elevation)?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Как грамотно выбрать направление дуги у полилинии? ira228 AutoCAD 19 22.09.2012 14:47
Распределение точек по полилинии с определенным расстоянием между ними ПО ПРЯМОЙ Prestan AutoCAD 10 14.10.2010 22:54