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

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

неверное стирание объектов при передаче команды в командную строку Автокада

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

Всем доброго вечера! Возникла небольшая проблема - при работе программы в автокаде у меня выдается большой набор результатов вычислений, но но при задании следующих данных для расчета, старые результаты надо удалить (таблицы, сформированные в поле модели автокада). Так вот все практически хорошо работает, но при использовании вот такого кода:
Код:
[Выделить все]
(vl-load-com)
(setq p_tilemode (getvar "tilemode"))
(setvar "tilemode" 1)
(vl-cmdf "_.ZOOM" '(-520 5367) '(-100 5070))
(ssget "_W"  '(-510.0 5089.0) '(-105.0 5140.0))
(vl-cmdf "_.erase" "_P" "")
вместе с ненужными данными удаляется и последний выделенный объект (линия, полилиния). Причем этот объект лежит всегда далеко за пределами рамки поля для удаления.
Что это такое? кто то может пояснить причины такого удаления?
Просмотров: 3230
 
Непрочитано 10.11.2010, 23:44
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Набор нужно, в вашем случае создавать через ssadd, а не через ssget!!!
Где вы такому научились? Та никто уже лет 20 не делает...
gomer вне форума  
 
Непрочитано 10.11.2010, 23:44
#3
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Привязки включены?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 11.11.2010, 00:34
#4
paradoxvaha

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


пробовал только что, что с включенными что с выключенными привязками - эффект один и тот же
to gomer - можно на примере вариант использования ssadd так чтоб все объекты, выделенные "секущей рамкой" удалить?
paradoxvaha вне форума  
 
Непрочитано 11.11.2010, 01:01
#5
Кулик Алексей aka kpblc
Moderator

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


А если так?
Код:
[Выделить все]
(vl-load-com)

(defun dwgru-erase-tables-by-points (pt1 pt2 / adoc pt_lst)
                                    ;|
*    Удаляет все таблицы, попавшие внутрь области pt1 - pt2
* по принципу "попадает целиком". Объекты лежат в пространстве модели
* текущего документа. Состояние слоев не отслеживается.
|;
  (setq pt_lst (list (apply 'mapcar (cons 'min (list pt1 pt2)))
                     (apply 'mapcar (cons 'max (list pt1 pt2)))
                     ) ;_ end of list
        ) ;_ end of setq
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for ent (vla-get-modelspace adoc)
    (if (and (= (vla-get-objectname ent) "AcDbTable")
             ((lambda (/ res minp maxp)
                (vla-getboundingbox ent 'minp 'maxp)
                (setq minp (vlax-safearray->list minp)
                      maxp (vlax-safearray->list maxp)
                      ) ;_ end of setq
                (not (vl-remove
                       t
                       (append
                         (apply 'mapcar (cons '<= (list maxp (cadr pt_lst))))
                         (apply 'mapcar (cons '>= (list minp (car pt_lst))))
                         ) ;_ end of append
                       ) ;_ end of vl-remove
                     ) ;_ end of not
                ) ;_ end of lambda
              )
             ) ;_ end of and
      (vl-catch-all-apply
        (function
          (lambda ()
            (vla-erase ent)
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.11.2010, 01:15
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от paradoxvaha Посмотреть сообщение
можно на примере вариант использования ssadd так чтоб все объекты, выделенные "секущей рамкой" удалить?
Вы ничего не поняли... Чтобы удалить объекты, их нужно создать сначала...
Так вот по мере создания их включают в отдельный набор, которым и оперируют... А удалять рамкой можно только в случае, если "под" удаляемыми объектами нет ничего важного...
gomer вне форума  
 
Непрочитано 11.11.2010, 13:18
#7
CB

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


Код:
[Выделить все]
(setq p_tilemode (getvar "tilemode"))
(setvar "tilemode" 1)
(vl-cmdf "_.ZOOM" '(-520 5367) '(-100 5070))
(setq ss (ssget "_W"  '(-510.0 5089.0) '(-105.0 5140.0)))
(sssetfirst ss nil)
(vl-cmdf "_.erase")
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Автор темы   Непрочитано 12.11.2010, 09:16
#8
paradoxvaha

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


Цитата:
Сообщение от CB Посмотреть сообщение
Код:
[Выделить все]
(setq p_tilemode (getvar "tilemode"))
(setvar "tilemode" 1)
(vl-cmdf "_.ZOOM" '(-520 5367) '(-100 5070))
(setq ss (ssget "_W"  '(-510.0 5089.0) '(-105.0 5140.0)))
(sssetfirst ss nil)
(vl-cmdf "_.erase")
Так не получается, и другими подобными способами тоже, этого примитива нету в наборе! Так что и убрать его из набора не получается.

А насчет КОДа Алексея:

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А если так?
Код:
[Выделить все]
(vl-load-com)

(defun dwgru-erase-tables-by-points (pt1 pt2 / adoc pt_lst)
                                    ;|
*    Удаляет все таблицы, попавшие внутрь области pt1 - pt2
* по принципу "попадает целиком". Объекты лежат в пространстве модели
* текущего документа. Состояние слоев не отслеживается.
|;
  (setq pt_lst (list (apply 'mapcar (cons 'min (list pt1 pt2)))
                     (apply 'mapcar (cons 'max (list pt1 pt2)))
                     ) ;_ end of list
        ) ;_ end of setq
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for ent (vla-get-modelspace adoc)
    (if (and (= (vla-get-objectname ent) "AcDbTable")
             ((lambda (/ res minp maxp)
                (vla-getboundingbox ent 'minp 'maxp)
                (setq minp (vlax-safearray->list minp)
                      maxp (vlax-safearray->list maxp)
                      ) ;_ end of setq
                (not (vl-remove
                       t
                       (append
                         (apply 'mapcar (cons '<= (list maxp (cadr pt_lst))))
                         (apply 'mapcar (cons '>= (list minp (car pt_lst))))
                         ) ;_ end of append
                       ) ;_ end of vl-remove
                     ) ;_ end of not
                ) ;_ end of lambda
              )
             ) ;_ end of and
      (vl-catch-all-apply
        (function
          (lambda ()
            (vla-erase ent)
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
пока еще не пробовал применить, пытаюсь разобраться как работает. Может его как то по проще сделать? Я наверное не так выразился когда сказал что на листе таблицы - выглядят просто как таблицы, а в реальности это набор линий и однострочных текстов.
paradoxvaha вне форума  
 
Непрочитано 12.11.2010, 10:42
#9
Лиспер


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


Цитата:
Сообщение от paradoxvaha Посмотреть сообщение
выглядят просто как таблицы, а в реальности это набор линий и однострочных текстов
Если рассуждать логически, то можно в коде заменить строку
Код:
[Выделить все]
(= (vla-get-objectname ent) "AcDbTable")
на нечто типа
Код:
[Выделить все]
(wcmatch (vla-get-objectname ent) "*Text,*Line,*Table")
Будет выбирать все тексты, отрезки и таблицы в указанной области по прописанным правилам. Лично я не проверял - некогда.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > неверное стирание объектов при передаче команды в командную строку Автокада



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Все команды выполняються через командную строку, как это отключить? kest AutoCAD 1 27.10.2009 11:59
команды работают только через командную строку MegaPascal AutoCAD 2 19.05.2009 22:16
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35