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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Зависает vlax-curve-getPointAtDist на сплайне

Зависает vlax-curve-getPointAtDist на сплайне

Ответ
Поиск в этой теме
Непрочитано 30.10.2009, 18:40 #1
Зависает vlax-curve-getPointAtDist на сплайне
petr.vubrikv
 
Регистрация: 14.03.2006
Сообщений: 23

При применении (vlax-curve-getPointAtDist Spline Dist) к сплайну на определенном шаге приращения расстояния, например, 1000 или 2000 для Dist происходит зависание. Т.е. доходит, например, при приращении 2000 от 0 (vlax-curve-getStartPoint) до Dist=54000 и капут. Но при приращениях, например, 2500 и более, все нормально.

Можно ли это как-то обойти, или возможно определить по каким-либо признакам что этот сплайн "нехороший" и пропустить его?

Вот файлик acad2004 с этим сплайном:


Спасибо.

Вложения
Тип файла: dwg
DWG 2004
Spline-Pline_Problem-cad2004.dwg (29.2 Кб, 346 просмотров)

Просмотров: 2905
 
Непрочитано 30.10.2009, 20:51
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Не понял, что имеется в виду, играть в гадалки неохота...
Сплайн в чертеже посмотрел - нормальный сплайн, ничего в нем "нехорошего" не заметил, разве что длина примерно 71500мм чертежа.
Надо код смотреть.
P.S.Дело было вечером, делать было... ну и так далее
Состряпал код:
Код:
[Выделить все]
(defun c:test (/ obj rez dist)
  (vl-load-com)
  (vla-StartUndoMark
    (vla-get-ActiveDocument (vlax-get-acad-object))
  ) ;_ end of vla-StartUndoMark
  (while (not obj)
    (setq
      obj (vl-catch-all-apply
	    '(lambda () (car (entsel "\nУкажите сплайн:")))
	  ) ;_ end of vl-catch-all-apply
    ) ;_ end of setq
    (if	(not obj)
      (princ "\nНичего не выбрано!")
    ) ;_ end of if
  ) ;_ end of while
  (cond
    ((vl-catch-all-error-p obj)
     (princ "\nПрервано пользователем.")
    )
    ((/= (cdr (assoc 0 (entget obj))) "SPLINE")
     (princ "\nВыбранный объект не является сплайном!")
    )
    (T
     (progn
       (setq obj  (vlax-ename->vla-object obj)
	     dist 0
	     rez  (list (vlax-curve-getStartPoint obj))
       ) ;_ end of setq
       (while (<= dist 70000)
	 (setq dist (+ 3000 dist)
	       rez  (cons (vlax-curve-getPointAtDist obj dist) rez)
	 ) ;_ end of setq
       ) ;_ end of while
       (princ (reverse rez))
       (princ "\n")
       (princ (length rez))
     ) ;_ end of progn
    )
  ) ;_ end of cond
  (vla-EndUndoMark
    (vla-get-ActiveDocument (vlax-get-acad-object))
  ) ;_ end of vla-EndUndoMark
  (princ)
) ;_ end of defun


;;;(vlax-dump-Object (vlax-ename->vla-object (car (entsel))) T)
Красным выделил то значение, которое менял. При 2500 и 3000 обработался этот сплайн, при 2000 и 7000 висло намертво все: и vlide и сам акад. С другими числами не тестировал.
Нарисовал еще один сплайн, проверил на нем - при любых значениях код работает исправно, ничего не виснет. Сравнил дампы кодом, отмеченным синим цветом. У "неправильного" сплайна странное св-во StartTangent:
Код:
[Выделить все]
StartTangent = AutoCAD.Application: Общая ошибка моделирования
Больше ничего критичного не заметил. Есть подозрение, что сплайн создан каким-то нестандартным способом.

Последний раз редактировалось Do$, 30.10.2009 в 22:50.
Do$ вне форума  
 
Автор темы   Непрочитано 02.11.2009, 13:43
#3
petr.vubrikv


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


Спасибо.

"Есть подозрение, что сплайн создан каким-то нестандартным способом"

Возможно. Наверняка не знаю, т.к. чертеж, откуда выдран сплайн не мой.
Но вот dxf-коды сплайна. В конце списка повторяются несколько раз точка (10 259643.0 250233.0 0.0). Может из-за этого висюльки?

((-1 . <Имя объекта: 7ef6f078>) (0 . "SPLINE") (330 . <Имя объекта: 7ef63cf8>)
(5 . "3747") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"$DDT_AUDIT_GENERATED_(2656A)") (6 . "$DDT_AUDIT_GENERATED_(26567)") (48 .
10.0) (100 . "AcDbSpline") (210 0.0 0.0 1.0) (70 . 8) (71 . 3) (72 . 36) (73 .
32) (74 . 0) (42 . 1.0e-010) (43 . 1.0e-010) (40 . 199.124) (40 . 199.124) (40
. 199.124) (40 . 199.124) (40 . 200.021) (40 . 200.021) (40 . 201.809) (40 .
201.809) (40 . 203.597) (40 . 203.597) (40 . 206.465) (40 . 206.465) (40 .
208.073) (40 . 208.073) (40 . 209.68) (40 . 209.68) (40 . 212.894) (40 .
212.894) (40 . 214.282) (40 . 214.282) (40 . 215.669) (40 . 215.669) (40 .
218.444) (40 . 218.444) (40 . 221.01) (40 . 221.01) (40 . 222.943) (40 .
222.943) (40 . 225.416) (40 . 225.416) (40 . 227.888) (40 . 227.888) (40 .
231.345) (40 . 231.345) (40 . 231.345) (40 . 231.345) (10 201128.0 291278.0
0.0) (10 201404.0 291138.0 0.0) (10 201679.0 290998.0 0.0) (10 202498.0
290578.0 0.0) (10 203037.0 290300.0 0.0) (10 204117.0 289739.0 0.0) (10
204663.0 289453.0 0.0) (10 206098.0 288692.0 0.0) (10 206995.0 288205.0 0.0)
(10 208408.0 287405.0 0.0) (10 208919.0 287108.0 0.0) (10 209913.0 286517.0
0.0) (10 210401.0 286221.0 0.0) (10 211839.0 285337.0 0.0) (10 212765.0
284753.0 0.0) (10 214054.0 283944.0 0.0) (10 214439.0 283703.0 0.0) (10
215222.0 283213.0 0.0) (10 215617.0 282966.0 0.0) (10 216814.0 282215.0 0.0)
(10 217625.0 281701.0 0.0) (10 219204.0 280677.0 0.0) (10 219972.0 280166.0
0.0) (10 221304.0 279252.0 0.0) (10 221873.0 278853.0 0.0) (10 223162.0
277926.0 0.0) (10 223869.0 277402.0 0.0) (10 225246.0 276362.0 0.0) (10
259643.0 250233.0 0.0) (10 259643.0 250233.0 0.0) (10 259643.0 250233.0 0.0)
(10 259643.0 250233.0 0.0))
petr.vubrikv вне форума  
 
Непрочитано 02.11.2009, 14:07
#4
Кулик Алексей aka kpblc
Moderator

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


У сплайна отсутствуют т.н. FitPoints и свойства StartTangent и EndTangent. Жалко, что Alaspher практически не появляется - у него, насколько я помню, решение для подобных сплайнов существовало...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.11.2009, 17:53
#5
petr.vubrikv


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


> Кулик Алексей aka kpblc

Как хорошо, что и Вы откликнулись! А я-то, шляпа, сидел, ковырял dxf-коды проказника-сплайна, рисовал для пробы рядом другие, чтобы сверять коды на предмет что тут не так, и проглядел эти самые "т.н. FitPoints и свойства StartTangent и EndTangent".
Поступил так: т.к. отсутствуют коды "44" и "11", создал копию списка dxf-кодов нехорошего сплайна, добавил (cons 44 0.0000000001), а также для каждой точки типа (10 x y z) добавил до пары соответствующие (11 x y z), т.е. с теми же x, y и z, что и для (10 .....). Затем (entmake) по полученному списку с удалением сплайна-оригинала. Полученная копия - работоспособна и не вешает autocad при ранее проблемных приращениях 7000, 2000 и 1000 (хотя это еще надо пробовать еще с другими приращениями расстояния) .
Спасибо!
petr.vubrikv вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Зависает vlax-curve-getPointAtDist на сплайне

Опции темы Поиск в этой теме
Поиск в этой теме:

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