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

Вернуться   Форум DWG.RU > Поиск литературы, чертежей, моделей и прочих материалов > Проблемы с поиском

Проблемы с поиском

Ответ
Поиск в этой теме
Непрочитано 31.01.2007, 21:56 #1
Проблемы с поиском
Gostushev
 
проектирование КМ, КМД
 
Регистрация: 02.05.2005
Сообщений: 25

Есть одна проблемка. Работаю с 3Д моделями, вернее с тем что от них осталось после разбивки. Все элементы представлены скажем типом сечения и линиями, которые определяют его длину. Если длина линии скажем 2000 единиц, то автокад без проблем с помощью КвикСелекта находит мне все такие линии и я вижу сколько таких элементов. Но если длина линий в модели скажем 2000.1015 единиц - то все!! Установка точности до целых чисел не помогает, автокад все равно не видит эти линии и результат поиска - "0" элементов.
В чем дело? Может все элеметарно просто? а я ищу сверх естественных причин? Может дело в какой то системной переменной? Сломал голову короче. Помогите пожалуйста.
Заранее признателен.
Просмотров: 2516
 
Непрочитано 01.02.2007, 08:49
#2
Хмурый


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


Необходимо провести три поиска:
первый - на длину линии равной 2000
второй- на длину линии больше 2000 с опцией "Добавить в набор"
и третий - с опцией "исключить из набора" линии длиной более 2000.1016 единиц
Хмурый вне форума  
 
Непрочитано 01.02.2007, 09:49
#3
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,826
<phrase 1=


А может обьеденить 2 две операции в одну, вроде кад позволяет выбирать по условию => а уж затем исключить
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Автор темы   Непрочитано 01.02.2007, 11:05
#4
Gostushev

проектирование КМ, КМД
 
Регистрация: 02.05.2005
Сообщений: 25


Спасибо за ответ. В принципе с такими вариантами я знаком, думал что можно что то сделать, чтобы кад не видел цифры после запятой. Может у кого есть утилитка для поиска нужной информации внутри файла, по типу Квик селекта, только самостоятельная?
Gostushev вне форума  
 
Непрочитано 01.02.2007, 11:21
#5
Кулик Алексей aka kpblc
Moderator

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


Конкретно для длины отрезков или полилиний еще сделать можно. Универсальное - вряд ли. Делать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.02.2007, 14:55
#6
Gostushev

проектирование КМ, КМД
 
Регистрация: 02.05.2005
Сообщений: 25


да да конечно.
причем полилинии можно и не трогать - только линии.
Заранее благодарен.
Gostushev вне форума  
 
Непрочитано 01.02.2007, 15:13
#7
Кулик Алексей aka kpblc
Moderator

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


Как вариант:
Код:
[Выделить все]
(defun c:qslin (/ min_len max_len selset res sort)
  (if
    (and (not (vl-catch-all-error-p
                (vl-catch-all-apply
                  '(lambda ()
                     (setq min_len (getdist "\nМинимальная длина <Выход> : "))
                     ) ;_ end of lambda
                  ) ;_ end of vl-catch-all-apply
                ) ;_ end of vl-catch-all-error-p
              ) ;_ end of not
         min_len
         (not (vl-catch-all-error-p
                (vl-catch-all-apply
                  '(lambda ()
                     (setq max_len (getdist "\nМаксимальная длина <Выход> : "))
                     ) ;_ end of lambda
                  ) ;_ end of vl-catch-all-apply
                ) ;_ end of vl-catch-all-error-p
              ) ;_ end of not
         max_len
         ) ;_ end of and
     (progn
       (setq selset (ssget "_A" '((0 . "LINE")))
             res    (ssadd)
             sort   (vl-sort (list min_len max_len) '(lambda (a b) (< a b)))
             ) ;_ end of setq
       (foreach item
                (mapcar 'vlax-ename->vla-object
                        (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
                        ) ;_ end of mapcar
         (if (and (vlax-property-available-p item 'length)
          ; Это на случай дальнейшего наращивания :)
                  (< (vla-get-length item) (cadr sort))
                  (> (vla-get-length item) (car sort))
                  ) ;_ end of and
           (setq res (ssadd (vlax-vla-object->ename item) res))
           ) ;_ end of if
         ) ;_ end of foreach
       ) ;_ end of progn
     ) ;_ end of if
  (sssetfirst res res)
  ) ;_ end of defun
Если не будет введено верхнее ограничение, ничего сделано не будет. Проверил только для пространства модели. Если будет еще и лист, надо будет дополнительно голову немного поломать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.02.2007, 08:17
#8
Gostushev

проектирование КМ, КМД
 
Регистрация: 02.05.2005
Сообщений: 25


протестировал - спасибо, работает. Жизнь налаживается :-)
Единственный минус - долго соображает, а так все нормально
Gostushev вне форума  
 
Непрочитано 02.02.2007, 08:35
#9
Кулик Алексей aka kpblc
Moderator

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


Потому что алгоритм кривой Я не знаю как в качестве критерия задать вычисляемое поле. Да и мозги вчера чего-то набекрень были... Спробуй такое (по идее должно быть побыстрее):
Код:
[Выделить все]
(defun c:qslin (/ min_len max_len selset sort)
  (if
    (and (not (vl-catch-all-error-p
                (vl-catch-all-apply
                  '(lambda ()
                     (setq min_len (getdist "\nМинимальная длина <Выход> : "))
                     ) ;_ end of lambda
                  ) ;_ end of vl-catch-all-apply
                ) ;_ end of vl-catch-all-error-p
              ) ;_ end of not
         min_len
         (not (vl-catch-all-error-p
                (vl-catch-all-apply
                  '(lambda ()
                     (setq max_len (getdist "\nМаксимальная длина <Выход> : "))
                     ) ;_ end of lambda
                  ) ;_ end of vl-catch-all-apply
                ) ;_ end of vl-catch-all-error-p
              ) ;_ end of not
         max_len
         ) ;_ end of and
     (progn
       (setq selset (ssget "_A" '((0 . "LINE")))
             sort   (vl-sort (list min_len max_len) '(lambda (a b) (< a b)))
             ) ;_ end of setq
       (foreach item
                (mapcar 'vlax-ename->vla-object
                        (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
                        ) ;_ end of mapcar
         (if (and (vlax-property-available-p item 'length)
          ; Это на случай дальнейшего наращивания :)
                  (or (> (vla-get-length item) (cadr sort))
                      (< (vla-get-length item) (car sort))
                      ) ;_ end of or
                  ) ;_ end of and
           (ssdel (vlax-vla-object->ename item) selset)
           ) ;_ end of if
         ) ;_ end of foreach
       ) ;_ end of progn
     ) ;_ end of if
  (sssetfirst selset selset)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.02.2007, 19:38
#10
Gostushev

проектирование КМ, КМД
 
Регистрация: 02.05.2005
Сообщений: 25


попробовал. Может она и быстрей работает, но я этого не понял :-)
В любом случае - такая прога реально экономит минуты, много минут, а может и просто спасает положение в целом :-), а это куда ценнее секунд ожидания.
А можно сделать так - показываешь курсором на элемент, и задаешь интервал, скажем +- 1мм и она ищет все такие элементы?
:-) обнаглел короче говоря.
Спасибо за сделанное.
Gostushev вне форума  
 
Непрочитано 05.02.2007, 10:24
#11
Кулик Алексей aka kpblc
Moderator

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


Спробуй (я особо не тестировал, возможны глюки при условии, что длина отрезка лежит на границе точности. Т.е. если длина 20, а точность 0.25, то отрезок с длиной 20.25 не попадал у меня в набор)
Код:
[Выделить все]
(defun c:qslin2 (/ prec ent selset)
  (if (and (setq ent (car (entsel)))
           (= (cdr (assoc 0 (entget ent))) "LINE")
           (setq ent (vlax-ename->vla-object ent))
           (not (vl-catch-all-error-p
                  (vl-catch-all-apply
                    '(lambda ()
                       (setq prec (cond
                                    ((getdist "\nДопуск точности <0.0> : "))
                                    (t 0.)
                                    ) ;_ end of cond
                             ) ;_ end of setq
                       ) ;_ end of lambda
                    ) ;_ end of vl-catch-all-apply
                  ) ;_ end of vl-catch-all-error-p
                ) ;_ end of not
           prec
           ) ;_ end of and
    (progn
      (setq selset (ssget "_X" '((0 . "LINE"))))
      (foreach item
               (mapcar 'vlax-ename->vla-object
                       (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
                       ) ;_ end of mapcar
        (if (and (vlax-property-available-p item 'length)
                 (not (equal (vla-get-length item) (vla-get-length ent) prec)
                      ) ;_ end of and
                 ) ;_ end of not
          (ssdel (vlax-vla-object->ename item) selset)
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  (sssetfirst selset selset)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.02.2007, 09:28
#12
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Ну, о-о-очень трудно сохранять спокойствие, когда показавший свое настоящее имя kpblc лиспует :twisted: . Однако так - покороче будет.
Код:
[Выделить все]
(defun c:qslin2 (/ adoc ass item prec ent util)
  (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
	util (vla-get-Utility adoc)
	ass (vla-get-ActiveSelectionSet adoc))
  (vla-getEntity util 'item nil "Выбрать Линию")
  (vla-Select ass acSelectionSetAll (vlax-safearray-fill (vlax-make-safearray vlax-vbInteger '(0 . 0)) '(0)) 
    (vlax-safearray-fill (vlax-make-safearray vlax-vbVariant '(0 . 0)) (list "*Line")))
  (if (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda ()
	(setq prec (cond ((vla-getReal util getdist "\nДопуск точности <0.0> : "))
			 (t 0.))))))) prec)
  (vlax-for ent ass (if (not (equal (vla-get-length item) (vla-get-length ent) prec))
      (vla-RemoveItems ass (vlax-safearray-fill (vlax-make-safearray vlax-vbObject '(0 . 0)) (list ent)))))
  (vlax-for ent ass (vla-highlight ent t))
);end
Лентяй вне форума  
 
Непрочитано 06.02.2007, 09:37
#13
Кулик Алексей aka kpblc
Moderator

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


Привет, давно не воевали
Прикол в том, что у тебя набор только подсвечивается. У меня еще и ручки (которые grips) там маячат. А это зачастую более удобно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Поиск литературы, чертежей, моделей и прочих материалов > Проблемы с поиском

Размещение рекламы