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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Удаление объектов из пространства листа

Удаление объектов из пространства листа

Ответ
Поиск в этой теме
Непрочитано 21.08.2007, 11:59 #1
Удаление объектов из пространства листа
paradoxvaha
 
проектирование противооползневых сооружений
 
Yalta
Регистрация: 06.04.2007
Сообщений: 50

День добрый! Вот возник такой вопрос - как можно удалить из пространства листа объекты (к примеру выделить то, что попадает в секущую рамку с такими то координатами и всё это удалить), возможно ли такое?
Просмотров: 9968
 
Непрочитано 21.08.2007, 12:03
#2
Кулик Алексей aka kpblc
Moderator

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


А в чем конкретно проблема? Нпример, так
Код:
[Выделить все]
(defun tmp (/ selset)
  (if (setq selset (ssget "_:L"))
    (command "_.erase" "_P" "")
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.08.2007, 13:53
#3
paradoxvaha

проектирование противооползневых сооружений
 
Регистрация: 06.04.2007
Yalta
Сообщений: 50
<phrase 1=


Вопрос в том, что объектов в пространстве листа достаточно много и разного типа (линии, текст, окружности), а также есть такие объекты, которые удалять ненадо. Последовательность нанесения этих объектов в пространство листа (тех что надо удалять и тех что ненадо удалять) хаотична... Секущей рамкой можно было бы зацепить за 1 раз всё то, что надо удалить... Вот в принципе и весь вопрос.
paradoxvaha вне форума  
 
Непрочитано 21.08.2007, 14:15
#4
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


А что за объекты, Которые нужны?
Vova вне форума  
 
Непрочитано 21.08.2007, 14:42
#5
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Вообще-то в хелпе достаточно подробно описана функция ssget, это если книг по лиспу нет.
Для примера
Код:
[Выделить все]
(setq point1 (list 10.0 0.0))
(setq point2 (list 0.0 10.0))
(ssget "_C" point1 point2 '((-4 . "<AND") (0 . "*LINE") (0 . "*TEXT") (-4 . "AND>")))
(command "_.erase" "_P" "")
PS: не указано в какой среде это надо сделать - LISP, VLISP, VBA, ну и чего там еще до кучи? И в АвтоКАДе ли?
Олег К. вне форума  
 
Непрочитано 22.08.2007, 22:27
#6
Ыёть


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


Как то у меня была похожая хрень-надо было чистить и в модели и в листе. Раскидать примитивы заранее по слоям- потом крушить макросом=мне нужен был такой------^C^C_-layer lo "_Ramka" lo "AM_VIEWS"^M^M_erase all ;_mspace _erase all ;-layer u _Ramka,AM_VIEWS^M _-purge all *n;-------Во!---думаю и Вам подойдёт!!подстругаете !--и будет Буратино славный!!!!
Ыёть вне форума  
 
Непрочитано 23.08.2007, 10:48
#7
VVA

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


Нарисуй в качестве контура полилинию, внутри которой хочешь что-то удалить и воспользуйся программкой

Код:
[Выделить все]
(defun C:SPL ( / en pl n ss lst)
  (vl-load-com)
   (if (and (setq en (car(entsel "\nУкажите полилинию: ")))
           (wcmatch (cdr(assoc 0 (entget en))) "*POLYLINE")
           )
    (progn
      (ACET-SS-ZOOM-EXTENTS(ACET-LIST-TO-SS (list en)))
      (setq pl (vlax-ename->vla-object en) n 0)
      (while (<= n (vlax-curve-getEndParam pl))
	(setq lst (append lst (list (vlax-curve-getPointAtParam pl n)))
	      n   (1+ n)))
       (setq lst (mapcar '(lambda(x)(trans x 0 1)) lst))
      (if (setq ss (ssget "_CP" lst))(SSSETFIRST ss ss))
      (setq ss nil)))(princ))
(princ "\nНаберите в командной строке SPL")
VVA вне форума  
 
Автор темы   Непрочитано 24.08.2007, 13:52
#8
paradoxvaha

проектирование противооползневых сооружений
 
Регистрация: 06.04.2007
Yalta
Сообщений: 50
<phrase 1=


Все вроде работает в таком виде:

(ssget "_W" '(200003.0 50007.0) '(230003.0 0.0))
(command "_.erase" "_P" "")

но есть одно но, удаляется в том случае, если удаляемые объекты находятся в пределах экрана (короче, если эти объекты видно на экране монитора). Если объекты находятся вне видимой области, то они не удаляются... Можно ли как то это сделать?
К примеру перед тем как проделать операцию по удалению, сделать так, чтоб было видно ВСЕ объекты (находящиеся на рисунке) на экране монитора... ну или что то в этом духе.
paradoxvaha вне форума  
 
Непрочитано 24.08.2007, 14:15
#9
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Это особенность работы ssget'a.
Попробуй так:
Код:
[Выделить все]
(setq p_osmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(vl-cmdf "_.ZOOM" "_extents")
(ssget "_W" '(200003.0 50007.0) '(230003.0 0.0))
(vl-cmdf "_.erase" "_P" "")
(setvar "OSMODE" p_osmode)
(setq p_osmode nil)
OSMODE я заранее сюда добавил, предвидел вопрос "Почему выделяется не совсем то, что нужно?" :wink:
Олег К. вне форума  
 
Автор темы   Непрочитано 24.08.2007, 14:25
#10
paradoxvaha

проектирование противооползневых сооружений
 
Регистрация: 06.04.2007
Yalta
Сообщений: 50
<phrase 1=


2 Олег К. Спасибо большое! Заработало всё как надо!
Всем спасибо - вопрос можно считать раскрытым.
+ ко всему решилась и еще одна проблема с включением - выключением режима OSMODE.
paradoxvaha вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Удаление объектов из пространства листа

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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