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

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

Вопросик по ActiveX

Ответ
Поиск в этой теме
Непрочитано 11.03.2004, 15:53 #1
Вопросик по ActiveX
{Smirnoff}
 
Инженер по системам безопасности
 
Рига
Регистрация: 23.11.2003
Сообщений: 1,099

Мне нужно проверить пересекаються ли две линии. Проверять я пытаюсь следующей конструкцией:
Код:
[Выделить все]
  
.................................................
(setq intCheck (vlax-safearray->list
		   (variant-value
		     (vla-intersectWith vla-firstCab vla-secCab AcExtendNone))))
................................................
которая возвращает список с точками пересечения. Проблемма состоит в том что если точек пересечения нет то я немогу проверить данный случай. Как я только не пытался (if (null intCheck) ... (if intCheck... (if (null (car intCheck) и др. если точки пересечения есть то все нормально, если нет- прога без единого звука (сообщения об ошибке или чего либо еще) закрывается. В командной строке "тишина" в виде Command:. В чем дело? Почему она так прерываеться?

Вроде по описанию vla-intersectWith должна возвращать "пустой" список. Если сделать intCheck глобальной то после такого "глюка" ее значение nil. А "пустой" список это nil или "нечто необозначенное"?
Просмотров: 4418
 
Непрочитано 11.03.2004, 16:22
#2
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Проверь индексы в массиве. Если пересечения нет, то верхний индекс будет меньше нижнего
vk вне форума  
 
Автор темы   Непрочитано 11.03.2004, 16:29
#3
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>VK Подробнее если можно.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 11.03.2004, 16:45
#4
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Вот пока сделал:
Код:
[Выделить все]
    
........................................
(setq vla-firstCab (vlax-ename->vla-object (car firstCab)))
  (setq vla-secCab (vlax-ename->vla-object (car secCab)))
  (if (>(vlax-safearray-get-l-bound
		   (variant-value
		     (vla-intersectwith vla-firstCab vla-secCab AcExtendNone)))
	(vlax-safearray-get-u-bound
		   (variant-value
		     (vla-intersectwith vla-firstCab vla-secCab AcExtendNone))))
      (progn
......................................
Не работет
{Smirnoff} вне форума  
 
Непрочитано 11.03.2004, 17:02
#5
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


подробнее: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=3943eZ
vk вне форума  
 
Непрочитано 11.03.2004, 17:56 Re: Вопросик по ActiveX
#6
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от Fantomas
А "пустой" список это nil или "нечто необозначенное"?
Код:
[Выделить все]
(setq lst '())

возвращает: nil
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Автор темы   Непрочитано 11.03.2004, 18:26
#7
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Kos Такой странный вопрос от непоминания что происходит, ведь и "пустой" список и несозданная переменная в результате nil. После ссылки данной VK, стало понятнее что ошибка возникает при попытке преобразовать "неправильный" массив который формируеться при отсутствии пересечения.

Вот нашел вроде рабочий примерчик на каком то польском сайте:
Код:
[Выделить все]
(defun get-inters (ENT1 ENT2 METHOD / VARPTS LST)
; funkcja znajdująca punkty przecięcia
(setq VARPTS (vla-IntersectWith
             (vlax-ename->vla-object ENT1)
             (vlax-ename->vla-object ENT2)
             METHOD))

(cond
((not (minusp (vlax-safearray-get-u-bound (vlax-variant-value VARPTS) 1)))
(setq LST (vlax-safearray->list (vlax-variant-value VARPTS)))
(repeat (/ (length LST) 3)
(setq RETURN (cons (list (car LST) (cadr LST) (caddr LST)) RETURN)
      LST (cdddr LST))
);end repeat
)
);end cond
);end get-inters
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 12.03.2004, 00:03
#8
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Да, кстати правильный пример. У меня получилось:
Код:
[Выделить все]
    (setq vla-firstCab (vlax-ename->vla-object (car firstCab)))
  (setq vla-secCab (vlax-ename->vla-object (car secCab)))
  (setq intCheck (vla-IntersectWith vla-firstCab vla-secCab AcExtendNone))
    (if (not(minusp (vlax-safearray-get-u-bound (vlax-variant-value intCheck)1)))
      (progn........
Суть такова. При отсутствии точек пересечения функция vla-IntersectWith создает "неправильный" массив у которого значение нижнего индекса 0, а значение верхнего -1. Соответственно можно просто проверить верхний индекс на отрицательность.

Кстати если использовать конструкцию для отлавливания ошибочного массива, которая встречаеться в одном примере который везде разошелся но почему то не работает:
Код:
[Выделить все]
(vl-catch-all-error-p(vl-catch-all-apply
		 'vla-IntersectWith
		 (list Prim1 Prim2 acExtendNone)
	      ))
При любом массиве vl-catch-all-error-p возвращает nil. Очевидно такую ошибку она не может распознать. Просто странно, я нашел одну и ту же функцию в четырех источниках, а она не работает.
{Smirnoff} вне форума  
 
Непрочитано 12.03.2004, 00:29
#9
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Хе-хе... vla-IntersectWith всегда выполняется.... и не даст ошибку, если ее аргументы указаны правильно. Ведь массив создается всегда. Вопрос в том - какой именно массив!!! Другое дело - vlax-safearray->list. Если массив неправильный, то ошибку даст именно эта функция. Тогда уж проверяйте
Код:
[Выделить все]
(vl-catch-all-apply 'vlax-safearray->list (list (vlax-variant-value (vla-intersectwith obj1 obj2 flag))))
А самое простое - не гадать на кофейной гуще что дает ошибку, а что не дает, а :idea: поставить точку останова - breakpoint, да прогнать программу по шагам. Гм... хотя бы *LAST-VALUE* в Watch на контроль надо взять :idea: , если лень закинуть туда наиболее важные переменные. Как результат - отлов ошибки на первом-втором прогоне. Тоесть через 5...10 минут. А Вы весь вечер паритесь
vk вне форума  
 
Автор темы   Непрочитано 12.03.2004, 10:35
#10
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Я постепенно убеждаюсь что надо пользоваться отладчиком. Не вы первый мне это говорите, но 95% ошибок я как то сразу нахожу. Для контроля пременных я обычно вставляю (princ ....). И создаю различные конструкции из ;;; и дописок.

То что ошибку выдает именно vlax-safearray->list, я понял после вашей ссылки. Насчет того что я мучался целый вечер, это правда. Но мучался я не просто так, до этого вышеописанные функции были для меня "темным лесом". Теперь я их достаточно подробно изучил, когда оно с книжкой, просмотром примеров и эспериментами, оно очень полезно. Да и не привык я вставлять к себе в проги то в чем досконально не разобрался.

Теперь я знаю работу всех аргументов vl-intersectwith, а не только AcExtendNone. Умею узнавать размерность массива, точно знаю про значния в "неправильном" массиве который она создает и еще кучу вещей. Дописал прогу. Потом "нарвался" на один неприятный частный случай. Теперь придеться подробно изучить функции работы с кривыми.
{Smirnoff} вне форума  
 
Непрочитано 12.03.2004, 16:10
#11
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Тогда может быть интересно будет также узнать, что сама по себе vla-intersectwith при всем удобстве использования, по жизни является еще и довольно таки глючной функцией. Лично получил от нее по лбу, когда она не распознала реальную точку пересечения двух отрезков (LINE), в то время как Лисповская (inters) ее вычислила. А еще науке известны случаи, когда она возвращала четыре точки вместо двух, но расположенные чуть выше и чуть ниже реальных точек....

Вот такая вот веселуха ((
vk вне форума  
 
Автор темы   Непрочитано 12.03.2004, 17:36
#12
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>VK Проблемка в том что у меня не линии, а полилинии. Можно конечно расчленить их на сегменты, но уж слишком сложно получится.

Жизнь покажет что там может быть. Насчет четырех точек, все конечно может быть, то по самой сути программы, набор для проверки на пересечение выбираеться из полилиний с определенными расширенными данными, расстояние между пересечениями в подавляющем количестве случаев не может быть мение 80 единиц. Думаю что "двоение" получилось на расстояниях отличающихся на несколько далеких знаков после запятой. Хотя как знать... Реальные "глюки" всегда проявляються при работе с реальными чертежами.
{Smirnoff} вне форума  
 
Непрочитано 12.03.2004, 19:08
#13
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Двоение-то ладно... его можно выловить... а вот когда совсем точка не будет найдена.... Если точка не найдена - то запрос от пользователя? Глупость какая-то.... Если полилинии состоят исключительно из отрезков (без дуг) и не очень длинные, то можно попробовать искать точку все-же через inters в вложенных циклах, предварительно получив списки вершин полилиний. ИМХО конечно.
vk вне форума  
 
Автор темы   Непрочитано 12.03.2004, 21:15
#14
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Посмотрим как будет работать. Сейчас есть другие задачи, будет "глючить" перепишем.
{Smirnoff} вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вопросик по ActiveX

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